mirror of
https://github.com/lucasrcsantana/story-generator.git
synced 2025-12-17 05:47:52 +00:00
fix: corrige tipagem do sistema de autenticação
- 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
This commit is contained in:
parent
8e8936e9f4
commit
eb77476d51
@ -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<void>;
|
||||
}
|
||||
|
||||
@ -15,6 +25,7 @@ export function useAuth() {
|
||||
const [user, setUser] = useState<User | null>(null)
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
const [userRole, setUserRole] = useState<AuthContextType['userRole']>(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
|
||||
|
||||
@ -1,53 +1,45 @@
|
||||
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<User, 'user_metadata'> {
|
||||
email: string;
|
||||
user_metadata: AdminUserMetadata;
|
||||
interface AdminUser extends User {
|
||||
user_metadata: UserMetadata;
|
||||
}
|
||||
|
||||
export function UserManagementPage() {
|
||||
const [users, setUsers] = React.useState<AdminUser[]>([]);
|
||||
const [users, setUsers] = useState<AdminUser[]>([]);
|
||||
const [loading, setLoading] = React.useState(true);
|
||||
const [error, setError] = React.useState<string | null>(null);
|
||||
const [updating, setUpdating] = React.useState<string | null>(null);
|
||||
|
||||
React.useEffect(() => {
|
||||
fetchUsers();
|
||||
}, []);
|
||||
|
||||
const fetchUsers = async () => {
|
||||
try {
|
||||
const { data: { users }, error } = await supabase.auth.admin.listUsers();
|
||||
if (error) throw error;
|
||||
const { data: users, error } = await supabase.auth.admin.listUsers();
|
||||
|
||||
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 || ''
|
||||
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) {
|
||||
console.error('Erro ao buscar usuários:', err);
|
||||
setError('Não foi possível carregar os usuários');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
setError(err instanceof Error ? err.message : 'Erro ao carregar usuários');
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchUsers();
|
||||
}, []);
|
||||
|
||||
const handleRefresh = async () => {
|
||||
await fetchUsers();
|
||||
};
|
||||
|
||||
const handleUpdateRole = async (userId: string, role: string) => {
|
||||
setUpdating(userId);
|
||||
try {
|
||||
|
||||
21
src/types/supabase.ts
Normal file
21
src/types/supabase.ts
Normal file
@ -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[];
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user