| '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/(app)/auth/return.url.component'; |
| import { useVariables } from '@gitroom/react/helpers/variable.context'; |
| export default function LayoutContext(params: { children: ReactNode }) { |
| if (params?.children) { |
| |
| 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/') || |
| window.location.pathname.startsWith('/provider/')) |
| ) { |
| 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 || response?.headers?.get('logout')) { |
| if (!isSecured) { |
| setCookie('auth', '', -10); |
| setCookie('showorg', '', -10); |
| setCookie('impersonate', '', -10); |
| } |
| window.location.href = '/'; |
| } |
| if (response.status === 406) { |
| if ( |
| await deleteDialog( |
| 'You are currently on trial, in order to use the feature you must finish the trial', |
| 'Finish the trial, charge me now', |
| 'Trial', |
|
|
| ) |
| ) { |
| window.open('/billing?finishTrial=true', '_blank'); |
| return false; |
| } |
| return false; |
| } |
|
|
| 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 true; |
| }, |
| [] |
| ); |
| return ( |
| <FetchWrapperComponent baseUrl={backendUrl} afterRequest={afterRequest}> |
| {params?.children || <></>} |
| </FetchWrapperComponent> |
| ); |
| } |
|
|