@nocios/crudify-ui 1.0.36 → 1.0.38
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/LOGIN_POSIBLES_IMPLEMENTACIONES.md +281 -0
- package/dist/index.js +1136 -4
- package/package.json +52 -49
- package/dist/components/Cascada/index.d.ts +0 -2
- package/dist/components/Cascada/index.js +0 -6
- package/dist/components/HelloWorld/index.d.ts +0 -6
- package/dist/components/HelloWorld/index.js +0 -5
- package/dist/components/PublicPolicies/FieldSelector/FieldSelector.d.ts +0 -15
- package/dist/components/PublicPolicies/FieldSelector/FieldSelector.js +0 -140
- package/dist/components/PublicPolicies/FieldSelector/index.d.ts +0 -1
- package/dist/components/PublicPolicies/FieldSelector/index.js +0 -1
- package/dist/components/PublicPolicies/Policies.d.ts +0 -23
- package/dist/components/PublicPolicies/Policies.js +0 -72
- package/dist/components/PublicPolicies/PolicyItem/PolicyItem.d.ts +0 -21
- package/dist/components/PublicPolicies/PolicyItem/PolicyItem.js +0 -49
- package/dist/components/PublicPolicies/PolicyItem/index.d.ts +0 -1
- package/dist/components/PublicPolicies/PolicyItem/index.js +0 -1
- package/dist/components/PublicPolicies/constants.d.ts +0 -3
- package/dist/components/PublicPolicies/constants.js +0 -7
- package/dist/index.d.ts +0 -5
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
# Análisis: Implementaciones Posibles para Manejo de Usuario Logueado
|
|
2
|
+
|
|
3
|
+
## Contexto Actual
|
|
4
|
+
|
|
5
|
+
Actualmente en `crudia-ui`:
|
|
6
|
+
- **DataProvider**: Maneja token, usuario (del JWT), inicialización de crudify, interceptores de expiración
|
|
7
|
+
- **Token**: Se guarda en secureSessionStorage y se extrae info básica del JWT (email, exp, etc.)
|
|
8
|
+
- **Datos completos del usuario**: Se obtienen con `findUserByEmail()` usando `readItems("users", {filter: {email}})`
|
|
9
|
+
- **Redirección automática**: Al expirar token, redirige a `/login`
|
|
10
|
+
|
|
11
|
+
## Opciones de Implementación
|
|
12
|
+
|
|
13
|
+
### ✅ **OPCIÓN 1: Provider Completo en la Librería (Recomendada)**
|
|
14
|
+
|
|
15
|
+
**Descripción:**
|
|
16
|
+
Crear un `CrudifyAuthProvider` en npm-crudify-ui que maneje completamente la autenticación y datos del usuario.
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
// En npm-crudify-ui
|
|
20
|
+
export const CrudifyAuthProvider = ({
|
|
21
|
+
children,
|
|
22
|
+
onTokenExpired,
|
|
23
|
+
onError,
|
|
24
|
+
config
|
|
25
|
+
}) => {
|
|
26
|
+
// Maneja: token, usuario completo, crudify init, interceptores
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// En crudia-ui
|
|
30
|
+
<CrudifyAuthProvider
|
|
31
|
+
onTokenExpired={() => navigate("/login")}
|
|
32
|
+
config={appConfig}
|
|
33
|
+
>
|
|
34
|
+
<App />
|
|
35
|
+
</CrudifyAuthProvider>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**✅ PROS:**
|
|
39
|
+
- **Reutilización máxima**: Todas las apps usan la misma lógica de auth
|
|
40
|
+
- **Mantenimiento centralizado**: Un solo lugar para bugs de auth
|
|
41
|
+
- **Consistencia**: Mismo comportamiento en todas las apps
|
|
42
|
+
- **Simplicidad**: Apps solo necesitan proveer callbacks
|
|
43
|
+
- **Testing**: Más fácil testear lógica de auth de forma aislada
|
|
44
|
+
- **Menos código**: Apps no duplican lógica de autenticación
|
|
45
|
+
|
|
46
|
+
**❌ CONTRAS:**
|
|
47
|
+
- **Migración inicial**: Hay que actualizar DataProvider existente
|
|
48
|
+
- **Flexibilidad**: Menos control granular en cada app
|
|
49
|
+
- **Dependencias**: Apps dependen más de la librería
|
|
50
|
+
|
|
51
|
+
**📋 IMPLEMENTACIÓN:**
|
|
52
|
+
```
|
|
53
|
+
npm-crudify-ui/
|
|
54
|
+
├── src/
|
|
55
|
+
│ ├── components/
|
|
56
|
+
│ │ ├── CrudifyLogin/
|
|
57
|
+
│ │ └── CrudifyAuthProvider/ # NUEVO
|
|
58
|
+
│ │ ├── index.tsx
|
|
59
|
+
│ │ ├── types.ts
|
|
60
|
+
│ │ ├── hooks/
|
|
61
|
+
│ │ │ ├── useAuth.ts
|
|
62
|
+
│ │ │ ├── useUserProfile.ts
|
|
63
|
+
│ │ │ └── useCrudifyInit.ts
|
|
64
|
+
│ │ └── utils/
|
|
65
|
+
│ │ ├── jwtUtils.ts
|
|
66
|
+
│ │ └── tokenInterceptors.ts
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
### 🔄 **OPCIÓN 2: Hook Compartido**
|
|
72
|
+
|
|
73
|
+
**Descripción:**
|
|
74
|
+
Crear hooks reutilizables pero mantener el Provider en cada app.
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
// En npm-crudify-ui
|
|
78
|
+
export const useAuthToken = (config) => { /* lógica token */ }
|
|
79
|
+
export const useUserProfile = (userEmail) => { /* lógica usuario */ }
|
|
80
|
+
export const useCrudifyInit = (config, token) => { /* lógica init */ }
|
|
81
|
+
|
|
82
|
+
// En crudia-ui (DataProvider se mantiene)
|
|
83
|
+
const DataProvider = ({ children }) => {
|
|
84
|
+
const { token, setToken } = useAuthToken(config)
|
|
85
|
+
const { user } = useUserProfile(userEmail)
|
|
86
|
+
const { isInitialized } = useCrudifyInit(config, token)
|
|
87
|
+
// ...
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**✅ PROS:**
|
|
92
|
+
- **Flexibilidad**: Cada app controla su Provider
|
|
93
|
+
- **Migración gradual**: Se puede migrar por partes
|
|
94
|
+
- **Personalización**: Apps pueden customizar comportamiento
|
|
95
|
+
- **Compatibilidad**: Fácil mantener el DataProvider actual
|
|
96
|
+
|
|
97
|
+
**❌ CONTRAS:**
|
|
98
|
+
- **Duplicación de código**: Cada app necesita su Provider
|
|
99
|
+
- **Inconsistencias**: Apps pueden implementar diferente
|
|
100
|
+
- **Mantenimiento**: Hay que actualizar múltiples lugares
|
|
101
|
+
- **Complejidad**: Apps necesitan conocer la implementación
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
### 🚫 **OPCIÓN 3: Solo Utilidades (No recomendada)**
|
|
106
|
+
|
|
107
|
+
**Descripción:**
|
|
108
|
+
Mover solo funciones utilitarias a la librería.
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
// En npm-crudify-ui
|
|
112
|
+
export const parseJWT = (token) => { /* ... */ }
|
|
113
|
+
export const setupTokenInterceptor = (onExpired) => { /* ... */ }
|
|
114
|
+
export const findUserByEmail = (email) => { /* ... */ }
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**✅ PROS:**
|
|
118
|
+
- **Migración mínima**: Casi no cambia el código existente
|
|
119
|
+
- **Control total**: Apps mantienen control completo
|
|
120
|
+
|
|
121
|
+
**❌ CONTRAS:**
|
|
122
|
+
- **Poca reutilización**: No se simplifica realmente
|
|
123
|
+
- **Duplicación**: Lógica principal sigue duplicada
|
|
124
|
+
- **Mantenimiento**: Sigue siendo complejo mantener
|
|
125
|
+
- **Valor limitado**: No justifica el esfuerzo
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### ⚖️ **OPCIÓN 4: Híbrida (Provider + Hooks)**
|
|
130
|
+
|
|
131
|
+
**Descripción:**
|
|
132
|
+
Provider principal + hooks especializados para casos específicos.
|
|
133
|
+
|
|
134
|
+
```tsx
|
|
135
|
+
// Provider principal
|
|
136
|
+
<CrudifyAuthProvider>
|
|
137
|
+
<App />
|
|
138
|
+
</CrudifyAuthProvider>
|
|
139
|
+
|
|
140
|
+
// Hooks adicionales para casos específicos
|
|
141
|
+
const { refreshUserProfile } = useUserProfile()
|
|
142
|
+
const { extendToken } = useTokenManager()
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**✅ PROS:**
|
|
146
|
+
- **Lo mejor de ambos**: Provider simple + hooks flexibles
|
|
147
|
+
- **Escalabilidad**: Fácil agregar funcionalidades
|
|
148
|
+
- **Gradual**: Se puede implementar por etapas
|
|
149
|
+
|
|
150
|
+
**❌ CONTRAS:**
|
|
151
|
+
- **Complejidad inicial**: Más código para implementar
|
|
152
|
+
- **Decisiones de diseño**: Qué va en Provider vs hooks
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 🎯 **RECOMENDACIÓN: OPCIÓN 1**
|
|
157
|
+
|
|
158
|
+
### **Por qué la Opción 1 es la mejor:**
|
|
159
|
+
|
|
160
|
+
1. **Alineada con el objetivo**: Librería reutilizable y fácil mantenimiento
|
|
161
|
+
2. **Soluciona el problema real**: Evita duplicar DataProvider en cada app
|
|
162
|
+
3. **Escalable**: Nuevas apps solo importan el provider
|
|
163
|
+
4. **Mantenible**: Un solo lugar para arreglar bugs de auth
|
|
164
|
+
5. **React best practices**: Providers son el patrón estándar para estado global
|
|
165
|
+
|
|
166
|
+
### **Plan de Migración:**
|
|
167
|
+
|
|
168
|
+
#### **Fase 1: Crear CrudifyAuthProvider en la librería**
|
|
169
|
+
```tsx
|
|
170
|
+
// npm-crudify-ui/src/components/CrudifyAuthProvider/
|
|
171
|
+
export interface CrudifyAuthConfig {
|
|
172
|
+
publicApiKey?: string
|
|
173
|
+
env?: 'dev' | 'stg' | 'prod'
|
|
174
|
+
onTokenExpired?: () => void
|
|
175
|
+
onAuthError?: (error: string) => void
|
|
176
|
+
autoLoginWithSubdomain?: boolean
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export const CrudifyAuthProvider: React.FC<{
|
|
180
|
+
children: React.ReactNode
|
|
181
|
+
config: CrudifyAuthConfig
|
|
182
|
+
}>
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
#### **Fase 2: Migrar crudia-ui**
|
|
186
|
+
```tsx
|
|
187
|
+
// Reemplazar DataProvider con:
|
|
188
|
+
<CrudifyAuthProvider
|
|
189
|
+
config={{
|
|
190
|
+
onTokenExpired: () => navigate("/login"),
|
|
191
|
+
onAuthError: (error) => showNotification(error, "error")
|
|
192
|
+
}}
|
|
193
|
+
>
|
|
194
|
+
{children}
|
|
195
|
+
</CrudifyAuthProvider>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
#### **Fase 3: Otras apps usan el mismo provider**
|
|
199
|
+
```tsx
|
|
200
|
+
// En nuevas apps:
|
|
201
|
+
<CrudifyAuthProvider config={appSpecificConfig}>
|
|
202
|
+
<MyApp />
|
|
203
|
+
</CrudifyAuthProvider>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### **Beneficios a Largo Plazo:**
|
|
207
|
+
|
|
208
|
+
- 🚀 **Nuevas apps**: Se implementan en minutos, no horas
|
|
209
|
+
- 🔧 **Bugs de auth**: Se arreglan una vez, se aplican a todas las apps
|
|
210
|
+
- 📚 **Consistencia**: Misma UX de autenticación en todo el ecosistema
|
|
211
|
+
- 🧪 **Testing**: Lógica de auth se puede testear de forma aislada
|
|
212
|
+
- 📖 **Documentación**: Un solo provider para documentar
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 🚀 **Implementación Sugerida**
|
|
217
|
+
|
|
218
|
+
### **Estructura del CrudifyAuthProvider:**
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
interface CrudifyAuthContextValue {
|
|
222
|
+
// Estado básico
|
|
223
|
+
token: string | null
|
|
224
|
+
user: any | null
|
|
225
|
+
userProfile: any | null
|
|
226
|
+
isAuthenticated: boolean
|
|
227
|
+
isInitialized: boolean
|
|
228
|
+
|
|
229
|
+
// Métodos
|
|
230
|
+
login: (username: string, password: string) => Promise<LoginResponse>
|
|
231
|
+
loginWithSubdomain: (username: string, password: string, subdomain: string) => Promise<LoginResponse>
|
|
232
|
+
logout: () => void
|
|
233
|
+
refreshUserProfile: () => Promise<void>
|
|
234
|
+
|
|
235
|
+
// Estados de carga
|
|
236
|
+
loginLoading: boolean
|
|
237
|
+
profileLoading: boolean
|
|
238
|
+
initLoading: boolean
|
|
239
|
+
|
|
240
|
+
// Errores
|
|
241
|
+
authError: string | null
|
|
242
|
+
profileError: string | null
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### **Uso en las apps:**
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
// crudia-ui/src/App.tsx
|
|
250
|
+
<CrudifyAuthProvider
|
|
251
|
+
config={{
|
|
252
|
+
publicApiKey: appConfig.publicApiKey,
|
|
253
|
+
env: appConfig.env,
|
|
254
|
+
onTokenExpired: () => navigate("/login"),
|
|
255
|
+
onAuthError: (error) => showNotification(error, "error"),
|
|
256
|
+
autoReadFromCookies: true
|
|
257
|
+
}}
|
|
258
|
+
>
|
|
259
|
+
<Router>
|
|
260
|
+
<Routes>
|
|
261
|
+
<Route path="/login" element={<CrudifyLogin />} />
|
|
262
|
+
<Route path="/*" element={<ProtectedRoutes />} />
|
|
263
|
+
</Routes>
|
|
264
|
+
</Router>
|
|
265
|
+
</CrudifyAuthProvider>
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### **Hook de uso:**
|
|
269
|
+
|
|
270
|
+
```tsx
|
|
271
|
+
// En cualquier componente
|
|
272
|
+
const { user, userProfile, logout, refreshUserProfile } = useAuth()
|
|
273
|
+
|
|
274
|
+
// Usuario básico (del JWT)
|
|
275
|
+
console.log(user.email, user.exp)
|
|
276
|
+
|
|
277
|
+
// Usuario completo (de la DB)
|
|
278
|
+
console.log(userProfile.firstName, userProfile.preferences)
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
¿Te parece bien esta propuesta? ¿Quieres que proceda con la implementación de la Opción 1?
|