import type { AppInfo, LibInfo } from "akanjs"; export default function getContent(scanInfo: AppInfo | LibInfo | null, dict: { appName: string }) { return { filename: "Task.Unit.tsx", content: `import { type cnst, usePage } from "@apps/${dict.appName}/client"; import { type ModelProps, clsx } from "akanjs/client"; import { Layout } from "akanjs/ui"; // ===== Task.Unit.tsx ===== // Convention: lib// — PascalCase .tsx, Unit suffix = card/list-item component. // Unit receives LightModel as props via the ModelProps generic from akanjs/client. // Wraps content in Layout.Unit — Akan.js convention for navigable cards in a list. // Uses usePage().l() for i18n — the framework convention for dictionary-based translations. // Enum values are accessed via l("taskStatus.todo") — dotted path to dictionary enum keys. // Invoked by Akan's data-loading zone chain: Task.Zone → Load.Units → Task.Unit. interface CardProps extends ModelProps<"task", cnst.LightTask> { className?: string; } export const Card = ({ task, className, href }: CardProps) => { const { l } = usePage(); const statusBadge = { todo: "badge-ghost", inProgress: "badge-primary", completed: "badge-success", }[task.status]; return (
{task.title} {l(\`taskStatus.\${task.status}\`)}
{task.due && (
{l("task.taskDueLabel")} {task.due.toDate().toLocaleDateString()}
)}
); }; // ---- Expandable additional fields: ---- // Mini: smaller inline display (tag, chip style) // export const Mini = ({ task }: MiniProps) => ( // // {task.status} // {task.title} // // ); // // Abstract: abstracted summary display (search results, previews) // export const Abstract = ({ task }: AbstractProps) => ( //
{task.title} — {l("taskStatus", task.status)}
// );`, }; }