This commit is contained in:
2026-05-06 15:47:20 +09:00
parent b47cdc7ad7
commit d54e66a114
4 changed files with 72 additions and 52 deletions
+5 -7
View File
@@ -5,7 +5,7 @@ import PostOriginalCreatedTimeField from '@/components/PostOriginalCreatedTimeFi
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 { updatePost } from '@/lib/posts'
import type { FC } from 'react'
@@ -44,12 +44,10 @@ export default (({ post, onSave }: Props) => {
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' } })
const data =
await updatePost ({ id: post.id, versionNo: post.versionNo + 1,
title, tags, parentPostIds,
originalCreatedFrom, originalCreatedBefore })
onSave ({ ...post,
title: data.title,
tags: data.tags,
+20 -1
View File
@@ -1,4 +1,4 @@
import { apiDelete, apiGet, apiPost } from '@/lib/api'
import { apiDelete, apiGet, apiPost, apiPut } from '@/lib/api'
import type { FetchPostsParams, Post, PostVersion } from '@/types'
@@ -42,6 +42,25 @@ export const fetchPostChanges = async (
page, limit } })
export const updatePost = async (
post: { id: number
versionNo: number
title: string | null
tags: string
parentPostIds: string
originalCreatedFrom: string | null
originalCreatedBefore: string | null },
) =>
await apiPut<Post> (
`/posts/${ post.id }`,
{ version_no: post.versionNo,
title: post.title,
tags: post.tags,
parent_post_ids: post.parentPostIds,
original_created_from: post.originalCreatedFrom,
original_created_before: post.originalCreatedBefore })
export const toggleViewedFlg = async (id: string, viewed: boolean): Promise<void> => {
await (viewed ? apiPost : apiDelete) (`/posts/${ id }/viewed`)
}
+44 -43
View File
@@ -11,13 +11,14 @@ import Pagination from '@/components/common/Pagination'
import MainArea from '@/components/layout/MainArea'
import { toast } from '@/components/ui/use-toast'
import { SITE_TITLE } from '@/config'
import { apiPut } from '@/lib/api'
import { fetchPostChanges } from '@/lib/posts'
import { fetchPostChanges, updatePost } from '@/lib/posts'
import { postsKeys, tagsKeys } from '@/lib/queryKeys'
import { fetchTag } from '@/lib/tags'
import { cn, dateString, originalCreatedAtString } from '@/lib/utils'
import type { FC } from 'react'
import type { FC, MouseEvent } from 'react'
import type { PostVersion } from '@/types'
const renderDiff = (diff: { current: string | null; prev: string | null }) => (
@@ -62,6 +63,45 @@ export default (() => {
const qc = useQueryClient ()
const handleRevert = async (e: MouseEvent<HTMLAnchorElement>, change: PostVersion) => {
e.preventDefault ()
if (!(confirm (`${ change.title.current || change.url.current }』を版 ${
change.versionNo } に差戻します.\nよろしいですか?`)))
return
try
{
const id = change.postId
const versionNo = change.latestVersionNo + 1
const title = change.title.current
const tags =
change.tags
.filter (t => t.type !== 'removed')
.map (t => t.name)
.filter (t => t.slice (0, 5) !== 'nico:')
.join (' ')
const parentPostIds =
(change.parentPosts ?? [])
.filter (p => p.type !== 'removed')
.map (p => p.id)
.join (' ')
const originalCreatedFrom = change.originalCreatedFrom.current
const originalCreatedBefore = change.originalCreatedBefore.current
await updatePost ({ id, versionNo, title, tags, parentPostIds,
originalCreatedFrom, originalCreatedBefore })
qc.invalidateQueries ({ queryKey: postsKeys.root })
qc.invalidateQueries ({ queryKey: tagsKeys.root })
toast ({ description: '差戻しました.' })
}
catch
{
toast ({ description: '差戻に失敗……' })
}
}
useEffect (() => {
document.querySelector ('table')?.scrollIntoView ({ behavior: 'smooth' })
}, [location.search])
@@ -231,46 +271,7 @@ export default (() => {
{dateString (change.createdAt)}
</td>
<td className="p-2">
<a
href="#"
onClick={async e => {
e.preventDefault ()
if (!(confirm (
`${ change.title.current
|| change.url.current }』を版 ${
change.versionNo } に差戻します.\nよろしいですか?`)))
return
try
{
await apiPut (
`/posts/${ change.postId }`,
{ title: change.title.current,
tags: change.tags
.filter (t => t.type !== 'removed')
.map (t => t.name)
.filter (t => t.slice (0, 5) !== 'nico:')
.join (' '),
parent_post_ids:
(change.parentPosts ?? [])
.filter (p => p.type !== 'removed')
.map (p => p.id)
.join (' '),
original_created_from:
change.originalCreatedFrom.current,
original_created_before:
change.originalCreatedBefore.current })
qc.invalidateQueries ({ queryKey: postsKeys.root })
qc.invalidateQueries ({ queryKey: tagsKeys.root })
toast ({ description: '差戻しました.' })
}
catch
{
toast ({ description: '差戻に失敗……' })
}
}}>
<a href="#" onClick={async e => await handleRevert (e, change)}>
</a>
</td>
+2
View File
@@ -121,6 +121,7 @@ export type Platform = typeof PLATFORMS[number]
export type Post = {
id: number
versionNo: number
url: string
title: string | null
thumbnail: string | null
@@ -146,6 +147,7 @@ export type PostTagChange = {
export type PostVersion = {
postId: number
latestVersionNo: number
versionNo: number
eventType: 'create' | 'update' | 'discard' | 'restore'
title: { current: string | null; prev: string | null }