feat: add authenticated settings page.

This commit is contained in:
liqupan
2026-02-02 20:12:19 +08:00
parent cb3e16cd16
commit 6c32d845a7
259 changed files with 24685 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
import { DotsHorizontalIcon } from '@radix-ui/react-icons';
import { Row } from '@tanstack/react-table';
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { Character } from '../data/schema';
import { useCharacterDialog } from './character-dialog-context';
import { deleteCharacter } from '../data/api';
import { toast } from 'sonner';
import { useQueryClient } from '@tanstack/react-query';
interface DataTableRowActionsProps<TData> {
row: Row<TData>;
}
export function DataTableRowActions<TData>({
row,
}: DataTableRowActionsProps<TData>) {
const character = row.original as Character;
const { setOpen, setCharacter } = useCharacterDialog();
const queryClient = useQueryClient();
const handleEdit = () => {
setCharacter(character);
setOpen(true);
};
const handleDelete = async () => {
if (confirm('确认删除该角色吗?')) {
try {
if (character.id) {
await deleteCharacter(character.id);
toast.success('删除成功');
queryClient.invalidateQueries({ queryKey: ['characters'] });
}
} catch (error) {
toast.error('删除失败');
console.error(error);
}
}
};
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant='ghost'
className='flex h-8 w-8 p-0 data-[state=open]:bg-muted'
>
<DotsHorizontalIcon className='h-4 w-4' />
<span className='sr-only'></span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align='end' className='w-[160px]'>
<DropdownMenuItem onClick={handleEdit}></DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={handleDelete}>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}