@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
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.challengeScoreListAdapter = void 0;
4
+ const ChallengeScoreListPM_1 = require("../PMs/ChallengeScoreListPM");
5
+ exports.challengeScoreListAdapter = {
6
+ defaultVM: [],
7
+ subscribe: (appObjects, setVM) => {
8
+ const pm = ChallengeScoreListPM_1.ChallengeScoreListPM.get(appObjects);
9
+ if (!pm) {
10
+ appObjects.submitError("challengeScoreListAdapter", "Unable to find ChallengeScoreListPM");
11
+ return;
12
+ }
13
+ pm.addView(setVM);
14
+ },
15
+ unsubscribe: (appObjects, setVM) => {
16
+ ChallengeScoreListPM_1.ChallengeScoreListPM.get(appObjects)?.removeView(setVM);
17
+ }
18
+ };
19
+ //# sourceMappingURL=challengeScoreListAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"challengeScoreListAdapter.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Adapters/challengeScoreListAdapter.ts"],"names":[],"mappings":";;;AACA,sEAGqC;AAExB,QAAA,yBAAyB,GAAuC;IAC3E,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,CACT,UAAyB,EACzB,KAAmC,EACnC,EAAE;QACF,MAAM,EAAE,GAAG,2CAAoB,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,2CAAoB,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"]}
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./challengeResultsListAdapter"), exports);
18
18
  __exportStar(require("./hasChallengeResultsPMAdapter"), exports);
