chore: logout

This commit is contained in:
nathan
2025-10-01 20:44:06 +08:00
parent a13569031f
commit c5286e6d1c
3 changed files with 94 additions and 2 deletions

View File

@@ -6,6 +6,7 @@ import { ReactComponent as LoginIcon } from '@/assets/icons/logout.svg';
import { ReactComponent as MoonIcon } from '@/assets/icons/moon.svg';
import { ReactComponent as SunIcon } from '@/assets/icons/sun.svg';
import CacheClearingDialog from '@/components/_shared/modal/CacheClearingDialog';
import LogoutConfirm from '@/components/app/workspaces/LogoutConfirm';
import { AFConfigContext } from '@/components/main/app.hooks';
import { ThemeModeContext } from '@/components/main/useAppThemeMode';
import { openUrl } from '@/utils/url';
@@ -23,12 +24,21 @@ function MoreActionsContent({
const { t } = useTranslation();
const navigate = useNavigate();
const handleLogin = useCallback(() => {
const handleLogout = useCallback(() => {
clearRedirectTo(); // Clear stored redirect URL from previous user
invalidToken();
navigate('/login?redirectTo=' + encodeURIComponent(window.location.href));
}, [navigate]);
const handleLogin = useCallback(() => {
if (isAuthenticated) {
setOpenLogoutConfirm(true);
} else {
handleLogout();
}
}, [isAuthenticated, handleLogout]);
const [openConfirm, setOpenConfirm] = React.useState(false);
const [openLogoutConfirm, setOpenLogoutConfirm] = React.useState(false);
const actions = useMemo(() => {
const items = [
@@ -98,6 +108,11 @@ function MoreActionsContent({
<>
{actionsContent}
<CacheClearingDialog open={openConfirm} onClose={() => setOpenConfirm(false)} />
<LogoutConfirm
open={openLogoutConfirm}
onClose={() => setOpenLogoutConfirm(false)}
onConfirm={handleLogout}
/>
</>
);
}

View File

@@ -0,0 +1,69 @@
import { useTranslation } from 'react-i18next';
import { Button } from '@/components/ui/button';
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog';
import { createHotkey, HOT_KEY_NAME } from '@/utils/hotkeys';
export function LogoutConfirm({
open,
onClose,
onConfirm,
}: {
open: boolean;
onClose: () => void;
onConfirm: () => void;
}) {
const { t } = useTranslation();
const handleLogout = () => {
onConfirm();
onClose();
};
return (
<Dialog
open={open}
onOpenChange={(status) => {
if (!status) {
onClose();
}
}}
>
<DialogContent
onCloseAutoFocus={(e) => {
e.preventDefault();
}}
onKeyDown={(e) => {
e.stopPropagation();
if (createHotkey(HOT_KEY_NAME.ENTER)(e.nativeEvent)) {
handleLogout();
}
}}
>
<DialogHeader>
<DialogTitle>{t('button.logout')}</DialogTitle>
</DialogHeader>
<DialogDescription>
{t('settings.menu.logoutPrompt')}
</DialogDescription>
<DialogFooter>
<Button variant={'outline'} onClick={onClose}>
{t('button.cancel')}
</Button>
<Button variant={'destructive'} onClick={handleLogout} data-testid="logout-confirm-button">
{t('button.logout')}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
}
export default LogoutConfirm;

View File

@@ -40,6 +40,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip
import { openUrl } from '@/utils/url';
import { AccountSettings } from './AccountSettings';
import LogoutConfirm from '@/components/app/workspaces/LogoutConfirm';
export function Workspaces() {
const { t } = useTranslation();
@@ -66,6 +67,7 @@ export function Workspaces() {
const [openRenameWorkspace, setOpenRenameWorkspace] = useState<Workspace | null>(null);
const [openDeleteWorkspace, setOpenDeleteWorkspace] = useState<Workspace | null>(null);
const [openLeaveWorkspace, setOpenLeaveWorkspace] = useState<Workspace | null>(null);
const [openLogoutConfirm, setOpenLogoutConfirm] = useState(false);
const isOwner = currentWorkspace?.owner?.uid.toString() === currentUser?.uid.toString();
@@ -229,7 +231,7 @@ export function Workspaces() {
<div className={'flex-1 text-left'}>{t('web.accountSettings')}</div>
</DropdownMenuItem>
</AccountSettings>
<DropdownMenuItem onSelect={handleSignOut}>
<DropdownMenuItem onSelect={() => setOpenLogoutConfirm(true)}>
<LogoutIcon />
{t('button.logout')}
</DropdownMenuItem>
@@ -323,6 +325,12 @@ export function Workspaces() {
openOnChange={() => setOpenLeaveWorkspace(null)}
/>
)}
<LogoutConfirm
open={openLogoutConfirm}
onClose={() => setOpenLogoutConfirm(false)}
onConfirm={handleSignOut}
/>
</>
);
}