| @@ -58,15 +58,52 @@ export default (({ posts }: Props) => { | |||||
| setTags (tagsTmp) | setTags (tagsTmp) | ||||
| }, [posts]) | }, [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 ( | return ( | ||||
| <SidebarComponent> | <SidebarComponent> | ||||
| <TagSearch/> | <TagSearch/> | ||||
| <div className="hidden md:block mt-4"> | |||||
| {TagBlock} | |||||
| </div> | |||||
| <AnimatePresence initial={false}> | <AnimatePresence initial={false}> | ||||
| {tagsVsbl && ( | {tagsVsbl && ( | ||||
| <motion.div | <motion.div | ||||
| key="sptags" | key="sptags" | ||||
| className="md:block mt-4" | |||||
| className="md:hidden mt-4" | |||||
| variants={{ hidden: { clipPath: 'inset(0 0 100% 0)', | variants={{ hidden: { clipPath: 'inset(0 0 100% 0)', | ||||
| height: 0 }, | height: 0 }, | ||||
| visible: { clipPath: 'inset(0 0 0% 0)', | visible: { clipPath: 'inset(0 0 0% 0)', | ||||
| @@ -75,35 +112,7 @@ export default (({ posts }: Props) => { | |||||
| animate="visible" | animate="visible" | ||||
| exit="hidden" | exit="hidden" | ||||
| transition={{ duration: .2, ease: 'easeOut' }}> | 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>)} | </motion.div>)} | ||||
| </AnimatePresence> | </AnimatePresence> | ||||
| @@ -113,7 +122,7 @@ export default (({ posts }: Props) => { | |||||
| dark:text-gray-300 dark:hover:text-gray-100" | dark:text-gray-300 dark:hover:text-gray-100" | ||||
| onClick={ev => { | onClick={ev => { | ||||
| ev.preventDefault () | ev.preventDefault () | ||||
| setTagsVsbl (!(tagsVsbl)) | |||||
| setTagsVsbl (v => !(v)) | |||||
| }}> | }}> | ||||
| {tagsVsbl ? '▲▲▲ タグ一覧を閉じる ▲▲▲' : '▼▼▼ タグ一覧を表示 ▼▼▼'} | {tagsVsbl ? '▲▲▲ タグ一覧を閉じる ▲▲▲' : '▼▼▼ タグ一覧を表示 ▼▼▼'} | ||||
| </a> | </a> | ||||