@archbase/data 3.0.0
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/README.md +57 -0
- package/dist/archbase-data-3.0.0.tgz +0 -0
- package/dist/datasource/ArchbaseDataSource.d.ts +472 -0
- package/dist/datasource/ArchbaseLocalFilterDataSource.d.ts +27 -0
- package/dist/datasource/ArchbaseRemoteDataSource.d.ts +17 -0
- package/dist/datasource/ArchbaseRemoteFilterDataSource.d.ts +28 -0
- package/dist/datasource/ArchbaseV1V2CompatibilityPattern.d.ts +72 -0
- package/dist/datasource/IArchbaseDataSourceBase.d.ts +111 -0
- package/dist/datasource/index.d.ts +10 -0
- package/dist/datasource/v2/ArchbaseDataSourceV2.d.ts +128 -0
- package/dist/datasource/v2/ArchbaseQueryIntegration.d.ts +210 -0
- package/dist/datasource/v2/ArchbaseQueryProvider.d.ts +79 -0
- package/dist/datasource/v2/ArchbaseRemoteDataSourceV2.d.ts +182 -0
- package/dist/datasource/v2/ArchbaseTanStackQueryIntegration.d.ts +132 -0
- package/dist/datasource/v2/index.d.ts +11 -0
- package/dist/datasource/v2/useArchbaseDataSourceV2.d.ts +143 -0
- package/dist/datasource/v2/useArchbaseRemoteDataSourceV2.d.ts +210 -0
- package/dist/hooks/index.d.ts +14 -0
- package/dist/hooks/useArchbaseDataSource.d.ts +15 -0
- package/dist/hooks/useArchbaseDataSourceListener.d.ts +7 -0
- package/dist/hooks/useArchbaseDidMount.d.ts +5 -0
- package/dist/hooks/useArchbaseDidUpdate.d.ts +6 -0
- package/dist/hooks/useArchbaseEventListener.d.ts +1 -0
- package/dist/hooks/useArchbaseForceRerender.d.ts +5 -0
- package/dist/hooks/useArchbaseForceUpdate.d.ts +5 -0
- package/dist/hooks/useArchbaseLocalFilterDataSource.d.ts +13 -0
- package/dist/hooks/useArchbaseRemoteDataSource.d.ts +36 -0
- package/dist/hooks/useArchbaseRemoteFilterDataSource.d.ts +34 -0
- package/dist/hooks/useArchbaseRemoteServiceApi.d.ts +2 -0
- package/dist/hooks/useArchbaseStore.d.ts +3 -0
- package/dist/hooks/useArchbaseWillUnmount.d.ts +5 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +3360 -0
- package/dist/service/ArchbaseRemoteApiService.d.ts +103 -0
- package/dist/service/index.d.ts +2 -0
- package/dist/types/ArchbaseStateValues.d.ts +9 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { DataSourceListener } from './ArchbaseDataSource';
|
|
2
|
+
/**
|
|
3
|
+
* Interface base para DataSources usados em componentes de binding.
|
|
4
|
+
*
|
|
5
|
+
* Esta interface define o contrato mínimo que TODOS os DataSources devem implementar
|
|
6
|
+
* para serem compatíveis com componentes como ArchbaseEdit, ArchbaseSelect, etc.
|
|
7
|
+
*
|
|
8
|
+
* Tanto ArchbaseDataSource quanto ArchbaseRemoteDataSourceV2 implementam esta interface.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Em componentes, use esta interface ao invés de classes concretas:
|
|
13
|
+
* interface MyComponentProps<T> {
|
|
14
|
+
* dataSource?: IArchbaseDataSourceBase<T>;
|
|
15
|
+
* dataField?: string;
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export interface IArchbaseDataSourceBase<T> {
|
|
20
|
+
/**
|
|
21
|
+
* Retorna o nome do DataSource
|
|
22
|
+
*/
|
|
23
|
+
getName(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Verifica se o DataSource está ativo
|
|
26
|
+
*/
|
|
27
|
+
isActive(): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Verifica se o DataSource está vazio (sem registros)
|
|
30
|
+
*/
|
|
31
|
+
isEmpty(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Verifica se o DataSource está em modo de navegação (browse)
|
|
34
|
+
*/
|
|
35
|
+
isBrowsing(): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Verifica se o DataSource está em modo de edição
|
|
38
|
+
*/
|
|
39
|
+
isEditing(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Verifica se o DataSource está em modo de inserção
|
|
42
|
+
*/
|
|
43
|
+
isInserting(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Retorna o registro atual ou undefined se não houver registro
|
|
46
|
+
*/
|
|
47
|
+
getCurrentRecord(): T | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Retorna o índice do registro atual
|
|
50
|
+
*/
|
|
51
|
+
getCurrentIndex(): number;
|
|
52
|
+
/**
|
|
53
|
+
* Retorna o número total de registros na coleção filtrada
|
|
54
|
+
*/
|
|
55
|
+
getTotalRecords(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Retorna o número total de registros no servidor (para paginação)
|
|
58
|
+
*/
|
|
59
|
+
getGrandTotalRecords(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Retorna todos os registros da coleção filtrada
|
|
62
|
+
*/
|
|
63
|
+
browseRecords(): T[];
|
|
64
|
+
/**
|
|
65
|
+
* Localiza um registro por valores de campos
|
|
66
|
+
* @param values Objeto com campos/valores para busca
|
|
67
|
+
* @returns true se encontrou, false caso contrário
|
|
68
|
+
*/
|
|
69
|
+
locate(values: any): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Vai para um registro pelo seu índice
|
|
72
|
+
* @param index Índice do registro
|
|
73
|
+
*/
|
|
74
|
+
gotoRecord(index: number): void;
|
|
75
|
+
/**
|
|
76
|
+
* Vai para um registro pelo seu dado
|
|
77
|
+
* @param record Dados do registro para navegar
|
|
78
|
+
* @returns true se encontrou, false caso contrário
|
|
79
|
+
*/
|
|
80
|
+
gotoRecordByData(record: T): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Retorna a página atual (0-indexed)
|
|
83
|
+
*/
|
|
84
|
+
getCurrentPage(): number;
|
|
85
|
+
/**
|
|
86
|
+
* Retorna o tamanho da página
|
|
87
|
+
*/
|
|
88
|
+
getPageSize(): number;
|
|
89
|
+
/**
|
|
90
|
+
* Obtém o valor de um campo do registro atual
|
|
91
|
+
* @param fieldName Nome do campo (suporta notação de ponto para campos aninhados)
|
|
92
|
+
* @param defaultValue Valor padrão caso o campo seja undefined
|
|
93
|
+
*/
|
|
94
|
+
getFieldValue(fieldName: string, defaultValue?: any): any;
|
|
95
|
+
/**
|
|
96
|
+
* Define o valor de um campo no registro atual
|
|
97
|
+
* @param fieldName Nome do campo (suporta notação de ponto para campos aninhados)
|
|
98
|
+
* @param value Novo valor do campo
|
|
99
|
+
*/
|
|
100
|
+
setFieldValue(fieldName: string, value: any): void;
|
|
101
|
+
/**
|
|
102
|
+
* Adiciona um listener para eventos do DataSource
|
|
103
|
+
* @param listener Função que será chamada quando eventos ocorrerem
|
|
104
|
+
*/
|
|
105
|
+
addListener(listener: DataSourceListener<T>): void;
|
|
106
|
+
/**
|
|
107
|
+
* Remove um listener de eventos do DataSource
|
|
108
|
+
* @param listener Função a ser removida
|
|
109
|
+
*/
|
|
110
|
+
removeListener(listener: DataSourceListener<T>): void;
|
|
111
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { DataSourceEvent, DataSourceEvents, DataSourceListener, DataSourceOptions, FilterFn, IDataSource, DataSourceEventRefreshDataType } from './ArchbaseDataSource';
|
|
2
|
+
export type { IArchbaseDataSourceBase } from './IArchbaseDataSourceBase';
|
|
3
|
+
export type { IDataSourceValidator, DataSourceValidationError } from '@archbase/core';
|
|
4
|
+
export { DataSourceEventNames, ArchbaseDataSource } from './ArchbaseDataSource';
|
|
5
|
+
export { ArchbaseRemoteDataSource } from './ArchbaseRemoteDataSource';
|
|
6
|
+
export type { IRemoteDataSource } from './ArchbaseRemoteDataSource';
|
|
7
|
+
export { ArchbaseLocalFilterDataSource, LocalFilter } from './ArchbaseLocalFilterDataSource';
|
|
8
|
+
export { ArchbaseRemoteFilterDataSource, RemoteFilter } from './ArchbaseRemoteFilterDataSource';
|
|
9
|
+
export * from './ArchbaseV1V2CompatibilityPattern';
|
|
10
|
+
export * from './v2';
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Draft } from 'immer';
|
|
2
|
+
import { DataSourceListener, IDataSourceValidator, IDataSource, DataSourceOptions, FilterFn } from '../ArchbaseDataSource';
|
|
3
|
+
/**
|
|
4
|
+
* Estados possíveis do DataSource
|
|
5
|
+
*/
|
|
6
|
+
type DataSourceState = 'browse' | 'edit' | 'insert';
|
|
7
|
+
/**
|
|
8
|
+
* Configuração para ArchbaseDataSourceV2
|
|
9
|
+
*/
|
|
10
|
+
export interface ArchbaseDataSourceV2Config<T> {
|
|
11
|
+
name: string;
|
|
12
|
+
label?: string;
|
|
13
|
+
records?: T[];
|
|
14
|
+
validator?: IDataSourceValidator;
|
|
15
|
+
onStateChange?: (prevRecords: T[], newRecords: T[]) => void;
|
|
16
|
+
onFieldError?: (fieldName: string, error: string) => void;
|
|
17
|
+
onError?: (error: string, originalError?: any) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* ArchbaseDataSourceV2 - Versão V2 com Immer
|
|
21
|
+
*
|
|
22
|
+
* Esta implementação:
|
|
23
|
+
* - Garante imutabilidade completa com Immer
|
|
24
|
+
* - Interface simplificada focada em funcionalidade V2
|
|
25
|
+
* - Suporte a operações em arrays com type safety
|
|
26
|
+
* - Event system compatível com V1
|
|
27
|
+
*/
|
|
28
|
+
export declare class ArchbaseDataSourceV2<T> implements IDataSource<T> {
|
|
29
|
+
private name;
|
|
30
|
+
private label;
|
|
31
|
+
private records;
|
|
32
|
+
private currentIndex;
|
|
33
|
+
private state;
|
|
34
|
+
private listeners;
|
|
35
|
+
private originalRecord;
|
|
36
|
+
private validator?;
|
|
37
|
+
private lastDataChangedAt;
|
|
38
|
+
private active;
|
|
39
|
+
private onStateChange?;
|
|
40
|
+
private onFieldError?;
|
|
41
|
+
private onError?;
|
|
42
|
+
constructor(config: ArchbaseDataSourceV2Config<T>);
|
|
43
|
+
getName(): string;
|
|
44
|
+
getLabel(): string;
|
|
45
|
+
isActive(): boolean;
|
|
46
|
+
close(): void;
|
|
47
|
+
getCurrentRecord(): T | undefined;
|
|
48
|
+
getCurrentIndex(): number;
|
|
49
|
+
getTotalRecords(): number;
|
|
50
|
+
isEmpty(): boolean;
|
|
51
|
+
first(): this;
|
|
52
|
+
last(): this;
|
|
53
|
+
next(): this;
|
|
54
|
+
prior(): this;
|
|
55
|
+
goToRecord(index: number): T | undefined;
|
|
56
|
+
isFirst(): boolean;
|
|
57
|
+
isLast(): boolean;
|
|
58
|
+
isBOF(): boolean;
|
|
59
|
+
isEOF(): boolean;
|
|
60
|
+
isBrowsing(): boolean;
|
|
61
|
+
isEditing(): boolean;
|
|
62
|
+
isInserting(): boolean;
|
|
63
|
+
edit(): this;
|
|
64
|
+
cancel(): this;
|
|
65
|
+
insert(record: T): this;
|
|
66
|
+
save(callback?: Function): Promise<T>;
|
|
67
|
+
remove(callback?: Function): Promise<T | undefined>;
|
|
68
|
+
setFieldValue(fieldName: string, value: any): this;
|
|
69
|
+
getFieldValue(fieldName: string): any;
|
|
70
|
+
appendToFieldArray<K extends keyof T>(fieldName: K, item: T[K] extends Array<infer U> ? U : never): void;
|
|
71
|
+
updateFieldArrayItem<K extends keyof T>(fieldName: K, index: number, updater: (draft: T[K] extends Array<infer U> ? Draft<U> : never) => void): void;
|
|
72
|
+
removeFromFieldArray<K extends keyof T>(fieldName: K, index: number): void;
|
|
73
|
+
insertIntoFieldArray<K extends keyof T>(fieldName: K, index: number, item: T[K] extends Array<infer U> ? U : never): void;
|
|
74
|
+
getFieldArray<K extends keyof T>(fieldName: K): T[K] extends Array<infer U> ? U[] : never;
|
|
75
|
+
isFieldArray<K extends keyof T>(fieldName: K): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Abre o DataSource com os dados fornecidos.
|
|
78
|
+
* Aceita tanto o formato completo DataSourceOptions quanto um formato simplificado { records: T[] }
|
|
79
|
+
*/
|
|
80
|
+
open(options: DataSourceOptions<T> | {
|
|
81
|
+
records: T[];
|
|
82
|
+
}): void;
|
|
83
|
+
clear(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Define os dados do DataSource.
|
|
86
|
+
* Quando apenas records é informado, os valores de paginação são derivados automaticamente.
|
|
87
|
+
*/
|
|
88
|
+
setData(options: DataSourceOptions<T> | {
|
|
89
|
+
records: T[];
|
|
90
|
+
}): void;
|
|
91
|
+
getOptions(): DataSourceOptions<T>;
|
|
92
|
+
refreshData(options?: DataSourceOptions<T>): void;
|
|
93
|
+
browseRecords(): T[];
|
|
94
|
+
getGrandTotalRecords(): number;
|
|
95
|
+
getCurrentPage(): number;
|
|
96
|
+
getTotalPages(): number;
|
|
97
|
+
isEmptyField(fieldName: string): boolean;
|
|
98
|
+
goToPage(pageNumber: number): this;
|
|
99
|
+
gotoRecordByData(record: T): boolean;
|
|
100
|
+
disabledAllListeners(): this;
|
|
101
|
+
enableAllListeners(): this;
|
|
102
|
+
addFieldChangeListener(fieldName: string, listener: (fieldName: string, oldValue: any, newValue: any) => void): this;
|
|
103
|
+
removeFieldChangeListener(fieldName: string, listener: (fieldName: string, oldValue: any, newValue: any) => void): this;
|
|
104
|
+
addFilter(filterFn: FilterFn<T>): this;
|
|
105
|
+
removeFilter(filterFn: FilterFn<T>): this;
|
|
106
|
+
clearFilters(): this;
|
|
107
|
+
locate(values: any): boolean;
|
|
108
|
+
locateByFilter(filterFn: (record: T) => boolean): boolean;
|
|
109
|
+
validate(): boolean;
|
|
110
|
+
addListener(...listeners: DataSourceListener<T>[]): this;
|
|
111
|
+
removeListener(...listeners: DataSourceListener<T>[]): this;
|
|
112
|
+
private emit;
|
|
113
|
+
getRecords(): T[];
|
|
114
|
+
setRecords(records: T[]): void;
|
|
115
|
+
getDebugSnapshot(): {
|
|
116
|
+
name: string;
|
|
117
|
+
recordCount: number;
|
|
118
|
+
currentIndex: number;
|
|
119
|
+
currentRecord: T;
|
|
120
|
+
state: DataSourceState;
|
|
121
|
+
listeners: number;
|
|
122
|
+
};
|
|
123
|
+
private validateDataSourceActive;
|
|
124
|
+
private notifyStateChange;
|
|
125
|
+
private setNestedValue;
|
|
126
|
+
private getNestedValue;
|
|
127
|
+
}
|
|
128
|
+
export {};
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preparação para integração com TanStack Query
|
|
3
|
+
*
|
|
4
|
+
* Este arquivo define as estruturas e tipos necessários para integrar
|
|
5
|
+
* o ArchbaseDataSourceV2 com TanStack Query para gerenciamento avançado
|
|
6
|
+
* de cache e sincronização de dados remotos.
|
|
7
|
+
*/
|
|
8
|
+
import { ArchbaseRemoteDataSourceV2Config } from './ArchbaseRemoteDataSourceV2';
|
|
9
|
+
import { ArchbaseRemoteApiService } from '../../service/ArchbaseRemoteApiService';
|
|
10
|
+
/**
|
|
11
|
+
* Configuração para integração com TanStack Query
|
|
12
|
+
*/
|
|
13
|
+
export interface ArchbaseTanStackQueryConfig<T> {
|
|
14
|
+
/** Chave única para o cache do TanStack Query */
|
|
15
|
+
queryKey: string | string[];
|
|
16
|
+
/** Configuração do DataSource */
|
|
17
|
+
dataSourceConfig: Omit<ArchbaseRemoteDataSourceV2Config<T>, 'service'>;
|
|
18
|
+
/** Serviço para operações remotas */
|
|
19
|
+
service: ArchbaseRemoteApiService<T, any>;
|
|
20
|
+
/** Tempo de cache em milissegundos (padrão: 5 minutos) */
|
|
21
|
+
staleTime?: number;
|
|
22
|
+
/** Tempo para considerar dados expirados em milissegundos (padrão: 30 minutos) */
|
|
23
|
+
cacheTime?: number;
|
|
24
|
+
/** Refetch automático quando a janela ganha foco */
|
|
25
|
+
refetchOnWindowFocus?: boolean;
|
|
26
|
+
/** Refetch automático em intervalos */
|
|
27
|
+
refetchInterval?: number;
|
|
28
|
+
/** Habilitar retry automático em caso de erro */
|
|
29
|
+
retry?: boolean | number;
|
|
30
|
+
/** Função para transformar dados antes do cache */
|
|
31
|
+
transformData?: (data: T[]) => T[];
|
|
32
|
+
/** Função para validar se os dados em cache são válidos */
|
|
33
|
+
isDataValid?: (data: T[]) => boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Estrutura para operações de cache do TanStack Query
|
|
37
|
+
*/
|
|
38
|
+
export interface ArchbaseQueryOperations<T> {
|
|
39
|
+
/** Invalidar cache */
|
|
40
|
+
invalidateQueries: () => void;
|
|
41
|
+
/** Refetch dados */
|
|
42
|
+
refetch: () => Promise<void>;
|
|
43
|
+
/** Definir dados no cache manualmente */
|
|
44
|
+
setQueryData: (data: T[]) => void;
|
|
45
|
+
/** Obter dados do cache */
|
|
46
|
+
getQueryData: () => T[] | undefined;
|
|
47
|
+
/** Remover do cache */
|
|
48
|
+
removeQueries: () => void;
|
|
49
|
+
/** Pré-carregar dados */
|
|
50
|
+
prefetchQuery: () => Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Estado do TanStack Query para o DataSource
|
|
54
|
+
*/
|
|
55
|
+
export interface ArchbaseQueryState {
|
|
56
|
+
/** Está carregando dados */
|
|
57
|
+
isLoading: boolean;
|
|
58
|
+
/** Está fazendo refetch */
|
|
59
|
+
isFetching: boolean;
|
|
60
|
+
/** Dados estão expirados */
|
|
61
|
+
isStale: boolean;
|
|
62
|
+
/** Erro da última operação */
|
|
63
|
+
error: Error | null;
|
|
64
|
+
/** Timestamp da última atualização */
|
|
65
|
+
dataUpdatedAt: number;
|
|
66
|
+
/** Status da query */
|
|
67
|
+
status: 'idle' | 'loading' | 'error' | 'success';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Hook futuro: useArchbaseDataSourceWithQuery
|
|
71
|
+
*
|
|
72
|
+
* Este hook combinará ArchbaseDataSourceV2 com TanStack Query
|
|
73
|
+
* para gerenciamento avançado de cache e sincronização.
|
|
74
|
+
*
|
|
75
|
+
* Funcionalidades planejadas:
|
|
76
|
+
* 1. Cache automático de dados remotos
|
|
77
|
+
* 2. Invalidação inteligente de cache
|
|
78
|
+
* 3. Refetch automático em cenários específicos
|
|
79
|
+
* 4. Otimistic updates para operações CRUD
|
|
80
|
+
* 5. Background refetch quando dados ficam stale
|
|
81
|
+
* 6. Retry automático em caso de falhas de rede
|
|
82
|
+
* 7. Prefetch de dados relacionados
|
|
83
|
+
* 8. Sincronização entre múltiplas instâncias do mesmo DataSource
|
|
84
|
+
*
|
|
85
|
+
* Exemplo de uso futuro:
|
|
86
|
+
*
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const {
|
|
89
|
+
* dataSource,
|
|
90
|
+
* currentRecord,
|
|
91
|
+
* isLoading,
|
|
92
|
+
* isFetching,
|
|
93
|
+
* error,
|
|
94
|
+
* operations
|
|
95
|
+
* } = useArchbaseDataSourceWithQuery({
|
|
96
|
+
* queryKey: ['pessoas', { filter: activeFilter }],
|
|
97
|
+
* dataSourceConfig: {
|
|
98
|
+
* name: 'pessoas-datasource',
|
|
99
|
+
* pageSize: 20
|
|
100
|
+
* },
|
|
101
|
+
* service: pessoaService,
|
|
102
|
+
* staleTime: 5 * 60 * 1000, // 5 minutos
|
|
103
|
+
* cacheTime: 30 * 60 * 1000, // 30 minutos
|
|
104
|
+
* refetchOnWindowFocus: true
|
|
105
|
+
* });
|
|
106
|
+
*
|
|
107
|
+
* // Invalidar cache quando dados são modificados
|
|
108
|
+
* const handleSave = async () => {
|
|
109
|
+
* await dataSource.save();
|
|
110
|
+
* operations.invalidateQueries();
|
|
111
|
+
* };
|
|
112
|
+
*
|
|
113
|
+
* // Prefetch dados relacionados
|
|
114
|
+
* useEffect(() => {
|
|
115
|
+
* if (currentRecord) {
|
|
116
|
+
* operations.prefetchQuery(['pessoa-detalhes', currentRecord.id]);
|
|
117
|
+
* }
|
|
118
|
+
* }, [currentRecord]);
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
/**
|
|
122
|
+
* Utilitários para integração com TanStack Query
|
|
123
|
+
*/
|
|
124
|
+
export declare class ArchbaseQueryUtils {
|
|
125
|
+
/**
|
|
126
|
+
* Gera chave de query baseada no DataSource e filtros
|
|
127
|
+
*/
|
|
128
|
+
static generateQueryKey<T>(dataSourceName: string, filter?: any, sort?: any, page?: number): string[];
|
|
129
|
+
/**
|
|
130
|
+
* Determina se os dados precisam ser refetch baseado em critérios
|
|
131
|
+
*/
|
|
132
|
+
static shouldRefetch(lastFetch: number, staleTime: number, userInteraction?: boolean): boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Merge optimistic updates com dados em cache
|
|
135
|
+
*/
|
|
136
|
+
static mergeOptimisticUpdate<T>(cachedData: T[], optimisticUpdate: Partial<T>, identifier: keyof T): T[];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Configurações padrão para diferentes cenários
|
|
140
|
+
*/
|
|
141
|
+
export declare const ARCHBASE_QUERY_DEFAULTS: {
|
|
142
|
+
/** Configuração para dados que mudam raramente */
|
|
143
|
+
readonly STATIC_DATA: {
|
|
144
|
+
readonly staleTime: number;
|
|
145
|
+
readonly cacheTime: number;
|
|
146
|
+
readonly refetchOnWindowFocus: false;
|
|
147
|
+
readonly retry: 1;
|
|
148
|
+
};
|
|
149
|
+
/** Configuração para dados dinâmicos */
|
|
150
|
+
readonly DYNAMIC_DATA: {
|
|
151
|
+
readonly staleTime: number;
|
|
152
|
+
readonly cacheTime: number;
|
|
153
|
+
readonly refetchOnWindowFocus: true;
|
|
154
|
+
readonly retry: 3;
|
|
155
|
+
};
|
|
156
|
+
/** Configuração para dados em tempo real */
|
|
157
|
+
readonly REALTIME_DATA: {
|
|
158
|
+
readonly staleTime: number;
|
|
159
|
+
readonly cacheTime: number;
|
|
160
|
+
readonly refetchOnWindowFocus: true;
|
|
161
|
+
readonly refetchInterval: number;
|
|
162
|
+
readonly retry: 5;
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Tipos para implementação futura
|
|
167
|
+
*/
|
|
168
|
+
export type ArchbaseQueryHookReturn<T> = {
|
|
169
|
+
dataSource: any;
|
|
170
|
+
queryState: ArchbaseQueryState;
|
|
171
|
+
operations: ArchbaseQueryOperations<T>;
|
|
172
|
+
currentRecord?: T;
|
|
173
|
+
currentIndex: number;
|
|
174
|
+
totalRecords: number;
|
|
175
|
+
isLoading: boolean;
|
|
176
|
+
error: string | null;
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Comentários para implementação futura:
|
|
180
|
+
*
|
|
181
|
+
* 1. INTEGRAÇÃO COM TANSTACK QUERY:
|
|
182
|
+
* - Instalar @tanstack/react-query como dependência
|
|
183
|
+
* - Criar wrapper que combine DataSource com useQuery/useMutation
|
|
184
|
+
* - Implementar cache inteligente baseado em chaves geradas automaticamente
|
|
185
|
+
*
|
|
186
|
+
* 2. OPTIMISTIC UPDATES:
|
|
187
|
+
* - Implementar updates otimistas para operações CRUD
|
|
188
|
+
* - Rollback automático em caso de erro
|
|
189
|
+
* - Sincronização com estado do DataSource
|
|
190
|
+
*
|
|
191
|
+
* 3. INVALIDAÇÃO DE CACHE:
|
|
192
|
+
* - Invalidação automática após mutations
|
|
193
|
+
* - Invalidação baseada em relacionamentos de dados
|
|
194
|
+
* - Invalidação inteligente para queries relacionadas
|
|
195
|
+
*
|
|
196
|
+
* 4. BACKGROUND SYNC:
|
|
197
|
+
* - Sincronização em background quando dados ficam stale
|
|
198
|
+
* - Notificações quando dados são atualizados
|
|
199
|
+
* - Merge inteligente de mudanças remotas
|
|
200
|
+
*
|
|
201
|
+
* 5. PERFORMANCE:
|
|
202
|
+
* - Lazy loading de dados relacionados
|
|
203
|
+
* - Prefetch de próximas páginas
|
|
204
|
+
* - Cache de queries frequentes
|
|
205
|
+
*
|
|
206
|
+
* 6. OFFLINE SUPPORT:
|
|
207
|
+
* - Persistência local de dados críticos
|
|
208
|
+
* - Queue de operações para quando voltar online
|
|
209
|
+
* - Indicadores de status de conexão
|
|
210
|
+
*/
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArchbaseQueryProvider - TanStack Query Provider for Archbase React
|
|
3
|
+
*
|
|
4
|
+
* This provider sets up TanStack Query with optimized defaults for Archbase DataSources
|
|
5
|
+
*/
|
|
6
|
+
import React, { ReactNode } from 'react';
|
|
7
|
+
import { QueryClient } from '@tanstack/react-query';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for ArchbaseQueryProvider
|
|
10
|
+
*/
|
|
11
|
+
export interface ArchbaseQueryProviderConfig {
|
|
12
|
+
/** Enable React Query DevTools (default: true in development) */
|
|
13
|
+
enableDevTools?: boolean;
|
|
14
|
+
/** Custom QueryClient instance */
|
|
15
|
+
queryClient?: QueryClient;
|
|
16
|
+
/** Default stale time for all queries (default: 30 seconds) */
|
|
17
|
+
defaultStaleTime?: number;
|
|
18
|
+
/** Default cache time for all queries (default: 5 minutes) */
|
|
19
|
+
defaultCacheTime?: number;
|
|
20
|
+
/** Default retry count (default: 3) */
|
|
21
|
+
defaultRetry?: number;
|
|
22
|
+
/** Enable background refetch on window focus (default: false) */
|
|
23
|
+
refetchOnWindowFocus?: boolean;
|
|
24
|
+
/** Enable background refetch on reconnect (default: true) */
|
|
25
|
+
refetchOnReconnect?: boolean;
|
|
26
|
+
/** Global error handler */
|
|
27
|
+
onError?: (error: unknown) => void;
|
|
28
|
+
/** Global success handler for mutations */
|
|
29
|
+
onMutationSuccess?: (data: unknown) => void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create optimized QueryClient for Archbase applications
|
|
33
|
+
*/
|
|
34
|
+
export declare function createArchbaseQueryClient(config?: ArchbaseQueryProviderConfig): QueryClient;
|
|
35
|
+
/**
|
|
36
|
+
* ArchbaseQueryProvider Component
|
|
37
|
+
*/
|
|
38
|
+
export interface ArchbaseQueryProviderProps extends ArchbaseQueryProviderConfig {
|
|
39
|
+
children: ReactNode;
|
|
40
|
+
}
|
|
41
|
+
export declare function ArchbaseQueryProvider({ children, queryClient, enableDevTools, ...config }: ArchbaseQueryProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
42
|
+
/**
|
|
43
|
+
* Hook to access the QueryClient
|
|
44
|
+
*/
|
|
45
|
+
export declare function useArchbaseQueryClient(): QueryClient;
|
|
46
|
+
/**
|
|
47
|
+
* Hook for global query states
|
|
48
|
+
*/
|
|
49
|
+
export declare function useArchbaseQueryStates(): {
|
|
50
|
+
stats: {
|
|
51
|
+
total: number;
|
|
52
|
+
loading: number;
|
|
53
|
+
error: number;
|
|
54
|
+
success: number;
|
|
55
|
+
stale: number;
|
|
56
|
+
fresh: number;
|
|
57
|
+
};
|
|
58
|
+
queries: import("@tanstack/react-query").Query<unknown, Error, unknown, readonly unknown[]>[];
|
|
59
|
+
invalidateAll: () => Promise<void>;
|
|
60
|
+
clearAll: () => void;
|
|
61
|
+
refetchAll: () => Promise<void>;
|
|
62
|
+
isOnline: boolean;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Higher-order component for providing QueryClient
|
|
66
|
+
*/
|
|
67
|
+
export declare function withArchbaseQuery<P extends object>(Component: React.ComponentType<P>, config?: ArchbaseQueryProviderConfig): {
|
|
68
|
+
(props: P): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
displayName: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* DevTools component for debugging query state
|
|
73
|
+
*/
|
|
74
|
+
export declare function ArchbaseQueryDebugger(): import("react/jsx-runtime").JSX.Element;
|
|
75
|
+
/**
|
|
76
|
+
* Offline indicator component
|
|
77
|
+
*/
|
|
78
|
+
export declare function ArchbaseOfflineIndicator(): import("react/jsx-runtime").JSX.Element;
|
|
79
|
+
export default ArchbaseQueryProvider;
|