News feed page
This commit is contained in:
@@ -0,0 +1,46 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { NextPage, GetStaticProps } from "next";
|
||||||
|
import Head from "next/head";
|
||||||
|
import useSWR from "swr";
|
||||||
|
import NewsFeedPageView from "@views/NewsFeedPage/NewsFeedPageView";
|
||||||
|
import PageWrapper from "@views/common/PageWrapper";
|
||||||
|
import { fetcher, API, APIPath } from "@api/backend";
|
||||||
|
import Post from "@models/Feed";
|
||||||
|
|
||||||
|
const feedApi: API = {
|
||||||
|
path: APIPath.FEED,
|
||||||
|
queryParams: {
|
||||||
|
limit: 10,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
interface InitialProps {
|
||||||
|
initialPosts: Post[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const NewsFeedPage: NextPage<InitialProps> = ({ initialPosts }) => {
|
||||||
|
const { data: posts } = useSWR<Post[]>(feedApi, fetcher, { fallbackData: initialPosts });
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Head>
|
||||||
|
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/toiminta/uutiset`} />
|
||||||
|
</Head>
|
||||||
|
<PageWrapper>
|
||||||
|
<NewsFeedPageView posts={posts} />
|
||||||
|
</PageWrapper>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
|
||||||
|
const initialPosts = fetcher<Post[]>(feedApi);
|
||||||
|
return {
|
||||||
|
props: {
|
||||||
|
initialPosts: await initialPosts,
|
||||||
|
},
|
||||||
|
revalidate: 10,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export default NewsFeedPage;
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
import {
|
||||||
|
Card,
|
||||||
|
CardSection,
|
||||||
|
} from "@components/index";
|
||||||
|
|
||||||
|
import Post from "@models/Feed";
|
||||||
|
import noop from "@utils/noop";
|
||||||
|
import { getTranslateFunc } from "../../i18n";
|
||||||
|
|
||||||
|
interface NewsFeedPageViewProps {
|
||||||
|
posts: Post[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const cardTimeOpts: Intl.DateTimeFormatOptions = {
|
||||||
|
day: "numeric",
|
||||||
|
month: "numeric",
|
||||||
|
year: "numeric",
|
||||||
|
hour: "numeric",
|
||||||
|
minute: "2-digit",
|
||||||
|
};
|
||||||
|
|
||||||
|
const NewsFeedPageView: React.FC<NewsFeedPageViewProps> = ({ posts }) => {
|
||||||
|
const isFi = true;
|
||||||
|
const t = getTranslateFunc("fi");
|
||||||
|
|
||||||
|
const buttonText = `${t("Lue lisää")}\xa0›`;
|
||||||
|
|
||||||
|
const locale = isFi ? "fi-FI" : "en-GB";
|
||||||
|
|
||||||
|
const filteredFeed = posts.map((post) => ({
|
||||||
|
...post,
|
||||||
|
title: isFi ? post.title_fi : post.title_en,
|
||||||
|
description: isFi ? post.description_fi : post.description_en,
|
||||||
|
content: isFi ? post.content_fi : post.content_en,
|
||||||
|
publish_time: new Date(post.publish_time).toLocaleString(locale, cardTimeOpts),
|
||||||
|
}));
|
||||||
|
return (
|
||||||
|
<CardSection>
|
||||||
|
{filteredFeed.map((post) => (
|
||||||
|
<Card
|
||||||
|
key={post.id}
|
||||||
|
title={post.title}
|
||||||
|
text={post.description}
|
||||||
|
startTime={post.publish_time}
|
||||||
|
link={`/feed/${post.id}`}
|
||||||
|
buttonOnClick={noop}
|
||||||
|
buttonText={buttonText}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</CardSection>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default NewsFeedPageView;
|
||||||
Reference in New Issue
Block a user