This commit is contained in:
2026-02-26 23:33:09 +09:00
parent c3aa8bc580
commit 4b447e952b
+74 -34
View File
@@ -1,5 +1,5 @@
import { useQuery } from '@tanstack/react-query' import { useQuery } from '@tanstack/react-query'
import { useState } from 'react' import { useEffect, useMemo, useState } from 'react'
import { Helmet } from 'react-helmet-async' import { Helmet } from 'react-helmet-async'
import { useLocation, useNavigate } from 'react-router-dom' import { useLocation, useNavigate } from 'react-router-dom'
@@ -17,49 +17,89 @@ import { postsKeys } from '@/lib/queryKeys'
import type { FC, FormEvent } from 'react' import type { FC, FormEvent } from 'react'
const setIf = (qs: URLSearchParams, k: string, v: string | null) => {
const t = v?.trim ()
if (t)
qs.set (k, t)
}
export default (() => { export default (() => {
const location = useLocation ()
const navigate = useNavigate () const navigate = useNavigate ()
const location = useLocation () const query = useMemo (() => new URLSearchParams (location.search),
const query = new URLSearchParams (location.search) [location.search])
const page = Number (query.get ('page') ?? 1) const page = Number (query.get ('page') ?? 1)
const limit = Number (query.get ('limit') ?? 20) const limit = Number (query.get ('limit') ?? 20)
const [createdFrom, setCreatedFrom] = const qURL = query.get ('url')
useState<string | null> (query.get ('created_from')) const qTitle = query.get ('title')
const [createdTo, setCreatedTo] = const qTags = query.get ('tags') ?? ''
useState<string | null> (query.get ('created_to')) const qMatch: 'all' | 'any' = query.get ('match') === 'any' ? 'any' : 'all'
const [matchType, setMatchType] = const qOriginalCreatedFrom = query.get ('original_created_from')
useState<'all' | 'any'> ((query.get ('match') as 'all' | 'any' | null) ?? 'all') const qOriginalCreatedTo = query.get ('original_created_to')
const [originalCreatedFrom, setOriginalCreatedFrom] = const qCreatedFrom = query.get ('created_from')
useState<string | null> (query.get ('original_created_from')) const qCreatedTo = query.get ('created_to')
const [originalCreatedTo, setOriginalCreatedTo] = const qUpdatedFrom = query.get ('updated_from')
useState<string | null> (query.get ('original_created_to')) const qUpdatedTo = query.get ('updated_to')
const [tagsStr, setTagsStr] = useState (query.get ('tags') ?? '')
const [title, setTitle] = useState (query.get ('title') ?? '') const [createdFrom, setCreatedFrom] = useState (qCreatedFrom)
const [updatedFrom, setUpdatedFrom] = const [createdTo, setCreatedTo] = useState (qCreatedTo)
useState<string | null> (query.get ('updated_from')) const [matchType, setMatchType] = useState (qMatch ?? 'all')
const [updatedTo, setUpdatedTo] = const [originalCreatedFrom, setOriginalCreatedFrom] = useState (qOriginalCreatedFrom)
useState<string | null> (query.get ('updated_to')) const [originalCreatedTo, setOriginalCreatedTo] = useState (qOriginalCreatedTo)
const [url, setURL] = useState (query.get ('url') ?? '') const [tagsStr, setTagsStr] = useState (qTags)
const [title, setTitle] = useState (qTitle ?? '')
const [updatedFrom, setUpdatedFrom] = useState (qUpdatedFrom)
const [updatedTo, setUpdatedTo] = useState (qUpdatedTo)
const [url, setURL] = useState (qURL ?? '')
const keys = { const keys = {
tags: tagsStr, match: matchType, page, limit, tags: qTags, match: qMatch, page, limit,
...(url && { url }), ...(qURL && { url: qURL }),
...(title && { title }), ...(qTitle && { title: qTitle }),
...(originalCreatedFrom && { original_created_from: originalCreatedFrom }), ...(qOriginalCreatedFrom && { original_created_from: qOriginalCreatedFrom }),
...(originalCreatedTo && { original_created_to: originalCreatedTo }), ...(qOriginalCreatedTo && { original_created_to: qOriginalCreatedTo }),
...(createdFrom && { created_from: createdFrom }), ...(qCreatedFrom && { created_from: qCreatedFrom }),
...(createdTo && { created_to: createdTo }), ...(qCreatedTo && { created_to: qCreatedTo }),
...(updatedFrom && { updated_from: updatedFrom }), ...(qUpdatedFrom && { updated_from: qUpdatedFrom }),
...(updatedTo && { updated_to: updatedTo }) } ...(qUpdatedTo && { updated_to: qUpdatedTo }) }
const { data, /* isLoading: loading */ } = useQuery ({ const { data, isLoading: loading } = useQuery ({
queryKey: postsKeys.index (keys), queryFn: () => fetchPosts (keys) }) queryKey: postsKeys.index (keys),
queryFn: () => fetchPosts (keys) })
const results = data?.posts ?? [] const results = data?.posts ?? []
const totalPages = data ? Math.ceil (data.count / limit) : 0 const totalPages = data ? Math.ceil (data.count / limit) : 0
useEffect (() => {
setURL (qURL ?? '')
setTitle (qTitle ?? '')
setTagsStr (qTags ?? '')
setMatchType (qMatch ?? 'all')
setOriginalCreatedFrom (qOriginalCreatedFrom)
setOriginalCreatedTo (qOriginalCreatedTo)
setCreatedFrom (qCreatedFrom)
setCreatedTo (qCreatedTo)
setUpdatedFrom (qUpdatedFrom)
setUpdatedTo (qUpdatedTo)
document.getElementsByTagName ('main')![0].scroll (0, 0)
}, [location.search])
const search = async () => { const search = async () => {
const qs = new URLSearchParams (location.search) const qs = new URLSearchParams ()
setIf (qs, 'tags', tagsStr)
setIf (qs, 'url', url)
setIf (qs, 'title', title)
setIf (qs, 'original_created_from', originalCreatedFrom)
setIf (qs, 'original_created_to', originalCreatedTo)
setIf (qs, 'created_from', createdFrom)
setIf (qs, 'created_to', createdTo)
setIf (qs, 'updated_from', updatedFrom)
setIf (qs, 'updated_to', updatedTo)
qs.set ('match', matchType)
qs.set ('page', String ('1')) qs.set ('page', String ('1'))
navigate (`${ location.pathname }?${ qs.toString () }`) navigate (`${ location.pathname }?${ qs.toString () }`)
} }
@@ -175,7 +215,7 @@ export default (() => {
</form> </form>
</div> </div>
{results.length > 0 && ( {loading ? 'Loading...' : (results.length > 0 ? (
<div className="mt-4"> <div className="mt-4">
<div className="overflow-x-auto"> <div className="overflow-x-auto">
<table className="w-full min-w-[1200px] table-fixed border-collapse"> <table className="w-full min-w-[1200px] table-fixed border-collapse">
@@ -241,6 +281,6 @@ export default (() => {
</div> </div>
<Pagination page={page} totalPages={totalPages}/> <Pagination page={page} totalPages={totalPages}/>
</div>)} </div>) : '結果ないよ(笑)')}
</MainArea>) </MainArea>)
}) satisfies FC }) satisfies FC