Files
ERitors-Scribe-Desktop/components/book/settings/BookSettingOption.tsx
natreex ceaecb19fc Remove ExportBook component and integrate new export workflows
- Deleted `ExportBook` component and its usage in `BookCard.tsx`.
- Integrated improved book export workflows in `BookSettingOption` for better user experience.
- Updated database models and repositories to support export options with chapter/version selection.
- Added localization support for export-related messages and tooltips.
- Upgraded dependencies to include libraries required for export formats (e.g., DOCX, PDF, EPUB).
- Bumped app version to 0.4.1.
2026-03-05 16:31:56 -05:00

140 lines
5.5 KiB
TypeScript

'use client'
import React, {lazy, Suspense, useRef} from 'react';
import {faPen, faSave} from '@fortawesome/free-solid-svg-icons';
import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
import {faSpinner} from '@fortawesome/free-solid-svg-icons';
import {useTranslations} from 'next-intl';
import PanelHeader from '@/components/PanelHeader';
// Lazy loaded components - avec ref (anciens)
const BasicInformationSetting = lazy(function () {
return import('./BasicInformationSetting');
});
const GuideLineSetting = lazy(function () {
return import('./guide-line/GuideLineSetting');
});
const StorySetting = lazy(function () {
return import('./story/StorySetting');
});
const QuillSenseSetting = lazy(function () {
return import('./quillsense/QuillSenseSetting');
});
// Lazy loaded components - sans ref (nouveaux avec leur propre header)
const WorldSettings = lazy(function () {
return import('./world/settings/WorldSettings');
});
const LocationSettings = lazy(function () {
return import('./locations/settings/LocationSettings');
});
const CharacterSettings = lazy(function () {
return import('./characters/settings/CharacterSettings');
});
const SpellSettings = lazy(function () {
return import('./spells/settings/SpellSettings');
});
const ExportSetting = lazy(function () {
return import('./ExportSetting');
});
function LoadingSpinner(): React.JSX.Element {
return (
<div className="flex items-center justify-center py-12">
<FontAwesomeIcon icon={faSpinner} className="w-8 h-8 text-primary animate-spin"/>
</div>
);
}
interface BookSettingOptionProps {
setting: string;
}
interface SettingRef {
handleSave: () => Promise<void>;
}
// Settings qui gèrent leur propre save (pas de bouton save parent)
const selfManagedSettings: string[] = ['characters', 'spells', 'world', 'worlds', 'locations', 'export'];
export default function BookSettingOption({setting}: BookSettingOptionProps): React.JSX.Element {
const t = useTranslations();
const settingRef = useRef<SettingRef>(null);
const showSaveButton: boolean = !selfManagedSettings.includes(setting);
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 'quillsense':
return t("bookSettingOption.quillsense");
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 'export':
return t("bookSettingOption.export");
default:
return "";
}
}
async function handleSaveClick(): Promise<void> {
if (settingRef.current?.handleSave) {
await settingRef.current.handleSave();
}
}
return (
<div className="px-6">
<div className="sticky top-0 z-10 bg-tertiary pt-6 pb-4">
<PanelHeader
icon={faPen}
badge="BI"
title={renderTitle()}
description=""
secondActionCallback={showSaveButton ? handleSaveClick : undefined}
callBackAction={showSaveButton ? handleSaveClick : undefined}
secondActionIcon={showSaveButton ? faSave : undefined}
/>
</div>
<div className="bg-secondary/10 rounded-xl p-1 mb-6">
<Suspense fallback={<LoadingSpinner/>}>
{setting === 'basic-information' && <BasicInformationSetting ref={settingRef}/>}
{setting === 'guide-line' && <GuideLineSetting ref={settingRef}/>}
{setting === 'story' && <StorySetting ref={settingRef}/>}
{setting === 'quillsense' && <QuillSenseSetting ref={settingRef}/>}
{(setting === 'world' || setting === 'worlds') && (
<WorldSettings entityType="book" showToggle={true}/>
)}
{setting === 'locations' && (
<LocationSettings entityType="book" showToggle={true}/>
)}
{setting === 'characters' && (
<CharacterSettings entityType="book" showToggle={true}/>
)}
{setting === 'spells' && (
<SpellSettings entityType="book" showToggle={true}/>
)}
{setting === 'export' && (
<ExportSetting/>
)}
{!['basic-information', 'guide-line', 'story', 'world', 'worlds', 'locations', 'characters', 'spells', 'quillsense', 'export'].includes(setting) && (
<div className="text-text-secondary py-4 text-center">
{t("bookSettingOption.notAvailable")}
</div>
)}
</Suspense>
</div>
</div>
);
}