From 87e83928d6d4e5a76c438543c78280edfbe10deb Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Sun, 2 Jul 2023 02:39:26 -0700 Subject: [PATCH] Add tab management to pages Tab management was previously handled by `Party` but things are smoother and less flicker-y if we handle them on the pages themselves --- pages/new/index.tsx | 50 ++++++++++++++++++++++++++++++++++++++++++-- pages/p/[party].tsx | 51 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 96 insertions(+), 5 deletions(-) diff --git a/pages/new/index.tsx b/pages/new/index.tsx index 64b5a598..9298efc1 100644 --- a/pages/new/index.tsx +++ b/pages/new/index.tsx @@ -36,12 +36,53 @@ const NewRoute: React.FC = ({ }: Props) => { // Set up router const router = useRouter() - const [selectedTab, setSelectedTab] = useState(GridType.Weapon) function callback(path: string) { router.push(path, undefined, { shallow: true }) } + const getCurrentTab = () => { + const parts = router.asPath.split('/') + const tab = parts[parts.length - 1] + + switch (tab) { + case 'characters': + return GridType.Character + case 'weapons': + return GridType.Weapon + case 'summons': + return GridType.Summon + default: + return GridType.Weapon + } + } + + const [selectedTab, setSelectedTab] = useState(getCurrentTab()) + + const handleTabChange = (value: string) => { + const path = [ + // Enable when using Next.js Router + // 'p', + router.asPath.split('/').filter((el) => el != '')[1], + value, + ].join('/') + + switch (value) { + case 'characters': + setSelectedTab(GridType.Character) + break + case 'weapons': + setSelectedTab(GridType.Weapon) + break + case 'summons': + setSelectedTab(GridType.Summon) + break + } + + if (router.asPath !== '/new' && router.asPath !== '/') + router.replace(path, undefined, { shallow: true }) + } + useEffect(() => { const parts = router.asPath.split('/') const tab = parts[parts.length - 1] @@ -105,7 +146,12 @@ const NewRoute: React.FC = ({ return ( {pageHead()} - + ) } else return pageError() diff --git a/pages/p/[party].tsx b/pages/p/[party].tsx index 79e26535..e9018904 100644 --- a/pages/p/[party].tsx +++ b/pages/p/[party].tsx @@ -34,7 +34,6 @@ const PartyRoute: React.FC = ({ // Set up state to save selected tab and // update when router changes const router = useRouter() - const [selectedTab, setSelectedTab] = useState(GridType.Weapon) useEffect(() => { const parts = router.asPath.split('/') @@ -51,7 +50,49 @@ const PartyRoute: React.FC = ({ setSelectedTab(GridType.Summon) break } - }, [router.asPath]) + }, []) + + const getCurrentTab = () => { + const parts = router.asPath.split('/') + const tab = parts[parts.length - 1] + + switch (tab) { + case 'characters': + return GridType.Character + case 'weapons': + return GridType.Weapon + case 'summons': + return GridType.Summon + default: + return GridType.Weapon + } + } + + const [selectedTab, setSelectedTab] = useState(getCurrentTab()) + + const handleTabChange = (value: string) => { + const path = [ + // Enable when using Next.js Router + // 'p', + router.asPath.split('/').filter((el) => el != '')[1], + value, + ].join('/') + + switch (value) { + case 'characters': + setSelectedTab(GridType.Character) + break + case 'weapons': + setSelectedTab(GridType.Weapon) + break + case 'summons': + setSelectedTab(GridType.Summon) + break + } + + if (router.asPath !== '/new' && router.asPath !== '/') + router.replace(path, undefined, { shallow: true }) + } // Set the initial data from props useEffect(() => { @@ -84,7 +125,11 @@ const PartyRoute: React.FC = ({ return ( {pageHead()} - + ) } else return pageError()