diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/card.css.ts b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/card.css.ts index 7728b2259d..781f3ff454 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/card.css.ts +++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/card.css.ts @@ -13,6 +13,12 @@ export const card = style({ flexDirection: 'column', background: cssVarV2.layer.background.overlayPanel, cursor: 'pointer', + color: 'unset', + selectors: { + '&:visited': { + color: 'unset', + }, + }, }); export const cardHeader = style({ display: 'flex', diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/card.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/card.tsx index 20a7d9194c..041a15cc2e 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/card.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/card.tsx @@ -14,9 +14,22 @@ import { export const IntegrationCard = ({ className, + link, ...props -}: HTMLAttributes) => { - return
; +}: HTMLAttributes & { + link?: string; +}) => { + return link ? ( + + ) : ( +
+ ); }; export const IntegrationCardIcon = ({ diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/constants.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/constants.tsx index 5f3a720a78..75ff12b82a 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/constants.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/constants.tsx @@ -1,20 +1,26 @@ import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import { IntegrationTypeIcon } from '@affine/core/modules/integration'; import type { I18nString } from '@affine/i18n'; -import { TodayIcon } from '@blocksuite/icons/rc'; +import { Logo1Icon, TodayIcon } from '@blocksuite/icons/rc'; import { LiveData } from '@toeverything/infra'; import type { ReactNode } from 'react'; import { CalendarSettingPanel } from './calendar/setting-panel'; import { ReadwiseSettingPanel } from './readwise/setting-panel'; -interface IntegrationCard { +type IntegrationCard = { id: string; name: I18nString; desc: I18nString; icon: ReactNode; - setting: ReactNode; -} +} & ( + | { + setting: ReactNode; + } + | { + link: string; + } +); const INTEGRATION_LIST = [ { @@ -31,6 +37,13 @@ const INTEGRATION_LIST = [ icon: , setting: , }, + { + id: 'web-clipper' as const, + name: 'com.affine.integration.web-clipper.name', + desc: 'com.affine.integration.web-clipper.desc', + icon: , + link: 'https://chromewebstore.google.com/detail/affine-web-clipper/mpbbkmbdpleomiogkbkkpfoljjpahmoi', + }, ] satisfies (IntegrationCard | false)[]; type IntegrationId = Exclude< diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/index.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/index.tsx index ebd4341fb4..5d6e1080e6 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/index.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/index.tsx @@ -2,7 +2,7 @@ import { SettingHeader } from '@affine/component/setting-components'; import { FeatureFlagService } from '@affine/core/modules/feature-flag'; import { useI18n } from '@affine/i18n'; import { useLiveData, useService } from '@toeverything/infra'; -import { type ReactNode, useMemo, useState } from 'react'; +import { type ReactNode, useCallback, useMemo, useState } from 'react'; import { SubPageProvider, useSubPageIsland } from '../../sub-page'; import { @@ -11,6 +11,7 @@ import { IntegrationCardHeader, } from './card'; import { getAllowedIntegrationList$ } from './constants'; +import { type IntegrationItem } from './constants'; import { list } from './index.css'; export const IntegrationSetting = () => { @@ -25,6 +26,12 @@ export const IntegrationSetting = () => { ) ); + const handleCardClick = useCallback((card: IntegrationItem) => { + if ('setting' in card && card.setting) { + setOpened(card.id); + } + }, []); + return ( <> { : t[item.desc.i18nKey](); return (
  • - setOpened(item.id)}> + handleCardClick(item)} + link={'link' in item ? item.link : undefined} + > - setOpened(null)} - > - {item.setting} - + + {'setting' in item && item.setting ? ( + setOpened(null)} + > + {item.setting} + + ) : null}
  • ); })} diff --git a/packages/frontend/i18n/src/i18n.gen.ts b/packages/frontend/i18n/src/i18n.gen.ts index 4285b90097..74ae3672dd 100644 --- a/packages/frontend/i18n/src/i18n.gen.ts +++ b/packages/frontend/i18n/src/i18n.gen.ts @@ -7415,6 +7415,14 @@ export function useAFFiNEI18N(): { * `Integrations` */ ["com.affine.integration.integrations"](): string; + /** + * `Web Clipper` + */ + ["com.affine.integration.web-clipper.name"](): string; + /** + * `Import web pages to AFFiNE` + */ + ["com.affine.integration.web-clipper.desc"](): string; /** * `Elevate your AFFiNE experience with diverse add-ons and seamless integrations.` */ diff --git a/packages/frontend/i18n/src/resources/en.json b/packages/frontend/i18n/src/resources/en.json index 480e5b3ed2..1dd3ae2d25 100644 --- a/packages/frontend/i18n/src/resources/en.json +++ b/packages/frontend/i18n/src/resources/en.json @@ -1854,6 +1854,8 @@ "com.affine.failed-to-send-request.description": "Unable to process your request to join <1/> <2>{{workspaceName}} with <3>{{userEmail}}, the workspace has reached its member limit. Please contact the workspace owner for available seats.", "com.affine.integration.name.readwise": "Readwise", "com.affine.integration.integrations": "Integrations", + "com.affine.integration.web-clipper.name": "Web Clipper", + "com.affine.integration.web-clipper.desc": "Import web pages to AFFiNE", "com.affine.integration.setting.description": "Elevate your AFFiNE experience with diverse add-ons and seamless integrations.", "com.affine.integration.setting.learn": "Learn how to develop a integration for AFFiNE", "com.affine.integration.readwise.name": "Readwise",