Files
ERitors-Scribe-Desktop/lib/models/Book.ts
natreex 43c7ef375c Refactor ScribeChapterComponent and offline handlers for seamless local and server operations
- Add stricter typings (`RefObject`) and improve type safety.
- Introduce conditional logic for `localBook` to
2025-12-19 10:39:59 -05:00

194 lines
5.1 KiB
TypeScript

import {Author} from './User';
import {ActChapter, ChapterProps} from "@/lib/models/Chapter";
import {SelectBoxProps} from "@/shared/interface";
import {
BookActSummariesTable,
BookAIGuideLineTable,
BookChapterContentTable, BookChapterInfosTable,
BookChaptersTable, BookCharactersAttributesTable, BookCharactersTable, BookGuideLineTable, BookIncidentsTable,
BookIssuesTable, BookLocationTable, BookPlotPointsTable, BookWorldElementsTable, BookWorldTable,
EritBooksTable, LocationElementTable, LocationSubElementTable
} from "@/lib/models/BookTables";
import {
SyncedActSummary, SyncedAIGuideLine,
SyncedChapter,
SyncedCharacter, SyncedGuideLine,
SyncedIncident, SyncedIssue,
SyncedLocation,
SyncedPlotPoint,
SyncedWorld
} from "@/lib/models/SyncedBook";
export interface CompleteBook {
eritBooks: EritBooksTable[];
actSummaries: BookActSummariesTable[];
aiGuideLine: BookAIGuideLineTable[];
chapters: BookChaptersTable[];
chapterContents: BookChapterContentTable[];
chapterInfos: BookChapterInfosTable[];
characters: BookCharactersTable[];
characterAttributes: BookCharactersAttributesTable[];
guideLine: BookGuideLineTable[];
incidents: BookIncidentsTable[];
issues: BookIssuesTable[];
locations: BookLocationTable[];
plotPoints: BookPlotPointsTable[];
worlds: BookWorldTable[];
worldElements: BookWorldElementsTable[];
locationElements: LocationElementTable[];
locationSubElements: LocationSubElementTable[];
}
export interface SyncedBook {
id: string;
type: string;
title: string;
subTitle: string | null;
lastUpdate: number;
chapters: SyncedChapter[];
characters: SyncedCharacter[];
locations: SyncedLocation[];
worlds: SyncedWorld[];
incidents: SyncedIncident[];
plotPoints: SyncedPlotPoint[];
issues: SyncedIssue[];
actSummaries: SyncedActSummary[];
guideLine: SyncedGuideLine | null;
aiGuideLine: SyncedAIGuideLine | null;
}
export interface BookProps {
bookId: string;
type: string;
title: string;
author?: Author;
serie?: number;
subTitle?: string;
summary?: string;
publicationDate?: string;
desiredWordCount?: number;
totalWordCount?: number;
coverImage?: string;
localBook?: boolean;
chapters?: ChapterProps[];
}
export interface BookListProps {
id: string;
type: string;
authorId: string;
title: string;
subTitle?: string;
summary?: string;
serieId?: number;
desiredReleaseDate?: string;
desiredWordCount?: number;
wordCount?: number;
coverImage?: string;
bookMeta?: string;
itIsLocal?: boolean;
}
export interface GuideLine {
tone: string;
atmosphere: string;
writingStyle: string;
themes: string;
symbolism: string;
motifs: string;
narrativeVoice: string;
pacing: string;
intendedAudience: string;
keyMessages: string;
}
export interface GuideLineAI {
narrativeType: number|null;
dialogueType: number|null;
globalResume: string|null;
atmosphere: string|null;
verbeTense: number|null;
langue: number|null;
currentResume: string|null;
themes: string|null;
}
export interface PlotPoint {
plotPointId: string;
title: string;
summary: string;
linkedIncidentId: string;
chapters?: ActChapter[];
}
export interface Incident {
incidentId: string;
title: string;
summary: string;
chapters?: ActChapter[];
}
export interface Issue {
name: string;
id: string;
}
export interface Act {
id: number;
summary: string | null;
incidents?: Incident[];
plotPoints?: PlotPoint[];
chapters?: ActChapter[];
}
export interface Tag {
label: string,
value: string,
}
export interface BookTags {
characters: Tag[];
locations: Tag[];
objects: Tag[];
worldElements: Tag[];
}
export const bookTypes: SelectBoxProps[] = [
{label: 'bookTypes.short', value: 'short'},
{label: 'bookTypes.novelette', value: 'novelette'},
{label: 'bookTypes.novella', value: 'long'},
{label: 'bookTypes.chapbook', value: 'chapbook'},
{label: 'bookTypes.novel', value: 'novel'},
]
export default class Book {
constructor() {
}
static booksToSelectBox(books: SyncedBook[]): SelectBoxProps[] {
return books.map((book: SyncedBook):SelectBoxProps => {
return {
label: book.title,
value: book.id,
}
});
}
static getBookTypeLabel(value: string): string {
switch (value) {
case 'short':
return 'bookTypes.short';
case 'novelette':
return 'bookTypes.novelette';
case 'long':
return 'bookTypes.novella';
case 'chapbook':
return 'bookTypes.chapbook';
case 'novel':
return 'bookTypes.novel';
default:
return 'bookTypes.novel';
}
}
}