be-components 7.1.2 → 7.1.5

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 (113) hide show
  1. package/lib/commonjs/FlashMarket/components/ManageFlashMarket.js +1 -1
  2. package/lib/commonjs/FlashMarket/components/ManageFlashMarket.js.map +1 -1
  3. package/lib/commonjs/FlashMarket/index.js +1 -1
  4. package/lib/commonjs/FlashMarket/index.js.map +1 -1
  5. package/lib/commonjs/PartnerPortal/api/index.js +373 -0
  6. package/lib/commonjs/PartnerPortal/api/index.js.map +1 -0
  7. package/lib/commonjs/PartnerPortal/components/CompetitionSelector.js +120 -0
  8. package/lib/commonjs/PartnerPortal/components/CompetitionSelector.js.map +1 -0
  9. package/lib/commonjs/PartnerPortal/components/EmbedManager.js +639 -0
  10. package/lib/commonjs/PartnerPortal/components/EmbedManager.js.map +1 -0
  11. package/lib/commonjs/PartnerPortal/components/FlashSelector.js +120 -0
  12. package/lib/commonjs/PartnerPortal/components/FlashSelector.js.map +1 -0
  13. package/lib/commonjs/PartnerPortal/components/LeagueSelector.js +113 -0
  14. package/lib/commonjs/PartnerPortal/components/LeagueSelector.js.map +1 -0
  15. package/lib/commonjs/PartnerPortal/components/ReferralSelector.js +101 -0
  16. package/lib/commonjs/PartnerPortal/components/ReferralSelector.js.map +1 -0
  17. package/lib/commonjs/PartnerPortal/components/SquaresSelector.js +120 -0
  18. package/lib/commonjs/PartnerPortal/components/SquaresSelector.js.map +1 -0
  19. package/lib/commonjs/PartnerPortal/index.js +853 -0
  20. package/lib/commonjs/PartnerPortal/index.js.map +1 -0
  21. package/lib/commonjs/index.js +14 -0
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/types.d.js.map +1 -1
  24. package/lib/module/FlashMarket/components/ManageFlashMarket.js +1 -1
  25. package/lib/module/FlashMarket/components/ManageFlashMarket.js.map +1 -1
  26. package/lib/module/FlashMarket/index.js +1 -1
  27. package/lib/module/FlashMarket/index.js.map +1 -1
  28. package/lib/module/PartnerPortal/api/index.js +367 -0
  29. package/lib/module/PartnerPortal/api/index.js.map +1 -0
  30. package/lib/module/PartnerPortal/components/CompetitionSelector.js +112 -0
  31. package/lib/module/PartnerPortal/components/CompetitionSelector.js.map +1 -0
  32. package/lib/module/PartnerPortal/components/EmbedManager.js +631 -0
  33. package/lib/module/PartnerPortal/components/EmbedManager.js.map +1 -0
  34. package/lib/module/PartnerPortal/components/FlashSelector.js +112 -0
  35. package/lib/module/PartnerPortal/components/FlashSelector.js.map +1 -0
  36. package/lib/module/PartnerPortal/components/LeagueSelector.js +106 -0
  37. package/lib/module/PartnerPortal/components/LeagueSelector.js.map +1 -0
  38. package/lib/module/PartnerPortal/components/ReferralSelector.js +93 -0
  39. package/lib/module/PartnerPortal/components/ReferralSelector.js.map +1 -0
  40. package/lib/module/PartnerPortal/components/SquaresSelector.js +112 -0
  41. package/lib/module/PartnerPortal/components/SquaresSelector.js.map +1 -0
  42. package/lib/module/PartnerPortal/index.js +845 -0
  43. package/lib/module/PartnerPortal/index.js.map +1 -0
  44. package/lib/module/index.js +3 -1
  45. package/lib/module/index.js.map +1 -1
  46. package/lib/module/types.d.js.map +1 -1
  47. package/lib/typescript/lib/commonjs/PartnerPortal/api/index.d.ts +47 -0
  48. package/lib/typescript/lib/commonjs/PartnerPortal/api/index.d.ts.map +1 -0
  49. package/lib/typescript/lib/commonjs/PartnerPortal/components/CompetitionSelector.d.ts +9 -0
  50. package/lib/typescript/lib/commonjs/PartnerPortal/components/CompetitionSelector.d.ts.map +1 -0
  51. package/lib/typescript/lib/commonjs/PartnerPortal/components/EmbedManager.d.ts +13 -0
  52. package/lib/typescript/lib/commonjs/PartnerPortal/components/EmbedManager.d.ts.map +1 -0
  53. package/lib/typescript/lib/commonjs/PartnerPortal/components/FlashSelector.d.ts +9 -0
  54. package/lib/typescript/lib/commonjs/PartnerPortal/components/FlashSelector.d.ts.map +1 -0
  55. package/lib/typescript/lib/commonjs/PartnerPortal/components/LeagueSelector.d.ts +7 -0
  56. package/lib/typescript/lib/commonjs/PartnerPortal/components/LeagueSelector.d.ts.map +1 -0
  57. package/lib/typescript/lib/commonjs/PartnerPortal/components/ReferralSelector.d.ts +9 -0
  58. package/lib/typescript/lib/commonjs/PartnerPortal/components/ReferralSelector.d.ts.map +1 -0
  59. package/lib/typescript/lib/commonjs/PartnerPortal/components/SquaresSelector.d.ts +9 -0
  60. package/lib/typescript/lib/commonjs/PartnerPortal/components/SquaresSelector.d.ts.map +1 -0
  61. package/lib/typescript/lib/commonjs/PartnerPortal/index.d.ts +12 -0
  62. package/lib/typescript/lib/commonjs/PartnerPortal/index.d.ts.map +1 -0
  63. package/lib/typescript/lib/commonjs/index.d.ts +2 -0
  64. package/lib/typescript/lib/commonjs/index.d.ts.map +1 -1
  65. package/lib/typescript/lib/module/PartnerPortal/api/index.d.ts +46 -0
  66. package/lib/typescript/lib/module/PartnerPortal/api/index.d.ts.map +1 -0
  67. package/lib/typescript/lib/module/PartnerPortal/components/CompetitionSelector.d.ts +9 -0
  68. package/lib/typescript/lib/module/PartnerPortal/components/CompetitionSelector.d.ts.map +1 -0
  69. package/lib/typescript/lib/module/PartnerPortal/components/EmbedManager.d.ts +13 -0
  70. package/lib/typescript/lib/module/PartnerPortal/components/EmbedManager.d.ts.map +1 -0
  71. package/lib/typescript/lib/module/PartnerPortal/components/FlashSelector.d.ts +9 -0
  72. package/lib/typescript/lib/module/PartnerPortal/components/FlashSelector.d.ts.map +1 -0
  73. package/lib/typescript/lib/module/PartnerPortal/components/LeagueSelector.d.ts +7 -0
  74. package/lib/typescript/lib/module/PartnerPortal/components/LeagueSelector.d.ts.map +1 -0
  75. package/lib/typescript/lib/module/PartnerPortal/components/ReferralSelector.d.ts +9 -0
  76. package/lib/typescript/lib/module/PartnerPortal/components/ReferralSelector.d.ts.map +1 -0
  77. package/lib/typescript/lib/module/PartnerPortal/components/SquaresSelector.d.ts +9 -0
  78. package/lib/typescript/lib/module/PartnerPortal/components/SquaresSelector.d.ts.map +1 -0
  79. package/lib/typescript/lib/module/PartnerPortal/index.d.ts +12 -0
  80. package/lib/typescript/lib/module/PartnerPortal/index.d.ts.map +1 -0
  81. package/lib/typescript/lib/module/index.d.ts +3 -1
  82. package/lib/typescript/lib/module/index.d.ts.map +1 -1
  83. package/lib/typescript/src/PartnerPortal/api/index.d.ts +75 -0
  84. package/lib/typescript/src/PartnerPortal/api/index.d.ts.map +1 -0
  85. package/lib/typescript/src/PartnerPortal/components/CompetitionSelector.d.ts +11 -0
  86. package/lib/typescript/src/PartnerPortal/components/CompetitionSelector.d.ts.map +1 -0
  87. package/lib/typescript/src/PartnerPortal/components/EmbedManager.d.ts +16 -0
  88. package/lib/typescript/src/PartnerPortal/components/EmbedManager.d.ts.map +1 -0
  89. package/lib/typescript/src/PartnerPortal/components/FlashSelector.d.ts +11 -0
  90. package/lib/typescript/src/PartnerPortal/components/FlashSelector.d.ts.map +1 -0
  91. package/lib/typescript/src/PartnerPortal/components/LeagueSelector.d.ts +9 -0
  92. package/lib/typescript/src/PartnerPortal/components/LeagueSelector.d.ts.map +1 -0
  93. package/lib/typescript/src/PartnerPortal/components/ReferralSelector.d.ts +11 -0
  94. package/lib/typescript/src/PartnerPortal/components/ReferralSelector.d.ts.map +1 -0
  95. package/lib/typescript/src/PartnerPortal/components/SquaresSelector.d.ts +11 -0
  96. package/lib/typescript/src/PartnerPortal/components/SquaresSelector.d.ts.map +1 -0
  97. package/lib/typescript/src/PartnerPortal/index.d.ts +14 -0
  98. package/lib/typescript/src/PartnerPortal/index.d.ts.map +1 -0
  99. package/lib/typescript/src/index.d.ts +3 -1
  100. package/lib/typescript/src/index.d.ts.map +1 -1
  101. package/package.json +1 -1
  102. package/src/FlashMarket/components/ManageFlashMarket.tsx +1 -1
  103. package/src/FlashMarket/index.tsx +1 -1
  104. package/src/PartnerPortal/api/index.ts +314 -0
  105. package/src/PartnerPortal/components/CompetitionSelector.tsx +88 -0
  106. package/src/PartnerPortal/components/EmbedManager.tsx +364 -0
  107. package/src/PartnerPortal/components/FlashSelector.tsx +88 -0
  108. package/src/PartnerPortal/components/LeagueSelector.tsx +76 -0
  109. package/src/PartnerPortal/components/ReferralSelector.tsx +63 -0
  110. package/src/PartnerPortal/components/SquaresSelector.tsx +88 -0
  111. package/src/PartnerPortal/index.tsx +474 -0
  112. package/src/index.tsx +5 -0
  113. package/src/types.d.ts +29 -0
