From 583bbf34639b87931d415c004218208917b19483 Mon Sep 17 00:00:00 2001 From: fundon Date: Tue, 25 Mar 2025 07:58:40 +0000 Subject: [PATCH] fix(editor): improve affine-link toolbar (#11159) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: [BS-2884](https://linear.app/affine-design/issue/BS-2884/[ui]-hover-邮箱的-toolbar) --- .../link/src/link-node/configs/toolbar.ts | 11 +++++ blocksuite/affine/shared/src/utils/url.ts | 7 +-- tests/affine-local/e2e/links.spec.ts | 44 +++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/blocksuite/affine/inlines/link/src/link-node/configs/toolbar.ts b/blocksuite/affine/inlines/link/src/link-node/configs/toolbar.ts index 378a611aa..ba12ad0ed 100644 --- a/blocksuite/affine/inlines/link/src/link-node/configs/toolbar.ts +++ b/blocksuite/affine/inlines/link/src/link-node/configs/toolbar.ts @@ -316,6 +316,17 @@ export const builtinInlineLinkToolbarConfig = { ) return false; + const { link } = target; + try { + const url = new URL(link); + if (!url.protocol.startsWith('http')) { + return false; + } + } catch (err) { + console.error(err); + return false; + } + const { model } = target.block; const parent = model.parent; if (!parent) return false; diff --git a/blocksuite/affine/shared/src/utils/url.ts b/blocksuite/affine/shared/src/utils/url.ts index 6a24ef539..edb51b7e4 100644 --- a/blocksuite/affine/shared/src/utils/url.ts +++ b/blocksuite/affine/shared/src/utils/url.ts @@ -148,10 +148,11 @@ export function isUrlInClipboard(clipboardData: DataTransfer) { return isValidUrl(url); } -export function getHostName(url: string) { +export function getHostName(link: string) { try { - return new URL(url).hostname; + const url = new URL(link); + return url.hostname || url.pathname; } catch { - return url; + return link; } } diff --git a/tests/affine-local/e2e/links.spec.ts b/tests/affine-local/e2e/links.spec.ts index f534a0517..7d9e6fd98 100644 --- a/tests/affine-local/e2e/links.spec.ts +++ b/tests/affine-local/e2e/links.spec.ts @@ -1125,3 +1125,47 @@ test('should save open doc mode of internal links', async ({ page }) => { 'Open in center peek' ); }); + +test('should show full email address', async ({ page }) => { + await page.keyboard.press('Enter'); + + await writeTextToClipboard(page, 'dev@affine.pro'); + await pasteByKeyboard(page); + + const inlineLink = page.locator('affine-link'); + + await expect(inlineLink).toHaveText('dev@affine.pro'); + + await inlineLink.hover(); + + const { toolbar, switchViewBtn } = toolbarButtons(page); + + await expect(toolbar).toBeVisible(); + await expect(switchViewBtn).toBeHidden(); + + await expect(toolbar.locator('affine-link-preview')).toHaveText( + 'dev@affine.pro' + ); +}); + +test('should not show view toggle button when protocol of link is not http(s)', async ({ + page, +}) => { + await page.keyboard.press('Enter'); + + await writeTextToClipboard(page, 'ftp://affine.pro/blocksuite.pdf'); + await pasteByKeyboard(page); + + const inlineLink = page.locator('affine-link'); + + await expect(inlineLink).toHaveText('ftp://affine.pro/blocksuite.pdf'); + + await inlineLink.hover(); + + const { toolbar, switchViewBtn } = toolbarButtons(page); + + await expect(toolbar).toBeVisible(); + await expect(switchViewBtn).toBeHidden(); + + await expect(toolbar.locator('affine-link-preview')).toHaveText('affine.pro'); +});