feat: adiciona tipagem forte para metadados do usuário

- 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
This commit is contained in:
Lucas Santana 2024-12-20 13:56:43 -03:00
parent dea81a5711
commit 8e8936e9f4
3 changed files with 20 additions and 10 deletions

View File

@ -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;

View File

@ -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<any>;
signUp: (email: string, password: string) => Promise<any>;
signOut: () => Promise<void>;
userRole: string | null;
userRole: UserMetadata['role'] | null;
}
const AuthContext = React.createContext<AuthContextType | undefined>(undefined);
@ -18,7 +19,7 @@ const AuthContext = React.createContext<AuthContextType | undefined>(undefined);
export function AuthProvider({ children }: { children: React.ReactNode }) {
const navigate = useNavigate();
const [user, setUser] = React.useState<User | null>(null);
const [userRole, setUserRole] = React.useState<string | null>(null);
const [userRole, setUserRole] = React.useState<UserMetadata['role'] | null>(null);
const [loading, setLoading] = React.useState(true);
React.useEffect(() => {

View File

@ -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 {
email: string;
user_metadata?: {
interface AdminUserMetadata extends UserMetadata {
role?: string;
};
}
interface AdminUser extends Omit<User, 'user_metadata'> {
email: 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);