mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-03-11 21:27:05 +00:00
Merge pull request #1150 from Stremio/fix/shortcuts-section-button-visibility
Some checks are pending
Build / build (push) Waiting to run
Some checks are pending
Build / build (push) Waiting to run
Settings: Correct shortcuts menu button visibility
This commit is contained in:
commit
c3f67454ff
2 changed files with 26 additions and 10 deletions
|
|
@ -4,6 +4,7 @@ import { useTranslation } from 'react-i18next';
|
||||||
import { useServices } from 'stremio/services';
|
import { useServices } from 'stremio/services';
|
||||||
import { Button } from 'stremio/components';
|
import { Button } from 'stremio/components';
|
||||||
import { SECTIONS } from '../constants';
|
import { SECTIONS } from '../constants';
|
||||||
|
import { usePlatform } from 'stremio/common';
|
||||||
import styles from './Menu.less';
|
import styles from './Menu.less';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
|
@ -15,6 +16,7 @@ type Props = {
|
||||||
const Menu = ({ selected, streamingServer, onSelect }: Props) => {
|
const Menu = ({ selected, streamingServer, onSelect }: Props) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { shell } = useServices();
|
const { shell } = useServices();
|
||||||
|
const platform = usePlatform();
|
||||||
|
|
||||||
const settings = useMemo(() => (
|
const settings = useMemo(() => (
|
||||||
streamingServer?.settings?.type === 'Ready' ?
|
streamingServer?.settings?.type === 'Ready' ?
|
||||||
|
|
@ -35,9 +37,9 @@ const Menu = ({ selected, streamingServer, onSelect }: Props) => {
|
||||||
<Button className={classNames(styles['button'], { [styles['selected']]: selected === SECTIONS.STREAMING })} title={t('SETTINGS_NAV_STREAMING')} data-section={SECTIONS.STREAMING} onClick={onSelect}>
|
<Button className={classNames(styles['button'], { [styles['selected']]: selected === SECTIONS.STREAMING })} title={t('SETTINGS_NAV_STREAMING')} data-section={SECTIONS.STREAMING} onClick={onSelect}>
|
||||||
{ t('SETTINGS_NAV_STREAMING') }
|
{ t('SETTINGS_NAV_STREAMING') }
|
||||||
</Button>
|
</Button>
|
||||||
<Button className={classNames(styles['button'], { [styles['selected']]: selected === SECTIONS.SHORTCUTS })} title={t('SETTINGS_NAV_SHORTCUTS')} data-section={SECTIONS.SHORTCUTS} onClick={onSelect}>
|
{ !platform.isMobile && <Button className={classNames(styles['button'], { [styles['selected']]: selected === SECTIONS.SHORTCUTS })} title={t('SETTINGS_NAV_SHORTCUTS')} data-section={SECTIONS.SHORTCUTS} onClick={onSelect}>
|
||||||
{ t('SETTINGS_NAV_SHORTCUTS') }
|
{ t('SETTINGS_NAV_SHORTCUTS') }
|
||||||
</Button>
|
</Button> }
|
||||||
|
|
||||||
<div className={styles['spacing']} />
|
<div className={styles['spacing']} />
|
||||||
<div className={styles['version-info-label']} title={process.env.VERSION}>
|
<div className={styles['version-info-label']} title={process.env.VERSION}>
|
||||||
|
|
|
||||||
|
|
@ -41,13 +41,27 @@ const Settings = () => {
|
||||||
|
|
||||||
const updateSelectedSectionId = useCallback(() => {
|
const updateSelectedSectionId = useCallback(() => {
|
||||||
const container = sectionsContainerRef.current;
|
const container = sectionsContainerRef.current;
|
||||||
for (const section of sections) {
|
if (!container) return;
|
||||||
const sectionContainer = section.ref.current;
|
|
||||||
if (sectionContainer && (sectionContainer.offsetTop + container!.offsetTop) < container!.scrollTop + 50) {
|
const availableSections = sections.filter((section) => section.ref.current);
|
||||||
setSelectedSectionId(section.id);
|
if (!availableSections.length) return;
|
||||||
}
|
|
||||||
|
const { scrollTop, clientHeight, scrollHeight, offsetTop } = container;
|
||||||
|
const isAtBottom = scrollTop + clientHeight >= scrollHeight - 10;
|
||||||
|
|
||||||
|
if (isAtBottom) {
|
||||||
|
setSelectedSectionId(availableSections[availableSections.length - 1].id);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}, []);
|
|
||||||
|
const marker = scrollTop + 50;
|
||||||
|
const activeSection = availableSections.reduce((current, section) => {
|
||||||
|
const sectionTop = section.ref.current!.offsetTop + offsetTop;
|
||||||
|
return sectionTop <= marker ? section : current;
|
||||||
|
}, availableSections[0]);
|
||||||
|
|
||||||
|
setSelectedSectionId(activeSection.id);
|
||||||
|
}, [sections]);
|
||||||
|
|
||||||
const onMenuSelect = useCallback((event: React.MouseEvent<HTMLDivElement>) => {
|
const onMenuSelect = useCallback((event: React.MouseEvent<HTMLDivElement>) => {
|
||||||
const section = sections.find((section) => {
|
const section = sections.find((section) => {
|
||||||
|
|
@ -55,11 +69,11 @@ const Settings = () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
const container = sectionsContainerRef.current;
|
const container = sectionsContainerRef.current;
|
||||||
section && container!.scrollTo({
|
section && container?.scrollTo({
|
||||||
top: section.ref.current!.offsetTop - container!.offsetTop,
|
top: section.ref.current!.offsetTop - container!.offsetTop,
|
||||||
behavior: 'smooth'
|
behavior: 'smooth'
|
||||||
});
|
});
|
||||||
}, []);
|
}, [sections]);
|
||||||
|
|
||||||
const onContainerScroll = useCallback(throttle(() => {
|
const onContainerScroll = useCallback(throttle(() => {
|
||||||
updateSelectedSectionId();
|
updateSelectedSectionId();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue