131 lines
3.5 KiB
TypeScript
131 lines
3.5 KiB
TypeScript
'use client';
|
|
|
|
import { ReactNode, useCallback } from 'react';
|
|
import { FetchWrapperComponent } from '@gitroom/helpers/utils/custom.fetch';
|
|
import { deleteDialog } from '@gitroom/react/helpers/delete.dialog';
|
|
import { useReturnUrl } from '@gitroom/frontend/app/auth/return.url.component';
|
|
import { useVariables } from '@gitroom/react/helpers/variable.context';
|
|
|
|
export default function LayoutContext(params: { children: ReactNode }) {
|
|
if (params?.children) {
|
|
// eslint-disable-next-line react/no-children-prop
|
|
return <LayoutContextInner children={params.children} />;
|
|
}
|
|
|
|
return <></>;
|
|
}
|
|
|
|
export function setCookie(cname: string, cvalue: string, exdays: number) {
|
|
if (typeof document === 'undefined') {
|
|
return;
|
|
}
|
|
const d = new Date();
|
|
d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);
|
|
const expires = 'expires=' + d.toUTCString();
|
|
document.cookie = cname + '=' + cvalue + ';' + expires + ';path=/';
|
|
}
|
|
|
|
function LayoutContextInner(params: { children: ReactNode }) {
|
|
const returnUrl = useReturnUrl();
|
|
const { backendUrl, isGeneral, isSecured } = useVariables();
|
|
|
|
const afterRequest = useCallback(
|
|
async (url: string, options: RequestInit, response: Response) => {
|
|
if (
|
|
typeof window !== 'undefined' &&
|
|
window.location.href.includes('/p/')
|
|
) {
|
|
return true;
|
|
}
|
|
|
|
const headerAuth =
|
|
response?.headers?.get('auth') || response?.headers?.get('Auth');
|
|
const showOrg =
|
|
response?.headers?.get('showorg') || response?.headers?.get('Showorg');
|
|
const impersonate =
|
|
response?.headers?.get('impersonate') ||
|
|
response?.headers?.get('Impersonate');
|
|
const logout =
|
|
response?.headers?.get('logout') || response?.headers?.get('Logout');
|
|
|
|
if (headerAuth) {
|
|
setCookie('auth', headerAuth, 365);
|
|
}
|
|
|
|
if (showOrg) {
|
|
setCookie('showorg', showOrg, 365);
|
|
}
|
|
|
|
if (impersonate) {
|
|
setCookie('impersonate', impersonate, 365);
|
|
}
|
|
|
|
if (logout && !isSecured) {
|
|
setCookie('auth', '', -10);
|
|
setCookie('showorg', '', -10);
|
|
setCookie('impersonate', '', -10);
|
|
window.location.href = '/';
|
|
return true;
|
|
}
|
|
|
|
const reloadOrOnboarding =
|
|
response?.headers?.get('reload') ||
|
|
response?.headers?.get('onboarding');
|
|
|
|
if (reloadOrOnboarding) {
|
|
const getAndClear = returnUrl.getAndClear();
|
|
if (getAndClear) {
|
|
window.location.href = getAndClear;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (response?.headers?.get('onboarding')) {
|
|
window.location.href = isGeneral
|
|
? '/launches?onboarding=true'
|
|
: '/analytics?onboarding=true';
|
|
|
|
return true;
|
|
}
|
|
|
|
if (response?.headers?.get('reload')) {
|
|
window.location.reload();
|
|
return true;
|
|
}
|
|
|
|
if (response.status === 401) {
|
|
if (!isSecured) {
|
|
setCookie('auth', '', -10);
|
|
setCookie('showorg', '', -10);
|
|
setCookie('impersonate', '', -10);
|
|
}
|
|
window.location.href = '/';
|
|
}
|
|
|
|
if (response.status === 402) {
|
|
if (
|
|
await deleteDialog(
|
|
(
|
|
await response.json()
|
|
).message,
|
|
'Move to billing',
|
|
'Payment Required'
|
|
)
|
|
) {
|
|
window.open('/billing', '_blank');
|
|
}
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
},
|
|
[]
|
|
);
|
|
|
|
return (
|
|
<FetchWrapperComponent baseUrl={backendUrl} afterRequest={afterRequest}>
|
|
{params?.children || <></>}
|
|
</FetchWrapperComponent>
|
|
);
|
|
}
|