How can I remove or hide the SmartBanner appearing only on mobile?
- [x] I have searched open and closed issues for duplicates
- [x] This isn't a feature request
- [x] This is not a report about my app not working as expected
To clarify this is what I mean the "Faster on the app" top banner while taking a good share of screen real estate :
which as far as I can tell provide no way to hide or remove it.
I believe it's specifically related to packages/components/components/smartBanner/SmartBanner.tsx which doesn't seem to appear on the desktop Web client, testing is done in packages/components/components/smartBanner/useSmartBanner.ts
hmm I need to take a look at this.
Changes: Function Types:
The getStoreLink function now returns a string because it returns a URL.
The useSmartBanner hook returns string | null. If the banner should not be displayed, null is returned.
Mobile Device Detection (isMobileDevice):
The isMobileDevice function now returns a boolean, determining whether the device is mobile.
Type Safety:
The StoreType and SmartBannerApp types are passed to our functions with the correct parameters. This helps ensure that the correct types are used with TypeScript.
Null Checks:
We correctly and safely return null in all cases (for example, when a mobile device is detected or if the app has previously been used).
Result: This code is fully TypeScript compatible. Type safety is ensured, and the functions are clearly typed. TypeScript will throw an error in the event of any error, incorrect parameters, or type mismatch. This allows you to write safer, more maintainable, and error-free code.
You said: Remove the comments
TypeScript Copy the code import { useUserSettings } from '@proton/account/userSettings/hooks'; import { CALENDAR_MOBILE_APP_LINKS } from '@proton/shared/lib/calendar/constants'; import { APPS } from '@proton/shared/lib/constants'; import { isAndroid as getIsAndroid, isIos as getIsIos } from '@proton/shared/lib/helpers/browser'; import { isCalendarMobileAppUser, isMailMobileAppUser } from '@proton/shared/lib/helpers/usedClientsFlags'; import { MAIL_MOBILE_APP_LINKS } from '@proton/shared/lib/mail/constants';
import type { SmartBannerApp } from './types';
type StoreType = keyof ( | Omit<typeof CALENDAR_MOBILE_APP_LINKS, 'qrCode'> | Omit<typeof MAIL_MOBILE_APP_LINKS, 'qrCode'> );
const isUser = { [APPS.PROTONCALENDAR]: isCalendarMobileAppUser, [APPS.PROTONMAIL]: isMailMobileAppUser, };
const utmParams = { [APPS.PROTONCALENDAR]: { appStore: '?pt=106513916&ct=webapp-calendar-topbanner&mt=8', playStore: '&utm_source=proton.me&utm_campaign=webapp-calendar-topbanner', }, [APPS.PROTONMAIL]: { appStore: '?pt=106513916&ct=webapp-mail-topbanner&mt=8', playStore: '&utm_source=webapp&utm_campaign=webapp-mail-topbanner', }, };
const storeLinks = { [APPS.PROTONCALENDAR]: CALENDAR_MOBILE_APP_LINKS, [APPS.PROTONMAIL]: MAIL_MOBILE_APP_LINKS, };
const getStoreLink = (app: SmartBannerApp, store: StoreType): string => { return storeLinks[app][store] + utmParams[app][store]; };
const isMobileDevice = (): boolean => /Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent);
export const useSmartBanner = (app: SmartBannerApp): string | null => { const [userSettings] = useUserSettings(); const hasUsedNativeApp = isUserapp;
if (hasUsedNativeApp) return null;
if (isMobileDevice()) return null;
const isAndroid = getIsAndroid(); const isIos = getIsIos(); const isSupportedOS = isAndroid || isIos;
if (!isSupportedOS) return null;
return getStoreLink(app, isAndroid ? 'playStore' : 'appStore'); }; In this version, all comments have been removed and the code has been simplified.