[upgrade] Abstract components on the page into subcomponents
This commit is contained in:
12
components/utils/PageTitle.tsx
Normal file
12
components/utils/PageTitle.tsx
Normal file
@@ -0,0 +1,12 @@
|
||||
import { twMerge } from "tailwind-merge";
|
||||
|
||||
export const PageTitle = (props: {
|
||||
children?: React.ReactNode;
|
||||
classNames?: string;
|
||||
}) => {
|
||||
return (
|
||||
<h2 className={twMerge("caption-font my-5 flex select-none justify-center font-bold text-2xl", props.classNames)}>
|
||||
{props.children}
|
||||
</h2>
|
||||
);
|
||||
};
|
||||
63
components/utils/Pagination.tsx
Normal file
63
components/utils/Pagination.tsx
Normal file
@@ -0,0 +1,63 @@
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { type ChangeEvent, type KeyboardEvent, useState } from "react";
|
||||
import { MdNavigateBefore, MdNavigateNext } from "react-icons/md";
|
||||
|
||||
export const Pagination = (props: {
|
||||
pageNumber: number;
|
||||
pageAmount: number;
|
||||
onGotoNextPage: (nextPage: number) => any;
|
||||
onGotoPrevPage: (prevPage: number) => any;
|
||||
onJumpToSpecPage: (pageNum: number) => any;
|
||||
}) => {
|
||||
const [pageNumberInput, setPageNumberInput] = useState<string>(props.pageNumber.toString());
|
||||
|
||||
const handleEnterKeyJump = (event: KeyboardEvent<HTMLInputElement>) => {
|
||||
setPageNumberInput(pageNumberInput.replace(/[^\d]/g, ""));
|
||||
if (Number.parseInt(pageNumberInput) > 0 && Number.parseInt(pageNumberInput) < props.pageAmount + 1) {
|
||||
(event.key === "Go" || event.key === "Enter") && props.onJumpToSpecPage(Number.parseInt(pageNumberInput));
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
const handleInputPageNumber = (event: ChangeEvent<HTMLInputElement>) => {
|
||||
setPageNumberInput(event.target.value);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="my-5 flex justify-between font-bold text-base rtl:flex-row-reverse">
|
||||
{props.pageNumber !== 1 && (
|
||||
<Button
|
||||
className="rounded-full"
|
||||
onClick={() => {
|
||||
setPageNumberInput((props.pageNumber - 1).toString());
|
||||
props.onGotoPrevPage(props.pageNumber - 1);
|
||||
}}
|
||||
>
|
||||
<MdNavigateBefore className="text-3xl" />
|
||||
</Button>
|
||||
)}
|
||||
<div className="my-auto flex justify-center font-bold">
|
||||
<Input
|
||||
className="mx-2 my-auto h-6 w-11"
|
||||
onChange={handleInputPageNumber}
|
||||
onKeyDown={handleEnterKeyJump}
|
||||
title="Type the specified page number and press Enter to jump."
|
||||
value={pageNumberInput}
|
||||
/>
|
||||
<div className="my-auto">{` / ${props.pageAmount}`}</div>
|
||||
</div>
|
||||
{props.pageNumber !== props.pageAmount && (
|
||||
<Button
|
||||
className="rounded-full"
|
||||
onClick={() => {
|
||||
setPageNumberInput((props.pageNumber + 1).toString());
|
||||
props.onGotoNextPage(props.pageNumber + 1);
|
||||
}}
|
||||
>
|
||||
<MdNavigateNext className="text-3xl" />
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -37,7 +37,7 @@ export const PostList = (props: { data: TPostListItem[] }) => {
|
||||
</div>
|
||||
{postItem.frontMatter.tags && (
|
||||
<div className="my-auto flex flex-wrap">
|
||||
{postItem.frontMatter.tags.map((tagName) => (
|
||||
{postItem.frontMatter.tags.map((tagName: string) => (
|
||||
<Badge
|
||||
className="my-1 mr-1 text-gray-600 dark:text-gray-300"
|
||||
key={`tags-${nanoid()}`}
|
||||
|
||||
Reference in New Issue
Block a user