Skip to content

Commit

Permalink
Actually, add a isLinkExternal prop instead of only relying on url ch…
Browse files Browse the repository at this point in the history
…ecking
  • Loading branch information
dzole0311 committed Oct 14, 2024
1 parent 8819981 commit 218f651
Show file tree
Hide file tree
Showing 11 changed files with 38 additions and 17 deletions.
14 changes: 9 additions & 5 deletions app/scripts/components/common/card/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import HorizontalInfoCard, { HorizontalCardStyles } from './horizontal-info-card
import { variableBaseType, variableGlsp } from '$styles/variable-utils';
import { ElementInteractive } from '$components/common/element-interactive';
import { Figure } from '$components/common/figure';
import { isExternalLink } from '$utils/url';

type CardType = 'classic' | 'cover' | 'featured' | 'horizontal-info';

Expand Down Expand Up @@ -228,6 +227,7 @@ export interface LinkProperties {

export interface LinkWithPathProperties extends LinkProperties {
linkTo: string;
isLinkExternal?: boolean;
}

export interface CardComponentBaseProps {
Expand All @@ -251,6 +251,7 @@ export interface CardComponentBaseProps {
export interface CardComponentPropsDeprecated extends CardComponentBaseProps {
linkTo: string;
onLinkClick?: MouseEventHandler;
isLinkExternal?: boolean;
}
export interface CardComponentProps extends CardComponentBaseProps {
linkProperties: LinkWithPathProperties;
Expand Down Expand Up @@ -288,15 +289,18 @@ function CardComponent(props: CardComponentPropsType) {
const { linkProperties: linkPropertiesProps } = props;
linkProperties = linkPropertiesProps;
} else {
const { linkTo, onLinkClick, } = props;
const { linkTo, onLinkClick, isLinkExternal } = props;
linkProperties = {
linkTo,
onLinkClick,
pathAttributeKeyName: 'to',
LinkElement: SmartLink
LinkElement: SmartLink,
isLinkExternal
};
}

const isExternalLink = linkProperties.isLinkExternal ?? /^https?:\/\//.test(linkProperties.linkTo);

return (
<ElementInteractive
linkProps={{
Expand All @@ -317,8 +321,8 @@ function CardComponent(props: CardComponentPropsType) {
<CardHeadline>
<CardTitle>{title}</CardTitle>
<CardOverline as='div'>
{isExternalLink(linkProperties.linkTo) && <ExternalLinkFlag />}
{!isExternalLink(linkProperties.linkTo) && tagLabels && parentTo && (
{isExternalLink && <ExternalLinkFlag />}
{!isExternalLink && tagLabels && parentTo && (
tagLabels.map((label) => (
<CardLabel as={linkProperties.LinkElement} to={parentTo} key={label}>
{label}
Expand Down
3 changes: 2 additions & 1 deletion app/scripts/components/common/featured-slider-section.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,8 @@ function FeaturedSliderSection(props: FeaturedSliderSectionProps) {
linkProperties={{
linkTo: `${d.asLink?.url ?? getItemPath(d)}`,
pathAttributeKeyName: 'to',
LinkElement: SmartLink
LinkElement: SmartLink,
isLinkExternal: d.isLinkExternal
}}
title={d.name}
overline={
Expand Down
4 changes: 3 additions & 1 deletion app/scripts/components/common/related-content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ interface FormatBlock {
date: string;
link: string;
asLink?: LinkContentData;
isLinkExternal?: boolean;
parentLink: string;
media: Media;
parent: RelatedContentData['type'];
Expand Down Expand Up @@ -151,7 +152,8 @@ export default function RelatedContent(props: RelatedContentProps) {
linkProperties={{
linkTo: `${t.asLink?.url ?? t.link}`,
LinkElement: SmartLink,
pathAttributeKeyName: 'to'
pathAttributeKeyName: 'to',
isLinkExternal: t.isLinkExternal
}}
title={t.name}
date={
Expand Down
13 changes: 8 additions & 5 deletions app/scripts/components/common/smart-link.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import React, { ReactNode } from 'react';
import { Link } from 'react-router-dom';

import { getLinkProps, isExternalLink } from '$utils/url';
import { getLinkProps } from '$utils/url';

interface SmartLinkProps {
to: string;
isLinkExternal?: boolean;
onLinkClick?: ()=> void;
children?: ReactNode;
}
Expand All @@ -13,10 +14,11 @@ interface SmartLinkProps {
* Switches between a `a` and a `Link` depending on the url.
*/
export default function SmartLink(props: SmartLinkProps) {
const { to, onLinkClick, children, ...rest } = props;
const linkProps = getLinkProps(to, undefined, onLinkClick);
const { to, isLinkExternal, onLinkClick, children, ...rest } = props;
const isExternalLink = isLinkExternal ?? /^https?:\/\//.test(to);
const linkProps = getLinkProps(to, isLinkExternal, undefined, onLinkClick);

return isExternalLink(to) ? (
return isExternalLink ? (
<a {...linkProps} {...rest}> {children} </a>
) : (
<Link {...linkProps} {...rest}> {children} </Link>
Expand All @@ -33,8 +35,9 @@ interface CustomLinkProps {
*/
export function CustomLink(props: CustomLinkProps) {
const { href, ...rest } = props;
const isExternalLink = /^https?:\/\//.test(href);
const linkProps = getLinkProps(href);
return isExternalLink(href) ? (
return isExternalLink ? (
<a {...linkProps} {...rest} />
) : (
<Link {...linkProps} {...rest} />
Expand Down
3 changes: 2 additions & 1 deletion app/scripts/components/home/featured-stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ function FeaturedStories() {
linkProperties={{
linkTo: `${d.asLink?.url ?? getStoryPath(d)}`,
LinkElement: SmartLink,
pathAttributeKeyName: 'to'
pathAttributeKeyName: 'to',
isLinkExternal: d.isLinkExternal
}}
title={d.name}
tagLabels={[getString('stories').one]}
Expand Down
2 changes: 2 additions & 0 deletions app/scripts/components/sandbox/cards/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ function SandboxCards() {
<Card
linkLabel='View more'
linkTo='/'
isLinkExternal={false}
title='Cities Experiencing Clearer Air During Lockdowns'
description='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce varius erat in vulputate.'
date={new Date('2021-10-26')}
Expand All @@ -28,6 +29,7 @@ function SandboxCards() {
cardType='cover'
linkLabel='View more'
linkTo='/'
isLinkExternal={false}
title='Nitrogen Dioxide (NO₂)'
description='Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce varius erat in vulputate.'
tagLabels={['Dataset']}
Expand Down
3 changes: 2 additions & 1 deletion app/scripts/components/stories/hub/hub-content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,8 @@ export default function HubContent(props:HubContentProps) {
linkProperties={{
linkTo: `${d.asLink?.url ?? d.path}`,
LinkElement,
pathAttributeKeyName
pathAttributeKeyName,
isLinkExternal: d.isLinkExternal
}}
title={
<TextHighlight
Expand Down
1 change: 1 addition & 0 deletions app/scripts/types/veda.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ export interface StoryData {
taxonomy: Taxonomy[];
related?: RelatedContentData[];
asLink?: LinkContentData;
isLinkExternal?: boolean;
isHidden?: boolean;
}

Expand Down
4 changes: 3 additions & 1 deletion app/scripts/utils/url.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ export function isExternalLink(link: string): boolean {

export const getLinkProps = (
linkTo: string,
isLinkExternal?: boolean,
as?: React.ForwardRefExoticComponent<
LinkProps & React.RefAttributes<HTMLAnchorElement>
>,
onClick?: (() => void) | MouseEventHandler
) => {
// Open the link in a new tab when link is external
return isExternalLink(linkTo)
const isExternalLink = isLinkExternal ?? /^https?:\/\//.test(linkTo);
return isExternalLink
? {
href: linkTo,
to: linkTo,
Expand Down
3 changes: 2 additions & 1 deletion mock/stories/external-link-example.stories.mdx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
featured: true
id: 'external-link-test'
name: External Link Test
name: External Link Test
description: Story to test external link
media:
src: ::file ./img-placeholder-6.jpg
Expand All @@ -24,4 +24,5 @@ related:
id: air-quality-and-covid-19
asLink:
url: 'https://developmentseed.org'
isLinkExternal: true
---
5 changes: 4 additions & 1 deletion parcel-resolver-veda/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ declare module 'veda' {
taxonomy: Taxonomy[];
related?: RelatedContentData[];
asLink?: LinkContentData;
isLinkExternal?: boolean;
isHidden?: boolean;
}

Expand Down Expand Up @@ -339,7 +340,9 @@ declare module 'veda' {
export const getBoolean: (variable: string) => boolean;

export const getBannerFromVedaConfig: () => BannerData | undefined;
export const getCookieConsentFromVedaConfig: () => CookieConsentData| undefined;
export const getCookieConsentFromVedaConfig: () =>
| CookieConsentData
| undefined;

export const getNavItemsFromVedaConfig: () =>
| {
Expand Down

0 comments on commit 218f651

Please sign in to comment.