Skip to content

Commit

Permalink
feat(core): create and open cloud workspace if not exists after logge…
Browse files Browse the repository at this point in the history
…d in
  • Loading branch information
CatsJuice committed Apr 11, 2024
1 parent f03e20b commit faf1ea7
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 11 deletions.
11 changes: 7 additions & 4 deletions packages/frontend/core/src/hooks/use-navigate-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,13 @@ export function useNavigateHelper() {
);

const jumpToIndex = useCallback(
(logic: RouteLogic = RouteLogic.PUSH) => {
return navigate('/', {
replace: logic === RouteLogic.REPLACE,
});
(logic: RouteLogic = RouteLogic.PUSH, opt?: { search?: string }) => {
return navigate(
{ pathname: '/', search: opt?.search },
{
replace: logic === RouteLogic.REPLACE,
}
);
},
[navigate]
);
Expand Down
47 changes: 42 additions & 5 deletions packages/frontend/core/src/pages/index.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
import { Menu } from '@affine/component/ui/menu';
import { WorkspaceFlavour } from '@affine/env/workspace';
import {
initEmptyPage,
useLiveData,
useService,
WorkspaceListService,
WorkspaceManager,
} from '@toeverything/infra';
import { lazy, useEffect, useLayoutEffect, useState } from 'react';
import type { LoaderFunction } from 'react-router-dom';
import {
lazy,
useCallback,
useEffect,
useLayoutEffect,
useRef,
useState,
} from 'react';
import { type LoaderFunction, useSearchParams } from 'react-router-dom';

import { createFirstAppData } from '../bootstrap/first-app-data';
import { UserWithWorkspaceList } from '../components/pure/workspace-slider-bar/user-with-workspace-list';
import { WorkspaceFallback } from '../components/workspace';
import { useSession } from '../hooks/affine/use-current-user';
import { useNavigateHelper } from '../hooks/use-navigate-helper';
import { WorkspaceSubPath } from '../shared';

Expand All @@ -28,25 +38,52 @@ export const Component = () => {
// navigating and creating may be slow, to avoid flickering, we show workspace fallback
const [navigating, setNavigating] = useState(false);
const [creating, setCreating] = useState(false);
const { status } = useSession();
const workspaceManager = useService(WorkspaceManager);

const list = useLiveData(useService(WorkspaceListService).workspaceList$);

const { openPage } = useNavigateHelper();
const [searchParams] = useSearchParams();

const createOnceRef = useRef(false);

const createCloudWorkspace = useCallback(() => {
if (createOnceRef.current) return;
createOnceRef.current = true;
workspaceManager
.createWorkspace(WorkspaceFlavour.AFFINE_CLOUD, async workspace => {
workspace.meta.setName('AFFiNE Cloud');
const page = workspace.createDoc();
initEmptyPage(page);
})
.then(workspace => openPage(workspace.id, WorkspaceSubPath.ALL))
.catch(err => console.error('Failed to create cloud workspace', err));
}, [openPage, workspaceManager]);

useLayoutEffect(() => {
if (list.length === 0) {
return;
}
// check is user logged in && has cloud workspace
if (
searchParams.get('initCloud') === 'true' &&
status === 'authenticated'
) {
searchParams.delete('initCloud');
if (list.every(w => w.flavour !== WorkspaceFlavour.AFFINE_CLOUD)) {
createCloudWorkspace();
return;
}
}

// open last workspace
const lastId = localStorage.getItem('last_workspace_id');

const openWorkspace = list.find(w => w.id === lastId) ?? list[0];
openPage(openWorkspace.id, WorkspaceSubPath.ALL);
setNavigating(true);
}, [list, openPage]);

const workspaceManager = useService(WorkspaceManager);
}, [createCloudWorkspace, list, openPage, searchParams, status]);

useEffect(() => {
setCreating(true);
Expand Down
8 changes: 6 additions & 2 deletions packages/frontend/core/src/pages/sign-in.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { SignInPageContainer } from '@affine/component/auth-components';
import { useAtom } from 'jotai';
import { useCallback, useEffect, useRef } from 'react';
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
import { useLocation, useNavigate } from 'react-router-dom';
import { useLocation, useNavigate, useSearchParams } from 'react-router-dom';

import { authAtom } from '../atoms';
import type { AuthProps } from '../components/affine/auth';
Expand All @@ -27,6 +27,7 @@ export const SignIn = () => {
const navigate = useNavigate();
const { jumpToIndex } = useNavigateHelper();
const subscriptionData = useSubscriptionSearch();
const [searchParams] = useSearchParams();

const isLoggedIn = loginStatus === 'authenticated';

Expand All @@ -49,7 +50,9 @@ export const SignIn = () => {
replace: true,
});
} else {
jumpToIndex(RouteLogic.REPLACE);
jumpToIndex(RouteLogic.REPLACE, {
search: searchParams.toString(),
});
}
}
}, [
Expand All @@ -59,6 +62,7 @@ export const SignIn = () => {
setAuthAtom,
subscriptionData,
isLoggedIn,
searchParams,
]);

const onSetEmailType = useCallback(
Expand Down

0 comments on commit faf1ea7

Please sign in to comment.