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:
parent
6f161d12ff
commit
1f296e9ed8
6 changed files with 90 additions and 66 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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} />
|
||||||
|
|
|
@ -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>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -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);
|
|
58
src/utils/providers/FlowProvider.tsx
Normal file
58
src/utils/providers/FlowProvider.tsx
Normal 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);
|
Loading…
Add table
Add a link
Reference in a new issue