Skip to content
This repository was archived by the owner on Jun 12, 2025. It is now read-only.

Commit 30fd48d

Browse files
authored
Merge pull request #18 from EVOGD-Project:dev
Dev
2 parents 0287797 + c41f53b commit 30fd48d

6 files changed

Lines changed: 38 additions & 68 deletions

File tree

src/app/classes/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import ClasroomsScreen from '@/components/screens/ClassroomsScreen';
1+
import ClassroomsScreen from '@/components/screens/ClassroomsScreen';
22

33
export default function ClassesPage() {
4-
return <ClasroomsScreen />;
4+
return <ClassroomsScreen />;
55
}

src/components/modals/CreateClassModal.tsx

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { api } from '@/api/api';
44
import { authAtom } from '@/store/auth';
5+
import { classroomsAtom } from '@/store/classrooms';
56
import type { IClassroom } from '@/types/IClassroomCard';
67
import {
78
Button,
@@ -26,17 +27,16 @@ import { useEffect, useState } from 'react';
2627
interface CreateClassModalProps {
2728
isOpen: boolean;
2829
onClose: () => void;
29-
onClassroomCreated?: (classrooms: IClassroom[]) => void;
3030
}
3131

32-
export default function CreateClassModal({ isOpen, onClose, onClassroomCreated }: Readonly<CreateClassModalProps>) {
32+
export default function CreateClassModal({ isOpen, onClose }: Readonly<CreateClassModalProps>) {
3333
const [isLoading, setIsLoading] = useState(false);
3434
const [formData, setFormData] = useState({
3535
name: '',
3636
description: '',
3737
thumbnailId: 1
3838
});
39-
const [auth] = useAtom(authAtom);
39+
const [, setClassrooms] = useAtom(classroomsAtom);
4040

4141
const toast = useToast();
4242

@@ -65,18 +65,14 @@ export default function CreateClassModal({ isOpen, onClose, onClassroomCreated }
6565

6666
setIsLoading(true);
6767
try {
68-
const { id } = await api.classroom.create(formData);
69-
70-
const newClassroom: IClassroom = {
71-
id,
72-
...formData,
73-
code: id.slice(0, 6).toUpperCase(),
74-
owner: auth.user?.id ?? '',
75-
memberCount: 1
76-
};
77-
78-
onClassroomCreated?.([newClassroom]);
68+
await api.classroom.create(formData);
7969

70+
try {
71+
const data = await api.classroom.getAll();
72+
setClassrooms(data);
73+
} catch (error) {
74+
console.error('Failed to fetch classrooms:', error);
75+
}
8076
toast({
8177
title: 'Clase creada',
8278
description: 'La clase se ha creado exitosamente',

src/components/modals/JoinClassModal.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client';
22

33
import { api } from '@/api/api';
4+
import { classroomsAtom } from '@/store/classrooms';
45
import type { IClassroom } from '@/types/IClassroomCard';
56
import {
67
Button,
@@ -17,17 +18,19 @@ import {
1718
VStack,
1819
useToast
1920
} from '@chakra-ui/react';
21+
import { useAtom } from 'jotai';
2022
import { useEffect, useState } from 'react';
2123

2224
interface JoinClassModalProps {
2325
isOpen: boolean;
2426
onClose: () => void;
25-
onClassroomJoined?: (classrooms: IClassroom[]) => void;
2627
}
2728

28-
export default function JoinClassModal({ isOpen, onClose, onClassroomJoined }: Readonly<JoinClassModalProps>) {
29+
export default function JoinClassModal({ isOpen, onClose }: Readonly<JoinClassModalProps>) {
2930
const [isLoading, setIsLoading] = useState(false);
3031
const [code, setCode] = useState('');
32+
const [, setClassrooms] = useAtom(classroomsAtom);
33+
3134
const toast = useToast();
3235

3336
useEffect(() => {
@@ -52,8 +55,13 @@ export default function JoinClassModal({ isOpen, onClose, onClassroomJoined }: R
5255
setIsLoading(true);
5356
try {
5457
await api.classroom.join(code);
55-
const updatedClassrooms = await api.classroom.getAll();
56-
onClassroomJoined?.(updatedClassrooms);
58+
59+
try {
60+
const data = await api.classroom.getAll();
61+
setClassrooms(data);
62+
} catch (error) {
63+
console.error('Failed to fetch classrooms:', error);
64+
}
5765

5866
toast({
5967
title: 'Éxito',

src/components/screens/ClassroomScreen.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ export default function ClassroomScreen({ id }: Readonly<{ id: string }>) {
321321
/>
322322
<Box>
323323
<Text fontWeight='bold'>{professor.username}</Text>
324-
<Text fontSize='sm' color='brand.400'>
324+
<Text fontSize='sm' color='brand.primary.300'>
325325
Profesor
326326
</Text>
327327
</Box>

src/components/screens/ClassroomsScreen.tsx

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use client';
22

3-
import { api } from '@/api/api';
4-
import type { IClassroom } from '@/types/IClassroomCard';
3+
import { classroomsAtom } from '@/store/classrooms';
54
import {
65
Box,
76
Button,
@@ -14,32 +13,17 @@ import {
1413
Text,
1514
useDisclosure
1615
} from '@chakra-ui/react';
17-
import { useEffect, useState } from 'react';
16+
import { useAtom } from 'jotai';
17+
import {} from 'react';
1818
import { FiPlus, FiUsers } from 'react-icons/fi';
1919
import ClassroomCard from '../general/ClassroomCard';
2020
import CreateClassModal from '../modals/CreateClassModal';
2121
import JoinClassModal from '../modals/JoinClassModal';
2222

23-
export default function ClasroomsScreen() {
23+
export default function ClassroomsScreen() {
2424
const { isOpen: isCreateOpen, onOpen: onCreateOpen, onClose: onCreateClose } = useDisclosure();
2525
const { isOpen: isJoinOpen, onOpen: onJoinOpen, onClose: onJoinClose } = useDisclosure();
26-
const [classrooms, setClassrooms] = useState<IClassroom[]>([]);
27-
const [isLoading, setIsLoading] = useState(true);
28-
29-
useEffect(() => {
30-
const fetchClassrooms = async () => {
31-
try {
32-
const data = await api.classroom.getAll();
33-
setClassrooms(data);
34-
} catch (error) {
35-
console.error('Error al obtener las clases:', error);
36-
} finally {
37-
setIsLoading(false);
38-
}
39-
};
40-
41-
fetchClassrooms();
42-
}, []);
26+
const [classrooms] = useAtom(classroomsAtom);
4327

4428
return (
4529
<Box as='main' className='animate-fade-in'>
@@ -70,7 +54,7 @@ export default function ClasroomsScreen() {
7054
</Box>
7155

7256
<Container maxW='container.xl' py={8}>
73-
{isLoading ? (
57+
{classrooms === null ? (
7458
<Flex h='200px' align='center' justify='center'>
7559
<Spinner size='xl' borderWidth='4px' />
7660
</Flex>
@@ -101,8 +85,8 @@ export default function ClasroomsScreen() {
10185
</Flex>
10286
)}
10387
</Container>
104-
<CreateClassModal isOpen={isCreateOpen} onClose={onCreateClose} onClassroomCreated={setClassrooms} />
105-
<JoinClassModal isOpen={isJoinOpen} onClose={onJoinClose} onClassroomJoined={setClassrooms} />
88+
<CreateClassModal isOpen={isCreateOpen} onClose={onCreateClose} />
89+
<JoinClassModal isOpen={isJoinOpen} onClose={onJoinClose} />
10690
</Box>
10791
);
10892
}

src/components/screens/ProfileScreen.tsx

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
'use client';
22

33
import { api } from '@/api/api';
4+
import { CDN_URL } from '@/constants/constants';
45
import { authAtom } from '@/store/auth';
6+
import { classroomsAtom } from '@/store/classrooms';
57
import type { IClassroom } from '@/types/IClassroomCard';
68
import {
79
Avatar,
@@ -18,39 +20,19 @@ import {
1820
useDisclosure
1921
} from '@chakra-ui/react';
2022
import { useAtom } from 'jotai';
21-
import { useEffect, useState } from 'react';
2223
import { FiPlus, FiUsers } from 'react-icons/fi';
2324
import ClassroomCard from '../general/ClassroomCard';
2425
import CreateClassModal from '../modals/CreateClassModal';
2526
import EditAccountModal from '../modals/EditAccountModal';
26-
import { CDN_URL } from '@/constants/constants';
2727

2828
export default function ProfileScreen() {
2929
const [auth] = useAtom(authAtom);
30+
const [classrooms] = useAtom(classroomsAtom);
3031
const { isOpen: isCreateOpen, onOpen: onCreateOpen, onClose: onCreateClose } = useDisclosure();
3132
const { isOpen: isEditOpen, onOpen: onEditOpen, onClose: onEditClose } = useDisclosure();
32-
const [classrooms, setClassrooms] = useState<IClassroom[]>([]);
33-
const [isLoading, setIsLoading] = useState(true);
3433

3534
const { user } = auth;
3635

37-
useEffect(() => {
38-
const fetchClassrooms = async () => {
39-
try {
40-
const data = await api.classroom.getAll();
41-
setClassrooms(data);
42-
} catch (error) {
43-
console.error('Failed to fetch classrooms:', error);
44-
} finally {
45-
setIsLoading(false);
46-
}
47-
};
48-
49-
if (user) {
50-
fetchClassrooms();
51-
}
52-
}, [user]);
53-
5436
if (typeof location !== 'undefined' && !user && !auth.isLoading) location.href = '/';
5537

5638
return user ? (
@@ -92,7 +74,7 @@ export default function ProfileScreen() {
9274
<Heading size='lg' mb={6}>
9375
Clases Destacadas
9476
</Heading>
95-
{isLoading ? (
77+
{classrooms === null ? (
9678
<Flex h='200px' align='center' justify='center'>
9779
<Spinner size='lg' />
9880
</Flex>
@@ -126,7 +108,7 @@ export default function ProfileScreen() {
126108
</VStack>
127109
</Container>
128110

129-
<CreateClassModal isOpen={isCreateOpen} onClose={onCreateClose} onClassroomCreated={setClassrooms} />
111+
<CreateClassModal isOpen={isCreateOpen} onClose={onCreateClose} />
130112
<EditAccountModal isOpen={isEditOpen} onClose={onEditClose} />
131113
</Box>
132114
) : (

0 commit comments

Comments
 (0)