frontend: table addition elements refactor

This commit is contained in:
tylen 2025-11-02 21:45:12 +02:00
parent c39384badf
commit 27ee5d59c3
3 changed files with 46 additions and 55 deletions

View File

@ -2,7 +2,7 @@
import React, { createContext, useContext, useState } from 'react'; import React, { createContext, useContext, useState } from 'react';
type NotificationType = 'success' | 'error'; export type NotificationType = 'success' | 'error';
interface NotificationContextType { interface NotificationContextType {
notify: (message: string, type: NotificationType) => void; notify: (message: string, type: NotificationType) => void;

View File

@ -1,5 +1,5 @@
import useFetchHosting from "../utils/fetchHosting"; import useFetchHosting from "../utils/fetchHosting";
import { useNotification } from "../NotificationContext"; import { useNotification, type NotificationType } from "../NotificationContext";
import { useCookies } from "react-cookie"; import { useCookies } from "react-cookie";
import CenteredContainer from "./ChildrenContainer"; import CenteredContainer from "./ChildrenContainer";
import { useState } from "react"; import { useState } from "react";
@ -9,16 +9,16 @@ interface ReserveButtonProps {
update: (name: string, id: number) => void, update: (name: string, id: number) => void,
unreserve: (token: string, id: number) => void, unreserve: (token: string, id: number) => void,
reservedBy: string, reservedBy: string,
notify: (message: string, type: NotificationType) => void,
id: number, id: number,
} }
const ReserveButton: React.FC<ReserveButtonProps> = (props) => { const ReserveButton: React.FC<ReserveButtonProps> = (props) => {
const { reservedBy, update, id, unreserve } = props; const { reservedBy, update, id, unreserve, notify } = props;
const [cookie] = useCookies<string>(['userName']) const [cookie] = useCookies<string>(['userName'])
const [tokenCookie] = useCookies<string>(['apiToken']) const [tokenCookie] = useCookies<string>(['apiToken'])
const userName = cookie.userName; const userName = cookie.userName;
const isReserved = reservedBy !== ''; const isReserved = reservedBy !== '';
const notify = useNotification();
const handleReserve = async (name: string) => { const handleReserve = async (name: string) => {
try { try {
@ -50,68 +50,33 @@ const ReserveButton: React.FC<ReserveButtonProps> = (props) => {
); );
}; };
interface CreateHostingFormProps {
createHosting: (token: string, name: string, capacity: number) => void,
}
const CreateHostingForm: React.FC<CreateHostingFormProps> = (props) => { const Hosting = () => {
const { createHosting } = props; const { data, error, loading, update, unreserveHosting, createHosting } = useFetchHosting();
const [name, setName] = useState(''); const [name, setName] = useState('');
const [capacity, setCapacity] = useState(''); const [capacity, setCapacity] = useState('');
const [tokenCookie] = useCookies<string>(['apiToken']) const [tokenCookie] = useCookies<string>(['apiToken'])
const notify = useNotification(); const notify = useNotification();
const handleSubmit = async () => { const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault(); // Prevent the default form submission
if (!name || !capacity) { if (!name || !capacity) {
notify('Надо заполнить все поля', 'error') notify('Надо заполнить все поля', 'error');
return return;
} }
try { try {
await createHosting(tokenCookie.apiToken, name, Number(capacity)); // Call the existing hook await createHosting(tokenCookie.apiToken, name, Number(capacity));
// Reset form fields // Reset form fields
setName(''); setName('');
setCapacity(''); setCapacity('');
notify('Удалось создать!', 'success') notify('Удалось создать!', 'success');
} catch (error) { } catch (error) {
notify(`Не удалось создать: ${error instanceof Error ? error.message : 'Unknown error'}`, 'error'); // Capture any error message notify(`Не удалось создать: ${error instanceof Error ? error.message : 'Unknown error'}`, 'error');
} }
}
return (
<form onSubmit={handleSubmit}>
<div>
<label>
Размещение:
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
required
/>
</label>
</div>
<div>
<label>
Спальных мест:
<input
type="number"
value={capacity}
onChange={(e) => setCapacity(e.target.value)}
required
/>
</label>
</div>
<button type="submit" onClick={() => handleSubmit()}>
{'Создать размещение'}
</button>
</form>
);
}; };
const Hosting = () => {
const { data, error, loading, update, unreserveHosting, createHosting } = useFetchHosting();
return ( return (
<> <>
<CenteredContainer> <CenteredContainer>
@ -142,7 +107,7 @@ const Hosting = () => {
<td>{item.name}</td> <td>{item.name}</td>
<td>{item.capacity}</td> <td>{item.capacity}</td>
<td> <td>
<ReserveButton update={update} reservedBy={item.reservedBy} id={item.id} unreserve={unreserveHosting} /> <ReserveButton update={update} reservedBy={item.reservedBy} id={item.id} unreserve={unreserveHosting} notify={notify} />
</td> </td>
</tr> </tr>
))} ))}
@ -152,7 +117,34 @@ const Hosting = () => {
</div> </div>
)} )}
Если вы хотите организовать себе свои спальные места и хотите, чтобы остальные это видели, вы можете добавить свое месо в таблицу. Если вы хотите организовать себе свои спальные места и хотите, чтобы остальные это видели, вы можете добавить свое месо в таблицу.
<CreateHostingForm createHosting={createHosting}/> <form onSubmit={handleSubmit}>
<div>
<label>
Размещение:
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
required
/>
</label>
</div>
<div>
<label>
Спальных мест:
<input
type="number"
value={capacity}
onChange={(e) => setCapacity(e.target.value)}
required
/>
</label>
</div>
<button type="submit">
{'Создать размещение'}
</button>
</form>
</CenteredContainer> </CenteredContainer>
<br /> <br />
</> </>

View File

@ -71,7 +71,6 @@ const useFetchHosting = () => {
}; };
const createHosting = async (token: string, name: string, capacity: number) => { const createHosting = async (token: string, name: string, capacity: number) => {
setLoading(true);
setError(null); setError(null);
try { try {
const response = await fetch(`${API_URL}/hosting/create`, { const response = await fetch(`${API_URL}/hosting/create`, {
@ -84,13 +83,13 @@ const useFetchHosting = () => {
if (!response.ok) { // Check for non-200 responses if (!response.ok) { // Check for non-200 responses
const errorText = await response.text(); // Capture the response text for further insights const errorText = await response.text(); // Capture the response text for further insights
console.log(`Error ${response.status}: ${errorText}`)
throw new Error(`Error ${response.status}: ${errorText}`); throw new Error(`Error ${response.status}: ${errorText}`);
} }
// Optional: Fetch the updated data after reservation // Optional: Fetch the updated data after reservation
//await fetchData(); await fetchData();
} finally { } finally {
setLoading(false);
} }
}; };