@everymatrix/casino-tournaments-limited-controller 1.5.6 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@everymatrix/casino-tournaments-limited-controller",
3
- "version": "1.5.6",
3
+ "version": "1.6.0",
4
4
  "main": "index.js",
5
5
  "svelte": "src/index.ts",
6
6
  "scripts": {
@@ -36,5 +36,5 @@
36
36
  "publishConfig": {
37
37
  "access": "public"
38
38
  },
39
- "gitHead": "18b817f66a008871bf85a5a004a749dca5111add"
39
+ "gitHead": "e4b57a534bdee7d09fc53a7b49e31338bc1a3f00"
40
40
  }
@@ -4,6 +4,7 @@
4
4
  import { onMount } from "svelte";
5
5
  import { formatDate } from './date'
6
6
  import icon from './icon'
7
+ import './private.loader.svelte'
7
8
 
8
9
  import {
9
10
  _fetch,
@@ -23,6 +24,7 @@
23
24
  } from "./message";
24
25
 
25
26
  import '@everymatrix/casino-tournaments-tab'
27
+ import { translations } from './translations'
26
28
 
27
29
  type State = 'Scheduled' | 'Ongoing' | 'Finished'
28
30
 
@@ -30,7 +32,7 @@
30
32
  export let lang: string = 'en'
31
33
  export let session: string = ''
32
34
  export let state: State | undefined = undefined
33
- export let states: string = ''
35
+ export let states: string = 'Scheduled,Ongoing,Finished'
34
36
  export let filter: string = ''
35
37
 
36
38
  export let clientstyling:string = '';
@@ -42,6 +44,7 @@
42
44
  let eventSource = undefined
43
45
  let svgSize: number = 0
44
46
  let href = icon
47
+ let isLoading:boolean = true
45
48
 
