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.
- package/lib/commonjs/FlashMarket/components/ManageFlashMarket.js +1 -1
- package/lib/commonjs/FlashMarket/components/ManageFlashMarket.js.map +1 -1
- package/lib/commonjs/FlashMarket/index.js +1 -1
- package/lib/commonjs/FlashMarket/index.js.map +1 -1
- package/lib/commonjs/PartnerPortal/api/index.js +373 -0
- package/lib/commonjs/PartnerPortal/api/index.js.map +1 -0
- package/lib/commonjs/PartnerPortal/components/CompetitionSelector.js +120 -0
- package/lib/commonjs/PartnerPortal/components/CompetitionSelector.js.map +1 -0
- package/lib/commonjs/PartnerPortal/components/EmbedManager.js +639 -0
- package/lib/commonjs/PartnerPortal/components/EmbedManager.js.map +1 -0
- package/lib/commonjs/PartnerPortal/components/FlashSelector.js +120 -0
- package/lib/commonjs/PartnerPortal/components/FlashSelector.js.map +1 -0
- package/lib/commonjs/PartnerPortal/components/LeagueSelector.js +113 -0
- package/lib/commonjs/PartnerPortal/components/LeagueSelector.js.map +1 -0
- package/lib/commonjs/PartnerPortal/components/ReferralSelector.js +101 -0
- package/lib/commonjs/PartnerPortal/components/ReferralSelector.js.map +1 -0
- package/lib/commonjs/PartnerPortal/components/SquaresSelector.js +120 -0
- package/lib/commonjs/PartnerPortal/components/SquaresSelector.js.map +1 -0
- package/lib/commonjs/PartnerPortal/index.js +853 -0
- package/lib/commonjs/PartnerPortal/index.js.map +1 -0
- package/lib/commonjs/index.js +14 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.d.js.map +1 -1
- package/lib/module/FlashMarket/components/ManageFlashMarket.js +1 -1
- package/lib/module/FlashMarket/components/ManageFlashMarket.js.map +1 -1
- package/lib/module/FlashMarket/index.js +1 -1
- package/lib/module/FlashMarket/index.js.map +1 -1
- package/lib/module/PartnerPortal/api/index.js +367 -0
- package/lib/module/PartnerPortal/api/index.js.map +1 -0
- package/lib/module/PartnerPortal/components/CompetitionSelector.js +112 -0
- package/lib/module/PartnerPortal/components/CompetitionSelector.js.map +1 -0
- package/lib/module/PartnerPortal/components/EmbedManager.js +631 -0
- package/lib/module/PartnerPortal/components/EmbedManager.js.map +1 -0
- package/lib/module/PartnerPortal/components/FlashSelector.js +112 -0
- package/lib/module/PartnerPortal/components/FlashSelector.js.map +1 -0
- package/lib/module/PartnerPortal/components/LeagueSelector.js +106 -0
- package/lib/module/PartnerPortal/components/LeagueSelector.js.map +1 -0
- package/lib/module/PartnerPortal/components/ReferralSelector.js +93 -0
- package/lib/module/PartnerPortal/components/ReferralSelector.js.map +1 -0
- package/lib/module/PartnerPortal/components/SquaresSelector.js +112 -0
- package/lib/module/PartnerPortal/components/SquaresSelector.js.map +1 -0
- package/lib/module/PartnerPortal/index.js +845 -0
- package/lib/module/PartnerPortal/index.js.map +1 -0
- package/lib/module/index.js +3 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.d.js.map +1 -1
- package/lib/typescript/lib/commonjs/PartnerPortal/api/index.d.ts +47 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/api/index.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/CompetitionSelector.d.ts +9 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/CompetitionSelector.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/EmbedManager.d.ts +13 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/EmbedManager.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/FlashSelector.d.ts +9 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/FlashSelector.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/LeagueSelector.d.ts +7 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/LeagueSelector.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/ReferralSelector.d.ts +9 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/ReferralSelector.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/SquaresSelector.d.ts +9 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/components/SquaresSelector.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/index.d.ts +12 -0
- package/lib/typescript/lib/commonjs/PartnerPortal/index.d.ts.map +1 -0
- package/lib/typescript/lib/commonjs/index.d.ts +2 -0
- package/lib/typescript/lib/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/lib/module/PartnerPortal/api/index.d.ts +46 -0
- package/lib/typescript/lib/module/PartnerPortal/api/index.d.ts.map +1 -0
- package/lib/typescript/lib/module/PartnerPortal/components/CompetitionSelector.d.ts +9 -0
- package/lib/typescript/lib/module/PartnerPortal/components/CompetitionSelector.d.ts.map +1 -0
- package/lib/typescript/lib/module/PartnerPortal/components/EmbedManager.d.ts +13 -0
- package/lib/typescript/lib/module/PartnerPortal/components/EmbedManager.d.ts.map +1 -0
- package/lib/typescript/lib/module/PartnerPortal/components/FlashSelector.d.ts +9 -0
- package/lib/typescript/lib/module/PartnerPortal/components/FlashSelector.d.ts.map +1 -0
- package/lib/typescript/lib/module/PartnerPortal/components/LeagueSelector.d.ts +7 -0
- package/lib/typescript/lib/module/PartnerPortal/components/LeagueSelector.d.ts.map +1 -0
- package/lib/typescript/lib/module/PartnerPortal/components/ReferralSelector.d.ts +9 -0
- package/lib/typescript/lib/module/PartnerPortal/components/ReferralSelector.d.ts.map +1 -0
- package/lib/typescript/lib/module/PartnerPortal/components/SquaresSelector.d.ts +9 -0
- package/lib/typescript/lib/module/PartnerPortal/components/SquaresSelector.d.ts.map +1 -0
- package/lib/typescript/lib/module/PartnerPortal/index.d.ts +12 -0
- package/lib/typescript/lib/module/PartnerPortal/index.d.ts.map +1 -0
- package/lib/typescript/lib/module/index.d.ts +3 -1
- package/lib/typescript/lib/module/index.d.ts.map +1 -1
- package/lib/typescript/src/PartnerPortal/api/index.d.ts +75 -0
- package/lib/typescript/src/PartnerPortal/api/index.d.ts.map +1 -0
- package/lib/typescript/src/PartnerPortal/components/CompetitionSelector.d.ts +11 -0
- package/lib/typescript/src/PartnerPortal/components/CompetitionSelector.d.ts.map +1 -0
- package/lib/typescript/src/PartnerPortal/components/EmbedManager.d.ts +16 -0
- package/lib/typescript/src/PartnerPortal/components/EmbedManager.d.ts.map +1 -0
- package/lib/typescript/src/PartnerPortal/components/FlashSelector.d.ts +11 -0
- package/lib/typescript/src/PartnerPortal/components/FlashSelector.d.ts.map +1 -0
- package/lib/typescript/src/PartnerPortal/components/LeagueSelector.d.ts +9 -0
- package/lib/typescript/src/PartnerPortal/components/LeagueSelector.d.ts.map +1 -0
- package/lib/typescript/src/PartnerPortal/components/ReferralSelector.d.ts +11 -0
- package/lib/typescript/src/PartnerPortal/components/ReferralSelector.d.ts.map +1 -0
- package/lib/typescript/src/PartnerPortal/components/SquaresSelector.d.ts +11 -0
- package/lib/typescript/src/PartnerPortal/components/SquaresSelector.d.ts.map +1 -0
- package/lib/typescript/src/PartnerPortal/index.d.ts +14 -0
- package/lib/typescript/src/PartnerPortal/index.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +3 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/FlashMarket/components/ManageFlashMarket.tsx +1 -1
- package/src/FlashMarket/index.tsx +1 -1
- package/src/PartnerPortal/api/index.ts +314 -0
- package/src/PartnerPortal/components/CompetitionSelector.tsx +88 -0
- package/src/PartnerPortal/components/EmbedManager.tsx +364 -0
- package/src/PartnerPortal/components/FlashSelector.tsx +88 -0
- package/src/PartnerPortal/components/LeagueSelector.tsx +76 -0
- package/src/PartnerPortal/components/ReferralSelector.tsx +63 -0
- package/src/PartnerPortal/components/SquaresSelector.tsx +88 -0
- package/src/PartnerPortal/index.tsx +474 -0
- package/src/index.tsx +5 -0
- 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
|