From f69fa8b563f6df28708fbb3fe2c2391b7d758174 Mon Sep 17 00:00:00 2001 From: tylen Date: Mon, 3 Nov 2025 12:25:35 +0200 Subject: [PATCH] add attendnace table --- backend/src/user.py | 28 +++++++++++ frontend/src/components/AttendnaceTable.tsx | 54 +++++++++++++++++++-- frontend/src/types/index.d.ts | 5 ++ frontend/src/utils/fetchUser.tsx | 26 +++++++++- 4 files changed, 107 insertions(+), 6 deletions(-) diff --git a/backend/src/user.py b/backend/src/user.py index fb6d4e2..1da1a64 100644 --- a/backend/src/user.py +++ b/backend/src/user.py @@ -138,6 +138,34 @@ def registerUserEndpoints(app, database): except Exception as e: return jsonify(success=False, message=str(e)), 500 + @app.route('/users/attendance/all', methods=['GET']) + def get_attendance_all(): + token = request.args.get('token') + + if not token: + return jsonify(success=False, message="Token is required"), 400 + + query_session = "SELECT * FROM sessions WHERE Token=%s" + + try: + result = database.query(query_session, params=(token,)) + if not result: + return jsonify(success=False, message="Token is invalid or expired"), 401 + + attendance_query = "SELECT Name, Attendance FROM users" + attendance_result = database.query(attendance_query) + + if not attendance_result: + return jsonify(success=False, message="No users found"), 404 + + attendance_list = [{"name": row[0], "attendance": row[1]} for row in attendance_result] + + return jsonify(success=True, attendance_list=attendance_list), 200 + + except Exception as e: + return jsonify(success=False, message=str(e)), 500 + + diff --git a/frontend/src/components/AttendnaceTable.tsx b/frontend/src/components/AttendnaceTable.tsx index 5895c1a..771a98d 100644 --- a/frontend/src/components/AttendnaceTable.tsx +++ b/frontend/src/components/AttendnaceTable.tsx @@ -1,16 +1,60 @@ +import { useEffect, useState } from "react"; +import useFetchUser from "../utils/fetchUser"; import CenteredContainer from "./ChildrenContainer"; +import type { User } from "../types"; + +const processAttendance = (attendance: boolean | null): string => { + if (attendance == null) { + return "Пока не ответил" + } + return (attendance == true) ? "Да!" : "Не в этот раз" +} function AttendanceTable() { + const {getAttendanceAll} = useFetchUser() + const [userAttendanceData, setUserAttendnaceData] = useState([]) + + const fetchUserData = async () => { + const userData = await getAttendanceAll() + setUserAttendnaceData(userData) + } + + const handleRefresh = () => { + fetchUserData() + } + + useEffect(() => { + fetchUserData() + }, []) + return ( <>

Кто празднует?

-

- Вскоре, вы сможете видеть всех, кто приедет и будет праздновать с нами. Данная фича по полной в разработке! -

- Таблица в производстве... Ожидайте к началу-середние ноября -

+ {userAttendanceData && ( +
+ + + + + + + + + {userAttendanceData && userAttendanceData.map((item) => ( + + + + + ))} + +
ПяткаПразднует с нами?
{item.name}{processAttendance(item.attendance)}
+

Таблицу можно скроллить

+
+ )} +
+
) diff --git a/frontend/src/types/index.d.ts b/frontend/src/types/index.d.ts index 8b2f6cd..7059a63 100644 --- a/frontend/src/types/index.d.ts +++ b/frontend/src/types/index.d.ts @@ -10,3 +10,8 @@ export interface Furniture { export interface Hosting { furniture: Furniture[]; // Array of furniture items } + +export interface User { + attendance: boolean | null + name: string +} \ No newline at end of file diff --git a/frontend/src/utils/fetchUser.tsx b/frontend/src/utils/fetchUser.tsx index f0f25e5..b2627b2 100644 --- a/frontend/src/utils/fetchUser.tsx +++ b/frontend/src/utils/fetchUser.tsx @@ -2,6 +2,7 @@ import { useCookies } from 'react-cookie'; import { API_URL } from '../constants/constants'; import { hashPassword } from './hashPassword'; import { useState } from 'react'; +import type { User } from '../types'; const useFetchUser = () => { const [isLoading, setIsLoading] = useState(false) @@ -162,7 +163,30 @@ const useFetchUser = () => { } } - return { userSet, passwordCreate, signUser, validToken, updateAttendance, getAttendance, isLoading }; + const getAttendanceAll = async (): Promise => { + const token = apiCookie.apiToken + try { + const response = await fetch(`${API_URL}/users/attendance/all?token=${encodeURIComponent(token)}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + } + }); + + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); + const data = await response.json(); + + if (!data.success) throw new Error(data.message); + + return data.attendance_list + } catch (error) { + console.error('Error retrieving attendance:', error); + return [] + } + } + + + return { userSet, passwordCreate, signUser, validToken, updateAttendance, getAttendance, isLoading, getAttendanceAll }; }; export default useFetchUser;