@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.
@@ -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?