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 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
- Para buscar usuários do Qualiex em componentes, use `enabled: true` explicitamente:
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: Busca ativa quando enabled=true
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: Busca sob demanda com refetch
2096
+ // ✅ CORRETO - Lazy loading (controle manual)
2085
2097
  const { data: users = [], refetch } = useQualiexUsers({ enabled: false });
2086
- // Depois, quando necessário:
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
- **Exemplo: Importação de Qualiex**
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: qualiexUsers = [], refetch, isLoading } = useQualiexUsers({
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
- // Processar data...
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
- return <Button onClick={handleImport}>Importar do Qualiex</Button>;
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
- Para buscar usuários do Qualiex em componentes, use `enabled: true` explicitamente:
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: Busca ativa quando enabled=true
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: Busca sob demanda com refetch
2096
+ // ✅ CORRETO - Lazy loading (controle manual)
2085
2097
  const { data: users = [], refetch } = useQualiexUsers({ enabled: false });
2086
- // Depois, quando necessário:
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
- **Exemplo: Importação de Qualiex**
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: qualiexUsers = [], refetch, isLoading } = useQualiexUsers({
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
- // Processar data...
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
- return <Button onClick={handleImport}>Importar do Qualiex</Button>;
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