@vived/host 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/cjs/ChallengeResults/Adapters/challengeScoreListAdapter.js +19 -0
  2. package/dist/cjs/ChallengeResults/Adapters/challengeScoreListAdapter.js.map +1 -0
  3. package/dist/cjs/ChallengeResults/Adapters/index.js +1 -0
  4. package/dist/cjs/ChallengeResults/Adapters/index.js.map +1 -1
  5. package/dist/cjs/ChallengeResults/Entities/ChallengeResults.js +35 -0
  6. package/dist/cjs/ChallengeResults/Entities/ChallengeResults.js.map +1 -1
  7. package/dist/cjs/ChallengeResults/Mocks/MockChallengeScoreListPM.js +19 -0
  8. package/dist/cjs/ChallengeResults/Mocks/MockChallengeScoreListPM.js.map +1 -0
  9. package/dist/cjs/ChallengeResults/Mocks/index.js +1 -0
  10. package/dist/cjs/ChallengeResults/Mocks/index.js.map +1 -1
  11. package/dist/cjs/ChallengeResults/PMs/ChallengeScoreListPM.js +78 -0
  12. package/dist/cjs/ChallengeResults/PMs/ChallengeScoreListPM.js.map +1 -0
  13. package/dist/cjs/ChallengeResults/PMs/index.js +1 -0
  14. package/dist/cjs/ChallengeResults/PMs/index.js.map +1 -1
  15. package/dist/cjs/Handler/UCs/SubmitResultHandler.js +22 -7
  16. package/dist/cjs/Handler/UCs/SubmitResultHandler.js.map +1 -1
  17. package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js +6 -6
  18. package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
  19. package/dist/cjs/ZSpaceHost/Entities/ZSpaceHost.js +34 -0
  20. package/dist/cjs/ZSpaceHost/Entities/ZSpaceHost.js.map +1 -1
  21. package/dist/cjs/ZSpaceHost/PMs/EmulateZSpacePM.js +52 -3
  22. package/dist/cjs/ZSpaceHost/PMs/EmulateZSpacePM.js.map +1 -1
  23. package/dist/cjs/ZSpaceHost/PMs/ZSpaceIsActivePM.js +45 -3
  24. package/dist/cjs/ZSpaceHost/PMs/ZSpaceIsActivePM.js.map +1 -1
  25. package/dist/cjs/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.js +38 -0
  26. package/dist/cjs/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.js.map +1 -1
  27. package/dist/cjs/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.js +36 -0
  28. package/dist/cjs/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.js.map +1 -1
  29. package/dist/cjs/ZSpaceHost/UCs/checkForZSpaceSupport.js +36 -0
  30. package/dist/cjs/ZSpaceHost/UCs/checkForZSpaceSupport.js.map +1 -1
  31. package/dist/cjs/ZSpaceHost/index.js +68 -0
  32. package/dist/cjs/ZSpaceHost/index.js.map +1 -1
  33. package/dist/esm/ChallengeResults/Adapters/challengeScoreListAdapter.js +16 -0
  34. package/dist/esm/ChallengeResults/Adapters/challengeScoreListAdapter.js.map +1 -0
  35. package/dist/esm/ChallengeResults/Adapters/index.js +1 -0
  36. package/dist/esm/ChallengeResults/Adapters/index.js.map +1 -1
  37. package/dist/esm/ChallengeResults/Entities/ChallengeResults.js +35 -0
  38. package/dist/esm/ChallengeResults/Entities/ChallengeResults.js.map +1 -1
  39. package/dist/esm/ChallengeResults/Mocks/MockChallengeScoreListPM.js +14 -0
  40. package/dist/esm/ChallengeResults/Mocks/MockChallengeScoreListPM.js.map +1 -0
  41. package/dist/esm/ChallengeResults/Mocks/index.js +1 -0
  42. package/dist/esm/ChallengeResults/Mocks/index.js.map +1 -1
  43. package/dist/esm/ChallengeResults/PMs/ChallengeScoreListPM.js +73 -0
  44. package/dist/esm/ChallengeResults/PMs/ChallengeScoreListPM.js.map +1 -0
  45. package/dist/esm/ChallengeResults/PMs/index.js +1 -0
  46. package/dist/esm/ChallengeResults/PMs/index.js.map +1 -1
  47. package/dist/esm/Handler/UCs/SubmitResultHandler.js +23 -8
  48. package/dist/esm/Handler/UCs/SubmitResultHandler.js.map +1 -1
  49. package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js +6 -6
  50. package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
  51. package/dist/esm/ZSpaceHost/Entities/ZSpaceHost.js +34 -0
  52. package/dist/esm/ZSpaceHost/Entities/ZSpaceHost.js.map +1 -1
  53. package/dist/esm/ZSpaceHost/PMs/EmulateZSpacePM.js +52 -3
  54. package/dist/esm/ZSpaceHost/PMs/EmulateZSpacePM.js.map +1 -1
  55. package/dist/esm/ZSpaceHost/PMs/ZSpaceIsActivePM.js +45 -3
  56. package/dist/esm/ZSpaceHost/PMs/ZSpaceIsActivePM.js.map +1 -1
  57. package/dist/esm/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.js +38 -0
  58. package/dist/esm/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.js.map +1 -1
  59. package/dist/esm/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.js +36 -0
  60. package/dist/esm/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.js.map +1 -1
  61. package/dist/esm/ZSpaceHost/UCs/checkForZSpaceSupport.js +36 -0
  62. package/dist/esm/ZSpaceHost/UCs/checkForZSpaceSupport.js.map +1 -1
  63. package/dist/esm/ZSpaceHost/index.js +68 -0
  64. package/dist/esm/ZSpaceHost/index.js.map +1 -1
  65. package/dist/types/ChallengeResults/Adapters/challengeScoreListAdapter.d.ts +4 -0
  66. package/dist/types/ChallengeResults/Adapters/challengeScoreListAdapter.d.ts.map +1 -0
  67. package/dist/types/ChallengeResults/Adapters/index.d.ts +1 -0
  68. package/dist/types/ChallengeResults/Adapters/index.d.ts.map +1 -1
  69. package/dist/types/ChallengeResults/Entities/ChallengeResults.d.ts +1 -0
  70. package/dist/types/ChallengeResults/Entities/ChallengeResults.d.ts.map +1 -1
  71. package/dist/types/ChallengeResults/Mocks/MockChallengeScoreListPM.d.ts +8 -0
  72. package/dist/types/ChallengeResults/Mocks/MockChallengeScoreListPM.d.ts.map +1 -0
  73. package/dist/types/ChallengeResults/Mocks/index.d.ts +1 -0
  74. package/dist/types/ChallengeResults/Mocks/index.d.ts.map +1 -1
  75. package/dist/types/ChallengeResults/PMs/ChallengeScoreListPM.d.ts +12 -0
  76. package/dist/types/ChallengeResults/PMs/ChallengeScoreListPM.d.ts.map +1 -0
  77. package/dist/types/ChallengeResults/PMs/index.d.ts +1 -0
  78. package/dist/types/ChallengeResults/PMs/index.d.ts.map +1 -1
  79. package/dist/types/Handler/UCs/SubmitResultHandler.d.ts.map +1 -1
  80. package/dist/types/ZSpaceHost/Entities/ZSpaceHost.d.ts +45 -0
  81. package/dist/types/ZSpaceHost/Entities/ZSpaceHost.d.ts.map +1 -1
  82. package/dist/types/ZSpaceHost/PMs/EmulateZSpacePM.d.ts +46 -0
  83. package/dist/types/ZSpaceHost/PMs/EmulateZSpacePM.d.ts.map +1 -1
  84. package/dist/types/ZSpaceHost/PMs/ZSpaceIsActivePM.d.ts +39 -0
  85. package/dist/types/ZSpaceHost/PMs/ZSpaceIsActivePM.d.ts.map +1 -1
  86. package/dist/types/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.d.ts +43 -0
  87. package/dist/types/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.d.ts.map +1 -1
  88. package/dist/types/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.d.ts +40 -0
  89. package/dist/types/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.d.ts.map +1 -1
  90. package/dist/types/ZSpaceHost/UCs/checkForZSpaceSupport.d.ts +36 -0
  91. package/dist/types/ZSpaceHost/UCs/checkForZSpaceSupport.d.ts.map +1 -1
  92. package/dist/types/ZSpaceHost/index.d.ts +68 -0
  93. package/dist/types/ZSpaceHost/index.d.ts.map +1 -1
  94. package/package.json +1 -1
