vaulterm/frontend/components/ui/pager-view.tsx

53 lines
1.2 KiB
TypeScript
Raw Normal View History

2024-11-08 18:53:30 +00:00
import { useDebounceCallback } from "@/hooks/useDebounce";
2024-11-06 14:53:07 +07:00
import React, { ComponentPropsWithoutRef, useEffect, useRef } from "react";
import RNPagerView from "react-native-pager-view";
export type PagerViewProps = ComponentPropsWithoutRef<typeof RNPagerView> & {
page?: number;
onChangePage?: (page: number) => void;
2024-11-08 18:53:30 +00:00
EmptyComponent?: () => JSX.Element;
2024-11-06 14:53:07 +07:00
};
2024-11-08 18:53:30 +00:00
const PagerView = ({
page,
onChangePage,
EmptyComponent,
children,
...props
}: PagerViewProps) => {
2024-11-06 14:53:07 +07:00
const ref = useRef<RNPagerView>(null);
2024-11-08 18:53:30 +00:00
const [onPageSelect, clearPageSelectDebounce] = useDebounceCallback(
(page) => onChangePage?.(page),
100
);
const [setPage] = useDebounceCallback((page) => {
ref.current?.setPage(page);
clearPageSelectDebounce();
}, 300);
2024-11-06 14:53:07 +07:00
useEffect(() => {
if (page != null) {
2024-11-08 18:53:30 +00:00
const npage = EmptyComponent != null ? page + 1 : page;
setPage(npage);
2024-11-06 14:53:07 +07:00
}
2024-11-08 18:53:30 +00:00
}, [page, EmptyComponent]);
2024-11-06 14:53:07 +07:00
return (
<RNPagerView
ref={ref}
{...props}
2024-11-08 18:53:30 +00:00
onPageSelected={(e) => {
const pos = e.nativeEvent.position;
onPageSelect(EmptyComponent ? pos - 1 : pos);
}}
>
{EmptyComponent ? <EmptyComponent key="-1" /> : null}
{children}
</RNPagerView>
2024-11-06 14:53:07 +07:00
);
};
export default PagerView;