С выходом версии next13 появилась возможность использовать appDir
в next12 чтобы использовать полученные данные на всех страницах можно было сделать так
App.getInitialProps = async (ctx: AppContext) => {
let user = null;
const props = await App.getInitialProps(ctx);
try {
if (typeof window === 'undefined' && ctx.ctx.req?.headers.cookie) {
axios.defaults.headers.get.Cookie = ctx.ctx.req?.headers.cookie;
if (!ctx.ctx.req?.url?.startsWith('/_next/data')) {
const res = await axios.get('/api/user/me');
user = res.data.user;
}
}
} catch (err: any) {
if (err.response && err.response.status === 403) {
ctx.ctx.res?.setHeader(
'Set-Cookie',
`app_session=; Domain=${process.env.DOMAIN}; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; HttpOnly; Secure`,
);
}
}
return { user, ...props }
}
<UserProvider user={user}>{children}</UserProvider>
в next13 так сделать нельзя
Правильно ли будет если в новом общем layout сделать так:
async function getUser() {
const sessionCookie = cookies().get('app_session')?.value
if (sessionCookie === undefined) return null
const res = await fetch(`http://localhost:8000/api/user/me`, {
next: { revalidate: 10 },
headers: {
cookie: `app_session=${sessionCookie}`
}
})
const user = (await res.json()) as User | null
return user
}
export default async function RootLayout({children}: {children: React.ReactNode}) {
const user = await getUser()
return (
<html lang='ru'>
<body>
<UserProvider user={user}>
{children}
</UserProvider>
</body>
</html>
)
}