@@ -0,0 +1,73 @@
1
+ import { AppObjectPM, getSingletonComponent } from "@vived/core";
2
+ import { HostStateMachine } from "../../StateMachine/Entities/HostStateMachine";
3
+ import { ChallengeResultsEntity } from "../Entities/ChallengeResults";
4
+ export class ChallengeScoreListPM extends AppObjectPM {
5
+ static get(appObjects) {
6
+ return getSingletonComponent(ChallengeScoreListPM.type, appObjects);
7
+ }
8
+ }
9
+ ChallengeScoreListPM.type = "ChallengeScoreListPM";
10
+ export function makeChallengeScoreListPM(appObject) {
11
+ return new ChallengeScoreListPMImp(appObject);
12
+ }
13
+ class ChallengeScoreListPMImp extends ChallengeScoreListPM {
14
+ get challengeResults() {
15
+ return this.getCachedSingleton(ChallengeResultsEntity.type);
16
+ }
17
+ get stateMachine() {
18
+ return this.getCachedSingleton(HostStateMachine.type);
19
+ }
20
+ vmsAreEqual(a, b) {
21
+ if (a.length !== b.length)
22
+ return false;
23
+ for (let i = 0; i < a.length; i++) {
24
+ if (a[i].id !== b[i].id)
25
+ return false;
26
+ if (a[i].displayName !== b[i].displayName)
27
+ return false;
28
+ if (a[i].score !== b[i].score)
29
+ return false;
30
+ }
31
+ return true;
32
+ }
33
+ constructor(appObject) {
34
+ super(appObject, ChallengeScoreListPM.type);
35
+ this.onEntityChange = () => {
36
+ if (!this.challengeResults || !this.stateMachine)
37
+ return;
38
+ const slideScores = [];
39
+ // Get all states from state machine
40
+ const stateIds = this.stateMachine.states;
41
+ // Process each state
42
+ stateIds.forEach((slideId, index) => {
43
+ // Skip slides that don't have a result
44
+ if (!this.challengeResults.getResultForSlide(slideId))
45
+ return;
46
+ const state = this.stateMachine.getStateByID(slideId);
47
+ if (state) {
48
+ // Get score for this slide using the method from ChallengeResults
49
+ const score = this.challengeResults.getScoreForSlide(slideId);
50
+ // Format the display name
51
+ const displayName = `Slide ${index + 1}: ${state.name}`;
52
+ // Add to results
53
+ slideScores.push({
54
+ id: slideId,
55
+ displayName,
56
+ score
57
+ });
58
+ }
59
+ });
60
+ this.doUpdateView(slideScores);
61
+ };
62
+ // Initialize with empty array
63
+ this.doUpdateView([]);
64
+ // Subscribe to changes in entities
65
+ this.challengeResults?.addChangeObserver(this.onEntityChange);
66
+ this.stateMachine?.addChangeObserver(this.onEntityChange);
67
+ // Initial update
68
+ this.onEntityChange();
69
+ // Register as singleton
70
+ this.appObjects.registerSingleton(this);
71
+ }
72
+ }
73
+ //# sourceMappingURL=ChallengeScoreListPM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChallengeScoreListPM.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/ChallengeScoreListPM.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo,\r\n getSingletonComponent\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../../StateMachine/Entities/HostStateMachine\";\r\nimport { ChallengeResultsEntity } from \"../Entities/ChallengeResults\";\r\n\r\nexport interface SlideScoreVM {\r\n id: string;\r\n displayName: string;\r\n score: number;\r\n}\r\n\r\nexport abstract class ChallengeScoreListPM extends AppObjectPM<SlideScoreVM[]> {\r\n static readonly type = \"ChallengeScoreListPM\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ChallengeScoreListPM>(\r\n ChallengeScoreListPM.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeChallengeScoreListPM(\r\n appObject: AppObject\r\n): ChallengeScoreListPM {\r\n return new ChallengeScoreListPMImp(appObject);\r\n}\r\n\r\nclass ChallengeScoreListPMImp extends ChallengeScoreListPM {\r\n private get challengeResults() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n vmsAreEqual(a: SlideScoreVM[], b: SlideScoreVM[]): boolean {\r\n if (a.length !== b.length) return false;\r\n\r\n for (let i = 0; i < a.length; i++) {\r\n if (a[i].id !== b[i].id) return false;\r\n if (a[i].displayName !== b[i].displayName) return false;\r\n if (a[i].score !== b[i].score) return false;\r\n }\r\n return true;\r\n }\r\n\r\n onEntityChange = (): void => {\r\n if (!this.challengeResults || !this.stateMachine) return;\r\n\r\n const slideScores: SlideScoreVM[] = [];\r\n\r\n // Get all states from state machine\r\n const stateIds = this.stateMachine.states;\r\n\r\n // Process each state\r\n stateIds.forEach((slideId, index) => {\r\n // Skip slides that don't have a result\r\n if (!this.challengeResults!.getResultForSlide(slideId)) return;\r\n\r\n const state = this.stateMachine!.getStateByID(slideId);\r\n if (state) {\r\n // Get score for this slide using the method from ChallengeResults\r\n const score = this.challengeResults!.getScoreForSlide(slideId);\r\n\r\n // Format the display name\r\n const displayName = `Slide ${index + 1}: ${state.name}`;\r\n\r\n // Add to results\r\n slideScores.push({\r\n id: slideId,\r\n displayName,\r\n score\r\n });\r\n }\r\n });\r\n\r\n this.doUpdateView(slideScores);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ChallengeScoreListPM.type);\r\n\r\n // Initialize with empty array\r\n this.doUpdateView([]);\r\n\r\n // Subscribe to changes in entities\r\n this.challengeResults?.addChangeObserver(this.onEntityChange);\r\n this.stateMachine?.addChangeObserver(this.onEntityChange);\r\n\r\n // Initial update\r\n this.onEntityChange();\r\n\r\n // Register as singleton\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -1,3 +1,4 @@
1
1
  export * from "./ChallengeResultsListPM";
2
2
  export * from "./HasChallengeResultsPM";
3
+ export * from "./ChallengeScoreListPM";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA","sourcesContent":["export * from \"./ChallengeResultsListPM\"\r\nexport * from \"./HasChallengeResultsPM\""]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC","sourcesContent":["export * from \"./ChallengeResultsListPM\";\r\nexport * from \"./HasChallengeResultsPM\";\r\nexport * from \"./ChallengeScoreListPM\";\r\n"]}
@@ -1,6 +1,6 @@
1
1
  import { AppObjectUC } from "@vived/core";
2
2
  import { ChallengeResultsEntity } from "../../ChallengeResults";
3
- import { HostStateMachine } from "../../StateMachine";
3
+ import { ChallengeResponse, HostStateMachine } from "../../StateMachine";
4
4
  import { HostHandlerEntity, UnableToParsePayload, UnsupportedRequestVersion } from "../Entities";
