diff --git a/src/generators/node/appExtensions.test.ts b/src/generators/node/appExtensions.test.ts index f46e5c6..1980efe 100644 --- a/src/generators/node/appExtensions.test.ts +++ b/src/generators/node/appExtensions.test.ts @@ -153,9 +153,9 @@ describe('generateAppExtensions', () => { await generateAppExtensions(tmpDir, options); const app = await readFile(join(tmpDir, 'frontend/app-extension-ui/src/Panel.tsx'), 'utf-8'); - expect(app).not.toContain('@pipedrive/app-extensions-sdk'); - expect(app).not.toContain('OPEN_MODAL'); expect(app).not.toContain('CLOSE_MODAL'); + expect(app).not.toContain('CUSTOM_MODAL'); + expect(app).not.toContain('VITE_CUSTOM_MODAL_ACTION_ID'); expect(app).not.toContain('Open modal'); expect(app).not.toContain('Close modal'); }); diff --git a/src/generators/node/appExtensions/frontend.ts b/src/generators/node/appExtensions/frontend.ts index cefc610..1547421 100644 --- a/src/generators/node/appExtensions/frontend.ts +++ b/src/generators/node/appExtensions/frontend.ts @@ -39,6 +39,8 @@ function viteConfigContent(): string { export default defineConfig({ root, base: '/extensions/', + // Load .env from the project root so VITE_* variables are available + envDir: '../../', plugins: [react()], build: { outDir: 'dist', @@ -172,15 +174,14 @@ function frontendTsConfig(): Record { } function panelComponentContent(hasModal: boolean): string { - const sdkImportLine = hasModal ? "import { Command, Modal } from '@pipedrive/app-extensions-sdk';" : ''; - const runSdkActionDestructure = hasModal ? ', runSdkAction' : ''; const openModalHandler = hasModal ? dedent` async function openCustomModal(): Promise { - await runSdkAction('Custom modal opened', (client) => + await runSdkAction('Modal opened', (client) => client.execute(Command.OPEN_MODAL, { type: Modal.CUSTOM_MODAL, - action_id: 'custom-modal', + // Replace with your Custom Modal's "Extension identifier" from Marketplace Developer Hub → App Extensions + action_id: import.meta.env.VITE_CUSTOM_MODAL_ACTION_ID, data: { source: 'panel' }, }), ); @@ -195,11 +196,10 @@ function panelComponentContent(hasModal: boolean): string { ` : ''; - const sdkImportPrefix = sdkImportLine ? sdkImportLine + '\n' : ''; - return dedent` import { useEffect } from 'react'; - ${sdkImportPrefix}import { usePipedriveSdk } from '../shared/pipedriveSdk'; + import { Command, Modal } from '@pipedrive/app-extensions-sdk'; + import { usePipedriveSdk } from '../shared/pipedriveSdk'; function formatQueryValue(key: string, value: string): string { return /token|secret|code/i.test(key) ? 'Present' : value; @@ -212,7 +212,7 @@ function panelComponentContent(hasModal: boolean): string { } export default function Panel() { - const { context, status, theme, visibility, pageState, lastAction, signedTokenPreview, isReady${runSdkActionDestructure}, actions } = + const { context, status, theme, visibility, pageState, lastAction, signedTokenPreview, isReady, runSdkAction, actions } = usePipedriveSdk('panel'); const queryEntries = Object.entries(context.query); @@ -220,6 +220,19 @@ function panelComponentContent(hasModal: boolean): string { document.title = 'Custom Panel'; }, []); + async function logActivity(): Promise { + const dealId = context.query.selectedIds ? parseInt(context.query.selectedIds) : undefined; + await runSdkAction('Activity logged', (client) => + client.execute(Command.OPEN_MODAL, { + type: Modal.ACTIVITY, + prefill: { + subject: 'Follow-up', + ...(dealId ? { deal: dealId } : {}), + }, + }), + ); + } + ${openModalHandler} if (!isReady && status !== 'Local preview') { @@ -266,6 +279,9 @@ function panelComponentContent(hasModal: boolean): string {
+ @@ -273,7 +289,7 @@ function panelComponentContent(hasModal: boolean): string { Confirm