@vived/host 4.3.0 → 4.4.1

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 (99) 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/Factories/setupChallengeResults.js +1 -0
  8. package/dist/cjs/ChallengeResults/Factories/setupChallengeResults.js.map +1 -1
  9. package/dist/cjs/ChallengeResults/Mocks/MockChallengeScoreListPM.js +19 -0
  10. package/dist/cjs/ChallengeResults/Mocks/MockChallengeScoreListPM.js.map +1 -0
  11. package/dist/cjs/ChallengeResults/Mocks/index.js +1 -0
  12. package/dist/cjs/ChallengeResults/Mocks/index.js.map +1 -1
  13. package/dist/cjs/ChallengeResults/PMs/ChallengeScoreListPM.js +78 -0
  14. package/dist/cjs/ChallengeResults/PMs/ChallengeScoreListPM.js.map +1 -0
  15. package/dist/cjs/ChallengeResults/PMs/index.js +1 -0
  16. package/dist/cjs/ChallengeResults/PMs/index.js.map +1 -1
  17. package/dist/cjs/Handler/UCs/SubmitResultHandler.js +22 -7
  18. package/dist/cjs/Handler/UCs/SubmitResultHandler.js.map +1 -1
  19. package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js +6 -6
  20. package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
  21. package/dist/cjs/ZSpaceHost/Entities/ZSpaceHost.js +34 -0
  22. package/dist/cjs/ZSpaceHost/Entities/ZSpaceHost.js.map +1 -1
  23. package/dist/cjs/ZSpaceHost/PMs/EmulateZSpacePM.js +52 -3
  24. package/dist/cjs/ZSpaceHost/PMs/EmulateZSpacePM.js.map +1 -1
  25. package/dist/cjs/ZSpaceHost/PMs/ZSpaceIsActivePM.js +45 -3
  26. package/dist/cjs/ZSpaceHost/PMs/ZSpaceIsActivePM.js.map +1 -1
  27. package/dist/cjs/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.js +38 -0
  28. package/dist/cjs/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.js.map +1 -1
  29. package/dist/cjs/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.js +36 -0
  30. package/dist/cjs/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.js.map +1 -1
  31. package/dist/cjs/ZSpaceHost/UCs/checkForZSpaceSupport.js +36 -0
  32. package/dist/cjs/ZSpaceHost/UCs/checkForZSpaceSupport.js.map +1 -1
  33. package/dist/cjs/ZSpaceHost/index.js +68 -0
  34. package/dist/cjs/ZSpaceHost/index.js.map +1 -1
  35. package/dist/esm/ChallengeResults/Adapters/challengeScoreListAdapter.js +16 -0
  36. package/dist/esm/ChallengeResults/Adapters/challengeScoreListAdapter.js.map +1 -0
  37. package/dist/esm/ChallengeResults/Adapters/index.js +1 -0
  38. package/dist/esm/ChallengeResults/Adapters/index.js.map +1 -1
  39. package/dist/esm/ChallengeResults/Entities/ChallengeResults.js +35 -0
  40. package/dist/esm/ChallengeResults/Entities/ChallengeResults.js.map +1 -1
  41. package/dist/esm/ChallengeResults/Factories/setupChallengeResults.js +2 -1
  42. package/dist/esm/ChallengeResults/Factories/setupChallengeResults.js.map +1 -1
  43. package/dist/esm/ChallengeResults/Mocks/MockChallengeScoreListPM.js +14 -0
  44. package/dist/esm/ChallengeResults/Mocks/MockChallengeScoreListPM.js.map +1 -0
  45. package/dist/esm/ChallengeResults/Mocks/index.js +1 -0
  46. package/dist/esm/ChallengeResults/Mocks/index.js.map +1 -1
  47. package/dist/esm/ChallengeResults/PMs/ChallengeScoreListPM.js +73 -0
  48. package/dist/esm/ChallengeResults/PMs/ChallengeScoreListPM.js.map +1 -0
  49. package/dist/esm/ChallengeResults/PMs/index.js +1 -0
  50. package/dist/esm/ChallengeResults/PMs/index.js.map +1 -1
  51. package/dist/esm/Handler/UCs/SubmitResultHandler.js +23 -8
  52. package/dist/esm/Handler/UCs/SubmitResultHandler.js.map +1 -1
  53. package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js +6 -6
  54. package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
  55. package/dist/esm/ZSpaceHost/Entities/ZSpaceHost.js +34 -0
  56. package/dist/esm/ZSpaceHost/Entities/ZSpaceHost.js.map +1 -1
  57. package/dist/esm/ZSpaceHost/PMs/EmulateZSpacePM.js +52 -3
  58. package/dist/esm/ZSpaceHost/PMs/EmulateZSpacePM.js.map +1 -1
  59. package/dist/esm/ZSpaceHost/PMs/ZSpaceIsActivePM.js +45 -3
  60. package/dist/esm/ZSpaceHost/PMs/ZSpaceIsActivePM.js.map +1 -1
  61. package/dist/esm/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.js +38 -0
  62. package/dist/esm/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.js.map +1 -1
  63. package/dist/esm/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.js +36 -0
  64. package/dist/esm/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.js.map +1 -1
  65. package/dist/esm/ZSpaceHost/UCs/checkForZSpaceSupport.js +36 -0
  66. package/dist/esm/ZSpaceHost/UCs/checkForZSpaceSupport.js.map +1 -1
  67. package/dist/esm/ZSpaceHost/index.js +68 -0
  68. package/dist/esm/ZSpaceHost/index.js.map +1 -1
  69. package/dist/types/ChallengeResults/Adapters/challengeScoreListAdapter.d.ts +4 -0
  70. package/dist/types/ChallengeResults/Adapters/challengeScoreListAdapter.d.ts.map +1 -0
  71. package/dist/types/ChallengeResults/Adapters/index.d.ts +1 -0
  72. package/dist/types/ChallengeResults/Adapters/index.d.ts.map +1 -1
  73. package/dist/types/ChallengeResults/Entities/ChallengeResults.d.ts +1 -0
  74. package/dist/types/ChallengeResults/Entities/ChallengeResults.d.ts.map +1 -1
  75. package/dist/types/ChallengeResults/Factories/setupChallengeResults.d.ts.map +1 -1
  76. package/dist/types/ChallengeResults/Mocks/MockChallengeScoreListPM.d.ts +8 -0
  77. package/dist/types/ChallengeResults/Mocks/MockChallengeScoreListPM.d.ts.map +1 -0
  78. package/dist/types/ChallengeResults/Mocks/index.d.ts +1 -0
  79. package/dist/types/ChallengeResults/Mocks/index.d.ts.map +1 -1
  80. package/dist/types/ChallengeResults/PMs/ChallengeScoreListPM.d.ts +12 -0
  81. package/dist/types/ChallengeResults/PMs/ChallengeScoreListPM.d.ts.map +1 -0
  82. package/dist/types/ChallengeResults/PMs/index.d.ts +1 -0
  83. package/dist/types/ChallengeResults/PMs/index.d.ts.map +1 -1
  84. package/dist/types/Handler/UCs/SubmitResultHandler.d.ts.map +1 -1
  85. package/dist/types/ZSpaceHost/Entities/ZSpaceHost.d.ts +45 -0
  86. package/dist/types/ZSpaceHost/Entities/ZSpaceHost.d.ts.map +1 -1
  87. package/dist/types/ZSpaceHost/PMs/EmulateZSpacePM.d.ts +46 -0
  88. package/dist/types/ZSpaceHost/PMs/EmulateZSpacePM.d.ts.map +1 -1
  89. package/dist/types/ZSpaceHost/PMs/ZSpaceIsActivePM.d.ts +39 -0
  90. package/dist/types/ZSpaceHost/PMs/ZSpaceIsActivePM.d.ts.map +1 -1
  91. package/dist/types/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.d.ts +43 -0
  92. package/dist/types/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.d.ts.map +1 -1
  93. package/dist/types/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.d.ts +40 -0
  94. package/dist/types/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.d.ts.map +1 -1
  95. package/dist/types/ZSpaceHost/UCs/checkForZSpaceSupport.d.ts +36 -0
  96. package/dist/types/ZSpaceHost/UCs/checkForZSpaceSupport.d.ts.map +1 -1
  97. package/dist/types/ZSpaceHost/index.d.ts +68 -0
  98. package/dist/types/ZSpaceHost/index.d.ts.map +1 -1
  99. package/package.json +1 -1
