imspidey's picture
Upload folder using huggingface_hub
03d9a71
import { Burger, TabsNav, type TabsNavProps } from '@lobehub/ui';
import { useResponsive } from 'antd-style';
import { startCase } from 'lodash-es';
import { memo, useCallback, useEffect, useMemo, useState } from 'react';
import { shallow } from 'zustand/shallow';
import { selectors, useAppStore } from '@/store';
const hideOriganlNav = () => {
(gradioApp().querySelector('#tabs > .tab-nav:first-of-type') as HTMLDivElement).style.display =
'none';
};
const getNavTabs = (): HTMLDivElement[] =>
Array.prototype.slice.call(
gradioApp().querySelectorAll('#tabs > [id^="tab_"]') as NodeListOf<HTMLDivElement>,
);
const getNavButtons = (): HTMLButtonElement[] =>
Array.prototype.slice.call(
gradioApp().querySelectorAll(
'#tabs > .tab-nav:first-of-type button',
) as NodeListOf<HTMLButtonElement>,
);
interface NavItem {
id: string;
index: number;
label: string;
}
const genNavList = (): NavItem[] => {
console.debug('🤯 [nav] generate nav list');
const navList = getNavTabs();
const buttons = getNavButtons();
return buttons.map((button, index) => {
const id = navList[index].id;
return {
id,
index,
label: startCase(String(button.textContent)),
};
});
};
const Nav = memo(() => {
const currentTab = useAppStore(selectors.currentTab, shallow);
const { mobile } = useResponsive();
const [opened, setOpened] = useState(false);
const [items, setItems] = useState<TabsNavProps['items']>([]);
const navList = useMemo(() => genNavList(), []);
const onChange: TabsNavProps['onChange'] = useCallback(
(id: string) => {
console.debug('🤯 [nav] onClick', id);
const index = navList.find((nav) => nav.id === id)?.index || 0;
const buttonList = getNavButtons();
buttonList[index].click();
},
[navList],
);
useEffect(() => {
console.time('🤯 [layout] inject - Header');
hideOriganlNav();
const list: TabsNavProps['items'] = navList.map((item) => {
return {
key: item.id,
label: mobile ? <div onClick={() => onChange(item.id)}>{item.label}</div> : item.label,
};
});
setItems(list.filter(Boolean));
console.timeEnd('🤯 [layout] inject - Header');
}, [mobile]);
if (mobile) return <Burger items={items} opened={opened} setOpened={setOpened} />;
return <TabsNav activeKey={currentTab} items={items} onChange={onChange} />;
});
export default Nav;