incyclist-services 1.7.81 → 1.7.82

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.
@@ -389,6 +389,13 @@ let RouteCard = (() => {
389
389
  showNextOverwrite = false;
390
390
  }
391
391
  }
392
+ if (showNextOverwrite) {
393
+ const nextVideoEnabled = this.isMobile() ? this.getAppState().hasFeature('MOBILE_NEXT_VIDEO') : true;
394
+ if (!nextVideoEnabled) {
395
+ showNextOverwrite = false;
396
+ uiSettings.nextOverwrite = true;
397
+ }
398
+ }
392
399
  }
393
400
  catch (err) {
394
401
  this.logError(err, 'openSettings');
@@ -540,6 +547,7 @@ let RouteCard = (() => {
540
547
  start() {
541
548
  try {
542
549
  const service = (0, service_1.getRouteList)();
550
+ this.enforceNextVideoOverrideOnMobile();
543
551
  service.select(this.route);
544
552
  service.setStartSettings({ type: this.getCardType(), ...this.startSettings });
545
553
  this.route.description.tsLastStart = Date.now();
@@ -556,6 +564,7 @@ let RouteCard = (() => {
556
564
  addWorkout() {
557
565
  try {
558
566
  const service = (0, service_1.getRouteList)();
567
+ this.enforceNextVideoOverrideOnMobile();
559
568
  service.select(this.route);
560
569
  service.setStartSettings({ type: this.getCardType(), ...this.startSettings });
561
570
  this.route.description.tsLastStart = Date.now();
@@ -565,6 +574,21 @@ let RouteCard = (() => {
565
574
  this.logError(err, 'addWorkout');
566
575
  }
567
576
  }
577
+ enforceNextVideoOverrideOnMobile() {
578
+ try {
579
+ if (!this.isMobile())
580
+ return;
581
+ if (!this.startSettings || !(0, route_1.hasNextVideo)(this.route))
582
+ return;
583
+ const nextVideoEnabled = this.getAppState().hasFeature('MOBILE_NEXT_VIDEO');
584
+ if (!nextVideoEnabled) {
585
+ this.startSettings.nextOverwrite = true;
586
+ }
587
+ }
588
+ catch (err) {
589
+ this.logError(err, 'enforceNextVideoOverrideOnMobile');
590
+ }
591
+ }
568
592
  getCurrentDownload() {
569
593
  return this.downloadObserver;
570
594
  }
@@ -145,6 +145,10 @@ let WorkoutListService = (() => {
145
145
  }
146
146
  close() {
147
147
  this.getWorkoutCalendar().setActive(false);
148
+ this.logEvent({ message: 'close workout list' });
149
+ this.emit('closed', this.observer);
150
+ this.observer?.emit('stopped');
151
+ this.observer?.reset();
148
152
  }
149
153
  openSettings() {
150
154
  let workouts;
@@ -43,6 +43,7 @@ const observer_1 = require("../../base/types/observer");
43
43
  const settings_1 = require("../../settings");
44
44
  const calendar_1 = require("../calendar");
45
45
  const service_1 = require("../list/service");
46
+ const devices_1 = require("../../devices");
46
47
  const DEFAULT_IMPORT_GROUP = 'My Workouts';
47
48
  const UPCOMING_COLLAPSED_COUNT = 3;
48
49
  let WorkoutListPageService = (() => {
@@ -52,6 +53,7 @@ let WorkoutListPageService = (() => {
52
53
  let _classThis;
53
54
  let _classSuper = pages_1.IncyclistPageService;
54
55
  let _instanceExtraInitializers = [];
56
+ let _getDevicePairing_decorators;
55
57
  let _getWorkoutList_decorators;
56
58
  let _getWorkoutCalendar_decorators;
57
59
  let _getUserSettings_decorators;
@@ -60,10 +62,12 @@ let WorkoutListPageService = (() => {
60
62
  static { _classThis = this; }
61
63
  static {
62
64
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
65
+ _getDevicePairing_decorators = [decorators_1.Injectable];
63
66
  _getWorkoutList_decorators = [decorators_1.Injectable];
64
67
  _getWorkoutCalendar_decorators = [decorators_1.Injectable];
65
68
  _getUserSettings_decorators = [decorators_1.Injectable];
66
69
  _getAppState_decorators = [decorators_1.Injectable];
70
+ __esDecorate(this, null, _getDevicePairing_decorators, { kind: "method", name: "getDevicePairing", static: false, private: false, access: { has: obj => "getDevicePairing" in obj, get: obj => obj.getDevicePairing }, metadata: _metadata }, null, _instanceExtraInitializers);
67
71
  __esDecorate(this, null, _getWorkoutList_decorators, { kind: "method", name: "getWorkoutList", static: false, private: false, access: { has: obj => "getWorkoutList" in obj, get: obj => obj.getWorkoutList }, metadata: _metadata }, null, _instanceExtraInitializers);
68
72
  __esDecorate(this, null, _getWorkoutCalendar_decorators, { kind: "method", name: "getWorkoutCalendar", static: false, private: false, access: { has: obj => "getWorkoutCalendar" in obj, get: obj => obj.getWorkoutCalendar }, metadata: _metadata }, null, _instanceExtraInitializers);
69
73
  __esDecorate(this, null, _getUserSettings_decorators, { kind: "method", name: "getUserSettings", static: false, private: false, access: { has: obj => "getUserSettings" in obj, get: obj => obj.getUserSettings }, metadata: _metadata }, null, _instanceExtraInitializers);
@@ -264,9 +268,15 @@ let WorkoutListPageService = (() => {
264
268
  const card = this.findWorkoutCard(id);
265
269
  if (!card)
266
270
  return;
267
- const settings = this.getWorkoutList().getStartSettings();
271
+ const service = this.getWorkoutList();
272
+ const pairing = this.getDevicePairing();
273
+ const settings = service.getStartSettings() ?? {};
268
274
  card.select({ ...settings, noRoute: opts?.noRoute });
269
- this.getPageObserver()?.emit('start-ride', { id, noRoute: opts?.noRoute });
275
+ this.logEvent({ message: 'Attempting to start a ride', id, ...settings, noRoute: opts?.noRoute, readyToStart: pairing.isReadyToStart(), });
276
+ this.detailWorkoutId = null;
277
+ service.close();
278
+ const next = pairing.isReadyToStart() ? '/rideDeviceOK' : '/pairingStart';
279
+ this.moveTo(next);
270
280
  }
271
281
  catch (err) {
272
282
  this.logError(err, 'onStart');
@@ -455,6 +465,9 @@ let WorkoutListPageService = (() => {
455
465
  this.logError(err, 'emitImportUpdate');
456
466
  }
457
467
  }
468
+ getDevicePairing() {
469
+ return (0, devices_1.useDevicePairing)();
470
+ }
458
471
  getWorkoutList() {
459
472
  return (0, service_1.useWorkoutList)();
460
473
  }
@@ -77,7 +77,6 @@ let WorkoutRidePageService = (() => {
77
77
  backgroundTimer;
78
78
  backgroundPausedByService = false;
79
79
  menuProps = null;
80
- isInitialized = false;
81
80
  constructor() {
82
81
  super('WorkoutRidePage');
83
82
  this.rideEventHandler['state-update'] = this.onRideStateUpdate.bind(this);
@@ -95,10 +94,6 @@ let WorkoutRidePageService = (() => {
95
94
  super.openPage();
96
95
  try {
97
96
  const service = this.getRideDisplay();
98
- if (!this.isInitialized) {
99
- service.init();
100
- this.isInitialized = true;
101
- }
102
97
  this.registerRideEventHandlers();
103
98
  this.subscribeToWorkoutObserver();
104
99
  service.start(simulate);
@@ -120,7 +115,6 @@ let WorkoutRidePageService = (() => {
120
115
  this.unregisterRideEventHandlers();
121
116
  this.unsubscribeFromWorkoutObserver();
122
117
  this.menuProps = null;
123
- this.isInitialized = false;
124
118
  super.closePage();
125
119
  }
126
120
  catch (err) {
@@ -314,19 +308,15 @@ let WorkoutRidePageService = (() => {
314
308
  switch (state) {
315
309
  case 'Paused':
316
310
  this.menuProps = { showResume: true, ...this.getStepFlags() };
317
- this.updatePageDisplay();
318
311
  break;
319
312
  case 'Active':
320
313
  this.menuProps = null;
321
- this.updatePageDisplay();
322
314
  break;
323
315
  case 'Finished':
324
316
  this.emitNavigateBack();
325
- break;
326
- case 'Error':
327
- this.updatePageDisplay();
328
- break;
317
+ return;
329
318
  }
319
+ this.updatePageDisplay();
330
320
  }
331
321
  onWorkoutUpdate() {
332
322
  this.updatePageDisplay();
@@ -373,7 +363,8 @@ let WorkoutRidePageService = (() => {
373
363
  }
374
364
  const bars = (0, graph_1.getWorkoutGraphSeries)(current, { ftp, absValues: true });
375
365
  const lastBarX = bars.length ? bars.at(-1).x : 0;
376
- const maxX = Math.max(this.getLastLogTime(), lastBarX, current.duration ?? 0);
366
+ const maxXCandidates = [this.getLastLogTime(), lastBarX, current.duration ?? 0].filter(Number.isFinite);
367
+ const maxX = maxXCandidates.length ? Math.max(...maxXCandidates) : 0;
377
368
  const maxBarPower = bars.length ? Math.max(...bars.map(b => b.y)) : 0;
378
369
  return {
379
370
  bars,
@@ -43,7 +43,7 @@ import { valid } from "../../../utils/valid";
43
43
  import { waitNextTick } from "../../../utils";
44
44
  import { useRouteDownload } from "../../download/service";
45
45
  import { EventLogger } from "gd-eventlog";
46
- import { checkIsLoop, getNextVideoId, getPosition, updateSlopes } from "../../base/utils/route";
46
+ import { checkIsLoop, getNextVideoId, hasNextVideo, getPosition, updateSlopes } from "../../base/utils/route";
47
47
  import { getWorkoutList } from "../../../workouts";
48
48
  import { checkIsNew } from "../utils";
49
49
  import { useOnlineStatusMonitoring } from "../../../monitoring";
@@ -386,6 +386,13 @@ let RouteCard = (() => {
386
386
  showNextOverwrite = false;
387
387
  }
388
388
  }
389
+ if (showNextOverwrite) {
390
+ const nextVideoEnabled = this.isMobile() ? this.getAppState().hasFeature('MOBILE_NEXT_VIDEO') : true;
391
+ if (!nextVideoEnabled) {
392
+ showNextOverwrite = false;
393
+ uiSettings.nextOverwrite = true;
394
+ }
395
+ }
389
396
  }
390
397
  catch (err) {
391
398
  this.logError(err, 'openSettings');
@@ -537,6 +544,7 @@ let RouteCard = (() => {
537
544
  start() {
538
545
  try {
539
546
  const service = getRouteList();
547
+ this.enforceNextVideoOverrideOnMobile();
540
548
  service.select(this.route);
541
549
  service.setStartSettings({ type: this.getCardType(), ...this.startSettings });
542
550
  this.route.description.tsLastStart = Date.now();
@@ -553,6 +561,7 @@ let RouteCard = (() => {
553
561
  addWorkout() {
554
562
  try {
555
563
  const service = getRouteList();
564
+ this.enforceNextVideoOverrideOnMobile();
556
565
  service.select(this.route);
557
566
  service.setStartSettings({ type: this.getCardType(), ...this.startSettings });
558
567
  this.route.description.tsLastStart = Date.now();
@@ -562,6 +571,21 @@ let RouteCard = (() => {
562
571
  this.logError(err, 'addWorkout');
563
572
  }
564
573
  }
574
+ enforceNextVideoOverrideOnMobile() {
575
+ try {
576
+ if (!this.isMobile())
577
+ return;
578
+ if (!this.startSettings || !hasNextVideo(this.route))
579
+ return;
580
+ const nextVideoEnabled = this.getAppState().hasFeature('MOBILE_NEXT_VIDEO');
581
+ if (!nextVideoEnabled) {
582
+ this.startSettings.nextOverwrite = true;
583
+ }
584
+ }
585
+ catch (err) {
586
+ this.logError(err, 'enforceNextVideoOverrideOnMobile');
587
+ }
588
+ }
565
589
  getCurrentDownload() {
566
590
  return this.downloadObserver;
567
591
  }
@@ -142,6 +142,10 @@ let WorkoutListService = (() => {
142
142
  }
143
143
  close() {
144
144
  this.getWorkoutCalendar().setActive(false);
145
+ this.logEvent({ message: 'close workout list' });
146
+ this.emit('closed', this.observer);
147
+ this.observer?.emit('stopped');
148
+ this.observer?.reset();
145
149
  }
146
150
  openSettings() {
147
151
  let workouts;
@@ -40,6 +40,7 @@ import { Observer } from "../../base/types/observer";
40
40
  import { useUserSettings } from "../../settings";
41
41
  import { useWorkoutCalendar } from "../calendar";
42
42
  import { useWorkoutList } from "../list/service";
43
+ import { useDevicePairing } from "../../devices";
43
44
  const DEFAULT_IMPORT_GROUP = 'My Workouts';
44
45
  const UPCOMING_COLLAPSED_COUNT = 3;
45
46
  let WorkoutListPageService = (() => {
@@ -49,6 +50,7 @@ let WorkoutListPageService = (() => {
49
50
  let _classThis;
50
51
  let _classSuper = IncyclistPageService;
51
52
  let _instanceExtraInitializers = [];
53
+ let _getDevicePairing_decorators;
52
54
  let _getWorkoutList_decorators;
53
55
  let _getWorkoutCalendar_decorators;
54
56
  let _getUserSettings_decorators;
@@ -57,10 +59,12 @@ let WorkoutListPageService = (() => {
57
59
  static { _classThis = this; }
58
60
  static {
59
61
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
62
+ _getDevicePairing_decorators = [Injectable];
60
63
  _getWorkoutList_decorators = [Injectable];
61
64
  _getWorkoutCalendar_decorators = [Injectable];
62
65
  _getUserSettings_decorators = [Injectable];
63
66
  _getAppState_decorators = [Injectable];
67
+ __esDecorate(this, null, _getDevicePairing_decorators, { kind: "method", name: "getDevicePairing", static: false, private: false, access: { has: obj => "getDevicePairing" in obj, get: obj => obj.getDevicePairing }, metadata: _metadata }, null, _instanceExtraInitializers);
64
68
  __esDecorate(this, null, _getWorkoutList_decorators, { kind: "method", name: "getWorkoutList", static: false, private: false, access: { has: obj => "getWorkoutList" in obj, get: obj => obj.getWorkoutList }, metadata: _metadata }, null, _instanceExtraInitializers);
65
69
  __esDecorate(this, null, _getWorkoutCalendar_decorators, { kind: "method", name: "getWorkoutCalendar", static: false, private: false, access: { has: obj => "getWorkoutCalendar" in obj, get: obj => obj.getWorkoutCalendar }, metadata: _metadata }, null, _instanceExtraInitializers);
66
70
  __esDecorate(this, null, _getUserSettings_decorators, { kind: "method", name: "getUserSettings", static: false, private: false, access: { has: obj => "getUserSettings" in obj, get: obj => obj.getUserSettings }, metadata: _metadata }, null, _instanceExtraInitializers);
@@ -261,9 +265,15 @@ let WorkoutListPageService = (() => {
261
265
  const card = this.findWorkoutCard(id);
262
266
  if (!card)
263
267
  return;
264
- const settings = this.getWorkoutList().getStartSettings();
268
+ const service = this.getWorkoutList();
269
+ const pairing = this.getDevicePairing();
270
+ const settings = service.getStartSettings() ?? {};
265
271
  card.select({ ...settings, noRoute: opts?.noRoute });
266
- this.getPageObserver()?.emit('start-ride', { id, noRoute: opts?.noRoute });
272
+ this.logEvent({ message: 'Attempting to start a ride', id, ...settings, noRoute: opts?.noRoute, readyToStart: pairing.isReadyToStart(), });
273
+ this.detailWorkoutId = null;
274
+ service.close();
275
+ const next = pairing.isReadyToStart() ? '/rideDeviceOK' : '/pairingStart';
276
+ this.moveTo(next);
267
277
  }
268
278
  catch (err) {
269
279
  this.logError(err, 'onStart');
@@ -452,6 +462,9 @@ let WorkoutListPageService = (() => {
452
462
  this.logError(err, 'emitImportUpdate');
453
463
  }
454
464
  }
465
+ getDevicePairing() {
466
+ return useDevicePairing();
467
+ }
455
468
  getWorkoutList() {
456
469
  return useWorkoutList();
457
470
  }
@@ -74,7 +74,6 @@ let WorkoutRidePageService = (() => {
74
74
  backgroundTimer;
75
75
  backgroundPausedByService = false;
76
76
  menuProps = null;
77
- isInitialized = false;
78
77
  constructor() {
79
78
  super('WorkoutRidePage');
80
79
  this.rideEventHandler['state-update'] = this.onRideStateUpdate.bind(this);
@@ -92,10 +91,6 @@ let WorkoutRidePageService = (() => {
92
91
  super.openPage();
93
92
  try {
94
93
  const service = this.getRideDisplay();
95
- if (!this.isInitialized) {
96
- service.init();
97
- this.isInitialized = true;
98
- }
99
94
  this.registerRideEventHandlers();
100
95
  this.subscribeToWorkoutObserver();
101
96
  service.start(simulate);
@@ -117,7 +112,6 @@ let WorkoutRidePageService = (() => {
117
112
  this.unregisterRideEventHandlers();
118
113
  this.unsubscribeFromWorkoutObserver();
119
114
  this.menuProps = null;
120
- this.isInitialized = false;
121
115
  super.closePage();
122
116
  }
123
117
  catch (err) {
@@ -311,19 +305,15 @@ let WorkoutRidePageService = (() => {
311
305
  switch (state) {
312
306
  case 'Paused':
313
307
  this.menuProps = { showResume: true, ...this.getStepFlags() };
314
- this.updatePageDisplay();
315
308
  break;
316
309
  case 'Active':
317
310
  this.menuProps = null;
318
- this.updatePageDisplay();
319
311
  break;
320
312
  case 'Finished':
321
313
  this.emitNavigateBack();
322
- break;
323
- case 'Error':
324
- this.updatePageDisplay();
325
- break;
314
+ return;
326
315
  }
316
+ this.updatePageDisplay();
327
317
  }
328
318
  onWorkoutUpdate() {
329
319
  this.updatePageDisplay();
@@ -370,7 +360,8 @@ let WorkoutRidePageService = (() => {
370
360
  }
371
361
  const bars = getWorkoutGraphSeries(current, { ftp, absValues: true });
372
362
  const lastBarX = bars.length ? bars.at(-1).x : 0;
373
- const maxX = Math.max(this.getLastLogTime(), lastBarX, current.duration ?? 0);
363
+ const maxXCandidates = [this.getLastLogTime(), lastBarX, current.duration ?? 0].filter(Number.isFinite);
364
+ const maxX = maxXCandidates.length ? Math.max(...maxXCandidates) : 0;
374
365
  const maxBarPower = bars.length ? Math.max(...bars.map(b => b.y)) : 0;
375
366
  return {
376
367
  bars,
@@ -1,4 +1,4 @@
1
- export type FeatureToggle = 'NEW_SEARCH_UI' | 'CONTROLLERS' | 'MOBILE_WORKOUTS' | 'WEBBLE_WINDOWS';
1
+ export type FeatureToggle = 'NEW_SEARCH_UI' | 'CONTROLLERS' | 'MOBILE_WORKOUTS' | 'WEBBLE_WINDOWS' | 'MOBILE_NEXT_VIDEO';
2
2
  export type Interfaces = 'ant' | 'ble' | 'serial' | 'wifi' | 'tcpip';
3
3
  export type BLEFeatures = {
4
4
  services: Array<string>;
@@ -78,6 +78,7 @@ export declare class RouteCard extends BaseCard implements Card<Route> {
78
78
  start(): void;
79
79
  cancel(): void;
80
80
  addWorkout(): void;
81
+ protected enforceNextVideoOverrideOnMobile(): void;
81
82
  getCurrentDownload(): Observer;
82
83
  getVideoDir(): string;
83
84
  setVideoDir(dir: string): void;
@@ -50,6 +50,7 @@ export declare class WorkoutListPageService extends IncyclistPageService impleme
50
50
  protected formatDuration(duration: number): string;
51
51
  protected emitPageUpdate(): void;
52
52
  protected emitImportUpdate(): void;
53
+ protected getDevicePairing(): import("../../devices").DevicePairingService;
53
54
  protected getWorkoutList(): WorkoutListService;
54
55
  protected getWorkoutCalendar(): import("../calendar").WorkoutCalendarService;
55
56
  protected getUserSettings(): import("../../settings").UserSettingsService;
@@ -12,7 +12,6 @@ export declare class WorkoutRidePageService extends IncyclistPageService impleme
12
12
  protected backgroundTimer: NodeJS.Timeout | undefined;
13
13
  protected backgroundPausedByService: boolean;
14
14
  protected menuProps: WorkoutRideMenuProps | null;
15
- protected isInitialized: boolean;
16
15
  constructor();
17
16
  openPage(simulate?: boolean): IObserver;
18
17
  closePage(): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incyclist-services",
3
- "version": "1.7.81",
3
+ "version": "1.7.82",
4
4
  "peerDependencies": {
5
5
  "gd-eventlog": "^0.1.27"
6
6
  },