Save and Resume
This form saves and rehydrates it's state from localStage
import { SaveButton } from "./SaveButton"import { saveAndResume } from "./saveAndResume" function IndividualInputs() { return ( <> <Label label="Username" prop="username"> <Input> <Validate required> <div>Username is required</div> </Validate> <Validations /> </Input> </Label> <Label label="Email" prop="email"> <Input resetOnError> <Validate required> <div>Email is required</div> </Validate> <Validate invalid={(email) => !email?.includes("@")}> <div>Email must be valid</div> </Validate> <Validations /> </Input> </Label> </> )} function SaveAndResume() { const form = useCreateForm() const validation = useCreateValidationState() const [saves, loaded] = saveAndResume.use() const [loadedFrom, setLoadedFrom] = useState(null) const loadFromSave = useCallback( (save) => { form.set((state) => { state.value = save.state }) form.validate() setLoadedFrom(save) }, [form] ) useEffect(() => { if (!loaded) return if (saves.length) { loadFromSave(saves[0]) } }, [form, loaded]) return ( <> {saves.map((save, i) => ( <SaveButton key={save.at} index={i} active={loadedFrom?.at === save.at} onClick={() => loadFromSave(save)} save={save} /> ))} {!!saves?.length && <hr />} <Form onChange={() => { setLoadedFrom(null) }} connect={form} > <h2>Add users</h2> <Repeater prop="users"> <RepeaterContent> <IndividualInputs /> <div> <RemoveRepeaterItem> <button name="children" type="button"> Remove </button> </RemoveRepeaterItem> </div> <hr /> </RepeaterContent> <AddRepeaterItem initialValue={{}}> <button style={{ marginBottom: "10px" }} name="children" type="button" > Add </button> </AddRepeaterItem> </Repeater> <div> <button onClick={() => { saveAndResume.add({ state: form.state.value, at: Date.now(), }) form.reset() }} > Save </button> {" "} <button type="button" onClick={() => form.reset()}> Reset </button> </div> </Form> </> )} render(SaveAndResume)