ぼざクリタグ広場 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.
 
 
 
 
 
 

91 lines
2.7 KiB

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