Skip to content

Commit 2ad0128

Browse files
committed
added usergroup api and core functionality for joining study groups
1 parent 5133027 commit 2ad0128

File tree

6 files changed

+82
-16
lines changed

6 files changed

+82
-16
lines changed

src/App.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export enum Resources {
4747
MEETING = "meeting",
4848
USER = "user",
4949
MODULES = "modules",
50+
USERGROUP = "studygroup"
5051
}
5152

5253

src/api/MeetingApi.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ export function createMeeting(axios: AxiosInstance, meetingDto: CreateMeetingDto
88
.then(handleSuccessResponse, handleErrorResponse);
99
}
1010

11-
export function updateMeeting(axios: AxiosInstance, meetingId: number, meetingDto: CreateMeetingDto): Promise<CreateMeetingDto> {
11+
export function updateMeeting(axios: AxiosInstance, meetingId: string, meetingDto: CreateMeetingDto): Promise<CreateMeetingDto> {
1212
return axios.put(`/${Resources.MEETING}?id=${meetingId}`, meetingDto)
1313
.then(handleSuccessResponse, handleErrorResponse);
1414
}
1515

16-
export function deleteMeeting(axios: AxiosInstance, meetingId: number): Promise<CreateMeetingDto> {
16+
export function deleteMeeting(axios: AxiosInstance, meetingId: string): Promise<CreateMeetingDto> {
1717
return axios.delete(`/${Resources.MEETING}?id=${meetingId}`)
1818
.then(handleSuccessResponse, handleErrorResponse);
1919
}
@@ -43,4 +43,5 @@ export function getMeetingsForModule(axios: AxiosInstance, module: string): Prom
4343
.then((listRes) => {
4444
return listRes;
4545
});
46-
}
46+
}
47+

src/api/UserGroupApi.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import {AxiosInstance} from "axios";
2+
import {Resources} from "../App";
3+
import {handleErrorResponse, handleSuccessResponse} from "./ErrorHandling";
4+
5+
6+
export function joinStudyGroup(axios: AxiosInstance, meetingId: string): Promise<void> {
7+
return axios.post(`/${Resources.USERGROUP}`, { meetingId })
8+
.then(handleSuccessResponse, handleErrorResponse);
9+
}
10+
11+
12+
export async function getUserIdsForMeeting(axios: AxiosInstance, uuid: string): Promise<string[]> {
13+
14+
const res = await axios.get(`/studygroup?uuid=${uuid}`);
15+
const data = res.data;
16+
const userIds = data.map((entry: { userId: string }) => entry.userId);
17+
return userIds;
18+
}

src/components/meeting/MeetingDetails.tsx

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,33 @@
1-
import React from 'react';
1+
import React, { useEffect, useState } from 'react';
22
import '../../styles/Modal.css';
3-
import {CuteButton} from "../CuteButton";
4-
import {CreateMeetingDto} from "../../dtos/MeetingDto";
3+
import { CuteButton } from "../CuteButton";
4+
import { MeetingDto } from "../../dtos/MeetingDto";
5+
import { getUserIdsForMeeting } from "../../api/UserGroupApi";
6+
import axiosInstance from "../../AxiosConfig";
7+
import {joinStudyGroup} from "../../api/UserGroupApi"
58

69
interface ModalProps {
710
isOpen: boolean;
8-
meeting: CreateMeetingDto | null;
11+
meeting: MeetingDto | null;
912
onClose: () => void;
1013
openMeetingForm: () => void;
1114
openChooseMeetingModal: () => void;
1215
}
1316

14-
const MeetingDetails: React.FC<ModalProps> = ({isOpen, meeting, onClose, openMeetingForm, openChooseMeetingModal}) => {
17+
const MeetingDetails: React.FC<ModalProps> = ({ isOpen, meeting, onClose, openMeetingForm, openChooseMeetingModal }) => {
18+
19+
const [userIds, setUserIds] = useState<string[]>([]);
20+
21+
useEffect(() => {
22+
if (isOpen && meeting) {
23+
getUserIdsForMeeting(axiosInstance, meeting.id)
24+
.then(setUserIds)
25+
.catch(err => {
26+
console.error("Fehler beim Laden der Teilnehmer:", err);
27+
});
28+
}
29+
}, [isOpen, meeting]);
30+
1531
if (!isOpen || !meeting) return null;
1632

1733
const updateMeeting = () => {
@@ -21,9 +37,23 @@ const MeetingDetails: React.FC<ModalProps> = ({isOpen, meeting, onClose, openMee
2137
else
2238
openMeetingForm();
2339
}
40+
41+
const joinMeeting = () => {
42+
43+
joinStudyGroup(axiosInstance, meeting.id)
44+
45+
}
46+
2447
return (
2548
<div className="modal-overlay" onClick={onClose}>
26-
<div className="modal-content max-w-[90%] w-[450px]" onClick={(e) => e.stopPropagation()}>
49+
<div className="modal-content max-w-[90%] w-[700px] relative p-7" onClick={(e) => e.stopPropagation()}>
50+
51+
<button
52+
onClick={onClose}
53+
className="absolute top-4 right-4 text-white text-xxl hover:text-red-400"
54+
>
55+
×
56+
</button>
2757

2858
<h2 className="font-bold text-2xl text-white mb-4">{meeting.title}</h2>
2959

@@ -40,18 +70,34 @@ const MeetingDetails: React.FC<ModalProps> = ({isOpen, meeting, onClose, openMee
4070
<p className="text-bs font-medium text-white">
4171
<strong className="text-[#CAE8FF] font-semibold">Raum:</strong> {meeting.place}
4272
</p>
73+
74+
<p className="text-bs font-medium text-white">
75+
<strong className="text-[#CAE8FF] font-semibold">Teilnehmer:</strong>
76+
</p>
77+
<ul className="text-white text-sm list-disc list-inside">
78+
{userIds.map(id => (<li key={id}>{id}</li>))}
79+
{userIds.length === 0 && <li>(noch keine Teilnehmer)</li>}
80+
</ul>
4381
</div>
4482

4583
<div className="flex flex-row gap-4 mb-4 justify-end mt-auto items-center">
4684
<div>
47-
<CuteButton onClick={onClose} text={"Abbrechen"} bgColor={"#598BB1"} textColor={"#e6ebfc"}
48-
classname={"md:text-base text-sm"}/>
85+
<CuteButton
86+
onClick={updateMeeting}
87+
text={"Meeting bearbeiten"}
88+
bgColor={"#598BB1"}
89+
textColor={"#e6ebfc"}
90+
classname={"md:text-base text-sm"}
91+
/>
4992
</div>
5093
<div>
5194
<CuteButton
52-
onClick={updateMeeting}
53-
text={"Meeting Bearbeiten"} bgColor={"#56A095"} textColor={"#e8fcf6"}
54-
classname={"md:text-lg text-base"}/>
95+
onClick={joinMeeting}
96+
text={"Beitreten"}
97+
bgColor={"#56A095"}
98+
textColor={"#e8fcf6"}
99+
classname={"md:text-lg text-base"}
100+
/>
55101
</div>
56102
</div>
57103

src/dtos/MeetingDto.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {ChangeType} from "../enum/ChangeType";
22

33
export type MeetingDto = {
4-
id: number,
4+
id: string,
55
superId: number,
66
title: string,
77
description: string,

src/styles/Modal.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
.modal-content {
1515
background-color: #1C212C;
16-
padding: 20px;
16+
padding: 50px;
1717
border-radius: 8px;
1818
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
1919
display: flex;

0 commit comments

Comments
 (0)