@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.
@@ -0,0 +1,2 @@
1
+ declare const isSameDate: (date1: Date, date2: Date) => boolean;
2
+ export default isSameDate;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@treely/strapi-slices",
3
- "version": "7.6.3",
3
+ "version": "7.7.0",
4
4
  "license": "MIT",
5
5
  "author": "Tree.ly FlexCo",
6
6
  "description": "@treely/strapi-slices is a open source library maintained by Tree.ly.",
@@ -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 convertStrapiTime from '../../utils/convertStrapiTime';
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.startDate, {
212
+ {formatDate(event.start, {
213
213
  year: 'numeric',
214
214
  month: '2-digit',
215
215
  day: '2-digit',
216
216
  })}
217
- {event.startTime &&
218
- ` | ${convertStrapiTime(event.startTime, formatNumber)} `}
219
- {(event.endDate || event.endTime) && ' - '}
220
- {event.endDate &&
221
- formatDate(event.endDate, {
222
- year: 'numeric',
223
- month: '2-digit',
224
- day: '2-digit',
225
- })}
226
- {event.endTime && event.endDate && ' | '}
227
- {event.endTime && convertStrapiTime(event.endTime, formatNumber)}
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
- startDate: Date;
45
- startTime?: string;
46
- endDate?: Date;
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
- startDate: '2024-12-01',
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
- startDate: '2025-02-01',
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[startDate][$gte]')) {
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[startDate][$lt]')) {
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[startDate][$lt]')) {
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[startDate][$gte]'),
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[startDate][$gte]'),
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[startDate][$gte]=${NOW.toISOString()}`
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', 'startDate:asc');
99
+ url.searchParams.append('sort', 'start:asc');
100
100
  } else {
101
- url.searchParams.append('sort', 'startDate:desc');
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[startDate][$gte]'),
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
- 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',
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
+ });
@@ -0,0 +1,9 @@
1
+ const isSameDate = (date1: Date, date2: Date): boolean => {
2
+ return (
3
+ date1.getFullYear() === date2.getFullYear() &&
4
+ date1.getMonth() === date2.getMonth() &&
5
+ date1.getDate() === date2.getDate()
6
+ );
7
+ };
8
+
9
+ export default isSameDate;
@@ -1,3 +0,0 @@
1
- import { FormatNumberOptions } from 'react-intl';
2
- declare const convertStrapiTime: (date: string, formatNumber: (value: number | bigint, opts?: FormatNumberOptions) => string) => string;
3
- export default convertStrapiTime;
@@ -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;