@@ -4,13 +4,59 @@ exports.EmulateZSpacePM = void 0;
4
4
  exports.makeEmulateZSpacePM = makeEmulateZSpacePM;
5
5
  const core_1 = require("@vived/core");
6
6
  const Entities_1 = require("../Entities");
7
+ /**
8
+ * EmulateZSpacePM is a singleton Presentation Manager that provides a boolean view model
9
+ * indicating whether zSpace emulation is currently enabled.
10
+ *
11
+ * This PM allows UI components to observe and (through controllers) control whether
12
+ * zSpace features should be emulated when actual zSpace hardware is not available.
13
+ *
14
+ * Usage in UI components:
15
+ * 1. Via direct PM access (not recommended for UI components):
16
+ * const pm = EmulateZSpacePM.get(appObjects);
17
+ * pm?.addView((isEmulating) => { updateUIBasedOn(isEmulating); });
18
+ *
19
+ * 2. Via adapter (recommended for React/UI components):
20
+ * import { emulateZSpacePMAdapter } from "../Adapters";
21
+ *
22
+ * // In a React component:
23
+ * const [isEmulating, setIsEmulating] = useState(emulateZSpacePMAdapter.defaultVM);
24
+ *
25
+ * useEffect(() => {
26
+ * emulateZSpacePMAdapter.subscribe(appObjects, setIsEmulating);
27
+ * return () => emulateZSpacePMAdapter.unsubscribe(appObjects, setIsEmulating);
28
+ * }, [appObjects]);
29
+ *
30
+ * 3. To toggle emulation state (in a controller or UI event handler):
31
+ * import { toggleEmulateZSpace } from "../Controllers";
32
+ *
33
+ * // When handling a UI event:
34
+ * const handleToggleEmulation = () => {
35
+ * toggleEmulateZSpace(appObjects);
36
+ * };
37
+ *
38
+ * Emulation is useful during development or when testing on systems without zSpace hardware.
39
+ * When emulation is enabled, many zSpace-specific UI features can still be tested.
40
+ */
7
41
  class EmulateZSpacePM extends core_1.AppObjectPM {
42
+ /**
43
+ * Get the singleton instance of EmulateZSpacePM
44
+ * @param appObjects - The AppObjectRepo instance
45
+ * @returns The EmulateZSpacePM instance or undefined if not found
46
+ */
8
47
  static get(appObjects) {
9
48
  return (0, core_1.getSingletonComponent)(EmulateZSpacePM.type, appObjects);
10
49
  }
11
50
  }
12
51
  exports.EmulateZSpacePM = EmulateZSpacePM;
13
52
  EmulateZSpacePM.type = "EmulateZSpacePM";
53
+ /**
54
+ * Factory function to create the EmulateZSpacePM
55
+ * For internal use only - external code should use EmulateZSpacePM.get()
56
+ *
57
+ * @param appObject - The AppObject to attach the PM to
58
+ * @returns A new EmulateZSpacePM instance
59
+ */
14
60
  function makeEmulateZSpacePM(appObject) {
15
61
  return new EmulateZSpacePMImp(appObject);
16
62
  }
