@24i/bigscreen-sdk 1.0.33 → 1.0.34-alpha.2563

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 (43) hide show
  1. package/.vscode/settings.json +6 -0
  2. package/package.json +2 -1
  3. package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +1 -1
  4. package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +161 -0
  5. package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +95 -0
  6. package/packages/analytics/src/clients/TealiumAnalytics/index.ts +2 -0
  7. package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +31 -0
  8. package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +40 -0
  9. package/packages/analytics/src/clients/TealiumAnalytics/mappers/helper.ts +21 -0
  10. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteAdd.ts +11 -0
  11. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteRemove.ts +11 -0
  12. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerClose.ts +15 -0
  13. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerOpen.ts +15 -0
  14. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +15 -0
  15. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchFailed.ts +13 -0
  16. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchSuccess.ts +13 -0
  17. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoPause.ts +15 -0
  18. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoProgress.ts +18 -0
  19. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoResume.ts +15 -0
  20. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStart.ts +15 -0
  21. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStop.ts +15 -0
  22. package/packages/analytics/src/clients/TealiumAnalytics/types.ts +136 -0
  23. package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +1 -1
  24. package/packages/create-package/dist/createPackage.js +66 -0
  25. package/packages/create-package/dist/createPackage.js.map +1 -0
  26. package/packages/create-package/dist/index.js +5 -0
  27. package/packages/create-package/dist/index.js.map +1 -0
  28. package/packages/create-package/dist/questionnaire/questions.js +35 -0
  29. package/packages/create-package/dist/questionnaire/questions.js.map +1 -0
  30. package/packages/create-package/dist/settings/Settings.js +10 -0
  31. package/packages/create-package/dist/settings/Settings.js.map +1 -0
  32. package/packages/create-package/dist/types.js +3 -0
  33. package/packages/create-package/dist/types.js.map +1 -0
  34. package/packages/keyboard/src/WhitelabelKeyboard/layouts/arabic.ts +27 -0
  35. package/packages/keyboard/src/WhitelabelKeyboard/layouts/burmese.ts +27 -0
  36. package/packages/keyboard/src/WhitelabelKeyboard/layouts/dari.ts +28 -0
  37. package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +6 -0
  38. package/packages/keyboard/src/WhitelabelKeyboard/layouts/pashto.ts +27 -0
  39. package/packages/keyboard/src/WhitelabelKeyboard/layouts/persian.ts +27 -0
  40. package/packages/keyboard/src/WhitelabelKeyboard/layouts/ukrainian.ts +27 -0
  41. package/packages/router/src/utils.ts +1 -1
  42. package/packages/analytics/src/clients/TwentyFourIQ/generateSessionId.ts +0 -8
  43. /package/packages/analytics/src/{clients/GoogleAnalytics → utils}/generateSessionId.ts +0 -0