46
49
  type Tournament = {
47
50
  id: string
@@ -64,36 +67,39 @@
64
67
 
65
68
  let tournamentsMatrix: TournamentsMatrix = {}
66
69
 
67
- const eventSourceHandler = composeEventSourceMessageHandler({
68
- "PlayerLeaderBoardsUpdate": (data) => {
69
- let _tournamentsMatrix: TournamentsMatrix = {}
70
- __states.map(s => {
71
- if(!_tournamentsMatrix[s]){
72
- _tournamentsMatrix[s] = []
73
- }
74
- })
70
+ const setTournamentsMatrix = (data) => {
71
+ let _tournamentsMatrix: TournamentsMatrix = {}
72
+ __states.map(s => {
73
+ if(!_tournamentsMatrix[s]){
74
+ _tournamentsMatrix[s] = []
75
+ }
76
+ })
75
77
 
76
- data.items.map(_item => {
78
+ // data.items = []
79
+ data.items.map(_item => {
77
80
 
78
- const { id, nameOrTitle: title, endTime: enddate } = _item.tournament
81
+ const { id, nameOrTitle: title, endTime: enddate } = _item.tournament
79
82
 
80
- const tournamentComposed: TournamentForRendering = {
81
- id,
82
- title,
83
- rank: _item.leaderBoard && `#${_item.leaderBoard.rank}/${_item.endRank}`,
84
- enddate,
85
- prize: _item.leaderBoard && _item.leaderBoard.prizeName,
86
- }
83
+ const tournamentComposed: TournamentForRendering = {
84
+ id,
85
+ title,
86
+ rank: _item.leaderBoard && `#${_item.leaderBoard.rank}/${_item.endRank}`,
87
+ enddate,
88
+ prize: _item.leaderBoard && _item.leaderBoard.prizeName,
89
+ }
87
90
 
88
- _tournamentsMatrix[matchStatusFromApiToView(_item.tournament.state)].push(tournamentComposed)
89
- })
91
+ _tournamentsMatrix[matchStatusFromApiToView(_item.tournament.state)].push(tournamentComposed)
92
+ })
90
93
 
91
- tournamentsMatrix = _tournamentsMatrix
92
-
94
+ tournamentsMatrix = _tournamentsMatrix
95
+ }
96
+
97
+ const eventSourceHandler = composeEventSourceMessageHandler({
98
+ "PlayerLeaderBoardsUpdate": (data) => {
99
+ setTournamentsMatrix(data)
93
100
  statesNeedSubscribe.map(s => {
94
101
  postMessageTabTotalUpdate(s, tournamentsMatrix[s].length)
95
102
  })
96
-
97
103
  },
98
104
  'TournamentUpdate': (data) => {
99
105
  if(data.item){
@@ -151,12 +157,8 @@
151
157
 
152
158
  const init = () => {
153
159
  subscribeApi(0, 30)
154
-
155
160
  setLocale(lang)
156
-
157
- postMessageTabLocaleTextUpdate('Scheduled', $_('tournamentsLimitedController.Scheduled'))
158
- postMessageTabLocaleTextUpdate('Ongoing', $_('tournamentsLimitedController.Ongoing'))
159
- postMessageTabLocaleTextUpdate('Finished', `${$_(`tournamentsLimitedController.Finished`)} (${$_('tournamentsLimitedController.last')} 48h)`)
161
+ setTabTexts()
160
162
  }
161
163
 
162
164
  const setClientStyling = ():void => {
@@ -181,6 +183,15 @@
181
183
  });
182
184
  }
183
185
 
186
+ const setTabTexts = () => {
187
+ setTimeout(() => {
188
+ const text = translations[lang]['tournamentsLimitedController']
189
+ postMessageTabLocaleTextUpdate('Scheduled', text['Scheduled'])
190
+ postMessageTabLocaleTextUpdate('Ongoing', text['Ongoing'])
191
+ postMessageTabLocaleTextUpdate('Finished', `${text[`Finished`]} (${text['last']} 48h)`)
192
+ }, 1)
193
+ }
194
+
184
195
  onMount(() => {
185
196
  return () => {
186
197
  if(eventSource){
@@ -197,9 +208,15 @@
197
208
  $: clientstyling && customStylingContainer && setClientStyling();
198
209
  $: clientstylingurl && customStylingContainer && setClientStylingURL();
199
210
 
211
+ $: lang && setTabTexts()
212
+
213
+ $: Object.keys(tournamentsMatrix).length && (() => {
214
+ isLoading = false
215
+ setTabTexts()
216
+ })()
200
217
  </script>
201
218
 
202
- <div class="casino-tournaments-limited-controller" bind:this={customStylingContainer}>
219
+ <div class="Root" part="Root" bind:this={customStylingContainer}>
203
220
 
204
221
  <div class="top-wrapper">
205
222
  <div class="svg" bind:clientWidth={svgSize}>
@@ -231,65 +248,64 @@
231
248
  }'
232
249
  >X</div>
233
250
  </div>
234
-
235
- <section>
236
- <casino-tournaments-tab
237
- tabs={states}
238
- tab={state}
239
- />
240
-
241
- <div class='list header'>
242
- {#each [
243
- $_('tournamentsLimitedController.name'),
244
- $_('tournamentsLimitedController.rank'),
245
- $_('tournamentsLimitedController.enddate'),
246
- $_('tournamentsLimitedController.prize')
247
- ] as item}
248
- <div>{item}</div>
249
- {/each}
251
+
252
+ {#if isLoading}
253
+ <div class="Loading">
254
+ <casino-tournaments-limited-controller-loader />
250
255
  </div>
251
-
252
- {#if list}
253
- {#each list as item, i}
254
-
255
- <div class='list'>
256
- {#if item}
257
- {#each Object.keys(item).filter(_key => _key !== 'id') as key, i}
258
-
259
- <div class={key}>
260
- {#if item[key]}
261
-
262
- {#if key === 'title'}
263
- <span on:click={() => {
264
- window.postMessage({
265
- type: 'MyTournamentFromNavClicked',
266
- tournamentId: item.id,
267
- showLeaderboard: true
268
- }, window.location.href)
269
- }}>
270
- {item.title}
271
- </span>
272
- {/if}
273
-
274
- {#if key === 'enddate'}
275
- {formatDate(item.enddate)}
276
- {/if}
277
- {/if}
278
-
279
- {#if key === 'rank'}
280
- <span class={item.prize ? "prize-active" : ''}>{item.rank || ' -'}</span>
281
- {/if}
282
-
283
- {#if key === 'prize'}
284
- <span class={item.prize ? "prize-active" : ''}>{item.prize || ' -'}</span>
285
- {/if}
286
- </div>
256
+ {:else}
257
+ <section>
258
+ <casino-tournaments-tab
259
+ tabs={states}
260
+ tab={state}
261
+ />
262
+
263
+ {#if list}
264
+ <table>
265
+ <thead>
266
+ <tr>
267
+ {#each [
268
+ $_('tournamentsLimitedController.name'),
269
+ $_('tournamentsLimitedController.rank'),
270
+ $_('tournamentsLimitedController.enddate'),
271
+ $_('tournamentsLimitedController.prize')
272
+ ] as item}
273
+ <th>{item}</th>
287
274
  {/each}
288
- {/if}
289
- </div>
290
- {/each}
291
- {/if}
292
- </section>
275
+ </tr>
276
+ </thead>
277
+ {#each list as item, i}
278
+ <tbody>
279
+ <tr>
280
+ {#if item}
281
+
282
+ <td class="Title" part="Title" on:click={() => {
283
+ window.postMessage({
284
+ type: 'MyTournamentFromNavClicked',
285
+ tournamentId: item.id,
286
+ showLeaderboard: true
287
+ }, window.location.href)
288
+ }}>
289
+ {item.title}
290
+ </td>
291
+ <td class:active={item.prize} class="Rank">{item.rank || ' -'}</td>
292
+ <td class="EndDate" part="EndDate" nowrap>
293
+ {#each formatDate(item.enddate) as s}
294
+ <p>{s}</p>
295
+ {/each}
296
+ </td>
297
+ <td class:active={item.prize} class="Prize">{item.prize || ' -'}</td>
298
+ {/if}
299
+ </tr>
300
+ </tbody>
301
+ {/each}
302
+ </table>
303
+ {:else}
304
+ <div class="NoContent"></div>
305
+ {/if}
306
+
307
+ </section>
308
+ {/if}
293
309
  </div>
294
310
 
295
311
  <style lang="scss">
@@ -310,7 +326,7 @@
310
326
 
311
327
  $vw_base: 320px;
312
328
  @function vw($px) {
313
- @return ($px / $vw_base) * 100vw;
329
+ @return ($px / $vw_base) * 100vw;
314
330
  }
315
331
 
316
332
  .CloseButton {
@@ -321,7 +337,11 @@
321
337
  cursor: pointer
322
338
  }
323
339
 
324
- .casino-tournaments-limited-controller {
340
+ .NoContent {
341
+ padding: 120px;
342
+ }
343
+
344
+ .Root {
325
345
  background: #282828;
326
346
 
327
347
  .top-wrapper {
@@ -348,65 +368,58 @@
348
368
 
349
369
  section {
350
370
  padding: 0 vw(12px);
351
-
352
371
  }
372
+ }
353
373
 
354
- .list {
355
-
356
- &.header {
357
- background: #1C1C1C;
358
- div {
359
- color: #F7F7F7;
360
- }
361
- }
362
-
363
- display: flex;
364
- align-items: center;
365
- font-size: vw(12px);
366
-
367
- @import url('https://rsms.me/inter/inter.css');
368
- div { font: initial; font-family: 'Inter', sans-serif; }
369
- @supports (font-variation-settings: normal) {
370
- div { font: initial; font-family: 'Inter var', sans-serif; }
371
- }
372
-
373
- div {
374
- display: flex;
375
- padding: vw(8px) vw(6.45px);
376
- // text-align: center;
377
- word-break: break-word;
378
- font-size: vw(12px) !important;
379
- color: #B5B5B5;
380
-
381
- &:nth-child(1) {
382
- flex: 0 0 25%;
383
- }
384
-
385
- &:nth-child(2) {
386
- flex: 0 0 25%;
387
- }
374
+ table {
375
+ width: 100%;
376
+ border-collapse: collapse;
377
+ font-size: vw(12px);
378
+ line-height: vw(14px);
388
379
 
389
- &:nth-child(3) {
390
- flex: 0 0 25%;
391
- }
380
+
381
+ @import url('https://rsms.me/inter/inter.css');
382
+ div { font: initial; font-family: 'Inter', sans-serif; }
383
+ @supports (font-variation-settings: normal) {
384
+ div { font: initial; font-family: 'Inter var', sans-serif; }
385
+ }
392
386
 
393
- &:nth-child(4) {
394
- flex: 0 0 25%;
395
- }
387
+ thead {
388
+
389
+ background: #1C1C1C;
390
+ color: #F7F7F7;
391
+ }
396
392
 
397
- &.title span {
398
- color: #FF8364;
399
- text-decoration-line: underline;
393
+ th, td {
394
+ padding: vw(8px) vw(5px);
395
+ overflow-wrap: break-word;
396
+ }
397
+
398
+ td {
399
+ color: #B5B5B5;
400
+ }
401
+ }
402
+
403
+ .Title {
404
+ color: #FF8364;
405
+ text-decoration-line: underline;
406
+ word-break: break-word;
400
407
 
401
- &:active {
402
- opacity: 0.6;
403
- }
404
- }
408
+ &:active {
409
+ opacity: 0.6;
410
+ }
411
+ }
405
412
 
406
- .prize-active {
407
- color: #FFD700;
408
- }
409
- }
413
+ .Prize .Rank {
414
+ &:active {
415
+ color: #FFD700;
410
416
  }
411
417
  }
418
+
419
+ .Loading {
420
+ display: flex;
421
+ justify-content: center;
422
+ padding: vw(30px);
423
+ }
424
+
412
425
  </style>
package/src/date.js CHANGED
@@ -6,20 +6,21 @@ export function formatDate(date) {
6
6
 
7
7
  const _date = new Date(date)
8
8
 
9
- let str = ''
10
-
11
- str += [
9
+ const day = [
12
10
  padTo2Digits(_date.getDate()),
13
11
  padTo2Digits(_date.getMonth() + 1),
14
12
  _date.getFullYear() % 100,
15
13
  ].join('.')
16
- str += '\n'
17
- str += [
14
+
15
+ const hm = [
18
16
  padTo2Digits(_date.getHours()),
19
17
  padTo2Digits(_date.getMinutes()),
20
18
  ].join(':')
21
- str += ' '
22
- str += _date.getHours() >= 12 ? 'PM' : 'AM'
23
19
 
24
- return str
20
+ const xm = _date.getHours() >= 12 ? 'PM' : 'AM'
21
+
22
+ return [
23
+ day,
24
+ hm + ' ' + xm
25
+ ]
25
26
  }
@@ -0,0 +1,61 @@
1
+ <svelte:options tag={'casino-tournaments-limited-controller-loader'} />
2
+ <div class="lds-ellipsis"><div></div><div></div><div></div><div></div></div>
3
+ <style lang="scss">
4
+
5
+ .lds-ellipsis {
6
+ display: inline-block;
7
+ position: relative;
8
+ width: 80px;
9
+ height: 80px;
10
+ }
11
+ .lds-ellipsis div {
12
+ position: absolute;
13
+ top: 33px;
14
+ width: 13px;
15
+ height: 13px;
16
+ border-radius: 50%;
17
+ background: #fff;
18
+ animation-timing-function: cubic-bezier(0, 1, 1, 0);
19
+ }
20
+ .lds-ellipsis div:nth-child(1) {
21
+ left: 8px;
22
+ animation: lds-ellipsis1 0.6s infinite;
23
+ }
24
+ .lds-ellipsis div:nth-child(2) {
25
+ left: 8px;
26
+ animation: lds-ellipsis2 0.6s infinite;
27
+ }
28
+ .lds-ellipsis div:nth-child(3) {
29
+ left: 32px;
30
+ animation: lds-ellipsis2 0.6s infinite;
31
+ }
32
+ .lds-ellipsis div:nth-child(4) {
33
+ left: 56px;
34
+ animation: lds-ellipsis3 0.6s infinite;
35
+ }
36
+ @keyframes lds-ellipsis1 {
37
+ 0% {
38
+ transform: scale(0);
39
+ }
40
+ 100% {
41
+ transform: scale(1);
42
+ }
43
+ }
44
+ @keyframes lds-ellipsis3 {
45
+ 0% {
46
+ transform: scale(1);
47
+ }
48
+ 100% {
49
+ transform: scale(0);
50
+ }
51
+ }
52
+ @keyframes lds-ellipsis2 {
53
+ 0% {
54
+ transform: translate(0, 0);
55
+ }
56
+ 100% {
57
+ transform: translate(24px, 0);
58
+ }
59
+ }
60
+
61
+ </style>