import { useQuery } from '@tanstack/react-query' import { useEffect, useState } from 'react' import { Helmet } from 'react-helmet-async' import { useLocation, useNavigate } from 'react-router-dom' import PrefetchLink from '@/components/PrefetchLink' import FormField from '@/components/common/FormField' import PageTitle from '@/components/common/PageTitle' import Pagination from '@/components/common/Pagination' import MainArea from '@/components/layout/MainArea' import { SITE_TITLE } from '@/config' import { fetchMaterialChanges } from '@/lib/materials' import { materialsKeys } from '@/lib/queryKeys' import { dateString, inputClass } from '@/lib/utils' import type { FC, FormEvent } from 'react' const MaterialHistoryPage: FC = () => { const location = useLocation () const navigate = useNavigate () const query = new URLSearchParams (location.search) const materialId = query.get ('material_id') ?? '' const tag = query.get ('tag') ?? '' const eventType = query.get ('event_type') ?? '' const page = Number (query.get ('page') ?? 1) const limit = Number (query.get ('limit') ?? 20) const [materialIdInput, setMaterialIdInput] = useState (materialId) const [tagInput, setTagInput] = useState (tag) const [eventTypeInput, setEventTypeInput] = useState (eventType) useEffect (() => { setMaterialIdInput (materialId) setTagInput (tag) setEventTypeInput (eventType) }, [eventType, materialId, tag]) const { data, isLoading, isError } = useQuery ({ queryKey: materialsKeys.changes ({ ...(materialId && { materialId }), ...(tag && { tag }), ...(eventType && { eventType }), page, limit }), queryFn: () => fetchMaterialChanges ({ ...(materialId && { materialId }), ...(tag && { tag }), ...(eventType && { eventType }), page, limit }) }) const versions = data?.versions ?? [] const totalPages = data ? Math.ceil (data.count / limit) : 0 useEffect (() => { document.querySelector ('table')?.scrollIntoView ({ behavior: 'smooth' }) }, [location.search]) const handleSearch = (event: FormEvent) => { event.preventDefault () const qs = new URLSearchParams () if (materialIdInput.trim ()) qs.set ('material_id', materialIdInput.trim ()) if (tagInput.trim ()) qs.set ('tag', tagInput.trim ()) if (eventTypeInput.trim ()) qs.set ('event_type', eventTypeInput.trim ()) qs.set ('page', '1') qs.set ('limit', String (limit)) navigate (`/materials/changes?${ qs.toString () }`) } return ( {`素材履歴 | ${ SITE_TITLE }`}
素材履歴 素材一覧へ戻る
{({ invalid }) => ( setMaterialIdInput (e.target.value)} className={inputClass (invalid)}/>)} {({ invalid }) => ( setTagInput (e.target.value)} className={inputClass (invalid)}/>)} {({ invalid }) => ( )}
{isLoading ? 'Loading...' : isError ? (

素材履歴の取得に失敗しました.

) : ( <>
{versions.map (version => ( ))}
日時 event_type 素材 ID タグ名 ファイル名 URL export_path 操作者
{dateString (version.createdAt)} {version.eventType} #{version.materialId} {version.versionNo} {version.tagName} {version.fileFilename} {version.url} {version.exportPathsJson.legacy_drive} {version.createdByUser ? version.createdByUser.name || `#${ version.createdByUser.id }` : 'bot 操作'}
)}
) } export default MaterialHistoryPage