From 8e8936e9f4488b9006d50ab9655fe8d32fe75503 Mon Sep 17 00:00:00 2001 From: Lucas Santana Date: Fri, 20 Dec 2024 13:56:43 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20adiciona=20tipagem=20forte=20para=20met?= =?UTF-8?q?adados=20do=20usu=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cria interface UserMetadata para tipagem dos metadados do Supabase - Estende tipos do @supabase/supabase-js com metadados personalizados - Atualiza useAuth para usar tipagem forte nos roles - Corrige tipagem do userRole no AuthContext - Adiciona validação de tipos para roles permitidos --- src/components/auth/ProtectedRoute.tsx | 3 ++- src/hooks/useAuth.tsx | 7 ++++--- src/pages/admin/UserManagementPage.tsx | 20 ++++++++++++++------ 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/components/auth/ProtectedRoute.tsx b/src/components/auth/ProtectedRoute.tsx index 482e80c..2ed2fdd 100644 --- a/src/components/auth/ProtectedRoute.tsx +++ b/src/components/auth/ProtectedRoute.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { Navigate, useLocation } from 'react-router-dom'; -import { useAuth, AuthContextType } from '../../hooks/useAuth'; +import { useAuth } from '../../hooks/useAuth'; +import type { AuthContextType } from '../../hooks/useAuth'; interface ProtectedRouteProps { children: React.ReactNode; diff --git a/src/hooks/useAuth.tsx b/src/hooks/useAuth.tsx index dceb819..b9faafc 100644 --- a/src/hooks/useAuth.tsx +++ b/src/hooks/useAuth.tsx @@ -1,7 +1,8 @@ import React from 'react'; import { useNavigate } from 'react-router-dom'; import { supabase } from '../lib/supabase'; -import { User } from '@supabase/supabase-js'; +import { User, UserMetadata } from '@supabase/supabase-js'; +import { UserMetadata as SupabaseUserMetadata } from '../types/supabase'; export interface AuthContextType { user: User | null; @@ -10,7 +11,7 @@ export interface AuthContextType { signIn: (email: string, password: string) => Promise; signUp: (email: string, password: string) => Promise; signOut: () => Promise; - userRole: string | null; + userRole: UserMetadata['role'] | null; } const AuthContext = React.createContext(undefined); @@ -18,7 +19,7 @@ const AuthContext = React.createContext(undefined); export function AuthProvider({ children }: { children: React.ReactNode }) { const navigate = useNavigate(); const [user, setUser] = React.useState(null); - const [userRole, setUserRole] = React.useState(null); + const [userRole, setUserRole] = React.useState(null); const [loading, setLoading] = React.useState(true); React.useEffect(() => { diff --git a/src/pages/admin/UserManagementPage.tsx b/src/pages/admin/UserManagementPage.tsx index b94bfde..5037d6c 100644 --- a/src/pages/admin/UserManagementPage.tsx +++ b/src/pages/admin/UserManagementPage.tsx @@ -1,12 +1,14 @@ import React from 'react'; import { supabase } from '../../lib/supabase'; -import { User } from '@supabase/supabase-js'; +import { User, UserMetadata } from '@supabase/supabase-js'; -interface AdminUser extends User { +interface AdminUserMetadata extends UserMetadata { + role?: string; +} + +interface AdminUser extends Omit { email: string; - user_metadata?: { - role?: string; - }; + user_metadata: AdminUserMetadata; } export function UserManagementPage() { @@ -25,10 +27,16 @@ export function UserManagementPage() { if (error) throw error; const validUsers = users?.filter((user): user is AdminUser => - typeof user.email === 'string' && user.email !== undefined + 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);