diff --git a/.eslintrc.js b/.eslintrc.js index 94dfc3b80..a24c0f17a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -34,7 +34,7 @@ const createPattern = packageName => [ { group: ['@affine/env/constant'], message: - 'Do not import from @affine/env/constant. Use `environment.isElectron` instead', + 'Do not import from @affine/env/constant. Use `BUILD_CONFIG.isElectron` instead', importNames: ['isElectron'], }, ]; diff --git a/packages/common/env/src/constant.ts b/packages/common/env/src/constant.ts index 0771f9b29..802b07367 100644 --- a/packages/common/env/src/constant.ts +++ b/packages/common/env/src/constant.ts @@ -10,9 +10,6 @@ declare global { }; } -//#region runtime variables -export const isElectron = !!globalThis.__appInfo?.electron; -//#endregion export const DEFAULT_WORKSPACE_NAME = 'Demo Workspace'; export const UNTITLED_WORKSPACE_NAME = 'Untitled'; diff --git a/packages/common/env/src/global.ts b/packages/common/env/src/global.ts index e9c2eca1c..7af7ba264 100644 --- a/packages/common/env/src/global.ts +++ b/packages/common/env/src/global.ts @@ -1,51 +1,47 @@ /// -import { assertEquals } from '@blocksuite/global/utils'; -import { z } from 'zod'; -import { isElectron } from './constant.js'; import { UaHelper } from './ua-helper.js'; -export const BUILD_CONFIG_SCHEMA = z.object({ - // this is for the electron app - serverUrlPrefix: z.string(), - appVersion: z.string(), - editorVersion: z.string(), - distribution: z.enum(['web', 'desktop', 'admin', 'mobile']), - appBuildType: z.union([ - z.literal('stable'), - z.literal('beta'), - z.literal('internal'), - z.literal('canary'), - ]), - isSelfHosted: z.boolean().optional(), - githubUrl: z.string(), - changelogUrl: z.string(), - downloadUrl: z.string(), - // see: tools/workers - imageProxyUrl: z.string(), - linkPreviewUrl: z.string(), - allowLocalWorkspace: z.boolean(), - enablePreloading: z.boolean(), - enableNewSettingUnstableApi: z.boolean(), - enableExperimentalFeature: z.boolean(), - enableThemeEditor: z.boolean(), -}); - -export type BUILD_CONFIG_TYPE = z.infer; - -export type Environment = { - isDebug: boolean; - - // Edition +export type BUILD_CONFIG_TYPE = { + debug: boolean; + distribution: 'web' | 'desktop' | 'admin' | 'mobile'; + /** + * 'web' | 'desktop' | 'admin' + */ isDesktopEdition: boolean; + /** + * 'mobile' + */ isMobileEdition: boolean; - // Platform/Entry isElectron: boolean; - isDesktopWeb: boolean; + isWeb: boolean; isMobileWeb: boolean; - isStandalone?: boolean; + // this is for the electron app + serverUrlPrefix: string; + appVersion: string; + editorVersion: string; + appBuildType: 'stable' | 'beta' | 'internal' | 'canary'; + + githubUrl: string; + changelogUrl: string; + downloadUrl: string; + // see: tools/workers + imageProxyUrl: string; + linkPreviewUrl: string; + + allowLocalWorkspace: boolean; + enablePreloading: boolean; + enableNewSettingUnstableApi: boolean; + enableExperimentalFeature: boolean; + enableThemeEditor: boolean; + + // TODO(@forehalo): remove + isSelfHosted: boolean; +}; + +export type Environment = { // Device isLinux: boolean; isMacOs: boolean; @@ -55,6 +51,8 @@ export type Environment = { isFireFox: boolean; isMobile: boolean; isChrome: boolean; + isPwa: boolean; + chromeVersion?: number; }; @@ -64,17 +62,9 @@ export function setupGlobal() { } let environment: Environment; - const isDebug = process.env.NODE_ENV === 'development'; if (!globalThis.navigator) { environment = { - isDesktopEdition: false, - isMobileEdition: false, - isElectron: false, - isDesktopWeb: false, - isMobileWeb: false, - isMobile: false, - isDebug, isLinux: false, isMacOs: false, isSafari: false, @@ -82,17 +72,13 @@ export function setupGlobal() { isFireFox: false, isChrome: false, isIOS: false, + isPwa: false, + isMobile: false, }; } else { const uaHelper = new UaHelper(globalThis.navigator); environment = { - isDesktopEdition: BUILD_CONFIG.distribution !== 'mobile', - isMobileEdition: BUILD_CONFIG.distribution === 'mobile', - isDesktopWeb: BUILD_CONFIG.distribution === 'web', - isMobileWeb: BUILD_CONFIG.distribution === 'mobile', - isElectron, - isDebug, isMobile: uaHelper.isMobile, isLinux: uaHelper.isLinux, isMacOs: uaHelper.isMacOs, @@ -101,12 +87,10 @@ export function setupGlobal() { isFireFox: uaHelper.isFireFox, isChrome: uaHelper.isChrome, isIOS: uaHelper.isIOS, - isStandalone: uaHelper.isStandalone, + isPwa: uaHelper.isStandalone, }; // Chrome on iOS is still Safari if (environment.isChrome && !environment.isIOS) { - assertEquals(environment.isSafari, false); - assertEquals(environment.isFireFox, false); environment = { ...environment, isSafari: false, diff --git a/packages/common/infra/src/atom/settings.ts b/packages/common/infra/src/atom/settings.ts index e926bf86e..18d54a5d4 100644 --- a/packages/common/infra/src/atom/settings.ts +++ b/packages/common/infra/src/atom/settings.ts @@ -44,7 +44,7 @@ export const dateFormatOptions: DateFormats[] = [ ]; const appSettingBaseAtom = atomWithStorage('affine-settings', { - clientBorder: environment.isElectron && !environment.isWindows, + clientBorder: BUILD_CONFIG.isElectron && !environment.isWindows, windowFrameStyle: 'frameless', dateFormat: dateFormatOptions[0], startWeekOnMonday: false, @@ -61,7 +61,7 @@ type SetStateAction = Value | ((prev: Value) => Value); const appSettingEffect = atomEffect(get => { const settings = get(appSettingBaseAtom); // some values in settings should be synced into electron side - if (environment.isElectron) { + if (BUILD_CONFIG.isElectron) { logger.debug('sync settings to electron', settings); // this api type in @affine/electron-api, but it is circular dependency this package, use any here (window as any).apis?.updater diff --git a/packages/common/infra/src/livedata/effect/index.ts b/packages/common/infra/src/livedata/effect/index.ts index e42837a01..19c93f18c 100644 --- a/packages/common/infra/src/livedata/effect/index.ts +++ b/packages/common/infra/src/livedata/effect/index.ts @@ -75,7 +75,7 @@ export function effect( export function effect(...args: any[]) { const subject$ = new Subject(); - const effectLocation = environment.isDebug + const effectLocation = BUILD_CONFIG.debug ? `(${new Error().stack?.split('\n')[2].trim()})` : ''; diff --git a/packages/common/infra/src/modules/feature-flag/constant.ts b/packages/common/infra/src/modules/feature-flag/constant.ts index 715c48315..bff97cce8 100644 --- a/packages/common/infra/src/modules/feature-flag/constant.ts +++ b/packages/common/infra/src/modules/feature-flag/constant.ts @@ -1,7 +1,7 @@ import type { FlagInfo } from './types'; const isNotStableBuild = BUILD_CONFIG.appBuildType !== 'stable'; -const isDesktopEnvironment = environment.isElectron; +const isDesktopEnvironment = BUILD_CONFIG.isElectron; const isCanaryBuild = BUILD_CONFIG.appBuildType === 'canary'; export const AFFINE_FLAGS = { diff --git a/packages/frontend/apps/electron/renderer/app.tsx b/packages/frontend/apps/electron/renderer/app.tsx index 927a90842..b3bcae6bd 100644 --- a/packages/frontend/apps/electron/renderer/app.tsx +++ b/packages/frontend/apps/electron/renderer/app.tsx @@ -43,8 +43,8 @@ const desktopWhiteList = [ '/magic-link', ]; if ( - !environment.isElectron && - environment.isDebug && + !BUILD_CONFIG.isElectron && + BUILD_CONFIG.debug && desktopWhiteList.every(path => !location.pathname.startsWith(path)) ) { document.body.innerHTML = `

