Skip to content

Commit 6523662

Browse files
committed
Replace old delta form table hooks with new ones
1 parent 66e72c7 commit 6523662

4 files changed

Lines changed: 216 additions & 511 deletions

File tree

packages/client/src/body.tsx

Lines changed: 97 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
import { create } from '@bufbuild/protobuf';
2-
import { createClient } from '@connectrpc/connect';
32
import { createConnectQueryKey, createProtobufSafeUpdater, createQueryOptions } from '@connectrpc/connect-query';
43
import { useQueryClient, useSuspenseQueries } from '@tanstack/react-query';
54
import { useRouteContext } from '@tanstack/react-router';
65
import { getCoreRowModel, useReactTable } from '@tanstack/react-table';
76
import CodeMirror from '@uiw/react-codemirror';
8-
import { Match, pipe, Struct } from 'effect';
9-
import { useMemo, useState } from 'react';
7+
import { Match, pipe } from 'effect';
8+
import { useState } from 'react';
109

1110
import {
1211
BodyFormItemListItem,
1312
BodyKind,
14-
BodyService,
1513
BodyUrlEncodedItemListItem,
1614
} from '@the-dev-tools/spec/collection/item/body/v1/body_pb';
1715
import {
@@ -42,12 +40,14 @@ import { CodeMirrorMarkupLanguage, CodeMirrorMarkupLanguages, useCodeMirrorExten
4240
import {
4341
ColumnActionDelete,
4442
columnActions,
43+
ColumnActionUndoDelta,
4544
columnCheckboxField,
4645
columnTextField,
4746
columnTextFieldWithReference,
48-
makeGenericDeltaFormTableColumns,
4947
makeGenericDisplayTableColumns,
48+
ReactTableNoMemo,
5049
useDeltaFormTable,
50+
useDeltaItems,
5151
useFormTable,
5252
} from './form-table';
5353

@@ -136,6 +136,13 @@ const FormDisplayTable = ({ exampleId }: FormDisplayTableProps) => {
136136
return <DataTable table={table} wrapperClassName={tw`col-span-full`} />;
137137
};
138138

139+
const formDataColumns = [
140+
columnCheckboxField<BodyFormItemListItem>('enabled', { meta: { divider: false } }),
141+
columnTextFieldWithReference<BodyFormItemListItem>('key'),
142+
columnTextFieldWithReference<BodyFormItemListItem>('value'),
143+
columnTextField<BodyFormItemListItem>('description', { meta: { divider: false } }),
144+
];
145+
139146
interface FormDataTableProps {
140147
exampleId: Uint8Array;
141148
}
@@ -150,10 +157,7 @@ const FormDataTable = ({ exampleId }: FormDataTableProps) => {
150157

151158
const table = useReactTable({
152159
columns: [
153-
columnCheckboxField<BodyFormItemListItem>('enabled', { meta: { divider: false } }),
154-
columnTextFieldWithReference<BodyFormItemListItem>('key'),
155-
columnTextFieldWithReference<BodyFormItemListItem>('value'),
156-
columnTextField<BodyFormItemListItem>('description', { meta: { divider: false } }),
160+
...formDataColumns,
157161
columnActions<BodyFormItemListItem>({
158162
cell: ({ row }) => <ColumnActionDelete input={{ bodyId: row.original.bodyId }} schema={bodyFormItemDelete} />,
159163
}),
@@ -180,14 +184,16 @@ interface FormDeltaDataTableProps {
180184

181185
const FormDeltaDataTable = ({ deltaExampleId, exampleId }: FormDeltaDataTableProps) => {
182186
const { transport } = useRouteContext({ from: '__root__' });
183-
const requestService = useMemo(() => createClient(BodyService, transport), [transport]);
187+
188+
const { mutateAsync: create } = useConnectMutation(bodyFormItemCreate);
189+
const { mutateAsync: update } = useConnectMutation(bodyFormItemUpdate);
184190

185191
const [
186192
{
187-
data: { items },
193+
data: { items: itemsBase },
188194
},
189195
{
190-
data: { items: deltaItems },
196+
data: { items: itemsDelta },
191197
},
192198
] = useSuspenseQueries({
193199
queries: [
@@ -196,24 +202,41 @@ const FormDeltaDataTable = ({ deltaExampleId, exampleId }: FormDeltaDataTablePro
196202
],
197203
});
198204

199-
const table = useDeltaFormTable({
200-
columns: makeGenericDeltaFormTableColumns<BodyFormItemListItem>(),
201-
deltaItems,
202-
getParentId: (_) => _.parentBodyId!,
203-
items,
204-
onCreate: (_) =>
205-
requestService
206-
.bodyFormItemCreate({
207-
...Struct.omit(_, '$typeName'),
208-
exampleId: deltaExampleId,
209-
parentBodyId: _.bodyId,
210-
})
211-
.then((_) => _.bodyId),
212-
onDelete: (_) => requestService.bodyFormItemDelete(Struct.omit(_, '$typeName')),
213-
onUpdate: (_) => requestService.bodyFormItemUpdate(Struct.omit(_, '$typeName')),
205+
const items = useDeltaItems({
206+
getId: (_) => _.bodyId.toString(),
207+
getParentId: (_) => _.parentBodyId?.toString(),
208+
itemsBase,
209+
itemsDelta,
214210
});
215211

216-
return <DataTable table={table} wrapperClassName={tw`col-span-full`} />;
212+
const formTable = useDeltaFormTable<BodyFormItemListItem>({
213+
getParentId: (_) => _.parentBodyId?.toString(),
214+
onCreate: ({ $typeName: _, bodyId, ...item }) =>
215+
create({ ...item, exampleId: deltaExampleId, parentBodyId: bodyId }),
216+
onUpdate: ({ $typeName: _, ...item }) => update(item),
217+
});
218+
219+
return (
220+
<ReactTableNoMemo
221+
columns={[
222+
...formDataColumns,
223+
columnActions<BodyFormItemListItem>({
224+
cell: ({ row }) => (
225+
<ColumnActionUndoDelta
226+
hasDelta={row.original.parentBodyId !== undefined}
227+
input={{ bodyId: row.original.bodyId }}
228+
schema={bodyFormItemDelete}
229+
/>
230+
),
231+
}),
232+
]}
233+
data={items}
234+
getCoreRowModel={getCoreRowModel()}
235+
getRowId={(_) => (_.parentBodyId ?? _.bodyId).toString()}
236+
>
237+
{(table) => <DataTable {...formTable} table={table} wrapperClassName={tw`col-span-full`} />}
238+
</ReactTableNoMemo>
239+
);
217240
};
218241

219242
interface UrlEncodedDisplayTableProps {
@@ -234,6 +257,13 @@ const UrlEncodedDisplayTable = ({ exampleId }: UrlEncodedDisplayTableProps) => {
234257
return <DataTable table={table} wrapperClassName={tw`col-span-full`} />;
235258
};
236259

260+
const urlEncodedDataColumns = [
261+
columnCheckboxField<BodyUrlEncodedItemListItem>('enabled', { meta: { divider: false } }),
262+
columnTextFieldWithReference<BodyUrlEncodedItemListItem>('key'),
263+
columnTextFieldWithReference<BodyUrlEncodedItemListItem>('value'),
264+
columnTextField<BodyUrlEncodedItemListItem>('description', { meta: { divider: false } }),
265+
];
266+
237267
interface UrlEncodedFormTableProps {
238268
exampleId: Uint8Array;
239269
}
@@ -248,10 +278,7 @@ const UrlEncodedFormTable = ({ exampleId }: UrlEncodedFormTableProps) => {
248278

249279
const table = useReactTable({
250280
columns: [
251-
columnCheckboxField<BodyUrlEncodedItemListItem>('enabled', { meta: { divider: false } }),
252-
columnTextFieldWithReference<BodyUrlEncodedItemListItem>('key'),
253-
columnTextFieldWithReference<BodyUrlEncodedItemListItem>('value'),
254-
columnTextField<BodyUrlEncodedItemListItem>('description', { meta: { divider: false } }),
281+
...urlEncodedDataColumns,
255282
columnActions<BodyUrlEncodedItemListItem>({
256283
cell: ({ row }) => (
257284
<ColumnActionDelete input={{ bodyId: row.original.bodyId }} schema={bodyUrlEncodedItemDelete} />
@@ -280,14 +307,16 @@ interface UrlEncodedDeltaFormTableProps {
280307

281308
const UrlEncodedDeltaFormTable = ({ deltaExampleId, exampleId }: UrlEncodedDeltaFormTableProps) => {
282309
const { transport } = useRouteContext({ from: '__root__' });
283-
const requestService = useMemo(() => createClient(BodyService, transport), [transport]);
310+
311+
const { mutateAsync: create } = useConnectMutation(bodyUrlEncodedItemCreate);
312+
const { mutateAsync: update } = useConnectMutation(bodyUrlEncodedItemUpdate);
284313

285314
const [
286315
{
287-
data: { items },
316+
data: { items: itemsBase },
288317
},
289318
{
290-
data: { items: deltaItems },
319+
data: { items: itemsDelta },
291320
},
292321
] = useSuspenseQueries({
293322
queries: [
@@ -296,24 +325,41 @@ const UrlEncodedDeltaFormTable = ({ deltaExampleId, exampleId }: UrlEncodedDelta
296325
],
297326
});
298327

299-
const table = useDeltaFormTable({
300-
columns: makeGenericDeltaFormTableColumns<BodyUrlEncodedItemListItem>(),
301-
deltaItems,
302-
getParentId: (_) => _.parentBodyId!,
303-
items,
304-
onCreate: (_) =>
305-
requestService
306-
.bodyUrlEncodedItemCreate({
307-
...Struct.omit(_, '$typeName'),
308-
exampleId: deltaExampleId,
309-
parentBodyId: _.bodyId,
310-
})
311-
.then((_) => _.bodyId),
312-
onDelete: (_) => requestService.bodyUrlEncodedItemDelete(Struct.omit(_, '$typeName')),
313-
onUpdate: (_) => requestService.bodyUrlEncodedItemUpdate(Struct.omit(_, '$typeName')),
328+
const items = useDeltaItems({
329+
getId: (_) => _.bodyId.toString(),
330+
getParentId: (_) => _.parentBodyId?.toString(),
331+
itemsBase,
332+
itemsDelta,
314333
});
315334

316-
return <DataTable table={table} wrapperClassName={tw`col-span-full`} />;
335+
const formTable = useDeltaFormTable<BodyUrlEncodedItemListItem>({
336+
getParentId: (_) => _.parentBodyId?.toString(),
337+
onCreate: ({ $typeName: _, bodyId, ...item }) =>
338+
create({ ...item, exampleId: deltaExampleId, parentBodyId: bodyId }),
339+
onUpdate: ({ $typeName: _, ...item }) => update(item),
340+
});
341+
342+
return (
343+
<ReactTableNoMemo
344+
columns={[
345+
...urlEncodedDataColumns,
346+
columnActions<BodyUrlEncodedItemListItem>({
347+
cell: ({ row }) => (
348+
<ColumnActionUndoDelta
349+
hasDelta={row.original.parentBodyId !== undefined}
350+
input={{ bodyId: row.original.bodyId }}
351+
schema={bodyFormItemDelete}
352+
/>
353+
),
354+
}),
355+
]}
356+
data={items}
357+
getCoreRowModel={getCoreRowModel()}
358+
getRowId={(_) => (_.parentBodyId ?? _.bodyId).toString()}
359+
>
360+
{(table) => <DataTable {...formTable} table={table} wrapperClassName={tw`col-span-full`} />}
361+
</ReactTableNoMemo>
362+
);
317363
};
318364

319365
interface RawFormProps {

0 commit comments

Comments
 (0)