diff --git a/packages/editor-ui/src/api/workflow-webhooks.ts b/packages/editor-ui/src/api/workflow-webhooks.ts index 0822147bfdfd5..99ef13cb0518d 100644 --- a/packages/editor-ui/src/api/workflow-webhooks.ts +++ b/packages/editor-ui/src/api/workflow-webhooks.ts @@ -12,7 +12,7 @@ export async function fetchNextOnboardingPrompt( return await get(N8N_API_BASE_URL, ONBOARDING_PROMPTS_ENDPOINT, { instance_id: instanceId, user_id: `${instanceId}#${currentUser.id}`, - is_owner: currentUser.isOwner, + is_owner: currentUser.isOwner ?? false, survey_results: currentUser.personalizationAnswers, }); } diff --git a/packages/editor-ui/src/components/PersonalizationModal.vue b/packages/editor-ui/src/components/PersonalizationModal.vue index a07e680ee528f..e8b4a16eeffb6 100644 --- a/packages/editor-ui/src/components/PersonalizationModal.vue +++ b/packages/editor-ui/src/components/PersonalizationModal.vue @@ -757,29 +757,32 @@ export default defineComponent({ getAccountAge(this.usersStore.currentUser || ({} as IUser)) <= ONBOARDING_PROMPT_TIMEBOX ) { const onboardingResponse = await this.uiStore.getNextOnboardingPrompt(); + + if (!onboardingResponse) { + return; + } + const promptTimeout = onboardingResponse.toast_sequence_number === 1 ? FIRST_ONBOARDING_PROMPT_TIMEOUT : 1000; - if (onboardingResponse.title && onboardingResponse.description) { - setTimeout(async () => { - this.showToast({ - type: 'info', - title: onboardingResponse.title, - message: onboardingResponse.description, - duration: 0, - customClass: 'clickable', - closeOnClick: true, - onClick: () => { - this.$telemetry.track('user clicked onboarding toast', { - seq_num: onboardingResponse.toast_sequence_number, - title: onboardingResponse.title, - description: onboardingResponse.description, - }); - this.uiStore.openModal(ONBOARDING_CALL_SIGNUP_MODAL_KEY); - }, - }); - }, promptTimeout); - } + setTimeout(async () => { + this.showToast({ + type: 'info', + title: onboardingResponse.title, + message: onboardingResponse.description, + duration: 0, + customClass: 'clickable', + closeOnClick: true, + onClick: () => { + this.$telemetry.track('user clicked onboarding toast', { + seq_num: onboardingResponse.toast_sequence_number, + title: onboardingResponse.title, + description: onboardingResponse.description, + }); + this.uiStore.openModal(ONBOARDING_CALL_SIGNUP_MODAL_KEY); + }, + }); + }, promptTimeout); } }, }, diff --git a/packages/editor-ui/src/stores/ui.store.ts b/packages/editor-ui/src/stores/ui.store.ts index ff2444ef74fa2..bea7f29252d34 100644 --- a/packages/editor-ui/src/stores/ui.store.ts +++ b/packages/editor-ui/src/stores/ui.store.ts @@ -46,7 +46,6 @@ import type { IFakeDoorLocation, INodeUi, IOnboardingCallPrompt, - IUser, UIState, UTMCampaign, XYPosition, @@ -64,6 +63,7 @@ import { useWorkflowsStore } from '@/stores/workflows.store'; import { useSettingsStore } from '@/stores/settings.store'; import { hasPermission } from '@/rbac/permissions'; import { useTelemetryStore } from '@/stores/telemetry.store'; +import { useUsersStore } from '@/stores/users.store'; import { dismissBannerPermanently } from '@/api/ui'; import type { BannerName } from 'n8n-workflow'; import { @@ -73,7 +73,6 @@ import { isValidTheme, updateTheme, } from './ui.utils'; -import { useUsersStore } from './users.store'; let savedTheme: ThemeOption = 'system'; try { @@ -465,26 +464,37 @@ export const useUIStore = defineStore(STORES.UI, { this.setMode(CREDENTIAL_EDIT_MODAL_KEY, 'new'); this.openModal(CREDENTIAL_EDIT_MODAL_KEY); }, - async getNextOnboardingPrompt(): Promise { + async getNextOnboardingPrompt(): Promise { const rootStore = useRootStore(); const instanceId = rootStore.instanceId; - // TODO: current USER - const currentUser = {} as IUser; - return await fetchNextOnboardingPrompt(instanceId, currentUser); + const { currentUser } = useUsersStore(); + if (currentUser) { + return await fetchNextOnboardingPrompt(instanceId, currentUser); + } + return null; }, - async applyForOnboardingCall(email: string): Promise { + async applyForOnboardingCall(email: string): Promise { const rootStore = useRootStore(); const instanceId = rootStore.instanceId; - // TODO: current USER - const currentUser = {} as IUser; - return await applyForOnboardingCall(instanceId, currentUser, email); + const { currentUser } = useUsersStore(); + if (currentUser) { + return await applyForOnboardingCall(instanceId, currentUser, email); + } + return null; }, - async submitContactEmail(email: string, agree: boolean): Promise { + async submitContactEmail(email: string, agree: boolean): Promise { const rootStore = useRootStore(); const instanceId = rootStore.instanceId; - // TODO: current USER - const currentUser = {} as IUser; - return await submitEmailOnSignup(instanceId, currentUser, email || currentUser.email, agree); + const { currentUser } = useUsersStore(); + if (currentUser) { + return await submitEmailOnSignup( + instanceId, + currentUser, + email ?? currentUser?.email, + agree, + ); + } + return null; }, openCommunityPackageUninstallConfirmModal(packageName: string) { this.setActiveId(COMMUNITY_PACKAGE_CONFIRM_MODAL_KEY, packageName); diff --git a/packages/editor-ui/src/views/NodeView.vue b/packages/editor-ui/src/views/NodeView.vue index a1fa81c85b935..19947ef05f5ca 100644 --- a/packages/editor-ui/src/views/NodeView.vue +++ b/packages/editor-ui/src/views/NodeView.vue @@ -865,9 +865,9 @@ export default defineComponent({ ) { const onboardingResponse = await this.uiStore.getNextOnboardingPrompt(); const promptTimeout = - onboardingResponse.toast_sequence_number === 1 ? FIRST_ONBOARDING_PROMPT_TIMEOUT : 1000; + onboardingResponse?.toast_sequence_number === 1 ? FIRST_ONBOARDING_PROMPT_TIMEOUT : 1000; - if (onboardingResponse.title && onboardingResponse.description) { + if (onboardingResponse?.title && onboardingResponse?.description) { setTimeout(async () => { this.showToast({ type: 'info',