diff --git a/src/components/ShowMoreOptionsBanner.tsx b/src/components/ShowMoreOptionsBanner.tsx deleted file mode 100644 index 3fbdc6c..0000000 --- a/src/components/ShowMoreOptionsBanner.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { ChevronDownIcon } from 'lucide-react' -import { startTransition, useEffect } from 'react' -import { usePersistedStore } from '../../store/persisted' - -export default function ShowMoreOptionsBanner() { - const acknowledgements = usePersistedStore((state) => state.acknowledgements) - - const showMoreOptions = !acknowledgements.includes('showMoreOptions') - - useEffect(() => { - if (acknowledgements.includes('showMoreOptions')) return - - const handleScroll = () => { - usePersistedStore.setState((prev) => { - if (prev.acknowledgements.includes('showMoreOptions')) return prev - return { - acknowledgements: [...prev.acknowledgements, 'showMoreOptions'], - } - }) - } - - window.addEventListener('scroll', handleScroll, { once: true }) - - return () => { - window.removeEventListener('scroll', handleScroll) - } - }, [acknowledgements]) - - if (!showMoreOptions) return null - - return ( -
{ - startTransition(() => { - usePersistedStore.setState((prev) => ({ - acknowledgements: [...prev.acknowledgements, 'showMoreOptions'], - })) - }) - requestAnimationFrame(() => { - setTimeout(() => { - scrollTo({ - top: document.body.scrollHeight, - behavior: 'smooth', - }) - }, 400) - }) - }} - > -

- Show more options -

- -
- ) -} diff --git a/src/components/operation/OptionsAccordion.tsx b/src/components/operation/OptionsAccordion.tsx index 7a3171f..8c9740c 100644 --- a/src/components/operation/OptionsAccordion.tsx +++ b/src/components/operation/OptionsAccordion.tsx @@ -1,5 +1,6 @@ import { Accordion, AccordionItem, Avatar } from '@heroui/react' import { + ChevronDownIcon, CopyIcon, DiamondPercentIcon, FilterIcon, @@ -8,8 +9,8 @@ import { ServerIcon, WrenchIcon, } from 'lucide-react' -import { type ComponentType, type ReactNode, useMemo } from 'react' -import ShowMoreOptionsBanner from '../ShowMoreOptionsBanner' +import { type ComponentType, type ReactNode, startTransition, useEffect, useMemo } from 'react' +import { usePersistedStore } from '../../../store/persisted' // Avatar/indicator/title per option category — exactly what each page's accordion rendered. export const CATEGORY_META: Record< @@ -110,3 +111,58 @@ export default function OptionsAccordion({ ) } + +// A one-time nudge pinned to the bottom of the banner-wrapped accordion, inviting the user to +// scroll for more options. Dismisses itself the first time the user scrolls, and is remembered. +function ShowMoreOptionsBanner() { + const acknowledgements = usePersistedStore((state) => state.acknowledgements) + + const showMoreOptions = !acknowledgements.includes('showMoreOptions') + + useEffect(() => { + if (acknowledgements.includes('showMoreOptions')) return + + const handleScroll = () => { + usePersistedStore.setState((prev) => { + if (prev.acknowledgements.includes('showMoreOptions')) return prev + return { + acknowledgements: [...prev.acknowledgements, 'showMoreOptions'], + } + }) + } + + window.addEventListener('scroll', handleScroll, { once: true }) + + return () => { + window.removeEventListener('scroll', handleScroll) + } + }, [acknowledgements]) + + if (!showMoreOptions) return null + + return ( +
{ + startTransition(() => { + usePersistedStore.setState((prev) => ({ + acknowledgements: [...prev.acknowledgements, 'showMoreOptions'], + })) + }) + requestAnimationFrame(() => { + setTimeout(() => { + scrollTo({ + top: document.body.scrollHeight, + behavior: 'smooth', + }) + }, 400) + }) + }} + > +

+ Show more options +

+ +
+ ) +}