ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

86 lines
2.5 KiB

  1. import { useEffect, useState } from 'react'
  2. import PostFormTagsArea from '@/components/PostFormTagsArea'
  3. import PostOriginalCreatedTimeField from '@/components/PostOriginalCreatedTimeField'
  4. import Label from '@/components/common/Label'
  5. import { Button } from '@/components/ui/button'
  6. import { apiPut } from '@/lib/api'
  7. import type { FC } from 'react'
  8. import type { Post, Tag } from '@/types'
  9. const tagsToStr = (tags: Tag[]): string => {
  10. const result: Tag[] = []
  11. const walk = (tag: Tag) => {
  12. const { children, ...rest } = tag
  13. result.push (rest)
  14. children?.forEach (walk)
  15. }
  16. tags.filter (t => t.category !== 'nico').forEach (walk)
  17. return [...(new Set (result.map (t => t.name)))].join (' ')
  18. }
  19. type Props = { post: Post
  20. onSave: (newPost: Post) => void }
  21. export default (({ post, onSave }: Props) => {
  22. const [originalCreatedBefore, setOriginalCreatedBefore] =
  23. useState<string | null> (post.originalCreatedBefore)
  24. const [originalCreatedFrom, setOriginalCreatedFrom] =
  25. useState<string | null> (post.originalCreatedFrom)
  26. const [title, setTitle] = useState (post.title)
  27. const [tags, setTags] = useState<string> ('')
  28. const handleSubmit = async () => {
  29. const data = await apiPut<Post> (
  30. `/posts/${ post.id }`,
  31. { title, tags, original_created_from: originalCreatedFrom,
  32. original_created_before: originalCreatedBefore },
  33. { headers: { 'Content-Type': 'multipart/form-data' } })
  34. onSave ({ ...post,
  35. title: data.title,
  36. tags: data.tags,
  37. originalCreatedFrom: data.originalCreatedFrom,
  38. originalCreatedBefore: data.originalCreatedBefore } as Post)
  39. }
  40. useEffect (() => {
  41. setTags(tagsToStr (post.tags))
  42. }, [post])
  43. return (
  44. <div className="max-w-xl pt-2 space-y-4">
  45. {/* タイトル */}
  46. <div>
  47. <Label>タイトル</Label>
  48. <input type="text"
  49. className="w-full border rounded p-2"
  50. value={title}
  51. onChange={ev => setTitle (ev.target.value)}/>
  52. </div>
  53. {/* タグ */}
  54. <PostFormTagsArea tags={tags} setTags={setTags}/>
  55. {/* オリジナルの作成日時 */}
  56. <PostOriginalCreatedTimeField
  57. originalCreatedFrom={originalCreatedFrom}
  58. setOriginalCreatedFrom={setOriginalCreatedFrom}
  59. originalCreatedBefore={originalCreatedBefore}
  60. setOriginalCreatedBefore={setOriginalCreatedBefore}/>
  61. {/* 送信 */}
  62. <Button onClick={handleSubmit}
  63. className="px-4 py-2 bg-blue-600 text-white rounded disabled:bg-gray-400">
  64. 更新
  65. </Button>
  66. </div>)
  67. }) satisfies FC<Props>