import React, { useState, useEffect } from 'react'; import DropDownClosed from '../Assets/DropDownClosed'; import DropDownOpen from '../Assets/DropDownOpen'; import { useUserBookmarksQuery, useUserBookmarksByFolderQuery, useUpdateBookmarkFolderMutation, useDestroyBookmarkFolderMutation, useUpdateBookmarkMutation, useDestroyBookmarkMutation, LoadingDots, UserBookmarksQuery, UserBookmarksQueryResult, UserBookmarksByFolderQueryResult, UserBookmarksByFolderQuery } from '@thoughtindustries/content'; import { EditIcon, TrashIcon } from './Assets/Icons'; import { useTranslation } from 'react-i18next'; const LoadBookmarks = (): JSX.Element => { const { t } = useTranslation(); const [selectedFolderId, setSelectedFolderId] = useState(undefined); const [bookmarkList, setBookmarkList] = useState( undefined ); const { data: bookmarkFolders, loading, error, refetch: refetchBookmarkFolders } = useUserBookmarksQuery({ variables: {}, fetchPolicy: 'network-only' }); // Handle data updates in useEffect to avoid state updates during render useEffect(() => { if (bookmarkFolders?.UserBookmarks) { // Set selected folder if not already set if (!selectedFolderId && bookmarkFolders.UserBookmarks.length) { setSelectedFolderId(bookmarkFolders.UserBookmarks[0].id); } // Update bookmark list when data changes setBookmarkList(bookmarkFolders.UserBookmarks); } }, [bookmarkFolders, selectedFolderId]); type RequiredUserBookmarksQuery = Required; interface BookmarkFolderNameProps { folder: RequiredUserBookmarksQuery['UserBookmarks'][0]; refetchBookmarkFolders: UserBookmarksQueryResult['refetch']; } const BookmarkFolderName = ({ folder, refetchBookmarkFolders }: BookmarkFolderNameProps) => { const [editFolderName, setEditFolderName] = useState(false); const [folderName, setFolderName] = useState(folder.name); const [tryingToDelete, setTryingToDelete] = useState(false); const [updateBookmarkFolder] = useUpdateBookmarkFolderMutation(); const [destroyBookmarkFolder] = useDestroyBookmarkFolderMutation(); const handleDelete = () => { destroyBookmarkFolder({ variables: { id: folder.id } }).then(() => { refetchBookmarkFolders(); setEditFolderName(!editFolderName); }); }; const handleSave = () => { updateBookmarkFolder({ variables: { id: folder.id, name: folderName } }).then(() => { refetchBookmarkFolders(); setEditFolderName(!editFolderName); }); }; return ( <> {editFolderName && (
)} {!editFolderName && (
{/* bookmarks title */} {folderName}
setTryingToDelete(!tryingToDelete)} className="inline-block "> {!tryingToDelete && ( )} {tryingToDelete && ( {t('bookmark.delete-confirmation')} / )}
)} ); }; interface BookmarkItemsProps { folderId: string; } const BookmarkItems = ({ folderId }: BookmarkItemsProps): JSX.Element | null => { const { data: bookmarks, refetch: refetchBookmark } = useUserBookmarksByFolderQuery({ variables: { id: folderId }, fetchPolicy: 'network-only' }); if (!bookmarks || !bookmarks.UserBookmarksByFolder) return null; return ( <> {bookmarks.UserBookmarksByFolder.map(item => ( ))} ); }; type RequiredUserBookmarksByFolderQuery = Required; interface BookmarkItemProps { bookmark: RequiredUserBookmarksByFolderQuery['UserBookmarksByFolder'][0]; folderId: string; refetchBookmark: UserBookmarksByFolderQueryResult['refetch']; } const BookmarkItem = ({ bookmark, folderId, refetchBookmark }: BookmarkItemProps) => { const [listViewDropDown, setListViewDropDown] = useState(false); const [editNotes, setEditNotes] = useState(false); const [notes, setNotes] = useState(bookmark.note || ''); const [updateBookmarkNote] = useUpdateBookmarkMutation(); const [destroyBookmark] = useDestroyBookmarkMutation(); const handleDelete = () => { destroyBookmark({ variables: { id: bookmark.id } }).then(() => { refetchBookmark(); }); }; const handleSave = () => { updateBookmarkNote({ variables: { id: bookmark.id, note: notes, bookmarkFolder: folderId } }).then(() => { refetchBookmark(); setEditNotes(!editNotes); }); }; const kind = bookmark?.course?.courseGroup?.kind; let path = ''; if (kind != undefined) { if (['courseGroup', 'microCourse', 'webinarCourse', 'inPersonEventCourse'].includes(kind)) { path = `/learn/topic/${bookmark.topicId}/redirect`; } else { path = `/learn/${kind.toLowerCase()}/${'bookmark.course.slug'}`; } } return (
{/* course title */}
{bookmark.course.title}
{/* view button */}
{bookmark.note}
{t('bookmark.view')}
{listViewDropDown && (
{editNotes && (
setNotes(e.target.value)} value={notes} />

)} {!editNotes && (

{bookmark.note + ' '}

)}
)}
); }; if (loading) return ; if (error) return <>{error.message}; if (!bookmarkFolders || !bookmarkFolders.UserBookmarks) return <>; return (
{selectedFolderId && bookmarkList ?.filter(item => item.id === selectedFolderId) .map(folder => (
))}
); }; export default LoadBookmarks;