@@ -18,6 +64,9 @@ class EmulateZSpacePMImp extends EmulateZSpacePM {
18
64
  vmsAreEqual(a, b) {
19
65
  return a === b;
20
66
  }
67
+ get zSpace() {
68
+ return this.getCachedSingleton(Entities_1.ZSpaceHostEntity.type);
69
+ }
21
70
  constructor(appObject) {
22
71
  super(appObject, EmulateZSpacePM.type);
23
72
  this.onEntityChange = () => {
@@ -25,12 +74,12 @@ class EmulateZSpacePMImp extends EmulateZSpacePM {
25
74
  return;
26
75
  this.doUpdateView(this.zSpace.emulate);
27
76
  };
28
- this.zSpace = appObject.getComponent(Entities_1.ZSpaceHostEntity.type);
29
- if (!this.zSpace) {
77
+ const zSpace = this.zSpace;
78
+ if (!zSpace) {
30
79
  this.error("PM Has been added to an app object that does not have a ZSpaceHostEntity");
31
80
  return;
32
81
  }
33
- this.zSpace.addChangeObserver(this.onEntityChange);
82
+ zSpace.addChangeObserver(this.onEntityChange);
34
83
  this.onEntityChange();
35
84
  this.appObjects.registerSingleton(this);
36
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EmulateZSpacePM.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/PMs/EmulateZSpacePM.ts"],"names":[],"mappings":";;;AAmBA,kDAEC;AArBD,sCAKqB;AACrB,0CAA+C;AAE/C,MAAsB,eAAgB,SAAQ,kBAAoB;IAGhE,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,eAAe,CAAC,IAAI,EACpB,UAAU,CACX,CAAC;IACJ,CAAC;;AARH,0CASC;AARQ,oBAAI,GAAG,iBAAiB,CAAC;AAUlC,SAAgB,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,2BAAgB,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":";;;AAiEA,kDAEC;AAnED,sCAKqB;AACrB,0CAA+C;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAsB,eAAgB,SAAQ,kBAAoB;IAGhE;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,eAAe,CAAC,IAAI,EACpB,UAAU,CACX,CAAC;IACJ,CAAC;;AAbH,0CAcC;AAbQ,oBAAI,GAAG,iBAAiB,CAAC;AAelC;;;;;;GAMG;AACH,SAAgB,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,2BAAgB,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"]}
@@ -4,13 +4,52 @@ exports.ZSpaceIsActivePM = void 0;
4
4
  exports.makeZSpaceIsActivePM = makeZSpaceIsActivePM;
5
5
  const core_1 = require("@vived/core");
6
6
  const ZSpaceHost_1 = require("../Entities/ZSpaceHost");
7
+ /**
8
+ * ZSpaceIsActivePM is a singleton Presentation Manager that provides a boolean view model
9
+ * indicating whether zSpace is currently active.
10
+ *
11
+ * This PM observes ZSpaceHostEntity and updates its view model when the isActive property changes.
12
+ *
13
+ * Usage in UI components:
14
+ * 1. Via direct PM access (not recommended for UI components):
15
+ * const pm = ZSpaceIsActivePM.get(appObjects);
16
+ * pm?.addView((isActive) => { updateUIBasedOn(isActive); });
17
+ *
18
+ * 2. Via adapter (recommended for React/UI components):
19
+ * import { zSpaceIsActivePMAdapter } from "../Adapters";
20
+ *
21
+ * // In a React component:
22
+ * const [isZSpaceActive, setIsZSpaceActive] = useState(zSpaceIsActivePMAdapter.defaultVM);
23
+ *
24
+ * useEffect(() => {
25
+ * zSpaceIsActivePMAdapter.subscribe(appObjects, setIsZSpaceActive);
26
+ * return () => zSpaceIsActivePMAdapter.unsubscribe(appObjects, setIsZSpaceActive);
27
+ * }, [appObjects]);
28
+ *
29
+ * When zSpace is active, UI components may want to:
30
+ * - Display 3D content differently
31
+ * - Show zSpace-specific controls
32
+ * - Adjust UI layouts for stereoscopic viewing
33
+ */
7
34
  class ZSpaceIsActivePM extends core_1.AppObjectPM {
35
+ /**
36
+ * Get the singleton instance of ZSpaceIsActivePM
37
+ * @param appObjects - The AppObjectRepo instance
38
+ * @returns The ZSpaceIsActivePM instance or undefined if not found
39
+ */
8
40
  static get(appObjects) {
9
41
  return (0, core_1.getSingletonComponent)(ZSpaceIsActivePM.type, appObjects);
10
42
  }
11
43
  }
12
44
  exports.ZSpaceIsActivePM = ZSpaceIsActivePM;
13
45
  ZSpaceIsActivePM.type = "ZSpaceIsActivePM";
46
+ /**
47
+ * Factory function to create the ZSpaceIsActivePM
48
+ * For internal use only - external code should use ZSpaceIsActivePM.get()
49
+ *
50
+ * @param appObject - The AppObject to attach the PM to
51
+ * @returns A new ZSpaceIsActivePM instance
52
+ */
14
53
  function makeZSpaceIsActivePM(appObject) {
15
54
  return new ZSpaceIsActivePMImp(appObject);
16
55
  }
@@ -18,6 +57,9 @@ class ZSpaceIsActivePMImp extends ZSpaceIsActivePM {
18
57
  vmsAreEqual(a, b) {
19
58
  return a === b;
20
59
  }
60
+ get zSpace() {
61
+ return this.getCachedSingleton(ZSpaceHost_1.ZSpaceHostEntity.type);
62
+ }
21
63
  constructor(appObject) {
22
64
  super(appObject, ZSpaceIsActivePM.type);
23
65
  this.onEntityChange = () => {
@@ -25,12 +67,12 @@ class ZSpaceIsActivePMImp extends ZSpaceIsActivePM {
25
67
  return;
26
68
  this.doUpdateView(this.zSpace.isActive);
27
69
  };
28
- this.zSpace = appObject.getComponent(ZSpaceHost_1.ZSpaceHostEntity.type);
29
- if (!this.zSpace) {
70
+ const zSpace = this.zSpace;
71
+ if (!zSpace) {
30
72
  this.error("PM Has been added to an app object that does not have a ZSpaceHostEntity");
31
73
  return;
32
74
  }
33
- this.zSpace.addChangeObserver(this.onEntityChange);
75
+ zSpace.addChangeObserver(this.onEntityChange);
34
76
  this.onEntityChange();
35
77
  this.appObjects.registerSingleton(this);
36
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ZSpaceIsActivePM.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/PMs/ZSpaceIsActivePM.ts"],"names":[],"mappings":";;;AAmBA,oDAEC;AArBD,sCAKqB;AACrB,uDAA0D;AAE1D,MAAsB,gBAAiB,SAAQ,kBAAoB;IAGjE,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AARH,4CASC;AARQ,qBAAI,GAAG,kBAAkB,CAAC;AAUnC,SAAgB,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,6BAAgB,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":";;;AA0DA,oDAEC;AA5DD,sCAKqB;AACrB,uDAA0D;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAsB,gBAAiB,SAAQ,kBAAoB;IAGjE;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAbH,4CAcC;AAbQ,qBAAI,GAAG,kBAAkB,CAAC;AAenC;;;;;;GAMG;AACH,SAAgB,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,6BAAgB,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"]}
@@ -2,7 +2,45 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StartZSpaceUC = void 0;
4
4
  const core_1 = require("@vived/core");
5
+ /**
6
+ * StartZSpaceUC is a singleton Use Case responsible for starting a zSpace session.
7
+ *
8
+ * This Use Case handles:
9
+ * 1. Setting up and initializing the zSpace XR session
10
+ * 2. Updating the ZSpaceHostEntity to reflect the active state
11
+ * 3. Handling errors in the setup process
12
+ *
13
+ * Usage:
14
+ * ```typescript
15
+ * // In a controller or UI event handler:
16
+ * const startZSpace = async (appObjects) => {
17
+ * const uc = StartZSpaceUC.get(appObjects);
18
+ * if (!uc) {
19
+ * console.error("StartZSpaceUC not found");
20
+ * return;
21
+ * }
22
+ *
23
+ * try {
24
+ * await uc.startZSpace();
25
+ * console.log("zSpace session started successfully");
26
+ * } catch (error) {
27
+ * console.error("Failed to start zSpace session:", error);
28
+ * }
29
+ * };
30
+ * ```
31
+ *
32
+ * Important notes:
33
+ * - This is an asynchronous operation and may take some time to complete
34
+ * - Success/failure is indicated by the Promise resolution/rejection
35
+ * - When successful, ZSpaceHostEntity.isActive will be set to true
36
+ * - UI components should observe ZSpaceIsActivePM to react to state changes
37
+ */
5
38
  class StartZSpaceUC extends core_1.AppObjectUC {
39
+ /**
40
+ * Get the singleton instance of StartZSpaceUC
41
+ * @param appObjects - The AppObjectRepo instance
42
+ * @returns The StartZSpaceUC instance or undefined if not found
43
+ */
6
44
  static get(appObjects) {
7
45
  return (0, core_1.getSingletonComponent)(StartZSpaceUC.type, appObjects);
8
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StartZSpaceUC.js","sourceRoot":"","sources":["../../../../../src/ZSpaceHost/UCs/StartZSpace/StartZSpaceUC.ts"],"names":[],"mappings":";;;AAAA,sCAAgF;AAEhF,MAAsB,aAAc,SAAQ,kBAAW;IAKrD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;;AAPH,sCAQC;AAPQ,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,sCAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAsB,aAAc,SAAQ,kBAAW;IAUrD;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;;AAjBH,sCAkBC;AAjBQ,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"]}
@@ -2,7 +2,43 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StopZSpaceUC = void 0;
4
4
  const core_1 = require("@vived/core");
5
+ /**
6
+ * StopZSpaceUC is a singleton Use Case responsible for stopping an active zSpace session.
7
+ *
8
+ * This Use Case handles:
9
+ * 1. Properly ending the current zSpace XR session
10
+ * 2. Cleaning up resources associated with the session
11
+ * 3. Updating the ZSpaceHostEntity to reflect the inactive state
12
+ *
13
+ * Usage:
14
+ * ```typescript
15
+ * // In a controller or UI event handler:
16
+ * const stopZSpace = (appObjects) => {
17
+ * const uc = StopZSpaceUC.get(appObjects);
18
+ * if (!uc) {
19
+ * console.error("StopZSpaceUC not found");
20
+ * return;
21
+ * }
22
+ *
23
+ * uc.stopZSpace();
24
+ * console.log("zSpace session stopped");
25
+ * };
26
+ * ```
27
+ *
28
+ * Important notes:
29
+ * - This is a synchronous operation and completes immediately
30
+ * - When called, ZSpaceHostEntity.isActive will be set to false
31
+ * - UI components should observe ZSpaceIsActivePM to react to state changes
32
+ * - This should be called when the application no longer needs zSpace features
33
+ * - It's good practice to call this before application shutdown or when
34
+ * transitioning to a non-zSpace part of the application
35
+ */
5
36
  class StopZSpaceUC extends core_1.AppObjectUC {
37
+ /**
38
+ * Get the singleton instance of StopZSpaceUC
39
+ * @param appObjects - The AppObjectRepo instance
40
+ * @returns The StopZSpaceUC instance or undefined if not found
41
+ */
6
42
  static get(appObjects) {
7
43
  return (0, core_1.getSingletonComponent)(StopZSpaceUC.type, appObjects);
8
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StopZSpaceUC.js","sourceRoot":"","sources":["../../../../../src/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.ts"],"names":[],"mappings":";;;AAAA,sCAAgF;AAEhF,MAAsB,YAAa,SAAQ,kBAAW;IAKpD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAAe,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5E,CAAC;;AAPH,oCAQC;AAPQ,iBAAI,GAAG,cAAc,CAAC","sourcesContent":["import { getSingletonComponent, AppObjectRepo, AppObjectUC } from \"@vived/core\";\r\n\r\nexport abstract class StopZSpaceUC extends AppObjectUC {\r\n static type = \"StopZSpaceUC\";\r\n\r\n abstract stopZSpace(): void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<StopZSpaceUC>(StopZSpaceUC.type, appObjects);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"StopZSpaceUC.js","sourceRoot":"","sources":["../../../../../src/ZSpaceHost/UCs/StopZSpace/StopZSpaceUC.ts"],"names":[],"mappings":";;;AAAA,sCAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAsB,YAAa,SAAQ,kBAAW;IASpD;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAAe,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5E,CAAC;;AAhBH,oCAiBC;AAhBQ,iBAAI,GAAG,cAAc,CAAC","sourcesContent":["import { getSingletonComponent, AppObjectRepo, AppObjectUC } from \"@vived/core\";\r\n\r\n/**\r\n * StopZSpaceUC is a singleton Use Case responsible for stopping an active zSpace session.\r\n *\r\n * This Use Case handles:\r\n * 1. Properly ending the current zSpace XR session\r\n * 2. Cleaning up resources associated with the session\r\n * 3. Updating the ZSpaceHostEntity to reflect the inactive state\r\n *\r\n * Usage:\r\n * ```typescript\r\n * // In a controller or UI event handler:\r\n * const stopZSpace = (appObjects) => {\r\n * const uc = StopZSpaceUC.get(appObjects);\r\n * if (!uc) {\r\n * console.error(\"StopZSpaceUC not found\");\r\n * return;\r\n * }\r\n *\r\n * uc.stopZSpace();\r\n * console.log(\"zSpace session stopped\");\r\n * };\r\n * ```\r\n *\r\n * Important notes:\r\n * - This is a synchronous operation and completes immediately\r\n * - When called, ZSpaceHostEntity.isActive will be set to false\r\n * - UI components should observe ZSpaceIsActivePM to react to state changes\r\n * - This should be called when the application no longer needs zSpace features\r\n * - It's good practice to call this before application shutdown or when\r\n * transitioning to a non-zSpace part of the application\r\n */\r\nexport abstract class StopZSpaceUC extends AppObjectUC {\r\n static type = \"StopZSpaceUC\";\r\n\r\n /**\r\n * Stop the active zSpace session\r\n * This method completes synchronously and does not return a value\r\n */\r\n abstract stopZSpace(): void;\r\n\r\n /**\r\n * Get the singleton instance of StopZSpaceUC\r\n * @param appObjects - The AppObjectRepo instance\r\n * @returns The StopZSpaceUC instance or undefined if not found\r\n */\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<StopZSpaceUC>(StopZSpaceUC.type, appObjects);\r\n }\r\n}\r\n"]}
@@ -2,6 +2,42 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.checkForWebXRSupport = checkForWebXRSupport;
4
4
  const ZSpaceHost_1 = require("../Entities/ZSpaceHost");
5
+ /**
6
+ * Checks if the current browser environment supports WebXR and zSpace hardware
7
+ *
8
+ * This utility function:
9
+ * 1. Checks if navigator.xr is available (WebXR API support)
10
+ * 2. Tests if 'immersive-vr' sessions are supported (required for zSpace)
11
+ * 3. Updates the ZSpaceHostEntity.isSupported property based on results
12
+ *
13
+ * Usage:
14
+ * ```typescript
15
+ * // Typically called during application initialization:
16
+ * import { checkForWebXRSupport } from "@vived/host/ZSpaceHost/UCs";
17
+ *
18
+ * async function initializeApp(appObjects) {
19
+ * // Check for zSpace hardware support
20
+ * await checkForWebXRSupport(appObjects);
21
+ *
22
+ * // Get the current support status
23
+ * const zSpace = ZSpaceHostEntity.get(appObjects);
24
+ * if (zSpace?.isSupported) {
25
+ * console.log("zSpace hardware is supported");
26
+ * } else {
27
+ * console.log("zSpace hardware is not supported, using fallback mode");
28
+ * }
29
+ * }
30
+ * ```
31
+ *
32
+ * Important notes:
33
+ * - This function should be called during application initialization
34
+ * - It returns a Promise that resolves when the check is complete
35
+ * - To observe changes in support status, use the ZSpaceIsActivePM
36
+ * - If hardware is not supported, you may want to enable emulation mode
37
+ *
38
+ * @param appObjects - The AppObjectRepo instance
39
+ * @returns A Promise that resolves when the check is complete
40
+ */
5
41
  function checkForWebXRSupport(appObjects) {
6
42
  return new Promise((resolve) => {
7
43
  const zSpace = ZSpaceHost_1.ZSpaceHostEntity.get(appObjects);
@@ -1 +1 @@
1
- {"version":3,"file":"checkForZSpaceSupport.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/UCs/checkForZSpaceSupport.ts"],"names":[],"mappings":";;AAGA,oDA4BC;AA9BD,uDAA0D;AAE1D,SAAgB,oBAAoB,CAAC,UAAyB;IAC5D,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,6BAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,UAAU,CAAC,WAAW,CACpB,sBAAsB,EACtB,iCAAiC,CAClC,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAS,SAAiB,CAAC,EAAE,CAAC;QAEtC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,kBAAkB,CAAC,cAAc,CAAC;iBAClC,IAAI,CAAC,CAAC,WAAoB,EAAE,EAAE;gBAC7B,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;gBACjC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC3B,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { AppObjectRepo } from \"@vived/core\";\r\nimport { ZSpaceHostEntity } from \"../Entities/ZSpaceHost\";\r\n\r\nexport function checkForWebXRSupport(appObjects: AppObjectRepo): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n const zSpace = ZSpaceHostEntity.get(appObjects);\r\n if (!zSpace) {\r\n appObjects.submitError(\r\n \"checkForWebXRSupport\",\r\n \"Unable to find ZSpaceHostEntity\"\r\n );\r\n return;\r\n }\r\n\r\n const xr: any = (navigator as any).xr;\r\n\r\n if (!xr) {\r\n zSpace.isSupported = false;\r\n resolve();\r\n } else {\r\n xr.isSessionSupported(\"immersive-vr\")\r\n .then((isSupported: boolean) => {\r\n zSpace.isSupported = isSupported;\r\n resolve();\r\n })\r\n .catch(() => {\r\n zSpace.isSupported = false;\r\n resolve();\r\n });\r\n }\r\n });\r\n}\r\n"]}
1
+ {"version":3,"file":"checkForZSpaceSupport.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/UCs/checkForZSpaceSupport.ts"],"names":[],"mappings":";;AAuCA,oDA4BC;AAlED,uDAA0D;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,SAAgB,oBAAoB,CAAC,UAAyB;IAC5D,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,6BAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,UAAU,CAAC,WAAW,CACpB,sBAAsB,EACtB,iCAAiC,CAClC,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAS,SAAiB,CAAC,EAAE,CAAC;QAEtC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,kBAAkB,CAAC,cAAc,CAAC;iBAClC,IAAI,CAAC,CAAC,WAAoB,EAAE,EAAE;gBAC7B,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;gBACjC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;gBAC3B,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { AppObjectRepo } from \"@vived/core\";\r\nimport { ZSpaceHostEntity } from \"../Entities/ZSpaceHost\";\r\n\r\n/**\r\n * Checks if the current browser environment supports WebXR and zSpace hardware\r\n *\r\n * This utility function:\r\n * 1. Checks if navigator.xr is available (WebXR API support)\r\n * 2. Tests if 'immersive-vr' sessions are supported (required for zSpace)\r\n * 3. Updates the ZSpaceHostEntity.isSupported property based on results\r\n *\r\n * Usage:\r\n * ```typescript\r\n * // Typically called during application initialization:\r\n * import { checkForWebXRSupport } from \"@vived/host/ZSpaceHost/UCs\";\r\n *\r\n * async function initializeApp(appObjects) {\r\n * // Check for zSpace hardware support\r\n * await checkForWebXRSupport(appObjects);\r\n *\r\n * // Get the current support status\r\n * const zSpace = ZSpaceHostEntity.get(appObjects);\r\n * if (zSpace?.isSupported) {\r\n * console.log(\"zSpace hardware is supported\");\r\n * } else {\r\n * console.log(\"zSpace hardware is not supported, using fallback mode\");\r\n * }\r\n * }\r\n * ```\r\n *\r\n * Important notes:\r\n * - This function should be called during application initialization\r\n * - It returns a Promise that resolves when the check is complete\r\n * - To observe changes in support status, use the ZSpaceIsActivePM\r\n * - If hardware is not supported, you may want to enable emulation mode\r\n *\r\n * @param appObjects - The AppObjectRepo instance\r\n * @returns A Promise that resolves when the check is complete\r\n */\r\nexport function checkForWebXRSupport(appObjects: AppObjectRepo): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n const zSpace = ZSpaceHostEntity.get(appObjects);\r\n if (!zSpace) {\r\n appObjects.submitError(\r\n \"checkForWebXRSupport\",\r\n \"Unable to find ZSpaceHostEntity\"\r\n );\r\n return;\r\n }\r\n\r\n const xr: any = (navigator as any).xr;\r\n\r\n if (!xr) {\r\n zSpace.isSupported = false;\r\n resolve();\r\n } else {\r\n xr.isSessionSupported(\"immersive-vr\")\r\n .then((isSupported: boolean) => {\r\n zSpace.isSupported = isSupported;\r\n resolve();\r\n })\r\n .catch(() => {\r\n zSpace.isSupported = false;\r\n resolve();\r\n });\r\n }\r\n });\r\n}\r\n"]}
@@ -1,4 +1,72 @@
1
1
  "use strict";
2
+ /**
3
+ * ZSpaceHost Module
4
+ * -----------------
5
+ *
6
+ * This module provides integration with zSpace stereoscopic 3D hardware through WebXR.
7
+ * It allows applications to detect, start, stop, and monitor zSpace sessions,
8
+ * as well as provide emulation when real hardware isn't available.
9
+ *
10
+ * Typical usage flow:
11
+ *
12
+ * 1. Initialization:
13
+ * ```typescript
14
+ * import { checkForWebXRSupport } from "@vived/host/ZSpaceHost/UCs";
15
+ *
16
+ * // During app initialization
17
+ * await checkForWebXRSupport(appObjects);
18
+ * ```
19
+ *
20
+ * 2. Starting/Stopping zSpace:
21
+ * ```typescript
22
+ * import { StartZSpaceUC, StopZSpaceUC } from "@vived/host/ZSpaceHost/UCs";
23
+ *
24
+ * // Start zSpace
25
+ * const startUC = StartZSpaceUC.get(appObjects);
26
+ * await startUC?.startZSpace();
27
+ *
28
+ * // Stop zSpace
29
+ * const stopUC = StopZSpaceUC.get(appObjects);
30
+ * stopUC?.stopZSpace();
31
+ * ```
32
+ *
33
+ * 3. Checking Status:
34
+ * ```typescript
35
+ * import { ZSpaceHostEntity } from "@vived/host/ZSpaceHost/Entities";
36
+ *
37
+ * const zSpace = ZSpaceHostEntity.get(appObjects);
38
+ * if (zSpace?.isSupported) {
39
+ * console.log("zSpace hardware is supported");
40
+ * }
41
+ * if (zSpace?.isActive) {
42
+ * console.log("zSpace is currently active");
43
+ * }
44
+ * ```
45
+ *
46
+ * 4. UI Integration (React example):
47
+ * ```typescript
48
+ * import { zSpaceIsActivePMAdapter } from "@vived/host/ZSpaceHost/Adapters";
49
+ *
50
+ * function ZSpaceStatusIndicator() {
51
+ * const appObjects = useAppObjects();
52
+ * const [isActive, setIsActive] = useState(false);
53
+ *
54
+ * useEffect(() => {
55
+ * zSpaceIsActivePMAdapter.subscribe(appObjects, setIsActive);
56
+ * return () => zSpaceIsActivePMAdapter.unsubscribe(appObjects, setIsActive);
57
+ * }, [appObjects]);
58
+ *
59
+ * return <div>zSpace is {isActive ? "active" : "inactive"}</div>;
60
+ * }
61
+ * ```
62
+ *
63
+ * Key components:
64
+ * - Entities/ZSpaceHost: Core entity storing zSpace state
65
+ * - UCs/StartZSpace: Use case to initialize and start zSpace
66
+ * - UCs/StopZSpace: Use case to stop active zSpace session
67
+ * - PMs/ZSpaceIsActivePM: Presentation manager for active state
68
+ * - PMs/EmulateZSpacePM: Presentation manager for emulation control
69
+ */
2
70
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
71
  if (k2 === undefined) k2 = k;
4
72
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ZSpaceHost/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,gDAA8B;AAC9B,6CAA2B;AAC3B,8CAA4B;AAC5B,0CAAwB;AACxB,wCAAsB;AACtB,wCAAsB","sourcesContent":["export * from \"./Adapters\";\r\nexport * from \"./Controllers\";\r\nexport * from \"./Entities\";\r\nexport * from \"./Factories\";\r\nexport * from \"./Mocks\";\r\nexport * from \"./PMs\";\r\nexport * from \"./UCs\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ZSpaceHost/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;;;;;;;;;;;;;;;;AAEH,6CAA2B;AAC3B,gDAA8B;AAC9B,6CAA2B;AAC3B,8CAA4B;AAC5B,0CAAwB;AACxB,wCAAsB;AACtB,wCAAsB","sourcesContent":["/**\r\n * ZSpaceHost Module\r\n * -----------------\r\n *\r\n * This module provides integration with zSpace stereoscopic 3D hardware through WebXR.\r\n * It allows applications to detect, start, stop, and monitor zSpace sessions,\r\n * as well as provide emulation when real hardware isn't available.\r\n *\r\n * Typical usage flow:\r\n *\r\n * 1. Initialization:\r\n * ```typescript\r\n * import { checkForWebXRSupport } from \"@vived/host/ZSpaceHost/UCs\";\r\n *\r\n * // During app initialization\r\n * await checkForWebXRSupport(appObjects);\r\n * ```\r\n *\r\n * 2. Starting/Stopping zSpace:\r\n * ```typescript\r\n * import { StartZSpaceUC, StopZSpaceUC } from \"@vived/host/ZSpaceHost/UCs\";\r\n *\r\n * // Start zSpace\r\n * const startUC = StartZSpaceUC.get(appObjects);\r\n * await startUC?.startZSpace();\r\n *\r\n * // Stop zSpace\r\n * const stopUC = StopZSpaceUC.get(appObjects);\r\n * stopUC?.stopZSpace();\r\n * ```\r\n *\r\n * 3. Checking Status:\r\n * ```typescript\r\n * import { ZSpaceHostEntity } from \"@vived/host/ZSpaceHost/Entities\";\r\n *\r\n * const zSpace = ZSpaceHostEntity.get(appObjects);\r\n * if (zSpace?.isSupported) {\r\n * console.log(\"zSpace hardware is supported\");\r\n * }\r\n * if (zSpace?.isActive) {\r\n * console.log(\"zSpace is currently active\");\r\n * }\r\n * ```\r\n *\r\n * 4. UI Integration (React example):\r\n * ```typescript\r\n * import { zSpaceIsActivePMAdapter } from \"@vived/host/ZSpaceHost/Adapters\";\r\n *\r\n * function ZSpaceStatusIndicator() {\r\n * const appObjects = useAppObjects();\r\n * const [isActive, setIsActive] = useState(false);\r\n *\r\n * useEffect(() => {\r\n * zSpaceIsActivePMAdapter.subscribe(appObjects, setIsActive);\r\n * return () => zSpaceIsActivePMAdapter.unsubscribe(appObjects, setIsActive);\r\n * }, [appObjects]);\r\n *\r\n * return <div>zSpace is {isActive ? \"active\" : \"inactive\"}</div>;\r\n * }\r\n * ```\r\n *\r\n * Key components:\r\n * - Entities/ZSpaceHost: Core entity storing zSpace state\r\n * - UCs/StartZSpace: Use case to initialize and start zSpace\r\n * - UCs/StopZSpace: Use case to stop active zSpace session\r\n * - PMs/ZSpaceIsActivePM: Presentation manager for active state\r\n * - PMs/EmulateZSpacePM: Presentation manager for emulation control\r\n */\r\n\r\nexport * from \"./Adapters\";\r\nexport * from \"./Controllers\";\r\nexport * from \"./Entities\";\r\nexport * from \"./Factories\";\r\nexport * from \"./Mocks\";\r\nexport * from \"./PMs\";\r\nexport * from \"./UCs\";\r\n"]}
@@ -0,0 +1,16 @@
1
+ import { ChallengeScoreListPM } from "../PMs/ChallengeScoreListPM";
2
+ export const challengeScoreListAdapter = {
3
+ defaultVM: [],
4
+ subscribe: (appObjects, setVM) => {
5
+ const pm = ChallengeScoreListPM.get(appObjects);
6
+ if (!pm) {
7
+ appObjects.submitError("challengeScoreListAdapter", "Unable to find ChallengeScoreListPM");
8
+ return;
9
+ }
10
+ pm.addView(setVM);
11
+ },
12
+ unsubscribe: (appObjects, setVM) => {
13
+ ChallengeScoreListPM.get(appObjects)?.removeView(setVM);
14
+ }
15
+ };
16
+ //# sourceMappingURL=challengeScoreListAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challengeScoreListAdapter.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Adapters/challengeScoreListAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AAErC,MAAM,CAAC,MAAM,yBAAyB,GAAuC;IAC3E,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,CACT,UAAyB,EACzB,KAAmC,EACnC,EAAE;QACF,MAAM,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,UAAU,CAAC,WAAW,CACpB,2BAA2B,EAC3B,qCAAqC,CACtC,CAAC;YACF,OAAO;QACT,CAAC;QACD,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,WAAW,EAAE,CACX,UAAyB,EACzB,KAAmC,EACnC,EAAE;QACF,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;CACF,CAAC","sourcesContent":["import { AppObjectRepo, SingletonPmAdapter } from \"@vived/core\";\r\nimport {\r\n ChallengeScoreListPM,\r\n SlideScoreVM\r\n} from \"../PMs/ChallengeScoreListPM\";\r\n\r\nexport const challengeScoreListAdapter: SingletonPmAdapter<SlideScoreVM[]> = {\r\n defaultVM: [],\r\n subscribe: (\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: SlideScoreVM[]) => void\r\n ) => {\r\n const pm = ChallengeScoreListPM.get(appObjects);\r\n if (!pm) {\r\n appObjects.submitError(\r\n \"challengeScoreListAdapter\",\r\n \"Unable to find ChallengeScoreListPM\"\r\n );\r\n return;\r\n }\r\n pm.addView(setVM);\r\n },\r\n unsubscribe: (\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: SlideScoreVM[]) => void\r\n ) => {\r\n ChallengeScoreListPM.get(appObjects)?.removeView(setVM);\r\n }\r\n};\r\n"]}
@@ -1,3 +1,4 @@
1
1
  export * from "./challengeResultsListAdapter";
2
2
  export * from "./hasChallengeResultsPMAdapter";
3
+ export * from "./challengeScoreListAdapter";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC","sourcesContent":["export * from \"./challengeResultsListAdapter\";\r\nexport * from \"./hasChallengeResultsPMAdapter\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC","sourcesContent":["export * from \"./challengeResultsListAdapter\";\r\nexport * from \"./hasChallengeResultsPMAdapter\";\r\nexport * from \"./challengeScoreListAdapter\";\r\n"]}
@@ -78,6 +78,41 @@ class ChallengeResultsImp extends ChallengeResultsEntity {
78
78
  this.getResultForSlide = (slideID) => {
79
79
  return this.resultLookup.get(slideID);
80
80
  };
81
+ this.getScoreForSlide = (slideID) => {
82
+ const result = this.getResultForSlide(slideID);
83
+ if (!result) {
84
+ return 0;
85
+ }
86
+ switch (result.type) {
87
+ case "HIT": {
88
+ const hitData = result.resultData;
89
+ return hitData.success ? 1 : 0;
90
+ }
91
+ case "MULTIHIT": {
92
+ const multiHitData = result.resultData;
93
+ const total = multiHitData.hits + multiHitData.unanswered;
94
+ return total > 0 ? multiHitData.hits / total : 0;
95
+ }
96
+ case "QUALITY": {
97
+ const qualityData = result.resultData;
98
+ return qualityData.maxStars > 0
99
+ ? qualityData.stars / qualityData.maxStars
100
+ : 0;
101
+ }
102
+ case "SCORE": {
103
+ const scoreData = result.resultData;
104
+ return scoreData.maxScore > 0
105
+ ? scoreData.score / scoreData.maxScore
106
+ : 0;
107
+ }
108
+ case "PROGRESS": {
109
+ const progressData = result.resultData;
110
+ return progressData.maxProgress;
111
+ }
112
+ default:
113
+ return 0;
114
+ }
115
+ };
81
116
  this.submitProgressResult = (slideID, maxProgress, message) => {
82
117
  const currentResult = this.getResultForSlide(slideID);
83
118
  if (currentResult &&
@@ -1 +1 @@
1
- {"version":3,"file":"ChallengeResults.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Entities/ChallengeResults.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\n\r\nexport type ChallengeResultType =\r\n | \"HIT\"\r\n | \"MULTIHIT\"\r\n | \"QUALITY\"\r\n | \"SCORE\"\r\n | \"PROGRESS\";\r\n\r\nexport interface ChallengeResult {\r\n slideID: string;\r\n tries: number;\r\n message: string;\r\n type: ChallengeResultType;\r\n resultData:\r\n | ChallengeResultHitData\r\n | ChallengeResultMultiHitData\r\n | ChallengeResultQualityData\r\n | ChallengeResultScoreData\r\n | ChallengeResultProgressData;\r\n}\r\n\r\nexport interface ChallengeResultHitData {\r\n success: boolean;\r\n}\r\n\r\nexport interface ChallengeResultProgressData {\r\n maxProgress: number;\r\n}\r\n\r\nexport interface ChallengeResultMultiHitData {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n}\r\n\r\nexport interface ChallengeResultQualityData {\r\n stars: number;\r\n maxStars: number;\r\n}\r\n\r\nexport interface ChallengeResultScoreData {\r\n score: number;\r\n maxScore: number;\r\n}\r\n\r\nexport abstract class ChallengeResultsEntity extends AppObjectEntity {\r\n static type = \"ChallengeResultsEntity\";\r\n\r\n abstract get results(): ChallengeResult[];\r\n abstract submitHitResult: (\r\n slideID: string,\r\n success: boolean,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitMultiHitResult: (\r\n slideID: string,\r\n hits: number,\r\n misses: number,\r\n unanswered: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitQualityResult: (\r\n slideID: string,\r\n stars: number,\r\n maxStars: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitScoreResult: (\r\n slideID: string,\r\n score: number,\r\n maxScore: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitProgressResult: (\r\n slideID: string,\r\n maxProgress: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract getResultForSlide: (slideID: string) => ChallengeResult | undefined;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeChallengeResults(\r\n appObject: AppObject\r\n): ChallengeResultsEntity {\r\n return new ChallengeResultsImp(appObject);\r\n}\r\n\r\nclass ChallengeResultsImp extends ChallengeResultsEntity {\r\n private resultLookup = new Map<string, ChallengeResult>();\r\n\r\n get results(): ChallengeResult[] {\r\n return Array.from(this.resultLookup.values());\r\n }\r\n\r\n submitHitResult = (\r\n slideID: string,\r\n success: boolean,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultHitData = {\r\n success\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"HIT\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitMultiHitResult = (\r\n slideID: string,\r\n hits: number,\r\n misses: number,\r\n unanswered: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultMultiHitData = {\r\n hits,\r\n misses,\r\n unanswered\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"MULTIHIT\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitQualityResult = (\r\n slideID: string,\r\n stars: number,\r\n maxStars: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultQualityData = {\r\n stars,\r\n maxStars\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"QUALITY\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitScoreResult = (\r\n slideID: string,\r\n score: number,\r\n maxScore: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultScoreData = {\r\n score,\r\n maxScore\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"SCORE\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n getResultForSlide = (slideID: string): ChallengeResult | undefined => {\r\n return this.resultLookup.get(slideID);\r\n };\r\n\r\n submitProgressResult = (\r\n slideID: string,\r\n maxProgress: number,\r\n message: string\r\n ): void => {\r\n const currentResult = this.getResultForSlide(slideID);\r\n if (\r\n currentResult &&\r\n (currentResult.resultData as ChallengeResultProgressData).maxProgress >\r\n maxProgress\r\n ) {\r\n return;\r\n }\r\n\r\n const resultData: ChallengeResultProgressData = {\r\n maxProgress\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries: 1,\r\n type: \"PROGRESS\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ChallengeResultsEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ChallengeResults.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Entities/ChallengeResults.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\n\r\nexport type ChallengeResultType =\r\n | \"HIT\"\r\n | \"MULTIHIT\"\r\n | \"QUALITY\"\r\n | \"SCORE\"\r\n | \"PROGRESS\";\r\n\r\nexport interface ChallengeResult {\r\n slideID: string;\r\n tries: number;\r\n message: string;\r\n type: ChallengeResultType;\r\n resultData:\r\n | ChallengeResultHitData\r\n | ChallengeResultMultiHitData\r\n | ChallengeResultQualityData\r\n | ChallengeResultScoreData\r\n | ChallengeResultProgressData;\r\n}\r\n\r\nexport interface ChallengeResultHitData {\r\n success: boolean;\r\n}\r\n\r\nexport interface ChallengeResultProgressData {\r\n maxProgress: number;\r\n}\r\n\r\nexport interface ChallengeResultMultiHitData {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n}\r\n\r\nexport interface ChallengeResultQualityData {\r\n stars: number;\r\n maxStars: number;\r\n}\r\n\r\nexport interface ChallengeResultScoreData {\r\n score: number;\r\n maxScore: number;\r\n}\r\n\r\nexport abstract class ChallengeResultsEntity extends AppObjectEntity {\r\n static type = \"ChallengeResultsEntity\";\r\n\r\n abstract get results(): ChallengeResult[];\r\n abstract submitHitResult: (\r\n slideID: string,\r\n success: boolean,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitMultiHitResult: (\r\n slideID: string,\r\n hits: number,\r\n misses: number,\r\n unanswered: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitQualityResult: (\r\n slideID: string,\r\n stars: number,\r\n maxStars: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitScoreResult: (\r\n slideID: string,\r\n score: number,\r\n maxScore: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitProgressResult: (\r\n slideID: string,\r\n maxProgress: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract getResultForSlide: (slideID: string) => ChallengeResult | undefined;\r\n\r\n abstract getScoreForSlide: (slideID: string) => number;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeChallengeResults(\r\n appObject: AppObject\r\n): ChallengeResultsEntity {\r\n return new ChallengeResultsImp(appObject);\r\n}\r\n\r\nclass ChallengeResultsImp extends ChallengeResultsEntity {\r\n private resultLookup = new Map<string, ChallengeResult>();\r\n\r\n get results(): ChallengeResult[] {\r\n return Array.from(this.resultLookup.values());\r\n }\r\n\r\n submitHitResult = (\r\n slideID: string,\r\n success: boolean,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultHitData = {\r\n success\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"HIT\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitMultiHitResult = (\r\n slideID: string,\r\n hits: number,\r\n misses: number,\r\n unanswered: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultMultiHitData = {\r\n hits,\r\n misses,\r\n unanswered\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"MULTIHIT\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitQualityResult = (\r\n slideID: string,\r\n stars: number,\r\n maxStars: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultQualityData = {\r\n stars,\r\n maxStars\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"QUALITY\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitScoreResult = (\r\n slideID: string,\r\n score: number,\r\n maxScore: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultScoreData = {\r\n score,\r\n maxScore\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"SCORE\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n getResultForSlide = (slideID: string): ChallengeResult | undefined => {\r\n return this.resultLookup.get(slideID);\r\n };\r\n\r\n getScoreForSlide = (slideID: string): number => {\r\n const result = this.getResultForSlide(slideID);\r\n if (!result) {\r\n return 0;\r\n }\r\n\r\n switch (result.type) {\r\n case \"HIT\": {\r\n const hitData = result.resultData as ChallengeResultHitData;\r\n return hitData.success ? 1 : 0;\r\n }\r\n case \"MULTIHIT\": {\r\n const multiHitData = result.resultData as ChallengeResultMultiHitData;\r\n const total = multiHitData.hits + multiHitData.unanswered;\r\n return total > 0 ? multiHitData.hits / total : 0;\r\n }\r\n case \"QUALITY\": {\r\n const qualityData = result.resultData as ChallengeResultQualityData;\r\n return qualityData.maxStars > 0\r\n ? qualityData.stars / qualityData.maxStars\r\n : 0;\r\n }\r\n case \"SCORE\": {\r\n const scoreData = result.resultData as ChallengeResultScoreData;\r\n return scoreData.maxScore > 0\r\n ? scoreData.score / scoreData.maxScore\r\n : 0;\r\n }\r\n case \"PROGRESS\": {\r\n const progressData = result.resultData as ChallengeResultProgressData;\r\n return progressData.maxProgress;\r\n }\r\n default:\r\n return 0;\r\n }\r\n };\r\n\r\n submitProgressResult = (\r\n slideID: string,\r\n maxProgress: number,\r\n message: string\r\n ): void => {\r\n const currentResult = this.getResultForSlide(slideID);\r\n if (\r\n currentResult &&\r\n (currentResult.resultData as ChallengeResultProgressData).maxProgress >\r\n maxProgress\r\n ) {\r\n return;\r\n }\r\n\r\n const resultData: ChallengeResultProgressData = {\r\n maxProgress\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries: 1,\r\n type: \"PROGRESS\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ChallengeResultsEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -1,10 +1,11 @@
1
1
  import { makeChallengeResults } from "../Entities";
2
- import { makeChallengeResultsPM, makeHasChallengeResultsPM } from "../PMs";
2
+ import { makeChallengeResultsPM, makeChallengeScoreListPM, makeHasChallengeResultsPM } from "../PMs";
3
3
  export function setupChallengeResults(appObjects) {
4
4
  const ao = appObjects.getOrCreate("ChallengeResults");
5
5
  const entity = makeChallengeResults(ao);
6
6
  // PM
7
7
  makeChallengeResultsPM(ao);
8
+ makeChallengeScoreListPM(ao);
8
9
  makeHasChallengeResultsPM(ao);
9
10
  return entity;
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"setupChallengeResults.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Factories/setupChallengeResults.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC;AAE3E,MAAM,UAAU,qBAAqB,CACnC,UAAyB;IAEzB,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAExC,KAAK;IACL,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAC3B,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAE9B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { AppObjectRepo } from \"@vived/core\";\r\nimport { ChallengeResultsEntity, makeChallengeResults } from \"../Entities\";\r\nimport { makeChallengeResultsPM, makeHasChallengeResultsPM } from \"../PMs\";\r\n\r\nexport function setupChallengeResults(\r\n appObjects: AppObjectRepo\r\n): ChallengeResultsEntity {\r\n const ao = appObjects.getOrCreate(\"ChallengeResults\");\r\n\r\n const entity = makeChallengeResults(ao);\r\n\r\n // PM\r\n makeChallengeResultsPM(ao);\r\n makeHasChallengeResultsPM(ao);\r\n\r\n return entity;\r\n}\r\n"]}
1
+ {"version":3,"file":"setupChallengeResults.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Factories/setupChallengeResults.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC;AAErG,MAAM,UAAU,qBAAqB,CACnC,UAAyB;IAEzB,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAExC,KAAK;IACL,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAC3B,wBAAwB,CAAC,EAAE,CAAC,CAAC;IAC7B,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAE9B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { AppObjectRepo } from \"@vived/core\";\r\nimport { ChallengeResultsEntity, makeChallengeResults } from \"../Entities\";\r\nimport { makeChallengeResultsPM, makeChallengeScoreListPM, makeHasChallengeResultsPM } from \"../PMs\";\r\n\r\nexport function setupChallengeResults(\r\n appObjects: AppObjectRepo\r\n): ChallengeResultsEntity {\r\n const ao = appObjects.getOrCreate(\"ChallengeResults\");\r\n\r\n const entity = makeChallengeResults(ao);\r\n\r\n // PM\r\n makeChallengeResultsPM(ao);\r\n makeChallengeScoreListPM(ao);\r\n makeHasChallengeResultsPM(ao);\r\n\r\n return entity;\r\n}\r\n"]}
@@ -0,0 +1,14 @@
1
+ import { ChallengeScoreListPM } from "../PMs/ChallengeScoreListPM";
2
+ export class MockChallengeScoreListPM extends ChallengeScoreListPM {
3
+ constructor(appObject) {
4
+ super(appObject, ChallengeScoreListPM.type);
5
+ this.vmsAreEqual = jest
6
+ .fn()
7
+ .mockImplementation((a, b) => true);
8
+ this.appObjects.registerSingleton(this);
9
+ }
10
+ }
11
+ export function makeMockChallengeScoreListPM(appObjects) {
12
+ return new MockChallengeScoreListPM(appObjects.getOrCreate("MockChallengeScoreListPM"));
13
+ }
14
+ //# sourceMappingURL=MockChallengeScoreListPM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockChallengeScoreListPM.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Mocks/MockChallengeScoreListPM.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EAErB,MAAM,6BAA6B,CAAC;AAErC,MAAM,OAAO,wBAAyB,SAAQ,oBAAoB;IAOhE,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAP9C,gBAAW,GAAG,IAAI;aACf,EAAE,EAAE;aACJ,kBAAkB,CACjB,CAAC,CAAiB,EAAE,CAAiB,EAAW,EAAE,CAAC,IAAI,CACxD,CAAC;QAIF,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,UAAU,4BAA4B,CAC1C,UAAyB;IAEzB,OAAO,IAAI,wBAAwB,CACjC,UAAU,CAAC,WAAW,CAAC,0BAA0B,CAAC,CACnD,CAAC;AACJ,CAAC","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport {\r\n ChallengeScoreListPM,\r\n SlideScoreVM\r\n} from \"../PMs/ChallengeScoreListPM\";\r\n\r\nexport class MockChallengeScoreListPM extends ChallengeScoreListPM {\r\n vmsAreEqual = jest\r\n .fn()\r\n .mockImplementation(\r\n (a: SlideScoreVM[], b: SlideScoreVM[]): boolean => true\r\n );\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ChallengeScoreListPM.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n\r\nexport function makeMockChallengeScoreListPM(\r\n appObjects: AppObjectRepo\r\n): MockChallengeScoreListPM {\r\n return new MockChallengeScoreListPM(\r\n appObjects.getOrCreate(\"MockChallengeScoreListPM\")\r\n );\r\n}\r\n"]}