19
+ __exportStar(require("./challengeScoreListAdapter"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gEAA8C;AAC9C,iEAA+C","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,gEAA8C;AAC9C,iEAA+C;AAC/C,8DAA4C","sourcesContent":["export * from \"./challengeResultsListAdapter\";\r\nexport * from \"./hasChallengeResultsPMAdapter\";\r\nexport * from \"./challengeScoreListAdapter\";\r\n"]}
@@ -83,6 +83,41 @@ class ChallengeResultsImp extends ChallengeResultsEntity {
83
83
  this.getResultForSlide = (slideID) => {
84
84
  return this.resultLookup.get(slideID);
85
85
  };
86
+ this.getScoreForSlide = (slideID) => {
87
+ const result = this.getResultForSlide(slideID);
88
+ if (!result) {
89
+ return 0;
90
+ }
91
+ switch (result.type) {
92
+ case "HIT": {
93
+ const hitData = result.resultData;
94
+ return hitData.success ? 1 : 0;
95
+ }
96
+ case "MULTIHIT": {
97
+ const multiHitData = result.resultData;
98
+ const total = multiHitData.hits + multiHitData.unanswered;
99
+ return total > 0 ? multiHitData.hits / total : 0;
100
+ }
101
+ case "QUALITY": {
102
+ const qualityData = result.resultData;
103
+ return qualityData.maxStars > 0
104
+ ? qualityData.stars / qualityData.maxStars
105
+ : 0;
106
+ }
107
+ case "SCORE": {
108
+ const scoreData = result.resultData;
109
+ return scoreData.maxScore > 0
110
+ ? scoreData.score / scoreData.maxScore
111
+ : 0;
112
+ }
113
+ case "PROGRESS": {
114
+ const progressData = result.resultData;
115
+ return progressData.maxProgress;
116
+ }
117
+ default:
118
+ return 0;
119
+ }
120
+ };
86
121
  this.submitProgressResult = (slideID, maxProgress, message) => {
87
122
  const currentResult = this.getResultForSlide(slideID);
88
123
  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"]}
@@ -8,6 +8,7 @@ function setupChallengeResults(appObjects) {
8
8
  const entity = (0, Entities_1.makeChallengeResults)(ao);
9
9
  // PM
10
10
  (0, PMs_1.makeChallengeResultsPM)(ao);
11
+ (0, PMs_1.makeChallengeScoreListPM)(ao);
11
12
  (0, PMs_1.makeHasChallengeResultsPM)(ao);
12
13
  return entity;
13
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"setupChallengeResults.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Factories/setupChallengeResults.ts"],"names":[],"mappings":";;AAIA,sDAYC;AAfD,0CAA2E;AAC3E,gCAA2E;AAE3E,SAAgB,qBAAqB,CACnC,UAAyB;IAEzB,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,IAAA,+BAAoB,EAAC,EAAE,CAAC,CAAC;IAExC,KAAK;IACL,IAAA,4BAAsB,EAAC,EAAE,CAAC,CAAC;IAC3B,IAAA,+BAAyB,EAAC,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":";;AAIA,sDAaC;AAhBD,0CAA2E;AAC3E,gCAAqG;AAErG,SAAgB,qBAAqB,CACnC,UAAyB;IAEzB,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,IAAA,+BAAoB,EAAC,EAAE,CAAC,CAAC;IAExC,KAAK;IACL,IAAA,4BAAsB,EAAC,EAAE,CAAC,CAAC;IAC3B,IAAA,8BAAwB,EAAC,EAAE,CAAC,CAAC;IAC7B,IAAA,+BAAyB,EAAC,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,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockChallengeScoreListPM = void 0;
4
+ exports.makeMockChallengeScoreListPM = makeMockChallengeScoreListPM;
5
+ const ChallengeScoreListPM_1 = require("../PMs/ChallengeScoreListPM");
6
+ class MockChallengeScoreListPM extends ChallengeScoreListPM_1.ChallengeScoreListPM {
7
+ constructor(appObject) {
8
+ super(appObject, ChallengeScoreListPM_1.ChallengeScoreListPM.type);
9
+ this.vmsAreEqual = jest
10
+ .fn()
11
+ .mockImplementation((a, b) => true);
12
+ this.appObjects.registerSingleton(this);
13
+ }
14
+ }
15
+ exports.MockChallengeScoreListPM = MockChallengeScoreListPM;
16
+ function makeMockChallengeScoreListPM(appObjects) {
17
+ return new MockChallengeScoreListPM(appObjects.getOrCreate("MockChallengeScoreListPM"));
18
+ }
19
+ //# sourceMappingURL=MockChallengeScoreListPM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockChallengeScoreListPM.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Mocks/MockChallengeScoreListPM.ts"],"names":[],"mappings":";;;AAmBA,oEAMC;AAxBD,sEAGqC;AAErC,MAAa,wBAAyB,SAAQ,2CAAoB;IAOhE,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,2CAAoB,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;AAXD,4DAWC;AAED,SAAgB,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"]}
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./ChallengeResultsListPMMock"), exports);
18
18
  __exportStar(require("./MockHasChallengeResultsPM"), exports);
19
+ __exportStar(require("./MockChallengeScoreListPM"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Mocks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA4C;AAC5C,8DAA2C","sourcesContent":["export * from \"./ChallengeResultsListPMMock\"\r\nexport * from \"./MockHasChallengeResultsPM\""]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Mocks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,8DAA4C;AAC5C,6DAA2C","sourcesContent":["export * from \"./ChallengeResultsListPMMock\";\r\nexport * from \"./MockHasChallengeResultsPM\";\r\nexport * from \"./MockChallengeScoreListPM\";\r\n"]}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChallengeScoreListPM = void 0;
4
+ exports.makeChallengeScoreListPM = makeChallengeScoreListPM;
5
+ const core_1 = require("@vived/core");
6
+ const HostStateMachine_1 = require("../../StateMachine/Entities/HostStateMachine");
7
+ const ChallengeResults_1 = require("../Entities/ChallengeResults");
8
+ class ChallengeScoreListPM extends core_1.AppObjectPM {
9
+ static get(appObjects) {
10
+ return (0, core_1.getSingletonComponent)(ChallengeScoreListPM.type, appObjects);
11
+ }
12
+ }
13
+ exports.ChallengeScoreListPM = ChallengeScoreListPM;
14
+ ChallengeScoreListPM.type = "ChallengeScoreListPM";
15
+ function makeChallengeScoreListPM(appObject) {
16
+ return new ChallengeScoreListPMImp(appObject);
17
+ }
18
+ class ChallengeScoreListPMImp extends ChallengeScoreListPM {
19
+ get challengeResults() {
20
+ return this.getCachedSingleton(ChallengeResults_1.ChallengeResultsEntity.type);
21
+ }
22
+ get stateMachine() {
23
+ return this.getCachedSingleton(HostStateMachine_1.HostStateMachine.type);
24
+ }
25
+ vmsAreEqual(a, b) {
26
+ if (a.length !== b.length)
27
+ return false;
28
+ for (let i = 0; i < a.length; i++) {
29
+ if (a[i].id !== b[i].id)
30
+ return false;
31
+ if (a[i].displayName !== b[i].displayName)
32
+ return false;
33
+ if (a[i].score !== b[i].score)
34
+ return false;
35
+ }
36
+ return true;
37
+ }
38
+ constructor(appObject) {
39
+ super(appObject, ChallengeScoreListPM.type);
40
+ this.onEntityChange = () => {
41
+ if (!this.challengeResults || !this.stateMachine)
42
+ return;
43
+ const slideScores = [];
44
+ // Get all states from state machine
45
+ const stateIds = this.stateMachine.states;
46
+ // Process each state
47
+ stateIds.forEach((slideId, index) => {
48
+ // Skip slides that don't have a result
49
+ if (!this.challengeResults.getResultForSlide(slideId))
50
+ return;
51
+ const state = this.stateMachine.getStateByID(slideId);
52
+ if (state) {
53
+ // Get score for this slide using the method from ChallengeResults
54
+ const score = this.challengeResults.getScoreForSlide(slideId);
55
+ // Format the display name
56
+ const displayName = `Slide ${index + 1}: ${state.name}`;
57
+ // Add to results
58
+ slideScores.push({
59
+ id: slideId,
60
+ displayName,
61
+ score
62
+ });
63
+ }
64
+ });
65
+ this.doUpdateView(slideScores);
66
+ };
67
+ // Initialize with empty array
68
+ this.doUpdateView([]);
69
+ // Subscribe to changes in entities
70
+ this.challengeResults?.addChangeObserver(this.onEntityChange);
71
+ this.stateMachine?.addChangeObserver(this.onEntityChange);
72
+ // Initial update
73
+ this.onEntityChange();
74
+ // Register as singleton
75
+ this.appObjects.registerSingleton(this);
76
+ }
77
+ }
78
+ //# 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"]}
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./ChallengeResultsListPM"), exports);
18
18
  __exportStar(require("./HasChallengeResultsPM"), exports);
19
+ __exportStar(require("./ChallengeScoreListPM"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAwC;AACxC,0DAAuC","sourcesContent":["export * from \"./ChallengeResultsListPM\"\r\nexport * from \"./HasChallengeResultsPM\""]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,0DAAwC;AACxC,yDAAuC","sourcesContent":["export * from \"./ChallengeResultsListPM\";\r\nexport * from \"./HasChallengeResultsPM\";\r\nexport * from \"./ChallengeScoreListPM\";\r\n"]}
@@ -84,6 +84,14 @@ class SubmitResultHandlerImp extends SubmitResultHandler {
84
84
  }
