'use client' import {ChangeEvent, useContext, useEffect, useState} from 'react'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faArrowDown, faArrowUp, faBookmark, faMinus, faPlus, faTrash,} from '@fortawesome/free-solid-svg-icons'; import {ChapterListProps} from '@/lib/models/Chapter'; import System from '@/lib/models/System'; import {BookContext} from '@/context/BookContext'; import {SessionContext} from '@/context/SessionContext'; import {AlertContext} from '@/context/AlertContext'; import AlertBox from "@/components/AlertBox"; import CollapsableArea from "@/components/CollapsableArea"; import {useTranslations} from "next-intl"; import {LangContext} from "@/context/LangContext"; interface MainChapterProps { chapters: ChapterListProps[]; setChapters: React.Dispatch>; } export default function MainChapter({chapters, setChapters}: MainChapterProps) { const t = useTranslations(); const {lang} = useContext(LangContext) const {book} = useContext(BookContext); const {session} = useContext(SessionContext); const {errorMessage, successMessage} = useContext(AlertContext); const bookId: string | undefined = book?.bookId; const token: string = session.accessToken; const [newChapterTitle, setNewChapterTitle] = useState(''); const [newChapterOrder, setNewChapterOrder] = useState(0); const [deleteConfirmMessage, setDeleteConfirmMessage] = useState(false); const [chapterIdToRemove, setChapterIdToRemove] = useState(''); function handleChapterTitleChange(chapterId: string, newTitle: string) { const updatedChapters: ChapterListProps[] = chapters.map((chapter: ChapterListProps): ChapterListProps => { if (chapter.chapterId === chapterId) { return {...chapter, title: newTitle}; } return chapter; }); setChapters(updatedChapters); } function moveChapter(index: number, direction: number): void { const visibleChapters: ChapterListProps[] = chapters .filter((chapter: ChapterListProps): boolean => chapter.chapterOrder !== -1) .sort((a: ChapterListProps, b: ChapterListProps): number => (a.chapterOrder || 0) - (b.chapterOrder || 0)); const currentChapter: ChapterListProps = visibleChapters[index]; const allChaptersIndex: number = chapters.findIndex( (chapter: ChapterListProps): boolean => chapter.chapterId === currentChapter.chapterId, ); const updatedChapters: ChapterListProps[] = [...chapters]; const currentOrder: number = updatedChapters[allChaptersIndex].chapterOrder || 0; const newOrder: number = Math.max(0, currentOrder + direction); updatedChapters[allChaptersIndex] = { ...updatedChapters[allChaptersIndex], chapterOrder: newOrder, }; setChapters(updatedChapters); } function moveChapterUp(index: number): void { moveChapter(index, -1); } function moveChapterDown(index: number): void { moveChapter(index, 1); } async function deleteChapter(): Promise { try { setDeleteConfirmMessage(false); const response: boolean = await System.authDeleteToServer( 'chapter/remove', { bookId, chapterId: chapterIdToRemove, }, token, lang, ); if (!response) { errorMessage(t("mainChapter.errorDelete")); } const updatedChapters: ChapterListProps[] = chapters.filter((chapter: ChapterListProps): boolean => chapter.chapterId !== chapterIdToRemove,); setChapters(updatedChapters); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message) } else { errorMessage(t("mainChapter.errorUnknownDelete")); } } } async function addNewChapter(): Promise { if (newChapterTitle.trim() === '') { return; } try { const responseId: string = await System.authPostToServer( 'chapter/add', { bookId: bookId, wordsCount: 0, chapterOrder: newChapterOrder ? newChapterOrder : 0, title: newChapterTitle, }, token, ); if (!responseId) { errorMessage(t("mainChapter.errorAdd")); return; } const newChapter: ChapterListProps = { chapterId: responseId as string, title: newChapterTitle, chapterOrder: newChapterOrder, summary: '', goal: '', }; setChapters([...chapters, newChapter]); setNewChapterTitle(''); setNewChapterOrder(newChapterOrder + 1); } catch (e: unknown) { if (e instanceof Error) { errorMessage(e.message) } else { errorMessage(t("mainChapter.errorUnknownAdd")); } } } function decrementNewChapterOrder(): void { if (newChapterOrder > 0) { setNewChapterOrder(newChapterOrder - 1); } } function incrementNewChapterOrder(): void { setNewChapterOrder(newChapterOrder + 1); } useEffect((): void => { const visibleChapters: ChapterListProps[] = chapters .filter((chapter: ChapterListProps): boolean => chapter.chapterOrder !== -1) .sort((a: ChapterListProps, b: ChapterListProps): number => (a.chapterOrder || 0) - (b.chapterOrder || 0), ); const nextOrder: number = visibleChapters.length > 0 ? (visibleChapters[visibleChapters.length - 1].chapterOrder || 0) + 1 : 0; setNewChapterOrder(nextOrder); }, [chapters]); const visibleChapters: ChapterListProps[] = chapters .filter((chapter: ChapterListProps): boolean => chapter.chapterOrder !== -1) .sort((a: ChapterListProps, b: ChapterListProps): number => (a.chapterOrder || 0) - (b.chapterOrder || 0)); return (
{visibleChapters.length > 0 ? (
{visibleChapters.map((item: ChapterListProps, index: number) => (
{item.chapterOrder !== undefined ? item.chapterOrder : index} ) => handleChapterTitleChange(item.chapterId, e.target.value)} placeholder={t("mainChapter.chapterTitlePlaceholder")} />
))}
) : (

{t("mainChapter.noChapter")}

)}
{newChapterOrder}
setNewChapterTitle(e.target.value)} placeholder={t("mainChapter.newChapterPlaceholder")} />
}/> { deleteConfirmMessage && setDeleteConfirmMessage(false)}/> } ); }