Add display frames and improve create-page page management.

Store phone/tablet/photo-frame shells with catalogs, append pages from extra images or PDFs, and reorder drafts with drag-and-drop.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-20 14:20:16 +03:30
co-authored by Cursor
parent 16cd3197ef
commit c236b0f621
23 changed files with 1069 additions and 134 deletions
+10 -3
View File
@@ -1,6 +1,6 @@
import { eq } from "drizzle-orm";
import type { EffectId } from "../shared/types";
import { DEFAULT_FLIP_MS } from "../shared/types";
import type { EffectId, FrameId } from "../shared/types";
import { DEFAULT_FLIP_MS, DEFAULT_FRAME, isFrameId } from "../shared/types";
import type { DbBundle } from "./db";
import { catalogsTable } from "./schema";
@@ -9,22 +9,26 @@ export type CatalogRow = {
deleteToken: string;
title: string;
effect: EffectId;
frame: FrameId;
pageCount: number;
flipMs: number;
createdAt: string;
};
export type CatalogInsert = Omit<CatalogRow, "createdAt" | "flipMs"> & {
export type CatalogInsert = Omit<CatalogRow, "createdAt" | "flipMs" | "frame"> & {
createdAt?: string;
flipMs?: number;
frame?: FrameId;
};
function toRow(record: typeof catalogsTable.$inferSelect): CatalogRow {
const frameRaw = record.frame ?? DEFAULT_FRAME;
return {
id: record.id,
deleteToken: record.deleteToken,
title: record.title,
effect: record.effect as EffectId,
frame: isFrameId(frameRaw) ? frameRaw : DEFAULT_FRAME,
pageCount: record.pageCount,
flipMs: record.flipMs ?? DEFAULT_FLIP_MS,
createdAt: record.createdAt,
@@ -36,6 +40,7 @@ export function createCatalogRepo(db: DbBundle) {
create(input: CatalogInsert): CatalogRow {
const createdAt = input.createdAt ?? new Date().toISOString();
const flipMs = input.flipMs ?? DEFAULT_FLIP_MS;
const frame = input.frame ?? DEFAULT_FRAME;
db.drizzle.insert(catalogsTable).values({
id: input.id,
deleteToken: input.deleteToken,
@@ -43,6 +48,7 @@ export function createCatalogRepo(db: DbBundle) {
effect: input.effect,
pageCount: input.pageCount,
flipMs,
frame,
createdAt,
}).run();
db.persist();
@@ -51,6 +57,7 @@ export function createCatalogRepo(db: DbBundle) {
deleteToken: input.deleteToken,
title: input.title,
effect: input.effect,
frame,
pageCount: input.pageCount,
flipMs,
createdAt,