@@ -0,0 +1,6 @@
1
+ {
2
+ "cSpell.words": [
3
+ "MEDIAPAYLOAD",
4
+ "Tealium"
5
+ ]
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@24i/bigscreen-sdk",
3
- "version": "1.0.33",
3
+ "version": "1.0.34-alpha.2563",
4
4
  "description": "SmartApps BIGscreen SDK monorepo",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -90,6 +90,7 @@
90
90
  "./analytics/interface": "./packages/analytics/src/interface.ts",
91
91
  "./analytics/ConsoleAnalytics": "./packages/analytics/src/clients/ConsoleAnalytics/index.ts",
92
92
  "./analytics/GoogleAnalytics": "./packages/analytics/src/clients/GoogleAnalytics/index.ts",
93
+ "./analytics/TealiumAnalytics": "./packages/analytics/src/clients/TealiumAnalytics/index.ts",
93
94
  "./analytics/TwentyFourIQ": "./packages/analytics/src/clients/TwentyFourIQ/index.ts",
94
95
  "./analytics": "./packages/analytics/src/index.ts",
95
96
  "./animations/mock": "./packages/animations/src/__mocks__/JSAnimations.ts",
@@ -9,7 +9,7 @@ import type { AnalyticsClient, AnalyticsEventsMap, SceneInfo } from '../../inter
9
9
  import { mapEventParamsToUrlParams, mapPayload } from './mapPayload';
10
10
  import { prepareBody } from './prepareBody';
11
11
  import { getUrl } from './getUrl';
12
- import { generateSessionId } from './generateSessionId';
12
+ import { generateSessionId } from '../../utils/generateSessionId';
13
13
  import { GOOGLE_ANALYTICS_TRIGGERS, TRIGGER_NAME_TO_GA_EVENTS } from './constants';
14
14
  import {
15
15
  GAEventsNames,
@@ -0,0 +1,161 @@
1
+ import { Storage } from '@24i/bigscreen-sdk/storage';
2
+ import { MINUTE_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
3
+ import { createTimeout } from '@24i/bigscreen-sdk/utils/timers';
4
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
5
+ import {
6
+ BIGSCREEN_APP_TYPE,
7
+ BIGSCREEN_OTT_TYPE,
8
+ BIGSCREEN_PLATFORM_SHORT,
9
+ BIGSCREEN_PLATFORM_TYPE,
10
+ TRIGGER_NAME_TO_TEALIUM_EVENTS,
11
+ } from './constants';
12
+ import { EVENTS_MAPPING } from './interface';
13
+ import type { AnalyticsClient, AnyPayload } from '../../interface';
14
+ import type {
15
+ BaseResult,
16
+ Payload,
17
+ TealiumAnalyticsConfiguration,
18
+ UtagWindow,
19
+ } from './types';
20
+
21
+ declare const window: Window & UtagWindow;
22
+
23
+ // eslint-disable-next-line no-magic-numbers
24
+ const SESSION_TIMEOUT = 30 * MINUTE_IN_MS;
25
+
26
+ const TEALIUM_SESSION_COUNTER = 'tealium_session_counter';
27
+
28
+ const DEFAULT_PAYLOAD = {
29
+ language: '',
30
+ language_service: '',
31
+ entity: '',
32
+ property_id: '',
33
+ short_language_service: '',
34
+ platform_short: BIGSCREEN_PLATFORM_SHORT,
35
+ platform_type: BIGSCREEN_PLATFORM_TYPE,
36
+ app_type: BIGSCREEN_APP_TYPE,
37
+ ott_type: BIGSCREEN_OTT_TYPE,
38
+ app_id: '',
39
+ };
40
+
41
+ export class TealiumAnalytics implements AnalyticsClient {
42
+ name = 'TealiumAnalytics';
43
+
44
+ constantPayload: BaseResult = DEFAULT_PAYLOAD;
45
+
46
+ sessionTimeout = createTimeout();
47
+
48
+ isSessionActive = false;
49
+
50
+ sessionStartSent = false;
51
+
52
+ constructor(private config: TealiumAnalyticsConfiguration, private appVersion: string = '') {
53
+ this.init();
54
+ }
55
+
56
+ async init() {
57
+ // Typically set "noview" flag to true for Single Page Apps (SPAs)
58
+ window.utag_cfg_ovrd = { noview: true };
59
+ window.utag_data = {};
60
+ this.loadScript();
61
+ this.prepareDatasetPayload();
62
+ }
63
+
64
+ prepareDatasetPayload() {
65
+ const { entity, language } = this.config.options;
66
+ this.constantPayload = {
67
+ language,
68
+ language_service: `${entity} ${language}`,
69
+ entity,
70
+ property_id: '',
71
+ short_language_service: language,
72
+ platform_short: BIGSCREEN_PLATFORM_SHORT,
73
+ platform_type: BIGSCREEN_PLATFORM_TYPE,
74
+ app_type: BIGSCREEN_APP_TYPE,
75
+ ott_type: BIGSCREEN_OTT_TYPE,
76
+ app_id: `${entity} ${language} ${this.appVersion}`,
77
+ };
78
+ }
79
+
80
+ async startSession() {
81
+ const sessionNumber = parseInt(
82
+ await Storage.getItem(TEALIUM_SESSION_COUNTER) ?? '0', 10,
83
+ ) + 1;
84
+ await Storage.setItem(TEALIUM_SESSION_COUNTER, sessionNumber.toString());
85
+ this.isSessionActive = true;
86
+ this.setSessionTimeout();
87
+ }
88
+
89
+ setSessionTimeout() {
90
+ this.sessionTimeout.set(() => {
91
+ this.isSessionActive = false;
92
+ this.sessionStartSent = false;
93
+ }, SESSION_TIMEOUT);
94
+ }
95
+
96
+ loadScript() {
97
+ const { account, profile, environment } = this.config.options;
98
+ const url = `//tags.tiqcdn.com/utag/${account}/${profile}/${environment}/utag.js`;
99
+
100
+ const script = document.createElement('script');
101
+ script.type = 'text/javascript';
102
+ script.async = true;
103
+ script.src = url;
104
+ script.addEventListener('load', async () => {
105
+ console.log('Tealium was loaded.');
106
+ await this.startSession();
107
+ }, false);
108
+ const scriptElements = document.getElementsByTagName('script');
109
+ if (scriptElements.length > 0) {
110
+ const scriptElement = scriptElements[0];
111
+ scriptElement.parentNode!.insertBefore(script, scriptElement);
112
+ } else {
113
+ document.body.appendChild(script);
114
+ }
115
+ }
116
+
117
+ track(tealiumEvent: string, payload?: AnyPayload) {
118
+ if (window.utag === undefined) {
119
+ console.warn('Tealium is not available');
120
+ return;
121
+ }
122
+ window.utag_data = this.constantPayload;
123
+ window.utag!.track(tealiumEvent, payload);
124
+ }
125
+
126
+ view(payload?: AnyPayload) {
127
+ this.track('view', payload);
128
+ }
129
+
130
+ link(payload?: AnyPayload) {
131
+ this.track('link', payload);
132
+ }
133
+
134
+ async onEvent(triggerName: AnalyticsTriggers, payload: AnyPayload): Promise<void> {
135
+ const events = TRIGGER_NAME_TO_TEALIUM_EVENTS[triggerName];
136
+ if (this.isSessionActive) {
137
+ this.setSessionTimeout();
138
+ } else {
139
+ await this.startSession();
140
+ }
141
+ if (!events) return;
142
+ await Promise.all(
143
+ events.map(async (event) => {
144
+ const mappingFunction = EVENTS_MAPPING[event];
145
+ try {
146
+ const eventBody = mappingFunction?.(triggerName, {
147
+ ...this.constantPayload,
148
+ ...payload,
149
+ } as unknown as Payload);
150
+ if ((eventBody as unknown as AnyPayload).track_event_type === 'view') {
151
+ this.view(eventBody as Payload);
152
+ } else {
153
+ this.link(eventBody as Payload);
154
+ }
155
+ } catch (e) {
156
+ console.warn(`[${this.name}] Error onEvent: `, e);
157
+ }
158
+ }),
159
+ );
160
+ }
161
+ }
@@ -0,0 +1,95 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+
3
+ export const BIGSCREEN_OTT_TYPE = 'SmartTV';
4
+
5
+ export const BIGSCREEN_APP_TYPE = 'HTML5';
6
+
7
+ export const BIGSCREEN_PLATFORM_SHORT = 'o';
8
+
9
+ export const BIGSCREEN_PLATFORM_TYPE = 'ott';
10
+
11
+ export const TEALIUM_TRIGGERS = [
12
+ // App
13
+ AnalyticsTriggers.APP_CLOSE,
14
+ AnalyticsTriggers.APP_ERROR,
15
+
16
+ // Scenes
17
+ AnalyticsTriggers.SCENE_VIEW,
18
+
19
+ // Search
20
+ AnalyticsTriggers.SEARCH,
21
+
22
+ // Playback
23
+ AnalyticsTriggers.PLAYBACK_10,
24
+ AnalyticsTriggers.PLAYBACK_50,
25
+ AnalyticsTriggers.PLAYBACK_90,
26
+ AnalyticsTriggers.PLAYBACK_PAUSE,
27
+ AnalyticsTriggers.PLAYBACK_START,
28
+ AnalyticsTriggers.PLAYBACK_STOP,
29
+
30
+ // Player
31
+ AnalyticsTriggers.PLAYER_CLOSE,
32
+ AnalyticsTriggers.PLAYER_OPEN,
33
+
34
+ // Favorites
35
+ AnalyticsTriggers.FAVORITE_ADD,
36
+ AnalyticsTriggers.FAVORITE_REMOVE,
37
+
38
+ AnalyticsTriggers.SELECT_CONTENT,
39
+ 'playback_unpause',
40
+ ];
41
+
42
+ export const AppEvents: { [key: string]: string } = {
43
+ [AnalyticsTriggers.PLAYBACK_10]: 'media_milestone_10_video',
44
+ [AnalyticsTriggers.PLAYBACK_50]: 'media_milestone_50_video',
45
+ [AnalyticsTriggers.PLAYBACK_90]: 'media_milestone_90_video',
46
+ [AnalyticsTriggers.PLAYBACK_STOP]: 'video_stop',
47
+ [AnalyticsTriggers.PLAYBACK_PAUSE]: 'video_pause',
48
+ [AnalyticsTriggers.PLAYBACK_START]: 'video_play',
49
+ [AnalyticsTriggers.PLAYER_OPEN]: 'player_x',
50
+ [AnalyticsTriggers.PLAYER_CLOSE]: 'player_x',
51
+ [AnalyticsTriggers.FAVORITE_ADD]: 'subscribe_to_fav',
52
+ [AnalyticsTriggers.FAVORITE_REMOVE]: 'subscribe_to_fav',
53
+ [AnalyticsTriggers.APP_ERROR]: 'app_events',
54
+ [AnalyticsTriggers.SELECT_CONTENT]: 'app_events',
55
+ [AnalyticsTriggers.SEARCH]: 'search_success',
56
+ unpause: 'video_resume',
57
+ };
58
+
59
+ export enum EVENTS {
60
+ SCENE_VIEW = 'scene_view',
61
+ VIDEO_PROGRESS = 'video_progress',
62
+ VIDEO_START = 'video_start',
63
+ VIDEO_STOP = 'video_stop',
64
+ VIDEO_PAUSE = 'video_pause',
65
+ VIDEO_UNPAUSE = 'video_unpause',
66
+ PLAYER_CLOSE = 'player_close',
67
+ PLAYER_OPEN = 'player_open',
68
+ SEARCH_SUCCESS = 'search_success',
69
+ SEARCH_FAILED = 'search_failed',
70
+ FAVORITE_ADD = 'favorite_add',
71
+ FAVORITE_REMOVE = 'favorite_remove',
72
+ }
73
+
74
+ export enum TrackEventType {
75
+ VIEW = 'view',
76
+ ACTIVITY = 'activity',
77
+ }
78
+
79
+ export const TRIGGER_NAME_TO_TEALIUM_EVENTS: { [K in AnalyticsTriggers]?: EVENTS[]; } = {
80
+ [AnalyticsTriggers.SCENE_VIEW]: [EVENTS.SCENE_VIEW],
81
+ [AnalyticsTriggers.PLAYBACK_10]: [EVENTS.VIDEO_PROGRESS],
82
+ [AnalyticsTriggers.PLAYBACK_50]: [EVENTS.VIDEO_PROGRESS],
83
+ [AnalyticsTriggers.PLAYBACK_90]: [EVENTS.VIDEO_PROGRESS],
84
+ [AnalyticsTriggers.PLAYBACK_PAUSE]: [EVENTS.VIDEO_PAUSE],
85
+ [AnalyticsTriggers.PLAYBACK_START]: [EVENTS.VIDEO_START],
86
+ [AnalyticsTriggers.PLAYBACK_STOP]: [EVENTS.VIDEO_STOP],
87
+ [AnalyticsTriggers.PLAYER_CLOSE]: [EVENTS.PLAYER_CLOSE],
88
+ [AnalyticsTriggers.PLAYER_OPEN]: [EVENTS.PLAYER_OPEN],
89
+ [AnalyticsTriggers.APP_CLOSE]: [EVENTS.VIDEO_STOP, EVENTS.PLAYER_CLOSE],
90
+ [AnalyticsTriggers.FAVORITE_ADD]: [EVENTS.FAVORITE_ADD],
91
+ [AnalyticsTriggers.FAVORITE_REMOVE]: [EVENTS.FAVORITE_REMOVE],
92
+ [AnalyticsTriggers.SEARCH]: [EVENTS.SEARCH_SUCCESS, EVENTS.SEARCH_FAILED],
93
+ };
94
+
95
+ export const HUNDRED_PERCENT = 100;
@@ -0,0 +1,2 @@
1
+ export { TealiumAnalytics } from './TealiumAnalytics';
2
+ export { TEALIUM_TRIGGERS } from './constants';
@@ -0,0 +1,31 @@
1
+ import {
2
+ EVENTS,
3
+ } from './constants';
4
+ import { mapSceneView } from './mappers/mapSceneView';
5
+ import { mapVideoProgress } from './mappers/mapVideoProgress';
6
+ import { mapVideoStop } from './mappers/mapVideoStop';
7
+ import { mapPlayerOpen } from './mappers/mapPlayerOpen';
8
+ import { mapPlayerClose } from './mappers/mapPlayerClose';
9
+ import { mapVideoStart } from './mappers/mapVideoStart';
10
+ import { mapVideoPause } from './mappers/mapVideoPause';
11
+ import { mapFavoriteAdd } from './mappers/mapFavoriteAdd';
12
+ import { mapFavoriteRemove } from './mappers/mapFavoriteRemove';
13
+ import { mapVideoResume } from './mappers/mapVideoResume';
14
+ import { mapSearchSuccess } from './mappers/mapSearchSuccess';
15
+ import { mapSearchFailed } from './mappers/mapSearchFailed';
16
+ import { EventMappingFunction } from './types';
17
+
18
+ export const EVENTS_MAPPING: Record<EVENTS, EventMappingFunction> = {
19
+ [EVENTS.SCENE_VIEW]: mapSceneView,
20
+ [EVENTS.PLAYER_OPEN]: mapPlayerOpen,
21
+ [EVENTS.PLAYER_CLOSE]: mapPlayerClose,
22
+ [EVENTS.VIDEO_START]: mapVideoStart,
23
+ [EVENTS.VIDEO_STOP]: mapVideoStop,
24
+ [EVENTS.VIDEO_PROGRESS]: mapVideoProgress,
25
+ [EVENTS.VIDEO_PAUSE]: mapVideoPause,
26
+ [EVENTS.FAVORITE_ADD]: mapFavoriteAdd,
27
+ [EVENTS.FAVORITE_REMOVE]: mapFavoriteRemove,
28
+ [EVENTS.VIDEO_UNPAUSE]: mapVideoResume,
29
+ [EVENTS.SEARCH_SUCCESS]: mapSearchSuccess,
30
+ [EVENTS.SEARCH_FAILED]: mapSearchFailed,
31
+ };
@@ -0,0 +1,40 @@
1
+ import { Payload } from '../../types';
2
+
3
+ export const MEDIA_PAYLOAD: Payload = {
4
+ duration: 120,
5
+ currentTime: 60,
6
+ title: 'Test Video',
7
+ url: 'https://example.com/video',
8
+ contentType: 'video/mp4',
9
+ externalId: '',
10
+ percent: 2,
11
+ provider: 'provider',
12
+ assetId: '12345',
13
+ app_id: 'app_id',
14
+ app_type: 'app_type',
15
+ sceneName: '',
16
+ sceneId: '',
17
+ sceneType: '',
18
+ sessionId: 1,
19
+ sessionNumber: 1,
20
+ userId: '10',
21
+ userProfileId: 'a1',
22
+ applicationId: 'app',
23
+ appVersion: 'v1.0',
24
+ deviceId: 'ott',
25
+ deviceType: 'smarttv',
26
+ search: '',
27
+ };
28
+
29
+ export const TEALIUM_MEDIA_PAYLOAD = {
30
+ article_uid: '12345',
31
+ byline: 'N/A',
32
+ canonical_url: 'https://example.com/video',
33
+ media_type: 'video/mp4',
34
+ pub_date: '',
35
+ tags: '',
36
+ video_length: 120,
37
+ video_name: 'Test Video',
38
+ video_position: 60,
39
+ video_series_title: '',
40
+ };
@@ -0,0 +1,21 @@
1
+ import { Payload, MediaResult } from '../types';
2
+
3
+ export const mapMediaPayload = (
4
+ payload: Payload,
5
+ ): MediaResult => {
6
+ const {
7
+ duration, currentTime, title, url, contentType, assetId,
8
+ } = payload;
9
+ return {
10
+ video_name: title || '',
11
+ video_length: duration,
12
+ video_position: currentTime,
13
+ media_type: contentType,
14
+ canonical_url: url,
15
+ video_series_title: '',
16
+ byline: 'N/A',
17
+ pub_date: '',
18
+ article_uid: assetId,
19
+ tags: '',
20
+ };
21
+ };
@@ -0,0 +1,11 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { CoreResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+
5
+ export const mapFavoriteAdd = (
6
+ triggerName: AnalyticsTriggers,
7
+ ): CoreResult => ({
8
+ app_events: AppEvents.favorite_add,
9
+ event_trigger: triggerName,
10
+ track_event_type: TrackEventType.ACTIVITY,
11
+ });
@@ -0,0 +1,11 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { CoreResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+
5
+ export const mapFavoriteRemove = (
6
+ triggerName: AnalyticsTriggers,
7
+ ): CoreResult => ({
8
+ app_events: AppEvents.favorite_remove,
9
+ event_trigger: triggerName,
10
+ track_event_type: TrackEventType.ACTIVITY,
11
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, VideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapPlayerClose = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): VideoResult => ({
10
+ app_events: AppEvents.player_close,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.player_close,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, VideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapPlayerOpen = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): VideoResult => ({
10
+ app_events: AppEvents.player_open,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.player_open,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, SceneViewResult } from '../types';
3
+ import { TrackEventType } from '../constants';
4
+
5
+ export const mapSceneView = (
6
+ triggerName: AnalyticsTriggers,
7
+ payload: Payload,
8
+ ): SceneViewResult | undefined => ({
9
+ event_trigger: AnalyticsTriggers.SCENE_VIEW,
10
+ track_event_type: TrackEventType.VIEW,
11
+ page_title: payload.sceneType || '',
12
+ content_type: payload.sceneType || '',
13
+ section: payload.sceneType || '',
14
+ categories: payload.sceneName,
15
+ });
@@ -0,0 +1,13 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, SearchResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+
5
+ export const mapSearchFailed = (
6
+ triggerName: AnalyticsTriggers,
7
+ payload: Payload,
8
+ ): SearchResult => ({
9
+ app_events: AppEvents.search,
10
+ event_trigger: triggerName,
11
+ track_event_type: TrackEventType.ACTIVITY,
12
+ search_keyword: payload.search,
13
+ });
@@ -0,0 +1,13 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, SearchResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+
5
+ export const mapSearchSuccess = (
6
+ triggerName: AnalyticsTriggers,
7
+ payload: Payload,
8
+ ): SearchResult => ({
9
+ app_events: AppEvents.search,
10
+ event_trigger: triggerName,
11
+ track_event_type: TrackEventType.ACTIVITY,
12
+ search_keyword: payload.search,
13
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, VideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoPause = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): VideoResult => ({
10
+ app_events: AppEvents.playback_pause,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.playback_pause,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,18 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, VideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoProgress = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): VideoResult => {
10
+ const appEvent = AppEvents[triggerName.toLowerCase()];
11
+ return {
12
+ app_events: appEvent,
13
+ event_trigger: triggerName,
14
+ track_event_type: TrackEventType.ACTIVITY,
15
+ video_event: appEvent,
16
+ ...(mapMediaPayload(payload)),
17
+ };
18
+ };
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, VideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoResume = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): VideoResult => ({
10
+ app_events: AppEvents.unpause,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.unpause,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, VideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoStart = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): VideoResult => ({
10
+ app_events: AppEvents.playback_start,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.playback_start,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,15 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import { Payload, VideoResult } from '../types';
3
+ import { AppEvents, TrackEventType } from '../constants';
4
+ import { mapMediaPayload } from './helper';
5
+
6
+ export const mapVideoStop = (
7
+ triggerName: AnalyticsTriggers,
8
+ payload: Payload,
9
+ ): VideoResult => ({
10
+ app_events: AppEvents.playback_stop,
11
+ event_trigger: triggerName,
12
+ track_event_type: TrackEventType.ACTIVITY,
13
+ video_event: AppEvents.playback_stop,
14
+ ...(mapMediaPayload(payload)),
15
+ });
@@ -0,0 +1,136 @@
1
+ import { AnalyticsTriggers } from '@24i/appstage-shared-analytics';
2
+ import type { AnyPayload, UserInfo, AppInfo } from '../../interface';
3
+
4
+ export interface UtagWindow {
5
+ utag_cfg_ovrd?: {
6
+ noview: boolean;
7
+ };
8
+ utag_data?: {};
9
+ utag?: {
10
+ track: (eventName: string, payload?: AnyPayload) => {};
11
+ }
12
+ }
13
+
14
+ export type TealiumAnalyticsOptions = {
15
+ account: string, // e.g: 'bbg'
16
+ profile: string, // e.g: 'main'
17
+ environment: string, // e.g: 'dev'
18
+ app_type: string, // e.g. 'HTML5' for bigscreen
19
+ entity: string, // e.g: 'rfe'
20
+ language: string, // e.g: 'russian'
21
+ short_language_service: string, // e.g: 'rus'
22
+ property_id: number, // e.g: 414
23
+ };
24
+
25
+ export type TealiumAnalyticsConfiguration = {
26
+ name: string, // Telium
27
+ baseURL: string, // e.g: 'https://collect.tealiumiq.com/event',
28
+ enabled: boolean,
29
+ options: TealiumAnalyticsOptions,
30
+ };
31
+
32
+ export interface CorePayload {
33
+ app_id: string;
34
+ app_type: string;
35
+ }
36
+ export interface MediaPayload {
37
+ title: string;
38
+ externalId: string;
39
+ contentType: string;
40
+ currentTime: number;
41
+ duration: number;
42
+ percent: number;
43
+ assetId: string;
44
+ provider: string,
45
+ url: string;
46
+ }
47
+
48
+ export interface SessionInfo {
49
+ sessionId: number;
50
+ sessionNumber: number;
51
+ }
52
+
53
+ export interface DeviceInfo {
54
+ appVersion: string,
55
+ manufacturer: string,
56
+ platform: string,
57
+ platformVersion: string,
58
+ deviceId: string,
59
+ }
60
+
61
+ export interface SceneInfo {
62
+ sceneName: string,
63
+ sceneId: string,
64
+ sceneType?: string,
65
+ }
66
+
67
+ export interface SearchInfo {
68
+ search?: string,
69
+ }
70
+
71
+ export type Payload = CorePayload &
72
+ SceneInfo &
73
+ SessionInfo &
74
+ MediaPayload &
75
+ UserInfo &
76
+ AppInfo &
77
+ SearchInfo;
78
+
79
+ export type EventBody = AnyPayload;
80
+
81
+ export type EventMappingFunction = (
82
+ triggerName: AnalyticsTriggers,
83
+ payload: Payload
84
+ ) => AnyPayload | void;
85
+
86
+ export type BaseResult = {
87
+ language: string;
88
+ language_service: string;
89
+ entity: string;
90
+ property_id: string;
91
+ short_language_service: string;
92
+ platform_short: string;
93
+ platform_type: string;
94
+ app_type: string;
95
+ ott_type: string;
96
+ app_id: string;
97
+ };
98
+
99
+ export type CoreResult = {
100
+ event_trigger: string,
101
+ track_event_type: string,
102
+ app_events?: string,
103
+ video_event?: string,
104
+ };
105
+
106
+ export type SceneViewResult = CoreResult & {
107
+ page_title: string,
108
+ content_type: string,
109
+ section: string,
110
+ categories: string,
111
+ };
112
+
113
+ export type MediaResult = {
114
+ video_name: string,
115
+ video_length: number,
116
+ video_position: number,
117
+ media_type: string,
118
+ canonical_url: string,
119
+ video_series_title?: string,
120
+ byline?: string,
121
+ pub_date?: string,
122
+ article_uid?: string,
123
+ tags?: string,
124
+ };
125
+
126
+ export type VideoResult = CoreResult & MediaResult;
127
+
128
+ export type PlayerOpenResult = CoreResult & {
129
+ thing_id: string;
130
+ source_page: string;
131
+ source_rail?: string | null;
132
+ };
133
+
134
+ export type SearchResult = CoreResult & {
135
+ search_keyword?: string;
136
+ };
@@ -8,7 +8,7 @@ import {
8
8
  } from './constants';
9
9
  import { EVENTS_MAPPING } from './interface';
10
10
  import type { AnalyticsClient, AnyPayload } from '../../interface';
11
- import { generateSessionId } from './generateSessionId';
11
+ import { generateSessionId } from '../../utils/generateSessionId';
12
12
  import { CorePayload, DeviceInfo, EventBody, Payload, SessionInfo } from './types';
13
13
 
14
14
  // eslint-disable-next-line no-magic-numbers
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.main = void 0;
5
+ const path = require("path");
6
+ const fs = require("fs");
7
+ const fse = require("fs-extra");
8
+ const chalk = require("chalk");
9
+ const minimist = require("minimist");
10
+ const questions_1 = require("./questionnaire/questions");
11
+ const Settings_1 = require("./settings/Settings");
12
+ async function isDirectoryEmpty(dirPath) {
13
+ const files = await fs.promises.readdir(dirPath);
14
+ return !files.length;
15
+ }
16
+ async function copyTemplateFiles(templateDir, targetDir) {
17
+ return fse.copy(templateDir, targetDir);
18
+ }
19
+ function updatePackageJsonFile(filePath, options) {
20
+ let data = fs.readFileSync(filePath, 'utf8');
21
+ const keywords = options.keywords.map((word) => `"${word}"`).join(', ');
22
+ data = data.replace(/("name": ")(.*)(")/, `$1${options.name}$3`);
23
+ data = data.replace(/("version": ")(.*)(")/, `$1${options.version}$3`);
24
+ data = data.replace(/("description": ")(.*)(")/, `$1${options.description}$3`);
25
+ data = data.replace(/("keywords": \[)(.*)(\])/, `$1${keywords}$3`);
26
+ data = data.replace(/("author": ")(.*)(")/, `$1${options.author}$3`);
27
+ fs.writeFileSync(filePath, data);
28
+ }
29
+ function parseArguments(rawArgv) {
30
+ const argv = minimist(rawArgv.slice(2));
31
+ const dirName = argv._[0];
32
+ if (!dirName) {
33
+ console.error('Error: Missing package name');
34
+ process.exit(1);
35
+ }
36
+ return {
37
+ dirName,
38
+ };
39
+ }
40
+ async function main() {
41
+ const { dirName: destDirName } = parseArguments(process.argv);
42
+ const destDir = path.join(process.cwd(), 'packages/', destDirName);
43
+ if (fs.existsSync(destDir)) {
44
+ console.error(`Error: Target directory "${destDir}" already exists`);
45
+ process.exit(1);
46
+ }
47
+ fs.mkdirSync(destDir, { recursive: true });
48
+ const isDirEmpty = await isDirectoryEmpty(destDir);
49
+ if (!isDirEmpty) {
50
+ console.error(`Error: Target directory "${destDir}" is not empty.`);
51
+ process.exit(1);
52
+ }
53
+ const settings = Object.assign({}, Settings_1.Settings);
54
+ settings.name = `${Settings_1.Settings.name}${destDirName}`.toLowerCase();
55
+ const details = await (0, questions_1.promptPackageDetails)(settings);
56
+ const templateDir = path.join(__dirname, '..', 'templates/typescript');
57
+ await copyTemplateFiles(templateDir, destDir);
58
+ const packageJsonFile = path.join(destDir, 'package.json');
59
+ updatePackageJsonFile(packageJsonFile, details);
60
+ const docsSymlinkTarget = path.join('../../../packages/', destDirName, '/README.md');
61
+ const docsSymlinkPath = path.join(process.cwd(), 'docs/packages/', destDirName, '/README.md');
62
+ await fse.ensureSymlink(docsSymlinkTarget, docsSymlinkPath);
63
+ console.log(`${chalk.green('Success')}, package has been initialized!`);
64
+ }
65
+ exports.main = main;
66
+ //# sourceMappingURL=createPackage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createPackage.js","sourceRoot":"","sources":["../src/createPackage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const createPackage_1 = require("./createPackage");
4
+ (0, createPackage_1.main)();
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,mDAAuC;AAEvC,IAAA,oBAAI,GAAE,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.promptPackageDetails = void 0;
4
+ const inquirer = require("inquirer");
5
+ async function promptPackageDetails(defaultValues) {
6
+ return inquirer.prompt([
7
+ {
8
+ type: 'input',
9
+ name: 'name',
10
+ message: 'Package name:',
11
+ default: defaultValues.name,
12
+ }, {
13
+ type: 'input',
14
+ name: 'version',
15
+ message: 'Version:',
16
+ default: defaultValues.version,
17
+ }, {
18
+ type: 'input',
19
+ name: 'description',
20
+ message: 'Description:',
21
+ }, {
22
+ type: 'input',
23
+ name: 'keywords',
24
+ message: 'Keywords:',
25
+ filter: (ans) => ans.split(/[\s,]+/),
26
+ }, {
27
+ type: 'input',
28
+ name: 'author',
29
+ message: 'Author:',
30
+ default: defaultValues.author,
31
+ },
32
+ ]);
33
+ }
34
+ exports.promptPackageDetails = promptPackageDetails;
35
+ //# sourceMappingURL=questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/questionnaire/questions.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AAWrC,KAAK,UAAU,oBAAoB,CAAC,aAA4C;IAC5E,OAAO,QAAQ,CAAC,MAAM,CAAC;QACnB;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,aAAa,CAAC,IAAI;SAC9B,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,aAAa,CAAC,OAAO;SACjC,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,cAAc;SAC1B,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;SACvC,EAAE;YACC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,aAAa,CAAC,MAAM;SAChC;KACJ,CAAC,CAAC;AACP,CAAC;AAEQ,oDAAoB"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Settings = void 0;
4
+ const Settings = {
5
+ name: '@24i/smartapps-bigscreen-',
6
+ version: '0.0.1',
7
+ author: '24i',
8
+ };
9
+ exports.Settings = Settings;
10
+ //# sourceMappingURL=Settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Settings.js","sourceRoot":"","sources":["../../src/settings/Settings.ts"],"names":[],"mappings":";;;AAAA,MAAM,QAAQ,GAAG;IACb,IAAI,EAAE,2BAA2B;IACjC,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,KAAK;CAChB,CAAC;AAEO,4BAAQ"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ import { KeyMatrixCell } from '../../types';
3
+
4
+ const keyboardLayout = [
5
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.'],
6
+ ['ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س'],
7
+ ['ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م'],
8
+ ['ن', 'ه', 'و', 'ي', 'ء', 'آ', 'إ', 'ة', 'ؤ', 'ئ', 'ى', 'أ'],
9
+ ];
10
+
11
+ /* eslint-disable max-len */
12
+ const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
13
+ ['', '', ...layout[0], 'backspace', 'backspace'],
14
+ ['abc', 'abc', ...layout[1], 'clear', 'clear'],
15
+ ['special', 'special', ...layout[2], 'left', 'right'],
16
+ ['', '', ...layout[3], '', ''],
17
+ [
18
+ ...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
19
+ 'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
20
+ ];
21
+
22
+ export const arabic = {
23
+ className: 'wide',
24
+ keyText: 'ابت',
25
+ layout: keyboardLayout,
26
+ makeFocusStrings,
27
+ };
@@ -0,0 +1,27 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ import { KeyMatrixCell } from '../../types';
3
+
4
+ const keyboardLayout = [
5
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
6
+ ['က', 'ခ', 'ဂ', 'ဃ', 'င', 'စ', 'ဆ', 'ဇ', 'စ်', 'ည', 'ဋ'],
7
+ ['႒', 'ဍ', 'ဏ', 'တ', 'ထ', 'ဒ', 'ဓ', 'န', 'ပ', 'ဖ', 'ဗ'],
8
+ ['ဘ', 'မ', 'ယ', 'ရ', 'လ', 'ဝ', 'သ', 'ဟ', 'ဠ', 'အ', '-'],
9
+ ];
10
+
11
+ /* eslint-disable max-len */
12
+ const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
13
+ ['', '', ...layout[0], 'backspace', 'backspace'],
14
+ ['abc', 'abc', ...layout[1], 'clear', 'clear'],
15
+ ['special', 'special', ...layout[2], 'left', 'right'],
16
+ ['', '', ...layout[3], '', ''],
17
+ [
18
+ ...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
19
+ 'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
20
+ ];
21
+
22
+ export const burmese = {
23
+ className: 'wide',
24
+ keyText: 'ကခဂ',
25
+ layout: keyboardLayout,
26
+ makeFocusStrings,
27
+ };
@@ -0,0 +1,28 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ import { KeyMatrixCell } from '../../types';
3
+
4
+ const keyboardLayout = [
5
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
6
+ ['ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ'],
7
+ ['ر', 'ز', 'ژ', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ'],
8
+ ['ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', 'و', 'ه', 'ی', '-'],
9
+
10
+ ];
11
+
12
+ /* eslint-disable max-len */
13
+ const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
14
+ ['', '', ...layout[0], 'backspace', 'backspace'],
15
+ ['abc', 'abc', ...layout[1], 'clear', 'clear'],
16
+ ['special', 'special', ...layout[2], 'left', 'right'],
17
+ ['', '', ...layout[3], '', ''],
18
+ [
19
+ ...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
20
+ 'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
21
+ ];
22
+
23
+ export const dari = {
24
+ className: 'wide',
25
+ keyText: 'ابپ',
26
+ layout: keyboardLayout,
27
+ makeFocusStrings,
28
+ };
@@ -1,8 +1,14 @@
1
+ export { arabic } from './arabic';
2
+ export { burmese } from './burmese';
3
+ export { dari } from './dari';
1
4
  export { hebrew } from './hebrew';
2
5
  export { korean } from './korean';
3
6
  export { latin } from './latin';
7
+ export { pashto } from './pashto';
8
+ export { persian } from './persian';
4
9
  export { russian } from './russian';
5
10
  export { special } from './special';
6
11
  export { tibetan } from './tibetan';
7
12
  export { turkish } from './turkish';
13
+ export { ukrainian } from './ukrainian';
8
14
  export { urdu } from './urdu';
@@ -0,0 +1,27 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ import { KeyMatrixCell } from '../../types';
3
+
4
+ const keyboardLayout = [
5
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
6
+ ['ا', 'ب', 'پ', 'ت', 'ث', 'ج', 'چ', 'ح', 'خ', 'د', 'ذ'],
7
+ ['ر', 'ز', 'ژ', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ'],
8
+ ['ف', 'ق', 'ک', 'گ', 'ل', 'م', 'ن', 'و', 'ه', 'ی', '-'],
9
+ ];
10
+
11
+ /* eslint-disable max-len */
12
+ const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
13
+ ['', '', ...layout[0], 'backspace', 'backspace'],
14
+ ['abc', 'abc', ...layout[1], 'clear', 'clear'],
15
+ ['special', 'special', ...layout[2], 'left', 'right'],
16
+ ['', '', ...layout[3], '', ''],
17
+ [
18
+ ...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
19
+ 'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
20
+ ];
21
+
22
+ export const pashto = {
23
+ className: 'wide',
24
+ keyText: 'ابپ',
25
+ layout: keyboardLayout,
26
+ makeFocusStrings,
27
+ };
@@ -0,0 +1,27 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ import { KeyMatrixCell } from '../../types';
3
+
4
+ const keyboardLayout = [
5
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.'],
6
+ ['ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س'],
7
+ ['ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م'],
8
+ ['ن', 'ه', 'و', 'ي', 'ء', 'آ', 'إ', 'ة', 'ؤ', 'ئ', 'ى', 'أ'],
9
+ ];
10
+
11
+ /* eslint-disable max-len */
12
+ const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
13
+ ['', '', ...layout[0], 'backspace', 'backspace'],
14
+ ['abc', 'abc', ...layout[1], 'clear', 'clear'],
15
+ ['special', 'special', ...layout[2], 'left', 'right'],
16
+ ['', '', ...layout[3], '', ''],
17
+ [
18
+ ...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
19
+ 'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
20
+ ];
21
+
22
+ export const persian = {
23
+ className: 'wide',
24
+ keyText: 'ابپ',
25
+ layout: keyboardLayout,
26
+ makeFocusStrings,
27
+ };
@@ -0,0 +1,27 @@
1
+ /* eslint-disable no-magic-numbers */
2
+ import { KeyMatrixCell } from '../../types';
3
+
4
+ const keyboardLayout = [
5
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
6
+ ['а', 'б', 'в', 'г', 'ґ', 'д', 'е', 'є', 'ж', 'з', 'и'],
7
+ ['і', 'ї', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с'],
8
+ ['т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ю', 'я'],
9
+ ];
10
+
11
+ /* eslint-disable max-len */
12
+ const makeFocusStrings = (layout: KeyMatrixCell[][], hasLanguageLayout: boolean) => [
13
+ ['', '', ...layout[0], 'backspace', 'backspace'],
14
+ ['abc', 'abc', ...layout[1], 'clear', 'clear'],
15
+ ['special', 'special', ...layout[2], 'left', 'right'],
16
+ ['', '', ...layout[3], '', ''],
17
+ [
18
+ ...(hasLanguageLayout ? ['language', 'language'] : ['', '']),
19
+ 'shift', 'shift', 'space', 'space', 'space', 'space', 'space', 'space', 'space', 'domain', 'domain', 'continue', 'continue'],
20
+ ];
21
+
22
+ export const ukrainian = {
23
+ className: 'wide',
24
+ keyText: 'абв',
25
+ layout: keyboardLayout,
26
+ makeFocusStrings,
27
+ };
@@ -6,7 +6,7 @@ export const isPathVisible = (hash: string, regexpPath?: RegExp) => (
6
6
 
7
7
  export const getCurrentHash = () => window.location.href.split('#')[1] || '';
8
8
 
9
- const PARAM = '([a-zA-Z0-9-=.:%_()\\[\\]{}]+)';
9
+ const PARAM = '([a-zA-Z0-9+-=.:%_()\\[\\]{}]+)';
10
10
 
11
11
  export const pathToRegExp = (path: string) => {
12
12
  const regexpParts: string[] = [];
@@ -1,8 +0,0 @@
1
- /* eslint-disable no-magic-numbers */
2
- /**
3
- * Recommended way to generate session id by Google.
4
- * Blackbox
5
- */
6
- export const generateSessionId = () => (
7
- Math.floor(Math.random() * (2147483647 - 0 + 1) + 0)
8
- );