Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix external link badge display for tools hosted under the same domain #1192

Merged
merged 3 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions app/scripts/components/common/card/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
import styled, { css } from 'styled-components';
import { format } from 'date-fns';
import { CollecticonExpandTopRight } from '@devseed-ui/collecticons';
const SmartLink = lazy(() => import('../smart-link'));
import {
glsp,
media,
multiply,
themeVal,
listReset,
} from '@devseed-ui/theme-provider';
const SmartLink = lazy(() => import('../smart-link'));

import { CardBody, CardBlank, CardHeader, CardHeadline, CardTitle, CardOverline } from './styles';
import HorizontalInfoCard, { HorizontalCardStyles } from './horizontal-info-card';
Expand Down Expand Up @@ -220,13 +220,14 @@
}

export interface LinkProperties {
LinkElement: string | ComponentType<any> | undefined;

Check warning on line 223 in app/scripts/components/common/card/index.tsx

View workflow job for this annotation

GitHub Actions / lint

Unexpected any. Specify a different type
pathAttributeKeyName: string;
onLinkClick?: MouseEventHandler;
}

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

export interface CardComponentBaseProps {
Expand All @@ -250,6 +251,7 @@
export interface CardComponentPropsDeprecated extends CardComponentBaseProps {
linkTo: string;
onLinkClick?: MouseEventHandler;
isLinkExternal?: boolean;
}
export interface CardComponentProps extends CardComponentBaseProps {
linkProperties: LinkWithPathProperties;
Expand Down Expand Up @@ -287,16 +289,17 @@
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 = /^https?:\/\//.test(linkProperties.linkTo);
const isExternalLink = linkProperties.isLinkExternal ?? /^https?:\/\//.test(linkProperties.linkTo);

return (
<ElementInteractive
dzole0311 marked this conversation as resolved.
Show resolved Hide resolved
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
7 changes: 4 additions & 3 deletions app/scripts/components/common/smart-link.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { getLinkProps } from '$utils/url';

interface SmartLinkProps {
to: string;
isLinkExternal?: boolean;
onLinkClick?: ()=> void;
children?: ReactNode;
}
Expand All @@ -13,9 +14,9 @@ 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 isExternalLink = /^https?:\/\//.test(to);
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 ? (
<a {...linkProps} {...rest}> {children} </a>
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
30 changes: 18 additions & 12 deletions app/scripts/utils/url.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
import React, { MouseEventHandler } from 'react';
import { LinkProps } from 'react-router-dom';

export function isExternalLink(link: string): boolean {
return /^https?:\/\//.test(link) && !link.includes(window.location.hostname);
}

export const getLinkProps = (
linkTo: string,
as?: React.ForwardRefExoticComponent<LinkProps & React.RefAttributes<HTMLAnchorElement>>,
onClick?: (() => void) | MouseEventHandler
) => {
// Open the link in a new tab when link is external
const isExternalLink = /^https?:\/\//.test(linkTo);
return isExternalLink
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
const isExternalLink = isLinkExternal ?? /^https?:\/\//.test(linkTo);
return isExternalLink
? {
href: linkTo,
to: linkTo,
...{target: '_blank', rel: 'noopener noreferrer'},
...(onClick ? {onClick: onClick} : {})
...{ target: '_blank', rel: 'noopener noreferrer' },
...(onClick ? { onClick: onClick } : {})
}
: {
...(as ? {as: as} : {}),
...(as ? { as: as } : {}),
to: linkTo,
...(onClick ? {onClick: onClick} : {})
...(onClick ? { onClick: onClick } : {})
};
};
};
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
Loading