Skip to content

Commit

Permalink
feat(core): show login modal if not logged in when using ai (#6632)
Browse files Browse the repository at this point in the history
  • Loading branch information
CatsJuice committed Apr 22, 2024
1 parent efe3b05 commit d7e0821
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { useConfirmModal } from '@affine/component';
import { authAtom } from '@affine/core/atoms';
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { atom, useAtom, useSetAtom } from 'jotai';
import { useCallback, useEffect } from 'react';

export const showAILoginRequiredAtom = atom(false);

export const AiLoginRequiredModal = () => {
const t = useAFFiNEI18N();
const [open, setOpen] = useAtom(showAILoginRequiredAtom);
const setAuth = useSetAtom(authAtom);
const { openConfirmModal, closeConfirmModal } = useConfirmModal();

const openSignIn = useCallback(() => {
setAuth(prev => ({ ...prev, openModal: true }));
}, [setAuth]);

useEffect(() => {
if (open) {
openConfirmModal({
title: t['com.affine.ai.login-required.dialog-title'](),
description: t['com.affine.ai.login-required.dialog-content'](),
onConfirm: () => {
setOpen(false);
openSignIn();
},
confirmButtonOptions: {
children: t['com.affine.ai.login-required.dialog-confirm'](),
type: 'primary',
},
cancelText: t['com.affine.ai.login-required.dialog-cancel'](),
onOpenChange: setOpen,
});
} else {
closeConfirmModal();
}
}, [closeConfirmModal, open, openConfirmModal, openSignIn, setOpen, t]);

return null;
};
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { showAILoginRequiredAtom } from '@affine/core/components/affine/auth/ai-login-required';
import {
createCopilotMessageMutation,
createCopilotSessionMutation,
Expand All @@ -14,6 +15,7 @@ import {
PaymentRequiredError,
UnauthorizedError,
} from '@blocksuite/blocks';
import { getCurrentStore } from '@toeverything/infra';

type OptionsField<T extends GraphQLQuery> =
RequestOptions<T>['variables'] extends { options: infer U } ? U : never;
Expand All @@ -29,6 +31,7 @@ const fetcher = async <Query extends GraphQLQuery>(

switch (code) {
case 401:
getCurrentStore().set(showAILoginRequiredAtom, true);
throw new UnauthorizedError();
case 402:
throw new PaymentRequiredError();
Expand Down
7 changes: 7 additions & 0 deletions packages/frontend/core/src/providers/modal-provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,12 @@ const HistoryTipsModal = lazy(() =>
}))
);

const AiLoginRequiredModal = lazy(() =>
import('../components/affine/auth/ai-login-required').then(module => ({
default: module.AiLoginRequiredModal,
}))
);

export const Setting = () => {
const [{ open, workspaceMetadata, activeTab }, setOpenSettingModalAtom] =
useAtom(openSettingModalAtom);
Expand Down Expand Up @@ -206,6 +212,7 @@ export function CurrentWorkspaceModals() {
{currentWorkspace?.flavour === WorkspaceFlavour.AFFINE_CLOUD && (
<CloudQuotaModal />
)}
<AiLoginRequiredModal />
</>
);
}
Expand Down
6 changes: 5 additions & 1 deletion packages/frontend/i18n/src/resources/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1304,5 +1304,9 @@
"com.affine.ai-onboarding.local.action-dismiss": "Dismiss",
"com.affine.ai-onboarding.local.action-learn-more": "Learn More",
"com.affine.ai-onboarding.edgeless.title": "Meet AFFiNE AI",
"com.affine.ai-onboarding.edgeless.message": "Lets you think bigger, create faster, work smarter and save time for every project."
"com.affine.ai-onboarding.edgeless.message": "Lets you think bigger, create faster, work smarter and save time for every project.",
"com.affine.ai.login-required.dialog-title": "Sign in to Continue",
"com.affine.ai.login-required.dialog-content": "To use AFFiNE AI, please sign in to your AFFiNE Cloud account.",
"com.affine.ai.login-required.dialog-confirm": "Sign in",
"com.affine.ai.login-required.dialog-cancel": "Cancel"
}

0 comments on commit d7e0821

Please sign in to comment.