Adicionar User Role

This commit is contained in:
Lucas Santana 2024-12-20 12:10:59 -03:00
parent c0aa725fa6
commit 4b431358e0
5 changed files with 195 additions and 0 deletions

View File

@ -0,0 +1,112 @@
import React from 'react';
import { supabase } from '../../lib/supabase';
interface User {
id: string;
email: string;
user_metadata?: {
role?: string;
};
}
export function UserManagementPage() {
const [users, setUsers] = React.useState<User[]>([]);
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;
setUsers(users || []);
} catch (err) {
console.error('Erro ao buscar usuários:', err);
setError('Não foi possível carregar os usuários');
} finally {
setLoading(false);
}
};
const handleUpdateRole = async (userId: string, role: string) => {
setUpdating(userId);
try {
const { error } = await supabase.auth.admin.updateUserById(
userId,
{ user_metadata: { role } }
);
if (error) throw error;
await fetchUsers();
} catch (err) {
console.error('Erro ao atualizar papel:', err);
setError('Não foi possível atualizar o papel do usuário');
} finally {
setUpdating(null);
}
};
if (loading) {
return <div>Carregando...</div>;
}
return (
<div className="p-8">
<h1 className="text-2xl font-bold mb-6">Gerenciamento de Usuários</h1>
{error && (
<div className="mb-4 p-4 bg-red-50 text-red-600 rounded-lg">
{error}
</div>
)}
<div className="bg-white rounded-xl shadow-sm border border-gray-200">
<table className="min-w-full divide-y divide-gray-200">
<thead className="bg-gray-50">
<tr>
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
Email
</th>
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
Papel Atual
</th>
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
Ações
</th>
</tr>
</thead>
<tbody className="bg-white divide-y divide-gray-200">
{users.map((user) => (
<tr key={user.id}>
<td className="px-6 py-4 whitespace-nowrap">
{user.email}
</td>
<td className="px-6 py-4 whitespace-nowrap">
<span className="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
{user.user_metadata?.role || 'Não definido'}
</span>
</td>
<td className="px-6 py-4 whitespace-nowrap">
<select
value={user.user_metadata?.role || ''}
onChange={(e) => handleUpdateRole(user.id, e.target.value)}
disabled={updating === user.id}
className="mt-1 block w-full rounded-lg border-gray-300 shadow-sm focus:border-purple-500 focus:ring-purple-500"
>
<option value="">Selecione um papel</option>
<option value="school">Escola</option>
<option value="teacher">Professor</option>
<option value="student">Aluno</option>
</select>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
);
}

View File

@ -0,0 +1,16 @@
import { supabase } from '../../lib/supabase';
export async function updateRole(email: string, role: string) {
const { data: { user }, error } = await supabase.auth.admin.updateUserById(
email,
{
user_metadata: { role }
}
);
if (error) {
throw error;
}
return user;
}

View File

@ -0,0 +1,14 @@
import { supabase } from '../../lib/supabase';
export async function updateUserRole(userId: string, role: string) {
const { data, error } = await supabase.auth.admin.updateUserById(
userId,
{ user_metadata: { role: role } }
);
if (error) {
throw error;
}
return data;
}

View File

@ -0,0 +1,33 @@
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(
'SUA_URL_DO_SUPABASE',
'SUA_ANON_KEY'
);
async function updateUserRole(email: string, role: 'school' | 'teacher' | 'student') {
try {
// Primeiro fazer login como o usuário
const { data: authData, error: authError } = await supabase.auth.signInWithPassword({
email: email,
password: 'SENHA_DO_USUARIO' // Substitua pela senha real
});
if (authError) throw authError;
// Depois atualizar os metadados
const { data, error } = await supabase.auth.updateUser({
data: { role: role }
});
if (error) throw error;
console.log('Papel do usuário atualizado com sucesso:', data);
} catch (err) {
console.error('Erro ao atualizar papel do usuário:', err);
}
}
// Exemplo de uso:
updateUserRole('email@escola.com', 'school');

View File

@ -0,0 +1,20 @@
import { supabase } from '../lib/supabase';
export async function updateUserRole(userId: string, role: 'school' | 'teacher' | 'student') {
try {
const { data, error } = await supabase.auth.updateUser({
data: { role }
});
if (error) throw error;
console.log('Role atualizado com sucesso:', data);
return data;
} catch (err) {
console.error('Erro ao atualizar role:', err);
throw err;
}
}
// Uso:
// await updateUserRole('id-do-usuario', 'school');