diff --git a/src/ui/Admin/AdminSettings.tsx b/src/ui/Admin/AdminSettings.tsx index 8a7fe744..54cf46a0 100644 --- a/src/ui/Admin/AdminSettings.tsx +++ b/src/ui/Admin/AdminSettings.tsx @@ -27,6 +27,7 @@ import { deleteUser } from "@/ui/main-axios.ts"; import {useTranslation} from "react-i18next"; +import {toast} from "sonner"; function getCookie(name: string) { return document.cookie.split('; ').reduce((r, v) => { @@ -57,8 +58,6 @@ export function AdminSettings({isTopbarOpen = true}: AdminSettingsProps): React. scopes: 'openid email profile' }); const [oidcLoading, setOidcLoading] = React.useState(false); - const [oidcError, setOidcError] = React.useState(null); - const [oidcSuccess, setOidcSuccess] = React.useState(null); const [users, setUsers] = React.useState(null); - const [makeAdminSuccess, setMakeAdminSuccess] = React.useState(null); React.useEffect(() => { const jwt = getCookie("jwt"); @@ -121,13 +118,11 @@ export function AdminSettings({isTopbarOpen = true}: AdminSettingsProps): React. const handleOIDCConfigSubmit = async (e: React.FormEvent) => { e.preventDefault(); setOidcLoading(true); - setOidcError(null); - setOidcSuccess(null); const required = ['client_id', 'client_secret', 'issuer_url', 'authorization_url', 'token_url']; const missing = required.filter(f => !oidcConfig[f as keyof typeof oidcConfig]); if (missing.length > 0) { - setOidcError(`Missing required fields: ${missing.join(', ')}`); + toast.error(`Missing required fields: ${missing.join(', ')}`); setOidcLoading(false); return; } @@ -135,9 +130,9 @@ export function AdminSettings({isTopbarOpen = true}: AdminSettingsProps): React. const jwt = getCookie("jwt"); try { await updateOIDCConfig(oidcConfig); - setOidcSuccess("OIDC configuration updated successfully!"); + toast.success("OIDC configuration updated successfully!"); } catch (err: any) { - setOidcError(err?.response?.data?.error || t('interface.failedToUpdateOidcConfig')); + toast.error(err?.response?.data?.error || t('interface.failedToUpdateOidcConfig')); } finally { setOidcLoading(false); } @@ -147,42 +142,44 @@ export function AdminSettings({isTopbarOpen = true}: AdminSettingsProps): React. setOidcConfig(prev => ({...prev, [field]: value})); }; - const makeUserAdmin = async (e: React.FormEvent) => { + const handleMakeUserAdmin = async (e: React.FormEvent) => { e.preventDefault(); if (!newAdminUsername.trim()) return; setMakeAdminLoading(true); - setMakeAdminError(null); - setMakeAdminSuccess(null); const jwt = getCookie("jwt"); try { await makeUserAdmin(newAdminUsername.trim()); - setMakeAdminSuccess(`User ${newAdminUsername} is now an admin`); + toast.success(`User ${newAdminUsername} is now an admin`); setNewAdminUsername(""); fetchUsers(); } catch (err: any) { - setMakeAdminError(err?.response?.data?.error || t('interface.failedToMakeUserAdmin')); + toast.error(err?.response?.data?.error || t('interface.failedToMakeUserAdmin')); } finally { setMakeAdminLoading(false); } }; - const removeAdminStatus = async (username: string) => { + const handleRemoveAdminStatus = async (username: string) => { if (!confirm(`Remove admin status from ${username}?`)) return; const jwt = getCookie("jwt"); try { await removeAdminStatus(username); + toast.success(`Admin status removed from ${username}`); fetchUsers(); - } catch { + } catch (err: any) { + toast.error(err?.response?.data?.error || 'Failed to remove admin status'); } }; - const deleteUser = async (username: string) => { + const handleDeleteUser = async (username: string) => { if (!confirm(`Delete user ${username}? This cannot be undone.`)) return; const jwt = getCookie("jwt"); try { await deleteUser(username); + toast.success(`User ${username} deleted successfully`); fetchUsers(); - } catch { + } catch (err: any) { + toast.error(err?.response?.data?.error || 'Failed to delete user'); } }; @@ -243,12 +240,6 @@ export function AdminSettings({isTopbarOpen = true}: AdminSettingsProps): React.

{t('admin.externalAuthentication')}

{t('admin.configureExternalProvider')}

- {oidcError && ( - - {t('common.error')} - {oidcError} - - )}
@@ -315,12 +306,6 @@ export function AdminSettings({isTopbarOpen = true}: AdminSettingsProps): React. })}>{t('admin.reset')}
- {oidcSuccess && ( - - {t('admin.success')} - {oidcSuccess} - - )}
@@ -358,7 +343,7 @@ export function AdminSettings({isTopbarOpen = true}: AdminSettingsProps): React. className="px-4">{user.is_oidc ? t('admin.external') : t('admin.local')} - {makeAdminError && ( - - {t('common.error')} - {makeAdminError} - - )} - {makeAdminSuccess && ( - - {t('admin.success')} - {makeAdminSuccess} - - )} @@ -427,7 +400,7 @@ export function AdminSettings({isTopbarOpen = true}: AdminSettingsProps): React. className="px-4">{admin.is_oidc ? t('admin.external') : t('admin.local')}