5
5
  export class SubmitResultHandler extends AppObjectUC {
6
6
  constructor() {
@@ -79,6 +79,14 @@ class SubmitResultHandlerImp extends SubmitResultHandler {
79
79
  }
80
80
  constructor(appObject) {
81
81
  super(appObject, SubmitResultHandler.type);
82
+ // Map result types to challenge responses
83
+ this.resultTypeToResponseMap = {
84
+ HIT_V1: ChallengeResponse.HIT,
85
+ MULTIHIT_V1: ChallengeResponse.MULTIHIT,
86
+ QUALITY_V1: ChallengeResponse.QUALITY,
87
+ SCORE_V1: ChallengeResponse.SCORE,
88
+ PROGRESS_V1: ChallengeResponse.PROGRESS
89
+ };
82
90
  this.action = (type, result, description) => {
83
91
  if (!this.challengeResults || !this.stateMachine) {
84
92
  this.error("Missing Component");
@@ -88,25 +96,32 @@ class SubmitResultHandlerImp extends SubmitResultHandler {
88
96
  this.warn("Cannot store result because there is no active slide");
89
97
  return;
90
98
  }
91
- const currentSlide = this.stateMachine.activeState;
92
- let tries = this.challengeResults.getResultForSlide(currentSlide)?.tries ?? 0;
99
+ const currentSlideId = this.stateMachine.activeState;
100
+ const currentStateEntity = this.stateMachine.getStateByID(currentSlideId);
101
+ if (!currentStateEntity) {
102
+ this.warn("Cannot find active state entity");
103
+ return;
104
+ }
105
+ // Set the expected response based on the result type
106
+ currentStateEntity.expectedResponse = this.resultTypeToResponseMap[type];
107
+ let tries = this.challengeResults.getResultForSlide(currentSlideId)?.tries ?? 0;
93
108
  if (type !== "PROGRESS_V1") {
94
109
  tries += 1;
95
110
  }
96
111
  if (type === "HIT_V1") {
97
- this.handleHitV1(result, tries, currentSlide, description);
112
+ this.handleHitV1(result, tries, currentSlideId, description);
98
113
  }
99
114
  else if (type === "MULTIHIT_V1") {
100
- this.handleMultiHitV1(result, tries, currentSlide, description);
115
+ this.handleMultiHitV1(result, tries, currentSlideId, description);
101
116
  }
102
117
  else if (type === "QUALITY_V1") {
103
- this.handleQualityV1(result, tries, currentSlide, description);
118
+ this.handleQualityV1(result, tries, currentSlideId, description);
104
119
  }
105
120
  else if (type === "SCORE_V1") {
106
- this.handleScoreV1(result, tries, currentSlide, description);
121
+ this.handleScoreV1(result, tries, currentSlideId, description);
107
122
  }
108
123
  else if (type === "PROGRESS_V1") {
109
- this.handleProgressV1(result, currentSlide, description);
124
+ this.handleProgressV1(result, currentSlideId, description);
110
125
  }
111
126
  };
112
127
  this.handleRequest = (version, payload) => {
@@ -1 +1 @@
1
- {"version":3,"file":"SubmitResultHandler.js","sourceRoot":"","sources":["../../../../src/Handler/UCs/SubmitResultHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectUC } from \"@vived/core\";\r\nimport { ChallengeResultsEntity } from \"../../ChallengeResults\";\r\nimport { HostStateMachine } from \"../../StateMachine\";\r\nimport {\r\n HostHandlerEntity,\r\n RequestHandler,\r\n UnableToParsePayload,\r\n UnsupportedRequestVersion\r\n} from \"../Entities\";\r\n\r\nexport type ResultType =\r\n | \"HIT_V1\"\r\n | \"MULTIHIT_V1\"\r\n | \"QUALITY_V1\"\r\n | \"SCORE_V1\"\r\n | \"PROGRESS_V1\";\r\nexport type Results =\r\n | HitResultV1\r\n | MultiHitResultV1\r\n | QualityResultV1\r\n | ScoreResultV1\r\n | ProgressResultV1;\r\n\r\nexport type HitResultV1 = {\r\n success: boolean;\r\n};\r\n\r\nexport type MultiHitResultV1 = {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n};\r\n\r\nexport type QualityResultV1 = {\r\n stars: number;\r\n maxStars: number;\r\n};\r\n\r\nexport type ScoreResultV1 = {\r\n score: number;\r\n maxScore: number;\r\n};\r\n\r\nexport type ProgressResultV1 = {\r\n progress: number;\r\n};\r\n\r\nexport type SubmitResultAction = (\r\n type: ResultType,\r\n result: Results,\r\n description: string\r\n) => void;\r\n\r\nexport abstract class SubmitResultHandler\r\n extends AppObjectUC\r\n implements RequestHandler {\r\n static readonly type = \"SubmitResultHandler\";\r\n\r\n readonly requestType = \"SUBMIT_RESULTS\";\r\n\r\n abstract action: SubmitResultAction;\r\n abstract handleRequest: (version: number, payload?: unknown) => void;\r\n}\r\n\r\nexport function makeSubmitResultHandler(\r\n appObject: AppObject\r\n): SubmitResultHandler {\r\n return new SubmitResultHandlerImp(appObject);\r\n}\r\n\r\nclass SubmitResultHandlerImp extends SubmitResultHandler {\r\n private get challengeResults() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n action = (type: ResultType, result: Results, description: string) => {\r\n if (!this.challengeResults || !this.stateMachine) {\r\n this.error(\"Missing Component\");\r\n return;\r\n }\r\n\r\n if (this.stateMachine.activeState === undefined) {\r\n this.warn(\"Cannot store result because there is no active slide\");\r\n return;\r\n }\r\n\r\n const currentSlide = this.stateMachine.activeState;\r\n\r\n let tries =\r\n this.challengeResults.getResultForSlide(currentSlide)?.tries ?? 0;\r\n if (type !== \"PROGRESS_V1\") {\r\n tries += 1;\r\n }\r\n\r\n if (type === \"HIT_V1\") {\r\n this.handleHitV1(result as HitResultV1, tries, currentSlide, description);\r\n } else if (type === \"MULTIHIT_V1\") {\r\n this.handleMultiHitV1(\r\n result as MultiHitResultV1,\r\n tries,\r\n currentSlide,\r\n description\r\n );\r\n } else if (type === \"QUALITY_V1\") {\r\n this.handleQualityV1(\r\n result as QualityResultV1,\r\n tries,\r\n currentSlide,\r\n description\r\n );\r\n } else if (type === \"SCORE_V1\") {\r\n this.handleScoreV1(\r\n result as ScoreResultV1,\r\n tries,\r\n currentSlide,\r\n description\r\n );\r\n } else if (type === \"PROGRESS_V1\") {\r\n this.handleProgressV1(\r\n result as ProgressResultV1,\r\n currentSlide,\r\n description\r\n );\r\n }\r\n };\r\n\r\n handleRequest = (version: number, payload: unknown) => {\r\n if (version === 2) {\r\n const { description, result, resultType } = this.castPayloadV2(payload);\r\n this.action(resultType, result, description);\r\n } else if (version === 3) {\r\n const { description, result, resultType } = this.castPayloadV3(payload);\r\n this.action(resultType, result, description);\r\n } else {\r\n throw new UnsupportedRequestVersion(this.requestType, version);\r\n }\r\n };\r\n\r\n private handleHitV1(\r\n result: HitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.success === undefined) {\r\n this.warn(\r\n `Cannot parse Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitHitResult(\r\n slideId,\r\n castResult.success,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleProgressV1(\r\n result: ProgressResultV1,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.progress === undefined) {\r\n this.warn(\r\n `Cannot parse Progress Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitProgressResult(\r\n slideId,\r\n castResult.progress,\r\n message\r\n );\r\n }\r\n\r\n private handleMultiHitV1(\r\n result: MultiHitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { hits, misses, unanswered } = result;\r\n\r\n if (\r\n hits === undefined ||\r\n misses === undefined ||\r\n unanswered === undefined\r\n ) {\r\n this.warn(\r\n `Cannot parse Multi Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitMultiHitResult(\r\n slideId,\r\n hits,\r\n misses,\r\n unanswered,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleQualityV1(\r\n result: QualityResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { maxStars, stars } = result;\r\n\r\n if (maxStars === undefined || stars === undefined) {\r\n this.warn(\r\n `Cannot parse Quality Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitQualityResult(\r\n slideId,\r\n stars,\r\n maxStars,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleScoreV1(\r\n result: ScoreResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { score, maxScore } = result;\r\n\r\n if (maxScore === undefined || score === undefined) {\r\n this.warn(\r\n `Cannot parse Score Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitScoreResult(\r\n slideId,\r\n score,\r\n maxScore,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private castPayloadV2(payload: unknown): Payload_V2 {\r\n const castPayload = payload as Payload_V2;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 1,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n private castPayloadV3(payload: unknown): Payload_V3 {\r\n const castPayload = payload as Payload_V3;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 2,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SubmitResultHandler.type);\r\n\r\n const hostHandler = HostHandlerEntity.get(appObject);\r\n if (!hostHandler) {\r\n this.error(\"UC added to an entity that does not have HostHandlerEntity\");\r\n return;\r\n }\r\n\r\n hostHandler.registerRequestHandler(this);\r\n }\r\n}\r\n\r\n// Payload V1 is unsupported\r\n\r\ntype Payload_V2 = {\r\n tries: number;\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n\r\ntype Payload_V3 = {\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n"]}
1
+ {"version":3,"file":"SubmitResultHandler.js","sourceRoot":"","sources":["../../../../src/Handler/UCs/SubmitResultHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectUC } from \"@vived/core\";\r\nimport { ChallengeResultsEntity } from \"../../ChallengeResults\";\r\nimport {\r\n ChallengeResponse,\r\n HostStateEntity,\r\n HostStateMachine\r\n} from \"../../StateMachine\";\r\nimport {\r\n HostHandlerEntity,\r\n RequestHandler,\r\n UnableToParsePayload,\r\n UnsupportedRequestVersion\r\n} from \"../Entities\";\r\n\r\nexport type ResultType =\r\n | \"HIT_V1\"\r\n | \"MULTIHIT_V1\"\r\n | \"QUALITY_V1\"\r\n | \"SCORE_V1\"\r\n | \"PROGRESS_V1\";\r\nexport type Results =\r\n | HitResultV1\r\n | MultiHitResultV1\r\n | QualityResultV1\r\n | ScoreResultV1\r\n | ProgressResultV1;\r\n\r\nexport type HitResultV1 = {\r\n success: boolean;\r\n};\r\n\r\nexport type MultiHitResultV1 = {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n};\r\n\r\nexport type QualityResultV1 = {\r\n stars: number;\r\n maxStars: number;\r\n};\r\n\r\nexport type ScoreResultV1 = {\r\n score: number;\r\n maxScore: number;\r\n};\r\n\r\nexport type ProgressResultV1 = {\r\n progress: number;\r\n};\r\n\r\nexport type SubmitResultAction = (\r\n type: ResultType,\r\n result: Results,\r\n description: string\r\n) => void;\r\n\r\nexport abstract class SubmitResultHandler\r\n extends AppObjectUC\r\n implements RequestHandler\r\n{\r\n static readonly type = \"SubmitResultHandler\";\r\n\r\n readonly requestType = \"SUBMIT_RESULTS\";\r\n\r\n abstract action: SubmitResultAction;\r\n abstract handleRequest: (version: number, payload?: unknown) => void;\r\n}\r\n\r\nexport function makeSubmitResultHandler(\r\n appObject: AppObject\r\n): SubmitResultHandler {\r\n return new SubmitResultHandlerImp(appObject);\r\n}\r\n\r\nclass SubmitResultHandlerImp extends SubmitResultHandler {\r\n private get challengeResults() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n // Map result types to challenge responses\r\n private resultTypeToResponseMap: Record<ResultType, ChallengeResponse> = {\r\n HIT_V1: ChallengeResponse.HIT,\r\n MULTIHIT_V1: ChallengeResponse.MULTIHIT,\r\n QUALITY_V1: ChallengeResponse.QUALITY,\r\n SCORE_V1: ChallengeResponse.SCORE,\r\n PROGRESS_V1: ChallengeResponse.PROGRESS\r\n };\r\n\r\n action = (type: ResultType, result: Results, description: string) => {\r\n if (!this.challengeResults || !this.stateMachine) {\r\n this.error(\"Missing Component\");\r\n return;\r\n }\r\n\r\n if (this.stateMachine.activeState === undefined) {\r\n this.warn(\"Cannot store result because there is no active slide\");\r\n return;\r\n }\r\n\r\n const currentSlideId = this.stateMachine.activeState;\r\n const currentStateEntity = this.stateMachine.getStateByID(currentSlideId);\r\n\r\n if (!currentStateEntity) {\r\n this.warn(\"Cannot find active state entity\");\r\n return;\r\n }\r\n\r\n // Set the expected response based on the result type\r\n currentStateEntity.expectedResponse = this.resultTypeToResponseMap[type];\r\n\r\n let tries =\r\n this.challengeResults.getResultForSlide(currentSlideId)?.tries ?? 0;\r\n if (type !== \"PROGRESS_V1\") {\r\n tries += 1;\r\n }\r\n\r\n if (type === \"HIT_V1\") {\r\n this.handleHitV1(\r\n result as HitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"MULTIHIT_V1\") {\r\n this.handleMultiHitV1(\r\n result as MultiHitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"QUALITY_V1\") {\r\n this.handleQualityV1(\r\n result as QualityResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"SCORE_V1\") {\r\n this.handleScoreV1(\r\n result as ScoreResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"PROGRESS_V1\") {\r\n this.handleProgressV1(\r\n result as ProgressResultV1,\r\n currentSlideId,\r\n description\r\n );\r\n }\r\n };\r\n\r\n handleRequest = (version: number, payload: unknown) => {\r\n if (version === 2) {\r\n const { description, result, resultType } = this.castPayloadV2(payload);\r\n this.action(resultType, result, description);\r\n } else if (version === 3) {\r\n const { description, result, resultType } = this.castPayloadV3(payload);\r\n this.action(resultType, result, description);\r\n } else {\r\n throw new UnsupportedRequestVersion(this.requestType, version);\r\n }\r\n };\r\n\r\n private handleHitV1(\r\n result: HitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.success === undefined) {\r\n this.warn(\r\n `Cannot parse Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitHitResult(\r\n slideId,\r\n castResult.success,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleProgressV1(\r\n result: ProgressResultV1,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.progress === undefined) {\r\n this.warn(\r\n `Cannot parse Progress Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitProgressResult(\r\n slideId,\r\n castResult.progress,\r\n message\r\n );\r\n }\r\n\r\n private handleMultiHitV1(\r\n result: MultiHitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { hits, misses, unanswered } = result;\r\n\r\n if (\r\n hits === undefined ||\r\n misses === undefined ||\r\n unanswered === undefined\r\n ) {\r\n this.warn(\r\n `Cannot parse Multi Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitMultiHitResult(\r\n slideId,\r\n hits,\r\n misses,\r\n unanswered,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleQualityV1(\r\n result: QualityResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { maxStars, stars } = result;\r\n\r\n if (maxStars === undefined || stars === undefined) {\r\n this.warn(\r\n `Cannot parse Quality Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitQualityResult(\r\n slideId,\r\n stars,\r\n maxStars,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleScoreV1(\r\n result: ScoreResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { score, maxScore } = result;\r\n\r\n if (maxScore === undefined || score === undefined) {\r\n this.warn(\r\n `Cannot parse Score Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitScoreResult(\r\n slideId,\r\n score,\r\n maxScore,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private castPayloadV2(payload: unknown): Payload_V2 {\r\n const castPayload = payload as Payload_V2;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 1,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n private castPayloadV3(payload: unknown): Payload_V3 {\r\n const castPayload = payload as Payload_V3;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 2,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SubmitResultHandler.type);\r\n\r\n const hostHandler = HostHandlerEntity.get(appObject);\r\n if (!hostHandler) {\r\n this.error(\"UC added to an entity that does not have HostHandlerEntity\");\r\n return;\r\n }\r\n\r\n hostHandler.registerRequestHandler(this);\r\n }\r\n}\r\n\r\n// Payload V1 is unsupported\r\n\r\ntype Payload_V2 = {\r\n tries: number;\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n\r\ntype Payload_V3 = {\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n"]}
@@ -11,6 +11,12 @@ export function makeHostEditingStateEntity(appObject) {
11
11
  return new HostEditingStateEntityImp(appObject);
12
12
  }
13
13
  class HostEditingStateEntityImp extends HostEditingStateEntity {
14
+ get editingState() {
15
+ return this._editingState;
16
+ }
17
+ get isEditing() {
18
+ return this._editingState !== undefined;
19
+ }
14
20
  get isNewState() {
15
21
  return this._isNewState;
16
22
  }
@@ -29,12 +35,6 @@ class HostEditingStateEntityImp extends HostEditingStateEntity {
29
35
  get somethingHasChanged() {
30
36
  return this.memoizedSomethingHasChanged.val;
31
37
  }
32
- get isEditing() {
33
- return this._editingState !== undefined;
34
- }
35
- get editingState() {
36
- return this._editingState;
37
- }
38
38
  constructor(appObject) {
39
39
  super(appObject, HostEditingStateEntity.type);
40
40
  this._isNewState = false;
@@ -1 +1 @@
1
- {"version":3,"file":"HostEditingStateEntity.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostEditingStateEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import { MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, StateDTO } from \"./HostStateEntity\";\r\nimport { HostStateMachine } from \"./HostStateMachine\";\r\n\r\nexport abstract class HostEditingStateEntity extends AppObjectEntity {\r\n static type = \"HostEditingStateEntity\";\r\n\r\n abstract get isEditing(): boolean;\r\n abstract get isNewState(): boolean;\r\n abstract get editingState(): HostStateEntity | undefined;\r\n abstract get somethingHasChanged(): boolean;\r\n abstract stateValidationMessage?: string;\r\n\r\n abstract startNewState(): HostStateEntity | undefined;\r\n abstract startEditing(state: HostStateEntity): void;\r\n abstract cancelEditState(): void;\r\n abstract finishEditing(): void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostEditingStateEntity>(\r\n HostEditingStateEntity.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHostEditingStateEntity(\r\n appObject: AppObject\r\n): HostEditingStateEntity {\r\n return new HostEditingStateEntityImp(appObject);\r\n}\r\n\r\nclass HostEditingStateEntityImp extends HostEditingStateEntity {\r\n private _isNewState = false;\r\n get isNewState(): boolean {\r\n return this._isNewState;\r\n }\r\n private _stateValidationMessage?: string | undefined;\r\n\r\n get stateValidationMessage(): string | undefined {\r\n return this._stateValidationMessage;\r\n }\r\n\r\n set stateValidationMessage(val: string | undefined) {\r\n if (this._stateValidationMessage === val) return;\r\n\r\n this._stateValidationMessage = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private get hostStateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n private memoizedSomethingHasChanged = new MemoizedBoolean(\r\n false,\r\n this.notifyOnChange\r\n );\r\n get somethingHasChanged(): boolean {\r\n return this.memoizedSomethingHasChanged.val;\r\n }\r\n\r\n private checkForChange = () => {\r\n if (!this._editingState) return false;\r\n if (!this.originalStateData) return true;\r\n\r\n if (this._editingState.name !== this.originalStateData.name) return true;\r\n\r\n if (this._editingState.expectedResponse !== this.originalStateData.response)\r\n return true;\r\n\r\n if (\r\n this._editingState.assets.length !== this.originalStateData.assets.length\r\n )\r\n return true;\r\n let assetsHaveChanged = false;\r\n this._editingState.assets.forEach((currentAssetID, i) => {\r\n const originalAssetId = this.originalStateData!.assets[i];\r\n if (originalAssetId !== currentAssetID) {\r\n assetsHaveChanged = true;\r\n }\r\n });\r\n\r\n if (assetsHaveChanged) {\r\n return true;\r\n }\r\n\r\n const currentDataString = JSON.stringify(this._editingState.stateData);\r\n const originalData = JSON.stringify(this.originalStateData?.data ?? \"\");\r\n if (currentDataString !== originalData) return true;\r\n\r\n return false;\r\n };\r\n\r\n private onStateEntityChange = (): void => {\r\n this.memoizedSomethingHasChanged.val = this.checkForChange();\r\n };\r\n\r\n get isEditing(): boolean {\r\n return this._editingState !== undefined;\r\n }\r\n\r\n private _editingState?: HostStateEntity;\r\n\r\n get editingState() {\r\n return this._editingState;\r\n }\r\n\r\n private originalStateData?: StateDTO;\r\n\r\n startNewState = (): HostStateEntity | undefined => {\r\n if (!this.hostStateMachine) return;\r\n\r\n this.originalStateData = undefined;\r\n this._isNewState = true;\r\n this._editingState = this.hostStateMachine.createNewState();\r\n this._editingState.addChangeObserver(this.onStateEntityChange);\r\n this.memoizedSomethingHasChanged.val = true;\r\n\r\n return this._editingState;\r\n };\r\n\r\n startEditing = (state: HostStateEntity): void => {\r\n this._editingState = state;\r\n\r\n this.originalStateData = state.getDTO();\r\n this._editingState.addChangeObserver(this.onStateEntityChange);\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n cancelEditState = (): void => {\r\n if (!this._editingState) return;\r\n\r\n if (this.originalStateData) {\r\n this._editingState.setDTO(this.originalStateData);\r\n } else {\r\n this.hostStateMachine?.deleteState(this._editingState.id);\r\n }\r\n\r\n this.resetInternalState();\r\n };\r\n\r\n finishEditing = (): void => {\r\n this.resetInternalState();\r\n };\r\n\r\n private resetInternalState = () => {\r\n if (!this._editingState) return;\r\n\r\n this._isNewState = false;\r\n this._editingState.removeChangeObserver(this.onStateEntityChange);\r\n this._stateValidationMessage = undefined;\r\n this._editingState = undefined;\r\n this.memoizedSomethingHasChanged.val = false;\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostEditingStateEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HostEditingStateEntity.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostEditingStateEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import { MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, StateDTO } from \"./HostStateEntity\";\r\nimport { HostStateMachine } from \"./HostStateMachine\";\r\n\r\nexport abstract class HostEditingStateEntity extends AppObjectEntity {\r\n static type = \"HostEditingStateEntity\";\r\n\r\n abstract get isEditing(): boolean;\r\n abstract get isNewState(): boolean;\r\n abstract get editingState(): HostStateEntity | undefined;\r\n abstract get somethingHasChanged(): boolean;\r\n abstract stateValidationMessage?: string;\r\n\r\n abstract startNewState(): HostStateEntity | undefined;\r\n abstract startEditing(state: HostStateEntity): void;\r\n abstract cancelEditState(): void;\r\n abstract finishEditing(): void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostEditingStateEntity>(\r\n HostEditingStateEntity.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHostEditingStateEntity(\r\n appObject: AppObject\r\n): HostEditingStateEntity {\r\n return new HostEditingStateEntityImp(appObject);\r\n}\r\n\r\nclass HostEditingStateEntityImp extends HostEditingStateEntity {\r\n private originalStateData?: StateDTO;\r\n \r\n private _editingState?: HostStateEntity;\r\n get editingState() {\r\n return this._editingState;\r\n }\r\n\r\n get isEditing(): boolean {\r\n return this._editingState !== undefined;\r\n }\r\n\r\n private _isNewState = false;\r\n get isNewState(): boolean {\r\n return this._isNewState;\r\n }\r\n\r\n private _stateValidationMessage?: string | undefined;\r\n get stateValidationMessage(): string | undefined {\r\n return this._stateValidationMessage;\r\n }\r\n set stateValidationMessage(val: string | undefined) {\r\n if (this._stateValidationMessage === val) return;\r\n\r\n this._stateValidationMessage = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private get hostStateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n private memoizedSomethingHasChanged = new MemoizedBoolean(\r\n false,\r\n this.notifyOnChange\r\n );\r\n get somethingHasChanged(): boolean {\r\n return this.memoizedSomethingHasChanged.val;\r\n }\r\n\r\n private checkForChange = () => {\r\n if (!this._editingState) return false;\r\n if (!this.originalStateData) return true;\r\n\r\n if (this._editingState.name !== this.originalStateData.name) return true;\r\n\r\n if (this._editingState.expectedResponse !== this.originalStateData.response)\r\n return true;\r\n\r\n if (\r\n this._editingState.assets.length !== this.originalStateData.assets.length\r\n )\r\n return true;\r\n let assetsHaveChanged = false;\r\n this._editingState.assets.forEach((currentAssetID, i) => {\r\n const originalAssetId = this.originalStateData!.assets[i];\r\n if (originalAssetId !== currentAssetID) {\r\n assetsHaveChanged = true;\r\n }\r\n });\r\n\r\n if (assetsHaveChanged) {\r\n return true;\r\n }\r\n\r\n const currentDataString = JSON.stringify(this._editingState.stateData);\r\n const originalData = JSON.stringify(this.originalStateData?.data ?? \"\");\r\n if (currentDataString !== originalData) return true;\r\n\r\n return false;\r\n };\r\n\r\n private onStateEntityChange = (): void => {\r\n this.memoizedSomethingHasChanged.val = this.checkForChange();\r\n };\r\n\r\n startNewState = (): HostStateEntity | undefined => {\r\n if (!this.hostStateMachine) return;\r\n\r\n this.originalStateData = undefined;\r\n this._isNewState = true;\r\n this._editingState = this.hostStateMachine.createNewState();\r\n this._editingState.addChangeObserver(this.onStateEntityChange);\r\n this.memoizedSomethingHasChanged.val = true;\r\n\r\n return this._editingState;\r\n };\r\n\r\n startEditing = (state: HostStateEntity): void => {\r\n this._editingState = state;\r\n\r\n this.originalStateData = state.getDTO();\r\n this._editingState.addChangeObserver(this.onStateEntityChange);\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n cancelEditState = (): void => {\r\n if (!this._editingState) return;\r\n\r\n if (this.originalStateData) {\r\n this._editingState.setDTO(this.originalStateData);\r\n } else {\r\n this.hostStateMachine?.deleteState(this._editingState.id);\r\n }\r\n\r\n this.resetInternalState();\r\n };\r\n\r\n finishEditing = (): void => {\r\n this.resetInternalState();\r\n };\r\n\r\n private resetInternalState = () => {\r\n if (!this._editingState) return;\r\n\r\n this._isNewState = false;\r\n this._editingState.removeChangeObserver(this.onStateEntityChange);\r\n this._stateValidationMessage = undefined;\r\n this._editingState = undefined;\r\n this.memoizedSomethingHasChanged.val = false;\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostEditingStateEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -1,14 +1,48 @@
1
1
  import { MemoizedBoolean } from "@vived/core";
2
2
  import { getSingletonComponent, AppObjectEntity } from "@vived/core";
3
+ /**
4
+ * ZSpaceHostEntity is a singleton entity that manages the state and functionality
5
+ * for zSpace integration in VIVED applications.
6
+ *
7
+ * This entity handles:
8
+ * 1. zSpace feature detection (isSupported)
9
+ * 2. Emulation mode toggling (emulate)
10
+ * 3. Active state management (isActive)
11
+ * 4. XR Session management
12
+ *
13
+ * Usage:
14
+ * - To check if zSpace is available: ZSpaceHostEntity.get(appObjects)?.isSupported
15
+ * - To check if zSpace is active: ZSpaceHostEntity.get(appObjects)?.isActive
16
+ * - To enable/disable emulation: ZSpaceHostEntity.get(appObjects).emulate = true/false
17
+ *
18
+ * Important: This is a singleton entity - only one instance exists in the application.
19
+ * Always access via ZSpaceHostEntity.get(appObjects) rather than creating new instances.
20
+ */
3
21
  export class ZSpaceHostEntity extends AppObjectEntity {
22
+ /**
23
+ * Get the singleton ZSpaceHostEntity instance
24
+ * @param appObjects - The AppObjectRepo instance
25
+ * @returns The ZSpaceHostEntity instance or undefined if not found
26
+ */
4
27
  static get(appObjects) {
5
28
  return getSingletonComponent(ZSpaceHostEntity.type, appObjects);
6
29
  }
7
30
  }
8
31
  ZSpaceHostEntity.type = "ZSpaceHostEntity";
32
+ /**
33
+ * Factory function to create the ZSpaceHostEntity
34
+ * For internal use only - external code should use ZSpaceHostEntity.get()
35
+ *
36
+ * @param appObject - The AppObject to attach the entity to
37
+ * @returns A new ZSpaceHostEntity instance
38
+ */
9
39
  export function makeZSpaceHostEntity(appObject) {
10
40
  return new ZSpaceHostImp(appObject);
11
41
  }
42
+ /**
43
+ * Implementation of ZSpaceHostEntity
44
+ * Uses MemoizedBoolean for all properties to ensure proper change notifications
45
+ */
12
46
  class ZSpaceHostImp extends ZSpaceHostEntity {
13
47
  get isSupported() {
14
48
  return this.memoizedIsSupported.val;
@@ -1 +1 @@
1
- {"version":3,"file":"ZSpaceHost.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/Entities/ZSpaceHost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,qBAAqB,EAErB,eAAe,EAEhB,MAAM,aAAa,CAAC;AAErB,MAAM,OAAgB,gBAAiB,SAAQ,eAAe;IAc5D,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAlBM,qBAAI,GAAG,kBAAkB,CAAC;AAqBnC,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,aAAc,SAAQ,gBAAgB;IAE1C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,IAAI,WAAW,CAAC,GAAY;QAC1B,IAAI,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,CAAC;IACrC,CAAC;IAGD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,CAAC,GAAY;QACtB,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,GAAG,CAAC;IACjC,CAAC;IAGD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;IACjC,CAAC;IACD,IAAI,QAAQ,CAAC,GAAY;QACvB,IAAI,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,CAAC;IAChC,CAAC;IAID,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QA3BlC,wBAAmB,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAQtE,oBAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAQjE,mBAAc,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAYvE,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import { MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\n\r\nexport abstract class ZSpaceHostEntity extends AppObjectEntity {\r\n static type = \"ZSpaceHostEntity\";\r\n\r\n abstract get isSupported(): boolean;\r\n abstract set isSupported(val: boolean);\r\n\r\n abstract get emulate(): boolean;\r\n abstract set emulate(val: boolean);\r\n\r\n abstract get isActive(): boolean;\r\n abstract set isActive(val: boolean);\r\n\r\n abstract session: XRSession | undefined;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ZSpaceHostEntity>(\r\n ZSpaceHostEntity.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeZSpaceHostEntity(appObject: AppObject): ZSpaceHostEntity {\r\n return new ZSpaceHostImp(appObject);\r\n}\r\n\r\nclass ZSpaceHostImp extends ZSpaceHostEntity {\r\n private memoizedIsSupported = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isSupported(): boolean {\r\n return this.memoizedIsSupported.val;\r\n }\r\n set isSupported(val: boolean) {\r\n this.memoizedIsSupported.val = val;\r\n }\r\n\r\n private memoizedEmulate = new MemoizedBoolean(true, this.notifyOnChange);\r\n get emulate(): boolean {\r\n return this.memoizedEmulate.val;\r\n }\r\n set emulate(val: boolean) {\r\n this.memoizedEmulate.val = val;\r\n }\r\n\r\n private memoizedActive = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isActive(): boolean {\r\n return this.memoizedActive.val;\r\n }\r\n set isActive(val: boolean) {\r\n this.memoizedActive.val = val;\r\n }\r\n\r\n session: XRSession | undefined;\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ZSpaceHostEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ZSpaceHost.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/Entities/ZSpaceHost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,qBAAqB,EAErB,eAAe,EAEhB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAgB,gBAAiB,SAAQ,eAAe;IA6B5D;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAtCM,qBAAI,GAAG,kBAAkB,CAAC;AAyCnC;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,aAAc,SAAQ,gBAAgB;IAE1C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,IAAI,WAAW,CAAC,GAAY;QAC1B,IAAI,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,CAAC;IACrC,CAAC;IAGD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,CAAC,GAAY;QACtB,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,GAAG,CAAC;IACjC,CAAC;IAGD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;IACjC,CAAC;IACD,IAAI,QAAQ,CAAC,GAAY;QACvB,IAAI,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,CAAC;IAChC,CAAC;IAID,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QA3BlC,wBAAmB,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAQtE,oBAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAQjE,mBAAc,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAYvE,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import { MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\n\r\n/**\r\n * ZSpaceHostEntity is a singleton entity that manages the state and functionality\r\n * for zSpace integration in VIVED applications.\r\n *\r\n * This entity handles:\r\n * 1. zSpace feature detection (isSupported)\r\n * 2. Emulation mode toggling (emulate)\r\n * 3. Active state management (isActive)\r\n * 4. XR Session management\r\n *\r\n * Usage:\r\n * - To check if zSpace is available: ZSpaceHostEntity.get(appObjects)?.isSupported\r\n * - To check if zSpace is active: ZSpaceHostEntity.get(appObjects)?.isActive\r\n * - To enable/disable emulation: ZSpaceHostEntity.get(appObjects).emulate = true/false\r\n *\r\n * Important: This is a singleton entity - only one instance exists in the application.\r\n * Always access via ZSpaceHostEntity.get(appObjects) rather than creating new instances.\r\n */\r\nexport abstract class ZSpaceHostEntity extends AppObjectEntity {\r\n static type = \"ZSpaceHostEntity\";\r\n\r\n /**\r\n * Whether zSpace hardware is supported in the current environment\r\n */\r\n abstract get isSupported(): boolean;\r\n abstract set isSupported(val: boolean);\r\n\r\n /**\r\n * Whether to emulate zSpace hardware when not available\r\n * When true, the system will simulate zSpace capabilities\r\n */\r\n abstract get emulate(): boolean;\r\n abstract set emulate(val: boolean);\r\n\r\n /**\r\n * Whether zSpace is currently active\r\n * This is true when either real zSpace hardware is active\r\n * or when emulation is enabled\r\n */\r\n abstract get isActive(): boolean;\r\n abstract set isActive(val: boolean);\r\n\r\n /**\r\n * The current XR Session if zSpace is active\r\n */\r\n abstract session: XRSession | undefined;\r\n\r\n /**\r\n * Get the singleton ZSpaceHostEntity instance\r\n * @param appObjects - The AppObjectRepo instance\r\n * @returns The ZSpaceHostEntity instance or undefined if not found\r\n */\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ZSpaceHostEntity>(\r\n ZSpaceHostEntity.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create the ZSpaceHostEntity\r\n * For internal use only - external code should use ZSpaceHostEntity.get()\r\n *\r\n * @param appObject - The AppObject to attach the entity to\r\n * @returns A new ZSpaceHostEntity instance\r\n */\r\nexport function makeZSpaceHostEntity(appObject: AppObject): ZSpaceHostEntity {\r\n return new ZSpaceHostImp(appObject);\r\n}\r\n\r\n/**\r\n * Implementation of ZSpaceHostEntity\r\n * Uses MemoizedBoolean for all properties to ensure proper change notifications\r\n */\r\nclass ZSpaceHostImp extends ZSpaceHostEntity {\r\n private memoizedIsSupported = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isSupported(): boolean {\r\n return this.memoizedIsSupported.val;\r\n }\r\n set isSupported(val: boolean) {\r\n this.memoizedIsSupported.val = val;\r\n }\r\n\r\n private memoizedEmulate = new MemoizedBoolean(true, this.notifyOnChange);\r\n get emulate(): boolean {\r\n return this.memoizedEmulate.val;\r\n }\r\n set emulate(val: boolean) {\r\n this.memoizedEmulate.val = val;\r\n }\r\n\r\n private memoizedActive = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isActive(): boolean {\r\n return this.memoizedActive.val;\r\n }\r\n set isActive(val: boolean) {\r\n this.memoizedActive.val = val;\r\n }\r\n\r\n session: XRSession | undefined;\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ZSpaceHostEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -1,11 +1,57 @@
1
1
  import { getSingletonComponent, AppObjectPM } from "@vived/core";
2
2
  import { ZSpaceHostEntity } from "../Entities";
3
+ /**
4
+ * EmulateZSpacePM is a singleton Presentation Manager that provides a boolean view model
5
+ * indicating whether zSpace emulation is currently enabled.
6
+ *
7
+ * This PM allows UI components to observe and (through controllers) control whether
8
+ * zSpace features should be emulated when actual zSpace hardware is not available.
9
+ *
10
+ * Usage in UI components:
11
+ * 1. Via direct PM access (not recommended for UI components):
12
+ * const pm = EmulateZSpacePM.get(appObjects);
13
+ * pm?.addView((isEmulating) => { updateUIBasedOn(isEmulating); });
14
+ *
15
+ * 2. Via adapter (recommended for React/UI components):
16
+ * import { emulateZSpacePMAdapter } from "../Adapters";
17
+ *
18
+ * // In a React component:
19
+ * const [isEmulating, setIsEmulating] = useState(emulateZSpacePMAdapter.defaultVM);
20
+ *
21
+ * useEffect(() => {
22
+ * emulateZSpacePMAdapter.subscribe(appObjects, setIsEmulating);
23
+ * return () => emulateZSpacePMAdapter.unsubscribe(appObjects, setIsEmulating);
24
+ * }, [appObjects]);
25
+ *
26
+ * 3. To toggle emulation state (in a controller or UI event handler):
27
+ * import { toggleEmulateZSpace } from "../Controllers";
28
+ *
29
+ * // When handling a UI event:
30
+ * const handleToggleEmulation = () => {
31
+ * toggleEmulateZSpace(appObjects);
32
+ * };
33
+ *
34
+ * Emulation is useful during development or when testing on systems without zSpace hardware.
35
+ * When emulation is enabled, many zSpace-specific UI features can still be tested.
36
+ */
3
37
  export class EmulateZSpacePM extends AppObjectPM {
38
+ /**
39
+ * Get the singleton instance of EmulateZSpacePM
40
+ * @param appObjects - The AppObjectRepo instance
41
+ * @returns The EmulateZSpacePM instance or undefined if not found
42
+ */
4
43
  static get(appObjects) {
5
44
  return getSingletonComponent(EmulateZSpacePM.type, appObjects);
6
45
  }
7
46
  }
8
47
  EmulateZSpacePM.type = "EmulateZSpacePM";
48
+ /**
49
+ * Factory function to create the EmulateZSpacePM
50
+ * For internal use only - external code should use EmulateZSpacePM.get()
51
+ *
52
+ * @param appObject - The AppObject to attach the PM to
53
+ * @returns A new EmulateZSpacePM instance
54
+ */
9
55
  export function makeEmulateZSpacePM(appObject) {
10
56
  return new EmulateZSpacePMImp(appObject);
11
57
  }
@@ -13,6 +59,9 @@ class EmulateZSpacePMImp extends EmulateZSpacePM {
13
59
  vmsAreEqual(a, b) {
14
60
  return a === b;
15
61
  }
62
+ get zSpace() {
63
+ return this.getCachedSingleton(ZSpaceHostEntity.type);
64
+ }
16
65
  constructor(appObject) {
17
66
  super(appObject, EmulateZSpacePM.type);
18
67
  this.onEntityChange = () => {
@@ -20,12 +69,12 @@ class EmulateZSpacePMImp extends EmulateZSpacePM {
20
69
  return;
21
70
  this.doUpdateView(this.zSpace.emulate);
22
71
  };
23
- this.zSpace = appObject.getComponent(ZSpaceHostEntity.type);
24
- if (!this.zSpace) {
72
+ const zSpace = this.zSpace;
73
+ if (!zSpace) {
25
74
  this.error("PM Has been added to an app object that does not have a ZSpaceHostEntity");
26
75
  return;
27
76
  }
28
- this.zSpace.addChangeObserver(this.onEntityChange);
77
+ zSpace.addChangeObserver(this.onEntityChange);
29
78
  this.onEntityChange();
30
79
  this.appObjects.registerSingleton(this);
31
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EmulateZSpacePM.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/PMs/EmulateZSpacePM.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAErB,WAAW,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAgB,eAAgB,SAAQ,WAAoB;IAGhE,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,eAAe,CAAC,IAAI,EACpB,UAAU,CACX,CAAC;IACJ,CAAC;;AAPM,oBAAI,GAAG,iBAAiB,CAAC;AAUlC,MAAM,UAAU,mBAAmB,CAAC,SAAoB;IACtD,OAAO,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,kBAAmB,SAAQ,eAAe;IAG9C,WAAW,CAAC,CAAU,EAAE,CAAU;QAChC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAQD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QAPjC,mBAAc,GAAG,GAAG,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC;QAKA,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,YAAY,CAClC,gBAAgB,CAAC,IAAI,CACtB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CACR,0EAA0E,CAC3E,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { ZSpaceHostEntity } from \"../Entities\";\r\n\r\nexport abstract class EmulateZSpacePM extends AppObjectPM<boolean> {\r\n static type = \"EmulateZSpacePM\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<EmulateZSpacePM>(\r\n EmulateZSpacePM.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeEmulateZSpacePM(appObject: AppObject): EmulateZSpacePM {\r\n return new EmulateZSpacePMImp(appObject);\r\n}\r\n\r\nclass EmulateZSpacePMImp extends EmulateZSpacePM {\r\n private zSpace?: ZSpaceHostEntity;\r\n\r\n vmsAreEqual(a: boolean, b: boolean): boolean {\r\n return a === b;\r\n }\r\n\r\n private onEntityChange = () => {\r\n if (!this.zSpace) return;\r\n\r\n this.doUpdateView(this.zSpace.emulate);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, EmulateZSpacePM.type);\r\n\r\n this.zSpace = appObject.getComponent<ZSpaceHostEntity>(\r\n ZSpaceHostEntity.type\r\n );\r\n if (!this.zSpace) {\r\n this.error(\r\n \"PM Has been added to an app object that does not have a ZSpaceHostEntity\"\r\n );\r\n return;\r\n }\r\n this.zSpace.addChangeObserver(this.onEntityChange);\r\n this.onEntityChange();\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"EmulateZSpacePM.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/PMs/EmulateZSpacePM.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAErB,WAAW,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,OAAgB,eAAgB,SAAQ,WAAoB;IAGhE;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,eAAe,CAAC,IAAI,EACpB,UAAU,CACX,CAAC;IACJ,CAAC;;AAZM,oBAAI,GAAG,iBAAiB,CAAC;AAelC;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAoB;IACtD,OAAO,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,kBAAmB,SAAQ,eAAe;IAC9C,WAAW,CAAC,CAAU,EAAE,CAAU;QAChC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,IAAY,MAAM;QAChB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAQD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QAPjC,mBAAc,GAAG,GAAG,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC;QAKA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,CACR,0EAA0E,CAC3E,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { ZSpaceHostEntity } from \"../Entities\";\r\n\r\n/**\r\n * EmulateZSpacePM is a singleton Presentation Manager that provides a boolean view model\r\n * indicating whether zSpace emulation is currently enabled.\r\n *\r\n * This PM allows UI components to observe and (through controllers) control whether\r\n * zSpace features should be emulated when actual zSpace hardware is not available.\r\n *\r\n * Usage in UI components:\r\n * 1. Via direct PM access (not recommended for UI components):\r\n * const pm = EmulateZSpacePM.get(appObjects);\r\n * pm?.addView((isEmulating) => { updateUIBasedOn(isEmulating); });\r\n *\r\n * 2. Via adapter (recommended for React/UI components):\r\n * import { emulateZSpacePMAdapter } from \"../Adapters\";\r\n *\r\n * // In a React component:\r\n * const [isEmulating, setIsEmulating] = useState(emulateZSpacePMAdapter.defaultVM);\r\n *\r\n * useEffect(() => {\r\n * emulateZSpacePMAdapter.subscribe(appObjects, setIsEmulating);\r\n * return () => emulateZSpacePMAdapter.unsubscribe(appObjects, setIsEmulating);\r\n * }, [appObjects]);\r\n *\r\n * 3. To toggle emulation state (in a controller or UI event handler):\r\n * import { toggleEmulateZSpace } from \"../Controllers\";\r\n *\r\n * // When handling a UI event:\r\n * const handleToggleEmulation = () => {\r\n * toggleEmulateZSpace(appObjects);\r\n * };\r\n *\r\n * Emulation is useful during development or when testing on systems without zSpace hardware.\r\n * When emulation is enabled, many zSpace-specific UI features can still be tested.\r\n */\r\nexport abstract class EmulateZSpacePM extends AppObjectPM<boolean> {\r\n static type = \"EmulateZSpacePM\";\r\n\r\n /**\r\n * Get the singleton instance of EmulateZSpacePM\r\n * @param appObjects - The AppObjectRepo instance\r\n * @returns The EmulateZSpacePM instance or undefined if not found\r\n */\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<EmulateZSpacePM>(\r\n EmulateZSpacePM.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create the EmulateZSpacePM\r\n * For internal use only - external code should use EmulateZSpacePM.get()\r\n *\r\n * @param appObject - The AppObject to attach the PM to\r\n * @returns A new EmulateZSpacePM instance\r\n */\r\nexport function makeEmulateZSpacePM(appObject: AppObject): EmulateZSpacePM {\r\n return new EmulateZSpacePMImp(appObject);\r\n}\r\n\r\nclass EmulateZSpacePMImp extends EmulateZSpacePM {\r\n vmsAreEqual(a: boolean, b: boolean): boolean {\r\n return a === b;\r\n }\r\n\r\n private get zSpace() {\r\n return this.getCachedSingleton<ZSpaceHostEntity>(ZSpaceHostEntity.type);\r\n }\r\n\r\n private onEntityChange = () => {\r\n if (!this.zSpace) return;\r\n\r\n this.doUpdateView(this.zSpace.emulate);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, EmulateZSpacePM.type);\r\n\r\n const zSpace = this.zSpace;\r\n if (!zSpace) {\r\n this.error(\r\n \"PM Has been added to an app object that does not have a ZSpaceHostEntity\"\r\n );\r\n return;\r\n }\r\n zSpace.addChangeObserver(this.onEntityChange);\r\n this.onEntityChange();\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -1,11 +1,50 @@
1
1
  import { getSingletonComponent, AppObjectPM } from "@vived/core";
2
2
  import { ZSpaceHostEntity } from "../Entities/ZSpaceHost";
3
+ /**
4
+ * ZSpaceIsActivePM is a singleton Presentation Manager that provides a boolean view model
5
+ * indicating whether zSpace is currently active.
6
+ *
7
+ * This PM observes ZSpaceHostEntity and updates its view model when the isActive property changes.
8
+ *
9
+ * Usage in UI components:
10
+ * 1. Via direct PM access (not recommended for UI components):
11
+ * const pm = ZSpaceIsActivePM.get(appObjects);
12
+ * pm?.addView((isActive) => { updateUIBasedOn(isActive); });
13
+ *
14
+ * 2. Via adapter (recommended for React/UI components):
15
+ * import { zSpaceIsActivePMAdapter } from "../Adapters";
16
+ *
17
+ * // In a React component:
18
+ * const [isZSpaceActive, setIsZSpaceActive] = useState(zSpaceIsActivePMAdapter.defaultVM);
19
+ *
20
+ * useEffect(() => {
21
+ * zSpaceIsActivePMAdapter.subscribe(appObjects, setIsZSpaceActive);
22
+ * return () => zSpaceIsActivePMAdapter.unsubscribe(appObjects, setIsZSpaceActive);
23
+ * }, [appObjects]);
24
+ *
25
+ * When zSpace is active, UI components may want to:
26
+ * - Display 3D content differently
27
+ * - Show zSpace-specific controls
28
+ * - Adjust UI layouts for stereoscopic viewing
29
+ */
3
30
  export class ZSpaceIsActivePM extends AppObjectPM {
31
+ /**
32
+ * Get the singleton instance of ZSpaceIsActivePM
33
+ * @param appObjects - The AppObjectRepo instance
34
+ * @returns The ZSpaceIsActivePM instance or undefined if not found
35
+ */
4
36
  static get(appObjects) {
5
37
  return getSingletonComponent(ZSpaceIsActivePM.type, appObjects);
6
38
  }
7
39
  }
8
40
  ZSpaceIsActivePM.type = "ZSpaceIsActivePM";
41
+ /**
42
+ * Factory function to create the ZSpaceIsActivePM
43
+ * For internal use only - external code should use ZSpaceIsActivePM.get()
44
+ *
45
+ * @param appObject - The AppObject to attach the PM to
46
+ * @returns A new ZSpaceIsActivePM instance
47
+ */
9
48
  export function makeZSpaceIsActivePM(appObject) {
10
49
  return new ZSpaceIsActivePMImp(appObject);
11
50
  }
@@ -13,6 +52,9 @@ class ZSpaceIsActivePMImp extends ZSpaceIsActivePM {
13
52
  vmsAreEqual(a, b) {
14
53
  return a === b;
15
54
  }
55
+ get zSpace() {
56
+ return this.getCachedSingleton(ZSpaceHostEntity.type);
57
+ }
16
58
  constructor(appObject) {
17
59
  super(appObject, ZSpaceIsActivePM.type);
18
60
  this.onEntityChange = () => {
@@ -20,12 +62,12 @@ class ZSpaceIsActivePMImp extends ZSpaceIsActivePM {
20
62
  return;
21
63
  this.doUpdateView(this.zSpace.isActive);
22
64
  };
23
- this.zSpace = appObject.getComponent(ZSpaceHostEntity.type);
24
- if (!this.zSpace) {
65
+ const zSpace = this.zSpace;
66
+ if (!zSpace) {
25
67
  this.error("PM Has been added to an app object that does not have a ZSpaceHostEntity");
26
68
  return;
27
69
  }
28
- this.zSpace.addChangeObserver(this.onEntityChange);
70
+ zSpace.addChangeObserver(this.onEntityChange);
29
71
  this.onEntityChange();
30
72
  this.appObjects.registerSingleton(this);
31
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ZSpaceIsActivePM.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/PMs/ZSpaceIsActivePM.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAErB,WAAW,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,OAAgB,gBAAiB,SAAQ,WAAoB;IAGjE,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAPM,qBAAI,GAAG,kBAAkB,CAAC;AAUnC,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAoB,SAAQ,gBAAgB;IAGhD,WAAW,CAAC,CAAU,EAAE,CAAU;QAChC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAQD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAPlC,mBAAc,GAAG,GAAG,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC,CAAC;QAKA,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,YAAY,CAClC,gBAAgB,CAAC,IAAI,CACtB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,CACR,0EAA0E,CAC3E,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { ZSpaceHostEntity } from \"../Entities/ZSpaceHost\";\r\n\r\nexport abstract class ZSpaceIsActivePM extends AppObjectPM<boolean> {\r\n static type = \"ZSpaceIsActivePM\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ZSpaceIsActivePM>(\r\n ZSpaceIsActivePM.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeZSpaceIsActivePM(appObject: AppObject): ZSpaceIsActivePM {\r\n return new ZSpaceIsActivePMImp(appObject);\r\n}\r\n\r\nclass ZSpaceIsActivePMImp extends ZSpaceIsActivePM {\r\n private zSpace?: ZSpaceHostEntity;\r\n\r\n vmsAreEqual(a: boolean, b: boolean): boolean {\r\n return a === b;\r\n }\r\n\r\n private onEntityChange = () => {\r\n if (!this.zSpace) return;\r\n\r\n this.doUpdateView(this.zSpace.isActive);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ZSpaceIsActivePM.type);\r\n\r\n this.zSpace = appObject.getComponent<ZSpaceHostEntity>(\r\n ZSpaceHostEntity.type\r\n );\r\n if (!this.zSpace) {\r\n this.error(\r\n \"PM Has been added to an app object that does not have a ZSpaceHostEntity\"\r\n );\r\n return;\r\n }\r\n this.zSpace.addChangeObserver(this.onEntityChange);\r\n this.onEntityChange();\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ZSpaceIsActivePM.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/PMs/ZSpaceIsActivePM.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAErB,WAAW,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAgB,gBAAiB,SAAQ,WAAoB;IAGjE;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAZM,qBAAI,GAAG,kBAAkB,CAAC;AAenC;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAoB,SAAQ,gBAAgB;IAChD,WAAW,CAAC,CAAU,EAAE,CAAU;QAChC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,IAAY,MAAM;QAChB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAQD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAPlC,mBAAc,GAAG,GAAG,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC,CAAC;QAKA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,CACR,0EAA0E,CAC3E,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { ZSpaceHostEntity } from \"../Entities/ZSpaceHost\";\r\n\r\n/**\r\n * ZSpaceIsActivePM is a singleton Presentation Manager that provides a boolean view model\r\n * indicating whether zSpace is currently active.\r\n *\r\n * This PM observes ZSpaceHostEntity and updates its view model when the isActive property changes.\r\n *\r\n * Usage in UI components:\r\n * 1. Via direct PM access (not recommended for UI components):\r\n * const pm = ZSpaceIsActivePM.get(appObjects);\r\n * pm?.addView((isActive) => { updateUIBasedOn(isActive); });\r\n *\r\n * 2. Via adapter (recommended for React/UI components):\r\n * import { zSpaceIsActivePMAdapter } from \"../Adapters\";\r\n *\r\n * // In a React component:\r\n * const [isZSpaceActive, setIsZSpaceActive] = useState(zSpaceIsActivePMAdapter.defaultVM);\r\n *\r\n * useEffect(() => {\r\n * zSpaceIsActivePMAdapter.subscribe(appObjects, setIsZSpaceActive);\r\n * return () => zSpaceIsActivePMAdapter.unsubscribe(appObjects, setIsZSpaceActive);\r\n * }, [appObjects]);\r\n *\r\n * When zSpace is active, UI components may want to:\r\n * - Display 3D content differently\r\n * - Show zSpace-specific controls\r\n * - Adjust UI layouts for stereoscopic viewing\r\n */\r\nexport abstract class ZSpaceIsActivePM extends AppObjectPM<boolean> {\r\n static type = \"ZSpaceIsActivePM\";\r\n\r\n /**\r\n * Get the singleton instance of ZSpaceIsActivePM\r\n * @param appObjects - The AppObjectRepo instance\r\n * @returns The ZSpaceIsActivePM instance or undefined if not found\r\n */\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ZSpaceIsActivePM>(\r\n ZSpaceIsActivePM.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create the ZSpaceIsActivePM\r\n * For internal use only - external code should use ZSpaceIsActivePM.get()\r\n *\r\n * @param appObject - The AppObject to attach the PM to\r\n * @returns A new ZSpaceIsActivePM instance\r\n */\r\nexport function makeZSpaceIsActivePM(appObject: AppObject): ZSpaceIsActivePM {\r\n return new ZSpaceIsActivePMImp(appObject);\r\n}\r\n\r\nclass ZSpaceIsActivePMImp extends ZSpaceIsActivePM {\r\n vmsAreEqual(a: boolean, b: boolean): boolean {\r\n return a === b;\r\n }\r\n\r\n private get zSpace() {\r\n return this.getCachedSingleton<ZSpaceHostEntity>(ZSpaceHostEntity.type);\r\n }\r\n\r\n private onEntityChange = () => {\r\n if (!this.zSpace) return;\r\n\r\n this.doUpdateView(this.zSpace.isActive);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ZSpaceIsActivePM.type);\r\n\r\n const zSpace = this.zSpace;\r\n if (!zSpace) {\r\n this.error(\r\n \"PM Has been added to an app object that does not have a ZSpaceHostEntity\"\r\n );\r\n return;\r\n }\r\n zSpace.addChangeObserver(this.onEntityChange);\r\n this.onEntityChange();\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -1,5 +1,43 @@
1
1
  import { getSingletonComponent, AppObjectUC } from "@vived/core";
2
+ /**
3
+ * StartZSpaceUC is a singleton Use Case responsible for starting a zSpace session.
4
+ *
5
+ * This Use Case handles:
6
+ * 1. Setting up and initializing the zSpace XR session
7
+ * 2. Updating the ZSpaceHostEntity to reflect the active state
8
+ * 3. Handling errors in the setup process
9
+ *
10
+ * Usage:
11
+ * ```typescript
12
+ * // In a controller or UI event handler:
13
+ * const startZSpace = async (appObjects) => {
14
+ * const uc = StartZSpaceUC.get(appObjects);
15
+ * if (!uc) {
16
+ * console.error("StartZSpaceUC not found");
17
+ * return;
18
+ * }
19
+ *
20
+ * try {
21
+ * await uc.startZSpace();
22
+ * console.log("zSpace session started successfully");
23
+ * } catch (error) {
24
+ * console.error("Failed to start zSpace session:", error);
25
+ * }
26
+ * };
27
+ * ```
28
+ *
29
+ * Important notes:
30
+ * - This is an asynchronous operation and may take some time to complete
31
+ * - Success/failure is indicated by the Promise resolution/rejection
32
+ * - When successful, ZSpaceHostEntity.isActive will be set to true
33
+ * - UI components should observe ZSpaceIsActivePM to react to state changes
34
+ */
2
35
  export class StartZSpaceUC extends AppObjectUC {
36
+ /**
37
+ * Get the singleton instance of StartZSpaceUC
38
+ * @param appObjects - The AppObjectRepo instance
39
+ * @returns The StartZSpaceUC instance or undefined if not found
40
+ */
3
41
  static get(appObjects) {
4
42
  return getSingletonComponent(StartZSpaceUC.type, appObjects);
5
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StartZSpaceUC.js","sourceRoot":"","sources":["../../../../../src/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAiB,WAAW,EAAE,MAAM,aAAa,CAAC;AAEhF,MAAM,OAAgB,aAAc,SAAQ,WAAW;IAKrD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;;AANM,kBAAI,GAAG,eAAe,CAAC","sourcesContent":["import { getSingletonComponent, AppObjectRepo, AppObjectUC } from \"@vived/core\";\r\n\r\nexport abstract class StartZSpaceUC extends AppObjectUC {\r\n static type = \"StartZSpaceUC\";\r\n\r\n abstract startZSpace(): Promise<void>;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<StartZSpaceUC>(StartZSpaceUC.type, appObjects);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"StartZSpaceUC.js","sourceRoot":"","sources":["../../../../../src/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAiB,WAAW,EAAE,MAAM,aAAa,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAgB,aAAc,SAAQ,WAAW;IAUrD;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;;AAhBM,kBAAI,GAAG,eAAe,CAAC","sourcesContent":["import { getSingletonComponent, AppObjectRepo, AppObjectUC } from \"@vived/core\";\r\n\r\n/**\r\n * StartZSpaceUC is a singleton Use Case responsible for starting a zSpace session.\r\n *\r\n * This Use Case handles:\r\n * 1. Setting up and initializing the zSpace XR session\r\n * 2. Updating the ZSpaceHostEntity to reflect the active state\r\n * 3. Handling errors in the setup process\r\n *\r\n * Usage:\r\n * ```typescript\r\n * // In a controller or UI event handler:\r\n * const startZSpace = async (appObjects) => {\r\n * const uc = StartZSpaceUC.get(appObjects);\r\n * if (!uc) {\r\n * console.error(\"StartZSpaceUC not found\");\r\n * return;\r\n * }\r\n *\r\n * try {\r\n * await uc.startZSpace();\r\n * console.log(\"zSpace session started successfully\");\r\n * } catch (error) {\r\n * console.error(\"Failed to start zSpace session:\", error);\r\n * }\r\n * };\r\n * ```\r\n *\r\n * Important notes:\r\n * - This is an asynchronous operation and may take some time to complete\r\n * - Success/failure is indicated by the Promise resolution/rejection\r\n * - When successful, ZSpaceHostEntity.isActive will be set to true\r\n * - UI components should observe ZSpaceIsActivePM to react to state changes\r\n */\r\nexport abstract class StartZSpaceUC extends AppObjectUC {\r\n static type = \"StartZSpaceUC\";\r\n\r\n /**\r\n * Start the zSpace session\r\n * @returns A Promise that resolves when the session has started successfully,\r\n * or rejects with an error if the session could not be started\r\n */\r\n abstract startZSpace(): Promise<void>;\r\n\r\n /**\r\n * Get the singleton instance of StartZSpaceUC\r\n * @param appObjects - The AppObjectRepo instance\r\n * @returns The StartZSpaceUC instance or undefined if not found\r\n */\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<StartZSpaceUC>(StartZSpaceUC.type, appObjects);\r\n }\r\n}\r\n"]}