Files
kandev/apps/web/lib/ssr/mapper.ts
T
2026-01-16 01:59:00 +00:00

56 lines
1.5 KiB
TypeScript

import type { AppState, KanbanState } from '@/lib/state/store';
import type { BoardSnapshot, Message, Task } from '@/lib/types/http';
type KanbanTask = KanbanState['tasks'][number];
export function snapshotToState(snapshot: BoardSnapshot): Partial<AppState> {
const tasks = snapshot.tasks
.map((task) => {
const columnId = task.column_id;
if (!columnId) return null;
return {
id: task.id,
columnId,
title: task.title,
description: task.description ?? undefined,
position: task.position ?? 0,
state: task.state,
repositoryId: task.repositories?.[0]?.repository_id ?? undefined,
} as KanbanTask;
})
.filter((task): task is KanbanTask => task !== null);
return {
kanban: {
boardId: snapshot.board.id,
columns: snapshot.columns.map((column) => ({
id: column.id,
title: column.name,
color: column.color ?? 'bg-neutral-400',
position: column.position,
})),
tasks,
},
};
}
export function taskToState(
task: Task,
messages?: { items: Message[]; hasMore?: boolean; oldestCursor?: string | null }
): Partial<AppState> {
return {
tasks: {
activeTaskId: task.id,
},
messages: messages
? {
sessionId: messages.items[0]?.task_session_id ?? null,
items: messages.items,
isLoading: false,
hasMore: messages.hasMore ?? false,
oldestCursor: messages.oldestCursor ?? (messages.items[0]?.id ?? null),
}
: undefined,
};
}