closes #201
This commit is contained in:
parent
3f37c9ed03
commit
4421662c5b
3 changed files with 147 additions and 2 deletions
|
|
@ -49,13 +49,16 @@
|
||||||
|
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import { getTime } from '../SiteHeader/NavBar/NavDropdown/StoryCard/time';
|
import { getTime } from '../SiteHeader/NavBar/NavDropdown/StoryCard/time';
|
||||||
|
import type { Referrals } from './types';
|
||||||
|
import { articleIsNotCurrentPage } from './filterCurrentPage';
|
||||||
|
import type { Article } from './types';
|
||||||
|
|
||||||
let clientWidth: number;
|
let clientWidth: number;
|
||||||
|
|
||||||
const SECTION_API = 'recent-stories-by-sections-v1';
|
const SECTION_API = 'recent-stories-by-sections-v1';
|
||||||
const COLLECTION_API = 'articles-by-collection-alias-or-id-v1';
|
const COLLECTION_API = 'articles-by-collection-alias-or-id-v1';
|
||||||
|
|
||||||
let referrals = [];
|
let referrals: Article[] = [];
|
||||||
|
|
||||||
const getReferrals = async () => {
|
const getReferrals = async () => {
|
||||||
const isCollection = Boolean(collection);
|
const isCollection = Boolean(collection);
|
||||||
|
|
@ -72,11 +75,12 @@
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
const data = await response.json();
|
const data = (await response.json()) as Referrals;
|
||||||
const articles = data.result.articles
|
const articles = data.result.articles
|
||||||
.filter((a) => a?.headline_category || a?.kicker?.name)
|
.filter((a) => a?.headline_category || a?.kicker?.name)
|
||||||
.filter((a) => a?.thumbnail?.renditions?.landscape?.['240w'])
|
.filter((a) => a?.thumbnail?.renditions?.landscape?.['240w'])
|
||||||
.filter((a) => !a?.content?.third_party)
|
.filter((a) => !a?.content?.third_party)
|
||||||
|
.filter(articleIsNotCurrentPage)
|
||||||
.slice(0, number);
|
.slice(0, number);
|
||||||
referrals = articles;
|
referrals = articles;
|
||||||
} catch {
|
} catch {
|
||||||
|
|
|
||||||
32
src/components/ReferralBlock/filterCurrentPage.ts
Normal file
32
src/components/ReferralBlock/filterCurrentPage.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
import type { Article } from './types';
|
||||||
|
|
||||||
|
const getUrlFromPath = (path: string) => {
|
||||||
|
const base = 'https://www.reuters.com';
|
||||||
|
|
||||||
|
try {
|
||||||
|
return new URL(path);
|
||||||
|
} catch {
|
||||||
|
try {
|
||||||
|
return new URL(path, base);
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const isCurrentPage = (urlPath: string) => {
|
||||||
|
if (typeof window === 'undefined' || typeof window.location === 'undefined') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const url = getUrlFromPath(urlPath);
|
||||||
|
if (!url) return false;
|
||||||
|
return window.location.href === url.href;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const articleIsNotCurrentPage = (article: Article) => {
|
||||||
|
const { redirect_url: redirectUrl, canonical_url: canonicalUrl } = article;
|
||||||
|
|
||||||
|
if (redirectUrl) return !isCurrentPage(redirectUrl);
|
||||||
|
if (canonicalUrl) return !isCurrentPage(canonicalUrl);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
109
src/components/ReferralBlock/types.ts
Normal file
109
src/components/ReferralBlock/types.ts
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
export interface Referrals {
|
||||||
|
statusCode: number;
|
||||||
|
message: string;
|
||||||
|
result: Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Result {
|
||||||
|
date_modified: Date;
|
||||||
|
pagination: Pagination;
|
||||||
|
fetch_type: string;
|
||||||
|
title: string;
|
||||||
|
articles: Article[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Article {
|
||||||
|
id: string;
|
||||||
|
canonical_url: string;
|
||||||
|
basic_headline: string;
|
||||||
|
title: string;
|
||||||
|
lead_art: LeadArt;
|
||||||
|
description: string;
|
||||||
|
web: string;
|
||||||
|
content_code: string;
|
||||||
|
updated_time: Date;
|
||||||
|
published_time: Date;
|
||||||
|
display_time: Date;
|
||||||
|
thumbnail: LeadArt;
|
||||||
|
primary_media_type: string;
|
||||||
|
source: Source;
|
||||||
|
redirect_url: string;
|
||||||
|
distributor: string;
|
||||||
|
authors: Author[];
|
||||||
|
kicker: Kicker;
|
||||||
|
content_elements: unknown[];
|
||||||
|
headline_category?: unknown;
|
||||||
|
content?: {
|
||||||
|
third_party?: unknown;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Author {
|
||||||
|
topic_url: string;
|
||||||
|
thumbnail: Thumbnail;
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
first_name: string;
|
||||||
|
last_name: string;
|
||||||
|
company: string;
|
||||||
|
social_links: SocialLink[];
|
||||||
|
byline: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SocialLink {
|
||||||
|
url: string;
|
||||||
|
site: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Thumbnail {
|
||||||
|
url: string;
|
||||||
|
resizer_url: string;
|
||||||
|
renditions: Renditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Renditions {
|
||||||
|
square: Landscape;
|
||||||
|
landscape: Landscape;
|
||||||
|
portrait: Landscape;
|
||||||
|
original: Landscape;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Landscape {
|
||||||
|
'60w': string;
|
||||||
|
'120w': string;
|
||||||
|
'240w': string;
|
||||||
|
'480w': string;
|
||||||
|
'960w': string;
|
||||||
|
'1080w': string;
|
||||||
|
'1200w': string;
|
||||||
|
'1920w': string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Kicker {
|
||||||
|
name: string;
|
||||||
|
path: string;
|
||||||
|
names: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface LeadArt {
|
||||||
|
type: string;
|
||||||
|
url: string;
|
||||||
|
resizer_url: string;
|
||||||
|
renditions: Renditions;
|
||||||
|
id: string;
|
||||||
|
caption?: string;
|
||||||
|
alt_text: string;
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
subtitle: string;
|
||||||
|
updated_at: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Source {
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Pagination {
|
||||||
|
size: number;
|
||||||
|
expected_size: number;
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue