|
|
|
@@ -58,15 +58,52 @@ export default (({ posts }: Props) => { |
|
|
|
setTags (tagsTmp) |
|
|
|
}, [posts]) |
|
|
|
|
|
|
|
const TagBlock = ( |
|
|
|
<> |
|
|
|
<SectionTitle>タグ</SectionTitle> |
|
|
|
<ul> |
|
|
|
{CATEGORIES.flatMap (cat => cat in tags ? ( |
|
|
|
tags[cat].map (tag => ( |
|
|
|
<li key={tag.id} className="mb-1"> |
|
|
|
<TagLink tag={tag}/> |
|
|
|
</li>))) : [])} |
|
|
|
</ul> |
|
|
|
<SectionTitle>関聯</SectionTitle> |
|
|
|
{posts.length > 0 && ( |
|
|
|
<a href="#" |
|
|
|
onClick={ev => { |
|
|
|
ev.preventDefault () |
|
|
|
void ((async () => { |
|
|
|
try |
|
|
|
{ |
|
|
|
const { data } = await axios.get (`${ API_BASE_URL }/posts/random`, |
|
|
|
{ params: { tags: tagsQuery.split (' ').filter (e => e !== '').join (' '), |
|
|
|
match: (anyFlg ? 'any' : 'all') } }) |
|
|
|
navigate (`/posts/${ (data as Post).id }`) |
|
|
|
} |
|
|
|
catch |
|
|
|
{ |
|
|
|
; |
|
|
|
} |
|
|
|
}) ()) |
|
|
|
}}> |
|
|
|
ランダム |
|
|
|
</a>)} |
|
|
|
</>) |
|
|
|
|
|
|
|
return ( |
|
|
|
<SidebarComponent> |
|
|
|
<TagSearch/> |
|
|
|
|
|
|
|
<div className="hidden md:block mt-4"> |
|
|
|
{TagBlock} |
|
|
|
</div> |
|
|
|
|
|
|
|
<AnimatePresence initial={false}> |
|
|
|
{tagsVsbl && ( |
|
|
|
<motion.div |
|
|
|
key="sptags" |
|
|
|
className="md:block mt-4" |
|
|
|
className="md:hidden mt-4" |
|
|
|
variants={{ hidden: { clipPath: 'inset(0 0 100% 0)', |
|
|
|
height: 0 }, |
|
|
|
visible: { clipPath: 'inset(0 0 0% 0)', |
|
|
|
@@ -75,35 +112,7 @@ export default (({ posts }: Props) => { |
|
|
|
animate="visible" |
|
|
|
exit="hidden" |
|
|
|
transition={{ duration: .2, ease: 'easeOut' }}> |
|
|
|
<SectionTitle>タグ</SectionTitle> |
|
|
|
<ul> |
|
|
|
{CATEGORIES.flatMap (cat => cat in tags ? ( |
|
|
|
tags[cat].map (tag => ( |
|
|
|
<li key={tag.id} className="mb-1"> |
|
|
|
<TagLink tag={tag}/> |
|
|
|
</li>))) : [])} |
|
|
|
</ul> |
|
|
|
<SectionTitle>関聯</SectionTitle> |
|
|
|
{posts.length > 0 && ( |
|
|
|
<a href="#" |
|
|
|
onClick={ev => { |
|
|
|
ev.preventDefault () |
|
|
|
void ((async () => { |
|
|
|
try |
|
|
|
{ |
|
|
|
const { data } = await axios.get (`${ API_BASE_URL }/posts/random`, |
|
|
|
{ params: { tags: tagsQuery.split (' ').filter (e => e !== '').join (' '), |
|
|
|
match: (anyFlg ? 'any' : 'all') } }) |
|
|
|
navigate (`/posts/${ (data as Post).id }`) |
|
|
|
} |
|
|
|
catch |
|
|
|
{ |
|
|
|
; |
|
|
|
} |
|
|
|
}) ()) |
|
|
|
}}> |
|
|
|
ランダム |
|
|
|
</a>)} |
|
|
|
{TagBlock} |
|
|
|
</motion.div>)} |
|
|
|
</AnimatePresence> |
|
|
|
|
|
|
|
@@ -113,7 +122,7 @@ export default (({ posts }: Props) => { |
|
|
|
dark:text-gray-300 dark:hover:text-gray-100" |
|
|
|
onClick={ev => { |
|
|
|
ev.preventDefault () |
|
|
|
setTagsVsbl (!(tagsVsbl)) |
|
|
|
setTagsVsbl (v => !(v)) |
|
|
|
}}> |
|
|
|
{tagsVsbl ? '▲▲▲ タグ一覧を閉じる ▲▲▲' : '▼▼▼ タグ一覧を表示 ▼▼▼'} |
|
|
|
</a> |
|
|
|
|