1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-24 20:36:40 +07:00

added nextjs flow preloading

This commit is contained in:
Fedor Katurov 2022-01-20 16:33:40 +07:00
parent 6f161d12ff
commit 1f296e9ed8
6 changed files with 90 additions and 66 deletions

View file

@ -1,6 +1,5 @@
import React, { FC, FormEvent, useCallback, useMemo } from 'react'; import React, { FC, FormEvent, useCallback, useMemo } from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import { Superpower } from '~/components/boris/Superpower'; import { Superpower } from '~/components/boris/Superpower';
@ -12,7 +11,7 @@ import { InputText } from '~/components/input/InputText';
import { Toggle } from '~/components/input/Toggle'; import { Toggle } from '~/components/input/Toggle';
import { experimentalFeatures } from '~/constants/features'; import { experimentalFeatures } from '~/constants/features';
import styles from '~/containers/flow/FlowStamp/styles.module.scss'; import styles from '~/containers/flow/FlowStamp/styles.module.scss';
import { useFlowContext } from '~/utils/context/FlowContextProvider'; import { useFlowContext } from '~/utils/providers/FlowProvider';
import { useSearchContext } from '~/utils/providers/SearchProvider'; import { useSearchContext } from '~/utils/providers/SearchProvider';
interface IProps { interface IProps {

View file

@ -5,6 +5,7 @@ import { useFlowLoader } from '~/hooks/flow/useFlowLoader';
import { useFlowSetCellView } from '~/hooks/flow/useFlowSetCellView'; import { useFlowSetCellView } from '~/hooks/flow/useFlowSetCellView';
import { useGetLabStats } from '~/hooks/lab/useGetLabStats'; import { useGetLabStats } from '~/hooks/lab/useGetLabStats';
import { useFlowStore } from '~/store/flow/useFlowStore'; import { useFlowStore } from '~/store/flow/useFlowStore';
import { GetNodeDiffResult } from '~/types/node';
export const useFlow = () => { export const useFlow = () => {
const { loadMore, isSyncing } = useFlowLoader(); const { loadMore, isSyncing } = useFlowLoader();

View file

@ -8,16 +8,13 @@ import { FlowStamp } from '~/containers/flow/FlowStamp';
import { SidebarRouter } from '~/containers/main/SidebarRouter'; import { SidebarRouter } from '~/containers/main/SidebarRouter';
import { useUser } from '~/hooks/auth/useUser'; import { useUser } from '~/hooks/auth/useUser';
import { useInfiniteLoader } from '~/hooks/dom/useInfiniteLoader'; import { useInfiniteLoader } from '~/hooks/dom/useInfiniteLoader';
import { useFlowContext } from '~/utils/context/FlowContextProvider'; import { useFlowContext } from '~/utils/providers/FlowProvider';
import styles from './styles.module.scss'; import styles from './styles.module.scss';
interface Props { interface Props {}
isFluid: boolean;
onToggleLayout: () => void;
}
const FlowLayout: FC<Props> = ({ isFluid, onToggleLayout }) => { const FlowLayout: FC<Props> = () => {
const { heroes, nodes, onChangeCellView, loadMore, isSyncing } = useFlowContext(); const { heroes, nodes, onChangeCellView, loadMore, isSyncing } = useFlowContext();
const { user } = useUser(); const { user } = useUser();
@ -31,7 +28,7 @@ const FlowLayout: FC<Props> = ({ isFluid, onToggleLayout }) => {
</div> </div>
<div className={styles.stamp}> <div className={styles.stamp}>
<FlowStamp isFluid={isFluid} onToggleLayout={onToggleLayout} /> <FlowStamp isFluid={false} onToggleLayout={console.warn} />
</div> </div>
<FlowGrid nodes={nodes} user={user} onChangeCellView={onChangeCellView} /> <FlowGrid nodes={nodes} user={user} onChangeCellView={onChangeCellView} />

View file

@ -1,44 +1,43 @@
import React, { FC } from 'react'; import React, { FC } from 'react';
import { observer } from 'mobx-react-lite'; import { observer } from 'mobx-react-lite';
import { InferGetStaticPropsType } from 'next';
import { getNodeDiff } from '~/api/node';
import { PageTitle } from '~/components/common/PageTitle'; import { PageTitle } from '~/components/common/PageTitle';
import { useGlobalLoader } from '~/hooks/dom/useGlobalLoader'; import { useGlobalLoader } from '~/hooks/dom/useGlobalLoader';
import { useFlow } from '~/hooks/flow/useFlow';
import { FlowLayout } from '~/layouts/FlowLayout'; import { FlowLayout } from '~/layouts/FlowLayout';
import { FlowContextProvider } from '~/utils/context/FlowContextProvider'; import { FlowProvider } from '~/utils/providers/FlowProvider';
import { getPageTitle } from '~/utils/ssr/getPageTitle'; import { getPageTitle } from '~/utils/ssr/getPageTitle';
interface Props {} export const getStaticProps = async () => {
const fallbackData = await getNodeDiff({
start: new Date().toISOString(),
end: new Date().toISOString(),
with_heroes: true,
with_updated: true,
with_recent: false,
with_valid: false,
});
const FlowPage: FC<Props> = observer(() => { return {
props: {
fallbackData,
},
revalidate: 5 * 60,
};
};
type Props = InferGetStaticPropsType<typeof getStaticProps>;
const FlowPage: FC<Props> = observer(({ fallbackData }) => {
useGlobalLoader(); useGlobalLoader();
const {
updates,
nodes,
heroes,
recent,
isFluid,
toggleLayout,
onChangeCellView,
loadMore,
isSyncing,
} = useFlow();
return ( return (
<FlowContextProvider <FlowProvider fallbackData={fallbackData}>
updates={updates}
recent={recent}
heroes={heroes}
nodes={nodes}
loadMore={loadMore}
isSyncing={isSyncing}
onChangeCellView={onChangeCellView}
>
<PageTitle title={getPageTitle('Флоу')} /> <PageTitle title={getPageTitle('Флоу')} />
<FlowLayout isFluid={isFluid} onToggleLayout={toggleLayout} /> <FlowLayout />
</FlowContextProvider> </FlowProvider>
); );
}); });

View file

@ -1,30 +0,0 @@
import React, { createContext, FC, useContext } from 'react';
import { FlowDisplay, IFlowNode, INode } from '~/types';
export interface FlowContextProps {
updates: IFlowNode[];
recent: IFlowNode[];
heroes: IFlowNode[];
nodes: IFlowNode[];
isSyncing: boolean;
loadMore: () => Promise<unknown>;
onChangeCellView: (id: INode['id'], flow: FlowDisplay) => void;
}
export const FlowContext = createContext<FlowContextProps>({
updates: [],
recent: [],
heroes: [],
nodes: [],
isSyncing: false,
loadMore: async () => {},
onChangeCellView: () => {},
});
export const FlowContextProvider: FC<FlowContextProps> = ({ children, ...contextValue }) => {
return <FlowContext.Provider value={contextValue}>{children}</FlowContext.Provider>;
};
export const useFlowContext = () => useContext(FlowContext);

View file

@ -0,0 +1,58 @@
import React, { createContext, FC, useContext, useMemo } from 'react';
import { observer } from 'mobx-react-lite';
import { uniq } from 'ramda';
import { useFlow } from '~/hooks/flow/useFlow';
import { FlowDisplay, IFlowNode, INode } from '~/types';
import { GetNodeDiffResult } from '~/types/node';
export interface FlowProviderProps {
fallbackData?: GetNodeDiffResult;
}
export interface FlowContextProps {
updates: IFlowNode[];
recent: IFlowNode[];
heroes: IFlowNode[];
nodes: IFlowNode[];
isSyncing: boolean;
loadMore: () => Promise<unknown>;
onChangeCellView: (id: INode['id'], flow: FlowDisplay) => void;
}
export const FlowContext = createContext<FlowContextProps>({
updates: [],
recent: [],
heroes: [],
nodes: [],
isSyncing: false,
loadMore: async () => {},
onChangeCellView: () => {},
});
export const FlowProvider: FC<FlowProviderProps> = observer(({ fallbackData, children }) => {
const flow = useFlow();
const value = useMemo<FlowContextProps>(() => {
if (!flow.nodes?.length && fallbackData) {
return {
...flow,
heroes: fallbackData.heroes || [],
updates: fallbackData.updated || [],
recent: fallbackData.recent || [],
nodes: uniq([...(fallbackData.before || []), ...(fallbackData.after || [])]),
};
}
return {
...flow,
heroes: fallbackData?.heroes?.length ? fallbackData.heroes : flow.heroes,
};
}, [flow, fallbackData]);
return <FlowContext.Provider value={value}>{children}</FlowContext.Provider>;
});
export const useFlowContext = () => useContext(FlowContext);