import { Card, CardContent, Badge } from "poyraz-ui/atoms"; import { CheckCircle2, Clock, CalendarDays, KanbanSquare } from "lucide-react"; import { formatDate } from "@/lib/i18n/format"; import { getSqliteConnection } from "@/server/db/client"; import { ContentTranslationService, getContentFallbackLocale } from "@/server/i18n/content"; import { resolvePortalLocale } from "@/server/i18n/resolver"; import { createTranslator } from "@/server/i18n/translator"; import { requirePortalBackend } from "@/server/web/portal"; export default async function PortalTasksPage() { const locale = await resolvePortalLocale(); const t = createTranslator(locale.locale, ["portal"]).t; const { actor, service } = await requirePortalBackend(); const content = new ContentTranslationService(getSqliteConnection().db); const localization = content.getPublicLocalizationContext(); const fallbackLocale = getContentFallbackLocale(locale.locale, localization); const projectRows = service.listProjects(actor); const projectTranslations = content.listBatch("project", projectRows.map((project) => project.id)); const projects = projectRows.map((project) => content.resolveEntity("project", project, { locale: locale.locale, fallbackLocale, defaultLocale: locale.defaultLocale, translations: projectTranslations.get(project.id) ?? [], })); const projectNames = new Map(projects.map((project) => [project.id, project.name])); const taskRows = service.listTasks(actor) .filter((task) => task.projectId && projectNames.has(task.projectId) && task.status !== "cancelled") .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()); const taskTranslations = content.listBatch("task", taskRows.map((task) => task.id)); const tasks = taskRows.map((task) => content.resolveEntity("task", task, { locale: locale.locale, fallbackLocale, defaultLocale: locale.defaultLocale, translations: taskTranslations.get(task.id) ?? [], })); return (

{t("portal.tasks.title")}

{tasks.length === 0 ? (
{t("portal.tasks.empty")}
) : tasks.map((task) => { const isDone = task.status === "done"; const date = task.dueAt?.toISOString() ?? task.scheduledDate; return (

{task.title}

{task.status === "todo" ? t("portal.status.task.todo") : task.status === "in_progress" ? t("portal.status.task.inProgress") : t("portal.status.task.done")}
{projectNames.get(task.projectId!)}
{task.description ? (

{task.description}

) : null}
{date ? formatDate(date, locale.locale) : t("portal.labels.noDate")}
{isDone ? : }
); })}
); }