|
|
|
@@ -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> |
|
|
|
|