@treely/strapi-slices 7.6.3 → 7.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/models/strapi/StrapiEvent.d.ts +3 -4
- package/dist/strapi-slices.cjs.development.js +21 -17
- package/dist/strapi-slices.cjs.development.js.map +1 -1
- package/dist/strapi-slices.cjs.production.min.js +1 -1
- package/dist/strapi-slices.cjs.production.min.js.map +1 -1
- package/dist/strapi-slices.esm.js +21 -17
- package/dist/strapi-slices.esm.js.map +1 -1
- package/dist/utils/isSameDate.d.ts +2 -0
- package/package.json +1 -1
- package/src/components/EventCard/EventCard.test.tsx +17 -0
- package/src/components/EventCard/EventCard.tsx +37 -13
- package/src/models/strapi/StrapiEvent.ts +3 -4
- package/src/slices/Events/Events.test.tsx +9 -11
- package/src/slices/Events/Events.tsx +4 -5
- package/src/test/strapiMocks/strapiEventMock.ts +3 -4
- package/src/utils/isSameDate.test.ts +18 -0
- package/src/utils/isSameDate.ts +9 -0
- package/dist/utils/convertStrapiTime.d.ts +0 -3
- package/src/utils/convertStrapiTime.test.ts +0 -21
- package/src/utils/convertStrapiTime.ts +0 -19
package/package.json
CHANGED
|
@@ -55,6 +55,23 @@ describe('The EventCard component', () => {
|
|
|
55
55
|
expect(normalizedText).toBe('02/12/2024 | 08:30 - 03/12/2024 | 09:30');
|
|
56
56
|
});
|
|
57
57
|
|
|
58
|
+
it('does not display start and end time if allDay property set "true"', () => {
|
|
59
|
+
setup({
|
|
60
|
+
event: {
|
|
61
|
+
...defaultProps.event,
|
|
62
|
+
allDay: true,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const textContent = screen.getByText(
|
|
67
|
+
/02\/12\/2024\s*-\s*03\/12\/2024/i
|
|
68
|
+
).textContent;
|
|
69
|
+
|
|
70
|
+
const normalizedText = textContent?.replace(/\s+/g, ' ').trim();
|
|
71
|
+
|
|
72
|
+
expect(normalizedText).toBe('02/12/2024 - 03/12/2024');
|
|
73
|
+
});
|
|
74
|
+
|
|
58
75
|
it('displays the speakers', async () => {
|
|
59
76
|
setup();
|
|
60
77
|
|
|
@@ -36,7 +36,7 @@ import { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';
|
|
|
36
36
|
import StrapiEvent, { EventType } from '../../models/strapi/StrapiEvent';
|
|
37
37
|
import { IntlContext } from '../ContextProvider';
|
|
38
38
|
import strapiMediaUrl from '../../utils/strapiMediaUrl';
|
|
39
|
-
import
|
|
39
|
+
import isSameDate from '../../utils/isSameDate';
|
|
40
40
|
|
|
41
41
|
export interface EventCardProps {
|
|
42
42
|
event: StrapiEvent;
|
|
@@ -209,22 +209,46 @@ export const EventCard = ({ event }: EventCardProps): JSX.Element => {
|
|
|
209
209
|
color={'var(--boemly-colors-primary-700)'}
|
|
210
210
|
/>
|
|
211
211
|
<Text size={['xsLowBold', null, null, 'smLowBold']}>
|
|
212
|
-
{formatDate(event.
|
|
212
|
+
{formatDate(event.start, {
|
|
213
213
|
year: 'numeric',
|
|
214
214
|
month: '2-digit',
|
|
215
215
|
day: '2-digit',
|
|
216
216
|
})}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
217
|
+
|
|
218
|
+
{!event.allDay &&
|
|
219
|
+
` | ${formatNumber(new Date(event.start).getUTCHours(), {
|
|
220
|
+
minimumIntegerDigits: 2,
|
|
221
|
+
})}:${formatNumber(new Date(event.start).getUTCMinutes(), {
|
|
222
|
+
minimumIntegerDigits: 2,
|
|
223
|
+
})}`}
|
|
224
|
+
|
|
225
|
+
{event.end &&
|
|
226
|
+
!isSameDate(new Date(event.start), new Date(event.end)) && (
|
|
227
|
+
<>
|
|
228
|
+
{' - '}
|
|
229
|
+
{formatDate(event.end, {
|
|
230
|
+
year: 'numeric',
|
|
231
|
+
month: '2-digit',
|
|
232
|
+
day: '2-digit',
|
|
233
|
+
})}
|
|
234
|
+
|
|
235
|
+
{!event.allDay &&
|
|
236
|
+
` | ${formatNumber(new Date(event.end).getUTCHours(), {
|
|
237
|
+
minimumIntegerDigits: 2,
|
|
238
|
+
})}:${formatNumber(new Date(event.end).getUTCMinutes(), {
|
|
239
|
+
minimumIntegerDigits: 2,
|
|
240
|
+
})}`}
|
|
241
|
+
</>
|
|
242
|
+
)}
|
|
243
|
+
|
|
244
|
+
{event.end &&
|
|
245
|
+
!event.allDay &&
|
|
246
|
+
isSameDate(new Date(event.start), new Date(event.end)) &&
|
|
247
|
+
` - ${formatNumber(new Date(event.end).getUTCHours(), {
|
|
248
|
+
minimumIntegerDigits: 2,
|
|
249
|
+
})}:${formatNumber(new Date(event.end).getUTCMinutes(), {
|
|
250
|
+
minimumIntegerDigits: 2,
|
|
251
|
+
})}`}
|
|
228
252
|
</Text>
|
|
229
253
|
</Flex>
|
|
230
254
|
</Flex>
|
|
@@ -41,10 +41,9 @@ interface StrapiEvent {
|
|
|
41
41
|
location?: string;
|
|
42
42
|
locale: Locale;
|
|
43
43
|
online?: boolean;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
endTime?: string;
|
|
44
|
+
start: Date;
|
|
45
|
+
end?: Date;
|
|
46
|
+
allDay?: boolean;
|
|
48
47
|
slices: any[];
|
|
49
48
|
localizations: StrapiLocalization[];
|
|
50
49
|
topBanner?: StrapiTopBanner;
|
|
@@ -19,7 +19,7 @@ const pastEventMock = {
|
|
|
19
19
|
attributes: {
|
|
20
20
|
...strapiEventMock.attributes,
|
|
21
21
|
title: 'Past Event',
|
|
22
|
-
|
|
22
|
+
start: '2024-12-01T10:00:00.000Z',
|
|
23
23
|
eventTypes: [{ id: 1, eventType: EventType.MEET_UP }],
|
|
24
24
|
languages: [{ id: 1, language: 'English', countryCode: 'GB' }],
|
|
25
25
|
},
|
|
@@ -30,7 +30,7 @@ const upcomingEventMock = {
|
|
|
30
30
|
attributes: {
|
|
31
31
|
...strapiEventMock.attributes,
|
|
32
32
|
title: 'Upcoming Event',
|
|
33
|
-
|
|
33
|
+
start: '2024-12-01T10:00:00.000Z',
|
|
34
34
|
eventTypes: [{ id: 1, eventType: EventType.CONFERENCE }],
|
|
35
35
|
languages: [{ id: 1, language: 'German', countryCode: 'DE' }],
|
|
36
36
|
},
|
|
@@ -68,7 +68,7 @@ describe('The Events slice', () => {
|
|
|
68
68
|
const key = getKey(0, null);
|
|
69
69
|
getKeyCalls.push(key.toString());
|
|
70
70
|
|
|
71
|
-
if (getKey.toString().includes('filters[
|
|
71
|
+
if (getKey.toString().includes('filters[start][$gte]')) {
|
|
72
72
|
return {
|
|
73
73
|
data: [{ body: { data: [upcomingEventMock] } }],
|
|
74
74
|
isLoading: false,
|
|
@@ -77,7 +77,7 @@ describe('The Events slice', () => {
|
|
|
77
77
|
loadMore: jest.fn(),
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
|
-
if (getKey.toString().includes('filters[
|
|
80
|
+
if (getKey.toString().includes('filters[start][$lt]')) {
|
|
81
81
|
return {
|
|
82
82
|
data: [{ body: { data: [pastEventMock] } }],
|
|
83
83
|
isLoading: false,
|
|
@@ -149,7 +149,7 @@ describe('The Events slice', () => {
|
|
|
149
149
|
// Use past events for the testing, because the batch for past events is defined as 2 and
|
|
150
150
|
// the "Load button" will be shown when there are more then 2 past events
|
|
151
151
|
(useEvents as jest.Mock).mockImplementation(({ getKey }) => {
|
|
152
|
-
if (getKey.toString().includes('filters[
|
|
152
|
+
if (getKey.toString().includes('filters[start][$lt]')) {
|
|
153
153
|
return {
|
|
154
154
|
data: [
|
|
155
155
|
{
|
|
@@ -243,7 +243,7 @@ describe('The Events slice', () => {
|
|
|
243
243
|
await waitFor(() => {
|
|
244
244
|
expect(getKeyCalls.map(decodeURIComponent)).toEqual(
|
|
245
245
|
expect.arrayContaining([
|
|
246
|
-
expect.stringContaining('filters[
|
|
246
|
+
expect.stringContaining('filters[start][$gte]'),
|
|
247
247
|
expect.stringContaining(
|
|
248
248
|
'filters[$or][0][eventTypes][eventType]=Conference'
|
|
249
249
|
),
|
|
@@ -278,7 +278,7 @@ describe('The Events slice', () => {
|
|
|
278
278
|
await waitFor(() => {
|
|
279
279
|
expect(getKeyCalls.map(decodeURIComponent)).toEqual(
|
|
280
280
|
expect.arrayContaining([
|
|
281
|
-
expect.stringContaining('filters[
|
|
281
|
+
expect.stringContaining('filters[start][$gte]'),
|
|
282
282
|
expect.stringContaining(
|
|
283
283
|
'filters[$or][0][languages][language]=German'
|
|
284
284
|
),
|
|
@@ -303,7 +303,7 @@ describe('The Events slice', () => {
|
|
|
303
303
|
expect(getKeyCalls.map(decodeURIComponent)).toEqual(
|
|
304
304
|
expect.arrayContaining([
|
|
305
305
|
expect.stringContaining(
|
|
306
|
-
`filters[
|
|
306
|
+
`filters[start][$gte]=${NOW.toISOString()}`
|
|
307
307
|
),
|
|
308
308
|
])
|
|
309
309
|
);
|
|
@@ -341,9 +341,7 @@ describe('The Events slice', () => {
|
|
|
341
341
|
await waitFor(() => {
|
|
342
342
|
expect(getKeyCalls.map(decodeURIComponent)).toEqual(
|
|
343
343
|
expect.arrayContaining([
|
|
344
|
-
expect.stringContaining(
|
|
345
|
-
`filters[startDate][$lt]=${NOW.toISOString()}`
|
|
346
|
-
),
|
|
344
|
+
expect.stringContaining(`filters[start][$lt]=${NOW.toISOString()}`),
|
|
347
345
|
])
|
|
348
346
|
);
|
|
349
347
|
});
|
|
@@ -96,9 +96,9 @@ export const Events: React.FC<EventsProps> = ({ slice }: EventsProps) => {
|
|
|
96
96
|
url.searchParams.append('pLevel', STRAPI_DEFAULT_POPULATE_DEPTH);
|
|
97
97
|
|
|
98
98
|
if (sort[0] === Sort.OLDEST_FIRST) {
|
|
99
|
-
url.searchParams.append('sort', '
|
|
99
|
+
url.searchParams.append('sort', 'start:asc');
|
|
100
100
|
} else {
|
|
101
|
-
url.searchParams.append('sort', '
|
|
101
|
+
url.searchParams.append('sort', 'start:desc');
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
if (eventTypeFilter.length) {
|
|
@@ -123,13 +123,12 @@ export const Events: React.FC<EventsProps> = ({ slice }: EventsProps) => {
|
|
|
123
123
|
|
|
124
124
|
const getUpcomingKey: SWRInfiniteKeyLoader = useCallback(
|
|
125
125
|
(index) =>
|
|
126
|
-
buildEventsUrl(index, UPCOMING_BATCH_SIZE, 'filters[
|
|
126
|
+
buildEventsUrl(index, UPCOMING_BATCH_SIZE, 'filters[start][$gte]'),
|
|
127
127
|
[eventTypeFilter, languageFilter, sort]
|
|
128
128
|
);
|
|
129
129
|
|
|
130
130
|
const getPastKey: SWRInfiniteKeyLoader = useCallback(
|
|
131
|
-
(index) =>
|
|
132
|
-
buildEventsUrl(index, PAST_BATCH_SIZE, 'filters[startDate][$lt]'),
|
|
131
|
+
(index) => buildEventsUrl(index, PAST_BATCH_SIZE, 'filters[start][$lt]'),
|
|
133
132
|
[eventTypeFilter, languageFilter, sort]
|
|
134
133
|
);
|
|
135
134
|
|
|
@@ -14,10 +14,9 @@ export const strapiEventMock: IStrapiData<StrapiEvent> = {
|
|
|
14
14
|
logo: { id: 1, alt: 'Logo alt text 1', img: { data: strapiMediaMock } },
|
|
15
15
|
eventTypes: [{ id: 1, eventType: EventType.MEET_UP }],
|
|
16
16
|
languages: [{ id: 1, language: 'English', countryCode: 'GB' }],
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
endTime: '09:30:00.000',
|
|
17
|
+
start: new Date('2024-02-12T08:30:00Z'),
|
|
18
|
+
end: new Date('2024-03-12T09:30:00Z'),
|
|
19
|
+
allDay: false,
|
|
21
20
|
title: 'Event Title',
|
|
22
21
|
description: 'Event Description',
|
|
23
22
|
button: { id: 1, text: 'Button text', url: 'https://tree.ly' },
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import isSameDate from './isSameDate';
|
|
2
|
+
|
|
3
|
+
describe('The getCountryFlag util', () => {
|
|
4
|
+
it('returns flag icon', () => {
|
|
5
|
+
expect(
|
|
6
|
+
isSameDate(
|
|
7
|
+
new Date('2024-02-12T08:30:00Z'),
|
|
8
|
+
new Date('2024-02-12T08:30:00Z')
|
|
9
|
+
)
|
|
10
|
+
).toEqual(true);
|
|
11
|
+
expect(
|
|
12
|
+
isSameDate(
|
|
13
|
+
new Date('2025-02-12T08:30:00Z'),
|
|
14
|
+
new Date('2024-02-10T08:30:00Z')
|
|
15
|
+
)
|
|
16
|
+
).toEqual(false);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -1,21 +0,0 @@
|
|
|
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
|
-
});
|
|
@@ -1,19 +0,0 @@
|
|
|
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;
|