asasvirtuais 0.6.3 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/react-interface.tsx +54 -26
package/package.json
CHANGED
|
@@ -43,8 +43,8 @@ export function reactInterface<
|
|
|
43
43
|
table,
|
|
44
44
|
asAbove,
|
|
45
45
|
}: TableProviderProps<Table>) {
|
|
46
|
-
type Readable = z.infer<Database[Table][
|
|
47
|
-
type Writable = z.infer<Database[Table][
|
|
46
|
+
type Readable = z.infer<Database[Table]['readable']>
|
|
47
|
+
type Writable = z.infer<Database[Table]['writable']>
|
|
48
48
|
|
|
49
49
|
const index = useIndex<Readable>({ ...(asAbove ?? {}) })
|
|
50
50
|
|
|
@@ -88,21 +88,6 @@ export function reactInterface<
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
const TableContext = createContext<
|
|
92
|
-
ReturnType<typeof useTableProvider<any>> | undefined
|
|
93
|
-
>(undefined)
|
|
94
|
-
|
|
95
|
-
function TableProvider<Table extends TableKey>({children, ...props}: TableProviderProps<Table> & {
|
|
96
|
-
children: React.ReactNode | ((props: ReturnType<typeof useTableProvider<Table>>) => React.ReactNode)
|
|
97
|
-
}) {
|
|
98
|
-
const context = useTableProvider(props)
|
|
99
|
-
return (
|
|
100
|
-
<TableContext.Provider value={context}>
|
|
101
|
-
{typeof children === 'function' ? children(context) : children}
|
|
102
|
-
</TableContext.Provider>
|
|
103
|
-
)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
91
|
function useDatabaseProvider(tables: { [T in TableKey]: Record<string, z.infer<Database[T]['readable']>> }): {
|
|
107
92
|
[T in TableKey]: ReturnType<typeof useTableProvider<T>>
|
|
108
93
|
} {
|
|
@@ -114,12 +99,56 @@ export function reactInterface<
|
|
|
114
99
|
[T in TableKey]: ReturnType<typeof useTableProvider<T>>
|
|
115
100
|
}
|
|
116
101
|
}
|
|
102
|
+
// Create a separate context for each table dynamically
|
|
103
|
+
const tableContexts = new Map<TableKey, React.Context<ReturnType<typeof useTableProvider<any>> | undefined>>();
|
|
104
|
+
|
|
105
|
+
function getTableContext<T extends TableKey>(table: T) {
|
|
106
|
+
if (!tableContexts.has(table)) {
|
|
107
|
+
tableContexts.set(table, createContext<ReturnType<typeof useTableProvider<T>> | undefined>(undefined));
|
|
108
|
+
}
|
|
109
|
+
return tableContexts.get(table)!;
|
|
110
|
+
}
|
|
117
111
|
|
|
118
|
-
|
|
119
|
-
|
|
112
|
+
function TableProvider<Table extends TableKey>({ children, ...props }: TableProviderProps<Table> & {
|
|
113
|
+
children: React.ReactNode | ((props: ReturnType<typeof useTableProvider<Table>>) => React.ReactNode)
|
|
114
|
+
}) {
|
|
115
|
+
const context = useTableProvider(props);
|
|
116
|
+
const TableContext = getTableContext(props.table);
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<TableContext.Provider value={context}>
|
|
120
|
+
{typeof children === 'function' ? children(context) : children}
|
|
121
|
+
</TableContext.Provider>
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function DatabaseProvider({
|
|
126
|
+
children,
|
|
127
|
+
...tables
|
|
128
|
+
}: React.PropsWithChildren<{
|
|
129
|
+
[T in TableKey]?: Record<string, z.infer<Database[T]['readable']>>
|
|
130
|
+
}>) {
|
|
131
|
+
return Object.entries(tables).reduce(
|
|
132
|
+
(prev, [table, asAbove]) => {
|
|
133
|
+
return (
|
|
134
|
+
<TableProvider table={table as TableKey} asAbove={asAbove}>
|
|
135
|
+
{prev}
|
|
136
|
+
</TableProvider>
|
|
137
|
+
);
|
|
138
|
+
},
|
|
139
|
+
children as React.ReactNode
|
|
140
|
+
)
|
|
141
|
+
}
|
|
120
142
|
|
|
121
143
|
function useTable<T extends TableKey>(name: T) {
|
|
122
|
-
|
|
144
|
+
const TableContext = getTableContext(name);
|
|
145
|
+
const context = useContext(TableContext);
|
|
146
|
+
|
|
147
|
+
if (!context) {
|
|
148
|
+
throw new Error(`useTable("${String(name)}") must be used within a TableProvider or DatabaseProvider with table="${String(name)}"`);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return context as ReturnType<typeof useTableProvider<T>>;
|
|
123
152
|
}
|
|
124
153
|
|
|
125
154
|
function useSingleProvider<Table extends TableKey>({
|
|
@@ -188,7 +217,7 @@ export function reactInterface<
|
|
|
188
217
|
onSuccess?: (result: z.infer<Database[T]['readable']>) => void
|
|
189
218
|
children: (
|
|
190
219
|
props: ReturnType<typeof useFormProvider<z.infer<Database[T]['writable']>, z.infer<Database[T]['readable']>>>
|
|
191
|
-
|
|
220
|
+
& ReturnType<typeof useFields<z.infer<Database[T]['writable']>>>
|
|
192
221
|
) => React.ReactNode
|
|
193
222
|
}) {
|
|
194
223
|
type Readable = z.infer<Database[T]['readable']>
|
|
@@ -229,7 +258,7 @@ export function reactInterface<
|
|
|
229
258
|
onSuccess?: (result: z.infer<Database[T]['readable']>) => void
|
|
230
259
|
children: (
|
|
231
260
|
props: ReturnType<typeof useFormProvider<z.infer<Database[T]['writable']>, z.infer<Database[T]['readable']>>>
|
|
232
|
-
|
|
261
|
+
& ReturnType<typeof useFields<z.infer<Database[T]['writable']>>>
|
|
233
262
|
) => React.ReactNode
|
|
234
263
|
}) {
|
|
235
264
|
type Readable = z.infer<Database[T]['readable']>
|
|
@@ -270,7 +299,7 @@ export function reactInterface<
|
|
|
270
299
|
onSuccess?: (result: z.infer<Database[T]['readable']>[]) => void
|
|
271
300
|
children: (
|
|
272
301
|
props: ReturnType<typeof useFormProvider<ListProps<z.infer<Database[T]['readable']>>, z.infer<Database[T]['readable']>[]>>
|
|
273
|
-
|
|
302
|
+
& ReturnType<typeof useFields<ListProps<z.infer<Database[T]['readable']>>>>
|
|
274
303
|
) => React.ReactNode
|
|
275
304
|
}) {
|
|
276
305
|
type Readable = z.infer<Database[T]['readable']>
|
|
@@ -280,7 +309,7 @@ export function reactInterface<
|
|
|
280
309
|
|
|
281
310
|
const callback = useCallback(
|
|
282
311
|
async (fields: Omit<ListProps<Readable>, 'table'>) => {
|
|
283
|
-
const result = await list.trigger(
|
|
312
|
+
const result = await list.trigger(fields)
|
|
284
313
|
if (onSuccess) onSuccess(result)
|
|
285
314
|
return result
|
|
286
315
|
},
|
|
@@ -289,7 +318,7 @@ export function reactInterface<
|
|
|
289
318
|
|
|
290
319
|
return (
|
|
291
320
|
<FieldsProvider<ListProps<Readable>>
|
|
292
|
-
defaults={(defaults || {}) as ListProps<Readable>}
|
|
321
|
+
defaults={(defaults || { query: {} }) as ListProps<Readable>}
|
|
293
322
|
>
|
|
294
323
|
{fields => (
|
|
295
324
|
<FormProvider<ListProps<Readable>, Readable[]> callback={callback} data={fields.fields}>
|
|
@@ -329,7 +358,6 @@ export function reactInterface<
|
|
|
329
358
|
|
|
330
359
|
return {
|
|
331
360
|
DatabaseProvider,
|
|
332
|
-
useDatabase,
|
|
333
361
|
useTable,
|
|
334
362
|
useTableProvider,
|
|
335
363
|
TableProvider,
|