Skip to content

Commit f413887

Browse files
committed
Fix session separation and date-time rendering
1 parent 02278df commit f413887

File tree

3 files changed

+63
-24
lines changed

3 files changed

+63
-24
lines changed
Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import React, { useState } from 'react';
22
import { useApiData } from '@/hooks/use-api-data';
3-
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
3+
import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from '@/components/ui/select';
4+
import { CoachingSession, isCoachingSession } from '@/types/coaching-session';
5+
import { DateTime } from 'ts-luxon';
46

57
interface DynamicApiSelectProps<T> {
68
url: string;
@@ -24,11 +26,11 @@ export function DynamicApiSelect<T>({
2426
method = 'GET',
2527
params = {},
2628
onChange,
27-
placeholder = "Select an organization",
29+
placeholder = "Select an option",
2830
getOptionLabel,
2931
getOptionValue,
3032
elementId,
31-
groupByDate
33+
groupByDate = false
3234
}: DynamicApiSelectProps<T>) {
3335
const { data: response, isLoading, error } = useApiData<ApiResponse<T>>(url, { method, params });
3436
const [value, setValue] = useState<string>('');
@@ -38,26 +40,63 @@ export function DynamicApiSelect<T>({
3840
onChange(newValue);
3941
}
4042

41-
if (isLoading) return <p>Loading...</p>
42-
if (error) return <p>Error: {error.message}</p>
43-
if (!response || response.status_code !== 200) return <p>Error: Invalid response</p>
43+
if (isLoading) return <p>Loading...</p>;
44+
if (error) return <p>Error: {error.message}</p>;
45+
if (!response || response.status_code !== 200) return <p>Error: Invalid response</p>;
4446

4547
const items = response.data;
4648

47-
return (
48-
<Select
49-
value={value}
50-
onValueChange={handleValueChange}>
51-
<SelectTrigger id={elementId} className='w-auto'>
52-
<SelectValue placeholder={placeholder} />
53-
</SelectTrigger>
54-
<SelectContent className='w-full'>
55-
{items.map((item, index) => (
49+
const renderSessions = (sessions: CoachingSession[], label: string, filterFn: (session: CoachingSession) => boolean) => {
50+
const filteredSessions = sessions.filter(filterFn);
51+
return filteredSessions.length > 0 && (
52+
<SelectGroup>
53+
<SelectLabel>{label}</SelectLabel>
54+
{filteredSessions.map(session => (
55+
<SelectItem value={session.id} key={session.id}>
56+
{DateTime.fromISO(session.date.toString()).toLocaleString(DateTime.DATETIME_FULL)}
57+
</SelectItem>
58+
))}
59+
</SelectGroup>
60+
);
61+
};
62+
63+
const renderCoachingSessions = (sessions: CoachingSession[]) => (
64+
<SelectContent>
65+
{sessions.length === 0 ? (
66+
<SelectItem disabled value="none">None found</SelectItem>
67+
) : (
68+
<>
69+
{renderSessions(sessions, 'Previous Sessions', session => DateTime.fromISO(session.date.toString()) < DateTime.now())}
70+
{renderSessions(sessions, 'Upcoming Sessions', session => DateTime.fromISO(session.date.toString()) >= DateTime.now())}
71+
</>
72+
)}
73+
</SelectContent>
74+
);
75+
76+
const renderOtherItems = (items: T[]) => (
77+
<SelectContent>
78+
{items.length === 0 ? (
79+
<SelectItem disabled value="none">None found</SelectItem>
80+
) : (
81+
items.map((item, index) => (
5682
<SelectItem key={index} value={getOptionValue(item)}>
5783
{getOptionLabel(item)}
5884
</SelectItem>
59-
))}
60-
</SelectContent>
85+
))
86+
)}
87+
</SelectContent>
88+
);
89+
90+
const coachingSessions = groupByDate ? items.filter(isCoachingSession) as CoachingSession[] : [];
91+
92+
return (
93+
<Select value={value} onValueChange={handleValueChange}>
94+
<SelectTrigger id={elementId}>
95+
<SelectValue placeholder={placeholder} />
96+
</SelectTrigger>
97+
{groupByDate && coachingSessions.length > 0
98+
? renderCoachingSessions(coachingSessions)
99+
: renderOtherItems(items)}
61100
</Select>
62101
);
63-
}
102+
}

src/components/ui/dashboard/join-coaching-session.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export function JoinCoachingSession({ userId: userId }: CoachingSessionCardProps
7373
getOptionLabel={(session) => session.date.toString()}
7474
getOptionValue={(session) => session.id.toString()}
7575
elementId='session-selector'
76+
groupByDate={true}
7677
/>
7778
</div>
7879
)}
@@ -88,4 +89,7 @@ export function JoinCoachingSession({ userId: userId }: CoachingSessionCardProps
8889
</CardContent>
8990
</Card>
9091
)
91-
}
92+
}
93+
94+
// godot
95+
//asesprint

src/hooks/use-api-data.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ const baseUrl = siteConfig.url;
1212

1313
const fetcher = async ({ url, method = 'POST', params }: FetcherOptions) => {
1414
const fullUrl = `${baseUrl}${url}`;
15-
console.log(fullUrl);
1615

1716
const headers: HeadersInit = {
1817
'Content-Type': 'application/json',
@@ -24,7 +23,6 @@ const fetcher = async ({ url, method = 'POST', params }: FetcherOptions) => {
2423
headers,
2524
credentials: 'include',
2625
};
27-
console.log(JSON.stringify(fetchOptions));
2826

2927
const response = await fetch(fullUrl, fetchOptions);
3028
if (!response.ok) {
@@ -42,7 +40,7 @@ export function useApiData<T>(
4240
body?: Record<string, any>
4341
} = {}
4442
) {
45-
const { method = 'POST', params = {}, body = {} || undefined } = options
43+
const { method = 'POST', params = {}, body = {} } = options
4644

4745
const { data, error, isLoading, mutate } = useSWR<T, Error>(
4846
{ url, method, params, body },
@@ -53,8 +51,6 @@ export function useApiData<T>(
5351
}
5452
)
5553

56-
console.log(data);
57-
5854
return {
5955
data,
6056
isLoading,

0 commit comments

Comments
 (0)