import { delay, noop } from './tools';
import {
getInfinityPanelId,
isInfinityPanel,
Page,
RouteList,
Router,
RouterContext,
useRouter,
useThrottlingLocation,
} from '..';
import React from 'react';
import { Root, View, Panel, ConfigProvider } from '@vkontakte/vkui';
import { act, cleanup, render } from '@testing-library/react';
describe('dynamic panels', () => {
afterEach(() => {
cleanup();
window.history.replaceState({}, '', '/#');
});
test('work with fast back press', async (done) => {
// scrollTo is not implemented
Object.defineProperty(global.window, 'scrollTo', { value: noop });
const PAGE_MAIN = '/';
const PAGE_PLAYER = '/player/:id([0-9]+)';
const VIEW_MAIN = 'view_main';
const PANEL_MAIN = 'panel_main';
const PANEL_PLAYER = 'panel_player';
const list: RouteList = {
[PAGE_MAIN]: new Page(PANEL_MAIN, VIEW_MAIN),
[PAGE_PLAYER]: new Page(PANEL_PLAYER, VIEW_MAIN).makeInfinity(),
};
const Main: React.FC = () => {
const [location, onTransition] = useThrottlingLocation();
const router = useRouter(false);
const panelList = [
{PANEL_MAIN},
...router.getInfinityPanelList(VIEW_MAIN).map((panelId) => {
if (isInfinityPanel(panelId)) {
const type = getInfinityPanelId(panelId);
if (type === PANEL_PLAYER) {
return {panelId};
}
}
return null;
}).filter((x) => !!x),
];
// console.log('render', location.getViewHistoryWithLastPanel(VIEW_MAIN))
return (
onTransition()} activeView={location.getViewId()}>
onTransition()}
activePanel={location.getViewActivePanel(VIEW_MAIN) || PANEL_MAIN}
history={location.getViewHistory(VIEW_MAIN)}
id={VIEW_MAIN}>
{panelList}
);
};
const router = new Router(list);
router.start();
const component = render(
,
,
);
const expectPanel = async (panel: string) => {
expect(await component.findByTestId(panel)).toBeTruthy();
};
const expectInfinityPanel = async (panel: string) => {
const panel2 = await component.findByTestId('dynamic');
expect(panel2.innerHTML).toContain(panel);
};
await expectPanel(PANEL_MAIN);
const PUSH_COUNT = 7;
for (let i = 1; i < PUSH_COUNT; i++) {
await act(async () => {
router.pushPage(PAGE_PLAYER, { id: `1${i.toString()}` });
await delay(400);
});
await expectInfinityPanel(PANEL_PLAYER);
}
// console.log("PUSH DONE")
await delay(350);
await act(async () => {
for (let i = 1; i < PUSH_COUNT; i++) {
router.popPage();
await delay(1);
}
// console.log("POP DONE")
await delay(950);
});
await expectPanel(PANEL_MAIN);
done();
});
});