Skip to content

Commit 2f74ad1

Browse files
committed
app: rebuild roles actions
1 parent 85b0f5d commit 2f74ad1

24 files changed

Lines changed: 604 additions & 353 deletions

app/src/app/(account)/dashboard/page.test.tsx

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ import { fireEvent, render, screen, waitFor } from '@testing-library/react'
22
import { toast } from 'sonner'
33
import { describe, expect, it, vi } from 'vitest'
44
import { useUser } from '@/hooks/useUser'
5-
import { createFakeGuardian } from '@/types/guardian'
6-
import { createFakeProfessor } from '@/types/professor'
7-
import { createFakeStudent } from '@/types/student'
8-
import { createFakeUser, UserRole } from '@/types/user'
5+
import { FakeUser, UserRole } from '@/types/user'
96
import DashboardPage from './page'
107

118
vi.mock('@/components/Header1', () => ({
@@ -107,12 +104,7 @@ describe('DashboardPage', () => {
107104
})
108105

109106
it('deve renderizar informações do aluno e cards específicos para aluno', async () => {
110-
const mockStudentProfile = createFakeStudent()
111-
const mockUser = {
112-
...createFakeUser(),
113-
role: UserRole.STUDENT,
114-
profile_details: mockStudentProfile,
115-
}
107+
const mockUser = { ...FakeUser, role: UserRole.STUDENT }
116108
;(useUser as vi.Mock).mockReturnValue({
117109
data: mockUser,
118110
loading: false,
@@ -123,15 +115,17 @@ describe('DashboardPage', () => {
123115

124116
expect(screen.getByText('Dashboard')).toBeInTheDocument()
125117
expect(
126-
screen.getByText(`Bem-vindo(a), ${mockStudentProfile.full_name}`),
118+
screen.getByText(
119+
`Bem-vindo(a), ${FakeUser.profile_details?.full_name}`,
120+
),
127121
).toBeInTheDocument()
128122
expect(
129-
screen.getByText(`User Info: ${mockUser.name}`),
123+
screen.getByText(`User Info: ${FakeUser.name}`),
130124
).toBeInTheDocument()
131125
expect(screen.getByText('Requisitar Documentos')).toBeInTheDocument()
132126
expect(
133127
screen.getByText(
134-
`Grades Table: ${mockStudentProfile.grades_details.length} subjects`,
128+
`Grades Table: ${FakeUser.profile_details?.grades_details?.length} subjects`,
135129
),
136130
).toBeInTheDocument()
137131

@@ -170,14 +164,22 @@ describe('DashboardPage', () => {
170164
})
171165

172166
it('deve renderizar informações do professor e não cards específicos de aluno', () => {
173-
const mockProfessorProfile = createFakeProfessor()
174-
const mockUser = {
175-
...createFakeUser(),
167+
const mockProfessorUser = {
168+
...FakeUser,
176169
role: UserRole.PROFESSOR,
177-
profile_details: mockProfessorProfile,
170+
profile_details: {
171+
id: 2,
172+
full_name: 'Test Professor',
173+
phone_number: '11987654321',
174+
photoUrl: 'https://example.com/professor.jpg',
175+
user: 2,
176+
created_at: '2023-01-01T00:00:00Z',
177+
email: 'professor@example.com',
178+
address: '456 Professor Avenue',
179+
},
178180
}
179181
;(useUser as vi.Mock).mockReturnValue({
180-
data: mockUser,
182+
data: mockProfessorUser,
181183
loading: false,
182184
error: undefined,
183185
})
@@ -186,10 +188,12 @@ describe('DashboardPage', () => {
186188

187189
expect(screen.getByText('Dashboard')).toBeInTheDocument()
188190
expect(
189-
screen.getByText(`Bem-vindo(a), ${mockProfessorProfile.full_name}`),
191+
screen.getByText(
192+
`Bem-vindo(a), ${mockProfessorUser.profile_details.full_name}`,
193+
),
190194
).toBeInTheDocument()
191195
expect(
192-
screen.getByText(`User Info: ${mockUser.name}`),
196+
screen.getByText(`User Info: ${mockProfessorUser.name}`),
193197
).toBeInTheDocument()
194198
expect(
195199
screen.queryByText('Requisitar Documentos'),
@@ -198,14 +202,22 @@ describe('DashboardPage', () => {
198202
})
199203

200204
it('deve renderizar informações do responsável e não cards específicos de aluno', () => {
201-
const mockGuardianProfile = createFakeGuardian()
202-
const mockUser = {
203-
...createFakeUser(),
205+
const mockGuardianUser = {
206+
...FakeUser,
204207
role: UserRole.GUARDIAN,
205-
profile_details: mockGuardianProfile,
208+
profile_details: {
209+
id: 3,
210+
full_name: 'Test Guardian',
211+
phone_number: '11987654321',
212+
photoUrl: 'https://example.com/guardian.jpg',
213+
user: 3,
214+
created_at: '2023-01-01T00:00:00Z',
215+
email: 'guardian@example.com',
216+
address: '789 Guardian Road',
217+
},
206218
}
207219
;(useUser as vi.Mock).mockReturnValue({
208-
data: mockUser,
220+
data: mockGuardianUser,
209221
loading: false,
210222
error: undefined,
211223
})
@@ -214,10 +226,12 @@ describe('DashboardPage', () => {
214226

215227
expect(screen.getByText('Dashboard')).toBeInTheDocument()
216228
expect(
217-
screen.getByText(`Bem-vindo(a), ${mockGuardianProfile.full_name}`),
229+
screen.getByText(
230+
`Bem-vindo(a), ${mockGuardianUser.profile_details.full_name}`,
231+
),
218232
).toBeInTheDocument()
219233
expect(
220-
screen.getByText(`User Info: ${mockUser.name}`),
234+
screen.getByText(`User Info: ${mockGuardianUser.name}`),
221235
).toBeInTheDocument()
222236
expect(
223237
screen.queryByText('Requisitar Documentos'),

app/src/app/(account)/dashboard/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { FullScreenError } from '@/components/FullScreenError'
44
import { FullScreenLoading } from '@/components/FullScreenLoading'
55
import { Header1 } from '@/components/Header1'
66
import { Paragraph } from '@/components/Paragraph'
7-
import { RoleDashboardCards } from '@/components/RoleDashboardCards'
7+
import { RolePanelCards } from '@/components/RolePanelCards'
88
import { UserInfoCard } from '@/components/UserInfoCard'
99
import { useUser } from '@/hooks/useUser'
1010

@@ -30,7 +30,7 @@ export default function DashboardPage() {
3030
/>
3131
<div className="flex flex-col gap-3 ">
3232
<UserInfoCard data={userInfo} />
33-
<RoleDashboardCards />
33+
<RolePanelCards />
3434
</div>
3535
</div>
3636
)

app/src/app/(account)/page.tsx

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,40 @@
11
'use client'
22

33
import { useRouter } from 'next/navigation'
4-
import { useState } from 'react'
4+
import { useEffect, useState } from 'react'
55
import { LoginForm } from '@/components/LoginForm'
66
import { useUser } from '@/contexts/UserContext'
77
import { login } from '@/services/auth'
8+
import { NAVIGATION } from '@/config'
89

910
export default function LoginPage() {
1011
const router = useRouter()
11-
const { refetch } = useUser() // Get the refetch function to update user data after login
12+
const { user, loading } = useUser() // Get user data and loading state
1213
const [error, setError] = useState<string>('')
1314

15+
// Redirect to dashboard if user is already authenticated
16+
useEffect(() => {
17+
if (!loading && user) {
18+
router.push(NAVIGATION.DASHBOARD)
19+
}
20+
}, [user, loading, router])
21+
22+
// If still loading user data, show a loading state
23+
if (loading) {
24+
return (
25+
<div className="flex items-center justify-center min-h-screen bg-[var(--background)]">
26+
<div className="text-center">
27+
<p>Carregando...</p>
28+
</div>
29+
</div>
30+
)
31+
}
32+
33+
// If user is already logged in, don't show the login form
34+
if (user) {
35+
return null // The redirect will happen via useEffect
36+
}
37+
1438
const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
1539
event.preventDefault()
1640
setError('')
@@ -22,8 +46,7 @@ export default function LoginPage() {
2246

2347
try {
2448
await login(email, password)
25-
await refetch()
26-
router.push('/dashboard')
49+
// The login function handles the redirect to the appropriate page
2750
} catch (err) {
2851
setError((err as Error).message || 'Erro ao realizar login')
2952
}

app/src/components/GradesTableCard/index.test.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
import { render, screen } from '@testing-library/react'
22
import { describe, expect, it } from 'vitest'
3-
import {
4-
createFakeStudentSubjectGrades,
5-
type StudentSubjectGradesProps,
6-
} from '@/types/student'
3+
import type { StudentSubjectGradesProps } from '@/types/student'
74
import { GradesTableCard } from './index'
85

96
const mockData: StudentSubjectGradesProps[] = [
10-
createFakeStudentSubjectGrades(),
11-
createFakeStudentSubjectGrades(),
12-
createFakeStudentSubjectGrades(),
7+
{
8+
subject: 'Math',
9+
grades: [10, 9, 8, 7],
10+
},
11+
{
12+
subject: 'Science',
13+
grades: [9, 8, 7, 6],
14+
},
15+
{
16+
subject: 'History',
17+
grades: [8, 7, 6, 5],
18+
},
1319
]
1420

1521
describe('GradesTableCard', () => {

app/src/components/RoleDashboardCards/index.test.tsx

Lines changed: 0 additions & 100 deletions
This file was deleted.

0 commit comments

Comments
 (0)