Don't run electron entry in browser.

`; diff --git a/packages/frontend/apps/electron/renderer/index.tsx b/packages/frontend/apps/electron/renderer/index.tsx index 41b06f014..9183a640e 100644 --- a/packages/frontend/apps/electron/renderer/index.tsx +++ b/packages/frontend/apps/electron/renderer/index.tsx @@ -39,7 +39,7 @@ function main() { performanceMainLogger.info('skip setup'); } else { performanceMainLogger.info('setup start'); - if (window.SENTRY_RELEASE || environment.isDebug) { + if (BUILD_CONFIG.debug || window.SENTRY_RELEASE) { // https://docs.sentry.io/platforms/javascript/guides/electron/ init({ dsn: process.env.SENTRY_DSN, diff --git a/packages/frontend/apps/electron/renderer/shell/shell.tsx b/packages/frontend/apps/electron/renderer/shell/shell.tsx index 88470d712..115f91913 100644 --- a/packages/frontend/apps/electron/renderer/shell/shell.tsx +++ b/packages/frontend/apps/electron/renderer/shell/shell.tsx @@ -1,4 +1,4 @@ -import { AppFallback } from '@affine/core/components/affine/app-container'; +import { ShellAppFallback } from '@affine/core/components/affine/app-container'; import { useAppSettingHelper } from '@affine/core/hooks/affine/use-app-setting-helper'; import { AppTabsHeader } from '@affine/core/modules/app-tabs-header'; import { SplitViewFallback } from '@affine/core/modules/workbench/view/split-view/split-view'; @@ -8,15 +8,15 @@ import * as styles from './shell.css'; export function ShellRoot() { const { appSettings } = useAppSettingHelper(); const translucent = - environment.isElectron && + BUILD_CONFIG.isElectron && environment.isMacOs && appSettings.enableBlurBackground; return (
- + - +
); } diff --git a/packages/frontend/apps/electron/scripts/common.ts b/packages/frontend/apps/electron/scripts/common.ts index b61851b8f..a35117165 100644 --- a/packages/frontend/apps/electron/scripts/common.ts +++ b/packages/frontend/apps/electron/scripts/common.ts @@ -2,7 +2,7 @@ import { resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; // eslint-disable-next-line @typescript-eslint/no-restricted-imports -import { getRuntimeConfig } from '@affine/cli/src/webpack/runtime-config'; +import { getBuildConfig } from '@affine/cli/src/webpack/runtime-config'; import { sentryEsbuildPlugin } from '@sentry/esbuild-plugin'; import type { BuildOptions, Plugin } from 'esbuild'; @@ -20,8 +20,8 @@ export const config = (): BuildOptions => { define['REPLACE_ME_BUILD_ENV'] = `"${process.env.BUILD_TYPE ?? 'stable'}"`; - define['runtimeConfig'] = JSON.stringify( - getRuntimeConfig({ + define['BUILD_CONFIG'] = JSON.stringify( + getBuildConfig({ channel: (process.env.BUILD_TYPE as any) ?? 'canary', distribution: 'desktop', mode: diff --git a/packages/frontend/apps/electron/src/main/windows-manager/main-window.ts b/packages/frontend/apps/electron/src/main/windows-manager/main-window.ts index 89388762d..fccf07afb 100644 --- a/packages/frontend/apps/electron/src/main/windows-manager/main-window.ts +++ b/packages/frontend/apps/electron/src/main/windows-manager/main-window.ts @@ -254,10 +254,10 @@ export async function openUrlInHiddenWindow(urlObj: URL) { preload: join(__dirname, './preload.js'), additionalArguments: await getWindowAdditionalArguments(), }, - show: environment.isDebug, + show: BUILD_CONFIG.debug, }); - if (environment.isDebug) { + if (BUILD_CONFIG.debug) { win.webContents.openDevTools({ mode: 'detach', }); diff --git a/packages/frontend/apps/mobile/src/app.tsx b/packages/frontend/apps/mobile/src/app.tsx index e4aa05c01..6cc4237f9 100644 --- a/packages/frontend/apps/mobile/src/app.tsx +++ b/packages/frontend/apps/mobile/src/app.tsx @@ -29,11 +29,6 @@ import { RouterProvider } from 'react-router-dom'; import { configureMobileModules } from './modules'; import { router } from './router'; -if (environment.isElectron && environment.isDebug) { - document.body.innerHTML = `

