"use client"; export const dynamic = "force-dynamic"; import { useMemo, useState } from "react"; import Link from "next/link"; import { useAuth } from "@/auth/clerk"; import { useQueryClient } from "@tanstack/react-query"; import { ApiError } from "@/api/mutator"; import { type listBoardGroupsApiV1BoardGroupsGetResponse, getListBoardGroupsApiV1BoardGroupsGetQueryKey, useDeleteBoardGroupApiV1BoardGroupsGroupIdDelete, useListBoardGroupsApiV1BoardGroupsGet, } from "@/api/generated/board-groups/board-groups"; import { BoardGroupsTable } from "@/components/board-groups/BoardGroupsTable"; import type { BoardGroupRead } from "@/api/generated/model"; import { createOptimisticListDeleteMutation } from "@/lib/list-delete"; import { useUrlSorting } from "@/lib/use-url-sorting"; import { DashboardPageLayout } from "@/components/templates/DashboardPageLayout"; import { buttonVariants } from "@/components/ui/button"; import { ConfirmActionDialog } from "@/components/ui/confirm-action-dialog"; const BOARD_GROUP_SORTABLE_COLUMNS = ["name", "updated_at"]; export default function BoardGroupsPage() { const { isSignedIn } = useAuth(); const queryClient = useQueryClient(); const { sorting, onSortingChange } = useUrlSorting({ allowedColumnIds: BOARD_GROUP_SORTABLE_COLUMNS, defaultSorting: [{ id: "name", desc: false }], paramPrefix: "board_groups", }); const [deleteTarget, setDeleteTarget] = useState(null); const groupsKey = getListBoardGroupsApiV1BoardGroupsGetQueryKey(); const groupsQuery = useListBoardGroupsApiV1BoardGroupsGet< listBoardGroupsApiV1BoardGroupsGetResponse, ApiError >(undefined, { query: { enabled: Boolean(isSignedIn), refetchInterval: 30_000, refetchOnMount: "always", }, }); const groups = useMemo( () => groupsQuery.data?.status === 200 ? (groupsQuery.data.data.items ?? []) : [], [groupsQuery.data], ); const deleteMutation = useDeleteBoardGroupApiV1BoardGroupsGroupIdDelete< ApiError, { previous?: listBoardGroupsApiV1BoardGroupsGetResponse } >( { mutation: createOptimisticListDeleteMutation< BoardGroupRead, listBoardGroupsApiV1BoardGroupsGetResponse, { groupId: string } >({ queryClient, queryKey: groupsKey, getItemId: (group) => group.id, getDeleteId: ({ groupId }) => groupId, onSuccess: () => { setDeleteTarget(null); }, invalidateQueryKeys: [groupsKey], }), }, queryClient, ); const handleDelete = () => { if (!deleteTarget) return; deleteMutation.mutate({ groupId: deleteTarget.id }); }; return ( <> Create group } stickyHeader >
{groupsQuery.error ? (

{groupsQuery.error.message}

) : null}
{ if (!open) { setDeleteTarget(null); } }} ariaLabel="Delete board group" title="Delete board group" description={ <> This will remove {deleteTarget?.name}. Boards will be ungrouped. This action cannot be undone. } errorMessage={deleteMutation.error?.message} onConfirm={handleDelete} isConfirming={deleteMutation.isPending} /> ); }