diff --git a/packages/frontend/component/src/components/page-detail-skeleton/assets/loading.dark.png b/packages/frontend/component/src/components/page-detail-skeleton/assets/loading.dark.png
new file mode 100644
index 0000000000..91fc6b565b
Binary files /dev/null and b/packages/frontend/component/src/components/page-detail-skeleton/assets/loading.dark.png differ
diff --git a/packages/frontend/component/src/components/page-detail-skeleton/assets/loading.light.png b/packages/frontend/component/src/components/page-detail-skeleton/assets/loading.light.png
new file mode 100644
index 0000000000..3ddee4d678
Binary files /dev/null and b/packages/frontend/component/src/components/page-detail-skeleton/assets/loading.light.png differ
diff --git a/packages/frontend/component/src/components/page-detail-skeleton/index.css.ts b/packages/frontend/component/src/components/page-detail-skeleton/index.css.ts
index e1612d44ee..14ba9d9d98 100644
--- a/packages/frontend/component/src/components/page-detail-skeleton/index.css.ts
+++ b/packages/frontend/component/src/components/page-detail-skeleton/index.css.ts
@@ -1,18 +1,84 @@
import { cssVar } from '@toeverything/theme';
+import { cssVarV2 } from '@toeverything/theme/v2';
import { style } from '@vanilla-extract/css';
export const pageDetailSkeletonStyle = style({
padding: '0 20px',
-});
-export const pageDetailSkeletonTitleStyle = style({
- height: '52px',
- width: '100%',
+ height: '100%',
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'center',
});
export const blockSuiteEditorStyle = style({
maxWidth: cssVar('editorWidth'),
- margin: '0 2rem',
+ margin: 'auto 2rem',
padding: '0 24px',
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: '100%',
});
-export const blockSuiteEditorHeaderStyle = style({
- marginTop: '40px',
- marginBottom: '40px',
+export const illustration = style({
+ maxWidth: '100%',
+ width: 300,
+ alignSelf: 'center',
+});
+export const content = style({
+ width: '100%',
+ textAlign: 'center',
+ maxWidth: '261px',
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ justifyContent: 'center',
+ margin: '16px auto 0',
+ selectors: {
+ '&[data-longer-loading="true"]': {
+ maxWidth: '400px',
+ },
+ },
+});
+export const loadingIcon = style({
+ marginRight: '8px',
+});
+export const title = style({
+ fontSize: cssVar('fontBase'),
+ lineHeight: 1.6,
+ fontWeight: 500,
+ color: cssVarV2('text/primary'),
+ textAlign: 'center',
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ gap: '8px',
+ marginBottom: '4px',
+});
+export const text = style({
+ fontSize: cssVar('fontSm'),
+ lineHeight: 1.6,
+ fontWeight: 400,
+ color: cssVarV2('text/secondary'),
+ textWrap: 'wrap',
+ wordBreak: 'break-word',
+ textAlign: 'center',
+ selectors: {
+ '&[data-longer-loading="true"]': {
+ textAlign: 'start',
+ },
+ },
+});
+export const actionButton = style({ marginTop: '24px' });
+export const mobileActionButton = style({
+ padding: '8px 18px',
+ height: 'auto',
+ fontWeight: 600,
+ marginTop: '24px',
+});
+
+export const actionContent = style({
+ padding: '0 4px',
+});
+export const mobileActionContent = style({
+ padding: '0 4px',
});
diff --git a/packages/frontend/component/src/components/page-detail-skeleton/index.tsx b/packages/frontend/component/src/components/page-detail-skeleton/index.tsx
index 7ae31d6001..fd345c8aa0 100644
--- a/packages/frontend/component/src/components/page-detail-skeleton/index.tsx
+++ b/packages/frontend/component/src/components/page-detail-skeleton/index.tsx
@@ -1,28 +1,89 @@
-import { Skeleton } from '../../ui/skeleton';
-import {
- blockSuiteEditorHeaderStyle,
- blockSuiteEditorStyle,
- pageDetailSkeletonStyle,
- pageDetailSkeletonTitleStyle,
-} from './index.css';
+import { Trans, useI18n } from '@affine/i18n';
+import clsx from 'clsx';
+import { useCallback } from 'react';
-export const EditorLoading = () => {
+import { Button } from '../../ui/button';
+import { Loading } from '../../ui/loading';
+import { ThemedImg } from '../../ui/themed-img';
+import imageUrlForDarkLoading from './assets/loading.dark.png';
+import imageUrlForLightLoading from './assets/loading.light.png';
+import * as styles from './index.css';
+
+export const EditorLoading = ({
+ longerLoading = false,
+}: {
+ longerLoading?: boolean;
+}) => {
+ const t = useI18n();
+ const reloadPage = useCallback(() => {
+ document.location.reload();
+ }, []);
return (
-
-
+
-
+ {longerLoading ? (
+
+
+
+ {t['com.affine.error.loading-timeout-error']()}
+
+
+
+ ),
+ }}
+ />
+
+
+
+
+ ) : (
+
+
+
+ {t['com.affine.loading']()}
+
+
+ {t['com.affine.loading.description']()}
+
+
+ )}
);
};
-export const PageDetailSkeleton = () => {
+export const PageDetailLoading = () => {
return (
-
-
+
);
diff --git a/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx b/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx
index 9f57bc686f..35c6064f47 100644
--- a/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx
+++ b/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx
@@ -9,6 +9,7 @@ import {
fontStyleOptions,
} from '@affine/core/modules/editor-setting';
import { FeatureFlagService } from '@affine/core/modules/feature-flag';
+import track from '@affine/track';
import {
customImageProxyMiddleware,
ImageProxyService,
@@ -31,7 +32,6 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import type { DefaultOpenProperty } from '../../components/doc-properties';
import { BlocksuiteDocEditor, BlocksuiteEdgelessEditor } from './lit-adaper';
-import { NoPageRootError } from './no-page-error';
import * as styles from './styles.css';
export interface AffineEditorContainer extends HTMLElement {
@@ -289,7 +289,8 @@ const BlockSuiteEditorImpl = ({
export const BlockSuiteEditor = (props: EditorProps) => {
const [isLoading, setIsLoading] = useState(true);
- const [error, setError] = useState
(null);
+ const [longerLoading, setLongerLoading] = useState(false);
+ const [loadStartTime] = useState(Date.now());
const editorSetting = useService(EditorSettingService).editorSetting;
const settings = useLiveData(
@@ -319,28 +320,41 @@ export const BlockSuiteEditor = (props: EditorProps) => {
return;
}
const timer = setTimeout(() => {
- disposable.unsubscribe();
- setError(new NoPageRootError(props.page));
+ setLongerLoading(true);
}, 20 * 1000);
+ const reportErrorTimer = setTimeout(() => {
+ if (isLoading) {
+ track.doc.$.$.loadDoc({
+ workspaceId: props.page.workspace.id,
+ docId: props.page.id,
+ // time cost in ms
+ time: Date.now() - loadStartTime,
+ success: false,
+ });
+ }
+ }, 60 * 1000);
const disposable = props.page.slots.rootAdded.subscribe(() => {
disposable.unsubscribe();
+ track.doc.$.$.loadDoc({
+ workspaceId: props.page.workspace.id,
+ docId: props.page.id,
+ time: Date.now() - loadStartTime,
+ success: true,
+ });
setIsLoading(false);
- clearTimeout(timer);
+ setLongerLoading(false);
});
return () => {
disposable.unsubscribe();
clearTimeout(timer);
+ clearTimeout(reportErrorTimer);
};
- }, [props.page]);
-
- if (error) {
- throw error;
- }
+ }, [isLoading, loadStartTime, props.page]);
return (
{isLoading ? (
-
+
) : (
)}
diff --git a/packages/frontend/core/src/components/affine/affine-error-boundary/error-basic/error-detail.tsx b/packages/frontend/core/src/components/affine/affine-error-boundary/error-basic/error-detail.tsx
index c2a8c2ad0c..ec348f2feb 100644
--- a/packages/frontend/core/src/components/affine/affine-error-boundary/error-basic/error-detail.tsx
+++ b/packages/frontend/core/src/components/affine/affine-error-boundary/error-basic/error-detail.tsx
@@ -75,8 +75,7 @@ export const ErrorDetail: FC = props => {
}, [onButtonClick, resetError]);
const desc = descriptions.map((item, i) => (
- // eslint-disable-next-line react/no-array-index-key
-
+
{item}
));
@@ -137,15 +136,17 @@ export const ErrorDetail: FC = props => {
export function ContactUS() {
return (
-
- If you are still experiencing this issue, please{' '}
-
- contact us through the community.
-
-
+
+ ),
+ }}
+ />
);
}
diff --git a/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page.tsx b/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page.tsx
index 005df1ed7d..2f3fa8bc39 100644
--- a/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page.tsx
+++ b/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page.tsx
@@ -1,20 +1,34 @@
import { Scrollable } from '@affine/component';
-import { PageDetailSkeleton } from '@affine/component/page-detail-skeleton';
+import { PageDetailLoading } from '@affine/component/page-detail-skeleton';
import type { ChatPanel } from '@affine/core/blocksuite/ai';
import { AIProvider } from '@affine/core/blocksuite/ai';
import type { AffineEditorContainer } from '@affine/core/blocksuite/block-suite-editor';
import { EditorOutlineViewer } from '@affine/core/blocksuite/outline-viewer';
+import { AffineErrorBoundary } from '@affine/core/components/affine/affine-error-boundary';
import { PageAIOnboarding } from '@affine/core/components/affine/ai-onboarding';
+import { GlobalPageHistoryModal } from '@affine/core/components/affine/page-history-modal';
import { DocPropertySidebar } from '@affine/core/components/doc-properties/sidebar';
import { useGuard } from '@affine/core/components/guard';
import { useAppSettingHelper } from '@affine/core/components/hooks/affine/use-app-setting-helper';
import { useEnableAI } from '@affine/core/components/hooks/affine/use-enable-ai';
+import { useRegisterBlocksuiteEditorCommands } from '@affine/core/components/hooks/affine/use-register-blocksuite-editor-commands';
+import { useActiveBlocksuiteEditor } from '@affine/core/components/hooks/use-block-suite-editor';
+import { PageDetailEditor } from '@affine/core/components/page-detail-editor';
+import { TrashPageFooter } from '@affine/core/components/pure/trash-page-footer';
+import { TopTip } from '@affine/core/components/top-tip';
import { DocService } from '@affine/core/modules/doc';
import { EditorService } from '@affine/core/modules/editor';
import { GlobalContextService } from '@affine/core/modules/global-context';
import { PeekViewService } from '@affine/core/modules/peek-view';
import { RecentDocsService } from '@affine/core/modules/quicksearch';
-import { ViewService } from '@affine/core/modules/workbench';
+import {
+ useIsActiveView,
+ ViewBody,
+ ViewHeader,
+ ViewService,
+ ViewSidebarTab,
+ WorkbenchService,
+} from '@affine/core/modules/workbench';
import { WorkspaceService } from '@affine/core/modules/workspace';
import { isNewTabTrigger } from '@affine/core/utils';
import track from '@affine/track';
@@ -39,20 +53,6 @@ import { memo, useCallback, useEffect, useRef, useState } from 'react';
import { useParams } from 'react-router-dom';
import type { Subscription } from 'rxjs';
-import { AffineErrorBoundary } from '../../../../components/affine/affine-error-boundary';
-import { GlobalPageHistoryModal } from '../../../../components/affine/page-history-modal';
-import { useRegisterBlocksuiteEditorCommands } from '../../../../components/hooks/affine/use-register-blocksuite-editor-commands';
-import { useActiveBlocksuiteEditor } from '../../../../components/hooks/use-block-suite-editor';
-import { PageDetailEditor } from '../../../../components/page-detail-editor';
-import { TrashPageFooter } from '../../../../components/pure/trash-page-footer';
-import { TopTip } from '../../../../components/top-tip';
-import {
- useIsActiveView,
- ViewBody,
- ViewHeader,
- ViewSidebarTab,
- WorkbenchService,
-} from '../../../../modules/workbench';
import { PageNotFound } from '../../404';
import * as styles from './detail-page.css';
import { DetailPageHeader } from './detail-page-header';
@@ -386,7 +386,7 @@ export const Component = () => {
}
+ skeleton={}
notFound={}
>
diff --git a/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx b/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx
index 560b49c04b..39ebc64b8d 100644
--- a/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx
+++ b/packages/frontend/core/src/mobile/pages/workspace/detail/mobile-detail-page.tsx
@@ -1,5 +1,5 @@
import { useThemeColorV2 } from '@affine/component';
-import { PageDetailSkeleton } from '@affine/component/page-detail-skeleton';
+import { PageDetailLoading } from '@affine/component/page-detail-skeleton';
import type { AffineEditorContainer } from '@affine/core/blocksuite/block-suite-editor';
import { AffineErrorBoundary } from '@affine/core/components/affine/affine-error-boundary';
import { useGuard } from '@affine/core/components/guard';
@@ -223,7 +223,7 @@ const DetailPageImpl = () => {
const getSkeleton = (back: boolean) => (
<>
-
+
>
);
const getNotFound = (back: boolean) => (
diff --git a/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx b/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx
index 6634124644..3f2597b9a4 100644
--- a/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx
+++ b/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx
@@ -1,5 +1,5 @@
import { Scrollable } from '@affine/component';
-import { PageDetailSkeleton } from '@affine/component/page-detail-skeleton';
+import { PageDetailLoading } from '@affine/component/page-detail-skeleton';
import { AIProvider } from '@affine/core/blocksuite/ai';
import type { AffineEditorContainer } from '@affine/core/blocksuite/block-suite-editor';
import { EditorOutlineViewer } from '@affine/core/blocksuite/outline-viewer';
@@ -160,7 +160,7 @@ function DocPeekPreviewEditor({
- }>
+ }>
+
) : (
);
diff --git a/packages/frontend/i18n/src/i18n.gen.ts b/packages/frontend/i18n/src/i18n.gen.ts
index 2dd951069c..17b5995c28 100644
--- a/packages/frontend/i18n/src/i18n.gen.ts
+++ b/packages/frontend/i18n/src/i18n.gen.ts
@@ -1989,6 +1989,10 @@ export function useAFFiNEI18N(): {
* `Doc content is missing`
*/
["com.affine.error.no-page-root.title"](): string;
+ /**
+ * `It takes longer to load the doc content.`
+ */
+ ["com.affine.error.loading-timeout-error"](): string;
/**
* `Refetch`
*/
@@ -2596,9 +2600,13 @@ export function useAFFiNEI18N(): {
*/
["com.affine.lastYear"](): string;
/**
- * `Loading...`
+ * `Loading`
*/
["com.affine.loading"](): string;
+ /**
+ * `Loading document content, please wait a moment.`
+ */
+ ["com.affine.loading.description"](): string;
/**
* `Rename`
*/
@@ -8417,6 +8425,12 @@ export const TypedTrans: {
}, {
["2"]: JSX.Element;
}>>;
+ /**
+ * `If you are still experiencing this issue, please <1>contact us through the community1>.`
+ */
+ ["com.affine.error.contact-us"]: ComponentType, {
+ ["1"]: JSX.Element;
+ }>>;
/**
* `With the workspace creator's free account, every member can access up to <1>7 days<1> of version history.`
*/
diff --git a/packages/frontend/i18n/src/resources/ar.json b/packages/frontend/i18n/src/resources/ar.json
index b7a4c0ef9c..3d2ffa21f2 100644
--- a/packages/frontend/i18n/src/resources/ar.json
+++ b/packages/frontend/i18n/src/resources/ar.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "الشهر الماضي",
"com.affine.lastWeek": "الأسبوع الماضي",
"com.affine.lastYear": "العام الماضي",
- "com.affine.loading": "جاري التحميل...",
+ "com.affine.loading": "جاري التحميل",
"com.affine.menu.rename": "إعادة التسمية",
"com.affine.mobile.search.empty": "لم يتم العثور على نتائج",
"com.affine.mobile.setting.about.appVersion": "إصدار التطبيق",
diff --git a/packages/frontend/i18n/src/resources/de.json b/packages/frontend/i18n/src/resources/de.json
index d1a692354f..5b3204b5be 100644
--- a/packages/frontend/i18n/src/resources/de.json
+++ b/packages/frontend/i18n/src/resources/de.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Letzter Monat",
"com.affine.lastWeek": "Letzte Woche",
"com.affine.lastYear": "Letztes Jahr",
- "com.affine.loading": "Laden...",
+ "com.affine.loading": "Laden",
"com.affine.menu.rename": "Umbenennen",
"com.affine.mobile.search.empty": "Keine Ergebnisse gefunden",
"com.affine.mobile.setting.about.appVersion": "App-Version",
diff --git a/packages/frontend/i18n/src/resources/el-GR.json b/packages/frontend/i18n/src/resources/el-GR.json
index 4922455e28..75e9d1ebb4 100644
--- a/packages/frontend/i18n/src/resources/el-GR.json
+++ b/packages/frontend/i18n/src/resources/el-GR.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Προηγούμενος μήνας",
"com.affine.lastWeek": "Προηγούμενη εβδομάδα",
"com.affine.lastYear": "Προηγούμενο έτος",
- "com.affine.loading": "Φόρτωση...",
+ "com.affine.loading": "Φόρτωση",
"com.affine.menu.rename": "Μετονομασία",
"com.affine.mobile.search.empty": "Δεν βρέθηκαν αποτελέσματα",
"com.affine.mobile.setting.about.appVersion": "Έκδοση εφαρμογής",
diff --git a/packages/frontend/i18n/src/resources/en.json b/packages/frontend/i18n/src/resources/en.json
index 2659f7de5b..d4cd09a2cd 100644
--- a/packages/frontend/i18n/src/resources/en.json
+++ b/packages/frontend/i18n/src/resources/en.json
@@ -496,6 +496,8 @@
"com.affine.enableAffineCloudModal.custom-server.enable": "Enable Cloud",
"com.affine.error.hide-error": "Hide error",
"com.affine.error.no-page-root.title": "Doc content is missing",
+ "com.affine.error.loading-timeout-error": "It takes longer to load the doc content.",
+ "com.affine.error.contact-us": "If you are still experiencing this issue, please <1>contact us through the community1>.",
"com.affine.error.refetch": "Refetch",
"com.affine.error.reload": "Reload AFFiNE",
"com.affine.error.retry": "Refresh",
@@ -647,7 +649,8 @@
"com.affine.lastMonth": "Last month",
"com.affine.lastWeek": "Last week",
"com.affine.lastYear": "Last year",
- "com.affine.loading": "Loading...",
+ "com.affine.loading": "Loading",
+ "com.affine.loading.description": "Loading document content, please wait a moment.",
"com.affine.menu.rename": "Rename",
"com.affine.mobile.search.empty": "No results found",
"com.affine.mobile.setting.about.appVersion": "App version",
diff --git a/packages/frontend/i18n/src/resources/es.json b/packages/frontend/i18n/src/resources/es.json
index 2d85dbd1da..537bff2bf4 100644
--- a/packages/frontend/i18n/src/resources/es.json
+++ b/packages/frontend/i18n/src/resources/es.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Mes pasado",
"com.affine.lastWeek": "La semana pasada",
"com.affine.lastYear": "El año pasado",
- "com.affine.loading": "Cargando...",
+ "com.affine.loading": "Cargando",
"com.affine.menu.rename": "Renombrar",
"com.affine.mobile.search.empty": "No se encontraron resultados",
"com.affine.mobile.setting.about.appVersion": "Versión de la Aplicación",
diff --git a/packages/frontend/i18n/src/resources/fa.json b/packages/frontend/i18n/src/resources/fa.json
index 39551db47c..cd41998f3d 100644
--- a/packages/frontend/i18n/src/resources/fa.json
+++ b/packages/frontend/i18n/src/resources/fa.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "ماه گذشته",
"com.affine.lastWeek": "هفته گذشته",
"com.affine.lastYear": "سال گذشته",
- "com.affine.loading": "در حال بارگذاری...",
+ "com.affine.loading": "در حال بارگذاری",
"com.affine.menu.rename": "تغییر نام",
"com.affine.mobile.search.empty": "نتیجهای یافت نشد",
"com.affine.mobile.setting.about.appVersion": "نسخه برنامه",
diff --git a/packages/frontend/i18n/src/resources/fr.json b/packages/frontend/i18n/src/resources/fr.json
index f8a1a24595..d1d9f1996c 100644
--- a/packages/frontend/i18n/src/resources/fr.json
+++ b/packages/frontend/i18n/src/resources/fr.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Le mois dernier",
"com.affine.lastWeek": "La semaine dernière ",
"com.affine.lastYear": "L'année dernière ",
- "com.affine.loading": "Chargement...",
+ "com.affine.loading": "Chargement",
"com.affine.menu.rename": "Renommer",
"com.affine.mobile.search.empty": "Aucun résultat trouvé",
"com.affine.mobile.setting.about.appVersion": "Version de l'application",
diff --git a/packages/frontend/i18n/src/resources/it-IT.json b/packages/frontend/i18n/src/resources/it-IT.json
index 64830b3b6a..608ed2533f 100644
--- a/packages/frontend/i18n/src/resources/it-IT.json
+++ b/packages/frontend/i18n/src/resources/it-IT.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Ultimo mese",
"com.affine.lastWeek": "Ultima settimana",
"com.affine.lastYear": "Ultimo anno",
- "com.affine.loading": "Caricamento...",
+ "com.affine.loading": "Caricamento",
"com.affine.menu.rename": "Rinomina",
"com.affine.mobile.search.empty": "Nessun risultato trovato",
"com.affine.mobile.setting.about.appVersion": "Versione dell'app",
diff --git a/packages/frontend/i18n/src/resources/ja.json b/packages/frontend/i18n/src/resources/ja.json
index 9cbaabb920..42783c35d8 100644
--- a/packages/frontend/i18n/src/resources/ja.json
+++ b/packages/frontend/i18n/src/resources/ja.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "先月",
"com.affine.lastWeek": "先週",
"com.affine.lastYear": "昨年",
- "com.affine.loading": "読み込み中...",
+ "com.affine.loading": "読み込み中",
"com.affine.menu.rename": "名前の変更",
"com.affine.mobile.search.empty": "結果が見つかりません",
"com.affine.mobile.setting.about.appVersion": "アプリ版",
diff --git a/packages/frontend/i18n/src/resources/ko.json b/packages/frontend/i18n/src/resources/ko.json
index e2c8ff7a71..a185fda880 100644
--- a/packages/frontend/i18n/src/resources/ko.json
+++ b/packages/frontend/i18n/src/resources/ko.json
@@ -809,7 +809,7 @@
"com.affine.lastMonth": "지난 달",
"com.affine.lastWeek": "지난 주",
"com.affine.lastYear": "지난 해",
- "com.affine.loading": "로딩...",
+ "com.affine.loading": "로딩",
"com.affine.moreThan30Days": "한 달 이상",
"com.affine.moveToTrash.confirmModal.description": "{{title}} 을(를) 휴지통으로 옮김",
"com.affine.moveToTrash.confirmModal.description.multiple": "{{ number }} 페이지를 휴지통으로 옮김",
diff --git a/packages/frontend/i18n/src/resources/pl.json b/packages/frontend/i18n/src/resources/pl.json
index 08020ac0ef..301b9e3f25 100644
--- a/packages/frontend/i18n/src/resources/pl.json
+++ b/packages/frontend/i18n/src/resources/pl.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Ostatni miesiąc",
"com.affine.lastWeek": "Ostatni tydzień",
"com.affine.lastYear": "Ostatni rok",
- "com.affine.loading": "Ładowanie...",
+ "com.affine.loading": "Ładowanie",
"com.affine.menu.rename": "Zmień nazwę",
"com.affine.mobile.search.empty": "Nie znaleziono wyników",
"com.affine.mobile.setting.about.appVersion": "Wersja aplikacji",
diff --git a/packages/frontend/i18n/src/resources/pt-BR.json b/packages/frontend/i18n/src/resources/pt-BR.json
index b950126e05..33856c9cd9 100644
--- a/packages/frontend/i18n/src/resources/pt-BR.json
+++ b/packages/frontend/i18n/src/resources/pt-BR.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Mês passado",
"com.affine.lastWeek": "Semana passada",
"com.affine.lastYear": "Ano passado",
- "com.affine.loading": "Carregando...",
+ "com.affine.loading": "Carregando",
"com.affine.menu.rename": "Renomear",
"com.affine.mobile.search.empty": "Nenhum resultado encontrado",
"com.affine.mobile.setting.about.appVersion": "Versão do aplicativo",
diff --git a/packages/frontend/i18n/src/resources/ru.json b/packages/frontend/i18n/src/resources/ru.json
index 0910cfbe49..39efd4236c 100644
--- a/packages/frontend/i18n/src/resources/ru.json
+++ b/packages/frontend/i18n/src/resources/ru.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Последний месяц",
"com.affine.lastWeek": "Прошлая неделя",
"com.affine.lastYear": "Прошлый год",
- "com.affine.loading": "Загрузка...",
+ "com.affine.loading": "Загрузка",
"com.affine.menu.rename": "Переименовать",
"com.affine.mobile.search.empty": "Не найдено результатов",
"com.affine.mobile.setting.about.appVersion": "Версия приложения",
diff --git a/packages/frontend/i18n/src/resources/sv-SE.json b/packages/frontend/i18n/src/resources/sv-SE.json
index 9581aead8e..defa2c0d49 100644
--- a/packages/frontend/i18n/src/resources/sv-SE.json
+++ b/packages/frontend/i18n/src/resources/sv-SE.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Senaste månaden",
"com.affine.lastWeek": "Senaste veckan",
"com.affine.lastYear": "Förra året",
- "com.affine.loading": "Laddar...",
+ "com.affine.loading": "Laddar",
"com.affine.menu.rename": "Döp om",
"com.affine.mobile.search.empty": "Inga resultat hittades",
"com.affine.mobile.setting.about.appVersion": "App Version",
diff --git a/packages/frontend/i18n/src/resources/uk.json b/packages/frontend/i18n/src/resources/uk.json
index f153f852fc..3c6fc9e5f7 100644
--- a/packages/frontend/i18n/src/resources/uk.json
+++ b/packages/frontend/i18n/src/resources/uk.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "Минулий місяць",
"com.affine.lastWeek": "Минулий тиждень",
"com.affine.lastYear": "Минулий рік",
- "com.affine.loading": "Завантаження...",
+ "com.affine.loading": "Завантаження",
"com.affine.menu.rename": "Перейменувати",
"com.affine.mobile.search.empty": "Нічого не знайдено",
"com.affine.mobile.setting.about.appVersion": "Версія додатка",
diff --git a/packages/frontend/i18n/src/resources/zh-Hans.json b/packages/frontend/i18n/src/resources/zh-Hans.json
index 02851e655e..e1436192ab 100644
--- a/packages/frontend/i18n/src/resources/zh-Hans.json
+++ b/packages/frontend/i18n/src/resources/zh-Hans.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "上个月",
"com.affine.lastWeek": "上周",
"com.affine.lastYear": "去年",
- "com.affine.loading": "加载中...",
+ "com.affine.loading": "加载中",
"com.affine.menu.rename": "重命名",
"com.affine.mobile.search.empty": "找到 0 个结果",
"com.affine.mobile.setting.about.appVersion": "应用版本",
diff --git a/packages/frontend/i18n/src/resources/zh-Hant.json b/packages/frontend/i18n/src/resources/zh-Hant.json
index c10621e13f..cda9563ca4 100644
--- a/packages/frontend/i18n/src/resources/zh-Hant.json
+++ b/packages/frontend/i18n/src/resources/zh-Hant.json
@@ -642,7 +642,7 @@
"com.affine.lastMonth": "上個月",
"com.affine.lastWeek": "上個星期",
"com.affine.lastYear": "去年",
- "com.affine.loading": "載入中⋯⋯",
+ "com.affine.loading": "載入中",
"com.affine.menu.rename": "重新命名",
"com.affine.mobile.search.empty": "找到 0 個結果",
"com.affine.mobile.setting.about.appVersion": "App 版本",
diff --git a/packages/frontend/track/src/events.ts b/packages/frontend/track/src/events.ts
index 2ac854cd0b..3db14350d2 100644
--- a/packages/frontend/track/src/events.ts
+++ b/packages/frontend/track/src/events.ts
@@ -49,6 +49,7 @@ type DocEvents =
| 'openDocOptionsMenu'
| 'openDocInfo'
| 'copyBlockToLink'
+ | 'loadDoc'
| 'bookmark'
| 'editProperty'
| 'editPropertyMeta'
@@ -409,6 +410,9 @@ const PageEvents = {
},
},
doc: {
+ $: {
+ $: ['loadDoc'],
+ },
editor: {
slashMenu: ['linkDoc', 'createDoc', 'bookmark'],
atMenu: [
@@ -714,6 +718,12 @@ export type EventArgs = {
type: 'member' | 'invite' | 'more';
};
noAccessPrompted: {};
+ loadDoc: {
+ workspaceId: string;
+ docId: string;
+ time: number;
+ success: boolean;
+ };
};
// for type checking