基本完成创建Scheme的功能。

This commit is contained in:
徐涛 2024-12-25 16:42:25 +08:00
parent 4135ab5c8f
commit 5d9ef607b4
3 changed files with 80 additions and 1 deletions

View File

@ -2,6 +2,7 @@ import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import { Notifications } from './components/Notifications'; import { Notifications } from './components/Notifications';
import { Home } from './pages/Home'; import { Home } from './pages/Home';
import { MainLayout } from './pages/MainLayout'; import { MainLayout } from './pages/MainLayout';
import { NewScheme } from './pages/NewScheme';
import { Schemes } from './pages/Schemes'; import { Schemes } from './pages/Schemes';
const routes = createBrowserRouter([ const routes = createBrowserRouter([
@ -10,7 +11,11 @@ const routes = createBrowserRouter([
element: <MainLayout />, element: <MainLayout />,
children: [ children: [
{ index: true, element: <Home /> }, { index: true, element: <Home /> },
{ path: 'schemes', element: <Schemes /> }, {
path: 'schemes',
element: <Schemes />,
children: [{ path: 'new', element: <NewScheme /> }],
},
], ],
}, },
]); ]);

View File

@ -0,0 +1,28 @@
@layer pages {
.create_scheme_form_layout {
width: 100%;
padding: calc(var(--spacing) * 10) calc(var(--spacing) * 8);
display: flex;
flex-direction: column;
gap: calc(var(--spacing) * 6);
.form_row {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: var(--spacing-xxs);
label {
font-size: var(--font-size-xs);
}
.name_input {
min-width: 20em;
}
.description_input {
min-width: 50em;
}
.error_message {
color: var(--color-danger);
font-size: var(--font-size-xs);
}
}
}
}

46
src/pages/NewScheme.tsx Normal file
View File

@ -0,0 +1,46 @@
import cx from 'clsx';
import { isEmpty, isNil } from 'lodash-es';
import { useActionState } from 'react';
import { useNavigate } from 'react-router-dom';
import { useCreateScheme } from '../stores/schemes';
import styles from './NewScheme.module.css';
export function NewScheme() {
const createScheme = useCreateScheme();
const navigate = useNavigate();
const [errors, formAction] = useActionState((prevState, formData) => {
try {
const name = formData.get('name') as string;
if (isNil(name) || isEmpty(name)) {
throw { name: 'Name is required' };
}
const description = (formData.get('description') ?? null) as string | null;
const newId = createScheme(name, description);
navigate(`../${newId}`);
} catch (error) {
return error;
}
return {};
}, {});
return (
<form action={formAction} className={styles.create_scheme_form_layout}>
<div className={styles.form_row}>
<label>
Name <span>*</span>
</label>
<input type="text" name="name" className={styles.name_input} />
{errors.name && <div className={styles.error_message}>{errors.name}</div>}
</div>
<div className={styles.form_row}>
<label>Description</label>
<textarea rows={5} name="description" className={styles.description_input} />
</div>
<div className={styles.form_row}>
<button type="submit" className={cx('primary')}>
Create
</button>
</div>
</form>
);
}