Files
ERitors-Scribe-Desktop/components/book/settings/BookSettingOption.tsx
natreex 9461eb6120 Add spell management to book settings
- Moved spell-related components to the `book/settings/spells` directory for better organization.
- Added "Spells" as a new tool in book settings and composer sidebar with localization support.
- Integrated spell-related UI elements (`SpellComponent`, `SpellList`, `SpellTagManager`) into settings and sidebars.
- Updated logic to handle enabling/disabling of the spells tool per book.
2026-01-19 23:00:33 -05:00

140 lines
5.7 KiB
TypeScript

import BasicInformationSetting from "./BasicInformationSetting";
import GuideLineSetting from "./guide-line/GuideLineSetting";
import StorySetting from "./story/StorySetting";
import WorldSetting from "@/components/book/settings/world/WorldSetting";
import {faPen, faSave} from "@fortawesome/free-solid-svg-icons";
import {RefObject, useRef} from "react";
import PanelHeader from "@/components/PanelHeader";
import LocationComponent from "@/components/book/settings/locations/LocationComponent";
import CharacterComponent from "@/components/book/settings/characters/CharacterComponent";
import SpellComponent from "@/components/book/settings/spells/SpellComponent";
import QuillSenseSetting from "@/components/book/settings/quillsense/QuillSenseSetting";
import {useTranslations} from "next-intl"; // Ajouté pour la traduction
export default function BookSettingOption(
{
setting,
}: {
setting: string;
}) {
const t = useTranslations(); // Ajouté pour la traduction
const basicInfoRef: RefObject<{ handleSave: () => Promise<void> } | null> = useRef<{
handleSave: () => Promise<void>
}>(null);
const guideLineRef: RefObject<{ handleSave: () => Promise<void> } | null> = useRef<{
handleSave: () => Promise<void>
}>(null);
const storyRef: RefObject<{ handleSave: () => Promise<void> } | null> = useRef<{
handleSave: () => Promise<void>
}>(null);
const worldRef: RefObject<{ handleSave: () => Promise<void> } | null> = useRef<{
handleSave: () => Promise<void>
}>(null);
const locationRef: RefObject<{ handleSave: () => Promise<void> } | null> = useRef<{
handleSave: () => Promise<void>
}>(null);
const characterRef: RefObject<{ handleSave: () => Promise<void> } | null> = useRef<{
handleSave: () => Promise<void>
}>(null);
const spellRef: RefObject<{ handleSave: () => Promise<void> } | null> = useRef<{
handleSave: () => Promise<void>
}>(null);
const quillSenseRef: RefObject<{ handleSave: () => Promise<void> } | null> = useRef<{
handleSave: () => Promise<void>
}>(null);
function renderTitle(): string {
switch (setting) {
case 'basic-information':
return t("bookSettingOption.basicInformation");
case 'guide-line':
return t("bookSettingOption.guideLine");
case 'story':
return t("bookSettingOption.storyPlan");
case 'world':
return t("bookSettingOption.manageWorlds");
case 'locations':
return t("bookSettingOption.yourLocations");
case 'characters':
return t("bookSettingOption.characters");
case 'spells':
return t("bookSettingOption.spells");
case 'objects':
return t("bookSettingOption.objectsList");
case 'goals':
return t("bookSettingOption.bookGoals");
case 'quillsense':
return t("bookSettingOption.quillsense");
default:
return "";
}
}
async function handleSaveClick(): Promise<void> {
switch (setting) {
case 'basic-information':
basicInfoRef.current?.handleSave();
break;
case 'guide-line':
guideLineRef.current?.handleSave();
break;
case 'story':
storyRef.current?.handleSave();
break;
case 'world':
worldRef.current?.handleSave();
break;
case 'locations':
locationRef.current?.handleSave();
break;
case 'characters':
characterRef.current?.handleSave();
break;
case 'spells':
spellRef.current?.handleSave();
break;
case 'quillsense':
quillSenseRef.current?.handleSave();
break;
default:
break;
}
}
return (
<div className="space-y-5">
<PanelHeader
icon={faPen}
badge={`BI`}
title={renderTitle()}
description={``}
secondActionCallback={handleSaveClick}
callBackAction={handleSaveClick}
secondActionIcon={faSave}
/>
<div className="bg-secondary/10 rounded-xl overflow-auto max-h-[calc(100vh-250px)] p-1">
{
setting === 'basic-information' ? (
<BasicInformationSetting ref={basicInfoRef}/>
) : setting === 'guide-line' ? (
<GuideLineSetting ref={guideLineRef}/>
) : setting === 'story' ? (
<StorySetting ref={storyRef}/>
) : setting === 'world' ? (
<WorldSetting ref={worldRef}/>
) : setting === 'locations' ? (
<LocationComponent ref={locationRef}/>
) : setting === 'characters' ? (
<CharacterComponent ref={characterRef}/>
) : setting === 'spells' ? (
<SpellComponent ref={spellRef}/>
) : setting === 'quillsense' ? (
<QuillSenseSetting ref={quillSenseRef}/>
) : <div
className="text-text-secondary py-4 text-center">{t("bookSettingOption.notAvailable")}</div>
}
</div>
</div>
)
}