Skip to content

Commit

Permalink
Fix link target validation in ExternalLinkBlock (#2102)
Browse files Browse the repository at this point in the history
## Problem:

The validation in the ExternalLinkBlock was broken. The `isValid` check
uses `isLinkTarget` for validation:


https://github.com/vivid-planet/comet/blob/9867242fa6bad4849de58ccce1c28b816cc109a3/packages/admin/cms-admin/src/blocks/ExternalLinkBlock.tsx#L42-L44

The `targetUrl` field uses `validateUrl`:


https://github.com/vivid-planet/comet/blob/9867242fa6bad4849de58ccce1c28b816cc109a3/packages/admin/cms-admin/src/blocks/ExternalLinkBlock.tsx#L66-L73

The problem was that `validateUrl` internally used `isUrl` from class
validator. `isUrl` is less strict than `isLinkTarget`. This resulted in
no validation error in the UI but an error when trying to save the
block:


https://github.com/vivid-planet/comet/assets/13380047/a6c91ce1-94a5-4aac-a755-ef497a506504

## Solution:

I added `validateLinkTarget` using the stricter `isLinkTarget` check.
  • Loading branch information
thomasdax98 committed May 23, 2024
1 parent 1e55a77 commit 815ba51
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 2 deletions.
8 changes: 8 additions & 0 deletions .changeset/six-meals-lie.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@comet/cms-admin": patch
---

Fix link target validation in `ExternalLinkBlock`

Previously, two different validation checks were used.
This resulted in an error when saving an invalid link target but no error message was shown.
4 changes: 2 additions & 2 deletions packages/admin/cms-admin/src/blocks/ExternalLinkBlock.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { FormattedMessage } from "react-intl";

import { ExternalLinkBlockData, ExternalLinkBlockInput } from "../blocks.generated";
import { isLinkTarget } from "../validation/isLinkTarget";
import { validateUrl } from "../validation/validateUrl";
import { validateLinkTarget } from "../validation/validateLinkTarget";

type State = ExternalLinkBlockData;

Expand Down Expand Up @@ -68,7 +68,7 @@ export const ExternalLinkBlock: BlockInterface<ExternalLinkBlockData, State, Ext
name="targetUrl"
component={FinalFormInput}
fullWidth
validate={(url) => validateUrl(url)}
validate={(url) => validateLinkTarget(url)}
disableContentTranslation
/>
<Field name="openInNewWindow" type="checkbox">
Expand Down
10 changes: 10 additions & 0 deletions packages/admin/cms-admin/src/validation/validateLinkTarget.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import React from "react";
import { FormattedMessage } from "react-intl";

import { isLinkTarget } from "./isLinkTarget";

export function validateLinkTarget(linkTarget: string) {
if (!isLinkTarget(linkTarget)) {
return <FormattedMessage id="comet.validation.validateLinkTarget.invalid" defaultMessage="Invalid link target" />;
}
}

0 comments on commit 815ba51

Please sign in to comment.