fix(core): creating multiple workspaces with consecutive clicks (#6259)

Closes #6213
This commit is contained in:
fundon
2024-03-23 12:29:46 +00:00
parent 62a6075675
commit 7e161682f0
@@ -39,6 +39,7 @@ interface ModalProps {
} }
interface NameWorkspaceContentProps extends ConfirmModalProps { interface NameWorkspaceContentProps extends ConfirmModalProps {
loading: boolean;
onConfirmName: ( onConfirmName: (
name: string, name: string,
workspaceFlavour: WorkspaceFlavour, workspaceFlavour: WorkspaceFlavour,
@@ -50,6 +51,7 @@ const shouldEnableCloud =
!runtimeConfig.allowLocalWorkspace && !environment.isDesktop; !runtimeConfig.allowLocalWorkspace && !environment.isDesktop;
const NameWorkspaceContent = ({ const NameWorkspaceContent = ({
loading,
onConfirmName, onConfirmName,
...props ...props
}: NameWorkspaceContentProps) => { }: NameWorkspaceContentProps) => {
@@ -108,7 +110,7 @@ const NameWorkspaceContent = ({
cancelText={t['com.affine.nameWorkspace.button.cancel']()} cancelText={t['com.affine.nameWorkspace.button.cancel']()}
confirmButtonOptions={{ confirmButtonOptions={{
type: 'primary', type: 'primary',
disabled: !workspaceName, disabled: !workspaceName || loading,
['data-testid' as string]: 'create-workspace-create-button', ['data-testid' as string]: 'create-workspace-create-button',
children: t['com.affine.nameWorkspace.button.create'](), children: t['com.affine.nameWorkspace.button.create'](),
}} }}
@@ -180,6 +182,7 @@ export const CreateWorkspaceModal = ({
const [step, setStep] = useState<CreateWorkspaceStep>(); const [step, setStep] = useState<CreateWorkspaceStep>();
const t = useAFFiNEI18N(); const t = useAFFiNEI18N();
const workspaceManager = useService(WorkspaceManager); const workspaceManager = useService(WorkspaceManager);
const [loading, setLoading] = useState(false);
// todo: maybe refactor using xstate? // todo: maybe refactor using xstate?
useLayoutEffect(() => { useLayoutEffect(() => {
@@ -224,6 +227,9 @@ export const CreateWorkspaceModal = ({
const onConfirmName = useAsyncCallback( const onConfirmName = useAsyncCallback(
async (name: string, workspaceFlavour: WorkspaceFlavour) => { async (name: string, workspaceFlavour: WorkspaceFlavour) => {
if (loading) return;
setLoading(true);
// this will be the last step for web for now // this will be the last step for web for now
// fix me later // fix me later
if (runtimeConfig.enablePreloading) { if (runtimeConfig.enablePreloading) {
@@ -247,8 +253,10 @@ export const CreateWorkspaceModal = ({
); );
onCreate(id); onCreate(id);
} }
setLoading(false);
}, },
[onCreate, workspaceManager] [loading, onCreate, workspaceManager]
); );
const onOpenChange = useCallback( const onOpenChange = useCallback(
@@ -259,9 +267,11 @@ export const CreateWorkspaceModal = ({
}, },
[onClose] [onClose]
); );
if (step === 'name-workspace') { if (step === 'name-workspace') {
return ( return (
<NameWorkspaceContent <NameWorkspaceContent
loading={loading}
open={mode !== false && !!step} open={mode !== false && !!step}
onOpenChange={onOpenChange} onOpenChange={onOpenChange}
onConfirmName={onConfirmName} onConfirmName={onConfirmName}