diff --git a/packages/shared/src/components/profile/ProfileSettingsMenu.tsx b/packages/shared/src/components/profile/ProfileSettingsMenu.tsx index d2913f82ee..d09fac9e73 100644 --- a/packages/shared/src/components/profile/ProfileSettingsMenu.tsx +++ b/packages/shared/src/components/profile/ProfileSettingsMenu.tsx @@ -36,19 +36,19 @@ import { ButtonColor } from '../buttons/Button'; import { usePlusSubscription } from '../../hooks/usePlusSubscription'; import { LogEvent, TargetId } from '../../lib/log'; import { GooglePlayIcon } from '../icons/Google/Play'; -import { checkIsBrowser, isAndroidApp, UserAgent } from '../../lib/func'; +import { checkIsBrowser, UserAgent } from '../../lib/func'; import { useConditionalFeature } from '../../hooks'; import { featureOnboardingAndroid } from '../../lib/featureManagement'; const useMenuItems = (): NavItemProps[] => { - const { logout } = useAuthContext(); + const { logout, isAndroidApp } = useAuthContext(); const { openModal } = useLazyModal(); const { showPrompt } = usePrompt(); const { showPlusSubscription, isPlus, logSubscriptionEvent } = usePlusSubscription(); const { value: appExperiment } = useConditionalFeature({ feature: featureOnboardingAndroid, - shouldEvaluate: checkIsBrowser(UserAgent.Android) && !isAndroidApp(), + shouldEvaluate: checkIsBrowser(UserAgent.Android) && !isAndroidApp, }); const onLogout = useCallback(async () => { diff --git a/packages/shared/src/contexts/AuthContext.tsx b/packages/shared/src/contexts/AuthContext.tsx index 2f14b8bbfd..8dfa03c867 100644 --- a/packages/shared/src/contexts/AuthContext.tsx +++ b/packages/shared/src/contexts/AuthContext.tsx @@ -59,6 +59,7 @@ export interface AuthContextData { squads?: Squad[]; isAuthReady?: boolean; geo?: Boot['geo']; + isAndroidApp?: boolean; } const isExtension = checkIsExtension(); const AuthContext = React.createContext(null); @@ -112,6 +113,7 @@ export type AuthContextProviderProps = { | 'squads' | 'refetchBoot' | 'geo' + | 'isAndroidApp' >; export const AuthContextProvider = ({ @@ -130,6 +132,7 @@ export const AuthContextProvider = ({ squads, firstLoad, geo, + isAndroidApp, }: AuthContextProviderProps): ReactElement => { const [loginState, setLoginState] = useState(null); const endUser = user && 'providers' in user ? user : null; @@ -180,6 +183,7 @@ export const AuthContextProvider = ({ accessToken, squads, geo, + isAndroidApp, }} > {children} diff --git a/packages/shared/src/contexts/BootProvider.tsx b/packages/shared/src/contexts/BootProvider.tsx index 5635cac4bf..6507a1c76c 100644 --- a/packages/shared/src/contexts/BootProvider.tsx +++ b/packages/shared/src/contexts/BootProvider.tsx @@ -76,6 +76,7 @@ const updateLocalBootData = ( 'exp', 'feeds', 'geo', + 'isAndroidApp', ]); storage.setItem(BOOT_LOCAL_KEY, JSON.stringify(result)); @@ -181,7 +182,7 @@ export const BootDataProvider = ({ const isBootReady = isFetched && !isError; const loadedFromCache = !!cachedBootData; - const { user, settings, alerts, notifications, squads, geo } = + const { user, settings, alerts, notifications, squads, geo, isAndroidApp } = cachedBootData || {}; useRefreshToken(remoteData?.accessToken, refetch); @@ -190,7 +191,13 @@ export const BootDataProvider = ({ (updatedBootData: Partial, update = true) => { const cachedData = getCachedOrNull() || {}; const lastAppliedChange = lastAppliedChangeRef.current; - let updatedData = { ...updatedBootData }; + const params = new URLSearchParams(globalThis?.location?.search); + let updatedData = { + ...updatedBootData, + isAndroidApp: + cachedData?.isAndroidApp || Boolean(params.get('android')), + }; + if (update) { if (lastAppliedChange) { updatedData = { ...lastAppliedChange, ...updatedData }; @@ -280,6 +287,7 @@ export const BootDataProvider = ({ squads={squads} firstLoad={initialLoad} geo={geo} + isAndroidApp={isAndroidApp} > & { lastModifier?: string }; +> & { lastModifier?: string; isAndroidApp?: boolean }; export async function getBootData(app: string, url?: string): Promise { const appRoute = app === 'companion' ? '/companion' : ''; diff --git a/packages/shared/src/lib/func.ts b/packages/shared/src/lib/func.ts index 74a73e34dc..ce7719ecbc 100644 --- a/packages/shared/src/lib/func.ts +++ b/packages/shared/src/lib/func.ts @@ -38,8 +38,6 @@ export const postWindowMessage = ( export const checkIsExtension = (): boolean => !!process.env.TARGET_BROWSER; export const isExtension = !!process.env.TARGET_BROWSER; -export const isAndroidApp = (): boolean => globalThis?.isAndroidApp; - export const isPWA = (): boolean => // @ts-expect-error - Safari only, not web standard. globalThis?.navigator?.standalone || @@ -158,13 +156,6 @@ export const initReactModal = ({ globalThis.reactModalInit = true; }; -export const initApp = (): void => { - const params = new URLSearchParams(globalThis?.location?.search); - if (params.get('android') === 'true') { - globalThis.isAndroidApp = true; - } -}; - export const isMobile = (): boolean => globalThis?.localStorage.mobile || globalThis?.navigator.maxTouchPoints > 1; diff --git a/packages/webapp/pages/_app.tsx b/packages/webapp/pages/_app.tsx index ebe518eaf0..d86ce06933 100644 --- a/packages/webapp/pages/_app.tsx +++ b/packages/webapp/pages/_app.tsx @@ -31,7 +31,6 @@ import { useThemedAsset } from '@dailydotdev/shared/src/hooks/utils'; import { DndContextProvider } from '@dailydotdev/shared/src/contexts/DndContext'; import { structuredCloneJsonPolyfill } from '@dailydotdev/shared/src/lib/structuredClone'; import { fromCDN } from '@dailydotdev/shared/src/lib'; -import { initApp } from '@dailydotdev/shared/src/lib/func'; import Seo, { defaultSeo, defaultSeoTitle } from '../next-seo'; import useWebappVersion from '../hooks/useWebappVersion'; @@ -74,10 +73,6 @@ function InternalApp({ Component, pageProps, router }: AppProps): ReactElement { const { modal, closeModal } = useLazyModal(); useConsoleLogo(); - useEffect(() => { - initApp(); - }, []); - useEffect(() => { updateCookieBanner(user); diff --git a/packages/webapp/pages/onboarding.tsx b/packages/webapp/pages/onboarding.tsx index 85625dd090..0ed8b6507e 100644 --- a/packages/webapp/pages/onboarding.tsx +++ b/packages/webapp/pages/onboarding.tsx @@ -138,7 +138,7 @@ export function OnboardPage(): ReactElement { const router = useRouter(); const { setSettings } = useSettingsContext(); const isLogged = useRef(false); - const { user, isAuthReady, anonymous } = useAuthContext(); + const { user, isAuthReady, anonymous, isAndroidApp } = useAuthContext(); const { logSubscriptionEvent, showPlusSubscription: isOnboardingPlusActive } = usePlusSubscription(); const shouldVerify = anonymous?.shouldVerify; @@ -174,7 +174,9 @@ export function OnboardPage(): ReactElement { const { value: appExperiment } = useConditionalFeature({ feature: featureOnboardingAndroid, shouldEvaluate: - shouldEnrollOnboardingStep && checkIsBrowser(UserAgent.Android), + shouldEnrollOnboardingStep && + checkIsBrowser(UserAgent.Android) && + !isAndroidApp, }); const { shouldShowExtensionOnboarding } = useOnboardingExtension(); const { value: extensionExperiment } = useConditionalFeature({