refactory: zustand as state management

This commit is contained in:
loveuer 2024-10-07 21:24:18 +08:00
parent 468759a437
commit 3c8c559ac7
7 changed files with 73 additions and 26 deletions

View File

@ -11,6 +11,7 @@ import {useState} from "react";
import {CheckmarkFilled, DismissRegular} from "@fluentui/react-icons"; import {CheckmarkFilled, DismissRegular} from "@fluentui/react-icons";
import {useToast} from "../../message"; import {useToast} from "../../message";
import {Dial} from "../../api"; import {Dial} from "../../api";
import {useStoreConnection} from "../../store/connection";
const useActionStyle = makeStyles({ const useActionStyle = makeStyles({
container: { container: {
@ -24,14 +25,11 @@ const useActionStyle = makeStyles({
test: {} test: {}
}); });
interface ConnectionCreateProps { export function ConnectionCreate(){
update: () => Promise<void>
}
export function ConnectionCreate(props: ConnectionCreateProps){
const actionStyle = useActionStyle(); const actionStyle = useActionStyle();
const {dispatchMessage} = useToast(); const {dispatchMessage} = useToast();
const [testLoading, setTestLoading] = useState<"initial" | "loading" | "success" | "error">("initial"); const [testLoading, setTestLoading] = useState<"initial" | "loading" | "success" | "error">("initial");
const {conn_list, get_conn} = useStoreConnection();
const buttonIcon = const buttonIcon =
testLoading === "loading" ? ( testLoading === "loading" ? (
<Spinner size="tiny"/> <Spinner size="tiny"/>
@ -56,10 +54,12 @@ export function ConnectionCreate(props: ConnectionCreateProps){
} }
async function create() { async function create() {
// qUvfW8xpOTc23O96
// eTcuc8BebHPVpZZwIaNmzfwxRxPYGfTj
let res = await Dial("/api/connection/create", value) let res = await Dial("/api/connection/create", value)
dispatchMessage(res.msg, res.status === 200 ? "success" : "error"); dispatchMessage(res.msg, res.status === 200 ? "success" : "error");
if (res.status === 200) { if (res.status === 200) {
await props.update() get_conn()
} }
} }

View File

@ -10,6 +10,7 @@ import {Dial} from "../../api";
import {useToast} from "../../message"; import {useToast} from "../../message";
import {Connection} from "../../interfaces/connection"; import {Connection} from "../../interfaces/connection";
import {ConnectionCreate} from "../connection/new"; import {ConnectionCreate} from "../connection/new";
import {useStoreConnection} from "../../store/connection";
const useMenuListContainerStyles = makeStyles({ const useMenuListContainerStyles = makeStyles({
container: { container: {
@ -55,19 +56,12 @@ function Home() {
const [openCreate, setOpenCreate] = useState(false); const [openCreate, setOpenCreate] = useState(false);
const [connectionFilterKeywords, setConnectionFilterKeywords] = useState<string>(''); const [connectionFilterKeywords, setConnectionFilterKeywords] = useState<string>('');
const [connections, setConnections] = useState<Connection[]>([]); const [connections, setConnections] = useState<Connection[]>([]);
const {conn_list, get_conn} = useStoreConnection();
useEffect(() => { useEffect(() => {
updateConnectionList().then() get_conn()
}, []); }, []);
async function updateConnectionList() {
const res = await Dial<{ list: Connection[] }>("/api/connection/list");
dispatchMessage(res.status === 200 ? '获取连接列表成功' : res.msg, res.status === 200 ? 'success' : 'error');
setConnections(res.status === 200 ? res.data.list : connections);
setOpenCreate(false)
return;
}
async function handleConnect(item: Connection) { async function handleConnect(item: Connection) {
console.log('[DEBUG] db click item =', item) console.log('[DEBUG] db click item =', item)
for (const c of connections) { for (const c of connections) {
@ -113,7 +107,7 @@ function Home() {
</Button> </Button>
</DialogTrigger> </DialogTrigger>
<ConnectionCreate update={updateConnectionList}/> <ConnectionCreate />
</Dialog> </Dialog>
</div> </div>
<div className="body"> <div className="body">
@ -131,7 +125,7 @@ function Home() {
<div className="body-connections-list"> <div className="body-connections-list">
<div className={styles.container}> <div className={styles.container}>
<MenuList> <MenuList>
{connections.map(item => { {conn_list.map(item => {
return <MenuItem return <MenuItem
onDoubleClick={async () => { onDoubleClick={async () => {
await handleConnect(item) await handleConnect(item)

View File

@ -5,7 +5,6 @@ import {FluentProvider, webLightTheme} from '@fluentui/react-components';
import {createBrowserRouter, RouterProvider} from "react-router-dom"; import {createBrowserRouter, RouterProvider} from "react-router-dom";
import Home from "./component/home/home"; import Home from "./component/home/home";
import {ToastProvider} from "./message"; import {ToastProvider} from "./message";
import {JotaiProvider} from "./store/store";
const container = document.getElementById('root') const container = document.getElementById('root')

View File

@ -0,0 +1,16 @@
import {create} from 'zustand'
import {Connection} from "../interfaces/connection";
import {Dial} from "../api";
type StoreConnection = {
conn_list: Connection[]
get_conn: () => void
}
export const useStoreConnection = create<StoreConnection>()((set) => ({
conn_list: [],
get_conn: async () => {
const res = await Dial<{list: Connection[]}>('/api/connection/list');
set({conn_list: res.data.list})
}
}))

View File

@ -1,8 +0,0 @@
import { Provider, createStore } from 'jotai'
import {FC, ReactNode} from "react";
export const JotaiProvider: FC<{ children: ReactNode }> = ({children}) => {
const store = createStore();
return <Provider store={store}>{children}</Provider>
}

41
package-lock.json generated Normal file
View File

@ -0,0 +1,41 @@
{
"name": "nf-disk",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"zustand": "^5.0.0-rc.2"
}
},
"node_modules/zustand": {
"version": "5.0.0-rc.2",
"resolved": "https://registry.npmmirror.com/zustand/-/zustand-5.0.0-rc.2.tgz",
"integrity": "sha512-o2Nwuvnk8vQBX7CcHL8WfFkZNJdxB/VKeWw0tNglw8p4cypsZ3tRT7rTRTDNeUPFS0qaMBRSKe+fVwL5xpcE3A==",
"license": "MIT",
"engines": {
"node": ">=12.20.0"
},
"peerDependencies": {
"@types/react": ">=18.0.0",
"immer": ">=9.0.6",
"react": ">=18.0.0",
"use-sync-external-store": ">=1.2.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"immer": {
"optional": true
},
"react": {
"optional": true
},
"use-sync-external-store": {
"optional": true
}
}
}
}
}

5
package.json Normal file
View File

@ -0,0 +1,5 @@
{
"dependencies": {
"zustand": "^5.0.0-rc.2"
}
}