eletrotupi / tcc/ commit / 4e8e478

frontend: request new activation code

Pedro Lucas Porcellis porcellis@eletrotupi.com · 4 months ago 4e8e478f6d7cd313e333b3ca6793334f4c19c905 Browse files
Parents 10dda3b
Changed 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();