Skip to content

Instantly share code, notes, and snippets.

View copperwall's full-sized avatar
j chillin

Chris Opperwall copperwall

j chillin
View GitHub Profile
Form.onSubmitFactory = fn => form => ev => {
ev.preventDefault();
fn(Form.getData(form));
};
Form.onChangeFactory = fn => (form, fieldKey) => updatedProps => fn({
...form,
fields: {
...form.fields,
[fieldKey]: {
...form.fields[fieldKey],
...updatedProps,
},
},
});
Form.getProps = form => Object.assign({},
...Object.entries(form)
.filter(([formPropKey, formProp]) => formPropKey !== 'fields')
.map(([formPropKey, formProp]) => ({
[formPropKey]: formProp instanceof Function ? formProp(form) : formProp,
})),
{
fields: Object.assign({}, ...Object.entries(form.fields).map(([fieldKey, field]) => ({
[fieldKey]: Object.assign({}, ...Object.entries(field).map(([fieldPropKey, fieldProp]) => ({
[fieldPropKey]: fieldProp instanceof Function ? fieldProp(form, fieldKey) : fieldProp,
Form.getData = form => Object.assign({},
...Object.entries(Form.getProps(form).fields)
.filter(([fieldKey, field]) => !field.disabled)
.filter(([fieldKey, field]) =>
!['checkbox', 'radio'].includes(field.type) || field.checked
)
.map(([fieldKey, field]) => ({ [fieldKey]: field.value })),
);
Form.fields = (globalProps = {}, fields) => Object.assign({},
...Object.entries(fields).map(([fieldKey, field]) => ({
[fieldKey]: {
...Form.Field.defaultProps,
...{ name: fieldKey },
...globalProps,
...field,
},
})),
);
Form.fields = (globalProps = {}, fields) => Object.assign({},
...Object.entries(fields).map(([fieldKey, field]) => ({
[fieldKey]: {
...Form.Field.defaultProps,
...{ name: fieldKey },
...globalProps,
...field,
},
})),
);
Form.customValidityFactory = (constraint, validationMessage = 'Invalid') => (...args) => (
constraint(...args) ? '' : validationMessage
);
Form.Component = ({ id, name, onSubmit, children }) => (
<form
id={id}
name={name}
onSubmit={onSubmit}
>
{children}
</form>
);
import React from 'react';
import FormFieldPropTypes from './FormFieldPropTypes';
import FormDefaultComponentLibrary from './FormDefaultComponentLibrary';
const FormField = ({componentLibrary, ...props}) => {
const Component = componentLibrary[props.type];
return <Component {...props} />;
}
FormField.defaultProps = {
@copperwall
copperwall / event_emitter_v1.js
Last active February 11, 2019 03:42
First shot at an EventEmitter implementation following the NodeJS Events API docs
// Specs
// emits newListener when new listeners are added
// event contains event name and reference to new listener
// emits removeListener when existing listeners are removed
//
const DEFAULT_MAX_LISTENERS = 10;
const PREPEND = 'prepend';
const APPEND = 'append';