forlogic-core 1.9.0 → 1.9.2
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 +217 -10
- package/dist/README.md +217 -10
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2071,41 +2071,248 @@ const { service } = createSimpleService({
|
|
|
2071
2071
|
✅ **Type-safe**: TypeScript valida configurações
|
|
2072
2072
|
✅ **Retrocompatível**: Projetos antigos continuam funcionando
|
|
2073
2073
|
|
|
2074
|
-
#### **Hook useQualiexUsers - Controle Explícito**
|
|
2074
|
+
#### **Hook useQualiexUsers - ⚠️ Controle Explícito Obrigatório**
|
|
2075
2075
|
|
|
2076
|
-
|
|
2076
|
+
**IMPORTANTE:** O hook `useQualiexUsers` tem **`enabled: false` como padrão**. Você **DEVE** passar `enabled: true` explicitamente para buscar usuários.
|
|
2077
|
+
|
|
2078
|
+
##### **Por Que enabled é false por Padrão?**
|
|
2079
|
+
|
|
2080
|
+
1. ✅ **Performance**: Evita chamadas automáticas desnecessárias à API Qualiex
|
|
2081
|
+
2. ✅ **Controle**: Desenvolvedor decide QUANDO buscar dados
|
|
2082
|
+
3. ✅ **Otimização**: Modais/tabs só buscam quando abertos
|
|
2083
|
+
4. ✅ **Lazy Loading**: Permite controle manual com `refetch()`
|
|
2084
|
+
|
|
2085
|
+
##### **Uso Básico**
|
|
2077
2086
|
|
|
2078
2087
|
```typescript
|
|
2079
2088
|
import { useQualiexUsers } from 'forlogic-core';
|
|
2080
2089
|
|
|
2081
|
-
// ✅ CORRETO
|
|
2082
|
-
const { data: users = [] } = useQualiexUsers({ enabled: true });
|
|
2090
|
+
// ✅ CORRETO - Busca ativa
|
|
2091
|
+
const { data: users = [], isLoading } = useQualiexUsers({ enabled: true });
|
|
2092
|
+
|
|
2093
|
+
// ✅ CORRETO - Busca condicional (modal)
|
|
2094
|
+
const { data: users = [] } = useQualiexUsers({ enabled: isModalOpen });
|
|
2083
2095
|
|
|
2084
|
-
// ✅ CORRETO
|
|
2096
|
+
// ✅ CORRETO - Lazy loading (controle manual)
|
|
2085
2097
|
const { data: users = [], refetch } = useQualiexUsers({ enabled: false });
|
|
2086
|
-
//
|
|
2098
|
+
// Chamar refetch() quando necessário:
|
|
2087
2099
|
await refetch();
|
|
2100
|
+
|
|
2101
|
+
// ❌ ERRADO - Retorna [] sempre! (enabled = false por padrão)
|
|
2102
|
+
const { data: users = [] } = useQualiexUsers();
|
|
2088
2103
|
```
|
|
2089
2104
|
|
|
2090
|
-
|
|
2105
|
+
##### **Parâmetros**
|
|
2106
|
+
|
|
2107
|
+
| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|
|
2108
|
+
|-----------|------|-------------|--------|-----------|
|
|
2109
|
+
| `enabled` | `boolean` | Sim* | `false` | Controla se a query executa |
|
|
2110
|
+
|
|
2111
|
+
*Tecnicamente opcional, mas **obrigatório na prática** para que a query funcione.
|
|
2112
|
+
|
|
2113
|
+
##### **Retorno**
|
|
2114
|
+
|
|
2115
|
+
| Propriedade | Tipo | Descrição |
|
|
2116
|
+
|-------------|------|-----------|
|
|
2117
|
+
| `data` | `QualiexUser[]` | Array de usuários (vazio se `enabled: false`) |
|
|
2118
|
+
| `isLoading` | `boolean` | Estado de carregamento |
|
|
2119
|
+
| `error` | `Error \| null` | Erro da API (se houver) |
|
|
2120
|
+
| `refetch` | `() => Promise<...>` | Função para rebuscar manualmente |
|
|
2121
|
+
|
|
2122
|
+
##### **Quando Usar Cada Modo**
|
|
2123
|
+
|
|
2124
|
+
| Cenário | Configuração | Exemplo |
|
|
2125
|
+
|---------|-------------|---------|
|
|
2126
|
+
| **Lista sempre visível** | `{ enabled: true }` | Tabela de funcionários |
|
|
2127
|
+
| **Modal/Dialog** | `{ enabled: isOpen }` | Form de criar liderança |
|
|
2128
|
+
| **Tab/Accordion** | `{ enabled: isTabActive }` | Tabs de configuração |
|
|
2129
|
+
| **Botão de importação** | `{ enabled: false }` + `refetch()` | Import do Qualiex |
|
|
2130
|
+
| **Conditional render** | `{ enabled: shouldLoad }` | Baseado em lógica customizada |
|
|
2131
|
+
|
|
2132
|
+
##### **Exemplos Completos**
|
|
2133
|
+
|
|
2134
|
+
###### **Exemplo 1: Lista Sempre Visível**
|
|
2135
|
+
|
|
2136
|
+
```typescript
|
|
2137
|
+
function EmployeesList() {
|
|
2138
|
+
const { data: users = [], isLoading } = useQualiexUsers({
|
|
2139
|
+
enabled: true
|
|
2140
|
+
});
|
|
2141
|
+
|
|
2142
|
+
if (isLoading) return <Skeleton />;
|
|
2143
|
+
|
|
2144
|
+
return (
|
|
2145
|
+
<ul>
|
|
2146
|
+
{users.map(user => (
|
|
2147
|
+
<li key={user.userId}>{user.userName}</li>
|
|
2148
|
+
))}
|
|
2149
|
+
</ul>
|
|
2150
|
+
);
|
|
2151
|
+
}
|
|
2152
|
+
```
|
|
2153
|
+
|
|
2154
|
+
###### **Exemplo 2: Modal Condicional**
|
|
2155
|
+
|
|
2156
|
+
```typescript
|
|
2157
|
+
function LeadershipDialog({ isOpen }: { isOpen: boolean }) {
|
|
2158
|
+
// Só busca quando modal aberto
|
|
2159
|
+
const { data: users = [], isLoading } = useQualiexUsers({
|
|
2160
|
+
enabled: isOpen
|
|
2161
|
+
});
|
|
2162
|
+
|
|
2163
|
+
if (!isOpen) return null;
|
|
2164
|
+
if (isLoading) return <Skeleton />;
|
|
2165
|
+
|
|
2166
|
+
return (
|
|
2167
|
+
<Dialog open={isOpen}>
|
|
2168
|
+
<Select>
|
|
2169
|
+
{users.map(user => (
|
|
2170
|
+
<SelectItem key={user.userId} value={user.userId}>
|
|
2171
|
+
{user.userName}
|
|
2172
|
+
</SelectItem>
|
|
2173
|
+
))}
|
|
2174
|
+
</Select>
|
|
2175
|
+
</Dialog>
|
|
2176
|
+
);
|
|
2177
|
+
}
|
|
2178
|
+
```
|
|
2179
|
+
|
|
2180
|
+
###### **Exemplo 3: Lazy Loading (Botão de Importação)**
|
|
2091
2181
|
|
|
2092
2182
|
```typescript
|
|
2093
2183
|
function ImportQualiexButton() {
|
|
2094
2184
|
// Não busca automaticamente
|
|
2095
|
-
const { data:
|
|
2185
|
+
const { data: users = [], refetch, isLoading } = useQualiexUsers({
|
|
2096
2186
|
enabled: false
|
|
2097
2187
|
});
|
|
2098
2188
|
|
|
2099
2189
|
const handleImport = async () => {
|
|
2100
2190
|
// Busca apenas quando usuário clica
|
|
2101
2191
|
const { data } = await refetch();
|
|
2102
|
-
|
|
2192
|
+
|
|
2193
|
+
if (data && data.length > 0) {
|
|
2194
|
+
console.log(`Importando ${data.length} usuários`);
|
|
2195
|
+
// Processar importação...
|
|
2196
|
+
}
|
|
2197
|
+
};
|
|
2198
|
+
|
|
2199
|
+
return (
|
|
2200
|
+
<Button onClick={handleImport} disabled={isLoading}>
|
|
2201
|
+
{isLoading ? 'Importando...' : 'Importar do Qualiex'}
|
|
2202
|
+
</Button>
|
|
2203
|
+
);
|
|
2204
|
+
}
|
|
2205
|
+
```
|
|
2206
|
+
|
|
2207
|
+
###### **Exemplo 4: Hook Personalizado (useUsersMap)**
|
|
2208
|
+
|
|
2209
|
+
```typescript
|
|
2210
|
+
// src/shared/hooks/useUsersMap.ts
|
|
2211
|
+
import { useMemo } from 'react';
|
|
2212
|
+
import { useQualiexUsers } from 'forlogic-core';
|
|
2213
|
+
|
|
2214
|
+
export const useUsersMap = () => {
|
|
2215
|
+
// ✅ Ativa query para buscar usuários
|
|
2216
|
+
const { data: usersData = [], isLoading, error } = useQualiexUsers({
|
|
2217
|
+
enabled: true
|
|
2218
|
+
});
|
|
2219
|
+
|
|
2220
|
+
const usersMap = useMemo(() => {
|
|
2221
|
+
const map = new Map();
|
|
2222
|
+
usersData.forEach(user => {
|
|
2223
|
+
map.set(user.userId, user);
|
|
2224
|
+
});
|
|
2225
|
+
return map;
|
|
2226
|
+
}, [usersData]);
|
|
2227
|
+
|
|
2228
|
+
return {
|
|
2229
|
+
usersMap,
|
|
2230
|
+
usersData,
|
|
2231
|
+
isLoading,
|
|
2232
|
+
error
|
|
2103
2233
|
};
|
|
2234
|
+
};
|
|
2104
2235
|
|
|
2105
|
-
|
|
2236
|
+
// Uso em componente:
|
|
2237
|
+
function SomeComponent() {
|
|
2238
|
+
const { usersMap, isLoading } = useUsersMap();
|
|
2239
|
+
|
|
2240
|
+
if (isLoading) return <Skeleton />;
|
|
2241
|
+
|
|
2242
|
+
const user = usersMap.get('some-user-id');
|
|
2243
|
+
return <div>{user?.userName}</div>;
|
|
2106
2244
|
}
|
|
2107
2245
|
```
|
|
2108
2246
|
|
|
2247
|
+
##### **Tratamento de Erros**
|
|
2248
|
+
|
|
2249
|
+
```typescript
|
|
2250
|
+
const { data: users = [], isLoading, error } = useQualiexUsers({
|
|
2251
|
+
enabled: true
|
|
2252
|
+
});
|
|
2253
|
+
|
|
2254
|
+
if (error) {
|
|
2255
|
+
console.error('Erro ao buscar usuários Qualiex:', error);
|
|
2256
|
+
return (
|
|
2257
|
+
<Alert variant="destructive">
|
|
2258
|
+
Erro ao carregar usuários. Tente novamente.
|
|
2259
|
+
</Alert>
|
|
2260
|
+
);
|
|
2261
|
+
}
|
|
2262
|
+
|
|
2263
|
+
if (isLoading) return <Skeleton />;
|
|
2264
|
+
```
|
|
2265
|
+
|
|
2266
|
+
##### **Boas Práticas**
|
|
2267
|
+
|
|
2268
|
+
✅ **SEMPRE** especifique `enabled` explicitamente
|
|
2269
|
+
✅ **SEMPRE** desestruture `isLoading` e trate estados de loading
|
|
2270
|
+
✅ **SEMPRE** trate erros com `error`
|
|
2271
|
+
✅ **USE** `enabled: isOpen` em modais para evitar chamadas desnecessárias
|
|
2272
|
+
✅ **USE** `enabled: false` + `refetch()` para lazy loading
|
|
2273
|
+
|
|
2274
|
+
❌ **NUNCA** confie no padrão (`enabled: false`)
|
|
2275
|
+
❌ **EVITE** `enabled: true` em componentes que nem sempre estão visíveis
|
|
2276
|
+
❌ **EVITE** esquecer de tratar `isLoading` (causa UI vazia temporária)
|
|
2277
|
+
|
|
2278
|
+
##### **Troubleshooting**
|
|
2279
|
+
|
|
2280
|
+
**Problema:** Lista de usuários sempre vazia
|
|
2281
|
+
|
|
2282
|
+
```typescript
|
|
2283
|
+
// ❌ ERRADO
|
|
2284
|
+
const { data: users = [] } = useQualiexUsers();
|
|
2285
|
+
console.log(users); // []
|
|
2286
|
+
|
|
2287
|
+
// ✅ SOLUÇÃO
|
|
2288
|
+
const { data: users = [] } = useQualiexUsers({ enabled: true });
|
|
2289
|
+
console.log(users); // [{ userId: "123", userName: "João", ... }]
|
|
2290
|
+
```
|
|
2291
|
+
|
|
2292
|
+
**Problema:** Modal mostra usuários mesmo fechado (performance)
|
|
2293
|
+
|
|
2294
|
+
```typescript
|
|
2295
|
+
// ❌ ERRADO - Busca mesmo se modal fechado
|
|
2296
|
+
const { data: users } = useQualiexUsers({ enabled: true });
|
|
2297
|
+
|
|
2298
|
+
// ✅ SOLUÇÃO - Só busca se modal aberto
|
|
2299
|
+
const { data: users } = useQualiexUsers({ enabled: isModalOpen });
|
|
2300
|
+
```
|
|
2301
|
+
|
|
2302
|
+
##### **Características Técnicas**
|
|
2303
|
+
|
|
2304
|
+
✅ **Cache inteligente**: Usuários são cacheados por query key (`['qualiex-users', alias]`)
|
|
2305
|
+
✅ **Retry automático**: 2 tentativas com delay de 1s
|
|
2306
|
+
✅ **Auth automático**: Usa `useAuth()` internamente (não precisa passar `alias`)
|
|
2307
|
+
✅ **Type-safe**: Totalmente tipado com TypeScript
|
|
2308
|
+
✅ **React Query**: Baseado em `@tanstack/react-query`
|
|
2309
|
+
|
|
2310
|
+
##### **Ver Também**
|
|
2311
|
+
|
|
2312
|
+
- 📖 **Migration Guide**: [MIGRATION.md - Seção 8 (useQualiexUsers)](MIGRATION.md#8️⃣-hook-usequaliexusers---breaking-change-)
|
|
2313
|
+
- 📖 **Qualiex Enrichment**: [README.md - Seção Qualiex](#enrichment-automático-de-dados-de-usuários-qualiex)
|
|
2314
|
+
- 🔧 **QualiexUserField Component**: [README.md - QualiexUserField](#qualiexuserfield-componente)
|
|
2315
|
+
|
|
2109
2316
|
#### **Boas Práticas**
|
|
2110
2317
|
|
|
2111
2318
|
✅ **BOM**: Ativar enrichment apenas onde necessário
|
package/dist/README.md
CHANGED
|
@@ -2071,41 +2071,248 @@ const { service } = createSimpleService({
|
|
|
2071
2071
|
✅ **Type-safe**: TypeScript valida configurações
|
|
2072
2072
|
✅ **Retrocompatível**: Projetos antigos continuam funcionando
|
|
2073
2073
|
|
|
2074
|
-
#### **Hook useQualiexUsers - Controle Explícito**
|
|
2074
|
+
#### **Hook useQualiexUsers - ⚠️ Controle Explícito Obrigatório**
|
|
2075
2075
|
|
|
2076
|
-
|
|
2076
|
+
**IMPORTANTE:** O hook `useQualiexUsers` tem **`enabled: false` como padrão**. Você **DEVE** passar `enabled: true` explicitamente para buscar usuários.
|
|
2077
|
+
|
|
2078
|
+
##### **Por Que enabled é false por Padrão?**
|
|
2079
|
+
|
|
2080
|
+
1. ✅ **Performance**: Evita chamadas automáticas desnecessárias à API Qualiex
|
|
2081
|
+
2. ✅ **Controle**: Desenvolvedor decide QUANDO buscar dados
|
|
2082
|
+
3. ✅ **Otimização**: Modais/tabs só buscam quando abertos
|
|
2083
|
+
4. ✅ **Lazy Loading**: Permite controle manual com `refetch()`
|
|
2084
|
+
|
|
2085
|
+
##### **Uso Básico**
|
|
2077
2086
|
|
|
2078
2087
|
```typescript
|
|
2079
2088
|
import { useQualiexUsers } from 'forlogic-core';
|
|
2080
2089
|
|
|
2081
|
-
// ✅ CORRETO
|
|
2082
|
-
const { data: users = [] } = useQualiexUsers({ enabled: true });
|
|
2090
|
+
// ✅ CORRETO - Busca ativa
|
|
2091
|
+
const { data: users = [], isLoading } = useQualiexUsers({ enabled: true });
|
|
2092
|
+
|
|
2093
|
+
// ✅ CORRETO - Busca condicional (modal)
|
|
2094
|
+
const { data: users = [] } = useQualiexUsers({ enabled: isModalOpen });
|
|
2083
2095
|
|
|
2084
|
-
// ✅ CORRETO
|
|
2096
|
+
// ✅ CORRETO - Lazy loading (controle manual)
|
|
2085
2097
|
const { data: users = [], refetch } = useQualiexUsers({ enabled: false });
|
|
2086
|
-
//
|
|
2098
|
+
// Chamar refetch() quando necessário:
|
|
2087
2099
|
await refetch();
|
|
2100
|
+
|
|
2101
|
+
// ❌ ERRADO - Retorna [] sempre! (enabled = false por padrão)
|
|
2102
|
+
const { data: users = [] } = useQualiexUsers();
|
|
2088
2103
|
```
|
|
2089
2104
|
|
|
2090
|
-
|
|
2105
|
+
##### **Parâmetros**
|
|
2106
|
+
|
|
2107
|
+
| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|
|
2108
|
+
|-----------|------|-------------|--------|-----------|
|
|
2109
|
+
| `enabled` | `boolean` | Sim* | `false` | Controla se a query executa |
|
|
2110
|
+
|
|
2111
|
+
*Tecnicamente opcional, mas **obrigatório na prática** para que a query funcione.
|
|
2112
|
+
|
|
2113
|
+
##### **Retorno**
|
|
2114
|
+
|
|
2115
|
+
| Propriedade | Tipo | Descrição |
|
|
2116
|
+
|-------------|------|-----------|
|
|
2117
|
+
| `data` | `QualiexUser[]` | Array de usuários (vazio se `enabled: false`) |
|
|
2118
|
+
| `isLoading` | `boolean` | Estado de carregamento |
|
|
2119
|
+
| `error` | `Error \| null` | Erro da API (se houver) |
|
|
2120
|
+
| `refetch` | `() => Promise<...>` | Função para rebuscar manualmente |
|
|
2121
|
+
|
|
2122
|
+
##### **Quando Usar Cada Modo**
|
|
2123
|
+
|
|
2124
|
+
| Cenário | Configuração | Exemplo |
|
|
2125
|
+
|---------|-------------|---------|
|
|
2126
|
+
| **Lista sempre visível** | `{ enabled: true }` | Tabela de funcionários |
|
|
2127
|
+
| **Modal/Dialog** | `{ enabled: isOpen }` | Form de criar liderança |
|
|
2128
|
+
| **Tab/Accordion** | `{ enabled: isTabActive }` | Tabs de configuração |
|
|
2129
|
+
| **Botão de importação** | `{ enabled: false }` + `refetch()` | Import do Qualiex |
|
|
2130
|
+
| **Conditional render** | `{ enabled: shouldLoad }` | Baseado em lógica customizada |
|
|
2131
|
+
|
|
2132
|
+
##### **Exemplos Completos**
|
|
2133
|
+
|
|
2134
|
+
###### **Exemplo 1: Lista Sempre Visível**
|
|
2135
|
+
|
|
2136
|
+
```typescript
|
|
2137
|
+
function EmployeesList() {
|
|
2138
|
+
const { data: users = [], isLoading } = useQualiexUsers({
|
|
2139
|
+
enabled: true
|
|
2140
|
+
});
|
|
2141
|
+
|
|
2142
|
+
if (isLoading) return <Skeleton />;
|
|
2143
|
+
|
|
2144
|
+
return (
|
|
2145
|
+
<ul>
|
|
2146
|
+
{users.map(user => (
|
|
2147
|
+
<li key={user.userId}>{user.userName}</li>
|
|
2148
|
+
))}
|
|
2149
|
+
</ul>
|
|
2150
|
+
);
|
|
2151
|
+
}
|
|
2152
|
+
```
|
|
2153
|
+
|
|
2154
|
+
###### **Exemplo 2: Modal Condicional**
|
|
2155
|
+
|
|
2156
|
+
```typescript
|
|
2157
|
+
function LeadershipDialog({ isOpen }: { isOpen: boolean }) {
|
|
2158
|
+
// Só busca quando modal aberto
|
|
2159
|
+
const { data: users = [], isLoading } = useQualiexUsers({
|
|
2160
|
+
enabled: isOpen
|
|
2161
|
+
});
|
|
2162
|
+
|
|
2163
|
+
if (!isOpen) return null;
|
|
2164
|
+
if (isLoading) return <Skeleton />;
|
|
2165
|
+
|
|
2166
|
+
return (
|
|
2167
|
+
<Dialog open={isOpen}>
|
|
2168
|
+
<Select>
|
|
2169
|
+
{users.map(user => (
|
|
2170
|
+
<SelectItem key={user.userId} value={user.userId}>
|
|
2171
|
+
{user.userName}
|
|
2172
|
+
</SelectItem>
|
|
2173
|
+
))}
|
|
2174
|
+
</Select>
|
|
2175
|
+
</Dialog>
|
|
2176
|
+
);
|
|
2177
|
+
}
|
|
2178
|
+
```
|
|
2179
|
+
|
|
2180
|
+
###### **Exemplo 3: Lazy Loading (Botão de Importação)**
|
|
2091
2181
|
|
|
2092
2182
|
```typescript
|
|
2093
2183
|
function ImportQualiexButton() {
|
|
2094
2184
|
// Não busca automaticamente
|
|
2095
|
-
const { data:
|
|
2185
|
+
const { data: users = [], refetch, isLoading } = useQualiexUsers({
|
|
2096
2186
|
enabled: false
|
|
2097
2187
|
});
|
|
2098
2188
|
|
|
2099
2189
|
const handleImport = async () => {
|
|
2100
2190
|
// Busca apenas quando usuário clica
|
|
2101
2191
|
const { data } = await refetch();
|
|
2102
|
-
|
|
2192
|
+
|
|
2193
|
+
if (data && data.length > 0) {
|
|
2194
|
+
console.log(`Importando ${data.length} usuários`);
|
|
2195
|
+
// Processar importação...
|
|
2196
|
+
}
|
|
2197
|
+
};
|
|
2198
|
+
|
|
2199
|
+
return (
|
|
2200
|
+
<Button onClick={handleImport} disabled={isLoading}>
|
|
2201
|
+
{isLoading ? 'Importando...' : 'Importar do Qualiex'}
|
|
2202
|
+
</Button>
|
|
2203
|
+
);
|
|
2204
|
+
}
|
|
2205
|
+
```
|
|
2206
|
+
|
|
2207
|
+
###### **Exemplo 4: Hook Personalizado (useUsersMap)**
|
|
2208
|
+
|
|
2209
|
+
```typescript
|
|
2210
|
+
// src/shared/hooks/useUsersMap.ts
|
|
2211
|
+
import { useMemo } from 'react';
|
|
2212
|
+
import { useQualiexUsers } from 'forlogic-core';
|
|
2213
|
+
|
|
2214
|
+
export const useUsersMap = () => {
|
|
2215
|
+
// ✅ Ativa query para buscar usuários
|
|
2216
|
+
const { data: usersData = [], isLoading, error } = useQualiexUsers({
|
|
2217
|
+
enabled: true
|
|
2218
|
+
});
|
|
2219
|
+
|
|
2220
|
+
const usersMap = useMemo(() => {
|
|
2221
|
+
const map = new Map();
|
|
2222
|
+
usersData.forEach(user => {
|
|
2223
|
+
map.set(user.userId, user);
|
|
2224
|
+
});
|
|
2225
|
+
return map;
|
|
2226
|
+
}, [usersData]);
|
|
2227
|
+
|
|
2228
|
+
return {
|
|
2229
|
+
usersMap,
|
|
2230
|
+
usersData,
|
|
2231
|
+
isLoading,
|
|
2232
|
+
error
|
|
2103
2233
|
};
|
|
2234
|
+
};
|
|
2104
2235
|
|
|
2105
|
-
|
|
2236
|
+
// Uso em componente:
|
|
2237
|
+
function SomeComponent() {
|
|
2238
|
+
const { usersMap, isLoading } = useUsersMap();
|
|
2239
|
+
|
|
2240
|
+
if (isLoading) return <Skeleton />;
|
|
2241
|
+
|
|
2242
|
+
const user = usersMap.get('some-user-id');
|
|
2243
|
+
return <div>{user?.userName}</div>;
|
|
2106
2244
|
}
|
|
2107
2245
|
```
|
|
2108
2246
|
|
|
2247
|
+
##### **Tratamento de Erros**
|
|
2248
|
+
|
|
2249
|
+
```typescript
|
|
2250
|
+
const { data: users = [], isLoading, error } = useQualiexUsers({
|
|
2251
|
+
enabled: true
|
|
2252
|
+
});
|
|
2253
|
+
|
|
2254
|
+
if (error) {
|
|
2255
|
+
console.error('Erro ao buscar usuários Qualiex:', error);
|
|
2256
|
+
return (
|
|
2257
|
+
<Alert variant="destructive">
|
|
2258
|
+
Erro ao carregar usuários. Tente novamente.
|
|
2259
|
+
</Alert>
|
|
2260
|
+
);
|
|
2261
|
+
}
|
|
2262
|
+
|
|
2263
|
+
if (isLoading) return <Skeleton />;
|
|
2264
|
+
```
|
|
2265
|
+
|
|
2266
|
+
##### **Boas Práticas**
|
|
2267
|
+
|
|
2268
|
+
✅ **SEMPRE** especifique `enabled` explicitamente
|
|
2269
|
+
✅ **SEMPRE** desestruture `isLoading` e trate estados de loading
|
|
2270
|
+
✅ **SEMPRE** trate erros com `error`
|
|
2271
|
+
✅ **USE** `enabled: isOpen` em modais para evitar chamadas desnecessárias
|
|
2272
|
+
✅ **USE** `enabled: false` + `refetch()` para lazy loading
|
|
2273
|
+
|
|
2274
|
+
❌ **NUNCA** confie no padrão (`enabled: false`)
|
|
2275
|
+
❌ **EVITE** `enabled: true` em componentes que nem sempre estão visíveis
|
|
2276
|
+
❌ **EVITE** esquecer de tratar `isLoading` (causa UI vazia temporária)
|
|
2277
|
+
|
|
2278
|
+
##### **Troubleshooting**
|
|
2279
|
+
|
|
2280
|
+
**Problema:** Lista de usuários sempre vazia
|
|
2281
|
+
|
|
2282
|
+
```typescript
|
|
2283
|
+
// ❌ ERRADO
|
|
2284
|
+
const { data: users = [] } = useQualiexUsers();
|
|
2285
|
+
console.log(users); // []
|
|
2286
|
+
|
|
2287
|
+
// ✅ SOLUÇÃO
|
|
2288
|
+
const { data: users = [] } = useQualiexUsers({ enabled: true });
|
|
2289
|
+
console.log(users); // [{ userId: "123", userName: "João", ... }]
|
|
2290
|
+
```
|
|
2291
|
+
|
|
2292
|
+
**Problema:** Modal mostra usuários mesmo fechado (performance)
|
|
2293
|
+
|
|
2294
|
+
```typescript
|
|
2295
|
+
// ❌ ERRADO - Busca mesmo se modal fechado
|
|
2296
|
+
const { data: users } = useQualiexUsers({ enabled: true });
|
|
2297
|
+
|
|
2298
|
+
// ✅ SOLUÇÃO - Só busca se modal aberto
|
|
2299
|
+
const { data: users } = useQualiexUsers({ enabled: isModalOpen });
|
|
2300
|
+
```
|
|
2301
|
+
|
|
2302
|
+
##### **Características Técnicas**
|
|
2303
|
+
|
|
2304
|
+
✅ **Cache inteligente**: Usuários são cacheados por query key (`['qualiex-users', alias]`)
|
|
2305
|
+
✅ **Retry automático**: 2 tentativas com delay de 1s
|
|
2306
|
+
✅ **Auth automático**: Usa `useAuth()` internamente (não precisa passar `alias`)
|
|
2307
|
+
✅ **Type-safe**: Totalmente tipado com TypeScript
|
|
2308
|
+
✅ **React Query**: Baseado em `@tanstack/react-query`
|
|
2309
|
+
|
|
2310
|
+
##### **Ver Também**
|
|
2311
|
+
|
|
2312
|
+
- 📖 **Migration Guide**: [MIGRATION.md - Seção 8 (useQualiexUsers)](MIGRATION.md#8️⃣-hook-usequaliexusers---breaking-change-)
|
|
2313
|
+
- 📖 **Qualiex Enrichment**: [README.md - Seção Qualiex](#enrichment-automático-de-dados-de-usuários-qualiex)
|
|
2314
|
+
- 🔧 **QualiexUserField Component**: [README.md - QualiexUserField](#qualiexuserfield-componente)
|
|
2315
|
+
|
|
2109
2316
|
#### **Boas Práticas**
|
|
2110
2317
|
|
|
2111
2318
|
✅ **BOM**: Ativar enrichment apenas onde necessário
|