@times-components/ts-components 1.146.2-be27d508c972211ad80599875cd69c63bf67d4b1.45 → 1.146.2-e5795a0ef59e2adb61ba52aeb7332fda4405cb7a.4

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.
Files changed (156) hide show
  1. package/dist/components/opta/football/opta-match-stats/matchday-live/DesktopWidget.d.ts +10 -0
  2. package/dist/components/opta/football/opta-match-stats/matchday-live/DesktopWidget.js +69 -0
  3. package/dist/components/opta/football/opta-match-stats/matchday-live/MobileWidget.d.ts +12 -0
  4. package/dist/components/opta/football/opta-match-stats/matchday-live/MobileWidget.js +90 -0
  5. package/dist/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.d.ts +12 -0
  6. package/dist/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.js +10 -0
  7. package/dist/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.stories.js +24 -0
  8. package/dist/components/opta/football/opta-match-stats/matchday-live/__tests__/MobileWidget.test.js +57 -0
  9. package/dist/components/{carousel-component/__tests__/DefaultPageDot.test.d.ts → opta/football/opta-match-stats/matchday-live/__tests__/OptaMatchStatsMatchdayLive.test.d.ts} +1 -0
  10. package/dist/components/opta/football/opta-match-stats/matchday-live/__tests__/OptaMatchStatsMatchdayLive.test.js +48 -0
  11. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/MatchdayLiveController.d.ts +1 -0
  12. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/MatchdayLiveController.js +19 -0
  13. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/NavigationWrapper.d.ts +12 -0
  14. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/NavigationWrapper.js +67 -0
  15. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/WidgetContainer.d.ts +6 -0
  16. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/WidgetContainer.js +736 -0
  17. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/NavigationWrapper.test.js +33 -0
  18. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/WidgetContainer.test.js +36 -0
  19. package/dist/components/opta/football/opta-match-stats/shared/styles.js +8 -1
  20. package/dist/components/opta/football/opta-match-stats/summary/OptaMatchStatsSummary.js +2 -2
  21. package/dist/components/opta/football/opta-match-stats/summary/OptaMatchStatsSummary.stories.js +1 -1
  22. package/dist/components/opta/football/opta-match-stats/summary/WidgetContainer.js +19 -5
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +2 -2
  25. package/package.json +3 -3
  26. package/rnw.js +1 -1
  27. package/src/components/opta/football/opta-match-stats/commentary/__tests__/__snapshots__/OptaMatchStatsCommentary.test.tsx.snap +1 -1
  28. package/src/components/opta/football/opta-match-stats/matchday-live/DesktopWidget.tsx +108 -0
  29. package/src/components/opta/football/opta-match-stats/matchday-live/MobileWidget.tsx +158 -0
  30. package/src/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.stories.tsx +38 -0
  31. package/src/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.tsx +23 -0
  32. package/src/components/opta/football/opta-match-stats/matchday-live/__tests__/MobileWidget.test.tsx +69 -0
  33. package/src/components/opta/football/opta-match-stats/matchday-live/__tests__/OptaMatchStatsMatchdayLive.test.tsx +61 -0
  34. package/src/components/opta/football/opta-match-stats/matchday-live/__tests__/__snapshots__/OptaMatchStatsMatchdayLive.test.tsx.snap +61 -0
  35. package/src/components/opta/football/opta-match-stats/matchday-live/styles/MatchdayLiveController.tsx +19 -0
  36. package/src/components/opta/football/opta-match-stats/matchday-live/styles/NavigationWrapper.tsx +81 -0
  37. package/src/components/opta/football/opta-match-stats/matchday-live/styles/WidgetContainer.tsx +767 -0
  38. package/src/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/NavigationWrapper.test.tsx +67 -0
  39. package/src/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/WidgetContainer.test.tsx +64 -0
  40. package/src/components/opta/football/opta-match-stats/shared/styles.ts +8 -0
  41. package/src/components/opta/football/opta-match-stats/stats-graphs/__tests__/__snapshots__/OptaMatchStatsGraphs.test.tsx.snap +1 -1
  42. package/src/components/opta/football/opta-match-stats/summary/OptaMatchStatsSummary.stories.tsx +1 -1
  43. package/src/components/opta/football/opta-match-stats/summary/OptaMatchStatsSummary.tsx +1 -1
  44. package/src/components/opta/football/opta-match-stats/summary/WidgetContainer.tsx +18 -4
  45. package/src/components/opta/football/opta-match-stats/summary/__tests__/__snapshots__/OptaMatchStatsSummary.test.tsx.snap +1 -1
  46. package/src/index.ts +3 -2
  47. package/dist/components/carousel-component/CarouselComponent.stories.js +0 -146
  48. package/dist/components/carousel-component/CarouselItem.d.ts +0 -3
  49. package/dist/components/carousel-component/CarouselItem.js +0 -12
  50. package/dist/components/carousel-component/DefaultNavigationArrow.d.ts +0 -8
  51. package/dist/components/carousel-component/DefaultNavigationArrow.js +0 -6
  52. package/dist/components/carousel-component/DefaultPageDot.d.ts +0 -8
  53. package/dist/components/carousel-component/DefaultPageDot.js +0 -4
  54. package/dist/components/carousel-component/__tests__/CarouselComponent.test.js +0 -163
  55. package/dist/components/carousel-component/__tests__/CarouselItem.test.js +0 -80
  56. package/dist/components/carousel-component/__tests__/DefaultNavigationArrow.test.js +0 -62
  57. package/dist/components/carousel-component/__tests__/DefaultPageDot.test.js +0 -68
  58. package/dist/components/carousel-component/hooks/__tests__/useCarousel.test.d.ts +0 -1
  59. package/dist/components/carousel-component/hooks/__tests__/useCarousel.test.js +0 -459
  60. package/dist/components/carousel-component/hooks/useCarousel.d.ts +0 -2
  61. package/dist/components/carousel-component/hooks/useCarousel.js +0 -167
  62. package/dist/components/carousel-component/index.d.ts +0 -4
  63. package/dist/components/carousel-component/index.js +0 -20
  64. package/dist/components/carousel-component/styles.d.ts +0 -28
  65. package/dist/components/carousel-component/styles.js +0 -172
  66. package/dist/components/carousel-component/types.d.ts +0 -53
  67. package/dist/components/carousel-component/types.js +0 -2
  68. package/dist/components/trip-cards/SkeletonCard.d.ts +0 -7
  69. package/dist/components/trip-cards/SkeletonCard.js +0 -22
  70. package/dist/components/trip-cards/TripCard.d.ts +0 -3
  71. package/dist/components/trip-cards/TripCard.js +0 -49
  72. package/dist/components/trip-cards/TripCards.stories.d.ts +0 -1
  73. package/dist/components/trip-cards/TripCards.stories.js +0 -159
  74. package/dist/components/trip-cards/TripCardsLayout.d.ts +0 -3
  75. package/dist/components/trip-cards/TripCardsLayout.js +0 -56
  76. package/dist/components/trip-cards/__tests__/SkeletonCard.test.d.ts +0 -1
  77. package/dist/components/trip-cards/__tests__/SkeletonCard.test.js +0 -139
  78. package/dist/components/trip-cards/__tests__/TripCard.test.d.ts +0 -1
  79. package/dist/components/trip-cards/__tests__/TripCard.test.js +0 -95
  80. package/dist/components/trip-cards/__tests__/TripCardsLayout.test.d.ts +0 -1
  81. package/dist/components/trip-cards/__tests__/TripCardsLayout.test.js +0 -314
  82. package/dist/components/trip-cards/__tests__/assets.test.d.ts +0 -1
  83. package/dist/components/trip-cards/__tests__/assets.test.js +0 -165
  84. package/dist/components/trip-cards/__tests__/helpers.test.d.ts +0 -1
  85. package/dist/components/trip-cards/__tests__/helpers.test.js +0 -220
  86. package/dist/components/trip-cards/__tests__/index.test.d.ts +0 -1
  87. package/dist/components/trip-cards/__tests__/index.test.js +0 -478
  88. package/dist/components/trip-cards/__tests__/mockData.test.d.ts +0 -1
  89. package/dist/components/trip-cards/__tests__/mockData.test.js +0 -57
  90. package/dist/components/trip-cards/__tests__/skeletonStyles.test.d.ts +0 -1
  91. package/dist/components/trip-cards/__tests__/skeletonStyles.test.js +0 -194
  92. package/dist/components/trip-cards/assets/BoatIcon.d.ts +0 -1
  93. package/dist/components/trip-cards/assets/BoatIcon.js +0 -4
  94. package/dist/components/trip-cards/assets/CalendarIcon.d.ts +0 -1
  95. package/dist/components/trip-cards/assets/CalendarIcon.js +0 -4
  96. package/dist/components/trip-cards/assets/ChevronRightIcon.d.ts +0 -1
  97. package/dist/components/trip-cards/assets/ChevronRightIcon.js +0 -4
  98. package/dist/components/trip-cards/assets/LocationIcon.d.ts +0 -1
  99. package/dist/components/trip-cards/assets/LocationIcon.js +0 -4
  100. package/dist/components/trip-cards/assets/MoonIcon.d.ts +0 -1
  101. package/dist/components/trip-cards/assets/MoonIcon.js +0 -4
  102. package/dist/components/trip-cards/assets/index.d.ts +0 -6
  103. package/dist/components/trip-cards/assets/index.js +0 -7
  104. package/dist/components/trip-cards/helpers.d.ts +0 -11
  105. package/dist/components/trip-cards/helpers.js +0 -138
  106. package/dist/components/trip-cards/index.d.ts +0 -4
  107. package/dist/components/trip-cards/index.js +0 -68
  108. package/dist/components/trip-cards/mockData.d.ts +0 -3
  109. package/dist/components/trip-cards/mockData.js +0 -317
  110. package/dist/components/trip-cards/skeletonStyles.d.ts +0 -9
  111. package/dist/components/trip-cards/skeletonStyles.js +0 -37
  112. package/dist/components/trip-cards/styles.d.ts +0 -43
  113. package/dist/components/trip-cards/styles.js +0 -404
  114. package/dist/components/trip-cards/types.d.ts +0 -119
  115. package/dist/components/trip-cards/types.js +0 -2
  116. package/src/components/carousel-component/CarouselComponent.stories.tsx +0 -220
  117. package/src/components/carousel-component/CarouselItem.tsx +0 -26
  118. package/src/components/carousel-component/DefaultNavigationArrow.tsx +0 -37
  119. package/src/components/carousel-component/DefaultPageDot.tsx +0 -20
  120. package/src/components/carousel-component/__tests__/CarouselComponent.test.tsx +0 -259
  121. package/src/components/carousel-component/__tests__/CarouselItem.test.tsx +0 -140
  122. package/src/components/carousel-component/__tests__/DefaultNavigationArrow.test.tsx +0 -153
  123. package/src/components/carousel-component/__tests__/DefaultPageDot.test.tsx +0 -105
  124. package/src/components/carousel-component/hooks/__tests__/useCarousel.test.ts +0 -625
  125. package/src/components/carousel-component/hooks/useCarousel.ts +0 -229
  126. package/src/components/carousel-component/index.tsx +0 -92
  127. package/src/components/carousel-component/styles.ts +0 -188
  128. package/src/components/carousel-component/types.ts +0 -62
  129. package/src/components/trip-cards/SkeletonCard.tsx +0 -64
  130. package/src/components/trip-cards/TripCard.tsx +0 -140
  131. package/src/components/trip-cards/TripCards.stories.tsx +0 -224
  132. package/src/components/trip-cards/TripCardsLayout.tsx +0 -145
  133. package/src/components/trip-cards/__tests__/SkeletonCard.test.tsx +0 -169
  134. package/src/components/trip-cards/__tests__/TripCard.test.tsx +0 -120
  135. package/src/components/trip-cards/__tests__/TripCardsLayout.test.tsx +0 -583
  136. package/src/components/trip-cards/__tests__/assets.test.tsx +0 -206
  137. package/src/components/trip-cards/__tests__/helpers.test.ts +0 -272
  138. package/src/components/trip-cards/__tests__/index.test.tsx +0 -550
  139. package/src/components/trip-cards/__tests__/mockData.test.ts +0 -67
  140. package/src/components/trip-cards/__tests__/skeletonStyles.test.tsx +0 -256
  141. package/src/components/trip-cards/assets/BoatIcon.tsx +0 -17
  142. package/src/components/trip-cards/assets/CalendarIcon.tsx +0 -17
  143. package/src/components/trip-cards/assets/ChevronRightIcon.tsx +0 -20
  144. package/src/components/trip-cards/assets/LocationIcon.tsx +0 -17
  145. package/src/components/trip-cards/assets/MoonIcon.tsx +0 -17
  146. package/src/components/trip-cards/assets/index.ts +0 -7
  147. package/src/components/trip-cards/helpers.ts +0 -176
  148. package/src/components/trip-cards/index.tsx +0 -119
  149. package/src/components/trip-cards/mockData.ts +0 -345
  150. package/src/components/trip-cards/skeletonStyles.ts +0 -46
  151. package/src/components/trip-cards/styles.ts +0 -450
  152. package/src/components/trip-cards/types.ts +0 -128
  153. /package/dist/components/{carousel-component/CarouselComponent.stories.d.ts → opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.stories.d.ts} +0 -0
  154. /package/dist/components/{carousel-component/__tests__/CarouselComponent.test.d.ts → opta/football/opta-match-stats/matchday-live/__tests__/MobileWidget.test.d.ts} +0 -0
  155. /package/dist/components/{carousel-component/__tests__/CarouselItem.test.d.ts → opta/football/opta-match-stats/matchday-live/styles/__tests__/NavigationWrapper.test.d.ts} +0 -0
  156. /package/dist/components/{carousel-component/__tests__/DefaultNavigationArrow.test.d.ts → opta/football/opta-match-stats/matchday-live/styles/__tests__/WidgetContainer.test.d.ts} +0 -0
