Skip to content

Commit

Permalink
Fix accounts under ssr
Browse files Browse the repository at this point in the history
  • Loading branch information
zoriya committed Dec 1, 2023
1 parent 30a162e commit 1481bfe
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 15 deletions.
1 change: 1 addition & 0 deletions front/apps/web/next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ const nextConfig = {
"react-native-web",
"react-native-svg",
"react-native-reanimated",
"react-native-mmkv",
"moti",
"yoshiki",
"@expo/vector-icons",
Expand Down
21 changes: 13 additions & 8 deletions front/apps/web/src/pages/_app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ const YoshikiDebug = ({ children }: { children: JSX.Element }) => {

const App = ({ Component, pageProps }: AppProps) => {
const [queryClient] = useState(() => createQueryClient());
const { queryState, token, randomItems, ...props } = superjson.deserialize<any>(
const { queryState, token, randomItems, account, ...props } = superjson.deserialize<any>(
pageProps ?? { json: {} },
);
const layoutInfo = (Component as QueryPage).getLayout ?? (({ page }) => page);
Expand All @@ -132,7 +132,7 @@ const App = ({ Component, pageProps }: AppProps) => {
<meta name="description" content="A portable and vast media library solution." />
</Head>
<QueryClientProvider client={queryClient}>
<AccountProvider>
<AccountProvider ssrAccount={account}>
<HydrationBoundary state={queryState}>
<ThemeSelector theme="auto" font={{ normal: "inherit" }}>
<GlobalCssTheme />
Expand Down Expand Up @@ -160,27 +160,32 @@ const App = ({ Component, pageProps }: AppProps) => {
};

App.getInitialProps = async (ctx: AppContext) => {
const account = readAccountCookie(ctx.ctx.req?.headers.cookie);
const appProps = await NextApp.getInitialProps(ctx);
const Component = ctx.Component as QueryPage;

const items = arrayShuffle(Component.randomItems ?? []);
appProps.pageProps.randomItems = {
[Component.displayName!]: items,
};

if (typeof window !== "undefined") return { pageProps: superjson.serialize(appProps.pageProps) };


const getUrl = Component.getFetchUrls;
const getLayoutUrl =
Component.getLayout && "Layout" in Component.getLayout
? Component.getLayout.Layout.getFetchUrls
: Component.getLayout?.getFetchUrls;

const items = arrayShuffle(Component.randomItems ?? []);
appProps.pageProps.randomItems = {
[Component.displayName!]: items,
};
const urls: QueryIdentifier[] = [
...(getUrl ? getUrl(ctx.router.query as any, items) : []),
...(getLayoutUrl ? getLayoutUrl(ctx.router.query as any, items) : []),
];

const account = readAccountCookie(ctx.ctx.req?.headers.cookie);
const [authToken, token] = await getTokenWJ(account ?? null);
appProps.pageProps.queryState = await fetchQuery(urls, authToken);
appProps.pageProps.token = token;
appProps.pageProps.account = account;

return { pageProps: superjson.serialize(appProps.pageProps) };
};
Expand Down
4 changes: 2 additions & 2 deletions front/packages/models/src/account-internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ const writeAccounts = (accounts: Account[]) => {
};

export const setAccountCookie = (account?: Account) => {
const value = JSON.stringify(account);
let value = JSON.stringify(account);
// Remove illegal values from json. There should not be one in the account anyways.
value.replaceAll(";", "");
value = value?.replaceAll(";", "");
const d = new Date();
// A year
d.setTime(d.getTime() + 365 * 24 * 60 * 60 * 1000);
Expand Down
35 changes: 31 additions & 4 deletions front/packages/models/src/accounts.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,43 @@ export const ConnectionErrorContext = createContext<{
retry?: () => void;
}>({ error: null });

export const AccountProvider = ({ children }: { children: ReactNode }) => {
/* eslint-disable react-hooks/rules-of-hooks */
export const AccountProvider = ({
children,
ssrAccount,
}: {
children: ReactNode;
ssrAccount?: Account;
}) => {
if (Platform.OS === "web" && typeof window === "undefined") {
const accs = ssrAccount
? [{ ...ssrAccount, selected: true, select: () => { }, remove: () => { } }]
: [];
return (
<AccountContext.Provider value={accs}>
<ConnectionErrorContext.Provider
value={{
error: null,
retry: () => {
queryClient.invalidateQueries({ queryKey: ["auth", "me"] });
},
}}
>
{children}
</ConnectionErrorContext.Provider>
</AccountContext.Provider>
);
}

const [accStr] = useMMKVString("accounts");
const acc = z.array(AccountP).parse(accStr);
const acc = accStr ? z.array(AccountP).parse(accStr) : null;
const accounts = useMemo(
() =>
acc.map((account) => ({
acc?.map((account) => ({
...account,
select: () => updateAccount(account.id, { ...account, selected: true }),
remove: () => removeAccounts((x) => x.id == x.id),
})),
})) ?? [],
[acc],
);

Expand Down
2 changes: 1 addition & 1 deletion front/packages/models/src/login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ export const login = async (
};

export const getTokenWJ = async (account?: Account | null): Promise<[string, Token] | [null, null]> => {
if (account === null)
if (account === undefined)
account = getCurrentAccount();
if (!account) return [null, null];

Expand Down

0 comments on commit 1481bfe

Please sign in to comment.