diff --git a/src/webapp/features/cards/components/urlCardActions/UrlCardActions.tsx b/src/webapp/features/cards/components/urlCardActions/UrlCardActions.tsx index 21750703..fcb6e77d 100644 --- a/src/webapp/features/cards/components/urlCardActions/UrlCardActions.tsx +++ b/src/webapp/features/cards/components/urlCardActions/UrlCardActions.tsx @@ -130,7 +130,7 @@ export default function UrlCardActions(props: Props) { isOpen={showNoteModal} onClose={() => setShowNoteModal(false)} note={props.note} - urlCardContent={props.cardContent} + cardContent={props.cardContent} cardAuthor={props.cardAuthor} /> diff --git a/src/webapp/features/notes/components/noteCardModal/NoteCardModal.tsx b/src/webapp/features/notes/components/noteCardModal/NoteCardModal.tsx index 61f8a9fc..ccff678a 100644 --- a/src/webapp/features/notes/components/noteCardModal/NoteCardModal.tsx +++ b/src/webapp/features/notes/components/noteCardModal/NoteCardModal.tsx @@ -1,30 +1,21 @@ import type { UrlCard, User } from '@/api-client'; import { getDomain } from '@/lib/utils/link'; import { UPDATE_OVERLAY_PROPS } from '@/styles/overlays'; -import { - Anchor, - AspectRatio, - Card, - Group, - Modal, - Stack, - Text, - Image, - Tooltip, - Avatar, -} from '@mantine/core'; -import Link from 'next/link'; +import { Modal, Text } from '@mantine/core'; +import NoteCardModalContent from './NoteCardModalContent'; +import { Suspense } from 'react'; +import NoteCardModalContentSkeleton from './Skeleton.NoteCardModalContent'; interface Props { isOpen: boolean; onClose: () => void; note: UrlCard['note']; - urlCardContent: UrlCard['cardContent']; + cardContent: UrlCard['cardContent']; cardAuthor?: User; } export default function NoteCardModal(props: Props) { - const domain = getDomain(props.urlCardContent.url); + const domain = getDomain(props.cardContent.url); return ( e.stopPropagation()} > - - {props.cardAuthor && ( - - - - {props.cardAuthor.name} - - - )} - {props.note && {props.note.text}} - - - - {props.urlCardContent.thumbnailUrl && ( - - {`${props.urlCardContent.url} - - )} - - - - {domain} - - - {props.urlCardContent.title && ( - - {props.urlCardContent.title} - - )} - - - - - + }> + + ); } diff --git a/src/webapp/features/notes/components/noteCardModal/NoteCardModalContent.tsx b/src/webapp/features/notes/components/noteCardModal/NoteCardModalContent.tsx new file mode 100644 index 00000000..9888d420 --- /dev/null +++ b/src/webapp/features/notes/components/noteCardModal/NoteCardModalContent.tsx @@ -0,0 +1,168 @@ +import useGetCardFromMyLibrary from '@/features/cards/lib/queries/useGetCardFromMyLibrary'; +import { + Anchor, + AspectRatio, + Avatar, + Card, + Group, + Stack, + Tooltip, + Text, + Image, + Textarea, + Button, +} from '@mantine/core'; +import { UrlCard, User } from '@semble/types'; +import Link from 'next/link'; +import { useState } from 'react'; +import useUpdateNote from '../../lib/mutations/useUpdateNote'; +import { notifications } from '@mantine/notifications'; + +interface Props { + note: UrlCard['note']; + cardContent: UrlCard['cardContent']; + cardAuthor?: User; + domain: string; +} + +export default function NoteCardModalContent(props: Props) { + const cardStatus = useGetCardFromMyLibrary({ url: props.cardContent.url }); + const isMyCard = props.cardAuthor?.id === cardStatus.data.card?.author.id; + const [note, setNote] = useState(isMyCard ? props.note?.text : ''); + const [editMode, setEditMode] = useState(false); + + const updateNote = useUpdateNote(); + + const handleUpdateNote = () => { + if (!props.note || !note) return; + + updateNote.mutate( + { + cardId: props.note?.id, + note: note, + }, + { + onError: () => { + notifications.show({ + message: 'Could not update note.', + position: 'top-center', + }); + }, + onSettled: () => { + setEditMode(false); + }, + }, + ); + }; + + if (editMode) { + return ( + +