You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
'use client'
|
|
|
|
import { Card, CardHeader } from '@nextui-org/card'
|
|
import { Link } from '@nextui-org/link'
|
|
import { Image } from '@nextui-org/image'
|
|
import { Icon } from '@iconify/react'
|
|
import { Button } from '@nextui-org/button'
|
|
import {
|
|
Dropdown,
|
|
DropdownTrigger,
|
|
DropdownMenu,
|
|
DropdownItem,
|
|
} from '@nextui-org/dropdown'
|
|
import { useRouter } from 'next/navigation'
|
|
|
|
import { type Bookmark } from '@/types'
|
|
import { useContext } from 'react'
|
|
import { BookmarkContext, EditBookmarkContext } from '@/app/providers'
|
|
|
|
export const BookmarkCard = ({ data }: { data: Bookmark }) => {
|
|
const { onIsEditBookmark } = useContext(EditBookmarkContext)
|
|
const { bookmark, setBookmark } = useContext(BookmarkContext)
|
|
|
|
const router = useRouter()
|
|
const deleteBookmark = async (event: React.MouseEvent, id: Number) => {
|
|
event.stopPropagation()
|
|
await fetch('/api/bookmark', {
|
|
method: 'DELETE',
|
|
body: JSON.stringify({ bookmarkId: id }),
|
|
})
|
|
router.refresh()
|
|
}
|
|
const editBookmark = (selectedBookmark: Bookmark) => {
|
|
setBookmark({ ...bookmark, ...selectedBookmark })
|
|
onIsEditBookmark()
|
|
}
|
|
return (
|
|
<>
|
|
<Card className='w-96 grow select-none'>
|
|
<CardHeader className='flex gap-3'>
|
|
<Image
|
|
alt='nextui logo'
|
|
height={40}
|
|
radius='sm'
|
|
src='https://avatars.githubusercontent.com/u/86160567?s=200&v=4'
|
|
width={40}
|
|
removeWrapper
|
|
/>
|
|
<Link
|
|
isExternal
|
|
href={data.url}
|
|
color='foreground'
|
|
className='flex grow flex-col items-start'>
|
|
<p className='text-md'>{data.name}</p>
|
|
<p className='text-small text-default-500'>
|
|
{data.url}
|
|
</p>
|
|
</Link>
|
|
<Dropdown>
|
|
<DropdownTrigger>
|
|
<Button
|
|
variant='light'
|
|
isIconOnly>
|
|
<Icon
|
|
icon='mdi:dots-vertical'
|
|
fontSize={24}
|
|
/>
|
|
</Button>
|
|
</DropdownTrigger>
|
|
<DropdownMenu aria-label='Static Actions'>
|
|
<DropdownItem
|
|
key='edit'
|
|
onPress={() => editBookmark(data)}>
|
|
Edit Bookmark
|
|
</DropdownItem>
|
|
<DropdownItem
|
|
key='delete'
|
|
className='text-danger'
|
|
color='danger'
|
|
onClick={(event) =>
|
|
deleteBookmark(event, data.id)
|
|
}>
|
|
Delete Bookmark
|
|
</DropdownItem>
|
|
</DropdownMenu>
|
|
</Dropdown>
|
|
</CardHeader>
|
|
</Card>
|
|
</>
|
|
)
|
|
}
|