diff --git a/app/components/Article/article.css b/app/components/Article/article.css index f324c50e..02694af9 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -141,4 +141,7 @@ article .footer-comtainer > * { article .footer-comtainer > div:nth-child(-n + 2) { flex: 1 1; } + article { + margin: 0; + } } diff --git a/app/components/CategoriesNav/Menu.tsx b/app/components/CategoriesNav/Menu.tsx index 2308e0ed..483d874a 100644 --- a/app/components/CategoriesNav/Menu.tsx +++ b/app/components/CategoriesNav/Menu.tsx @@ -3,7 +3,7 @@ import {Link} from '@remix-run/react' import {SearchInput} from '../SearchInput/Input' import {Tag as TagType} from '~/server-utils/stampy' import {tagUrl} from '~/routesMapper' -import styles from './menu.module.css' +import './menu.css' interface CategoriesNavProps { /** @@ -14,12 +14,16 @@ interface CategoriesNavProps { * Id of selected category */ activeCategoryId: number + /** + * Class name for the component + */ + className?: string } -export const CategoriesNav = ({categories, activeCategoryId}: CategoriesNavProps) => { +export const CategoriesNav = ({categories, activeCategoryId, className}: CategoriesNavProps) => { const [search, onSearch] = useState('') return ( -
+

Categories

@@ -30,9 +34,7 @@ export const CategoriesNav = ({categories, activeCategoryId}: CategoriesNavProps {name} ({questions.length}) diff --git a/app/components/CategoriesNav/menu.css b/app/components/CategoriesNav/menu.css new file mode 100644 index 00000000..0805a1f9 --- /dev/null +++ b/app/components/CategoriesNav/menu.css @@ -0,0 +1,25 @@ +.categoriesGroup { + padding: var(--spacing-12); +} +.categoriesGroup > * { + padding: var(--spacing-16); +} +.categoryTitle { + padding: var(--spacing-24); + cursor: pointer; + display: inline-block; + width: 100%; +} +@media (max-width: 640px) { + .categoriesGroup { + width: 100%; + height: 100%; + } + .categoriesGroup.bordered { + border: 0; + box-shadow: none; + } + .categoryTitle.selected { + background: inherit; + } +} diff --git a/app/components/CategoriesNav/menu.module.css b/app/components/CategoriesNav/menu.module.css deleted file mode 100644 index 12a49e68..00000000 --- a/app/components/CategoriesNav/menu.module.css +++ /dev/null @@ -1,12 +0,0 @@ -.categoriesGroup { - padding: var(--spacing-12); -} -.categoriesGroup > * { - padding: var(--spacing-16); -} -.categoryTitle { - padding: var(--spacing-24); - cursor: pointer; - display: inline-block; - width: 100%; -} diff --git a/app/hooks/isMobile.tsx b/app/hooks/isMobile.tsx new file mode 100644 index 00000000..565e3c0b --- /dev/null +++ b/app/hooks/isMobile.tsx @@ -0,0 +1,25 @@ +import {useState, useEffect} from 'react' + +export default function useIsMobile() { + const mobileWidth = 640 + const [windowWidth, setWindowWidth] = useState(0) + + const isWindow = typeof window !== 'undefined' + + const getWidth = () => (isWindow ? window.innerWidth : windowWidth) + + const resize = () => setWindowWidth(getWidth()) + + useEffect(() => { + if (isWindow) { + setWindowWidth(getWidth()) + + window.addEventListener('resize', resize) + + return () => window.removeEventListener('resize', resize) + } + //eslint-disable-next-line + }, [isWindow]) + + return windowWidth <= mobileWidth +} diff --git a/app/routes/tags.$.tsx b/app/routes/tags.$.tsx index 10596438..b6cec77e 100644 --- a/app/routes/tags.$.tsx +++ b/app/routes/tags.$.tsx @@ -5,7 +5,7 @@ import ListTable from '~/components/Table' import {loader} from '~/routes/tags.all' import {CategoriesNav} from '~/components/CategoriesNav/Menu' import type {Tag as TagType} from '~/server-utils/stampy' - +import useIsMobile from '~/hooks/isMobile' export {loader} export const sortFuncs = { @@ -15,6 +15,7 @@ export const sortFuncs = { } export default function Tags() { + const mobile = useIsMobile() const {data} = useLoaderData>() const {currentTag, tags} = data const [selectedTag, setSelectedTag] = useState(null) @@ -22,22 +23,24 @@ export default function Tags() { const [sortBy] = useState('alphabetically') useEffect(() => { - if (selectedTag !== currentTag) { - setSelectedTag(currentTag) + if (currentTag === undefined) { + setSelectedTag(null) + } else { + if (selectedTag !== currentTag) { + setSelectedTag(currentTag) + } } }, [selectedTag, tags, currentTag]) - if (selectedTag === null) { - return null - } + return (
tag.questions.length > 0).sort(sortFuncs[sortBy])} - activeCategoryId={selectedTag.tagId} + activeCategoryId={selectedTag?.tagId || 0} + className={mobile && selectedTag !== null ? 'desktop-only' : ''} /> - {selectedTag === null ? null : (

{selectedTag.name}

diff --git a/app/routes/tags.all.tsx b/app/routes/tags.all.tsx index 99301768..030a39f3 100644 --- a/app/routes/tags.all.tsx +++ b/app/routes/tags.all.tsx @@ -6,15 +6,19 @@ import {reloadInBackgroundIfNeeded} from '~/server-utils/kv-cache' export const loader = async ({request, params}: Parameters[0]) => { const {data: tags, timestamp} = await loadTags(request) - const tagId = params['*'] && params['*'].split('/')[0] + let tagId = params['*'] && params['*'].split('/')[0] + if (tagId === '') { + tagId = undefined + } + const currentTag = tagId - ? tags.find(({tagId: checkedId, name}) => [checkedId.toString(), name].includes(tagId)) - : tags[0] + ? tags.find(({tagId: checkedId, name}) => [checkedId.toString(), name].includes(tagId!)) + : undefined - if (currentTag === undefined) { + if (currentTag === undefined && tagId !== undefined) { throw new Response(null, { status: 404, - statusText: 'Unable to find requested tag', + statusText: 'Unable to find requested tag -d', }) }