dep ver bump; clean-up; minor updates
Signed-off-by: Paul W. <lambdapaul@protonmail.com>
This commit is contained in:
		@@ -3,102 +3,113 @@ import ReactMarkdown from 'react-markdown';
 | 
			
		||||
import style from '../../styles/post.module.css';
 | 
			
		||||
import PostsInfo from '../../public/posts.json';
 | 
			
		||||
import readMarkdown from '../../lib/read-markdown';
 | 
			
		||||
import DateTool from '../../lib/date';
 | 
			
		||||
import DateTool, { toLocaleString } from '../../lib/date';
 | 
			
		||||
 | 
			
		||||
interface Post {
 | 
			
		||||
    title: string;
 | 
			
		||||
    mtime: string;
 | 
			
		||||
    otime?: string;
 | 
			
		||||
interface IPost {
 | 
			
		||||
	title: string;
 | 
			
		||||
	mtime: string;
 | 
			
		||||
	otime?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface Posts {
 | 
			
		||||
    [slug: string]: Post
 | 
			
		||||
interface IPosts {
 | 
			
		||||
	[slug: string]: IPost
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function TimeBlock({ mtime, otime }: { mtime: string, otime: string }) {
 | 
			
		||||
    const ampm = (h: number) => { if (h >= 12) return 'p.m.'; return 'a.m.'; };
 | 
			
		||||
	const ampm = (h: number) => { if (h >= 12) return 'p.m.'; return 'a.m.'; };
 | 
			
		||||
 | 
			
		||||
    const mdate = new Date(mtime);
 | 
			
		||||
    const odate = new Date(otime);
 | 
			
		||||
	const mdate = new Date(mtime);
 | 
			
		||||
	const odate = new Date(otime);
 | 
			
		||||
 | 
			
		||||
    const format = (date: Date) => {
 | 
			
		||||
        const day = date.getDay();
 | 
			
		||||
        const ord = <sup>{DateTool.getOrdinalDaySuffix(date.getDay())}</sup>;
 | 
			
		||||
        const month = DateTool.getFullMonth(date.getMonth());
 | 
			
		||||
        const year = date.getFullYear();
 | 
			
		||||
        const hours = date.getHours() > 12 ? date.getHours() - 12 : date.getHours();
 | 
			
		||||
        const minPrefix = date.getMinutes() < 10 ? '0' : '';
 | 
			
		||||
        const minutes = date.getMinutes();
 | 
			
		||||
        const twelveSfx = ampm(date.getHours());
 | 
			
		||||
        return <>{day}{ord} {month} {year} at {hours}:{minPrefix}{minutes} {twelveSfx}</>
 | 
			
		||||
    };
 | 
			
		||||
	const format = (date: Date) => {
 | 
			
		||||
		const day = date.getDay();
 | 
			
		||||
		const ord = <sup>{DateTool.getOrdinalDaySuffix(date.getDay())}</sup>;
 | 
			
		||||
		const month = DateTool.getFullMonth(date.getMonth());
 | 
			
		||||
		const year = date.getFullYear();
 | 
			
		||||
		const hours = date.getHours() > 12 ? date.getHours() - 12 : date.getHours();
 | 
			
		||||
		const minPrefix = date.getMinutes() < 10 ? '0' : '';
 | 
			
		||||
		const minutes = date.getMinutes();
 | 
			
		||||
		const twelveSfx = ampm(date.getHours());
 | 
			
		||||
		return <>{day}{ord} {month} {year} at {hours}:{minPrefix}{minutes} {twelveSfx}</>
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <div style={{ textAlign: 'right', fontSize: '16px', fontFamily: 'Cantarell', fontStyle: 'italic' }}>
 | 
			
		||||
            {
 | 
			
		||||
                mtime ?
 | 
			
		||||
                    <div className='mtime' data-text={mdate.toISOString()}>
 | 
			
		||||
                        Last updated: {format(mdate)}
 | 
			
		||||
                    </div>
 | 
			
		||||
                    :
 | 
			
		||||
                    <></>
 | 
			
		||||
            }
 | 
			
		||||
            <div className='otime'>
 | 
			
		||||
                {format(odate)}
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    );
 | 
			
		||||
	return (
 | 
			
		||||
		<div style={{ textAlign: 'right', fontSize: '16px', fontFamily: 'Cantarell', fontStyle: 'italic' }}>
 | 
			
		||||
			{
 | 
			
		||||
				mtime ?
 | 
			
		||||
					<div className='mtime' data-text={mdate.toISOString()}>
 | 
			
		||||
						Last updated: {format(mdate)}
 | 
			
		||||
					</div>
 | 
			
		||||
					:
 | 
			
		||||
					<></>
 | 
			
		||||
			}
 | 
			
		||||
			<div className='otime'>
 | 
			
		||||
				{format(odate)}
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function Post({ post }: { post: Post & { content: string, cover?: string, otime: string, mtime?: string } }) {
 | 
			
		||||
    return (<>
 | 
			
		||||
        <Layout removeContainer={true}  >
 | 
			
		||||
            {<div className={style.imageBlock}
 | 
			
		||||
                style={{
 | 
			
		||||
                    backgroundImage:
 | 
			
		||||
                        post.cover ?
 | 
			
		||||
                            `url(/assets/images/${post.cover})` :
 | 
			
		||||
                            'linear-gradient(to bottom right, rgb(5, 51, 11), rgb(5, 45, 13) 15%, rgb(5, 39,15) 40%, rgb(0, 30, 16) 80%)'
 | 
			
		||||
                }}></div>}
 | 
			
		||||
            <div className={`${style.spacer} ${post.cover ? style.background : ''}`}></div>
 | 
			
		||||
            <section className={`${style.block} block`}>
 | 
			
		||||
                <div className='container'>
 | 
			
		||||
                    <TimeBlock mtime={post.mtime} otime={post.otime} />
 | 
			
		||||
                    <ReactMarkdown>{post.content}</ReactMarkdown>
 | 
			
		||||
                </div>
 | 
			
		||||
            </section>
 | 
			
		||||
            <div className={style.spacer}></div>
 | 
			
		||||
        </Layout>
 | 
			
		||||
function Post({ post }: { post: IPost & { content: string, cover?: string, otime: string, mtime?: string } }) {
 | 
			
		||||
	if (!post)
 | 
			
		||||
		return <></>;
 | 
			
		||||
	return (<>
 | 
			
		||||
		<Layout removeContainer={true}  >
 | 
			
		||||
			<div className='container'>
 | 
			
		||||
			   { post.otime !== post.mtime &&
 | 
			
		||||
				   <span className={style.time}>
 | 
			
		||||
				   Last updated: {toLocaleString(post.mtime)}
 | 
			
		||||
				   </span>
 | 
			
		||||
			   }
 | 
			
		||||
				<span className={style.time}>
 | 
			
		||||
					{toLocaleString(post.otime)}
 | 
			
		||||
				</span>
 | 
			
		||||
			</div>
 | 
			
		||||
			{<div className={style.imageBlock}
 | 
			
		||||
				style={{
 | 
			
		||||
					backgroundImage:
 | 
			
		||||
						post.cover ?
 | 
			
		||||
							`url(/assets/images/${post.cover})` :
 | 
			
		||||
							'linear-gradient(to bottom right, rgb(5, 51, 11), rgb(5, 45, 13) 15%, rgb(5, 39,15) 40%, rgb(0, 30, 16) 80%)'
 | 
			
		||||
				}}></div>}
 | 
			
		||||
			<div className={`${style.spacer} ${post.cover ? style.background : ''}`}></div>
 | 
			
		||||
			<section className={`${style.block} block`}>
 | 
			
		||||
				<div className='container'>
 | 
			
		||||
					<ReactMarkdown>{post.content}</ReactMarkdown>
 | 
			
		||||
				</div>
 | 
			
		||||
			</section>
 | 
			
		||||
			<div className={style.spacer}></div>
 | 
			
		||||
		</Layout>
 | 
			
		||||
 | 
			
		||||
    </>
 | 
			
		||||
    );
 | 
			
		||||
	</>
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function getStaticProps({ params }: any) {
 | 
			
		||||
    const postsInfo: Posts = PostsInfo;
 | 
			
		||||
    const post: Post = postsInfo[params.post];
 | 
			
		||||
    return {
 | 
			
		||||
        props: {
 | 
			
		||||
            post: {
 | 
			
		||||
                ...post,
 | 
			
		||||
                content: await readMarkdown('posts', params.post, true)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
	const postsInfo: IPosts = PostsInfo;
 | 
			
		||||
	const post: IPost = postsInfo[params.post];
 | 
			
		||||
	return {
 | 
			
		||||
		props: {
 | 
			
		||||
			post: {
 | 
			
		||||
				...post,
 | 
			
		||||
				content: await readMarkdown('posts', params.post, true)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function getStaticPaths() {
 | 
			
		||||
    return {
 | 
			
		||||
        paths: Object.keys(PostsInfo).map((post: string) => {
 | 
			
		||||
            return {
 | 
			
		||||
                params: {
 | 
			
		||||
                    post
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }),
 | 
			
		||||
        fallback: false
 | 
			
		||||
    };
 | 
			
		||||
	return {
 | 
			
		||||
		paths: Object.keys(PostsInfo).map((post: string) => {
 | 
			
		||||
			return {
 | 
			
		||||
				params: {
 | 
			
		||||
					post
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}),
 | 
			
		||||
		fallback: false
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,49 +4,47 @@ import date from '../../lib/date';
 | 
			
		||||
import PostsInfo from '../../public/posts.json';
 | 
			
		||||
 | 
			
		||||
function PostsPage() {
 | 
			
		||||
    return (
 | 
			
		||||
        <Layout>
 | 
			
		||||
            {Object.keys(PostsInfo).length && <Posts /> || <NoPosts />}
 | 
			
		||||
        </Layout>
 | 
			
		||||
    )
 | 
			
		||||
	return (
 | 
			
		||||
		<Layout>
 | 
			
		||||
			{Object.keys(PostsInfo).length && <Posts /> || <NoPosts />}
 | 
			
		||||
		</Layout>
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function NoPosts() {
 | 
			
		||||
    return (<><div className='text center'>
 | 
			
		||||
        <div>**crickets**</div>
 | 
			
		||||
        <div>No posts found...</div>
 | 
			
		||||
        <div><Link href='/' className='link button green back'>Go Home</Link></div>
 | 
			
		||||
    </div></>);
 | 
			
		||||
	return (<div className='text center'>
 | 
			
		||||
		<div>**crickets**</div>
 | 
			
		||||
		<div>No posts found...</div>
 | 
			
		||||
		<div><Link href='/' className='link button green back'>Go Home</Link></div>
 | 
			
		||||
	</div>);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function Posts() {
 | 
			
		||||
    const posts = Object.entries(PostsInfo);
 | 
			
		||||
    return (
 | 
			
		||||
        <>
 | 
			
		||||
            <table>
 | 
			
		||||
                <tbody>
 | 
			
		||||
                    {
 | 
			
		||||
                        posts.map(([slug, post]: [string, any]) => {
 | 
			
		||||
                            return <tr key={slug} style={{ alignItems: 'center' }}>
 | 
			
		||||
                                <td style={{ display: 'inline-block', textAlign: 'right', fontSize: '0.9rem' }}>
 | 
			
		||||
                                    <div style={{ fontStyle: 'italics', fontSize: '.8rem' }}>{
 | 
			
		||||
                                        post.mtime && (post.mtime != post.otime) && `Updated ${date.toRelativeDate(new Date(post.mtime))}`
 | 
			
		||||
                                    }</div>
 | 
			
		||||
                                    <div>{date.toRelativeDate(new Date(post.otime))}</div>
 | 
			
		||||
                                </td>
 | 
			
		||||
                                <td style={{
 | 
			
		||||
                                    flex: '1 1 60%',
 | 
			
		||||
                                    alignItems: 'center',
 | 
			
		||||
                                    fontFamily: `'EB Garamond', 'Garamond', 'Times New Roman', Times, serif`
 | 
			
		||||
                                }}>
 | 
			
		||||
                                    <Link href={`/posts/${slug}`} style={{ textDecoration: 'none' }}>{post.title}</Link>
 | 
			
		||||
                                </td>
 | 
			
		||||
                            </tr>
 | 
			
		||||
                        })}
 | 
			
		||||
                </tbody>
 | 
			
		||||
            </table>
 | 
			
		||||
        </>
 | 
			
		||||
    )
 | 
			
		||||
	const posts = Object.entries(PostsInfo);
 | 
			
		||||
	return (
 | 
			
		||||
			<table>
 | 
			
		||||
				<tbody>
 | 
			
		||||
					{
 | 
			
		||||
						posts.map(([slug, post]: [string, any]) => {
 | 
			
		||||
							return (<tr key={slug} style={{ alignItems: 'center' }}>
 | 
			
		||||
								<td style={{ display: 'inline-block', textAlign: 'right', fontSize: '0.9rem' }}>
 | 
			
		||||
									<div style={{ fontStyle: 'italics', fontSize: '.8rem' }}>{
 | 
			
		||||
										post.mtime && (post.mtime != post.otime) && `Updated ${date.toRelativeDate(new Date(post.mtime))}`
 | 
			
		||||
									}</div>
 | 
			
		||||
									<div>{date.toRelativeDate(new Date(post.otime))}</div>
 | 
			
		||||
								</td>
 | 
			
		||||
								<td style={{
 | 
			
		||||
									fontFamily: `'EB Garamond', 'Garamond', 'Times New Roman', Times, serif`
 | 
			
		||||
									, fontSize: '1.25rem'
 | 
			
		||||
								}}>
 | 
			
		||||
									<Link href={`/posts/${slug}`} style={{ textDecoration: 'none' }}>{post.title}</Link>
 | 
			
		||||
								</td>
 | 
			
		||||
							</tr>)
 | 
			
		||||
						})
 | 
			
		||||
					}
 | 
			
		||||
				</tbody>
 | 
			
		||||
			</table>
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user