Connect Meshkee backend, blog and shared account session
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
import type {Metadata} from 'next';
|
||||
import Link from 'next/link';
|
||||
import { notFound, redirect } from 'next/navigation';
|
||||
import { ApiError } from '../../../../lib/meshkee/api';
|
||||
import { getBlog, titleSlug, blogHref, summary, cover, articleHtml } from '../../../../lib/meshkee/blog';
|
||||
type Props={params:Promise<{id:string;slug:string}>};
|
||||
export const dynamic='force-dynamic';
|
||||
export async function generateMetadata({params}:Props):Promise<Metadata>{
|
||||
try {const {id}=await params;const post=await getBlog(id);return {title:post.title,description:summary(post)||`${post.title}؛ مجله سلامت گستر اعتماد`,alternates:{canonical:`https://sgemed.com${blogHref(post)}`}}}catch{return {title:'مطلب',robots:{index:false}}}
|
||||
}
|
||||
export default async function Article({params}:Props){
|
||||
const {id,slug}=await params;
|
||||
let post;
|
||||
try{post=await getBlog(id)}catch(error){if(error instanceof ApiError&&error.status===404)notFound();throw error}
|
||||
if(slug!==titleSlug(post.title))redirect(blogHref(post));
|
||||
return <><section className="pagehead"><div className="wrap"><Link className="eyebrow" href="/blog">مجله سلامت گستر ←</Link><h1>{post.title}</h1></div></section><article className="wrap section blog-article">{cover(post)&&<img className="article-cover" src={cover(post)} alt={post.title}/>}<div className="article-body" dangerouslySetInnerHTML={{__html:articleHtml(post)}}/><Link className="textlink" href="/blog">بازگشت به مجله ←</Link></article></>;
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
'use client';
|
||||
export default function ErrorPage({reset}:{reset:()=>void}) {return <section className="wrap section backend-empty"><h1>دریافت مطلب ممکن نشد</h1><p>ارتباط با مجله برقرار نشد. لطفاً دوباره تلاش کنید.</p><button className="button" onClick={reset}>تلاش دوباره</button></section>}
|
||||
@@ -0,0 +1 @@
|
||||
export default function Loading(){return <div className="wrap section backend-empty" role="status">در حال دریافت مطالب…</div>}
|
||||
@@ -0,0 +1,2 @@
|
||||
import Link from 'next/link';
|
||||
export default function Missing(){return <section className="wrap section backend-empty"><h1>مطلب پیدا نشد</h1><p>این مطلب در دسترس نیست یا هنوز منتشر نشده است.</p><Link href="/blog" className="button">بازگشت به مجله</Link></section>}
|
||||
@@ -0,0 +1,12 @@
|
||||
import Link from 'next/link';
|
||||
import { BookOpen, ArrowUpLeft } from 'lucide-react';
|
||||
import { getBlogs, blogHref, summary, cover } from '../../lib/meshkee/blog';
|
||||
export const metadata = {title:'مجله سلامت گستر',description:'مقالات و تازههای سلامت گستر اعتماد در زمینه استریلیزاسیون، تجهیزات پزشکی و کنترل عفونت.'};
|
||||
export const dynamic = 'force-dynamic';
|
||||
export default async function BlogPage({searchParams}:{searchParams:Promise<{page?:string}>}) {
|
||||
const query=await searchParams; const page=Math.max(1,Math.min(10000,Number.parseInt(query.page||'1',10)||1));
|
||||
let data;
|
||||
try{data=await getBlogs(page)}catch{return <><Banner/><section className="wrap section backend-empty"><BookOpen size={32}/><h2>دریافت مطالب ممکن نشد</h2><p>لطفاً کمی بعد دوباره تلاش کنید.</p><a className="button" href="/blog">تلاش دوباره</a></section></>}
|
||||
return <><Banner/><section className="wrap section">{data.items.length ? <div className="blog-grid">{data.items.map(post=><Link className="blog-card" href={blogHref(post)} key={post.id}>{cover(post)?<img src={cover(post)} alt={post.title}/>:<div className="blog-placeholder"><BookOpen size={38} strokeWidth={1}/></div>}<div className="blog-card-copy"><h2>{post.title}</h2><p>{summary(post)}</p><span>مطالعه مطلب <ArrowUpLeft size={18}/></span></div></Link>)}</div>:<div className="backend-empty"><BookOpen size={36} strokeWidth={1.3}/><h2>بهزودی با مطالب تازه همراه شما هستیم</h2><p>هنوز مطلبی منتشر نشده است.</p></div>}{data.total>12&&<nav className="blog-pagination" aria-label="صفحهبندی مجله">{page>1&&<Link href={`/blog?page=${page-1}`}>صفحه قبل</Link>}<span>صفحه {page.toLocaleString('fa-IR')}</span>{page*12<data.total&&<Link href={`/blog?page=${page+1}`}>صفحه بعد</Link>}</nav>}</section></>;
|
||||
}
|
||||
function Banner(){return <section className="pagehead"><div className="wrap"><span className="eyebrow">SGE JOURNAL</span><h1>مجله سلامت گستر</h1><p>دانش و تازههای استریلیزاسیون و کنترل عفونت</p></div></section>}
|
||||
Reference in New Issue
Block a user