@@ -3,7 +3,7 @@
3
3
  exports[`OptaMatchStatsCommentary renders and initialises widget 1`] = `
4
4
  <DocumentFragment>
5
5
  <div
6
- class="sc-bxivhb hlADP"
6
+ class="sc-bxivhb eKHCQT"
7
7
  >
8
8
  <h3>
9
9
  Commentary
@@ -0,0 +1,108 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Placeholder } from '@times-components/image';
3
+ import {
4
+ initSettings,
5
+ initStyleSheet,
6
+ initScript,
7
+ initElement,
8
+ initComponent
9
+ } from '../../../utils/config';
10
+ import { PlaceholderContainer } from '../../../shared/shared-styles';
11
+ import { WidgetContainer } from './styles/WidgetContainer';
12
+ import { WidgetWrapper } from '../shared/styles';
13
+ import { TeamColor } from '../shared/types';
14
+
15
+ export const DesktopWidget: React.FC<{
16
+ season: string;
17
+ competition: string;
18
+ match: string;
19
+ isApp?: boolean;
20
+ homeTeamColor?: TeamColor;
21
+ awayTeamColor?: TeamColor;
22
+ }> = React.memo(
23
+ ({
24
+ season,
25
+ competition,
26
+ match,
27
+ isApp = false,
28
+ homeTeamColor = { light: '#000000', dark: '#a19c9cff' },
29
+ awayTeamColor = { light: '#007A3F', dark: '#007A3F' }
30
+ }) => {
31
+ const ref = React.createRef<HTMLDivElement>();
32
+ const [isReady, setIsReady] = useState<boolean>(false);
33
+
34
+ useEffect(() => {
35
+ const sport = 'football';
36
+
37
+ initSettings();
38
+ initStyleSheet(sport);
39
+ initScript()
40
+ .then(() => {
41
+ if (ref.current) {
42
+ ref.current.innerHTML = initElement('opta-widget', {
43
+ sport,
44
+ widget: 'matchday_live',
45
+ season,
46
+ competition,
47
+ match,
48
+ template: 'normal',
49
+ live: true,
50
+ orientation: 'horizontal',
51
+ side: 'both',
52
+ show_match_header: true,
53
+ show_crests: true,
54
+ show_pitch_crests: false,
55
+ show_team_formation: true,
56
+ show_score: false,
57
+ show_halftime_score: false,
58
+ show_competition_name: false,
59
+ show_date: false,
60
+ date_format: 'dddd D MMMM YYYY',
61
+ narrow_date_format: 'DD/MM/YY',
62
+ show_referee: true,
63
+ show_venue: true,
64
+ show_attendance: true,
65
+ show_images: false,
66
+ show_pitch_images: false,
67
+ show_team_sheets: false,
68
+ show_event_icons: true,
69
+ show_player_names: true,
70
+ show_player_stats: true,
71
+ show_subs: 'all',
72
+ competition_naming: 'brief',
73
+ team_naming: 'full',
74
+ player_naming: 'last_name',
75
+ show_live: false,
76
+ show_logo: false,
77
+ show_title: false,
78
+ breakpoints: '400, 700'
79
+ }).outerHTML;
80
+
81
+ initComponent();
82
+ }
83
+ })
84
+ .then(() => {
85
+ setIsReady(true);
86
+ });
87
+ }, []);
88
+
89
+ return (
90
+ <>
91
+ <WidgetWrapper isApp={isApp} className="matchday-live-widget-desktop">
92
+ <h3>Line-ups</h3>
93
+ <WidgetContainer
94
+ ref={ref}
95
+ isApp={isApp}
96
+ homeTeamColor={homeTeamColor}
97
+ awayTeamColor={awayTeamColor}
98
+ />
99
+ </WidgetWrapper>
100
+ {!isReady && (
101
+ <PlaceholderContainer data-testid="placeholder">
102
+ <Placeholder />
103
+ </PlaceholderContainer>
104
+ )}
105
+ </>
106
+ );
107
+ }
108
+ );
@@ -0,0 +1,158 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { Placeholder } from '@times-components/image';
3
+ import {
4
+ initSettings,
5
+ initStyleSheet,
6
+ initScript,
7
+ initElement,
8
+ initComponent
9
+ } from '../../../utils/config';
10
+ import { PlaceholderContainer } from '../../../shared/shared-styles';
11
+ import { TeamColor } from '../shared/types';
12
+ import { NavigationWrapper } from './styles/NavigationWrapper';
13
+ import { WidgetContainer } from './styles/WidgetContainer';
14
+
15
+ const widgetOptions = {
16
+ widget: 'matchday_live',
17
+ template: 'normal',
18
+ live: true,
19
+ orientation: 'vertical',
20
+ show_match_header: true,
21
+ show_crests: false,
22
+ show_pitch_crests: false,
23
+ show_team_formation: true,
24
+ show_score: false,
25
+ show_halftime_score: false,
26
+ show_competition_name: false,
27
+ show_date: false,
28
+ date_format: 'dddd D MMMM YYYY',
29
+ narrow_date_format: 'DD/MM/YY',
30
+ show_referee: true,
31
+ show_venue: false,
32
+ show_attendance: false,
33
+ show_images: false,
34
+ show_pitch_images: false,
35
+ show_team_sheets: false,
36
+ show_event_icons: true,
37
+ show_player_names: true,
38
+ show_player_stats: true,
39
+ show_subs: 'all',
40
+ competition_naming: 'brief',
41
+ team_naming: 'full',
42
+ player_naming: 'last_name',
43
+ show_live: false,
44
+ show_logo: false,
45
+ show_title: false
46
+ };
47
+
48
+ export const MobileWidget: React.FC<{
49
+ season: string;
50
+ competition: string;
51
+ match: string;
52
+ isApp?: boolean;
53
+ homeTeamColor?: TeamColor;
54
+ awayTeamColor?: TeamColor;
55
+ homeTeamName: string;
56
+ awayTeamName: string;
57
+ }> = React.memo(
58
+ ({
59
+ season,
60
+ competition,
61
+ match,
62
+ isApp = false,
63
+ homeTeamColor = { light: '#000000', dark: '#a19c9cff' },
64
+ awayTeamColor = { light: '#007A3F', dark: '#007A3F' },
65
+ homeTeamName,
66
+ awayTeamName
67
+ }) => {
68
+ const homeRef = React.createRef<HTMLDivElement>();
69
+ const awayRef = React.createRef<HTMLDivElement>();
70
+ const [isReady, setIsReady] = useState(false);
71
+ const [activeTeam, setActiveTeam] = useState<'home' | 'away'>('home');
72
+
73
+ useEffect(() => {
74
+ const sport = 'football';
75
+
76
+ initSettings();
77
+ initStyleSheet(sport);
78
+ initScript()
79
+ .then(() => {
80
+ if (homeRef.current) {
81
+ homeRef.current.innerHTML = initElement('opta-widget', {
82
+ ...widgetOptions,
83
+ sport,
84
+ season,
85
+ competition,
86
+ match,
87
+ side: 'home'
88
+ }).outerHTML;
89
+ initComponent();
90
+ }
91
+ })
92
+ .then(() => {
93
+ if (awayRef.current) {
94
+ awayRef.current.innerHTML = initElement('opta-widget', {
95
+ ...widgetOptions,
96
+ sport,
97
+ season,
98
+ competition,
99
+ match,
100
+ side: 'away'
101
+ }).outerHTML;
102
+ initComponent();
103
+ }
104
+ })
105
+ .finally(() => {
106
+ setIsReady(true);
107
+ });
108
+ }, []);
109
+
110
+ return (
111
+ <>
112
+ <div className="matchday-live-widget-mobile">
113
+ <NavigationWrapper
114
+ data-testid="mobile-navigation-wrapper"
115
+ activeTeam={activeTeam}
116
+ homeTeamColor={homeTeamColor}
117
+ awayTeamColor={awayTeamColor}
118
+ isApp={isApp}
119
+ >
120
+ <div className="navigation-buttons">
121
+ <button
122
+ className={activeTeam === 'home' ? 'active home' : 'home'}
123
+ onClick={() => setActiveTeam('home')}
124
+ >
125
+ {homeTeamName}
126
+ </button>
127
+ <button
128
+ className={activeTeam === 'away' ? 'active away' : 'away'}
129
+ onClick={() => setActiveTeam('away')}
130
+ >
131
+ {awayTeamName}
132
+ </button>
133
+ </div>
134
+ <WidgetContainer
135
+ className="home-widget-container"
136
+ ref={homeRef}
137
+ isApp={isApp}
138
+ homeTeamColor={homeTeamColor}
139
+ awayTeamColor={awayTeamColor}
140
+ />
141
+ <WidgetContainer
142
+ className="away-widget-container"
143
+ ref={awayRef}
144
+ isApp={isApp}
145
+ homeTeamColor={homeTeamColor}
146
+ awayTeamColor={awayTeamColor}
147
+ />
148
+ {!isReady && (
149
+ <PlaceholderContainer data-testid="placeholder">
150
+ <Placeholder />
151
+ </PlaceholderContainer>
152
+ )}
153
+ </NavigationWrapper>
154
+ </div>
155
+ </>
156
+ );
157
+ }
158
+ );
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { showcaseConverter } from '@times-components/storybook';
3
+
4
+ import { ArticleHarness } from '../../../../../fixtures/article-harness/ArticleHarness';
5
+ import { OptaMatchStatsMatchdayLive } from './OptaMatchStatsMatchdayLive';
6
+
7
+ const showcase = {
8
+ children: [
9
+ {
10
+ decorator: (storyFn: () => React.ReactNode) => (
11
+ <ArticleHarness>{storyFn()}</ArticleHarness>
12
+ ),
13
+ type: 'decorator'
14
+ },
15
+ {
16
+ component: () => {
17
+ return (
18
+ <>
19
+ <OptaMatchStatsMatchdayLive
20
+ season="2025"
21
+ competition="8"
22
+ match="2562026"
23
+ homeTeamName="Arsenal"
24
+ awayTeamName="Brentford"
25
+ />
26
+ </>
27
+ );
28
+ },
29
+ name: 'Summary',
30
+ type: 'story'
31
+ }
32
+ ],
33
+ name:
34
+ 'Typescript Component/Opta Match Stats/Football/Match Stats Matchday Live'
35
+ };
36
+
37
+ // @ts-ignore
38
+ showcaseConverter(module, showcase);
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { TeamColor } from '../shared/types';
3
+ import { DesktopWidget } from './DesktopWidget';
4
+ import { MobileWidget } from './MobileWidget';
5
+ import { MatchdayLiveController } from './styles/MatchdayLiveController';
6
+
7
+ export const OptaMatchStatsMatchdayLive: React.FC<{
8
+ season: string;
9
+ competition: string;
10
+ match: string;
11
+ isApp?: boolean;
12
+ homeTeamColor?: TeamColor;
13
+ awayTeamColor?: TeamColor;
14
+ homeTeamName: string;
15
+ awayTeamName: string;
16
+ }> = React.memo(props => {
17
+ return (
18
+ <MatchdayLiveController>
19
+ <DesktopWidget {...props} />
20
+ <MobileWidget {...props} />
21
+ </MatchdayLiveController>
22
+ );
23
+ });
@@ -0,0 +1,69 @@
1
+ import React from 'react';
2
+ import { render, screen, fireEvent, act } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
4
+
5
+ jest.mock('@times-components/image', () => ({
6
+ Placeholder: () => <>Placeholder</>
7
+ }));
8
+
9
+ const mockInitSettings = jest.fn();
10
+ const mockInitStyleSheet = jest.fn();
11
+ const mockInitComponent = jest.fn();
12
+
13
+ const mockInitElement = () => {
14
+ const element = document.createElement('div');
15
+ element.appendChild(document.createTextNode('Widget'));
16
+ return element;
17
+ };
18
+
19
+ jest.mock('../../../../utils/config', () => ({
20
+ initSettings: mockInitSettings,
21
+ initStyleSheet: mockInitStyleSheet,
22
+ initScript: () => Promise.resolve({}),
23
+ initElement: mockInitElement,
24
+ initComponent: mockInitComponent
25
+ }));
26
+
27
+ import { MobileWidget } from '../MobileWidget';
28
+
29
+ const requiredProps = {
30
+ season: '2020',
31
+ competition: '3',
32
+ match: '2041900',
33
+ homeTeamName: 'Liverpool',
34
+ awayTeamName: 'Manchester City'
35
+ };
36
+
37
+ describe('MobileWidget navigation buttons state', () => {
38
+ beforeEach(() => {
39
+ jest.clearAllMocks();
40
+ });
41
+
42
+ it('renders with home active and toggles to away on click', async () => {
43
+ render(<MobileWidget {...requiredProps} />);
44
+
45
+ const homeBtn = screen.getByRole('button', { name: 'Liverpool' });
46
+ const awayBtn = screen.getByRole('button', { name: 'Manchester City' });
47
+ expect(homeBtn).toHaveClass('home');
48
+ expect(homeBtn).toHaveClass('active');
49
+ expect(awayBtn).toHaveClass('away');
50
+ expect(awayBtn).not.toHaveClass('active');
51
+
52
+ fireEvent.click(awayBtn);
53
+ expect(awayBtn).toHaveClass('active');
54
+ expect(homeBtn).not.toHaveClass('active');
55
+
56
+ expect(homeBtn).toHaveClass('home');
57
+
58
+ await act(async () => {
59
+ await Promise.resolve();
60
+ });
61
+ // Placeholder may still be present during async; assert wrapper exists
62
+ expect(screen.getByTestId('mobile-navigation-wrapper')).toBeInTheDocument();
63
+
64
+ fireEvent.click(homeBtn);
65
+ expect(homeBtn).toHaveClass('active');
66
+ expect(awayBtn).not.toHaveClass('active');
67
+ expect(awayBtn).toHaveClass('away');
68
+ });
69
+ });
@@ -0,0 +1,61 @@
1
+ import React from 'react';
2
+ import { render, act } from '@testing-library/react';
3
+
4
+ import 'regenerator-runtime';
5
+ import '@testing-library/jest-dom';
6
+
7
+ jest.mock('@times-components/image', () => ({
8
+ Placeholder: () => <>Placeholder</>
9
+ }));
10
+
11
+ const mockInitSettings = jest.fn();
12
+ const mockInitStyleSheet = jest.fn();
13
+ const mockInitComponent = jest.fn();
14
+ const mockHasMatchEvents = jest.fn();
15
+
16
+ const mockInitElement = () => {
17
+ const element = document.createElement('div');
18
+ element.appendChild(document.createTextNode('Widget'));
19
+ return element;
20
+ };
21
+
22
+ jest.mock('../../../../utils/config', () => ({
23
+ initSettings: mockInitSettings,
24
+ initStyleSheet: mockInitStyleSheet,
25
+ initScript: () => new Promise(resolve => resolve({})),
26
+ initElement: mockInitElement,
27
+ initComponent: mockInitComponent
28
+ }));
29
+
30
+ import { OptaMatchStatsMatchdayLive } from '../OptaMatchStatsMatchdayLive';
31
+
32
+ const requiredProps = {
33
+ season: '2020',
34
+ competition: '3',
35
+ match: '2041900',
36
+ homeTeamName: 'Liverpool',
37
+ awayTeamName: 'Manchester City'
38
+ };
39
+
40
+ describe('OptaMatchStatsMatchdayLive', () => {
41
+ beforeEach(() => {
42
+ jest.clearAllMocks();
43
+ });
44
+
45
+ it('should render correctly', async () => {
46
+ const { asFragment } = render(
47
+ <OptaMatchStatsMatchdayLive {...requiredProps} />
48
+ );
49
+
50
+ act(() => {
51
+ mockInitComponent();
52
+ mockHasMatchEvents();
53
+ });
54
+
55
+ expect(mockInitSettings).toHaveBeenCalledTimes(2);
56
+ expect(mockInitStyleSheet).toHaveBeenCalledTimes(2);
57
+ expect(mockInitComponent).toHaveBeenCalledTimes(1);
58
+
59
+ expect(asFragment()).toMatchSnapshot();
60
+ });
61
+ });
@@ -0,0 +1,61 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`OptaMatchStatsMatchdayLive should render correctly 1`] = `
4
+ <DocumentFragment>
5
+ <div
6
+ class="sc-bZQynM inSDsQ"
7
+ >
8
+ <div
9
+ class="matchday-live-widget-desktop sc-bxivhb iQCzHr"
10
+ >
11
+ <h3>
12
+ Line-ups
13
+ </h3>
14
+ <div
15
+ class="sc-ifAKCX hMIqhj"
16
+ />
17
+ </div>
18
+ <div
19
+ class="sc-bwzfXH eSqyJ"
20
+ data-testid="placeholder"
21
+ >
22
+ Placeholder
23
+ </div>
24
+ <div
25
+ class="matchday-live-widget-mobile"
26
+ >
27
+ <div
28
+ class="sc-EHOje fBqPPh"
29
+ data-testid="mobile-navigation-wrapper"
30
+ >
31
+ <div
32
+ class="navigation-buttons"
33
+ >
34
+ <button
35
+ class="active home"
36
+ >
37
+ Liverpool
38
+ </button>
39
+ <button
40
+ class="away"
41
+ >
42
+ Manchester City
43
+ </button>
44
+ </div>
45
+ <div
46
+ class="home-widget-container sc-ifAKCX hMIqhj"
47
+ />
48
+ <div
49
+ class="away-widget-container sc-ifAKCX hMIqhj"
50
+ />
51
+ <div
52
+ class="sc-bwzfXH eSqyJ"
53
+ data-testid="placeholder"
54
+ >
55
+ Placeholder
56
+ </div>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </DocumentFragment>
61
+ `;
@@ -0,0 +1,19 @@
1
+ import styled from 'styled-components';
2
+ import { breakpoints } from '@times-components/ts-styleguide';
3
+
4
+ export const MatchdayLiveController = styled.div`
5
+ .matchday-live-widget-mobile {
6
+ display: block;
7
+ }
8
+ .matchday-live-widget-desktop {
9
+ display: none;
10
+ }
11
+ @media (min-width: ${breakpoints.medium}px) {
12
+ .matchday-live-widget-mobile {
13
+ display: none;
14
+ }
15
+ .matchday-live-widget-desktop {
16
+ display: block;
17
+ }
18
+ }
19
+ `;
@@ -0,0 +1,81 @@
1
+ import styled from 'styled-components';
2
+ import {
3
+ backgroundColor,
4
+ darkBackgroundColor,
5
+ darkTextColor,
6
+ textColor
7
+ } from '../../shared/styles';
8
+
9
+ export const NavigationWrapper = styled.div<{
10
+ homeTeamColor: { light: string; dark: string };
11
+ awayTeamColor: { light: string; dark: string };
12
+ activeTeam: 'home' | 'away';
13
+ isApp: boolean;
14
+ }>`
15
+ background-color: ${backgroundColor};
16
+ ${props =>
17
+ props.isApp &&
18
+ `
19
+ @media (prefers-color-scheme: dark) {
20
+ background-color: ${darkBackgroundColor};
21
+ }
22
+ `} .navigation-buttons {
23
+ display: grid;
24
+ grid-template-columns: 1fr 1fr;
25
+ button {
26
+ -webkit-tap-highlight-color: transparent;
27
+ background: none;
28
+ border: none;
29
+ font-family: Roboto, sans-serif;
30
+ font-size: 16px;
31
+ font-weight: 500;
32
+ line-height: 150%;
33
+ padding: 16px 8px;
34
+ cursor: pointer;
35
+ border-bottom: 2px solid ${backgroundColor};
36
+ color: ${textColor};
37
+
38
+ &.active {
39
+ &.home {
40
+ border-bottom: 2px solid ${props => props.homeTeamColor.light};
41
+ color: ${props => props.homeTeamColor.light};
42
+ }
43
+ &.away {
44
+ border-bottom: 2px solid ${props => props.awayTeamColor.light};
45
+ color: ${props => props.awayTeamColor.light};
46
+ }
47
+ }
48
+
49
+ ${props =>
50
+ props.isApp &&
51
+ `
52
+ @media (prefers-color-scheme: dark) {
53
+ border-bottom: 2px solid ${darkBackgroundColor};
54
+ color: ${darkTextColor};
55
+ &.active {
56
+ &.home {
57
+ border-bottom: 2px solid ${props.homeTeamColor.dark};
58
+ color: ${props.homeTeamColor.dark};
59
+ }
60
+ &.away {
61
+ border-bottom: 2px solid ${props.awayTeamColor.dark};
62
+ color: ${props.awayTeamColor.dark};
63
+ }
64
+ }
65
+ }
66
+ `};
67
+ }
68
+ }
69
+
70
+ .home-widget-container {
71
+ visibility: ${props =>
72
+ props.activeTeam === 'home' ? 'visible' : 'hidden'};
73
+ height: ${props => (props.activeTeam === 'home' ? 'auto' : '0')};
74
+ }
75
+
76
+ .away-widget-container {
77
+ visibility: ${props =>
78
+ props.activeTeam === 'away' ? 'visible' : 'hidden'};
79
+ height: ${props => (props.activeTeam === 'away' ? 'auto' : '0')};
80
+ }
81
+ `;