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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "asasvirtuais",
3
3
  "type": "module",
4
- "version": "0.6.3",
4
+ "version": "0.6.5",
5
5
  "directories": {
6
6
  "packages": "./packages"
7
7
  },
@@ -43,8 +43,8 @@ export function reactInterface<
43
43
  table,
44
44
  asAbove,
45
45
  }: TableProviderProps<Table>) {
46
- type Readable = z.infer<Database[Table]["readable"]>
47
- type Writable = z.infer<Database[Table]["writable"]>
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
- const [DatabaseProvider, useDatabase] =
119
- createContextFromHook(useDatabaseProvider)
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
- return useDatabase()[name]
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
- & ReturnType<typeof useFields<z.infer<Database[T]['writable']>>>
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
- & ReturnType<typeof useFields<z.infer<Database[T]['writable']>>>
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
- & ReturnType<typeof useFields<ListProps<z.infer<Database[T]['readable']>>>>
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({query: fields})
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,