@@ -0,0 +1,364 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { Button, Text, TextInput, View } from "../../Components/Themed"
3
+ import type { CompanyEmbedProps, CompanyProps, EmbedPropertyProps, EmbedProps, FocusPositionProps, MyPlayerProps, PlayerReferralProps, PromoProps } from '../../types';
4
+ import { PartnerPortalApi } from '../api';
5
+ import { ActivityIndicator, FlatList, ImageBackground, type ViewStyle } from 'react-native';
6
+ import { useColors } from '../../constants/useColors';
7
+ import ReferralSelector from './ReferralSelector';
8
+ import LeagueSelector from './LeagueSelector';
9
+ import { Toggle } from '../../Components';
10
+ import * as Clipboard from 'expo-clipboard';
11
+ import CompetitionSelector from './CompetitionSelector';
12
+ import SquaresSelector from './SquaresSelector';
13
+ import FlashSelector from './FlashSelector';
14
+
15
+ type EmbedManagerProps = {
16
+ company_embed_id:string,
17
+ me:MyPlayerProps,
18
+ float?:boolean,
19
+ onFocusPosition?:(pos:FocusPositionProps) => void,
20
+ header_style?:ViewStyle,
21
+ footer_style?:ViewStyle,
22
+ company_id:string,
23
+ onClose: () => void
24
+ }
25
+ const sections = ['header','embed','toggle','loading','name','properties','identifer','code']
26
+ const EmbedManager = ({ float, me, company_id, company_embed_id, onFocusPosition, onClose, header_style, footer_style }:EmbedManagerProps) => {
27
+ const Colors = useColors();
28
+ const [ size, setSize ] = useState({ height:0, width:0 });
29
+ const [ active_toggle, setActiveToggle ] = useState('properties');
30
+ const [ action_loading, setActionLoading ] = useState(false);
31
+ const [ embed_data, setEmbedData ] = useState<{
32
+ loading:boolean,
33
+ company_embed?:CompanyEmbedProps,
34
+ draft_company_embed?:CompanyEmbedProps,
35
+ player_referrals:PlayerReferralProps[],
36
+ promos:PromoProps[],
37
+ company?:CompanyProps,
38
+ embed?:EmbedProps,
39
+ embed_properties:EmbedPropertyProps[]
40
+ }>({
41
+ loading:false,
42
+ embed_properties: [],
43
+ promos:[],
44
+ player_referrals: []
45
+ });
46
+ const { loading, promos, player_referrals, embed, company_embed, embed_properties, draft_company_embed } = embed_data;
47
+
48
+ useEffect(() => {
49
+ PartnerPortalApi.setEnvironment();
50
+ getEmbedData(company_embed_id);
51
+ },[company_embed_id, me.player_id]);
52
+
53
+ const getEmbedData = async(id:string) => {
54
+ setEmbedData({ ...embed_data, loading:true });
55
+ const s_resp = await PartnerPortalApi.CompanyEmbedApi.getCompanyEmbedById(id);
56
+ if(!s_resp){ setEmbedData({ ...embed_data, loading:false }); return }
57
+ const s_comp = await PartnerPortalApi.CompanyApi.getCompanyById(company_id);
58
+ const s_refer = await PartnerPortalApi.CompanyApi.getReferralCodesByCompanyId(company_id);
59
+ setEmbedData({
60
+ ...embed_data,
61
+ embed: s_resp.embed,
62
+ embed_properties: s_resp.embed_properties,
63
+ company_embed: s_resp.company_embed,
64
+ player_referrals: s_refer.player_referrals,
65
+ promos: s_refer.promos,
66
+ company: s_comp?.company,
67
+ draft_company_embed: s_resp.company_embed,
68
+ loading: false
69
+ });
70
+ }
71
+
72
+ const handleSave = async(de:CompanyEmbedProps) => {
73
+ setActionLoading(true);
74
+ const new_embed = await PartnerPortalApi.CompanyEmbedApi.updateCompanyEmbed(de);
75
+ if(!new_embed){ setActionLoading(false); return alert('Unable to update at this time. Please try again later') }
76
+ setEmbedData({
77
+ ...embed_data,
78
+ company_embed: new_embed,
79
+ draft_company_embed: new_embed
80
+ })
81
+ setActionLoading(false);
82
+ }
83
+
84
+ const renderProperties = (data:{ item:EmbedPropertyProps, index:number }) => {
85
+ if(!company_embed || !draft_company_embed){ return <></> }
86
+ const value:string | undefined = draft_company_embed.properties[data.item.property]
87
+ switch(data.item.component){
88
+ case 'text_input':
89
+ return (
90
+ <View transparent style={{ borderBottomWidth:1, borderColor:Colors.borders.light, padding:10 }}>
91
+ <View transparent>
92
+ <Text theme='h1'>{data.item.label}</Text>
93
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.description}</Text>
94
+ </View>
95
+ <TextInput
96
+ value={value}
97
+ onFocusPosition={onFocusPosition}
98
+ placeholder={data.item.property}
99
+ style={{ marginTop:10 }}
100
+ onChangeText={(text) => setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, properties: { ...draft_company_embed.properties, [data.item.property]: text } } })}
101
+ />
102
+ </View>
103
+ )
104
+ case 'refer_selector':
105
+ const selected_referral = player_referrals.find(pr => pr.referral_code == value);
106
+ return (
107
+ <View transparent style={{ borderBottomWidth:1, borderColor:Colors.borders.light, padding:10 }}>
108
+ <View transparent>
109
+ <Text theme='h1'>{data.item.label}</Text>
110
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.description}</Text>
111
+ </View>
112
+ <View transparent style={{ marginTop:10 }}>
113
+ <ReferralSelector
114
+ promos={promos}
115
+ player_referrals={player_referrals}
116
+ active_referral={selected_referral}
117
+ onSelectReferral={(pr) => setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, properties: { ...draft_company_embed.properties, [data.item.property]: pr?.referral_code } } })}
118
+ />
119
+ </View>
120
+ </View>
121
+ )
122
+ case 'league_selector':
123
+ return (
124
+ <View transparent style={{ borderBottomWidth:1, borderColor:Colors.borders.light, padding:10 }}>
125
+ <View transparent>
126
+ <Text theme='h1'>{data.item.label}</Text>
127
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.description}</Text>
128
+ </View>
129
+ <View transparent style={{ marginTop:10 }}>
130
+ <LeagueSelector
131
+ active_league_id={value}
132
+ onSelectLeague={(pr) => setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, properties: { ...draft_company_embed.properties, [data.item.property]: pr?.league_id } } })}
133
+ />
134
+ </View>
135
+ </View>
136
+ )
137
+ case 'flash_campaign_selector':
138
+ //Split out competition ids
139
+ let fl_ids_string = value
140
+ let fl_ids:string[] = fl_ids_string ? fl_ids_string.split(',') : []
141
+ return (
142
+ <View transparent style={{ borderBottomWidth:1, borderColor:Colors.borders.light, padding:10 }}>
143
+ <View transparent>
144
+ <Text theme='h1'>{data.item.label}</Text>
145
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.description}</Text>
146
+ </View>
147
+ <View transparent style={{ marginTop:10 }}>
148
+ <FlashSelector
149
+ company_id={company_id}
150
+ active_competitions={fl_ids}
151
+ onSelectCompetition={(competition) => {
152
+ let new_value = fl_ids.concat(competition.poll_campaign_id).join(',');
153
+ setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, properties: { ...draft_company_embed.properties, [data.item.property]: new_value } } })
154
+ }}
155
+ onDeselectCompetition={(competition) => {
156
+ let new_value = fl_ids.filter(id => id != competition.poll_campaign_id).join(',')
157
+ setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, properties: { ...draft_company_embed.properties, [data.item.property]: new_value } } })
158
+ }}
159
+ />
160
+ </View>
161
+ </View>
162
+ )
163
+ case 'squares_selector':
164
+ //Split out competition ids
165
+ let sq_ids_string = value
166
+ let sq_ids:string[] = sq_ids_string ? sq_ids_string.split(',') : []
167
+ return (
168
+ <View transparent style={{ borderBottomWidth:1, borderColor:Colors.borders.light, padding:10 }}>
169
+ <View transparent>
170
+ <Text theme='h1'>{data.item.label}</Text>
171
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.description}</Text>
172
+ </View>
173
+ <View transparent style={{ marginTop:10 }}>
174
+ <SquaresSelector
175
+ company_id={company_id}
176
+ active_competitions={sq_ids}
177
+ onSelectCompetition={(competition) => {
178
+ let new_value = sq_ids.concat(competition.sq_comp_id).join(',');
179
+ setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, properties: { ...draft_company_embed.properties, [data.item.property]: new_value } } })
180
+ }}
181
+ onDeselectCompetition={(competition) => {
182
+ let new_value = sq_ids.filter(id => id != competition.sq_comp_id).join(',')
183
+ setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, properties: { ...draft_company_embed.properties, [data.item.property]: new_value } } })
184
+ }}
185
+ />
186
+ </View>
187
+ </View>
188
+ )
189
+ case 'competition_selector':
190
+ //Split out competition ids
191
+ let comp_ids_string = value
192
+ let comp_ids:string[] = comp_ids_string ? comp_ids_string.split(',') : []
193
+ return (
194
+ <View transparent style={{ borderBottomWidth:1, borderColor:Colors.borders.light, padding:10 }}>
195
+ <View transparent>
196
+ <Text theme='h1'>{data.item.label}</Text>
197
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.description}</Text>
198
+ </View>
199
+ <View transparent style={{ marginTop:10 }}>
200
+ <CompetitionSelector
201
+ company_id={company_id}
202
+ active_competitions={comp_ids}
203
+ onSelectCompetition={(competition) => {
204
+ let new_value = comp_ids.concat(competition.competition_id).join(',');
205
+ setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, properties: { ...draft_company_embed.properties, [data.item.property]: new_value } } })
206
+ }}
207
+ onDeselectCompetition={(competition) => {
208
+ let new_value = comp_ids.filter(id => id != competition.competition_id).join(',')
209
+ setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, properties: { ...draft_company_embed.properties, [data.item.property]: new_value } } })
210
+ }}
211
+ />
212
+ </View>
213
+ </View>
214
+ )
215
+ default:
216
+ return <></>
217
+ }
218
+ }
219
+
220
+ const renderSections = (data:{ item:string, index:number }) => {
221
+ switch(data.item){
222
+
223
+ case 'header':
224
+ if(!embed){ return <></> }
225
+ return (
226
+ <ImageBackground
227
+ source={{ uri: embed.image.url }}
228
+ style={{ width: size.width, height:225, justifyContent:'flex-end', overflow:'hidden', ...header_style}}>
229
+ <View type='dark_blur' style={{ padding:20 }}>
230
+ <Text theme='h1' size={36}>{embed.name}</Text>
231
+ <Text theme='description' size={16} style={{ marginTop:3 }}>{embed.description}</Text>
232
+ </View>
233
+ </ImageBackground>
234
+ )
235
+ case 'toggle':
236
+ return (
237
+ <View style={{ padding:10, paddingBottom:0 }}>
238
+ <Toggle
239
+ options={[
240
+ { key: 'properties', label: 'Properties' },
241
+ { key: 'embed', label: 'Embed It!' }
242
+ ]}
243
+ selected_option={active_toggle}
244
+ onSelectOption={(key) => setActiveToggle(key)}
245
+ />
246
+ </View>
247
+ )
248
+ case 'name':
249
+ if(active_toggle != 'properties'){ return <></> }
250
+ if(!draft_company_embed){ return <></> }
251
+ return (
252
+ <View transparent style={{ borderBottomWidth:1, borderColor:Colors.borders.light, padding:20 }}>
253
+ <View transparent>
254
+ <Text theme='h1'>Embed Name</Text>
255
+ <Text theme='description' style={{ marginTop:3 }}>Give this embed a memorable name</Text>
256
+ </View>
257
+ <TextInput
258
+ value={draft_company_embed?.name}
259
+ onFocusPosition={onFocusPosition}
260
+ placeholder={'Enter Embed Name...'}
261
+ style={{ marginTop:10 }}
262
+ onChangeText={(text) => setEmbedData({ ...embed_data, draft_company_embed: { ...draft_company_embed, name: text } })}
263
+ />
264
+ </View>
265
+ )
266
+ case 'properties':
267
+ if(active_toggle != 'properties'){ return <></> }
268
+ return (
269
+ <View transparent style={{ padding:10 }}>
270
+ <FlatList
271
+ key='embed_properties'
272
+ keyExtractor={item => item.embed_property_id.toString()}
273
+ data={embed_properties.sort((a,b) => a.priority - b.priority)}
274
+ renderItem={renderProperties}
275
+ />
276
+ </View>
277
+ )
278
+ case 'identifer':
279
+ if(active_toggle != 'embed'){ return <></> }
280
+ if(!company_embed){ return <></> }
281
+ return (
282
+ <View transparent style={{ padding:20 }}>
283
+ <Text theme='h1' size={18}>Your Embed Identifier</Text>
284
+ <Text theme='description'>Each embed has a unique identifier. Paste this into the embed code or copy the entire snipped below</Text>
285
+ <Button float style={{ padding:10, marginTop:10 }}>
286
+ <Text theme='h1' selectable color={Colors.text.action}>{company_embed.identifier}</Text>
287
+ <Text theme='description' style={{ marginTop:3 }}>Press / click to copy</Text>
288
+ </Button>
289
+ </View>
290
+ )
291
+ case 'loading':
292
+ if(!loading){ return <></> }
293
+ return (
294
+ <ActivityIndicator style={{ padding:20, alignSelf: 'center' }} size='large' />
295
+ )
296
+ case 'code':
297
+ if(active_toggle != 'embed'){ return <></> }
298
+ if(!company_embed){ return <></> }
299
+
300
+ const embed_code = `
301
+ <div id='bettoredge' style='height:100%; width:100%;' data-identifier='${company_embed.identifier}'></div>
302
+ <script src='https://embed.bettoredge.com/common.bundle.js'></script>
303
+ <script src='https://embed.bettoredge.com/embed.bundle.js'></script>
304
+ `
305
+
306
+ return (
307
+ <View transparent style={{ padding:20 }}>
308
+ <Text theme='h1' size={18}>Your Embed Code</Text>
309
+ <Text theme='description'>Copy the code below and add it to your website. Adjust styling as you like. Embeds will fill 100% of the parent container</Text>
310
+ <Button
311
+ transparent style={{ marginTop:10, padding:10, backgroundColor:Colors.views.illiquidMarket }}
312
+ onPress={async() => {
313
+ await Clipboard.setStringAsync(embed_code);
314
+ alert('Code copied successfully')
315
+ }}
316
+ >
317
+ <Text theme='description' selectable>{`<div id='bettoredge' style='height:100%; width:100%;' data-identifier='${company_embed.identifier}'></div>`}</Text>
318
+ <Text theme='description' style={{ marginTop:10 }} selectable>{`<script src='https://embed.bettoredge.com/common.bundle.js'></script>`}</Text>
319
+ <Text theme='description' style={{ marginTop:3 }} selectable>{`<script src='https://embed.bettoredge.com/embed.bundle.js'></script>`}</Text>
320
+ <Text theme='action' style={{ marginTop:25 }} selectable>Press / click to copy</Text>
321
+ </Button>
322
+ </View>
323
+ )
324
+ default: return <></>
325
+ }
326
+ }
327
+ const is_changed = JSON.stringify(company_embed) != JSON.stringify(draft_company_embed) ? true : false
328
+ return (
329
+ <View float={float} style={{ flex:1 }} onLayout={(ev) => {
330
+ const { width, height } = ev.nativeEvent.layout;
331
+ setSize({ width, height });
332
+
333
+ }}>
334
+ <FlatList
335
+ data={sections}
336
+ key={'embed_sections'}
337
+ refreshing={loading}
338
+ onRefresh={() => getEmbedData(company_embed_id)}
339
+ keyExtractor={item => item}
340
+ renderItem={renderSections}
341
+ />
342
+ {draft_company_embed ?
343
+ <View type='footer' style={{ flexDirection:'row', alignItems:'center', padding:10, ...footer_style }}>
344
+ <Button
345
+ title='CLOSE'
346
+ type='close'
347
+ style={{ flex:1 }}
348
+ onPress={() => onClose()}
349
+ />
350
+ <Button
351
+ title='SAVE'
352
+ type='success'
353
+ loading={action_loading}
354
+ style={{ flex:3, marginLeft:5, opacity: is_changed && !action_loading ? 1 : 0.5 }}
355
+ disabled={!is_changed || action_loading}
356
+ onPress={() => handleSave(draft_company_embed)}
357
+ />
358
+ </View>
359
+ :<></>}
360
+ </View>
361
+ )
362
+ }
363
+
364
+ export default EmbedManager
@@ -0,0 +1,88 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import type { PollCampaignProps } from "../../types";
3
+ import { useColors } from "../../constants/useColors";
4
+ import { Button, Text, View } from "../../Components/Themed";
5
+ import { FlatList, Image } from "react-native";
6
+ import { Checkbox, Icons, SearchBox } from "../../Components";
7
+ import moment from "moment-mini";
8
+ import { PartnerPortalApi } from "../api";
9
+
10
+ type FlashSelectorProps = {
11
+ company_id:string,
12
+ active_competitions:string[],
13
+ onSelectCompetition:(campaign:PollCampaignProps) => void,
14
+ onDeselectCompetition:(campaign:PollCampaignProps) => void
15
+ }
16
+ const FlashSelector = ({ company_id, active_competitions, onSelectCompetition, onDeselectCompetition }:FlashSelectorProps) => {
17
+ const Colors = useColors();
18
+ const [ visible, setVisible ] = useState(false);
19
+ const [ competitions, setCompetitions ] = useState<PollCampaignProps[]>([])
20
+ const [ search, setSearch ] = useState('');
21
+
22
+ const filtered_competitions = competitions.filter(pr => pr.name.toLowerCase().includes(search.toLowerCase())).slice(0,10)
23
+
24
+ useEffect(() => {
25
+ getCompetitions()
26
+ },[company_id]);
27
+
28
+ const getCompetitions = async() => {
29
+ PartnerPortalApi.setEnvironment();
30
+ const s_resp = await PartnerPortalApi.EngagementApi.getActiveFlashCampaigns(company_id);
31
+ setCompetitions(s_resp);
32
+ }
33
+
34
+ const renderCompetitions = (data:{ item:PollCampaignProps, index:number }) => {
35
+ const selected = active_competitions.includes(data.item.poll_campaign_id.toString());
36
+
37
+ return (
38
+ <Button
39
+ transparent
40
+ style={{ flexDirection:'row', alignItems:'center', padding:10, borderRadius:0, borderBottomWidth:1, borderColor:Colors.borders.light }}
41
+ onPress={() => {
42
+ if(selected){ return onDeselectCompetition(data.item) }
43
+ return onSelectCompetition(data.item);
44
+ }}
45
+ >
46
+ <Image
47
+ source={{ uri: data.item.campaign_image?.url }}
48
+ style={{ height: 35, width:35 }}
49
+ resizeMode="cover"
50
+ />
51
+ <View transparent style={{ flex:1, marginLeft:10 }}>
52
+ <Text theme='h1'>{data.item.name}</Text>
53
+ <Text theme='description' style={{ marginTop:3 }}>Flash Markets</Text>
54
+ </View>
55
+ <Checkbox
56
+ checked={selected}
57
+ disabled
58
+ onSelect={() => console.log('')}
59
+ />
60
+ </Button>
61
+ )
62
+ }
63
+
64
+ return (
65
+ <View float style={{ padding:15 }}>
66
+ <Button transparent style={{ padding:0, flexDirection:'row', alignItems:'center' }} onPress={() => setVisible(!visible)}>
67
+ <Text style={{ flex:1, marginRight:10 }} theme='h1'>{active_competitions.length} Comeptitions</Text>
68
+ <Icons.ChevronIcon direction={visible?'up':'down'} color={Colors.text.h1} size={8} />
69
+ </Button>
70
+ {visible ?
71
+ <View transparent style={{ marginTop:20 }}>
72
+ <SearchBox
73
+ onChange={(text) => setSearch(text)}
74
+ hide_search_button
75
+ />
76
+ <FlatList
77
+ data={filtered_competitions.sort((a,b) => a.status.localeCompare(b.status) || moment(a.create_datetime).unix() - moment(b.create_datetime).unix())}
78
+ key={'comp_selector'}
79
+ keyExtractor={item => item.poll_campaign_id.toString()}
80
+ renderItem={renderCompetitions}
81
+ />
82
+ </View>
83
+ :<></>}
84
+ </View>
85
+ )
86
+ }
87
+
88
+ export default FlashSelector
@@ -0,0 +1,76 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import type { LeagueProps } from "../../types";
3
+ import { useColors } from "../../constants/useColors";
4
+ import { Button, Text, View } from "../../Components/Themed";
5
+ import { FlatList, Image } from "react-native";
6
+ import { Icons, SearchBox } from "../../Components";
7
+ import { MarketComponentApi } from "../../MarketComponents/api";
8
+
9
+ type LeagueSelectorProps = {
10
+ active_league_id?:string,
11
+ onSelectLeague:(league:LeagueProps | undefined) => void
12
+ }
13
+ const LeagueSelector = ({ active_league_id, onSelectLeague }:LeagueSelectorProps) => {
14
+ const Colors = useColors();
15
+ const [ visible, setVisible ] = useState(false);
16
+ const [ leagues, setLeagues ] = useState<LeagueProps[]>([])
17
+ const [ search, setSearch ] = useState('');
18
+
19
+ const filtered_leagues = leagues.filter(pr => pr.league_name.toLowerCase().includes(search.toLowerCase())).slice(0,10)
20
+ const active_league = leagues.find(l => l.league_id == active_league_id);
21
+
22
+ useEffect(() => {
23
+ getLeagues()
24
+ },[]);
25
+
26
+ const getLeagues = async() => {
27
+ MarketComponentApi.setEnvironment();
28
+ const leagues = await MarketComponentApi.getLeagues();
29
+ setLeagues(leagues);
30
+ }
31
+
32
+ const renderLeagues = (data:{ item:LeagueProps, index:number }) => {
33
+ return (
34
+ <Button
35
+ transparent
36
+ style={{ flexDirection:'row', alignItems:'center', padding:10, borderRadius:0, borderBottomWidth:1, borderColor:Colors.borders.light }}
37
+ onPress={() => { setVisible(false); onSelectLeague(data.item) }}
38
+ >
39
+ <Image
40
+ source={{ uri: data.item.league_image }}
41
+ style={{ height: 35, width:35 }}
42
+ resizeMode="cover"
43
+ />
44
+ <View transparent style={{ flex:1, marginLeft:10 }}>
45
+ <Text theme='h1'>{data.item.league_name}</Text>
46
+ <Text theme='description' style={{ marginTop:3 }}>{data.item.sport}</Text>
47
+ </View>
48
+ </Button>
49
+ )
50
+ }
51
+
52
+ return (
53
+ <View style={{ padding:15 }} float>
54
+ <Button transparent style={{ padding:0, flexDirection:'row', alignItems:'center' }} onPress={() => { setVisible(!visible); onSelectLeague(undefined)}}>
55
+ <Text style={{ flex:1, marginRight:10 }} theme='h1'>{active_league?.league_name ?? 'Select League'}</Text>
56
+ <Icons.ChevronIcon direction={visible?'up':'down'} color={Colors.text.h1} size={8} />
57
+ </Button>
58
+ {visible ?
59
+ <View transparent style={{ marginTop:20 }}>
60
+ <SearchBox
61
+ onChange={(text) => setSearch(text)}
62
+ hide_search_button
63
+ />
64
+ <FlatList
65
+ data={filtered_leagues.sort((a,b) => a.status.localeCompare(b.status) ||a.priority - b.priority)}
66
+ key={'league_selector'}
67
+ keyExtractor={item => item.league_id.toString()}
68
+ renderItem={renderLeagues}
69
+ />
70
+ </View>
71
+ :<></>}
72
+ </View>
73
+ )
74
+ }
75
+
76
+ export default LeagueSelector
@@ -0,0 +1,63 @@
1
+ import React, { useState } from "react";
2
+ import type { PlayerReferralProps, PromoProps } from "../../types";
3
+ import { useColors } from "../../constants/useColors";
4
+ import { Button, Text, View } from "../../Components/Themed";
5
+ import { FlatList } from "react-native";
6
+ import { Icons, SearchBox } from "../../Components";
7
+ import moment from "moment-mini";
8
+
9
+ type ReferralSelectorProps = {
10
+ player_referrals:PlayerReferralProps[],
11
+ active_referral?:PlayerReferralProps,
12
+ promos:PromoProps[],
13
+ onSelectReferral:(player_referral:PlayerReferralProps | undefined) => void
14
+ }
15
+ const ReferralSelector = ({ active_referral, promos, player_referrals, onSelectReferral }:ReferralSelectorProps) => {
16
+ const Colors = useColors();
17
+ const [ visible, setVisible ] = useState(false);
18
+ const [ search, setSearch ] = useState('');
19
+
20
+ const filtered_referral = player_referrals.filter(pr => pr.referral_code.toLowerCase().includes(search.toLowerCase())).slice(0,10)
21
+
22
+ const renderReferrals = (data:{ item:PlayerReferralProps, index:number }) => {
23
+ const promo = promos.find(p => p.promo_id == data.item.promo_id);
24
+ if(!promo){ return <></> }
25
+ return (
26
+ <Button
27
+ transparent
28
+ style={{ flexDirection:'row', alignItems:'center', padding:10, borderRadius:0, borderBottomWidth:1, borderColor:Colors.borders.light }}
29
+ onPress={() => { setVisible(false); onSelectReferral(data.item) }}
30
+ >
31
+ <View transparent style={{ flex:1, marginLeft:10 }}>
32
+ <Text theme='h1'>{data.item.referral_code}</Text>
33
+ <Text theme='description' style={{ marginTop:3 }}>{promo.description}</Text>
34
+ </View>
35
+ </Button>
36
+ )
37
+ }
38
+
39
+ return (
40
+ <View style={{ padding:15 }} float>
41
+ <Button transparent style={{ padding:0, flexDirection:'row', alignItems:'center' }} onPress={() => { setVisible(!visible); onSelectReferral(undefined)}}>
42
+ <Text style={{ flex:1, marginRight:10 }} theme='h1'>{active_referral?.referral_code ?? 'Select Referral'}</Text>
43
+ <Icons.ChevronIcon direction={visible?'up':'down'} color={Colors.text.h1} size={8} />
44
+ </Button>
45
+ {visible ?
46
+ <View transparent style={{ marginTop:20 }}>
47
+ <SearchBox
48
+ onChange={(text) => setSearch(text)}
49
+ hide_search_button
50
+ />
51
+ <FlatList
52
+ data={filtered_referral.sort((a,b) => moment(a.create_datetime).unix() - moment(b.create_datetime).unix())}
53
+ key={'group_selector'}
54
+ keyExtractor={item => item.player_referral_id.toString()}
55
+ renderItem={renderReferrals}
56
+ />
57
+ </View>
58
+ :<></>}
59
+ </View>
60
+ )
61
+ }
62
+
63
+ export default ReferralSelector