Don't run web entry in electron.

`; - throw new Error('Wrong distribution'); -} - const future = { v7_startTransition: true, } as const; diff --git a/packages/frontend/apps/mobile/src/index.tsx b/packages/frontend/apps/mobile/src/index.tsx index 654d7cb48..4b77280fb 100644 --- a/packages/frontend/apps/mobile/src/index.tsx +++ b/packages/frontend/apps/mobile/src/index.tsx @@ -20,7 +20,7 @@ import { App } from './app'; const performanceMainLogger = performanceLogger.namespace('main'); function main() { performanceMainLogger.info('setup start'); - if (window.SENTRY_RELEASE || environment.isDebug) { + if (BUILD_CONFIG.debug || window.SENTRY_RELEASE) { // https://docs.sentry.io/platforms/javascript/guides/react/#configure init({ dsn: process.env.SENTRY_DSN, diff --git a/packages/frontend/apps/mobile/src/pages/workspace/index.tsx b/packages/frontend/apps/mobile/src/pages/workspace/index.tsx index dc3df4f29..9e3251c0b 100644 --- a/packages/frontend/apps/mobile/src/pages/workspace/index.tsx +++ b/packages/frontend/apps/mobile/src/pages/workspace/index.tsx @@ -125,8 +125,8 @@ export const Component = () => { if (workspaceNotFound) { if ( - detailDocRoute /* */ && - environment.isDesktopEdition /* only browser has share page */ + BUILD_CONFIG.isDesktopEdition /* only browser has share page */ && + detailDocRoute ) { return
TODO: share page
; } diff --git a/packages/frontend/apps/web/src/app.tsx b/packages/frontend/apps/web/src/app.tsx index 745568c37..77f0e0c2c 100644 --- a/packages/frontend/apps/web/src/app.tsx +++ b/packages/frontend/apps/web/src/app.tsx @@ -31,11 +31,6 @@ import { import { Suspense } from 'react'; import { RouterProvider } from 'react-router-dom'; -if (environment.isElectron && environment.isDebug) { - document.body.innerHTML = `

