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.
160 lines
3.7 KiB
TypeScript
160 lines
3.7 KiB
TypeScript
'use client'
|
|
|
|
import {
|
|
Modal,
|
|
ModalContent,
|
|
ModalHeader,
|
|
ModalBody,
|
|
ModalFooter,
|
|
} from '@nextui-org/modal'
|
|
import {
|
|
Dropdown,
|
|
DropdownItem,
|
|
DropdownMenu,
|
|
DropdownTrigger,
|
|
} from '@nextui-org/dropdown'
|
|
import { Button } from '@nextui-org/button'
|
|
import { Input } from '@nextui-org/input'
|
|
import { Icon } from '@iconify/react'
|
|
import { useRouter } from 'next/navigation'
|
|
import { useContext, useState } from 'react'
|
|
import { BookmarkContext, EditBookmarkContext } from '@/app/providers'
|
|
import { ChevronDownIcon } from './ChevronDownIcon'
|
|
|
|
export default function EditBookmarkForm() {
|
|
const { isEditBookmark, onIsEditBookmarkChange } =
|
|
useContext(EditBookmarkContext)
|
|
const { bookmark, setBookmark } = useContext(BookmarkContext)
|
|
|
|
const router = useRouter()
|
|
const onSubmit = async () => {
|
|
const body = {
|
|
...bookmark,
|
|
category_id: selectedKey === 'Other' ? 2 : 1,
|
|
}
|
|
|
|
await fetch('/api/bookmark', {
|
|
method: 'PATCH',
|
|
body: JSON.stringify(body),
|
|
})
|
|
onIsEditBookmarkChange()
|
|
router.refresh()
|
|
}
|
|
|
|
const [selectedKey, setSelectedKey] = useState(
|
|
bookmark.category_id == 2 ? 'Other' : 'Coding'
|
|
)
|
|
|
|
return (
|
|
<>
|
|
<Modal
|
|
isOpen={isEditBookmark}
|
|
onOpenChange={onIsEditBookmarkChange}
|
|
placement='top-center'
|
|
hideCloseButton>
|
|
<ModalContent
|
|
onKeyUp={(e) => {
|
|
if (e.key === 'Enter') onSubmit()
|
|
}}>
|
|
{(onClose) => (
|
|
<>
|
|
<ModalHeader className='flex gap-2'>
|
|
Edit Bookmark
|
|
<Icon
|
|
icon='mdi:bookmark-box'
|
|
fontSize={30}
|
|
/>
|
|
</ModalHeader>
|
|
<ModalBody className='gap-4'>
|
|
<Dropdown>
|
|
<DropdownTrigger className='hidden justify-start sm:flex'>
|
|
<Button
|
|
startContent={
|
|
<span className='text-default-400'>
|
|
Category:
|
|
</span>
|
|
}
|
|
endContent={
|
|
<ChevronDownIcon className='text-small' />
|
|
}
|
|
variant='flat'>
|
|
<div className='w-full text-start'>
|
|
{selectedKey}
|
|
</div>
|
|
</Button>
|
|
</DropdownTrigger>
|
|
<DropdownMenu
|
|
disallowEmptySelection
|
|
selectionMode='single'
|
|
selectedKeys={selectedKey}
|
|
disabledKeys={['disabled']}>
|
|
<DropdownItem
|
|
key='disabled'
|
|
className='capitalize'>
|
|
Select Category
|
|
</DropdownItem>
|
|
<DropdownItem
|
|
key='Coding'
|
|
onClick={() => {
|
|
setSelectedKey('Coding')
|
|
}}
|
|
className='capitalize'>
|
|
Coding
|
|
</DropdownItem>
|
|
<DropdownItem
|
|
key='Other'
|
|
onClick={() => {
|
|
setSelectedKey('Other')
|
|
}}
|
|
className='capitalize'>
|
|
Other
|
|
</DropdownItem>
|
|
</DropdownMenu>
|
|
</Dropdown>
|
|
<Input
|
|
autoFocus
|
|
label='Name'
|
|
placeholder='Enter Name'
|
|
variant='bordered'
|
|
value={bookmark.name}
|
|
onChange={(event) => {
|
|
setBookmark({
|
|
...bookmark,
|
|
name: event.target.value,
|
|
})
|
|
}}
|
|
/>
|
|
<Input
|
|
label='Url'
|
|
placeholder='Enter Url'
|
|
variant='bordered'
|
|
value={bookmark.url}
|
|
onChange={(event) => {
|
|
setBookmark({
|
|
...bookmark,
|
|
url: event.target.value,
|
|
})
|
|
}}
|
|
/>
|
|
</ModalBody>
|
|
<ModalFooter>
|
|
<Button
|
|
color='danger'
|
|
variant='flat'
|
|
onClick={onClose}>
|
|
Close
|
|
</Button>
|
|
<Button
|
|
color='primary'
|
|
onPress={onSubmit}>
|
|
Update
|
|
</Button>
|
|
</ModalFooter>
|
|
</>
|
|
)}
|
|
</ModalContent>
|
|
</Modal>
|
|
</>
|
|
)
|
|
}
|