void) | null) => void;
onDeleteAssets?: (assets: EditorAsset[]) => void;
}) {
const assetListRef = useRef
(null);
const assetLibrary = useImageCanvasAssetLibrary({
assetListRef,
+ canAccessProtectedData,
openEditorLoginModal,
onDeleteAssets,
});
@@ -259,6 +262,15 @@ describe('useImageCanvasAssetLibrary', () => {
});
});
+ it('does not request the protected asset library before login is available', () => {
+ render();
+
+ expect(loadEditorAssetLibraryMock).not.toHaveBeenCalled();
+ expect(screen.getByTestId('folders').textContent).toBe(
+ 'project:项目素材:false',
+ );
+ });
+
it('creates a local folder and replaces it with the persisted folder id', async () => {
let resolveCreateFolder: (
folder: Awaited>,
diff --git a/src/components/image-editor/useImageCanvasAssetLibrary.ts b/src/components/image-editor/useImageCanvasAssetLibrary.ts
index 48e44cd9..4d650bfb 100644
--- a/src/components/image-editor/useImageCanvasAssetLibrary.ts
+++ b/src/components/image-editor/useImageCanvasAssetLibrary.ts
@@ -40,10 +40,12 @@ function isEditorAuthError(error: unknown) {
export function useImageCanvasAssetLibrary({
assetListRef,
+ canAccessProtectedData,
openEditorLoginModal,
onDeleteAssets,
}: {
assetListRef: RefObject;
+ canAccessProtectedData: boolean;
openEditorLoginModal: (postLoginAction?: (() => void) | null) => void;
onDeleteAssets?: (assets: EditorAsset[]) => void;
}) {
@@ -94,6 +96,9 @@ export function useImageCanvasAssetLibrary({
selectableAssets.every((asset) => selectedAssetIds.has(asset.id));
useEffect(() => {
+ if (!canAccessProtectedData) {
+ return undefined;
+ }
let cancelled = false;
loadEditorAssetLibrary()
.then((library) => {
@@ -118,7 +123,7 @@ export function useImageCanvasAssetLibrary({
return () => {
cancelled = true;
};
- }, [openEditorLoginModal]);
+ }, [canAccessProtectedData, openEditorLoginModal]);
const resolveAssetFolderId = useCallback(
(clientX: number, clientY: number) => {
diff --git a/src/components/image-editor/useImageCanvasProjectPersistence.test.tsx b/src/components/image-editor/useImageCanvasProjectPersistence.test.tsx
index 035f6e32..ca9c0b88 100644
--- a/src/components/image-editor/useImageCanvasProjectPersistence.test.tsx
+++ b/src/components/image-editor/useImageCanvasProjectPersistence.test.tsx
@@ -43,7 +43,11 @@ function createLayer(id: string): CanvasLayer {
};
}
-function ProjectPersistenceHarness() {
+function ProjectPersistenceHarness({
+ canAccessProtectedData = true,
+}: {
+ canAccessProtectedData?: boolean;
+}) {
const [layers, setLayers] = useState([]);
const [viewport, setViewport] = useState({
x: 0,
@@ -79,6 +83,7 @@ function ProjectPersistenceHarness() {
},
layers,
viewport,
+ canAccessProtectedData,
openEditorLoginModal: vi.fn(),
});
@@ -169,4 +174,12 @@ describe('useImageCanvasProjectPersistence', () => {
);
});
});
+
+ it('does not load protected project data before login is available', () => {
+ render();
+
+ expect(loadOrCreateRecentEditorProjectMock).not.toHaveBeenCalled();
+ expect(loadEditorProjectMock).not.toHaveBeenCalled();
+ expect(screen.getByTestId('project-id').textContent).toBe('-');
+ });
});
diff --git a/src/components/image-editor/useImageCanvasProjectPersistence.ts b/src/components/image-editor/useImageCanvasProjectPersistence.ts
index d5144a19..0592bbd8 100644
--- a/src/components/image-editor/useImageCanvasProjectPersistence.ts
+++ b/src/components/image-editor/useImageCanvasProjectPersistence.ts
@@ -46,12 +46,14 @@ export function useImageCanvasProjectPersistence({
setters,
layers,
viewport,
+ canAccessProtectedData,
openEditorLoginModal,
}: {
refs: ImageCanvasProjectPersistenceRefs;
setters: ImageCanvasProjectPersistenceSetters;
layers: CanvasLayer[];
viewport: CanvasViewport;
+ canAccessProtectedData: boolean;
openEditorLoginModal: (postLoginAction?: (() => void) | null) => void;
}) {
const projectIdRef = useRef(null);
@@ -145,6 +147,10 @@ export function useImageCanvasProjectPersistence({
);
useEffect(() => {
+ if (!canAccessProtectedData) {
+ setIsProjectReady(false);
+ return undefined;
+ }
let cancelled = false;
const projectIdFromQuery =
typeof window === 'undefined'
@@ -202,7 +208,12 @@ export function useImageCanvasProjectPersistence({
return () => {
cancelled = true;
};
- }, [createProjectResourceForLayer, openEditorLoginModal, setters]);
+ }, [
+ canAccessProtectedData,
+ createProjectResourceForLayer,
+ openEditorLoginModal,
+ setters,
+ ]);
useEffect(() => {
if (!projectId || !isProjectReady) {