1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/elements/emby-scrollbuttons/ScrollButtons.tsx

86 lines
3 KiB
TypeScript
Raw Normal View History

import React, { FC, useCallback, useEffect, useRef, useState } from 'react';
import scrollerFactory from '../../libraries/scroller';
import globalize from '../../scripts/globalize';
import IconButton from '../emby-button/IconButton';
import './emby-scrollbuttons.scss';
enum Direction {
RIGHT,
LEFT,
}
interface ScrollButtonsProps {
scrollerFactoryRef: React.MutableRefObject<scrollerFactory | null>;
scrollState: {
scrollSize: number;
scrollPos: number;
scrollWidth: number;
}
}
const ScrollButtons: FC<ScrollButtonsProps> = ({ scrollerFactoryRef, scrollState }) => {
2022-12-15 22:54:58 +03:00
const [localeScrollPos, setLocaleScrollPos] = useState<number>(0);
const scrollButtonsRef = useRef<HTMLDivElement>(null);
const scrollToPosition = useCallback((pos: number, immediate: boolean) => {
if (scrollerFactoryRef.current) {
scrollerFactoryRef.current.slideTo(pos, immediate, undefined );
}
}, [scrollerFactoryRef]);
2022-12-16 16:02:11 -05:00
const onScrollButtonClick = useCallback((direction: Direction) => {
let newPos;
if (direction === Direction.LEFT) {
newPos = Math.max(0, scrollState.scrollPos - scrollState.scrollSize);
} else {
newPos = scrollState.scrollPos + scrollState.scrollSize;
}
if (globalize.getIsRTL() && direction === Direction.LEFT) {
newPos = scrollState.scrollPos + scrollState.scrollSize;
} else if (globalize.getIsRTL()) {
newPos = Math.min(0, scrollState.scrollPos - scrollState.scrollSize);
}
scrollToPosition(newPos, false);
2022-12-16 16:02:11 -05:00
}, [ scrollState.scrollPos, scrollState.scrollSize, scrollToPosition ]);
const triggerScrollLeft = useCallback(() => onScrollButtonClick(Direction.LEFT), [ onScrollButtonClick ]);
const triggerScrollRight = useCallback(() => onScrollButtonClick(Direction.RIGHT), [ onScrollButtonClick ]);
useEffect(() => {
const parent = scrollButtonsRef.current?.parentNode as HTMLDivElement;
parent.classList.add('emby-scroller-container');
let localeAwarePos = scrollState.scrollPos;
if (globalize.getIsElementRTL(scrollButtonsRef.current)) {
localeAwarePos *= -1;
}
2022-12-15 22:54:58 +03:00
setLocaleScrollPos(localeAwarePos);
}, [scrollState.scrollPos]);
return (
<div ref={scrollButtonsRef} className='emby-scrollbuttons padded-right'>
<IconButton
type='button'
className='emby-scrollbuttons-button btnPrev'
2022-12-16 16:02:11 -05:00
onClick={triggerScrollLeft}
icon='chevron_left'
2023-10-14 20:44:30 +05:30
disabled={!(localeScrollPos > 0)}
/>
<IconButton
type='button'
className='emby-scrollbuttons-button btnNext'
2022-12-16 16:02:11 -05:00
onClick={triggerScrollRight}
icon='chevron_right'
2023-10-14 20:35:55 +05:30
disabled={scrollState.scrollWidth > 0 && localeScrollPos + scrollState.scrollSize >= scrollState.scrollWidth}
/>
</div>
);
};
export default ScrollButtons;