Switch ComponentsRepo
Here we extended our simple onClick example with Edit
button which opens item view as form.
We made ListItem
component, which we are using in list-repo.tsx
for each object in our users array.
It has internal state, that reflects how to display item: as list item or as form by providing new ComponentsRepo
in case we want to render a form view.
ListItem
in it's state collects a list of JSONPatch
objects and by clicking on Save
button we apply those patches in clickHandler
at the App.tsx
.
import React from 'react'; import { RepositoryProvider, AutoView, CoreSchemaMetaSchema, AutoEventHandler, AutoEvent } from '@autoviews/core'; import {set} from 'json-pointer'; import {applyPatch} from 'fast-json-patch'; import {data} from './data'; import schema from './schema.json'; import {repo} from './list-repo'; export type MyClickEvent = AutoEvent & {data: {type: string; value?: any}}; export default function App() { const [currentData, setData] = React.useState(data); const clickHandler = React.useCallback<AutoEventHandler<MyClickEvent>>( (_, {pointer, data}) => { switch (data.type) { case 'SAVE_ITEM': { setData([ ...applyPatch(currentData, data.value).newDocument ]); break; } case 'CHANGE_ACTIVE_STATE': { const newDocument = [...currentData]; set(newDocument, pointer, data.value); setData(newDocument); break; } } }, [currentData, setData] ); return ( <RepositoryProvider components={repo}> <AutoView schema={schema as CoreSchemaMetaSchema} data={currentData} onClick={clickHandler} /> </RepositoryProvider> ); }