From 6310e5f83ba3d1c01bad776eda70332a582810b5 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 13 Mar 2024 15:55:34 +0800 Subject: [PATCH] update form --- .../api/src/resolvers/integrations/index.ts | 35 --------- .../api/src/services/integrations/index.ts | 6 +- .../mutations/setIntegrationMutation.ts | 2 + .../pages/settings/integrations/notion.tsx | 78 ++++++++++++++----- 4 files changed, 66 insertions(+), 55 deletions(-) diff --git a/packages/api/src/resolvers/integrations/index.ts b/packages/api/src/resolvers/integrations/index.ts index d50992b28..d0bfc45d1 100644 --- a/packages/api/src/resolvers/integrations/index.ts +++ b/packages/api/src/resolvers/integrations/index.ts @@ -34,7 +34,6 @@ import { import { analytics } from '../../utils/analytics' import { deleteTask, - enqueueExportAllItems, enqueueImportFromIntegration, } from '../../utils/createTask' import { authorized } from '../../utils/gql-utils' @@ -85,40 +84,6 @@ export const setIntegrationResolver = authorized< // save integration const integration = await saveIntegration(integrationToSave, uid) - if (integrationToSave.type === IntegrationType.Export && !input.id) { - const authToken = await createIntegrationToken({ - uid, - token: integration.token, - }) - if (!authToken) { - log.error('failed to create auth token', { - integrationId: integration.id, - }) - return { - errorCodes: [SetIntegrationErrorCode.BadRequest], - } - } - - // create a task to sync all the pages if new integration or enable integration (export type) - await enqueueExportAllItems(integration.id, uid) - } else if (integrationToSave.taskName) { - // delete the task if disable integration and task exists - const result = await deleteTask(integrationToSave.taskName) - if (result) { - log.info('task deleted', integrationToSave.taskName) - } - - // update task name in integration - await updateIntegration( - integration.id, - { - taskName: null, - }, - uid - ) - integration.taskName = null - } - analytics.capture({ distinctId: uid, event: 'integration_set', diff --git a/packages/api/src/services/integrations/index.ts b/packages/api/src/services/integrations/index.ts index a925a2765..2f2b99f0d 100644 --- a/packages/api/src/services/integrations/index.ts +++ b/packages/api/src/services/integrations/index.ts @@ -80,7 +80,11 @@ export const saveIntegration = async ( userId: string ) => { return authTrx( - async (t) => t.getRepository(Integration).save(integration), + async (t) => { + const repo = t.getRepository(Integration) + const newIntegration = await repo.save(integration) + return repo.findOneByOrFail({ id: newIntegration.id }) + }, undefined, userId ) diff --git a/packages/web/lib/networking/mutations/setIntegrationMutation.ts b/packages/web/lib/networking/mutations/setIntegrationMutation.ts index 66434ae7c..0c0bc4b6d 100644 --- a/packages/web/lib/networking/mutations/setIntegrationMutation.ts +++ b/packages/web/lib/networking/mutations/setIntegrationMutation.ts @@ -16,6 +16,7 @@ export type SetIntegrationInput = { token: string enabled: boolean importItemState?: ImportItemState + settings?: any } type SetIntegrationResult = { @@ -52,6 +53,7 @@ export async function setIntegrationMutation( enabled createdAt updatedAt + settings } } ... on SetIntegrationError { diff --git a/packages/web/pages/settings/integrations/notion.tsx b/packages/web/pages/settings/integrations/notion.tsx index 47a541114..0d1107993 100644 --- a/packages/web/pages/settings/integrations/notion.tsx +++ b/packages/web/pages/settings/integrations/notion.tsx @@ -1,5 +1,14 @@ import { styled } from '@stitches/react' -import { Button, Checkbox, Form, FormProps, Input, Space, Switch } from 'antd' +import { + Button, + Checkbox, + Form, + FormProps, + Input, + message, + Space, + Switch, +} from 'antd' import 'antd/dist/antd.compact.css' import { CheckboxValueType } from 'antd/lib/checkbox/Group' import Image from 'next/image' @@ -12,6 +21,7 @@ import { import { PageMetaData } from '../../../components/patterns/PageMetaData' import { Beta } from '../../../components/templates/Beta' import { SettingsLayout } from '../../../components/templates/SettingsLayout' +import { setIntegrationMutation } from '../../../lib/networking/mutations/setIntegrationMutation' import { useGetIntegrationsQuery } from '../../../lib/networking/queries/useGetIntegrationsQuery' interface FieldData { @@ -38,11 +48,12 @@ const Header = styled(Box, { export default function Notion(): JSX.Element { const { integrations, revalidate } = useGetIntegrationsQuery() - const fields = useMemo(() => { - const notion = integrations.find( - (i) => i.name == 'NOTION' && i.type == 'EXPORT' - ) - return [ + const notion = useMemo( + () => integrations.find((i) => i.name == 'NOTION' && i.type == 'EXPORT'), + [integrations] + ) + const fields = useMemo( + () => [ { name: 'parentPageId', value: notion?.settings?.parentPageId, @@ -53,19 +64,43 @@ export default function Notion(): JSX.Element { }, { name: 'autoSync', - checked: notion?.settings?.autoSync, + value: notion?.settings?.autoSync, }, { name: 'properties', value: notion?.settings?.properties, }, - ] - }, [integrations]) + ], + [notion] + ) const [form] = Form.useForm() + const [messageApi, contextHolder] = message.useMessage() - const onFinish: FormProps['onFinish'] = (values) => { - console.log('Success:', values) + const updateNotion = async (values: FieldType) => { + if (!notion) { + throw new Error('Notion integration not found') + } + + await setIntegrationMutation({ + id: notion.id, + name: notion.name, + type: notion.type, + token: notion.token, + enabled: notion.enabled, + settings: values, + }) + } + + const onFinish: FormProps['onFinish'] = async (values) => { + try { + await updateNotion(values) + + revalidate() + messageApi.success('Notion settings updated successfully.') + } catch (error) { + messageApi.error('There was an error updating Notion settings.') + } } const onFinishFailed: FormProps['onFinishFailed'] = ( @@ -76,11 +111,11 @@ export default function Notion(): JSX.Element { const onDataChange = (value: Array) => { form.setFieldsValue({ properties: value.map((v) => v.toString()) }) - form.submit() } return ( <> + {contextHolder} - - - - + @@ -136,7 +166,11 @@ export default function Notion(): JSX.Element { - label="Automatic Sync" name="autoSync"> + + label="Automatic Sync" + name="autoSync" + valuePropName="checked" + > @@ -150,6 +184,12 @@ export default function Notion(): JSX.Element { Notes + + + +