/*by Артур Франк https://vk.com/gmelum*/ import React, { FC, HTMLAttributes, Children, useState, useEffect, useRef, createContext, useMemo, startTransition } from "react"; import { getCN } from "../utils"; import "./TabsView.css"; interface ITabsView extends HTMLAttributes { activeTabs: string; delay?: number; safe?: boolean; nav?: string; }; class SaveContext { private value: Record = {}; constructor(value: Record) { this.value = value; }; public getvalue = (title: string) => this.value[title] || 0; public setValue = (title: string, value: number) => this.value[title] = value; }; export const ScrollContext = createContext(new SaveContext({})); const TabsView: FC = ({ activeTabs, delay = 400, safe = true, //Безопасная зона children, ...restProps }) => { const scrollContext = useRef(new SaveContext({})).current; const [[back, active, animation, show], setNav] = useState(["", activeTabs, false, true]); const views = useMemo(() => Children.toArray(children) as React.ReactElement[], [children]); const viewsNav = useMemo(() => views.map((i) => i.props.id), [children]); const pageBack = views.find((elem) => elem.props.id === back); const pageActive = views.find((elem) => elem.props.id === active); const indexBack = viewsNav.indexOf(back); const indexActive = viewsNav.indexOf(activeTabs); const isBack = indexActive < indexBack; const isNext = indexActive > indexBack; useEffect(() => { if (active !== activeTabs) { setNav([active, activeTabs, true, true]); const timer = window.setTimeout(() => { setNav([active, activeTabs, true, false]); }, delay); return () => window.clearTimeout(timer); }; }, [activeTabs]); return (
{ pageActive && (
{pageActive}
) } { animation && show && pageBack && (
{pageBack}
) }
); }; export default TabsView;