dceed1caa1
Merge remote-tracking branch 'origin/main' into feature/046 #46 #46 #46 #46 #46 #46 Co-authored-by: miteruzo <miteruzo@naver.com> Reviewed-on: #339
111 lines
3.2 KiB
TypeScript
111 lines
3.2 KiB
TypeScript
import { useEffect, useState } from 'react'
|
|
|
|
import PostFormTagsArea from '@/components/PostFormTagsArea'
|
|
import PostOriginalCreatedTimeField from '@/components/PostOriginalCreatedTimeField'
|
|
import Label from '@/components/common/Label'
|
|
import { Button } from '@/components/ui/button'
|
|
import { toast } from '@/components/ui/use-toast'
|
|
import { apiPut } from '@/lib/api'
|
|
|
|
import type { FC } from 'react'
|
|
|
|
import type { Post, Tag } from '@/types'
|
|
|
|
|
|
const tagsToStr = (tags: Tag[]): string => {
|
|
const result: Tag[] = []
|
|
|
|
const walk = (tag: Tag) => {
|
|
const { children, ...rest } = tag
|
|
result.push (rest)
|
|
children?.forEach (walk)
|
|
}
|
|
|
|
tags.filter (t => t.category !== 'nico').forEach (walk)
|
|
|
|
return [...(new Set (result.map (t => t.name)))].join (' ')
|
|
}
|
|
|
|
|
|
type Props = { post: Post
|
|
onSave: (newPost: Post) => void }
|
|
|
|
|
|
export default (({ post, onSave }: Props) => {
|
|
const [originalCreatedBefore, setOriginalCreatedBefore] =
|
|
useState<string | null> (post.originalCreatedBefore)
|
|
const [originalCreatedFrom, setOriginalCreatedFrom] =
|
|
useState<string | null> (post.originalCreatedFrom)
|
|
const [parentPostIds, setParentPostIds] =
|
|
useState ((post.parentPosts ?? []).map (p => p.id).join (' '))
|
|
const [tags, setTags] = useState<string> ('')
|
|
const [title, setTitle] = useState (post.title)
|
|
|
|
const handleSubmit = async () => {
|
|
try
|
|
{
|
|
const data = await apiPut<Post> (
|
|
`/posts/${ post.id }`,
|
|
{ title, tags, parent_post_ids: parentPostIds,
|
|
original_created_from: originalCreatedFrom,
|
|
original_created_before: originalCreatedBefore },
|
|
{ headers: { 'Content-Type': 'multipart/form-data' } })
|
|
onSave ({ ...post,
|
|
title: data.title,
|
|
tags: data.tags,
|
|
parentPosts: data.parentPosts,
|
|
childPosts: data.childPosts,
|
|
siblingPosts: data.siblingPosts,
|
|
originalCreatedFrom: data.originalCreatedFrom,
|
|
originalCreatedBefore: data.originalCreatedBefore } as Post)
|
|
toast ({ description: '更新しました.' })
|
|
}
|
|
catch
|
|
{
|
|
toast ({ description: '更新はできなかったよ……' })
|
|
}
|
|
}
|
|
|
|
useEffect (() => {
|
|
setTags(tagsToStr (post.tags))
|
|
}, [post])
|
|
|
|
return (
|
|
<div className="max-w-xl pt-2 space-y-4">
|
|
{/* タイトル */}
|
|
<div>
|
|
<Label>タイトル</Label>
|
|
<input type="text"
|
|
className="w-full border rounded p-2"
|
|
value={title ?? ''}
|
|
onChange={ev => setTitle (ev.target.value)}/>
|
|
</div>
|
|
|
|
{/* 親投稿 */}
|
|
<div>
|
|
<Label>親投稿</Label>
|
|
<input
|
|
type="text"
|
|
value={parentPostIds}
|
|
onChange={e => setParentPostIds (e.target.value)}
|
|
className="w-full border p-2 rounded"/>
|
|
</div>
|
|
|
|
{/* タグ */}
|
|
<PostFormTagsArea tags={tags} setTags={setTags}/>
|
|
|
|
{/* オリジナルの作成日時 */}
|
|
<PostOriginalCreatedTimeField
|
|
originalCreatedFrom={originalCreatedFrom}
|
|
setOriginalCreatedFrom={setOriginalCreatedFrom}
|
|
originalCreatedBefore={originalCreatedBefore}
|
|
setOriginalCreatedBefore={setOriginalCreatedBefore}/>
|
|
|
|
{/* 送信 */}
|
|
<Button onClick={handleSubmit}
|
|
className="px-4 py-2 bg-blue-600 text-white rounded disabled:bg-gray-400">
|
|
更新
|
|
</Button>
|
|
</div>)
|
|
}) satisfies FC<Props>
|