@@ -30,6 +30,105 @@ interface AuthContextValue {
3030 homeForProfile : ( p : Profile | null ) => '/admin' | '/operaciones' | '/dashboard' | '/academia/dashboard' | '/login' ;
3131}
3232
33+ export const LOCAL_MOCK_ADMIN : Profile = {
34+ id : '16092a90-3e8e-466d-a509-eb6b074a92cd' ,
35+ codigo_distribuidor : 'SUMAK-00001' ,
36+ username : 'admin' ,
37+ nombre_completo : 'Administrador Sumak' ,
38+ cedula : '0999999999' ,
39+ email : 'admin@sumak.com' ,
40+ telefono : '0988447019' ,
41+ direccion : 'Oficina Central Sumak' ,
42+ ciudad : 'Babahoyo' ,
43+ codigo_patrocinador : null ,
44+ patrocinador_id : null ,
45+ paquete : 'lider' ,
46+ puntos : 9999 ,
47+ estado : 'activo' ,
48+ rol : 'admin' ,
49+ avatar_url : null ,
50+ fecha_registro : '2026-01-01T00:00:00Z' ,
51+ fecha_aprobacion : '2026-01-01T00:00:00Z' ,
52+ has_completed_onboarding : true ,
53+ } ;
54+
55+ export const LOCAL_MOCK_ADMIN_USER : User = {
56+ id : '16092a90-3e8e-466d-a509-eb6b074a92cd' ,
57+ app_metadata : { } ,
58+ user_metadata : {
59+ nombre : 'Administrador Sumak' ,
60+ rol : 'admin' ,
61+ } ,
62+ aud : 'authenticated' ,
63+ created_at : '2026-01-01T00:00:00Z' ,
64+ } as User ;
65+
66+ export const LOCAL_MOCK_USER : Profile = {
67+ id : '22222222-2222-4222-8222-222222222222' ,
68+ codigo_distribuidor : 'SUMAK-00123' ,
69+ username : 'user' ,
70+ nombre_completo : 'Usuario Distribuidor' ,
71+ cedula : '0988888888' ,
72+ email : 'user@sumak.com' ,
73+ telefono : '0991234567' ,
74+ direccion : 'Av. Principal 123' ,
75+ ciudad : 'Guayaquil' ,
76+ codigo_patrocinador : 'SUMAK-00001' ,
77+ patrocinador_id : '16092a90-3e8e-466d-a509-eb6b074a92cd' ,
78+ paquete : 'emprendedor' ,
79+ puntos : 150 ,
80+ estado : 'activo' ,
81+ rol : 'distribuidor' ,
82+ avatar_url : null ,
83+ fecha_registro : '2026-01-01T00:00:00Z' ,
84+ fecha_aprobacion : '2026-01-01T00:00:00Z' ,
85+ has_completed_onboarding : true ,
86+ } ;
87+
88+ export const LOCAL_MOCK_USER_AUTH : User = {
89+ id : '22222222-2222-4222-8222-222222222222' ,
90+ app_metadata : { } ,
91+ user_metadata : {
92+ nombre : 'Usuario Distribuidor' ,
93+ rol : 'distribuidor' ,
94+ } ,
95+ aud : 'authenticated' ,
96+ created_at : '2026-01-01T00:00:00Z' ,
97+ } as User ;
98+
99+ export const LOCAL_MOCK_ESTUDIANTE : Profile = {
100+ id : '33333333-3333-4333-8333-333333333333' ,
101+ codigo_distribuidor : 'ACE-00088' ,
102+ username : 'estudiante' ,
103+ nombre_completo : 'Estudiante Academia Sumak' ,
104+ cedula : '0977777777' ,
105+ email : 'estudiante@sumak.com' ,
106+ telefono : '0997654321' ,
107+ direccion : 'Campus Virtual' ,
108+ ciudad : 'Quito' ,
109+ codigo_patrocinador : null ,
110+ patrocinador_id : null ,
111+ paquete : null ,
112+ puntos : 0 ,
113+ estado : 'activo' ,
114+ rol : 'distribuidor' ,
115+ avatar_url : null ,
116+ fecha_registro : '2026-01-01T00:00:00Z' ,
117+ fecha_aprobacion : '2026-01-01T00:00:00Z' ,
118+ has_completed_onboarding : true ,
119+ } ;
120+
121+ export const LOCAL_MOCK_ESTUDIANTE_AUTH : User = {
122+ id : '33333333-3333-4333-8333-333333333333' ,
123+ app_metadata : { } ,
124+ user_metadata : {
125+ nombre : 'Estudiante Academia Sumak' ,
126+ rol : 'estudiante' ,
127+ } ,
128+ aud : 'authenticated' ,
129+ created_at : '2026-01-01T00:00:00Z' ,
130+ } as User ;
131+
33132const AuthContext = createContext < AuthContextValue | null > ( null ) ;
34133
35134export function AuthProvider ( { children } : { children : React . ReactNode } ) {
@@ -59,6 +158,33 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
59158 }
60159
61160 useEffect ( ( ) => {
161+ // Check for local mock session first (dev only)
162+ if ( import . meta. env . DEV ) {
163+ const mockRole = localStorage . getItem ( 'sumak_local_mock_role' ) ;
164+ const isMockAdmin = localStorage . getItem ( 'sumak_local_mock_admin' ) === 'true' ;
165+
166+ if ( mockRole === 'admin' || isMockAdmin ) {
167+ setUser ( LOCAL_MOCK_ADMIN_USER ) ;
168+ setProfile ( LOCAL_MOCK_ADMIN ) ;
169+ setLoading ( false ) ;
170+ return ;
171+ }
172+
173+ if ( mockRole === 'user' ) {
174+ setUser ( LOCAL_MOCK_USER_AUTH ) ;
175+ setProfile ( LOCAL_MOCK_USER ) ;
176+ setLoading ( false ) ;
177+ return ;
178+ }
179+
180+ if ( mockRole === 'estudiante' ) {
181+ setUser ( LOCAL_MOCK_ESTUDIANTE_AUTH ) ;
182+ setProfile ( LOCAL_MOCK_ESTUDIANTE ) ;
183+ setLoading ( false ) ;
184+ return ;
185+ }
186+ }
187+
62188 // Get initial session
63189 supabase . auth . getSession ( ) . then ( ( { data : { session } } ) => {
64190 setUser ( session ?. user ?? null ) ;
@@ -71,6 +197,7 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
71197
72198 // Listen for auth changes
73199 const { data : { subscription } } = supabase . auth . onAuthStateChange ( ( _event , session ) => {
200+ if ( import . meta. env . DEV && ( localStorage . getItem ( 'sumak_local_mock_role' ) || localStorage . getItem ( 'sumak_local_mock_admin' ) ) ) return ;
74201 setUser ( session ?. user ?? null ) ;
75202 if ( session ?. user ) {
76203 fetchProfile ( session . user . id ) ;
@@ -85,6 +212,35 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
85212 async function signIn (
86213 email : string , password : string , captchaToken ?: string ,
87214 ) : Promise < { error : string | null ; profile : Profile | null } > {
215+ const trimmed = email . trim ( ) . toLowerCase ( ) ;
216+
217+ // Bypass credenciales locales (dev only)
218+ if ( import . meta. env . DEV ) {
219+ if ( ( trimmed === 'admin' || trimmed === 'admin@sumak.com' || trimmed === 'admin@sumak.ec' || trimmed === 'admin@sumak.local' ) && password === 'admin' ) {
220+ localStorage . setItem ( 'sumak_local_mock_role' , 'admin' ) ;
221+ localStorage . setItem ( 'sumak_local_mock_admin' , 'true' ) ;
222+ setUser ( LOCAL_MOCK_ADMIN_USER ) ;
223+ setProfile ( LOCAL_MOCK_ADMIN ) ;
224+ return { error : null , profile : LOCAL_MOCK_ADMIN } ;
225+ }
226+
227+ if ( ( trimmed === 'user' || trimmed === 'user@sumak.com' || trimmed === 'user@sumak.ec' || trimmed === 'user@sumak.local' ) && password === 'user' ) {
228+ localStorage . setItem ( 'sumak_local_mock_role' , 'user' ) ;
229+ localStorage . setItem ( 'sumak_local_mock_admin' , 'false' ) ;
230+ setUser ( LOCAL_MOCK_USER_AUTH ) ;
231+ setProfile ( LOCAL_MOCK_USER ) ;
232+ return { error : null , profile : LOCAL_MOCK_USER } ;
233+ }
234+
235+ if ( ( trimmed === 'estudiante' || trimmed === 'estudiante@sumak.com' || trimmed === 'estudiante@sumak.ec' || trimmed === 'estudiante@sumak.local' ) && password === 'estudiante' ) {
236+ localStorage . setItem ( 'sumak_local_mock_role' , 'estudiante' ) ;
237+ localStorage . setItem ( 'sumak_local_mock_admin' , 'false' ) ;
238+ setUser ( LOCAL_MOCK_ESTUDIANTE_AUTH ) ;
239+ setProfile ( LOCAL_MOCK_ESTUDIANTE ) ;
240+ return { error : null , profile : LOCAL_MOCK_ESTUDIANTE } ;
241+ }
242+ }
243+
88244 const { data, error } = await supabase . auth . signInWithPassword ( {
89245 email,
90246 password,
@@ -113,7 +269,13 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
113269 if ( session ?. user ) await fetchProfile ( session . user . id ) ;
114270 }
115271
116- const isMockUser = false ;
272+ const isMockUser = Boolean (
273+ user ?. id === LOCAL_MOCK_ADMIN . id ||
274+ user ?. id === LOCAL_MOCK_USER . id ||
275+ user ?. id === LOCAL_MOCK_ESTUDIANTE . id ||
276+ localStorage . getItem ( 'sumak_local_mock_role' ) ||
277+ localStorage . getItem ( 'sumak_local_mock_admin' )
278+ ) ;
117279
118280 async function completeOnboarding ( ) : Promise < void > {
119281 if ( ! profile ) return ;
0 commit comments