85
85
  constructor(appObject) {
86
86
  super(appObject, SubmitResultHandler.type);
87
+ // Map result types to challenge responses
88
+ this.resultTypeToResponseMap = {
89
+ HIT_V1: StateMachine_1.ChallengeResponse.HIT,
90
+ MULTIHIT_V1: StateMachine_1.ChallengeResponse.MULTIHIT,
91
+ QUALITY_V1: StateMachine_1.ChallengeResponse.QUALITY,
92
+ SCORE_V1: StateMachine_1.ChallengeResponse.SCORE,
93
+ PROGRESS_V1: StateMachine_1.ChallengeResponse.PROGRESS
94
+ };
87
95
  this.action = (type, result, description) => {
88
96
  if (!this.challengeResults || !this.stateMachine) {
89
97
  this.error("Missing Component");
@@ -93,25 +101,32 @@ class SubmitResultHandlerImp extends SubmitResultHandler {
93
101
  this.warn("Cannot store result because there is no active slide");
94
102
  return;
95
103
  }
96
- const currentSlide = this.stateMachine.activeState;
97
- let tries = this.challengeResults.getResultForSlide(currentSlide)?.tries ?? 0;
104
+ const currentSlideId = this.stateMachine.activeState;
105
+ const currentStateEntity = this.stateMachine.getStateByID(currentSlideId);
106
+ if (!currentStateEntity) {
107
+ this.warn("Cannot find active state entity");
108
+ return;
109
+ }
110
+ // Set the expected response based on the result type
111
+ currentStateEntity.expectedResponse = this.resultTypeToResponseMap[type];
112
+ let tries = this.challengeResults.getResultForSlide(currentSlideId)?.tries ?? 0;
98
113
  if (type !== "PROGRESS_V1") {
99
114
  tries += 1;
100
115
  }
101
116
  if (type === "HIT_V1") {
102
- this.handleHitV1(result, tries, currentSlide, description);
117
+ this.handleHitV1(result, tries, currentSlideId, description);
103
118
  }
104
119
  else if (type === "MULTIHIT_V1") {
105
- this.handleMultiHitV1(result, tries, currentSlide, description);
120
+ this.handleMultiHitV1(result, tries, currentSlideId, description);
106
121
  }
107
122
  else if (type === "QUALITY_V1") {
108
- this.handleQualityV1(result, tries, currentSlide, description);
123
+ this.handleQualityV1(result, tries, currentSlideId, description);
109
124
  }
110
125
  else if (type === "SCORE_V1") {
111
- this.handleScoreV1(result, tries, currentSlide, description);
126
+ this.handleScoreV1(result, tries, currentSlideId, description);
112
127
  }
113
128
  else if (type === "PROGRESS_V1") {
114
- this.handleProgressV1(result, currentSlide, description);
129
+ this.handleProgressV1(result, currentSlideId, description);
115
130
  }
116
131
  };
117
132
  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"]}
@@ -16,6 +16,12 @@ function makeHostEditingStateEntity(appObject) {
16
16
  return new HostEditingStateEntityImp(appObject);
17
17
  }
18
18
  class HostEditingStateEntityImp extends HostEditingStateEntity {
19
+ get editingState() {
20
+ return this._editingState;
21
+ }
22
+ get isEditing() {
23
+ return this._editingState !== undefined;
24
+ }
19
25
  get isNewState() {
20
26
  return this._isNewState;
21
27
  }
@@ -34,12 +40,6 @@ class HostEditingStateEntityImp extends HostEditingStateEntity {
34
40
  get somethingHasChanged() {
35
41
  return this.memoizedSomethingHasChanged.val;
36
42
  }
37
- get isEditing() {
38
- return this._editingState !== undefined;
39
- }
40
- get editingState() {
41
- return this._editingState;
42
- }
43
43
  constructor(appObject) {
44
44
  super(appObject, HostEditingStateEntity.type);
45
45
  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"]}
@@ -4,16 +4,50 @@ exports.ZSpaceHostEntity = void 0;
4
4
  exports.makeZSpaceHostEntity = makeZSpaceHostEntity;
5
5
  const core_1 = require("@vived/core");
6
6
  const core_2 = require("@vived/core");
7
+ /**
8
+ * ZSpaceHostEntity is a singleton entity that manages the state and functionality
9
+ * for zSpace integration in VIVED applications.
10
+ *
11
+ * This entity handles:
12
+ * 1. zSpace feature detection (isSupported)
13
+ * 2. Emulation mode toggling (emulate)
14
+ * 3. Active state management (isActive)
15
+ * 4. XR Session management
16
+ *
17
+ * Usage:
18
+ * - To check if zSpace is available: ZSpaceHostEntity.get(appObjects)?.isSupported
19
+ * - To check if zSpace is active: ZSpaceHostEntity.get(appObjects)?.isActive
20
+ * - To enable/disable emulation: ZSpaceHostEntity.get(appObjects).emulate = true/false
21
+ *
22
+ * Important: This is a singleton entity - only one instance exists in the application.
23
+ * Always access via ZSpaceHostEntity.get(appObjects) rather than creating new instances.
24
+ */
7
25
  class ZSpaceHostEntity extends core_2.AppObjectEntity {
26
+ /**
27
+ * Get the singleton ZSpaceHostEntity instance
28
+ * @param appObjects - The AppObjectRepo instance
29
+ * @returns The ZSpaceHostEntity instance or undefined if not found
30
+ */
8
31
  static get(appObjects) {
9
32
  return (0, core_2.getSingletonComponent)(ZSpaceHostEntity.type, appObjects);
10
33
  }
11
34
  }
12
35
  exports.ZSpaceHostEntity = ZSpaceHostEntity;
13
36
  ZSpaceHostEntity.type = "ZSpaceHostEntity";
37
+ /**
38
+ * Factory function to create the ZSpaceHostEntity
39
+ * For internal use only - external code should use ZSpaceHostEntity.get()
40
+ *
41
+ * @param appObject - The AppObject to attach the entity to
42
+ * @returns A new ZSpaceHostEntity instance
43
+ */
14
44
  function makeZSpaceHostEntity(appObject) {
15
45
  return new ZSpaceHostImp(appObject);
16
46
  }
47
+ /**
48
+ * Implementation of ZSpaceHostEntity
49
+ * Uses MemoizedBoolean for all properties to ensure proper change notifications
50
+ */
17
51
  class ZSpaceHostImp extends ZSpaceHostEntity {
18
52
  get isSupported() {
19
53
  return this.memoizedIsSupported.val;
@@ -1 +1 @@
1
- {"version":3,"file":"ZSpaceHost.js","sourceRoot":"","sources":["../../../../src/ZSpaceHost/Entities/ZSpaceHost.ts"],"names":[],"mappings":";;;AA8BA,oDAEC;AAhCD,sCAA8C;AAC9C,sCAKqB;AAErB,MAAsB,gBAAiB,SAAQ,sBAAe;IAc5D,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAnBH,4CAoBC;AAnBQ,qBAAI,GAAG,kBAAkB,CAAC;AAqBnC,SAAgB,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,sBAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAQtE,oBAAe,GAAG,IAAI,sBAAe,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAQjE,mBAAc,GAAG,IAAI,sBAAe,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":";;;AA2EA,oDAEC;AA7ED,sCAA8C;AAC9C,sCAKqB;AAErB;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAsB,gBAAiB,SAAQ,sBAAe;IA6B5D;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AAvCH,4CAwCC;AAvCQ,qBAAI,GAAG,kBAAkB,CAAC;AAyCnC;;;;;;GAMG;AACH,SAAgB,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,sBAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAQtE,oBAAe,GAAG,IAAI,sBAAe,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAQjE,mBAAc,GAAG,IAAI,sBAAe,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"]}