diff --git a/app/page.tsx b/app/page.tsx index 996ee61..a32a969 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -162,6 +162,8 @@ function ScribeContent() { useEffect((): void => { if (currentBook) { getLastChapter().then(); + } else { + getBooks().then(); } }, [currentBook]); diff --git a/components/UserMenu.tsx b/components/UserMenu.tsx index 97f0148..c7fe70f 100644 --- a/components/UserMenu.tsx +++ b/components/UserMenu.tsx @@ -2,9 +2,11 @@ import {useContext, useEffect, useRef, useState} from "react"; import {SessionContext} from "@/context/SessionContext"; import NoPicture from "@/components/NoPicture"; import System from "@/lib/models/System"; +import {useTranslations} from "next-intl"; export default function UserMenu() { const {session} = useContext(SessionContext); + const t = useTranslations(); const profileMenuRef: React.RefObject = useRef(null); @@ -32,15 +34,8 @@ export default function UserMenu() { async function handleLogout(): Promise { System.removeCookie("token"); - - // Si dans Electron, utiliser IPC pour logout - if (window.electron) { - await window.electron.removeToken(); - window.electron.logout(); - } else { - // Fallback web - document.location.href = "https://eritors.com/login"; - } + await window.electron.removeToken(); + window.electron.logout(); } return ( @@ -64,11 +59,11 @@ export default function UserMenu() { Paramètres + className="text-sm font-medium group-hover:text-primary transition-colors">{t('userMenu.settings')} - Déconnexion + {t('userMenu.logout')} )} diff --git a/components/editor/TextEditor.tsx b/components/editor/TextEditor.tsx index 0154a41..4027a0f 100644 --- a/components/editor/TextEditor.tsx +++ b/components/editor/TextEditor.tsx @@ -15,7 +15,8 @@ import { faListOl, faListUl, faParagraph, - faUnderline + faUnderline, + faXmark } from '@fortawesome/free-solid-svg-icons'; import {EditorContext} from "@/context/EditorContext"; import {ChapterContext} from '@/context/ChapterContext'; @@ -135,8 +136,8 @@ export default function TextEditor() { const t = useTranslations(); const {lang} = useContext(LangContext) const {editor} = useContext(EditorContext); - const {chapter} = useContext(ChapterContext); - const {book} = useContext(BookContext); + const {chapter, setChapter} = useContext(ChapterContext); + const {book, setBook} = useContext(BookContext); const {errorMessage, successMessage} = useContext(AlertContext); const {session} = useContext(SessionContext); const {isCurrentlyOffline} = useContext(OfflineContext); @@ -146,6 +147,7 @@ export default function TextEditor() { const [showGhostWriter, setShowGhostWriter] = useState(false); const [showUserSettings, setShowUserSettings] = useState(false); const [isSaving, setIsSaving] = useState(false); + const [isClosing, setIsClosing] = useState(false); const [editorSettings, setEditorSettings] = useState(DEFAULT_EDITOR_SETTINGS); const [editorClasses, setEditorClasses] = useState({ base: 'text-lg font-serif leading-normal', @@ -351,6 +353,14 @@ export default function TextEditor() { setShowDraftCompanion(false); setShowGhostWriter(false); }, []); + + const handleCloseBook: () => Promise = useCallback(async (): Promise => { + setIsClosing(true); + await saveContent(); + setBook && setBook(null); + setChapter && setChapter(undefined); + setIsClosing(false); + }, [saveContent, setBook, setChapter]); useEffect((): void => { if (!editor) return; @@ -454,25 +464,25 @@ export default function TextEditor() { return (
-
+ className={`flex justify-between gap-2 lg:gap-3 border-b border-secondary/30 px-2 lg:px-4 py-2 lg:py-3 bg-gradient-to-b from-dark-background/80 to-dark-background/50 backdrop-blur-sm transition-opacity duration-300 shadow-md overflow-x-auto ${editorSettings.focusMode ? 'opacity-70 hover:opacity-100' : ''}`}> +
{toolbarButtons.map((button: ToolbarButton, index: number) => ( ))}
-
+
)} - + +
diff --git a/components/offline/OfflinePinVerify.tsx b/components/offline/OfflinePinVerify.tsx index 96828bb..8586831 100644 --- a/components/offline/OfflinePinVerify.tsx +++ b/components/offline/OfflinePinVerify.tsx @@ -3,7 +3,8 @@ import { useState } from 'react'; import { useTranslations } from 'next-intl'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faLock, faWifi, faEye, faEyeSlash } from '@fortawesome/free-solid-svg-icons'; +import { faLock, faWifi, faEye, faEyeSlash, faSignOutAlt } from '@fortawesome/free-solid-svg-icons'; +import System from '@/lib/models/System'; interface OfflinePinVerifyProps { onSuccess: (userId: string) => void; @@ -59,6 +60,12 @@ export default function OfflinePinVerify({ onSuccess, onCancel }: OfflinePinVeri } }; + const handleLogout = async () => { + System.removeCookie("token"); + await window.electron.removeToken(); + window.electron.logout(); + }; + return (
@@ -118,6 +125,14 @@ export default function OfflinePinVerify({ onSuccess, onCancel }: OfflinePinVeri {/* Actions */}
+ {onCancel && (