@vixoniccom/footbal-score 1.4.6-dev.7 → 1.4.6-dev.9

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.
@@ -4,13 +4,6 @@ object-assign
4
4
  @license MIT
5
5
  */
6
6
 
7
- /*!
8
- localForage -- Offline Storage, Improved
9
- Version 1.10.0
10
- https://localforage.github.io/localForage
11
- (c) 2013-2017 Mozilla, Apache License 2.0
12
- */
13
-
14
7
  /**
15
8
  * @license
16
9
  * Lodash <https://lodash.com/>
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "parameters": {
3
+ "footballService": { "id": "f7e3a1b2-c4d5-6789-abcd-ef0123456789" },
3
4
  "league": 1,
4
5
  "debugTimezone" : false,
5
6
  "timeStart": "10 am",
@@ -0,0 +1,109 @@
1
+ {
2
+ "services": {
3
+ "f7e3a1b2-c4d5-6789-abcd-ef0123456789": {
4
+ "id": "f7e3a1b2-c4d5-6789-abcd-ef0123456789",
5
+ "data": {
6
+ "fixtures": [
7
+ {
8
+ "fixture": {
9
+ "id": 1001,
10
+ "date": "2026-06-22T18:00:00+00:00",
11
+ "status": { "long": "Match Finished", "short": "FT", "elapsed": 90 },
12
+ "venue": { "name": "Camp Nou", "city": "Barcelona" }
13
+ },
14
+ "league": {
15
+ "id": 140,
16
+ "name": "La Liga",
17
+ "country": "Spain",
18
+ "logo": "https://media.api-sports.io/football/leagues/140.png",
19
+ "round": "Regular Season - 38"
20
+ },
21
+ "teams": {
22
+ "home": { "id": 529, "name": "Barcelona", "logo": "https://media.api-sports.io/football/teams/529.png", "winner": true },
23
+ "away": { "id": 541, "name": "Real Madrid", "logo": "https://media.api-sports.io/football/teams/541.png", "winner": false }
24
+ },
25
+ "goals": { "home": 3, "away": 1 },
26
+ "score": {
27
+ "halftime": { "home": 1, "away": 0 },
28
+ "fulltime": { "home": 3, "away": 1 }
29
+ }
30
+ },
31
+ {
32
+ "fixture": {
33
+ "id": 1002,
34
+ "date": "2026-06-22T20:45:00+00:00",
35
+ "status": { "long": "Second Half", "short": "2H", "elapsed": 67 },
36
+ "venue": { "name": "Anfield", "city": "Liverpool" }
37
+ },
38
+ "league": {
39
+ "id": 39,
40
+ "name": "Premier League",
41
+ "country": "England",
42
+ "logo": "https://media.api-sports.io/football/leagues/39.png",
43
+ "round": "Regular Season - 38"
44
+ },
45
+ "teams": {
46
+ "home": { "id": 40, "name": "Liverpool", "logo": "https://media.api-sports.io/football/teams/40.png", "winner": null },
47
+ "away": { "id": 42, "name": "Arsenal", "logo": "https://media.api-sports.io/football/teams/42.png", "winner": null }
48
+ },
49
+ "goals": { "home": 2, "away": 2 },
50
+ "score": {
51
+ "halftime": { "home": 1, "away": 1 },
52
+ "fulltime": { "home": null, "away": null }
53
+ }
54
+ },
55
+ {
56
+ "fixture": {
57
+ "id": 1003,
58
+ "date": "2026-06-23T19:00:00+00:00",
59
+ "status": { "long": "Not Started", "short": "NS", "elapsed": null },
60
+ "venue": { "name": "Allianz Arena", "city": "Munich" }
61
+ },
62
+ "league": {
63
+ "id": 78,
64
+ "name": "Bundesliga",
65
+ "country": "Germany",
66
+ "logo": "https://media.api-sports.io/football/leagues/78.png",
67
+ "round": "Regular Season - 34"
68
+ },
69
+ "teams": {
70
+ "home": { "id": 157, "name": "Bayern Munich", "logo": "https://media.api-sports.io/football/teams/157.png", "winner": null },
71
+ "away": { "id": 165, "name": "Borussia Dortmund", "logo": "https://media.api-sports.io/football/teams/165.png", "winner": null }
72
+ },
73
+ "goals": { "home": null, "away": null },
74
+ "score": {
75
+ "halftime": { "home": null, "away": null },
76
+ "fulltime": { "home": null, "away": null }
77
+ }
78
+ },
79
+ {
80
+ "fixture": {
81
+ "id": 1004,
82
+ "date": "2026-06-22T17:30:00+00:00",
83
+ "status": { "long": "Match Finished", "short": "FT", "elapsed": 90 },
84
+ "venue": { "name": "San Siro", "city": "Milan" }
85
+ },
86
+ "league": {
87
+ "id": 135,
88
+ "name": "Serie A",
89
+ "country": "Italy",
90
+ "logo": "https://media.api-sports.io/football/leagues/135.png",
91
+ "round": "Regular Season - 38"
92
+ },
93
+ "teams": {
94
+ "home": { "id": 489, "name": "AC Milan", "logo": "https://media.api-sports.io/football/teams/489.png", "winner": false },
95
+ "away": { "id": 505, "name": "Inter", "logo": "https://media.api-sports.io/football/teams/505.png", "winner": true }
96
+ },
97
+ "goals": { "home": 0, "away": 2 },
98
+ "score": {
99
+ "halftime": { "home": 0, "away": 1 },
100
+ "fulltime": { "home": 0, "away": 2 }
101
+ }
102
+ }
103
+ ]
104
+ },
105
+ "updatedAt": 1750608000000,
106
+ "__typename": "FootballAppService"
107
+ }
108
+ }
109
+ }
package/build.zip CHANGED
Binary file
@@ -241,43 +241,7 @@
241
241
  "required": true,
242
242
  "defaultValue": "7pm"
243
243
  },
244
- {
245
- "id": "updateTime",
246
- "label": "Actualización",
247
- "type": "select-input",
248
- "items": [
249
- {
250
- "label": "5 minutos",
251
- "value": 300000
252
- },
253
- {
254
- "label": "10 minutos",
255
- "value": 600000
256
- },
257
- {
258
- "label": "30 minutos",
259
- "value": 1800000
260
- },
261
- {
262
- "label": "1 hora",
263
- "value": 3600000
264
- },
265
- {
266
- "label": "6 horas",
267
- "value": 21600000
268
- },
269
- {
270
- "label": "12 horas",
271
- "value": 43200000
272
- },
273
- {
274
- "label": "Diario",
275
- "value": 86400000
276
- }
277
- ],
278
- "required": true,
279
- "defaultValue": 300000
280
- },
244
+
281
245
  {
282
246
  "id": "titleEnabled",
283
247
  "label": "Título App",
@@ -342,14 +306,6 @@
342
306
  "type": "number-input",
343
307
  "range": "[1:100:]",
344
308
  "description": "Duración por página (en segundos)"
345
- },
346
- {
347
- "id": "debugTimezone",
348
- "label": "Debug Timezone",
349
- "type": "switch",
350
- "defaultValue": false,
351
- "displayOnTrue": "Visible",
352
- "displayOnFalse": "Oculto"
353
309
  }
354
310
  ]
355
311
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vixoniccom/footbal-score",
3
3
  "alias": "Resultados Deportivos",
4
- "version": "1.4.6-dev.7",
4
+ "version": "1.4.6-dev.9",
5
5
  "description": "Muestra resultados en vivo de fútbol.",
6
6
  "main": "main.js",
7
7
  "author": "",
package/src/App.tsx CHANGED
@@ -4,17 +4,18 @@ import { FontLoader, FormattedText, Table } from './components'
4
4
 
5
5
  export type Props = {
6
6
  appData?: VixonicData
7
- start: boolean
8
7
  fixtures: FootballFixture[]
9
8
  serviceError?: string
10
9
  }
11
10
 
12
- export const App: React.FunctionComponent<Props> = ({ appData, start, fixtures }) => {
13
- if (!appData || !start) return null
11
+ export const App: React.FunctionComponent<Props> = ({ appData, fixtures }) => {
12
+ if (!appData) return null
14
13
 
15
14
  const { parameters, downloadsPath } = appData
16
15
  const { backgroundImage, padding, msj0 = '', matchesYesterday, matchesTomorrow } = parameters
17
16
 
17
+ console.log('[App] fixtures received:', fixtures.length, fixtures)
18
+
18
19
  const backgroundImageState = backgroundImage?.filename
19
20
  ? `url("${downloadsPath}/${backgroundImage.filename}")`
20
21
  : ''
@@ -27,6 +28,9 @@ export const App: React.FunctionComponent<Props> = ({ appData, start, fixtures }
27
28
  const yesterdayStr = moment().utcOffset(serviceUtcOffset).subtract(1, 'days').format('YYYY-MM-DD')
28
29
  const tomorrowStr = moment().utcOffset(serviceUtcOffset).add(1, 'days').format('YYYY-MM-DD')
29
30
 
31
+ console.log('[App] date context — today:', today, 'yesterday:', yesterdayStr, 'tomorrow:', tomorrowStr, 'utcOffset:', serviceUtcOffset)
32
+ console.log('[App] filter config — matchesYesterday:', matchesYesterday, 'matchesTomorrow:', matchesTomorrow)
33
+
30
34
  const filteredFixtures = fixtures.filter(f => {
31
35
  const fixtureDate = moment.parseZone(f.fixture.date).format('YYYY-MM-DD')
32
36
  if (fixtureDate === today) return true
@@ -35,6 +39,8 @@ export const App: React.FunctionComponent<Props> = ({ appData, start, fixtures }
35
39
  return false
36
40
  })
37
41
 
42
+ console.log('[App] filteredFixtures count:', filteredFixtures.length)
43
+
38
44
  return (
39
45
  <>
40
46
  {filteredFixtures.length > 0 ?
@@ -11,11 +11,11 @@ interface Props {
11
11
  export const Results: React.FunctionComponent<Props> = ({ parameters, goals, score }) => {
12
12
  return (
13
13
  <div style={{ display: 'flex', justifyContent: 'center' }}>
14
- {isNumber(score.penalty.home) ? <FormattedText text={`(${score.penalty.home})`} format={parameters.goalsFormat} /> : ''}
14
+ {isNumber(score.penalty?.home) ? <FormattedText text={`(${score.penalty.home})`} format={parameters.goalsFormat} /> : ''}
15
15
  <FormattedText text={goals.home ? goals.home : 0} format={parameters.goalsFormat} />
16
16
  <FormattedText text={'-'} format={parameters.goalsFormat} />
17
17
  <FormattedText text={goals.away ? goals.away : 0} format={parameters.goalsFormat} />
18
- {isNumber(score.penalty.away) ? <FormattedText text={`(${score.penalty.away})`} format={parameters.goalsFormat} /> : ''}
18
+ {isNumber(score.penalty?.away) ? <FormattedText text={`(${score.penalty.away})`} format={parameters.goalsFormat} /> : ''}
19
19
  </div>
20
20
  )
21
21
  }
@@ -1,3 +1,4 @@
1
+ import moment from 'moment'
1
2
  import React, { useEffect, useState } from 'react'
2
3
  import { Results, Status, Time } from './'
3
4
  import { FormattedText } from '../../'
@@ -71,7 +72,7 @@ export const Row: React.FunctionComponent<Props> = ({ item, parameters }) => {
71
72
  justifyContent: 'center'
72
73
  }}>
73
74
  <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
74
- <Time time={Number(fixture.timestamp)} parameters={parameters} />
75
+ <Time time={moment.parseZone(fixture.date).unix()} utcOffset={moment.parseZone(fixture.date).utcOffset()} parameters={parameters} />
75
76
  </div>
76
77
  <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
77
78
  <Status status={fixture.status.short} parameters={parameters} />
@@ -1,22 +1,18 @@
1
1
  import moment from 'moment'
2
2
  import React from 'react'
3
3
  import { FormattedText } from '../../'
4
- import { resolvedTimezone } from '../../../helpers/getFixture'
5
4
 
6
5
  interface Props {
7
6
  time: number
7
+ utcOffset: number
8
8
  parameters: VixonicParameters
9
9
  }
10
10
 
11
- const MEXICO_TIMEZONES = ['America/Mexico_City', 'America/Cancun', 'America/Merida', 'America/Monterrey', 'America/Matamoros', 'America/Chihuahua', 'America/Ojinaga', 'America/Mazatlan', 'America/Hermosillo', 'America/Tijuana', 'America/Ensenada']
12
- const offset = MEXICO_TIMEZONES.includes(resolvedTimezone) ? -3600 : 0
13
-
14
- export const Time: React.FunctionComponent<Props> = ({ time, parameters }) => {
15
- const adjusted = time + offset
11
+ export const Time: React.FunctionComponent<Props> = ({ time, utcOffset, parameters }) => {
16
12
  return (
17
13
  <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center' }}>
18
- <FormattedText text={moment.unix(adjusted).format('DD-MM')} format={parameters.timeFormat} />
19
- <FormattedText text={moment.unix(adjusted).format('h:mm a')} format={parameters.timeFormat} />
14
+ <FormattedText text={moment.unix(time).utcOffset(utcOffset).format('DD-MM')} format={parameters.timeFormat} />
15
+ <FormattedText text={moment.unix(time).utcOffset(utcOffset).format('h:mm a')} format={parameters.timeFormat} />
20
16
  </div>
21
17
  )
22
18
  }
@@ -1,3 +1,4 @@
1
+ import moment from 'moment'
1
2
  import React, { useEffect, useState } from 'react'
2
3
  import { Row } from './components'
3
4
 
@@ -9,11 +10,16 @@ type Props = {
9
10
  export const Table: React.FunctionComponent<Props> = ({ dataFixture, parameters }) => {
10
11
  const { itemsPerPage, durationPerPage } = parameters
11
12
  const rows = Number(itemsPerPage || 4)
12
- const orderedData = dataFixture.sort((a, b) => a.fixture.timestamp - b.fixture.timestamp)
13
+ const orderedData = dataFixture.sort((a, b) => moment.parseZone(a.fixture.date).unix() - moment.parseZone(b.fixture.date).unix())
13
14
  const [page, setPage] = useState<number>(1)
14
15
  const [items, setItems] = useState<string[][]>(orderedData.slice(0, rows))
15
16
  const total = orderedData.length
16
17
 
18
+ useEffect(() => {
19
+ setPage(1)
20
+ setItems(orderedData.slice(0, rows))
21
+ }, [dataFixture])
22
+
17
23
  useEffect(() => {
18
24
  const timer = setTimeout(() => {
19
25
  handlePagination()
@@ -4,10 +4,21 @@ export class FootballLoader {
4
4
 
5
5
  update(appData: VixonicData) {
6
6
  const serviceId = appData.parameters.footballService?.id
7
- if (!serviceId || !appData.services[serviceId]) return
7
+ console.log('[FootballLoader] serviceId:', serviceId)
8
+
9
+ if (!serviceId || !appData.services[serviceId]) {
10
+ console.log('[FootballLoader] service not found in appData.services. Available keys:', Object.keys(appData.services))
11
+ return
12
+ }
8
13
 
9
14
  const rawData = appData.services[serviceId].data as FootballServiceData | undefined
15
+ console.log('[FootballLoader] rawData:', JSON.stringify(rawData, null, 2))
16
+
10
17
  const fixtures = rawData?.fixtures ?? []
18
+ console.log('[FootballLoader] fixtures count:', fixtures.length)
19
+ if (fixtures.length > 0) {
20
+ console.log('[FootballLoader] first fixture:', JSON.stringify(fixtures[0], null, 2))
21
+ }
11
22
 
12
23
  this.onData?.(fixtures)
13
24
  }
@@ -0,0 +1 @@
1
+ export const resolvedTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone
package/src/main.ts CHANGED
@@ -4,7 +4,6 @@ import { App } from './App'
4
4
  import { FootballLoader } from './football-loader'
5
5
  const { ipcRenderer } = require('electron')
6
6
 
7
- let start: boolean = false
8
7
  let appData: VixonicData | undefined = undefined
9
8
  let fixtures: FootballFixture[] = []
10
9
  let serviceError: string | undefined = undefined
@@ -22,19 +21,23 @@ footballLoader.onError = (error) => {
22
21
  }
23
22
 
24
23
  ipcRenderer.on('preload', (_event: any, data: VixonicData) => {
24
+ console.log('[main] preload received. parameters:', JSON.stringify(data.parameters, null, 2))
25
+ console.log('[main] preload services keys:', Object.keys(data.services))
25
26
  appData = data
26
27
  footballLoader.update(data)
27
28
  render()
28
29
  })
29
30
 
30
31
  ipcRenderer.on('start', (_event: any, data: VixonicData) => {
32
+ console.log('[main] start received. parameters:', JSON.stringify(data.parameters, null, 2))
33
+ console.log('[main] start services keys:', Object.keys(data.services))
31
34
  appData = data
32
35
  footballLoader.update(data)
33
- start = true
34
36
  render()
35
37
  })
36
38
 
37
39
  ipcRenderer.on('update', (_event: any, data: VixonicData) => {
40
+ console.log('[main] update received. services keys:', Object.keys(data.services))
38
41
  appData = data
39
42
  footballLoader.update(data)
40
43
  render()
@@ -47,7 +50,7 @@ ipcRenderer.on('finish', (_event: any) => {
47
50
 
48
51
  function render() {
49
52
  ReactDOM.render(
50
- React.createElement(App, { start, appData, fixtures, serviceError }),
53
+ React.createElement(App, { appData, fixtures, serviceError }),
51
54
  document.getElementById('root')
52
55
  )
53
56
  }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "parameters": {
3
+ "footballService": { "id": "f7e3a1b2-c4d5-6789-abcd-ef0123456789" },
3
4
  "league": 1,
4
5
  "debugTimezone" : false,
5
6
  "timeStart": "10 am",
@@ -0,0 +1,109 @@
1
+ {
2
+ "services": {
3
+ "f7e3a1b2-c4d5-6789-abcd-ef0123456789": {
4
+ "id": "f7e3a1b2-c4d5-6789-abcd-ef0123456789",
5
+ "data": {
6
+ "fixtures": [
7
+ {
8
+ "fixture": {
9
+ "id": 1001,
10
+ "date": "2026-06-22T18:00:00+00:00",
11
+ "status": { "long": "Match Finished", "short": "FT", "elapsed": 90 },
12
+ "venue": { "name": "Camp Nou", "city": "Barcelona" }
13
+ },
14
+ "league": {
15
+ "id": 140,
16
+ "name": "La Liga",
17
+ "country": "Spain",
18
+ "logo": "https://media.api-sports.io/football/leagues/140.png",
19
+ "round": "Regular Season - 38"
20
+ },
21
+ "teams": {
22
+ "home": { "id": 529, "name": "Barcelona", "logo": "https://media.api-sports.io/football/teams/529.png", "winner": true },
23
+ "away": { "id": 541, "name": "Real Madrid", "logo": "https://media.api-sports.io/football/teams/541.png", "winner": false }
24
+ },
25
+ "goals": { "home": 3, "away": 1 },
26
+ "score": {
27
+ "halftime": { "home": 1, "away": 0 },
28
+ "fulltime": { "home": 3, "away": 1 }
29
+ }
30
+ },
31
+ {
32
+ "fixture": {
33
+ "id": 1002,
34
+ "date": "2026-06-22T20:45:00+00:00",
35
+ "status": { "long": "Second Half", "short": "2H", "elapsed": 67 },
36
+ "venue": { "name": "Anfield", "city": "Liverpool" }
37
+ },
38
+ "league": {
39
+ "id": 39,
40
+ "name": "Premier League",
41
+ "country": "England",
42
+ "logo": "https://media.api-sports.io/football/leagues/39.png",
43
+ "round": "Regular Season - 38"
44
+ },
45
+ "teams": {
46
+ "home": { "id": 40, "name": "Liverpool", "logo": "https://media.api-sports.io/football/teams/40.png", "winner": null },
47
+ "away": { "id": 42, "name": "Arsenal", "logo": "https://media.api-sports.io/football/teams/42.png", "winner": null }
48
+ },
49
+ "goals": { "home": 2, "away": 2 },
50
+ "score": {
51
+ "halftime": { "home": 1, "away": 1 },
52
+ "fulltime": { "home": null, "away": null }
53
+ }
54
+ },
55
+ {
56
+ "fixture": {
57
+ "id": 1003,
58
+ "date": "2026-06-23T19:00:00+00:00",
59
+ "status": { "long": "Not Started", "short": "NS", "elapsed": null },
60
+ "venue": { "name": "Allianz Arena", "city": "Munich" }
61
+ },
62
+ "league": {
63
+ "id": 78,
64
+ "name": "Bundesliga",
65
+ "country": "Germany",
66
+ "logo": "https://media.api-sports.io/football/leagues/78.png",
67
+ "round": "Regular Season - 34"
68
+ },
69
+ "teams": {
70
+ "home": { "id": 157, "name": "Bayern Munich", "logo": "https://media.api-sports.io/football/teams/157.png", "winner": null },
71
+ "away": { "id": 165, "name": "Borussia Dortmund", "logo": "https://media.api-sports.io/football/teams/165.png", "winner": null }
72
+ },
73
+ "goals": { "home": null, "away": null },
74
+ "score": {
75
+ "halftime": { "home": null, "away": null },
76
+ "fulltime": { "home": null, "away": null }
77
+ }
78
+ },
79
+ {
80
+ "fixture": {
81
+ "id": 1004,
82
+ "date": "2026-06-22T17:30:00+00:00",
83
+ "status": { "long": "Match Finished", "short": "FT", "elapsed": 90 },
84
+ "venue": { "name": "San Siro", "city": "Milan" }
85
+ },
86
+ "league": {
87
+ "id": 135,
88
+ "name": "Serie A",
89
+ "country": "Italy",
90
+ "logo": "https://media.api-sports.io/football/leagues/135.png",
91
+ "round": "Regular Season - 38"
92
+ },
93
+ "teams": {
94
+ "home": { "id": 489, "name": "AC Milan", "logo": "https://media.api-sports.io/football/teams/489.png", "winner": false },
95
+ "away": { "id": 505, "name": "Inter", "logo": "https://media.api-sports.io/football/teams/505.png", "winner": true }
96
+ },
97
+ "goals": { "home": 0, "away": 2 },
98
+ "score": {
99
+ "halftime": { "home": 0, "away": 1 },
100
+ "fulltime": { "home": 0, "away": 2 }
101
+ }
102
+ }
103
+ ]
104
+ },
105
+ "updatedAt": 1750608000000,
106
+ "__typename": "FootballAppService"
107
+ }
108
+ }
109
+ }