Don't run web entry in electron.

`; - throw new Error('Wrong distribution'); -} - const performanceI18nLogger = performanceLogger.namespace('i18n'); const cache = createEmotionCache(); diff --git a/packages/frontend/apps/web/src/index.tsx b/packages/frontend/apps/web/src/index.tsx index e1442525d..903d002e4 100644 --- a/packages/frontend/apps/web/src/index.tsx +++ b/packages/frontend/apps/web/src/index.tsx @@ -23,11 +23,11 @@ function main() { performanceMainLogger.info('start'); // skip bootstrap setup for desktop onboarding - if (environment.isElectron && appInfo?.windowName === 'onboarding') { + if (BUILD_CONFIG.isElectron && appInfo?.windowName === 'onboarding') { performanceMainLogger.info('skip setup'); } else { performanceMainLogger.info('setup start'); - if (window.SENTRY_RELEASE || environment.isDebug) { + if (BUILD_CONFIG.debug || window.SENTRY_RELEASE) { // https://docs.sentry.io/platforms/javascript/guides/react/#configure init({ dsn: process.env.SENTRY_DSN, diff --git a/packages/frontend/component/.storybook/main.ts b/packages/frontend/component/.storybook/main.ts index afe8324b6..738019c9c 100644 --- a/packages/frontend/component/.storybook/main.ts +++ b/packages/frontend/component/.storybook/main.ts @@ -3,7 +3,7 @@ import { StorybookConfig } from '@storybook/react-vite'; import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; import swc from 'unplugin-swc'; import { mergeConfig } from 'vite'; -import { getRuntimeConfig } from '@affine/cli/src/webpack/runtime-config'; +import { getBuildConfig } from '@affine/cli/src/webpack/runtime-config'; export default { stories: ['../src/ui/**/*.@(mdx|stories.@(js|jsx|ts|tsx))'], @@ -54,13 +54,12 @@ export default { ], define: { 'process.env.CAPTCHA_SITE_KEY': `"${process.env.CAPTCHA_SITE_KEY}"`, - runtimeConfig: getRuntimeConfig({ + runtimeConfig: getBuildConfig({ distribution: 'web', mode: 'development', channel: 'canary', static: false, coverage: false, - static: false, }), }, }); diff --git a/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx b/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx index 90747aff2..5f734e989 100644 --- a/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx +++ b/packages/frontend/component/src/components/affine-other-page-layout/layout.tsx @@ -20,7 +20,7 @@ export const AffineOtherPageLayout = ({ return (
- {environment.isElectron ? ( + {BUILD_CONFIG.isElectron ? (
) : (
diff --git a/packages/frontend/component/src/components/auth-components/onboarding-page.tsx b/packages/frontend/component/src/components/auth-components/onboarding-page.tsx index cd948a8a8..a366f7999 100644 --- a/packages/frontend/component/src/components/auth-components/onboarding-page.tsx +++ b/packages/frontend/component/src/components/auth-components/onboarding-page.tsx @@ -119,8 +119,8 @@ export const OnboardingPage = ({ () => questions?.[questionIdx], [questionIdx, questions] ); - const isMacosDesktop = environment.isElectron && environment.isMacOs; - const isWindowsDesktop = environment.isElectron && environment.isWindows; + const isMacosDesktop = BUILD_CONFIG.isElectron && environment.isMacOs; + const isWindowsDesktop = BUILD_CONFIG.isElectron && environment.isWindows; if (!questions) { return null; diff --git a/packages/frontend/component/src/components/theme-provider/index.tsx b/packages/frontend/component/src/components/theme-provider/index.tsx index 0a0b4c9fc..d5c12434c 100644 --- a/packages/frontend/component/src/components/theme-provider/index.tsx +++ b/packages/frontend/component/src/components/theme-provider/index.tsx @@ -10,7 +10,7 @@ const DesktopThemeSync = memo(function DesktopThemeSync() { const lastThemeRef = useRef(theme); const onceRef = useRef(false); if (lastThemeRef.current !== theme || !onceRef.current) { - if (environment.isElectron && theme) { + if (BUILD_CONFIG.isElectron && theme) { apis?.ui .handleThemeChange(theme as 'dark' | 'light' | 'system') .catch(err => { diff --git a/packages/frontend/component/src/ui/button/button.tsx b/packages/frontend/component/src/ui/button/button.tsx index cbccad705..acc066adf 100644 --- a/packages/frontend/component/src/ui/button/button.tsx +++ b/packages/frontend/component/src/ui/button/button.tsx @@ -162,7 +162,7 @@ export const Button = forwardRef( data-size={size} data-variant={variant} data-no-hover={withoutHover || undefined} - data-mobile={environment.isMobileEdition} + data-mobile={BUILD_CONFIG.isMobileEdition} onClick={handleClick} > ({ checked, selected, block, - [mobileMenuItem]: environment.isMobileEdition, + [mobileMenuItem]: BUILD_CONFIG.isMobileEdition, }, propsClassName ); diff --git a/packages/frontend/component/src/ui/modal/modal.tsx b/packages/frontend/component/src/ui/modal/modal.tsx index d38409477..b15f17b2c 100644 --- a/packages/frontend/component/src/ui/modal/modal.tsx +++ b/packages/frontend/component/src/ui/modal/modal.tsx @@ -149,7 +149,7 @@ export const ModalInner = forwardRef( children, contentWrapperClassName, contentWrapperStyle, - animation = environment.isMobileEdition ? 'slideBottom' : 'fadeScaleTop', + animation = BUILD_CONFIG.isMobileEdition ? 'slideBottom' : 'fadeScaleTop', fullScreen, ...otherProps } = props; @@ -208,7 +208,7 @@ export const ModalInner = forwardRef( `anim-${animation}`, styles.modalOverlay, overlayClassName, - { mobile: environment.isMobileEdition } + { mobile: BUILD_CONFIG.isMobileEdition } )} style={{ ...overlayStyle, @@ -216,7 +216,7 @@ export const ModalInner = forwardRef( {...otherOverlayOptions} > (
, - keyBinding: environment.isElectron + keyBinding: BUILD_CONFIG.isElectron ? { binding: '$mod+N', skipRegister: true, @@ -73,7 +73,7 @@ export function registerAffineCreationCommands({ icon: , label: t['com.affine.cmdk.affine.import-workspace'](), preconditionStrategy: () => { - return environment.isElectron; + return BUILD_CONFIG.isElectron; }, run() { track.$.cmdk.workspace.createWorkspace({ diff --git a/packages/frontend/core/src/commands/affine-settings.tsx b/packages/frontend/core/src/commands/affine-settings.tsx index f5dd31496..85effdcb6 100644 --- a/packages/frontend/core/src/commands/affine-settings.tsx +++ b/packages/frontend/core/src/commands/affine-settings.tsx @@ -183,7 +183,7 @@ export function registerAffineSettingsCommands({ `, category: 'affine:settings', icon: , - preconditionStrategy: () => environment.isElectron, + preconditionStrategy: () => BUILD_CONFIG.isElectron, run() { track.$.cmdk.settings.changeAppSetting({ key: 'clientBorder', @@ -231,7 +231,7 @@ export function registerAffineSettingsCommands({ ]()}`, category: 'affine:settings', icon: , - preconditionStrategy: () => environment.isElectron, + preconditionStrategy: () => BUILD_CONFIG.isElectron, run() { track.$.cmdk.settings.changeAppSetting({ key: 'enableNoisyBackground', @@ -257,7 +257,8 @@ export function registerAffineSettingsCommands({ ]()}`, category: 'affine:settings', icon: , - preconditionStrategy: () => environment.isElectron && environment.isMacOs, + preconditionStrategy: () => + BUILD_CONFIG.isElectron && environment.isMacOs, run() { track.$.cmdk.settings.changeAppSetting({ key: 'enableBlurBackground', diff --git a/packages/frontend/core/src/components/affine/app-container.tsx b/packages/frontend/core/src/components/affine/app-container.tsx index 254186678..d0fa95b8e 100644 --- a/packages/frontend/core/src/components/affine/app-container.tsx +++ b/packages/frontend/core/src/components/affine/app-container.tsx @@ -2,7 +2,7 @@ import clsx from 'clsx'; import type { PropsWithChildren, ReactElement } from 'react'; import { useAppSettingHelper } from '../../hooks/affine/use-app-setting-helper'; -import { AppSidebarFallback } from '../app-sidebar'; +import { AppSidebarFallback, ShellAppSidebarFallback } from '../app-sidebar'; import type { WorkspaceRootProps } from '../workspace'; import { AppContainer as AppContainerWithoutSettings, @@ -16,11 +16,7 @@ export const AppContainer = (props: WorkspaceRootProps) => { return ( ); @@ -36,7 +32,7 @@ export const AppFallback = ({ @@ -44,3 +40,17 @@ export const AppFallback = ({ ); }; + +export const ShellAppFallback = ({ + className, + children, +}: PropsWithChildren<{ + className?: string; +}>): ReactElement => { + return ( + + + {children} + + ); +}; diff --git a/packages/frontend/core/src/components/affine/auth/oauth.tsx b/packages/frontend/core/src/components/affine/auth/oauth.tsx index fa0c10236..fa0464756 100644 --- a/packages/frontend/core/src/components/affine/auth/oauth.tsx +++ b/packages/frontend/core/src/components/affine/auth/oauth.tsx @@ -50,10 +50,10 @@ function OAuthProvider({ provider }: { provider: OAuthProviderType }) { const onClick = useCallback(() => { let oauthUrl = - (environment.isElectron ? BUILD_CONFIG.serverUrlPrefix : '') + + (BUILD_CONFIG.isElectron ? BUILD_CONFIG.serverUrlPrefix : '') + `/oauth/login?provider=${provider}`; - if (environment.isElectron) { + if (BUILD_CONFIG.isElectron) { oauthUrl += `&client=${appInfo?.schema}`; } diff --git a/packages/frontend/core/src/components/affine/auth/send-email.tsx b/packages/frontend/core/src/components/affine/auth/send-email.tsx index d882d46cc..b562e7ac7 100644 --- a/packages/frontend/core/src/components/affine/auth/send-email.tsx +++ b/packages/frontend/core/src/components/affine/auth/send-email.tsx @@ -122,7 +122,7 @@ const useSendEmail = (emailType: AuthPanelProps<'sendEmail'>['emailType']) => { return trigger({ email, callbackUrl: `/auth/${callbackUrl}?isClient=${ - environment.isElectron ? 'true' : 'false' + BUILD_CONFIG.isElectron ? 'true' : 'false' }`, }); }, diff --git a/packages/frontend/core/src/components/affine/auth/use-captcha.tsx b/packages/frontend/core/src/components/affine/auth/use-captcha.tsx index 8d8a2cd25..44f94d2b8 100644 --- a/packages/frontend/core/src/components/affine/auth/use-captcha.tsx +++ b/packages/frontend/core/src/components/affine/auth/use-captcha.tsx @@ -14,7 +14,7 @@ type Challenge = { }; const challengeFetcher = async (url: string) => { - if (!environment.isElectron) { + if (!BUILD_CONFIG.isElectron) { return undefined; } @@ -31,7 +31,7 @@ const challengeFetcher = async (url: string) => { }; const generateChallengeResponse = async (challenge: string) => { - if (!environment.isElectron) { + if (!BUILD_CONFIG.isElectron) { return undefined; } @@ -56,7 +56,7 @@ export const Captcha = () => { return null; } - if (environment.isElectron) { + if (BUILD_CONFIG.isElectron) { if (response) { return
Making Challenge
; } else { @@ -86,8 +86,8 @@ export const useCaptcha = (): [string | undefined, string?] => { useEffect(() => { if ( + BUILD_CONFIG.isElectron && hasCaptchaFeature && - environment.isElectron && challenge?.challenge && prevChallenge.current !== challenge.challenge ) { @@ -104,7 +104,7 @@ export const useCaptcha = (): [string | undefined, string?] => { return ['XXXX.DUMMY.TOKEN.XXXX']; } - if (environment.isElectron) { + if (BUILD_CONFIG.isElectron) { if (response) { return [response, challenge?.challenge]; } else { diff --git a/packages/frontend/core/src/components/affine/empty/action-button.tsx b/packages/frontend/core/src/components/affine/empty/action-button.tsx index bc28cd5bb..7eaccd5d0 100644 --- a/packages/frontend/core/src/components/affine/empty/action-button.tsx +++ b/packages/frontend/core/src/components/affine/empty/action-button.tsx @@ -17,11 +17,11 @@ export const ActionButton = ({ diff --git a/packages/frontend/core/src/components/affine/subscription-landing/notify.tsx b/packages/frontend/core/src/components/affine/subscription-landing/notify.tsx index a9f8450bc..4f3d99040 100644 --- a/packages/frontend/core/src/components/affine/subscription-landing/notify.tsx +++ b/packages/frontend/core/src/components/affine/subscription-landing/notify.tsx @@ -49,7 +49,6 @@ const SubscriptionChangedNotifyFooter = ({ ); }; -const isDesktop = environment.isElectron; export const useUpgradeNotify = () => { const t = useI18n(); const prevNotifyIdRef = useRef(null); @@ -71,7 +70,7 @@ export const useUpgradeNotify = () => { { { // do not float app sidebar on desktop - if (environment.isElectron) { + if (BUILD_CONFIG.isElectron) { return; } @@ -77,8 +77,9 @@ export function AppSidebar({ children }: PropsWithChildren) { }; }, [open, setFloating, setOpen, width]); - const hasRightBorder = !environment.isElectron && !clientBorder; - const isMacosDesktop = environment.isElectron && environment.isMacOs; + const hasRightBorder = !BUILD_CONFIG.isElectron && !clientBorder; + const isMacosDesktop = BUILD_CONFIG.isElectron && environment.isMacOs; + return ( <>
); -}; +} + +export function FallbackHeaderSkeleton() { + return ( + <> + + + + + ); +} const randomWidth = () => { return Math.floor(Math.random() * 200) + 100; @@ -195,17 +210,44 @@ export const AppSidebarFallback = (): ReactElement | null => { const width = useAtomValue(appSidebarWidthAtom); const { appSettings } = useAppSettingHelper(); const clientBorder = appSettings.clientBorder; - const hasRightBorder = !environment.isElectron && !clientBorder; return (
+
+ ); +}; + +/** + * NOTE(@forehalo): this is a copy of [AppSidebarFallback] without [WorkspaceNavigator] which will introduce a lot useless dependencies for shell(tab bar) + */ +export const ShellAppSidebarFallback = () => { + const width = useAtomValue(appSidebarWidthAtom); + const { appSettings } = useAppSettingHelper(); + const clientBorder = appSettings.clientBorder; + + return ( +
+