feat(client): add create user

This commit is contained in:
Vladislav Syrochkin 2025-06-25 13:38:43 +05:00
parent 448e4264a5
commit 8f5dd07bf5
7 changed files with 38 additions and 10 deletions

View File

@ -64,5 +64,6 @@ check-api:
poetry run ruff format . --check poetry run ruff format . --check
regenerate-openapi-local: regenerate-openapi-local:
rm client/src/types/openapi-types.ts \ cd client \
npx openapi-typescript http://localhost:8000/openapi -o client/src/types/openapi-types.ts rm src/types/openapi-types.ts \
npx openapi-typescript http://localhost:8000/openapi -o src/types/openapi-types.ts

View File

@ -4,7 +4,7 @@ import axiosRetry from 'axios-retry';
import { Auth, Tokens } from '@/types/auth'; import { Auth, Tokens } from '@/types/auth';
import { useAuthStore } from '@/store/authStore'; import { useAuthStore } from '@/store/authStore';
import { AuthService } from '@/services/authService'; import { AuthService } from '@/services/authService';
import { User } from '@/types/user'; import { User, UserUpdate } from '@/types/user';
const baseURL = `${import.meta.env.VITE_APP_HTTP_PROTOCOL}://${ const baseURL = `${import.meta.env.VITE_APP_HTTP_PROTOCOL}://${
import.meta.env.VITE_APP_API_URL import.meta.env.VITE_APP_API_URL
@ -114,6 +114,11 @@ const api = {
const response = await base.get<User>(`/account/${userId}`); const response = await base.get<User>(`/account/${userId}`);
return response.data; return response.data;
}, },
async createUser(user: UserUpdate): Promise<User> {
const response = await base.post<User>('/account', user);
return response.data;
},
}; };
export default api; export default api;

View File

@ -12,6 +12,8 @@ import {
import { useState } from 'react'; import { useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useUserSelector } from '@/store/userStore'; import { useUserSelector } from '@/store/userStore';
import { UserUpdate } from '@/types/user';
import { UserService } from '@/services/userService';
const { Option } = Select; const { Option } = Select;
@ -25,7 +27,11 @@ const getBase64 = (file: FileType): Promise<string> =>
reader.onerror = (error) => reject(error); reader.onerror = (error) => reject(error);
}); });
export default function UserCreate() { interface UserCreateProps {
closeDrawer: () => void;
}
export default function UserCreate({ closeDrawer }: UserCreateProps) {
const user = useUserSelector(); const user = useUserSelector();
const { t } = useTranslation(); const { t } = useTranslation();
const [previewOpen, setPreviewOpen] = useState(false); const [previewOpen, setPreviewOpen] = useState(false);
@ -45,6 +51,12 @@ export default function UserCreate() {
const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) => const handleChange: UploadProps['onChange'] = ({ fileList: newFileList }) =>
setFileList(newFileList); setFileList(newFileList);
const onFinish = async (values: UserUpdate) => {
console.log(values);
await UserService.createUser(values);
closeDrawer();
};
const customUploadButton = ( const customUploadButton = (
<div> <div>
<div <div
@ -128,7 +140,7 @@ export default function UserCreate() {
<Form <Form
name="user-edit-form" name="user-edit-form"
layout="vertical" layout="vertical"
// onFinish={onFinish} onFinish={onFinish}
initialValues={{ initialValues={{
name: '', name: '',
login: '', login: '',

View File

@ -35,6 +35,7 @@ export default function AccountsPage() {
amountPages: 0, amountPages: 0,
users: [], users: [],
currentPage: 1, currentPage: 1,
limit: 10,
}); });
useEffect(() => { useEffect(() => {
@ -160,11 +161,12 @@ export default function AccountsPage() {
} }
/> />
<Table <Table
size="small"
onChange={onTableChange} onChange={onTableChange}
columns={columns} columns={columns}
dataSource={accounts.users} dataSource={accounts.users}
pagination={{ pagination={{
pageSize: 10, pageSize: accounts.limit,
current: accounts.currentPage, current: accounts.currentPage,
total: accounts.amountCount, total: accounts.amountCount,
}} }}
@ -176,7 +178,7 @@ export default function AccountsPage() {
closeDrawer={closeCreateDrawer} closeDrawer={closeCreateDrawer}
type="create" type="create"
> >
<UserCreate /> <UserCreate closeDrawer={closeCreateDrawer} />
</ContentDrawer> </ContentDrawer>
<ContentDrawer <ContentDrawer
login={activeAccount?.login} login={activeAccount?.login}

View File

@ -1,5 +1,5 @@
import api from '@/api/api'; import api from '@/api/api';
import { AllUserResponse, User } from '@/types/user'; import { AllUserResponse, User, UserUpdate } from '@/types/user';
export class UserService { export class UserService {
static async getProfile(): Promise<User> { static async getProfile(): Promise<User> {
@ -23,4 +23,10 @@ export class UserService {
const user = api.getUserById(userId); const user = api.getUserById(userId);
return user; return user;
} }
static async createUser(user: UserUpdate): Promise<User> {
console.log('createUser');
const createdUser = api.createUser(user);
return createdUser;
}
} }

View File

@ -193,6 +193,8 @@ export interface components {
amountPages: number; amountPages: number;
/** Currentpage */ /** Currentpage */
currentPage: number; currentPage: number;
/** Limit */
limit: number;
}; };
/** Auth */ /** Auth */
Auth: { Auth: {

View File

@ -1,8 +1,8 @@
import { components } from "./openapi-types"; import { components } from './openapi-types';
export type User = components['schemas']['User']; export type User = components['schemas']['User'];
export type AllUserResponse = components['schemas']['AllUserResponse']; export type AllUserResponse = components['schemas']['AllUserResponse'];
export type AllUser = components['schemas']['AllUser']; export type AllUser = components['schemas']['AllUser'];
export type AccountStatus = components['schemas']['AccountStatus']; export type AccountStatus = components['schemas']['AccountStatus'];
export type AccountRole = components['schemas']['AccountRole']; export type AccountRole = components['schemas']['AccountRole'];
export type UserUpdate = components['schemas']['UserUpdate'];