From 7af4de9d9f531b7fe39b888cd81518ecde69c915 Mon Sep 17 00:00:00 2001 From: Ryan Jones Date: Mon, 9 Sep 2019 17:29:17 +0200 Subject: [PATCH] saving for tomorrow --- ensure-data.js | 26 +++++++++++++++++++++++--- morph/react/get-body.js | 3 +++ parse/helpers.js | 4 +++- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/ensure-data.js b/ensure-data.js index 28badb2..86fa291 100644 --- a/ensure-data.js +++ b/ensure-data.js @@ -43,6 +43,11 @@ let captureItemReducer = produce((draft, action) => { return action.state; } + case CAPTURE_FORCE_REQUIRED: { + draft._forceRequired = true; + break; + } + default: { throw new Error( \`Unknown action type "\${action.type}" in update item reducer.\` @@ -59,10 +64,12 @@ export let setField = (key, value) => ({ let CAPTURE_RESET = 'capture/RESET'; export let reset = state => ({ type: CAPTURE_RESET, state }); +let CAPTURE_FORCE_REQUIRED = 'capture/FORCE_REQUIRED'; + let CaptureItemContext = React.createContext({}); export let CaptureItemProvider = CaptureItemContext.Provider; export let useCaptureItem = ({ - path = null, format = identity, validate = null + path = null, format = identity, validate = null, required = false } = {}) => { let captureItem = useContext(CaptureItemContext); let touched = useRef(false); @@ -83,8 +90,11 @@ export let useCaptureItem = ({ if (!item) return {}; let value = format.in(get(item, path)); + let isValid = - touched.current && validate ? fromValidate[validate](value) : true; + validate && (touched.current || (required && item._forceRequired)) + ? fromValidate[validate](value) + : true; let onChange = value => { touched.current = true; dispatch(setField(path, format.out(value))); @@ -105,7 +115,17 @@ export let useCaptureItemProvider = (item, onSubmit) => { dispatch(reset(item)); }, [item]); - return useMemo(() => [state, dispatch, onSubmit], [ + return useMemo(() => { + async function _onSubmit() { + try { + if(!await onSubmit()) return; + } catch(error) { + console.log('onSubmit', error); + } + dispatch({ type: CAPTURE_FORCE_REQUIRED }); + } + return [state, dispatch, _onSubmit]; + }, [ state, dispatch, onSubmit, diff --git a/morph/react/get-body.js b/morph/react/get-body.js index 32e5e20..85cca0e 100644 --- a/morph/react/get-body.js +++ b/morph/react/get-body.js @@ -137,4 +137,7 @@ function maybeDataFormat(format, data) { function maybeDataValidate(validate, data) { if (!validate || validate.type !== 'js') return data.push(`validate: '${validate.value}',`) + if (validate.required) { + data.push('required: true') + } } diff --git a/parse/helpers.js b/parse/helpers.js index dfc69f3..82f6c54 100644 --- a/parse/helpers.js +++ b/parse/helpers.js @@ -263,9 +263,11 @@ export let getDataFormat = maybeProp => { export let getDataValidate = maybeProp => { if (!maybeProp || !maybeProp.value) return null + let [value, required] = maybeProp.value.split(' ') return { type: 'js', - value: maybeProp.value, + value, + required: required === 'required', } }