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