import React, {useContext, useState} from "react"; const logo = "/eritors-favicon-white.png"; import {ChapterProps} from "@/lib/types/chapter"; import {chapterVersions} from "@/lib/constants/chapter"; import {ChapterContext, ChapterContextProps} from "@/context/ChapterContext"; import {BookContext, BookContextProps} from "@/context/BookContext"; import {apiGet} from '@/lib/api/client'; import {isDesktop} from '@/lib/configs'; import * as tauri from '@/lib/tauri'; import OfflineContext, {OfflineContextType} from '@/context/OfflineContext'; import {getCookie, setCookie} from '@/lib/utils/cookies'; import {useRouter} from "@/lib/navigation"; import UserMenu from "@/components/layout/UserMenu"; import {Globe, Home, Settings} from "lucide-react"; import IconButton from "@/components/ui/IconButton"; import ToggleGroup from "@/components/ui/ToggleGroup"; import {SelectBoxProps} from "@/components/form/SelectBox"; import ToolbarSelect from "@/components/form/ToolbarSelect"; import {AlertContext, AlertContextProps} from "@/context/AlertContext"; import {SessionContext, SessionContextProps} from "@/context/SessionContext"; import {booksToSelectBox} from "@/lib/utils/book"; import BookSetting from "@/components/book/settings/BookSetting"; import {useTranslations} from '@/lib/i18n'; import {isSupportedLocale, LangContext, LangContextProps, SupportedLocale} from "@/context/LangContext"; import CreditCounter from "@/components/ui/CreditMeters"; import {getSubLevel, isAnthropicEnabled} from "@/lib/utils/quillsense"; import {BooksSyncContext, BooksSyncContextProps} from "@/context/BooksSyncContext"; import OfflineToggle from "@/components/offline/OfflineToggle"; export default function ScribeControllerBar() { const {chapter, setChapter}: ChapterContextProps = useContext(ChapterContext); const {book}: BookContextProps = useContext(BookContext); const router = useRouter(); const {errorMessage}: AlertContextProps = useContext(AlertContext); const {session}: SessionContextProps = useContext(SessionContext); const t = useTranslations(); const {lang, setLang}: LangContextProps = useContext(LangContext) const {serverSyncedBooks, serverOnlyBooks, localOnlyBooks}: BooksSyncContextProps = useContext(BooksSyncContext); const {isCurrentlyOffline}: OfflineContextType = useContext(OfflineContext); const anthropicEnabled: boolean = !isCurrentlyOffline() && isAnthropicEnabled(session); const isSubTierTwo: boolean = !isCurrentlyOffline() && getSubLevel(session) >= 2; const hasAccess: boolean = anthropicEnabled || isSubTierTwo; const [showSettingPanel, setShowSettingPanel] = useState(false); async function handleChapterVersionChanged(version: number) { try { let response: ChapterProps; if (isDesktop && (isCurrentlyOffline() || book?.localBook)) { response = await tauri.getWholeChapter(chapter?.chapterId ?? '', version, book?.bookId ?? ''); } else { response = await apiGet(`chapter/whole`, session.accessToken, lang, { bookid: book?.bookId, id: chapter?.chapterId, version: version, }); } if (!response) { errorMessage(t("controllerBar.chapterNotFound")); return; } setChapter(response); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message); } else { errorMessage(t("controllerBar.unknownChapterError")); } } } function handleBookNavigation(bookId: string): void { router.push(`/book/${bookId}`); } function handleLanguageChange(language: SupportedLocale): void { setCookie('lang', language, 365); const newLang: string | null = getCookie('lang'); if (newLang && isSupportedLocale(newLang)) { setLang(language); } } return (
{/* Gauche : Logo + contrôles */}
{t("scribeTopBar.logoAlt")} Scribe
{book && ( setShowSettingPanel(true)}/> )} {book && ( router.push('/')}/> )}
handleBookNavigation(e.target.value)} data={booksToSelectBox([...(serverSyncedBooks ?? []), ...(serverOnlyBooks ?? []), ...(localOnlyBooks ?? [])])} defaultValue={book?.bookId} placeholder={t("controllerBar.selectBook")}/> {chapter && ( handleChapterVersionChanged(parseInt(e.target.value))} data={chapterVersions.filter((version: SelectBoxProps): boolean => { return !(version.value === '1' && (!hasAccess || book?.quillsenseEnabled === false)); }).map((version: SelectBoxProps) => { return { value: version.value.toString(), label: t(version.label) } })} defaultValue={chapter?.chapterContent.version.toString()}/> )}
{/* Centre : Titre du livre */} {book && (
{book.title} {book.subTitle && ( {book.subTitle} )}
)} {/* Droite : Crédits, offline, langue, user */}
{ hasAccess && book?.quillsenseEnabled !== false && } {isDesktop && }
{showSettingPanel && setShowSettingPanel(false)}/>}
) }