mirror of
https://github.com/lucasrcsantana/story-generator.git
synced 2025-12-17 05:47:52 +00:00
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:
parent
dea81a5711
commit
8e8936e9f4
@ -1,6 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Navigate, useLocation } from 'react-router-dom';
|
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 {
|
interface ProtectedRouteProps {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { supabase } from '../lib/supabase';
|
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 {
|
export interface AuthContextType {
|
||||||
user: User | null;
|
user: User | null;
|
||||||
@ -10,7 +11,7 @@ export interface AuthContextType {
|
|||||||
signIn: (email: string, password: string) => Promise<any>;
|
signIn: (email: string, password: string) => Promise<any>;
|
||||||
signUp: (email: string, password: string) => Promise<any>;
|
signUp: (email: string, password: string) => Promise<any>;
|
||||||
signOut: () => Promise<void>;
|
signOut: () => Promise<void>;
|
||||||
userRole: string | null;
|
userRole: UserMetadata['role'] | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const AuthContext = React.createContext<AuthContextType | undefined>(undefined);
|
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 }) {
|
export function AuthProvider({ children }: { children: React.ReactNode }) {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [user, setUser] = React.useState<User | null>(null);
|
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);
|
const [loading, setLoading] = React.useState(true);
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
|
|||||||
@ -1,12 +1,14 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { supabase } from '../../lib/supabase';
|
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 {
|
||||||
email: string;
|
|
||||||
user_metadata?: {
|
|
||||||
role?: string;
|
role?: string;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
interface AdminUser extends Omit<User, 'user_metadata'> {
|
||||||
|
email: string;
|
||||||
|
user_metadata: AdminUserMetadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function UserManagementPage() {
|
export function UserManagementPage() {
|
||||||
@ -25,10 +27,16 @@ export function UserManagementPage() {
|
|||||||
if (error) throw error;
|
if (error) throw error;
|
||||||
|
|
||||||
const validUsers = users?.filter((user): user is AdminUser =>
|
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 => ({
|
).map(user => ({
|
||||||
...user,
|
...user,
|
||||||
email: user.email!,
|
email: user.email!,
|
||||||
|
user_metadata: {
|
||||||
|
...user.user_metadata,
|
||||||
|
role: user.user_metadata?.role || ''
|
||||||
|
}
|
||||||
})) || [];
|
})) || [];
|
||||||
|
|
||||||
setUsers(validUsers);
|
setUsers(validUsers);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user