@24i/bigscreen-sdk 1.0.9-alpha.2201 → 1.0.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.
- package/package.json +1 -1
- package/packages/developer-tools/src/PlayerDebugWindow/constants.ts +15 -0
- package/packages/digital-clock/src/DigitalClock.tsx +1 -1
- package/packages/epg/src/v2/DatePicker.tsx +4 -3
- package/packages/epg/src/v2/DateToast/DateToast.tsx +10 -8
- package/packages/epg/src/v2/Day.tsx +4 -3
- package/packages/epg/src/v2/ProgramInfo/utils.ts +4 -3
- package/packages/epg/src/v2/TimelineSection.tsx +4 -1
- package/packages/l10n/src/date/common.ts +6 -6
- package/packages/time/README.md +4 -1
- package/packages/time/src/Time.ts +14 -2
- package/packages/time/src/constants.ts +1 -0
- package/packages/types-bigscreen-jsx/index.d.ts +0 -2
package/package.json
CHANGED
|
@@ -49,6 +49,21 @@ export const MEDIA_INFO_DESCRIPTION: Record<string, MediaInfo> = {
|
|
|
49
49
|
audioCodec: {
|
|
50
50
|
title: 'Audio codec',
|
|
51
51
|
},
|
|
52
|
+
audioBitrate: {
|
|
53
|
+
title: 'Audio bitrate',
|
|
54
|
+
},
|
|
55
|
+
audioSamplingRate: {
|
|
56
|
+
title: 'Audio sampling rate',
|
|
57
|
+
},
|
|
58
|
+
audioLanguage: {
|
|
59
|
+
title: 'Audio language',
|
|
60
|
+
},
|
|
61
|
+
subtitlesAvailable: {
|
|
62
|
+
title: 'Subtitles available',
|
|
63
|
+
},
|
|
64
|
+
availableSubtitlesListString: {
|
|
65
|
+
title: 'List of available subtitles',
|
|
66
|
+
},
|
|
52
67
|
drmProtection: {
|
|
53
68
|
title: 'DRM protection',
|
|
54
69
|
},
|
|
@@ -40,7 +40,7 @@ export class DigitalClock extends Component<Props> {
|
|
|
40
40
|
|
|
41
41
|
setTime() {
|
|
42
42
|
const { withSeconds } = this.props;
|
|
43
|
-
const currentTimestampMs = time.
|
|
43
|
+
const currentTimestampMs = time.getCurrentTime().getTime();
|
|
44
44
|
if (this.oldUnixTimestampMs !== currentTimestampMs) {
|
|
45
45
|
const options = withSeconds ? WITH_SECONDS_OPTIONS : WITHOUT_SECONDS_OPTIONS;
|
|
46
46
|
this.clearMount((
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Component, createRef, DeclareProps } from '@24i/bigscreen-sdk/jsx';
|
|
2
|
+
import { time } from '@24i/bigscreen-sdk/time';
|
|
2
3
|
import { Picker } from '@24i/bigscreen-sdk/picker';
|
|
3
4
|
import { DatePicker as NativeDatePicker } from '@24i/bigscreen-sdk/picker/DatePicker';
|
|
4
5
|
import { DAY_IN_MS, HOUR_IN_MS, MINUTE_IN_MS, SECOND_IN_MS } from '@24i/bigscreen-sdk/utils';
|
|
@@ -46,9 +47,9 @@ const prepareDateData = ({
|
|
|
46
47
|
|
|
47
48
|
const defaultFormat = (date: Date) => {
|
|
48
49
|
const locale = i18n.getLanguage();
|
|
49
|
-
return l10n
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
return l10n
|
|
51
|
+
.date(date.getTime() + time.getTimezoneOffsetMs(), locale)
|
|
52
|
+
.toLocaleDateString({ weekday: 'short', day: 'numeric', month: 'short' });
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
export class DatePicker extends Component<Props> implements IDatePicker {
|
|
@@ -6,28 +6,30 @@ import { time } from '@24i/bigscreen-sdk/time';
|
|
|
6
6
|
import { HOUR_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
|
|
7
7
|
import { InternalEpg, Plugin } from '../interface';
|
|
8
8
|
|
|
9
|
-
const formatTime = (
|
|
9
|
+
const formatTime = (localTimestamp: number) => l10n.date(localTimestamp).toLocaleTimeString(
|
|
10
10
|
{ hour: 'numeric', minute: '2-digit' },
|
|
11
11
|
);
|
|
12
12
|
|
|
13
|
-
const formatDate = (
|
|
14
|
-
if (time.isToday(
|
|
13
|
+
const formatDate = (localTimestamp: number) => {
|
|
14
|
+
if (time.isToday(localTimestamp)) {
|
|
15
15
|
return i18n.t('date.today');
|
|
16
16
|
}
|
|
17
|
-
if (time.isYesterday(
|
|
17
|
+
if (time.isYesterday(localTimestamp)) {
|
|
18
18
|
return i18n.t('date.yesterday');
|
|
19
19
|
}
|
|
20
|
-
if (time.isTomorrow(
|
|
20
|
+
if (time.isTomorrow(localTimestamp)) {
|
|
21
21
|
return i18n.t('date.tomorrow');
|
|
22
22
|
}
|
|
23
|
-
return l10n.date(
|
|
23
|
+
return l10n.date(localTimestamp).toLocaleString({
|
|
24
24
|
weekday: 'short',
|
|
25
25
|
day: 'numeric',
|
|
26
26
|
month: 'short',
|
|
27
27
|
});
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
-
const formatDatetime = (
|
|
30
|
+
const formatDatetime = (localTimestamp: number) => (
|
|
31
|
+
`${formatDate(localTimestamp)} • ${formatTime(localTimestamp)}`
|
|
32
|
+
);
|
|
31
33
|
|
|
32
34
|
type Props = {
|
|
33
35
|
epg: InternalEpg<any, any, any, any>,
|
|
@@ -44,7 +46,7 @@ export class DateToast extends Component<Props> implements Plugin {
|
|
|
44
46
|
|
|
45
47
|
onScrolledToTimestamp(timestamp: number) {
|
|
46
48
|
const { epg } = this.props;
|
|
47
|
-
const day = formatDatetime(timestamp);
|
|
49
|
+
const day = formatDatetime(timestamp + time.getTimezoneOffsetMs());
|
|
48
50
|
if (this.lastDay === null) { // we do not want to display it after render and first move
|
|
49
51
|
this.lastDay = day;
|
|
50
52
|
return;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Component, createRef, setText } from '@24i/bigscreen-sdk/jsx';
|
|
2
|
+
import { time } from '@24i/bigscreen-sdk/time';
|
|
2
3
|
import { l10n } from '@24i/bigscreen-sdk/l10n';
|
|
3
4
|
import { DayProps as Props, Day as IDay } from './interface';
|
|
4
5
|
|
|
@@ -15,9 +16,9 @@ export class Day extends Component<Props> implements IDay {
|
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
private formatCurrentTimestamp() {
|
|
18
|
-
return l10n
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
return l10n
|
|
20
|
+
.date(this.timestamp + time.getTimezoneOffsetMs())
|
|
21
|
+
.toLocaleDateString({ weekday: 'long', day: 'numeric', month: 'short' });
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
render() {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { l10n } from '@24i/bigscreen-sdk/l10n';
|
|
2
|
+
import { time } from '@24i/bigscreen-sdk/time';
|
|
2
3
|
import { Asset } from '@24i/smartapps-datalayer/models';
|
|
3
4
|
|
|
4
5
|
export const cutString = (string: string, length: number) => {
|
|
@@ -16,9 +17,9 @@ export const getSubtitle = (asset: Asset) => (
|
|
|
16
17
|
: ''
|
|
17
18
|
);
|
|
18
19
|
|
|
19
|
-
const toLocaleTimeString = (timestamp: number) => l10n
|
|
20
|
-
|
|
21
|
-
);
|
|
20
|
+
const toLocaleTimeString = (timestamp: number) => l10n
|
|
21
|
+
.date(timestamp + time.getTimezoneOffsetMs())
|
|
22
|
+
.toLocaleTimeString({ hour: 'numeric', minute: '2-digit' });
|
|
22
23
|
|
|
23
24
|
export const getBroadcastTime = (asset: Asset) => {
|
|
24
25
|
const start = toLocaleTimeString(asset.program!.startTime);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Component, createRef, setText } from '@24i/bigscreen-sdk/jsx';
|
|
2
|
+
import { time } from '@24i/bigscreen-sdk/time';
|
|
2
3
|
import { l10n } from '@24i/bigscreen-sdk/l10n';
|
|
3
4
|
import { offsetPosition } from '@24i/bigscreen-sdk/utils';
|
|
4
5
|
import { TimelineSectionProps as Props, TimelineSection as ITimelineSection } from './interface';
|
|
@@ -23,7 +24,9 @@ export class TimelineSection extends Component<Props> implements ITimelineSectio
|
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
private formatCurrentTimestamp() {
|
|
26
|
-
return l10n
|
|
27
|
+
return l10n
|
|
28
|
+
.date(this.timestamp + time.getTimezoneOffsetMs())
|
|
29
|
+
.toLocaleTimeString({ hour: 'numeric', minute: '2-digit' });
|
|
27
30
|
}
|
|
28
31
|
|
|
29
32
|
render() {
|
|
@@ -7,7 +7,7 @@ const NOON = 12;
|
|
|
7
7
|
|
|
8
8
|
export const SECOND_FROM_END = 2;
|
|
9
9
|
|
|
10
|
-
export const h24 = (date: Date) => date.
|
|
10
|
+
export const h24 = (date: Date) => date.getUTCHours().toString();
|
|
11
11
|
|
|
12
12
|
export const hh24 = (date: Date) => {
|
|
13
13
|
const h = h24(date);
|
|
@@ -15,7 +15,7 @@ export const hh24 = (date: Date) => {
|
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export const h12 = (date: Date) => {
|
|
18
|
-
const h = date.
|
|
18
|
+
const h = date.getUTCHours() % NOON;
|
|
19
19
|
return h === 0 ? '12' : h.toString();
|
|
20
20
|
};
|
|
21
21
|
|
|
@@ -24,14 +24,14 @@ export const hh12 = (date: Date) => {
|
|
|
24
24
|
return h.length === 1 ? `0${h}` : h;
|
|
25
25
|
};
|
|
26
26
|
|
|
27
|
-
export const m = (date: Date) => date.
|
|
27
|
+
export const m = (date: Date) => date.getUTCMinutes().toString();
|
|
28
28
|
|
|
29
29
|
export const mm = (date: Date) => {
|
|
30
30
|
const min = m(date);
|
|
31
31
|
return min.length === 1 ? `0${min}` : min;
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
-
export const s = (date: Date) => date.
|
|
34
|
+
export const s = (date: Date) => date.getUTCSeconds().toString();
|
|
35
35
|
|
|
36
36
|
export const ss = (date: Date) => {
|
|
37
37
|
const sec = s(date);
|
|
@@ -39,7 +39,7 @@ export const ss = (date: Date) => {
|
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
export const amOrPm = (date: Date) => (
|
|
42
|
-
date.
|
|
42
|
+
date.getUTCHours() < NOON ? 'AM' : 'PM'
|
|
43
43
|
);
|
|
44
44
|
|
|
45
45
|
export const h24Mm = (date: Date) => `${h24(date)}:${mm(date)}`;
|
|
@@ -107,7 +107,7 @@ export const collonSeparatedHour12MinuteSecond = (date: Date, options: DateTimeF
|
|
|
107
107
|
|
|
108
108
|
export const processYear = (dateStringParts: string[], year: Year | undefined, date: Date) => {
|
|
109
109
|
if (typeof year === 'undefined') return;
|
|
110
|
-
const fullYear = date.
|
|
110
|
+
const fullYear = date.getUTCFullYear().toString();
|
|
111
111
|
dateStringParts.push(
|
|
112
112
|
year === '2-digit'
|
|
113
113
|
? fullYear.substring(fullYear.length - SECOND_FROM_END)
|
package/packages/time/README.md
CHANGED
|
@@ -52,7 +52,7 @@ await time.init({
|
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
### `getCurrentTime(): Date`
|
|
55
|
-
It returns date object having
|
|
55
|
+
It returns date object having UTC time set to local time.
|
|
56
56
|
|
|
57
57
|
### `getCurrentUnixTime(): number`
|
|
58
58
|
It returns UNIX time in milliseconds of server UTC time.
|
|
@@ -60,6 +60,9 @@ It returns UNIX time in milliseconds of server UTC time.
|
|
|
60
60
|
### `getTimezoneOffset(): number`
|
|
61
61
|
It returns timezone offset in minutes, for UTC+1 (Germany) is 60.
|
|
62
62
|
|
|
63
|
+
### `getTimezoneOffsetMs(): number`
|
|
64
|
+
It returns timezone offset in milliseconds, for UTC+1 (Germany) is 3600000.
|
|
65
|
+
|
|
63
66
|
### `initStatus: InitStatus`
|
|
64
67
|
To check what time you are using, just check the `initStatus` property.
|
|
65
68
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createInterval } from '@24i/bigscreen-sdk/utils/timers';
|
|
2
2
|
import { parseIsoDate, getDayStart, getDayEnd } from './utils';
|
|
3
|
-
import { InitStatus, ErrorCode } from './constants';
|
|
3
|
+
import { InitStatus, ErrorCode, MS_PER_MINUTE } from './constants';
|
|
4
4
|
import { Config, TimeServiceResp } from './types';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -22,6 +22,9 @@ class Time {
|
|
|
22
22
|
/** The difference in milliseconds between System Date and Server Date */
|
|
23
23
|
offsetMs = 0;
|
|
24
24
|
|
|
25
|
+
/** The difference Date object internally adds to timestamp if not asking for UTC time. */
|
|
26
|
+
deviceOffset = new Date().getTimezoneOffset() * MS_PER_MINUTE;
|
|
27
|
+
|
|
25
28
|
/** Timer for periodical time update */
|
|
26
29
|
syncInterval = createInterval();
|
|
27
30
|
|
|
@@ -113,7 +116,7 @@ class Time {
|
|
|
113
116
|
this.currentTime = currentTime;
|
|
114
117
|
this.serverTime = date;
|
|
115
118
|
this.serverUnixTime = unixTime;
|
|
116
|
-
this.offsetMs = this.currentTime.getTime() - this.serverTime.getTime();
|
|
119
|
+
this.offsetMs = this.currentTime.getTime() - this.serverTime.getTime() + this.deviceOffset;
|
|
117
120
|
this.timezoneOffset = timezoneOffset;
|
|
118
121
|
}
|
|
119
122
|
|
|
@@ -168,6 +171,15 @@ class Time {
|
|
|
168
171
|
return this.timezoneOffset;
|
|
169
172
|
}
|
|
170
173
|
|
|
174
|
+
/**
|
|
175
|
+
* Returns the timezone offset in milliseconds.
|
|
176
|
+
*
|
|
177
|
+
* @returns Timezone offset in milliseconds, e.g. for UTC+1 (Germany) is 3600000.
|
|
178
|
+
*/
|
|
179
|
+
getTimezoneOffsetMs() {
|
|
180
|
+
return this.timezoneOffset * MS_PER_MINUTE;
|
|
181
|
+
}
|
|
182
|
+
|
|
171
183
|
/**
|
|
172
184
|
* Returns offset (milliseconds) between System and Server Date object.
|
|
173
185
|
*
|
|
@@ -2824,7 +2824,6 @@ declare namespace React {
|
|
|
2824
2824
|
button: DetailedHTMLFactory<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
|
|
2825
2825
|
canvas: DetailedHTMLFactory<CanvasHTMLAttributes<HTMLCanvasElement>, HTMLCanvasElement>;
|
|
2826
2826
|
caption: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
2827
|
-
center: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
2828
2827
|
cite: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
2829
2828
|
code: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
2830
2829
|
col: DetailedHTMLFactory<ColHTMLAttributes<HTMLTableColElement>, HTMLTableColElement>;
|
|
@@ -3162,7 +3161,6 @@ declare global {
|
|
|
3162
3161
|
button: React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
|
|
3163
3162
|
canvas: React.DetailedHTMLProps<React.CanvasHTMLAttributes<HTMLCanvasElement>, HTMLCanvasElement>;
|
|
3164
3163
|
caption: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
3165
|
-
center: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
3166
3164
|
cite: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
3167
3165
|
code: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
3168
3166
|
col: React.DetailedHTMLProps<React.ColHTMLAttributes<HTMLTableColElement>, HTMLTableColElement>;
|