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'); +});