frontend: request new activation code
Pedro Lucas Porcellis porcellis@eletrotupi.com · 4 months ago
4e8e478f6d7cd313e333b3ca6793334f4c19c905 Browse filesParents
10dda3bChanged files
4
Additions
+25
Deletions
-21
frontend/app/auth/activate.tsx
1 1
import React, { useState } from 'react';
2 2
import {
3 3
View,
4 4
Text,
5 5
StyleSheet,
20 20
const [code, setCode] = useState('');
21 21
const [errors, setErrors] = useState<{
22 22
code?: string;
23 23
}>({});
24 24
25 -
const { activate } = useAuth();
25 +
const { activate, requestActivateCode } = useAuth();
26 26
const [loading, setLoading] = useState(false);
27 27
const textColor = useThemeColor({}, 'text');
28 28
const backgroundColor = useThemeColor({}, 'background');
29 29
const tintColor = useThemeColor({}, 'tint');
30 30
61 61
setLoading(false);
62 62
}
63 63
};
64 64
65 65
const resendCode = async () => {
66 +
await requestActivateCode()
67 +
68 +
Alert.alert(
69 +
"Novo código",
70 +
"Enviado novo código, verifique sua caixa de entrada"
71 +
);
66 72
}
67 73
68 74
return (
69 75
<SafeAreaView style={[styles.container, { backgroundColor }]}>
70 76
<KeyboardAvoidingView
104 110
<View style={styles.footer}>
105 111
<Text style={[styles.footerText, { color: textColor, opacity: 0.7 }]}>
106 112
Não recebeu?{' '}
107 113
</Text>
108 114
109 -
<Button variant="outline" title="Reenviar um novo código" onPressed={resendCode} />
115 +
<Button variant="outline" title="Reenviar um novo código" onPress={resendCode} />
110 116
</View>
111 117
</ScrollView>
112 118
</KeyboardAvoidingView>
113 119
</SafeAreaView>
114 120
);
155 161
footerText: {
156 162
textAlign: 'center',
157 163
marginBottom: 10
158 164
}
159 165
});
frontend/app/profile.tsx
1 1
import { useState, useEffect } from 'react';
2 2
import {
3 3
View,
4 4
Text,
5 5
StyleSheet,
38 38
39 39
useEffect(() => {
40 40
setFirstName(user.firstName)
41 41
setLastName(user.lastName)
42 42
setEmail(user.email)
43 -
44 -
console.log("User@profile", user);
45 43
}, [user])
46 44
47 45
const backgroundColor = useThemeColor({}, 'background');
48 46
const textColor = useThemeColor({}, 'text');
49 47
270 268
cardBlockHint: {
271 269
...Typography.cardHint,
272 270
color: Colors.light.textSecondary
273 271
}
274 272
});
frontend/context/AuthContext.tsx
1 1
import React, { createContext, useContext, useEffect, useState } from 'react';
2 2
import { apiClient, User } from '@/lib/api';
3 3
import { queryClient, storage } from '@/lib/queryClient';
4 4
5 5
interface AuthProviderProps {
8 8
9 9
interface AuthContextType {
10 10
user: User | null;
11 11
isLoading: boolean;
12 12
isAuthenticated: boolean;
13 -
updateAuthUser: (user: {
14 -
firstName: string;
15 -
lastName?: string;
16 -
email: string;
17 -
updatedAt: date;
18 -
avatarURL?: string;
19 -
avatarKey?: string;
20 -
active: boolean;
21 -
}) => void;
13 +
updateAuthUser: (user: User) => void;
22 14
login: (email: string, password: string) => Promise<void>;
23 15
signup: (userData: {
24 16
firstName: string;
25 17
lastName?: string;
26 18
email: string;
28 20
}) => Promise<void>;
29 21
logout: () => Promise<void>;
30 22
forgotPassword: (email: string) => Promise<{ message: string; token?: string }>;
31 23
resetPassword: (token: string, password: string) => Promise<void>;
32 24
activate: (code: string) => Promise<void>;
25 +
requestActivateCode: () => Promise<void>;
33 26
}
34 27
35 28
export function sanitizeUser(data: any): User {
36 29
return {
37 30
id: data.id,
76 69
// TODO: Fetch the full user profile
77 70
// For now, we'll create a basic user object
78 71
setUser({
79 72
id: verifyResponse.userId,
80 73
email: verifyResponse.email,
81 -
firstName: verifyResponse.user.firstName,
82 -
lastName: verifyResponse.user.lastName,
83 -
avatarURL: verifyResponse.user.avatarURL,
84 -
avatarKey: verifyResponse.user.avatarKey,
85 -
active: verifyResponse.user.active
74 +
...verifyResponse.user
86 75
});
87 76
}
88 77
}
89 78
} catch (error) {
90 79
console.error('Auth check failed:', error);
145 134
146 135
const activate = async (code: number) => {
147 136
const response = await apiClient.activate(code);
148 137
149 138
if (response.user) {
150 -
updateAuthUser(response.user)
139 +
setUser(response.user)
151 140
}
152 141
153 142
return response
143 +
}
144 +
145 +
const requestActivateCode = async() => {
146 +
await apiClient.requestActivateCode();
154 147
}
155 148
156 149
const updateAuthUser = (user) => {
157 -
setUser(sanitizeUser(user));
150 +
setUser(user);
158 151
}
159 152
160 153
const value: AuthContextType = {
161 154
user,
162 155
isLoading,
165 158
signup,
166 159
logout,
167 160
forgotPassword,
168 161
resetPassword,
169 162
updateAuthUser,
170 -
activate
163 +
activate,
164 +
requestActivateCode
171 165
};
172 166
173 167
return (
174 168
<AuthContext.Provider value={value}>
175 169
{children}
176 170
</AuthContext.Provider>
177 171
);
178 172
}
frontend/lib/api/client.ts
1 1
import * as SecureStore from 'expo-secure-store';
2 2
import {
3 3
User,
4 4
AuthResponse,
5 5
VerifyTokenResponse,
98 98
method: 'POST',
99 99
body: JSON.stringify({ code }),
100 100
});
101 101
}
102 102
103 +
async requestActivateCode(): Promise<void> {
104 +
return this.request('/auth/resend_code', {
105 +
method: 'POST'
106 +
})
107 +
}
108 +
103 109
async signup(user: SignUpPayload): Promise<AuthResponse> {
104 110
const response = await this.request<AuthResponse>('/users', {
105 111
method: 'POST',
106 112
body: JSON.stringify({ user }),
107 113
});
218 224
return this.request(`/sleep_records${qs ? `?${qs}` : ''}`);
219 225
}
220 226
}
221 227
222 228
export const apiClient = new ApiClient();