11import { PlusIcon } from '@heroicons/react/24/outline' ;
2- import {
3- Chip ,
4- Listbox ,
5- ListboxItem ,
6- Modal ,
7- Spinner ,
8- useDisclosure ,
9- } from '@nextui-org/react' ;
2+ import { cn , Listbox , ListboxItem , Modal , useDisclosure } from '@nextui-org/react' ;
103import { useQuery } from '@tanstack/react-query' ;
114import { useRouter } from 'next/navigation' ;
125import { useMemo } from 'react' ;
136
14- import {
15- classNames ,
16- determineGradeBGColour ,
17- ReadableStatus ,
18- semesterURL ,
19- } from '@lib/helpers' ;
7+ import { classNames , determineGradeBGColour , semesterURL } from '@lib/helpers' ;
208import Button from '@components/Button/Button' ;
219import LinkButton from '@components/Button/LinkButton' ;
2210import CreateSemesterModal from '@components/Modal/CreateSemester' ;
23- import {
24- ItemStatus ,
25- SemesterProgressType ,
26- SessionProps ,
27- User ,
28- } from '@coursefull' ;
11+ import { ItemStatus , SemesterProgressType , SessionProps } from '@coursefull' ;
2912import { getProgress , getUserData } from '@services/userService' ;
3013import Loading from '@app/loading' ;
3114import StatusChip from '@components/Chip/StatusChip' ;
15+ import { useGradeColours , useProgressColours } from '@lib/hooks/ui' ;
3216
3317function renderAverage ( item : SemesterProgressType | null | undefined ) : string {
3418 if ( ! item ) {
@@ -41,17 +25,6 @@ function renderAverage(item: SemesterProgressType | null | undefined): string {
4125 return average ;
4226}
4327
44- function getChipColour ( status : ItemStatus ) {
45- switch ( status ) {
46- case ItemStatus . NOT_STARTED :
47- return 'default' ;
48- case ItemStatus . ACTIVE :
49- return 'primary' ;
50- case ItemStatus . COMPLETE :
51- return 'success' ;
52- }
53- }
54-
5528function renderSemester ( item : SemesterProgressType ) {
5629 return (
5730 < ListboxItem
@@ -73,11 +46,7 @@ function renderSemester(item: SemesterProgressType) {
7346 </ div >
7447 }
7548 className = {
76- ( item . status === ItemStatus . ACTIVE ||
77- item . status === ItemStatus . COMPLETE ) &&
78- item . average
79- ? determineGradeBGColour ( item . goal , item . average )
80- : ''
49+ cn ( Object . values ( item . grade_colour ! ) )
8150 }
8251 textValue = { `${ item . average } % out of ${ item . goal } %` }
8352 >
@@ -89,37 +58,39 @@ function renderSemester(item: SemesterProgressType) {
8958}
9059
9160export default function Dashboard ( { session } : SessionProps ) {
92- const progressResult = useQuery ( {
61+ const {
62+ data : progressData ,
63+ isLoading : loadingProgress ,
64+ error : progressError ,
65+ } = useQuery ( {
9366 queryKey : [ 'progress' ] ,
9467 queryFn : ( ) => {
9568 return getProgress ( session ) ;
9669 } ,
9770 } ) ;
9871
99- const progress : SemesterProgressType [ ] | undefined = progressResult . data ;
100- const loadingProgress : boolean = progressResult . isLoading ;
101- const progressError : Error | null = progressResult . error ;
10272 if ( progressError ) {
10373 throw progressError ;
10474 }
10575
10676 const activeSemester = useMemo (
10777 ( ) =>
108- progress
78+ progressData
10979 ?. filter ( ( semester ) => semester . status === ItemStatus . ACTIVE )
11080 . shift ( ) || null ,
111- [ progress ]
81+ [ progressData ]
11282 ) ;
11383
114- const userResult = useQuery ( {
84+ const {
85+ data : userData ,
86+ isLoading : loadingUserData ,
87+ error : userError ,
88+ } = useQuery ( {
11589 queryKey : [ 'user' ] ,
11690 queryFn : ( ) => {
11791 return getUserData ( session ) ;
11892 } ,
11993 } ) ;
120- const userData : User | undefined = userResult . data ;
121- const loadingUserData : boolean = userResult . isLoading ;
122- const userError : Error | null = userResult . error ;
12394 if ( userError ) {
12495 throw progressError ;
12596 }
@@ -128,6 +99,10 @@ export default function Dashboard({ session }: SessionProps) {
12899
129100 const router = useRouter ( ) ;
130101
102+ const colorizedSemesters = useProgressColours ( progressData ) ;
103+
104+ const { bgColour, textColour } = useGradeColours ( activeSemester ?. goal , activeSemester ?. average ) ;
105+
131106 return (
132107 < div className = "h-full" >
133108 < h1 > Hey, { session . user . user_metadata . first_name } !</ h1 >
@@ -138,12 +113,8 @@ export default function Dashboard({ session }: SessionProps) {
138113 < div
139114 className = { classNames (
140115 'basis-1/2 border-2 border-primary-600/15 rounded-lg p-4 flex flex-col justify-between gap-4' ,
141- activeSemester ?. average
142- ? determineGradeBGColour (
143- activeSemester ?. goal ,
144- activeSemester . average
145- )
146- : 'bg-primary-800'
116+ bgColour ,
117+ textColour
147118 ) }
148119 >
149120 < h3 className = "text-left" > Active Semester</ h3 >
@@ -185,7 +156,7 @@ export default function Dashboard({ session }: SessionProps) {
185156 </ div >
186157
187158 < Listbox
188- items = { progress }
159+ items = { colorizedSemesters }
189160 aria-label = "Semesters"
190161 className = "my-4"
191162 itemClasses = { {
@@ -199,12 +170,13 @@ export default function Dashboard({ session }: SessionProps) {
199170 } }
200171 emptyContent = {
201172 < div className = "text-center" >
202- You don't have any semesters. Start by
203- adding some!
173+ {
174+ "You don't have any semesters. Start by adding some!"
175+ }
204176 </ div >
205177 }
206178 >
207- { ( item ) => renderSemester ( item ) }
179+ { ( item : SemesterProgressType ) => renderSemester ( item ) }
208180 </ Listbox >
209181 </ div >
210182 </ div >
@@ -216,6 +188,8 @@ export default function Dashboard({ session }: SessionProps) {
216188 onOpenChange = { onOpenChange }
217189 className = "bg-sky-100"
218190 scrollBehavior = "inside"
191+ isDismissable = { false }
192+ isKeyboardDismissDisabled = { true }
219193 classNames = { { footer : 'justify-between' } }
220194 >
221195 < CreateSemesterModal
0 commit comments