Skip to content

Commit be20bf9

Browse files
committed
feat: update start and end in event-card
1 parent 152ac8c commit be20bf9

10 files changed

Lines changed: 111 additions & 60 deletions

File tree

package-lock.json

Lines changed: 20 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@
153153
"formik": "^2.4.5",
154154
"framer-motion": "^10.16.5",
155155
"mapbox-gl": "^2.15.0",
156-
"swr": "^2.3.2"
156+
"swr": "^2.3.2",
157+
"yocto-queue": "^1.2.0"
157158
},
158159
"msw": {
159160
"workerDirectory": [

src/components/EventCard/EventCard.test.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,13 @@ describe('The EventCard component', () => {
4646
it('displays start and end date and time correctly', () => {
4747
setup();
4848

49-
expect(
50-
screen.getByText(/3\/12\/2024\s*\|\s*08:30\s*-\s*09:30/i)
51-
).toBeInTheDocument();
49+
const textContent = screen.getByText(
50+
/02\/12\/2024\s*\|\s*08:30\s*-\s*03\/12\/2024\s*\|\s*09:30/i
51+
).textContent;
52+
53+
const normalizedText = textContent?.replace(/\s+/g, ' ').trim();
54+
55+
expect(normalizedText).toBe('02/12/2024 | 08:30 - 03/12/2024 | 09:30');
5256
});
5357

5458
it('displays the speakers', async () => {

src/components/EventCard/EventCard.tsx

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';
3636
import StrapiEvent, { EventType } from '../../models/strapi/StrapiEvent';
3737
import { IntlContext } from '../ContextProvider';
3838
import strapiMediaUrl from '../../utils/strapiMediaUrl';
39+
import convertStrapiTime from '../../utils/convertStrapiTime';
3940

4041
export interface EventCardProps {
4142
event: StrapiEvent;
@@ -208,27 +209,23 @@ export const EventCard = ({ event }: EventCardProps): JSX.Element => {
208209
color={'var(--boemly-colors-primary-700)'}
209210
/>
210211
<Text size={['xsLowBold', null, null, 'smLowBold']}>
211-
{formatDate(event.start, {
212-
year: 'numeric',
213-
month: '2-digit',
214-
day: '2-digit',
215-
})}{' '}
216-
|{' '}
217-
{formatNumber(new Date(event.start).getUTCHours(), {
218-
minimumIntegerDigits: 2,
219-
})}
220-
:
221-
{formatNumber(new Date(event.start).getUTCMinutes(), {
222-
minimumIntegerDigits: 2,
223-
})}{' '}
212+
{event.startDate &&
213+
formatDate(event.startDate, {
214+
year: 'numeric',
215+
month: '2-digit',
216+
day: '2-digit',
217+
})}
218+
{event.startTime &&
219+
` | ${convertStrapiTime(event.startTime, formatNumber)} `}
224220
-{' '}
225-
{formatNumber(new Date(event.end).getUTCHours(), {
226-
minimumIntegerDigits: 2,
227-
})}
228-
:
229-
{formatNumber(new Date(event.end).getUTCMinutes(), {
230-
minimumIntegerDigits: 2,
231-
})}
221+
{event.endDate &&
222+
formatDate(event.endDate, {
223+
year: 'numeric',
224+
month: '2-digit',
225+
day: '2-digit',
226+
})}
227+
{event.endTime &&
228+
` | ${convertStrapiTime(event.endTime, formatNumber)}`}
232229
</Text>
233230
</Flex>
234231
</Flex>

src/models/strapi/StrapiEvent.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ interface StrapiEvent {
4141
location?: string;
4242
locale: Locale;
4343
online?: boolean;
44-
start: Date;
45-
end: Date;
44+
startDate?: Date;
45+
startTime?: string;
46+
endDate?: Date;
47+
endTime?: string;
4648
slices: any[];
4749
localizations: StrapiLocalization[];
4850
topBanner?: StrapiTopBanner;

src/slices/Events/Events.test.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const pastEventMock = {
1919
attributes: {
2020
...strapiEventMock.attributes,
2121
title: 'Past Event',
22-
start: '2024-12-01T10:00:00.000Z',
22+
startDate: '2024-12-01',
2323
eventTypes: [{ id: 1, eventType: EventType.MEET_UP }],
2424
languages: [{ id: 1, language: 'English', countryCode: 'GB' }],
2525
},
@@ -30,7 +30,7 @@ const upcomingEventMock = {
3030
attributes: {
3131
...strapiEventMock.attributes,
3232
title: 'Upcoming Event',
33-
start: '2025-02-01T10:00:00.000Z',
33+
startDate: '2025-02-01',
3434
eventTypes: [{ id: 1, eventType: EventType.CONFERENCE }],
3535
languages: [{ id: 1, language: 'German', countryCode: 'DE' }],
3636
},
@@ -68,7 +68,7 @@ describe('The Events slice', () => {
6868
const key = getKey(0, null);
6969
getKeyCalls.push(key.toString());
7070

71-
if (getKey.toString().includes('filters[start][$gte]')) {
71+
if (getKey.toString().includes('filters[startDate][$gte]')) {
7272
return {
7373
data: [{ body: { data: [upcomingEventMock] } }],
7474
isLoading: false,
@@ -77,7 +77,7 @@ describe('The Events slice', () => {
7777
loadMore: jest.fn(),
7878
};
7979
}
80-
if (getKey.toString().includes('filters[start][$lt]')) {
80+
if (getKey.toString().includes('filters[startDate][$lt]')) {
8181
return {
8282
data: [{ body: { data: [pastEventMock] } }],
8383
isLoading: false,
@@ -149,7 +149,7 @@ describe('The Events slice', () => {
149149
// Use past events for the testing, because the batch for past events is defined as 2 and
150150
// the "Load button" will be shown when there are more then 2 past events
151151
(useEvents as jest.Mock).mockImplementation(({ getKey }) => {
152-
if (getKey.toString().includes('filters[start][$lt]')) {
152+
if (getKey.toString().includes('filters[startDate][$lt]')) {
153153
return {
154154
data: [
155155
{
@@ -243,7 +243,7 @@ describe('The Events slice', () => {
243243
await waitFor(() => {
244244
expect(getKeyCalls.map(decodeURIComponent)).toEqual(
245245
expect.arrayContaining([
246-
expect.stringContaining('filters[start][$gte]'),
246+
expect.stringContaining('filters[startDate][$gte]'),
247247
expect.stringContaining(
248248
'filters[$or][0][eventTypes][eventType]=Conference'
249249
),
@@ -278,7 +278,7 @@ describe('The Events slice', () => {
278278
await waitFor(() => {
279279
expect(getKeyCalls.map(decodeURIComponent)).toEqual(
280280
expect.arrayContaining([
281-
expect.stringContaining('filters[start][$gte]'),
281+
expect.stringContaining('filters[startDate][$gte]'),
282282
expect.stringContaining(
283283
'filters[$or][0][languages][language]=German'
284284
),
@@ -303,7 +303,7 @@ describe('The Events slice', () => {
303303
expect(getKeyCalls.map(decodeURIComponent)).toEqual(
304304
expect.arrayContaining([
305305
expect.stringContaining(
306-
`filters[start][$gte]=${NOW.toISOString()}`
306+
`filters[startDate][$gte]=${NOW.toISOString()}`
307307
),
308308
])
309309
);
@@ -341,7 +341,9 @@ describe('The Events slice', () => {
341341
await waitFor(() => {
342342
expect(getKeyCalls.map(decodeURIComponent)).toEqual(
343343
expect.arrayContaining([
344-
expect.stringContaining(`filters[start][$lt]=${NOW.toISOString()}`),
344+
expect.stringContaining(
345+
`filters[startDate][$lt]=${NOW.toISOString()}`
346+
),
345347
])
346348
);
347349
});

src/slices/Events/Events.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export const Events: React.FC<EventsProps> = ({ slice }: EventsProps) => {
8484
) => {
8585
const url = new URL(`/treely-events`, STRAPI_URI);
8686
url.searchParams.append(
87-
'pagination[start]',
87+
'pagination[startDate]',
8888
(index * batchSize).toString()
8989
);
9090
url.searchParams.append('pagination[limit]', batchSize.toString());
@@ -93,9 +93,9 @@ export const Events: React.FC<EventsProps> = ({ slice }: EventsProps) => {
9393
url.searchParams.append('pLevel', '6');
9494

9595
if (sort[0] === Sort.OLDEST_FIRST) {
96-
url.searchParams.append('sort', 'start:asc');
96+
url.searchParams.append('sort', 'startDate:asc');
9797
} else {
98-
url.searchParams.append('sort', 'start:desc');
98+
url.searchParams.append('sort', 'startDate:desc');
9999
}
100100

101101
if (eventTypeFilter.length) {
@@ -120,12 +120,13 @@ export const Events: React.FC<EventsProps> = ({ slice }: EventsProps) => {
120120

121121
const getUpcomingKey: SWRInfiniteKeyLoader = useCallback(
122122
(index) =>
123-
buildEventsUrl(index, UPCOMING_BATCH_SIZE, 'filters[start][$gte]'),
123+
buildEventsUrl(index, UPCOMING_BATCH_SIZE, 'filters[startDate][$gte]'),
124124
[eventTypeFilter, languageFilter, sort]
125125
);
126126

127127
const getPastKey: SWRInfiniteKeyLoader = useCallback(
128-
(index) => buildEventsUrl(index, PAST_BATCH_SIZE, 'filters[start][$lt]'),
128+
(index) =>
129+
buildEventsUrl(index, PAST_BATCH_SIZE, 'filters[startDate][$lt]'),
129130
[eventTypeFilter, languageFilter, sort]
130131
);
131132

src/test/strapiMocks/strapiEventMock.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ export const strapiEventMock: IStrapiData<StrapiEvent> = {
1414
logo: { id: 1, alt: 'Logo alt text 1', img: { data: strapiMediaMock } },
1515
eventTypes: [{ id: 1, eventType: EventType.MEET_UP }],
1616
languages: [{ id: 1, language: 'English', countryCode: 'GB' }],
17-
start: new Date('2024-03-12T08:30:00Z'),
18-
end: new Date('2024-03-12T09:30:00Z'),
17+
startDate: new Date('2024-02-12'),
18+
startTime: '08:30:00.000',
19+
endDate: new Date('2024-03-12'),
20+
endTime: '09:30:00.000',
1921
title: 'Event Title',
2022
description: 'Event Description',
2123
button: { id: 1, text: 'Button text', url: 'https://tree.ly' },
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import convertStrapiTime from './convertStrapiTime';
2+
3+
describe('The convertStrapiTime util', () => {
4+
it('returns the correct time', () => {
5+
const formatNumber = jest.fn((number) =>
6+
number.toString().padStart(2, '0')
7+
);
8+
const time = '12:45:00.000';
9+
10+
expect(convertStrapiTime(time, formatNumber)).toBe('12:45');
11+
});
12+
13+
it('returns the correct amount of digits', () => {
14+
const formatNumber = jest.fn((number) =>
15+
number.toString().padStart(2, '0')
16+
);
17+
const time = '08:05:00.000';
18+
19+
expect(convertStrapiTime(time, formatNumber)).toBe('08:05');
20+
});
21+
});

src/utils/convertStrapiTime.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { FormatNumberOptions } from 'react-intl';
2+
3+
const convertStrapiTime = (
4+
date: string,
5+
formatNumber: (value: number | bigint, opts?: FormatNumberOptions) => string
6+
): string => {
7+
let tempTime = date.split(':');
8+
let dt = new Date();
9+
dt.setHours(parseInt(tempTime[0], 10), parseInt(tempTime[1], 10), 0, 0);
10+
const time = new Date(dt.getTime() - dt.getTimezoneOffset() * 60000);
11+
12+
return `${formatNumber(time.getUTCHours(), {
13+
minimumIntegerDigits: 2,
14+
})}:${formatNumber(time.getUTCMinutes(), {
15+
minimumIntegerDigits: 2,
16+
})}`;
17+
};
18+
19+
export default convertStrapiTime;

0 commit comments

Comments
 (0)