From eb77476d51aaf44f00f27cd43fcfe89a4b7cc53b Mon Sep 17 00:00:00 2001 From: Lucas Santana Date: Fri, 20 Dec 2024 14:29:34 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20corrige=20tipagem=20do=20sistema=20de=20?= =?UTF-8?q?autentica=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adiciona tipos UserRole e WeakPassword - Corrige tipagem do UserManagementPage - Atualiza interface AuthContextType - Melhora tratamento de erros no fetchUsers - Adiciona tipagem explícita para User no filter --- src/hooks/useAuth.ts | 24 ++++++++-- src/pages/admin/UserManagementPage.tsx | 64 +++++++++++--------------- src/types/supabase.ts | 21 +++++++++ 3 files changed, 70 insertions(+), 39 deletions(-) create mode 100644 src/types/supabase.ts diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts index 1d63120..4cd577d 100644 --- a/src/hooks/useAuth.ts +++ b/src/hooks/useAuth.ts @@ -1,13 +1,23 @@ import { useState, useEffect } from 'react' import { supabase } from '../lib/supabase' import { User, Session } from '@supabase/supabase-js' +import type { WeakPassword } from '../types/supabase' +import { UserRole } from '../types/supabase' -interface AuthContextType { +export interface AuthContextType { user: User | null; loading: boolean; error: string | null; - signIn: (email: string, password: string) => Promise<{ user: User; session: Session }>; - signUp: (email: string, password: string) => Promise<{ user: User; session: Session }>; + userRole: UserRole | null; + signIn: (email: string, password: string) => Promise<{ + user: User; + session: Session; + weakPassword?: WeakPassword; + }>; + signUp: (email: string, password: string) => Promise<{ + user: User; + session: Session; + }>; signOut: () => Promise; } @@ -15,6 +25,7 @@ export function useAuth() { const [user, setUser] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) + const [userRole, setUserRole] = useState(null) useEffect(() => { // Verificar sessão atual @@ -31,6 +42,12 @@ export function useAuth() { return () => subscription.unsubscribe() }, []) + useEffect(() => { + if (user?.user_metadata?.role) { + setUserRole(user.user_metadata.role); + } + }, [user]); + const signIn = async (email: string, password: string) => { try { const { data, error } = await supabase.auth.signInWithPassword({ @@ -78,6 +95,7 @@ export function useAuth() { user, loading, error, + userRole, signIn, signUp, signOut diff --git a/src/pages/admin/UserManagementPage.tsx b/src/pages/admin/UserManagementPage.tsx index 5037d6c..ea1f406 100644 --- a/src/pages/admin/UserManagementPage.tsx +++ b/src/pages/admin/UserManagementPage.tsx @@ -1,51 +1,43 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import { supabase } from '../../lib/supabase'; -import { User, UserMetadata } from '@supabase/supabase-js'; +import { User } from '@supabase/supabase-js'; +import { UserMetadata } from '../../types/supabase'; -interface AdminUserMetadata extends UserMetadata { - role?: string; -} - -interface AdminUser extends Omit { - email: string; - user_metadata: AdminUserMetadata; +interface AdminUser extends User { + user_metadata: UserMetadata; } export function UserManagementPage() { - const [users, setUsers] = React.useState([]); + const [users, setUsers] = useState([]); const [loading, setLoading] = React.useState(true); const [error, setError] = React.useState(null); const [updating, setUpdating] = React.useState(null); - React.useEffect(() => { + const fetchUsers = async () => { + try { + const { data: users, error } = await supabase.auth.admin.listUsers(); + + if (error) { + setError(error.message); + return; + } + + const validUsers = users.filter((user: User) => + user.user_metadata && user.user_metadata.role + ) as AdminUser[]; + + setUsers(validUsers); + } catch (err) { + setError(err instanceof Error ? err.message : 'Erro ao carregar usuários'); + } + }; + + useEffect(() => { fetchUsers(); }, []); - const fetchUsers = async () => { - try { - const { data: { users }, error } = await supabase.auth.admin.listUsers(); - if (error) throw error; - - const validUsers = users?.filter((user): user is AdminUser => - typeof user.email === 'string' && - user.email !== undefined && - user.user_metadata !== null - ).map(user => ({ - ...user, - email: user.email!, - user_metadata: { - ...user.user_metadata, - role: user.user_metadata?.role || '' - } - })) || []; - - setUsers(validUsers); - } catch (err) { - console.error('Erro ao buscar usuários:', err); - setError('Não foi possível carregar os usuários'); - } finally { - setLoading(false); - } + const handleRefresh = async () => { + await fetchUsers(); }; const handleUpdateRole = async (userId: string, role: string) => { diff --git a/src/types/supabase.ts b/src/types/supabase.ts new file mode 100644 index 0000000..397f03c --- /dev/null +++ b/src/types/supabase.ts @@ -0,0 +1,21 @@ +export type UserRole = 'admin' | 'school' | 'teacher' | 'student'; + +export interface UserMetadata { + role: UserRole; + name: string; + school_id?: string; + class_id?: string; +} + +export interface User { + id: string; + email: string; + user_metadata: UserMetadata; + created_at: string; + updated_at: string; +} + +export interface WeakPassword { + message: string; + suggestions: string[]; +} \ No newline at end of file