"use client"; import { useState } from "react"; import { VacationStatus, VacationType } from "@capakraken/shared"; import { trpc } from "~/lib/trpc/client.js"; import { VacationModal } from "./VacationModal.js"; import { InfoTooltip } from "~/components/ui/InfoTooltip.js"; import { BalanceCard } from "./BalanceCard.js"; import { VacationCalendar } from "./VacationCalendar.js"; import { VACATION_STATUS_BADGE as STATUS_BADGE, VACATION_TYPE_LABELS as TYPE_LABELS, VACATION_TYPE_BADGE } from "~/lib/status-styles.js"; export function MyVacationsClient() { const [showModal, setShowModal] = useState(false); const utils = trpc.useUtils(); // Find resource linked to current user const { data: myResource } = trpc.resource.getMyResource.useQuery(undefined, { staleTime: 60_000, }); const resourceId = myResource?.id; const { data: vacations, isLoading, refetch } = trpc.vacation.list.useQuery( { resourceId, limit: 200 }, { enabled: !!resourceId, staleTime: 15_000 }, ); const cancelMutation = trpc.vacation.cancel.useMutation({ onSuccess: async () => { await utils.vacation.list.invalidate(); await utils.entitlement.getBalance.invalidate(); }, }); const vacationList = vacations ?? []; return (
{/* Header */}

My Vacations

Manage your personal vacation requests

{!resourceId && (
Your account is not linked to a resource. Please contact an administrator.
)} {/* Balance card */} {resourceId && ( )} {/* Calendar */} {resourceId && vacationList.length > 0 && ( )} {/* Vacation list */}
{isLoading ? (
Loading…
) : vacationList.length === 0 ? (
No vacation requests yet.
) : ( {vacationList.map((v) => { const start = new Date(v.startDate); const end = new Date(v.endDate); const days = Math.round((end.getTime() - start.getTime()) / 86_400_000) + 1; const status = v.status as string; const type = v.type as string; const vWithExtra = v as unknown as { rejectionReason?: string | null; isHalfDay?: boolean }; return ( ); })}
Type Start End Days Status Note
{TYPE_LABELS[type] ?? type} {start.toLocaleDateString("en-GB")} {end.toLocaleDateString("en-GB")} {vWithExtra.isHalfDay ? "0.5" : days} {status} {vWithExtra.rejectionReason ? ( {vWithExtra.rejectionReason} ) : (v.note ?? "—")} {(status === VacationStatus.PENDING || status === VacationStatus.APPROVED) && ( )}
)}
{showModal && resourceId && ( setShowModal(false)} onSuccess={() => { setShowModal(false); void refetch(); void utils.entitlement.getBalance.invalidate(); }} /> )}
); }