mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-11-24 09:05:04 +08:00
🚧 process store pagination
This commit is contained in:
parent
d1706e438b
commit
2beed6bf16
@ -1,5 +1,48 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { usePagination } from "react-use-pagination";
|
||||||
|
|
||||||
export default function Adapter() {
|
import adapters from "../../static/adapters.json";
|
||||||
return <></>;
|
import { useFilteredObjs } from "../libs/store";
|
||||||
|
import Paginate from "./Paginate";
|
||||||
|
|
||||||
|
export default function Adapter(): JSX.Element {
|
||||||
|
const {
|
||||||
|
filter,
|
||||||
|
setFilter,
|
||||||
|
filteredObjs: filteredAdapters,
|
||||||
|
} = useFilteredObjs(adapters);
|
||||||
|
|
||||||
|
const props = usePagination({
|
||||||
|
totalItems: filteredAdapters.length,
|
||||||
|
initialPageSize: 10,
|
||||||
|
});
|
||||||
|
const { startIndex, endIndex } = props;
|
||||||
|
const currentAdapters = filteredAdapters.slice(startIndex, endIndex + 1);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4 mt-4 px-4">
|
||||||
|
<input
|
||||||
|
className="w-full px-4 py-2 border rounded-full bg-light-nonepress-100 dark:bg-dark-nonepress-100"
|
||||||
|
value={filter}
|
||||||
|
placeholder="搜索适配器"
|
||||||
|
onChange={(event) => setFilter(event.target.value)}
|
||||||
|
/>
|
||||||
|
<button className="w-full rounded-lg bg-hero text-white" disabled>
|
||||||
|
发布适配器
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 p-4">
|
||||||
|
<Paginate {...props} />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{currentAdapters.map((driver, index) => (
|
||||||
|
<p key={index}>{driver.name}</p>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 p-4">
|
||||||
|
<Paginate {...props} />
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,48 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { usePagination } from "react-use-pagination";
|
||||||
|
|
||||||
export default function Bot() {
|
import bots from "../../static/bots.json";
|
||||||
return <></>;
|
import { useFilteredObjs } from "../libs/store";
|
||||||
|
import Paginate from "./Paginate";
|
||||||
|
|
||||||
|
export default function Adapter(): JSX.Element {
|
||||||
|
const {
|
||||||
|
filter,
|
||||||
|
setFilter,
|
||||||
|
filteredObjs: filteredBots,
|
||||||
|
} = useFilteredObjs(bots);
|
||||||
|
|
||||||
|
const props = usePagination({
|
||||||
|
totalItems: filteredBots.length,
|
||||||
|
initialPageSize: 10,
|
||||||
|
});
|
||||||
|
const { startIndex, endIndex } = props;
|
||||||
|
const currentBots = filteredBots.slice(startIndex, endIndex + 1);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4 mt-4 px-4">
|
||||||
|
<input
|
||||||
|
className="w-full px-4 py-2 border rounded-full bg-light-nonepress-100 dark:bg-dark-nonepress-100"
|
||||||
|
value={filter}
|
||||||
|
placeholder="搜索机器人"
|
||||||
|
onChange={(event) => setFilter(event.target.value)}
|
||||||
|
/>
|
||||||
|
<button className="w-full rounded-lg bg-hero text-white" disabled>
|
||||||
|
发布机器人
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 p-4">
|
||||||
|
<Paginate {...props} />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{currentBots.map((driver, index) => (
|
||||||
|
<p key={index}>{driver.name}</p>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 p-4">
|
||||||
|
<Paginate {...props} />
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
23
website/src/components/Card/index.tsx
Normal file
23
website/src/components/Card/index.tsx
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
import Link from "@docusaurus/Link";
|
||||||
|
|
||||||
|
import type { Obj } from "../../libs/store";
|
||||||
|
|
||||||
|
export default function Card({
|
||||||
|
name,
|
||||||
|
desc,
|
||||||
|
author,
|
||||||
|
homepage,
|
||||||
|
}: Obj): JSX.Element {
|
||||||
|
return (
|
||||||
|
<div className="block max-w-full border rounded-lg outline-none no-underline bg-white shadow">
|
||||||
|
<div>
|
||||||
|
{name}
|
||||||
|
{homepage && <Link href={homepage}></Link>}
|
||||||
|
</div>
|
||||||
|
<div>{desc}</div>
|
||||||
|
<div>{author}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@ -17,7 +17,7 @@ export default function Driver(): JSX.Element {
|
|||||||
initialPageSize: 10,
|
initialPageSize: 10,
|
||||||
});
|
});
|
||||||
const { startIndex, endIndex } = props;
|
const { startIndex, endIndex } = props;
|
||||||
const currentDrivers = filteredDrivers.slice(startIndex, endIndex);
|
const currentDrivers = filteredDrivers.slice(startIndex, endIndex + 1);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -28,7 +28,7 @@ export default function Driver(): JSX.Element {
|
|||||||
placeholder="搜索驱动器"
|
placeholder="搜索驱动器"
|
||||||
onChange={(event) => setFilter(event.target.value)}
|
onChange={(event) => setFilter(event.target.value)}
|
||||||
/>
|
/>
|
||||||
<button className="w-full rounded bg-hero text-white" disabled>
|
<button className="w-full rounded-lg bg-hero text-white opacity-60">
|
||||||
发布驱动器
|
发布驱动器
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,6 +4,8 @@ import { usePagination } from "react-use-pagination";
|
|||||||
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
|
|
||||||
|
import styles from "./styles.module.css";
|
||||||
|
|
||||||
export default function Paginate({
|
export default function Paginate({
|
||||||
totalPages,
|
totalPages,
|
||||||
setPage,
|
setPage,
|
||||||
@ -20,7 +22,15 @@ export default function Paginate({
|
|||||||
<ReactPaginate
|
<ReactPaginate
|
||||||
pageCount={totalPages}
|
pageCount={totalPages}
|
||||||
onPageChange={onPageChange}
|
onPageChange={onPageChange}
|
||||||
containerClassName="w-full m-w-full inline-flex justify-center align-center m-0 pl-0 list-none"
|
containerClassName={styles.container}
|
||||||
|
pageClassName={styles.li}
|
||||||
|
pageLinkClassName={styles.a}
|
||||||
|
previousClassName={styles.li}
|
||||||
|
previousLinkClassName={styles.a}
|
||||||
|
nextClassName={styles.li}
|
||||||
|
nextLinkClassName={styles.a}
|
||||||
|
activeLinkClassName={styles.active}
|
||||||
|
disabledLinkClassName={styles.disabled}
|
||||||
breakLabel={<FontAwesomeIcon icon="ellipsis-h" />}
|
breakLabel={<FontAwesomeIcon icon="ellipsis-h" />}
|
||||||
previousLabel={<FontAwesomeIcon icon="chevron-left" />}
|
previousLabel={<FontAwesomeIcon icon="chevron-left" />}
|
||||||
nextLabel={<FontAwesomeIcon icon="chevron-right" />}
|
nextLabel={<FontAwesomeIcon icon="chevron-right" />}
|
29
website/src/components/Paginate/styles.module.css
Normal file
29
website/src/components/Paginate/styles.module.css
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
.container {
|
||||||
|
@apply w-full max-w-full inline-flex justify-center items-center m-0 pl-0 list-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.li {
|
||||||
|
@apply flex items-center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.a {
|
||||||
|
height: 34px;
|
||||||
|
width: auto;
|
||||||
|
min-width: 34px;
|
||||||
|
@apply m-1 px-1 border-2 rounded shadow-lg text-center;
|
||||||
|
@apply text-black;
|
||||||
|
@apply bg-light-nonepress-100;
|
||||||
|
}
|
||||||
|
|
||||||
|
:global(.dark) .a {
|
||||||
|
@apply text-white bg-dark-nonepress-100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.active {
|
||||||
|
@apply bg-hero text-white border-hero;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.disabled {
|
||||||
|
@apply opacity-60 pointer-events-none;
|
||||||
|
}
|
@ -1,5 +1,49 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { usePagination } from "react-use-pagination";
|
||||||
|
|
||||||
export default function Plugin() {
|
import plugins from "../../static/plugins.json";
|
||||||
return <></>;
|
import { useFilteredObjs } from "../libs/store";
|
||||||
|
import Card from "./Card";
|
||||||
|
import Paginate from "./Paginate";
|
||||||
|
|
||||||
|
export default function Adapter(): JSX.Element {
|
||||||
|
const {
|
||||||
|
filter,
|
||||||
|
setFilter,
|
||||||
|
filteredObjs: filteredPlugins,
|
||||||
|
} = useFilteredObjs(plugins);
|
||||||
|
|
||||||
|
const props = usePagination({
|
||||||
|
totalItems: filteredPlugins.length,
|
||||||
|
initialPageSize: 10,
|
||||||
|
});
|
||||||
|
const { startIndex, endIndex } = props;
|
||||||
|
const currentPlugins = filteredPlugins.slice(startIndex, endIndex + 1);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4 mt-4 px-4">
|
||||||
|
<input
|
||||||
|
className="w-full px-4 py-2 border rounded-full bg-light-nonepress-100 dark:bg-dark-nonepress-100"
|
||||||
|
value={filter}
|
||||||
|
placeholder="搜索插件"
|
||||||
|
onChange={(event) => setFilter(event.target.value)}
|
||||||
|
/>
|
||||||
|
<button className="w-full rounded-lg bg-hero text-white" disabled>
|
||||||
|
发布插件
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 p-4">
|
||||||
|
<Paginate {...props} />
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4 px-4">
|
||||||
|
{currentPlugins.map((driver, index) => (
|
||||||
|
<Card key={index} {...driver} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-1 p-4">
|
||||||
|
<Paginate {...props} />
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|
||||||
type Tag = {
|
export type Tag = {
|
||||||
label: string;
|
label: string;
|
||||||
color: string;
|
color: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type Obj = {
|
export type Obj = {
|
||||||
module_name?: string;
|
module_name?: string;
|
||||||
project_link?: string;
|
project_link?: string;
|
||||||
name: string;
|
name: string;
|
||||||
|
@ -14,7 +14,7 @@ import Bot from "../components/Bot";
|
|||||||
# 商店
|
# 商店
|
||||||
|
|
||||||
<div className="w-full border rounded shadow">
|
<div className="w-full border rounded shadow">
|
||||||
<Tabs defaultValue="plugin" className="justify-center font-light text-sm">
|
<Tabs defaultValue="plugin" className="justify-center font-light">
|
||||||
<TabItem value="driver" label="驱动器">
|
<TabItem value="driver" label="驱动器">
|
||||||
<Driver />
|
<Driver />
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"module_name": "nonebot.adapters.cqhttp",
|
"module_name": "nonebot.adapters.onebot.v11",
|
||||||
"project_link": "nonebot-adapter-cqhttp",
|
"project_link": "nonebot-adapter-onebot",
|
||||||
"name": "cqhttp",
|
"name": "OneBot V11",
|
||||||
"desc": "OneBot(CQHTTP) 协议",
|
"desc": "OneBot V11 协议",
|
||||||
"author": "yanyongyu",
|
"author": "yanyongyu",
|
||||||
"homepage": "https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-adapter-cqhttp",
|
"homepage": "https://github.com/nonebot/adapter-onebot",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_name": "nonebot.adapters.ding",
|
"module_name": "nonebot.adapters.ding",
|
||||||
@ -15,9 +15,9 @@
|
|||||||
"name": "ding",
|
"name": "ding",
|
||||||
"desc": "钉钉协议",
|
"desc": "钉钉协议",
|
||||||
"author": "Artin",
|
"author": "Artin",
|
||||||
"homepage": "https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-adapter-ding",
|
"homepage": "https://github.com/nonebot/adapter-ding",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_name": "nonebot.adapters.mirai",
|
"module_name": "nonebot.adapters.mirai",
|
||||||
@ -25,9 +25,9 @@
|
|||||||
"name": "mirai",
|
"name": "mirai",
|
||||||
"desc": "Mirai-Api-HTTP 协议",
|
"desc": "Mirai-Api-HTTP 协议",
|
||||||
"author": "Mix",
|
"author": "Mix",
|
||||||
"homepage": "https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-adapter-mirai",
|
"homepage": "https://github.com/nonebot/adapter-mirai",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_name": "nonebot.adapters.feishu",
|
"module_name": "nonebot.adapters.feishu",
|
||||||
@ -35,8 +35,28 @@
|
|||||||
"name": "feishu",
|
"name": "feishu",
|
||||||
"desc": "飞书协议",
|
"desc": "飞书协议",
|
||||||
"author": "StarHeartHunt",
|
"author": "StarHeartHunt",
|
||||||
"homepage": "https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-adapter-feishu",
|
"homepage": "https://github.com/nonebot/adapter-feishu",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module_name": "nonebot.adapters.telegram",
|
||||||
|
"project_link": "nonebot-adapter-telegram",
|
||||||
|
"name": "telegram",
|
||||||
|
"desc": "Telegram 协议",
|
||||||
|
"author": "StarHeartHunt",
|
||||||
|
"homepage": "https://github.com/nonebot/adapter-telegram",
|
||||||
|
"tags": [],
|
||||||
|
"is_official": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module_name": "nonebot.adapters.qqguild",
|
||||||
|
"project_link": "nonebot-adapter-qqguild",
|
||||||
|
"name": "QQ 频道",
|
||||||
|
"desc": "QQ 频道官方机器人",
|
||||||
|
"author": "yanyongyu",
|
||||||
|
"homepage": "https://github.com/nonebot/adapter-qqguild",
|
||||||
|
"tags": [],
|
||||||
|
"is_official": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
"author": "yanyongyu",
|
"author": "yanyongyu",
|
||||||
"homepage": "https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_status",
|
"homepage": "https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_status",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_name": "haruka_bot",
|
"module_name": "haruka_bot",
|
||||||
@ -37,7 +37,7 @@
|
|||||||
"name": "NoneBot离线文档",
|
"name": "NoneBot离线文档",
|
||||||
"homepage": "https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-plugin-docs",
|
"homepage": "https://github.com/nonebot/nonebot2/tree/master/packages/nonebot-plugin-docs",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_name": "nonebot_plugin_sentry",
|
"module_name": "nonebot_plugin_sentry",
|
||||||
@ -47,17 +47,7 @@
|
|||||||
"name": "Sentry日志监控",
|
"name": "Sentry日志监控",
|
||||||
"homepage": "https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_sentry",
|
"homepage": "https://github.com/cscs181/QQ-GitHub-Bot/tree/master/src/plugins/nonebot_plugin_sentry",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
},
|
|
||||||
{
|
|
||||||
"module_name": "nonebot_plugin_test",
|
|
||||||
"project_link": "nonebot-plugin-test",
|
|
||||||
"author": "yanyongyu",
|
|
||||||
"desc": "在浏览器中测试你的 NoneBot 机器人",
|
|
||||||
"name": "前端测试机器人插件",
|
|
||||||
"homepage": "https://github.com/nonebot/plugin-test",
|
|
||||||
"tags": [],
|
|
||||||
"is_official": false
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_name": "nonebot_plugin_apscheduler",
|
"module_name": "nonebot_plugin_apscheduler",
|
||||||
@ -67,7 +57,7 @@
|
|||||||
"name": "定时任务",
|
"name": "定时任务",
|
||||||
"homepage": "https://github.com/nonebot/plugin-apscheduler",
|
"homepage": "https://github.com/nonebot/plugin-apscheduler",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_name": "nonebot_plugin_picsearcher",
|
"module_name": "nonebot_plugin_picsearcher",
|
||||||
@ -287,7 +277,7 @@
|
|||||||
"author": "yanyongyu",
|
"author": "yanyongyu",
|
||||||
"homepage": "https://github.com/nonebot/plugin-localstore",
|
"homepage": "https://github.com/nonebot/plugin-localstore",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_name": "nonebot_plugin_puppet",
|
"module_name": "nonebot_plugin_puppet",
|
||||||
@ -497,7 +487,7 @@
|
|||||||
"author": "mnixry",
|
"author": "mnixry",
|
||||||
"homepage": "https://github.com/mnixry/nonebot-plugin-filehost",
|
"homepage": "https://github.com/mnixry/nonebot-plugin-filehost",
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"is_official": false
|
"is_official": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"module_name": "nonebot_plugin_simplemusic",
|
"module_name": "nonebot_plugin_simplemusic",
|
||||||
|
Loading…
Reference in New Issue
Block a user