Fetch an articl by its id, Fetch the body of the articl(content)

This commit is contained in:
“Salar 2022-10-12 16:23:48 +03:00
parent f3c6b65b57
commit a26faeeb02
4 changed files with 230 additions and 0 deletions

View File

@ -0,0 +1,80 @@
import { useArticleViewModel } from "article/controller/articleViewModel";
import { useArticleStore } from "article/data/articleStoreImplementation";
import { useEffect } from "react";
import * as ArticlePart from "../../components/Article/Article";
import { useParams } from "react-router";
import AskeletonArticle from "./AskeletonArticle";
import Container from "components/Container";
import NotFound from "./NotFound";
import { SVGSearch } from "components/icons";
import BaseLayout from "components/BaseLayout";
const AnArticle = () => {
const store = useArticleStore();
const { article, hasError, shouldShowLoading } = useArticleViewModel(store);
const { id } = useParams();
const newId = `${id}`;
useEffect(() => {
store.getArticle(newId);
}, [id]);
if (hasError) {
return <NotFound />;
}
return (
<BaseLayout>
<Container variant="straight">
{shouldShowLoading ? (
<AskeletonArticle />
) : (
<>
<ArticlePart.Article.Breadcumbs>
{article?.topic}
</ArticlePart.Article.Breadcumbs>
<div className="flex flex-col gap-4 pb-4">
<ArticlePart.Article.Title className="text-3xl ">
{article?.title}
</ArticlePart.Article.Title>
<ArticlePart.Article.Authors>
{article?.authors !== undefined ? article?.authors : "Unknown"}
</ArticlePart.Article.Authors>
<hr></hr>
</div>
<ArticlePart.Article.InteractionButtons emphasis="high" />
{article?.tags && (
<div className="keywords my-10 flex flex-col gap-2">
<ArticlePart.Article.Title className="text-2xl">
Keywords
</ArticlePart.Article.Title>
<ArticlePart.Article.Keywords className="transition ease-in-out delay-50">
{article?.tags}
</ArticlePart.Article.Keywords>
</div>
)}
<div className="abstract my-10 flex flex-col gap-2">
<ArticlePart.Article.Title className="text-2xl">
Abstract
</ArticlePart.Article.Title>
<ArticlePart.Article.Description>
{article?.summary !== undefined ? (
article?.summary
) : (
<div className=" bg-gray-100 w-full stroke-gray-800 text-xl flex justify-center py-1">
<SVGSearch className="w-14" />
</div>
)}
</ArticlePart.Article.Description>
</div>
</>
)}
</Container>
</BaseLayout>
);
};
// \n
export default AnArticle;

View File

@ -0,0 +1,58 @@
import { useArticleViewModel } from "article/controller/articleViewModel";
import { useArticleStore } from "article/data/articleStoreImplementation";
import "react-loading-skeleton/dist/skeleton.css";
import Skeleton from "react-loading-skeleton";
import { useParams } from "react-router";
import { useEffect } from "react";
/* -------------------------------------------------------------------------- */
/* Components */
/* -------------------------------------------------------------------------- */
import * as ArticlePart from "../../components/Article/Article";
import BaseLayout from "components/BaseLayout";
import Container from "components/Container";
import NotFound from "./NotFound";
const AnArticleBody = () => {
const store = useArticleStore();
const { article, hasError, shouldShowLoading } = useArticleViewModel(store);
const { id } = useParams();
const newId = `${id}`;
useEffect(() => {
store.getArticle(newId);
}, [id]);
if (hasError) <NotFound />;
return (
<BaseLayout>
<Container variant="straight">
{shouldShowLoading ? (
<>
<Skeleton count={1} />
<div className="gap-4 py-12 px-20">
<Skeleton
count={1}
containerClassName=" text-3xl"
className="mb-6"
/>
<Skeleton count={15} containerClassName="" />
</div>
</>
) : (
<>
<ArticlePart.Article.Breadcumbs>
{article?.topic}
</ArticlePart.Article.Breadcumbs>
<div className="gap-4 py-12 px-20">
<ArticlePart.Article.Title className="text-3xl">
{article?.title}
</ArticlePart.Article.Title>
<div className="py-6">{article?.content}</div>
</div>
</>
)}
</Container>
</BaseLayout>
);
};
export default AnArticleBody;

View File

@ -0,0 +1,59 @@
import Skeleton from "react-loading-skeleton";
import "react-loading-skeleton/dist/skeleton.css";
const AskeletonArticle = () => {
return (
<>
<Skeleton count={1} />
<div className="flex flex-col gap-4 pb-4">
<Skeleton count={1} containerClassName="title w-3/4 text-2xl" />
<Skeleton count={1} containerClassName="authors w-1/4" />
<hr></hr>
</div>
<div className="interActions-buttons flex">
<Skeleton count={1} containerClassName="w-1/12 mr-2 text-xl" />
<Skeleton count={1} containerClassName="w-1/12 mr-2 text-xl" />
<Skeleton count={1} containerClassName="w-1/12 mr-2 text-xl" />
<Skeleton count={1} containerClassName="w-1/12 mr-2 text-xl" />
</div>
<div className=" my-10 flex flex-col gap-2">
<Skeleton
count={1}
className="keywords-title text-2xl"
containerClassName="w-1/4"
/>
<div className="flex">
<Skeleton
count={1}
className="border-2 border-[#ebebeb]"
containerClassName="w-1/6 mr-2"
baseColor="transparent"
/>
<Skeleton
count={1}
className="border-2 border-[#ebebeb]"
containerClassName="w-1/6 mr-2"
baseColor="transparent"
/>
<Skeleton
count={1}
className="border-2 border-[#ebebeb]"
containerClassName="w-1/6 mr-2"
baseColor="transparent"
/>
<Skeleton
count={1}
className="border-2 border-[#ebebeb]"
containerClassName="w-1/6 mr-2"
baseColor="transparent"
/>
</div>
</div>
<div className="my-10 flex flex-col gap-2">
<Skeleton count={1} width={200} className="text-2xl" />
<Skeleton count={25} />
</div>
</>
);
};
export default AskeletonArticle;

View File

@ -0,0 +1,33 @@
import React from "react";
import Container from "components/Container";
import { Button } from "components/Button/Button";
import Link from "components/Link";
const NotFound = () => {
return (
<Container
variant="straight"
className="flex flex-col items-center justify-center
font-serif h-screen my-auto
"
>
<div
className="bg-[url('https://cdn.dribbble.com/users/285475/screenshots/2083086/dribbble_1.gif')]
h-[450px]
w-full text-center text-7xl "
>
404
</div>
<h3 className="font-bold text-2xl text-center">Page does not exist</h3>
<h4 className="text-center">
Maybe you got a broken link, or maybe you made a misprint in the address
bar
</h4>
<Button className="my-4">
<Link href="/">Go to home</Link>
</Button>
</Container>
);
};
export default NotFound;