@magmamath/students-features 1.3.10-rc.1 → 1.3.11-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/commonjs/features/featureUsage/featureUsage.constants.js +12 -0
  2. package/dist/commonjs/features/featureUsage/featureUsage.constants.js.map +1 -0
  3. package/dist/commonjs/features/featureUsage/featureUsage.types.js +6 -0
  4. package/dist/commonjs/features/featureUsage/featureUsage.types.js.map +1 -0
  5. package/dist/commonjs/features/featureUsage/index.js +27 -0
  6. package/dist/commonjs/features/featureUsage/index.js.map +1 -0
  7. package/dist/commonjs/features/featureUsage/model/FeatureUsageModel.js +24 -0
  8. package/dist/commonjs/features/featureUsage/model/FeatureUsageModel.js.map +1 -0
  9. package/dist/commonjs/features/featureUsage/model/UsageTracker.js +17 -0
  10. package/dist/commonjs/features/featureUsage/model/UsageTracker.js.map +1 -0
  11. package/dist/commonjs/index.js +13 -1
  12. package/dist/commonjs/index.js.map +1 -1
  13. package/dist/module/features/featureUsage/featureUsage.constants.js +8 -0
  14. package/dist/module/features/featureUsage/featureUsage.constants.js.map +1 -0
  15. package/dist/module/features/featureUsage/featureUsage.types.js +4 -0
  16. package/dist/module/features/featureUsage/featureUsage.types.js.map +1 -0
  17. package/dist/module/features/featureUsage/index.js +6 -0
  18. package/dist/module/features/featureUsage/index.js.map +1 -0
  19. package/dist/module/features/featureUsage/model/FeatureUsageModel.js +19 -0
  20. package/dist/module/features/featureUsage/model/FeatureUsageModel.js.map +1 -0
  21. package/dist/module/features/featureUsage/model/UsageTracker.js +12 -0
  22. package/dist/module/features/featureUsage/model/UsageTracker.js.map +1 -0
  23. package/dist/module/index.js +1 -0
  24. package/dist/module/index.js.map +1 -1
  25. package/dist/typescript/commonjs/features/featureUsage/featureUsage.constants.d.ts +5 -0
  26. package/dist/typescript/commonjs/features/featureUsage/featureUsage.constants.d.ts.map +1 -0
  27. package/dist/typescript/commonjs/features/featureUsage/featureUsage.types.d.ts +4 -0
  28. package/dist/typescript/commonjs/features/featureUsage/featureUsage.types.d.ts.map +1 -0
  29. package/dist/typescript/commonjs/features/featureUsage/index.d.ts +5 -0
  30. package/dist/typescript/commonjs/features/featureUsage/index.d.ts.map +1 -0
  31. package/dist/typescript/commonjs/features/featureUsage/model/FeatureUsageModel.d.ts +9 -0
  32. package/dist/typescript/commonjs/features/featureUsage/model/FeatureUsageModel.d.ts.map +1 -0
  33. package/dist/typescript/commonjs/features/featureUsage/model/UsageTracker.d.ts +9 -0
  34. package/dist/typescript/commonjs/features/featureUsage/model/UsageTracker.d.ts.map +1 -0
  35. package/dist/typescript/commonjs/features/uiMode/__tests__/getUIMode.test.d.ts +2 -0
  36. package/dist/typescript/commonjs/features/uiMode/__tests__/getUIMode.test.d.ts.map +1 -0
  37. package/dist/typescript/commonjs/index.d.ts +1 -0
  38. package/dist/typescript/commonjs/index.d.ts.map +1 -1
  39. package/dist/typescript/module/features/featureUsage/featureUsage.constants.d.ts +5 -0
  40. package/dist/typescript/module/features/featureUsage/featureUsage.constants.d.ts.map +1 -0
  41. package/dist/typescript/module/features/featureUsage/featureUsage.types.d.ts +4 -0
  42. package/dist/typescript/module/features/featureUsage/featureUsage.types.d.ts.map +1 -0
  43. package/dist/typescript/module/features/featureUsage/index.d.ts +5 -0
  44. package/dist/typescript/module/features/featureUsage/index.d.ts.map +1 -0
  45. package/dist/typescript/module/features/featureUsage/model/FeatureUsageModel.d.ts +9 -0
  46. package/dist/typescript/module/features/featureUsage/model/FeatureUsageModel.d.ts.map +1 -0
  47. package/dist/typescript/module/features/featureUsage/model/UsageTracker.d.ts +9 -0
  48. package/dist/typescript/module/features/featureUsage/model/UsageTracker.d.ts.map +1 -0
  49. package/dist/typescript/module/features/uiMode/__tests__/getUIMode.test.d.ts +2 -0
  50. package/dist/typescript/module/features/uiMode/__tests__/getUIMode.test.d.ts.map +1 -0
  51. package/dist/typescript/module/index.d.ts +1 -0
  52. package/dist/typescript/module/index.d.ts.map +1 -1
  53. package/package.json +2 -2
  54. package/src/features/featureUsage/featureUsage.constants.ts +4 -0
  55. package/src/features/featureUsage/featureUsage.types.ts +4 -0
  56. package/src/features/featureUsage/index.ts +4 -0
  57. package/src/features/featureUsage/model/FeatureUsageModel.ts +17 -0
  58. package/src/features/featureUsage/model/UsageTracker.ts +16 -0
  59. package/src/features/uiMode/__tests__/SPEC.md +114 -0
  60. package/src/features/uiMode/__tests__/getUIMode.test.ts +364 -0
  61. package/src/index.ts +1 -0
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.UsageTrackScope = void 0;
7
+ let UsageTrackScope = exports.UsageTrackScope = /*#__PURE__*/function (UsageTrackScope) {
8
+ UsageTrackScope["PROBLEM"] = "PROBLEM";
9
+ UsageTrackScope["ASSIGNMENT"] = "ASSIGNMENT";
10
+ return UsageTrackScope;
11
+ }({});
12
+ //# sourceMappingURL=featureUsage.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["UsageTrackScope","exports"],"sourceRoot":"../../../../src","sources":["features/featureUsage/featureUsage.constants.ts"],"mappings":";;;;;;IAAYA,eAAe,GAAAC,OAAA,CAAAD,eAAA,0BAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=featureUsage.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["features/featureUsage/featureUsage.types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "FeatureUsageModel", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _FeatureUsageModel.FeatureUsageModel;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "UsageTrackScope", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _featureUsageConstants.UsageTrackScope;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "UsageTracker", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _UsageTracker.UsageTracker;
22
+ }
23
+ });
24
+ var _featureUsageConstants = require("./featureUsage.constants.js");
25
+ var _UsageTracker = require("./model/UsageTracker.js");
26
+ var _FeatureUsageModel = require("./model/FeatureUsageModel.js");
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_featureUsageConstants","require","_UsageTracker","_FeatureUsageModel"],"sourceRoot":"../../../../src","sources":["features/featureUsage/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,sBAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,kBAAA,GAAAF,OAAA","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FeatureUsageModel = void 0;
7
+ var _effector = require("effector");
8
+ var _UsageTracker = require("./UsageTracker.js");
9
+ var _featureUsageConstants = require("../featureUsage.constants.js");
10
+ class FeatureUsageModel {
11
+ tts = new _UsageTracker.UsageTracker(_featureUsageConstants.UsageTrackScope.PROBLEM);
12
+ translation = new _UsageTracker.UsageTracker(_featureUsageConstants.UsageTrackScope.PROBLEM);
13
+ features = [this.tts, this.translation];
14
+ setupScopeResets(scopes) {
15
+ for (const tracker of this.features) {
16
+ (0, _effector.sample)({
17
+ clock: scopes[tracker.scope],
18
+ target: tracker.reset
19
+ });
20
+ }
21
+ }
22
+ }
23
+ exports.FeatureUsageModel = FeatureUsageModel;
24
+ //# sourceMappingURL=FeatureUsageModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_effector","require","_UsageTracker","_featureUsageConstants","FeatureUsageModel","tts","UsageTracker","UsageTrackScope","PROBLEM","translation","features","setupScopeResets","scopes","tracker","sample","clock","scope","target","reset","exports"],"sourceRoot":"../../../../../src","sources":["features/featureUsage/model/FeatureUsageModel.ts"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAF,OAAA;AAGO,MAAMG,iBAAiB,CAAC;EACbC,GAAG,GAAG,IAAIC,0BAAY,CAACC,sCAAe,CAACC,OAAO,CAAC;EAC/CC,WAAW,GAAG,IAAIH,0BAAY,CAACC,sCAAe,CAACC,OAAO,CAAC;EAEtDE,QAAQ,GAAG,CAAC,IAAI,CAACL,GAAG,EAAE,IAAI,CAACI,WAAW,CAAC;EAEjDE,gBAAgBA,CAACC,MAA8B,EAAE;IACtD,KAAK,MAAMC,OAAO,IAAI,IAAI,CAACH,QAAQ,EAAE;MACnC,IAAAI,gBAAM,EAAC;QAAEC,KAAK,EAAEH,MAAM,CAACC,OAAO,CAACG,KAAK,CAAC;QAAEC,MAAM,EAAEJ,OAAO,CAACK;MAAM,CAAC,CAAC;IACjE;EACF;AACF;AAACC,OAAA,CAAAf,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.UsageTracker = void 0;
7
+ var _effector = require("effector");
8
+ class UsageTracker {
9
+ reset = (0, _effector.createEvent)();
10
+ track = (0, _effector.createEvent)();
11
+ $isUsed = (0, _effector.createStore)(false).on(this.track, () => true).reset(this.reset);
12
+ constructor(scope) {
13
+ this.scope = scope;
14
+ }
15
+ }
16
+ exports.UsageTracker = UsageTracker;
17
+ //# sourceMappingURL=UsageTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_effector","require","UsageTracker","reset","createEvent","track","$isUsed","createStore","on","constructor","scope","exports"],"sourceRoot":"../../../../../src","sources":["features/featureUsage/model/UsageTracker.ts"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAGO,MAAMC,YAAY,CAAC;EACRC,KAAK,GAAG,IAAAC,qBAAW,EAAC,CAAC;EACrBC,KAAK,GAAG,IAAAD,qBAAW,EAAC,CAAC;EAGrBE,OAAO,GAAG,IAAAC,qBAAW,EAAC,KAAK,CAAC,CACzCC,EAAE,CAAC,IAAI,CAACH,KAAK,EAAE,MAAM,IAAI,CAAC,CAC1BF,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;EAEpBM,WAAWA,CAACC,KAAsB,EAAE;IAClC,IAAI,CAACA,KAAK,GAAGA,KAAK;EACpB;AACF;AAACC,OAAA,CAAAT,YAAA,GAAAA,YAAA","ignoreList":[]}
@@ -184,7 +184,7 @@ Object.keys(_index14).forEach(function (key) {
184
184
  }
185
185
  });
186
186
  });
187
- var _index15 = require("./features/uiMode/index.js");
187
+ var _index15 = require("./features/featureUsage/index.js");
188
188
  Object.keys(_index15).forEach(function (key) {
189
189
  if (key === "default" || key === "__esModule") return;
190
190
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
@@ -196,4 +196,16 @@ Object.keys(_index15).forEach(function (key) {
196
196
  }
197
197
  });
198
198
  });
199
+ var _index16 = require("./features/uiMode/index.js");
200
+ Object.keys(_index16).forEach(function (key) {
201
+ if (key === "default" || key === "__esModule") return;
202
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
203
+ if (key in exports && exports[key] === _index16[key]) return;
204
+ Object.defineProperty(exports, key, {
205
+ enumerable: true,
206
+ get: function () {
207
+ return _index16[key];
208
+ }
209
+ });
210
+ });
199
211
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_index","require","_helpers","_index2","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_index3","_index4","_index5","_index6","_index7","_index8","_index9","_index10","_index11","_index12","_index13","_index14","_index15"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_index","require","_helpers","_index2","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_index3","_index4","_index5","_index6","_index7","_index8","_index9","_index10","_index11","_index12","_index13","_index14","_index15","_index16"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ export let UsageTrackScope = /*#__PURE__*/function (UsageTrackScope) {
4
+ UsageTrackScope["PROBLEM"] = "PROBLEM";
5
+ UsageTrackScope["ASSIGNMENT"] = "ASSIGNMENT";
6
+ return UsageTrackScope;
7
+ }({});
8
+ //# sourceMappingURL=featureUsage.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["UsageTrackScope"],"sourceRoot":"../../../../src","sources":["features/featureUsage/featureUsage.constants.ts"],"mappings":";;AAAA,WAAYA,eAAe,0BAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=featureUsage.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["features/featureUsage/featureUsage.types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ export { UsageTrackScope } from "./featureUsage.constants.js";
4
+ export { UsageTracker } from "./model/UsageTracker.js";
5
+ export { FeatureUsageModel } from "./model/FeatureUsageModel.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["UsageTrackScope","UsageTracker","FeatureUsageModel"],"sourceRoot":"../../../../src","sources":["features/featureUsage/index.ts"],"mappings":";;AAAA,SAASA,eAAe,QAAQ,6BAA0B;AAC1D,SAASC,YAAY,QAAQ,yBAAsB;AACnD,SAASC,iBAAiB,QAAQ,8BAA2B","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ import { sample } from 'effector';
4
+ import { UsageTracker } from "./UsageTracker.js";
5
+ import { UsageTrackScope } from "../featureUsage.constants.js";
6
+ export class FeatureUsageModel {
7
+ tts = new UsageTracker(UsageTrackScope.PROBLEM);
8
+ translation = new UsageTracker(UsageTrackScope.PROBLEM);
9
+ features = [this.tts, this.translation];
10
+ setupScopeResets(scopes) {
11
+ for (const tracker of this.features) {
12
+ sample({
13
+ clock: scopes[tracker.scope],
14
+ target: tracker.reset
15
+ });
16
+ }
17
+ }
18
+ }
19
+ //# sourceMappingURL=FeatureUsageModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sample","UsageTracker","UsageTrackScope","FeatureUsageModel","tts","PROBLEM","translation","features","setupScopeResets","scopes","tracker","clock","scope","target","reset"],"sourceRoot":"../../../../../src","sources":["features/featureUsage/model/FeatureUsageModel.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,UAAU;AACjC,SAASC,YAAY,QAAQ,mBAAgB;AAC7C,SAASC,eAAe,QAAQ,8BAA2B;AAG3D,OAAO,MAAMC,iBAAiB,CAAC;EACbC,GAAG,GAAG,IAAIH,YAAY,CAACC,eAAe,CAACG,OAAO,CAAC;EAC/CC,WAAW,GAAG,IAAIL,YAAY,CAACC,eAAe,CAACG,OAAO,CAAC;EAEtDE,QAAQ,GAAG,CAAC,IAAI,CAACH,GAAG,EAAE,IAAI,CAACE,WAAW,CAAC;EAEjDE,gBAAgBA,CAACC,MAA8B,EAAE;IACtD,KAAK,MAAMC,OAAO,IAAI,IAAI,CAACH,QAAQ,EAAE;MACnCP,MAAM,CAAC;QAAEW,KAAK,EAAEF,MAAM,CAACC,OAAO,CAACE,KAAK,CAAC;QAAEC,MAAM,EAAEH,OAAO,CAACI;MAAM,CAAC,CAAC;IACjE;EACF;AACF","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ import { createEvent, createStore } from 'effector';
4
+ export class UsageTracker {
5
+ reset = createEvent();
6
+ track = createEvent();
7
+ $isUsed = createStore(false).on(this.track, () => true).reset(this.reset);
8
+ constructor(scope) {
9
+ this.scope = scope;
10
+ }
11
+ }
12
+ //# sourceMappingURL=UsageTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createEvent","createStore","UsageTracker","reset","track","$isUsed","on","constructor","scope"],"sourceRoot":"../../../../../src","sources":["features/featureUsage/model/UsageTracker.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,WAAW,QAAQ,UAAU;AAGnD,OAAO,MAAMC,YAAY,CAAC;EACRC,KAAK,GAAGH,WAAW,CAAC,CAAC;EACrBI,KAAK,GAAGJ,WAAW,CAAC,CAAC;EAGrBK,OAAO,GAAGJ,WAAW,CAAC,KAAK,CAAC,CACzCK,EAAE,CAAC,IAAI,CAACF,KAAK,EAAE,MAAM,IAAI,CAAC,CAC1BD,KAAK,CAAC,IAAI,CAACA,KAAK,CAAC;EAEpBI,WAAWA,CAACC,KAAsB,EAAE;IAClC,IAAI,CAACA,KAAK,GAAGA,KAAK;EACpB;AACF","ignoreList":[]}
@@ -15,5 +15,6 @@ export * from "./features/pmProgress/index.js";
15
15
  export * from "./features/openEnded/index.js";
16
16
  export * from "./shared/icons/index.js";
17
17
  export * from "./features/voice/index.js";
18
+ export * from "./features/featureUsage/index.js";
18
19
  export * from "./features/uiMode/index.js";
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useFeaturesLocalization","setFeaturesLocalization","generateRandomId"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,uBAAuB,EAAEC,uBAAuB,QAAQ,+BAAsB;AACvF,SAASC,gBAAgB,QAAQ,0BAAuB;AACxD,cAAc,6BAAoB;AAClC,cAAc,8BAAqB;AACnC,cAAc,kCAAyB;AACvC,cAAc,qCAA4B;AAC1C,cAAc,kCAAyB;AACvC,cAAc,qCAA4B;AAC1C,cAAc,qCAA4B;AAC1C,cAAc,qCAA4B;AAC1C,cAAc,8BAAqB;AACnC,cAAc,gCAAuB;AACrC,cAAc,+BAAsB;AACpC,cAAc,yBAAgB;AAC9B,cAAc,2BAAkB;AAChC,cAAc,4BAAmB","ignoreList":[]}
1
+ {"version":3,"names":["useFeaturesLocalization","setFeaturesLocalization","generateRandomId"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,uBAAuB,EAAEC,uBAAuB,QAAQ,+BAAsB;AACvF,SAASC,gBAAgB,QAAQ,0BAAuB;AACxD,cAAc,6BAAoB;AAClC,cAAc,8BAAqB;AACnC,cAAc,kCAAyB;AACvC,cAAc,qCAA4B;AAC1C,cAAc,kCAAyB;AACvC,cAAc,qCAA4B;AAC1C,cAAc,qCAA4B;AAC1C,cAAc,qCAA4B;AAC1C,cAAc,8BAAqB;AACnC,cAAc,gCAAuB;AACrC,cAAc,+BAAsB;AACpC,cAAc,yBAAgB;AAC9B,cAAc,2BAAkB;AAChC,cAAc,kCAAyB;AACvC,cAAc,4BAAmB","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ export declare enum UsageTrackScope {
2
+ PROBLEM = "PROBLEM",
3
+ ASSIGNMENT = "ASSIGNMENT"
4
+ }
5
+ //# sourceMappingURL=featureUsage.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureUsage.constants.d.ts","sourceRoot":"","sources":["../../../../../src/features/featureUsage/featureUsage.constants.ts"],"names":[],"mappings":"AAAA,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,UAAU,eAAe;CAC1B"}
@@ -0,0 +1,4 @@
1
+ import type { UsageTrackScope } from '@magmamath/students-features';
2
+ import type { Unit } from 'effector';
3
+ export type FeatureUsageScopeProps = Record<UsageTrackScope, Unit<any>>;
4
+ //# sourceMappingURL=featureUsage.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureUsage.types.d.ts","sourceRoot":"","sources":["../../../../../src/features/featureUsage/featureUsage.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAEpC,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { UsageTrackScope } from './featureUsage.constants';
2
+ export { UsageTracker } from './model/UsageTracker';
3
+ export { FeatureUsageModel } from './model/FeatureUsageModel';
4
+ export type { FeatureUsageScopeProps } from './featureUsage.types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/featureUsage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { UsageTracker } from './UsageTracker';
2
+ import { FeatureUsageScopeProps } from '../featureUsage.types';
3
+ export declare class FeatureUsageModel {
4
+ readonly tts: UsageTracker;
5
+ readonly translation: UsageTracker;
6
+ private readonly features;
7
+ setupScopeResets(scopes: FeatureUsageScopeProps): void;
8
+ }
9
+ //# sourceMappingURL=FeatureUsageModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeatureUsageModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/featureUsage/model/FeatureUsageModel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,qBAAa,iBAAiB;IAC5B,SAAgB,GAAG,eAA4C;IAC/D,SAAgB,WAAW,eAA4C;IAEvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IAEjD,gBAAgB,CAAC,MAAM,EAAE,sBAAsB;CAKvD"}
@@ -0,0 +1,9 @@
1
+ import { UsageTrackScope } from '../featureUsage.constants';
2
+ export declare class UsageTracker {
3
+ readonly reset: import("effector").EventCallable<void>;
4
+ readonly track: import("effector").EventCallable<void>;
5
+ readonly scope: UsageTrackScope;
6
+ readonly $isUsed: import("effector").StoreWritable<boolean>;
7
+ constructor(scope: UsageTrackScope);
8
+ }
9
+ //# sourceMappingURL=UsageTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsageTracker.d.ts","sourceRoot":"","sources":["../../../../../../src/features/featureUsage/model/UsageTracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,qBAAa,YAAY;IACvB,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,KAAK,EAAE,eAAe,CAAA;IAEtC,SAAgB,OAAO,4CAEH;gBAER,KAAK,EAAE,eAAe;CAGnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getUIMode.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUIMode.test.d.ts","sourceRoot":"","sources":["../../../../../../src/features/uiMode/__tests__/getUIMode.test.ts"],"names":[],"mappings":""}
@@ -13,5 +13,6 @@ export * from './features/pmProgress';
13
13
  export * from './features/openEnded';
14
14
  export * from './shared/icons';
15
15
  export * from './features/voice';
16
+ export * from './features/featureUsage';
16
17
  export * from './features/uiMode';
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export declare enum UsageTrackScope {
2
+ PROBLEM = "PROBLEM",
3
+ ASSIGNMENT = "ASSIGNMENT"
4
+ }
5
+ //# sourceMappingURL=featureUsage.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureUsage.constants.d.ts","sourceRoot":"","sources":["../../../../../src/features/featureUsage/featureUsage.constants.ts"],"names":[],"mappings":"AAAA,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,UAAU,eAAe;CAC1B"}
@@ -0,0 +1,4 @@
1
+ import type { UsageTrackScope } from '@magmamath/students-features';
2
+ import type { Unit } from 'effector';
3
+ export type FeatureUsageScopeProps = Record<UsageTrackScope, Unit<any>>;
4
+ //# sourceMappingURL=featureUsage.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureUsage.types.d.ts","sourceRoot":"","sources":["../../../../../src/features/featureUsage/featureUsage.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAEpC,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { UsageTrackScope } from './featureUsage.constants';
2
+ export { UsageTracker } from './model/UsageTracker';
3
+ export { FeatureUsageModel } from './model/FeatureUsageModel';
4
+ export type { FeatureUsageScopeProps } from './featureUsage.types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/featureUsage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { UsageTracker } from './UsageTracker';
2
+ import { FeatureUsageScopeProps } from '../featureUsage.types';
3
+ export declare class FeatureUsageModel {
4
+ readonly tts: UsageTracker;
5
+ readonly translation: UsageTracker;
6
+ private readonly features;
7
+ setupScopeResets(scopes: FeatureUsageScopeProps): void;
8
+ }
9
+ //# sourceMappingURL=FeatureUsageModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeatureUsageModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/featureUsage/model/FeatureUsageModel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,qBAAa,iBAAiB;IAC5B,SAAgB,GAAG,eAA4C;IAC/D,SAAgB,WAAW,eAA4C;IAEvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IAEjD,gBAAgB,CAAC,MAAM,EAAE,sBAAsB;CAKvD"}
@@ -0,0 +1,9 @@
1
+ import { UsageTrackScope } from '../featureUsage.constants';
2
+ export declare class UsageTracker {
3
+ readonly reset: import("effector").EventCallable<void>;
4
+ readonly track: import("effector").EventCallable<void>;
5
+ readonly scope: UsageTrackScope;
6
+ readonly $isUsed: import("effector").StoreWritable<boolean>;
7
+ constructor(scope: UsageTrackScope);
8
+ }
9
+ //# sourceMappingURL=UsageTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsageTracker.d.ts","sourceRoot":"","sources":["../../../../../../src/features/featureUsage/model/UsageTracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,qBAAa,YAAY;IACvB,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,KAAK,yCAAgB;IACrC,SAAgB,KAAK,EAAE,eAAe,CAAA;IAEtC,SAAgB,OAAO,4CAEH;gBAER,KAAK,EAAE,eAAe;CAGnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getUIMode.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUIMode.test.d.ts","sourceRoot":"","sources":["../../../../../../src/features/uiMode/__tests__/getUIMode.test.ts"],"names":[],"mappings":""}
@@ -13,5 +13,6 @@ export * from './features/pmProgress';
13
13
  export * from './features/openEnded';
14
14
  export * from './shared/icons';
15
15
  export * from './features/voice';
16
+ export * from './features/featureUsage';
16
17
  export * from './features/uiMode';
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magmamath/students-features",
3
- "version": "1.3.10-rc.1",
3
+ "version": "1.3.11-rc.0",
4
4
  "description": "Magmamath features library",
5
5
  "source": "src/index.ts",
6
6
  "main": "src/index.ts",
@@ -41,7 +41,7 @@
41
41
  },
42
42
  "devDependencies": {
43
43
  "@magmamath/frontend-config": "1.1.3",
44
- "@magmamath/react-native-draw-board": "1.8.2-rc.3",
44
+ "@magmamath/react-native-draw-board": "1.8.2",
45
45
  "@magmamath/react-native-ui": "0.4.83",
46
46
  "@matteappen/skills-utils": "^3.7.1",
47
47
  "@react-native-masked-view/masked-view": "^0.3.2",
@@ -0,0 +1,4 @@
1
+ export enum UsageTrackScope {
2
+ PROBLEM = 'PROBLEM',
3
+ ASSIGNMENT = 'ASSIGNMENT',
4
+ }
@@ -0,0 +1,4 @@
1
+ import type { UsageTrackScope } from '@magmamath/students-features'
2
+ import type { Unit } from 'effector'
3
+
4
+ export type FeatureUsageScopeProps = Record<UsageTrackScope, Unit<any>>
@@ -0,0 +1,4 @@
1
+ export { UsageTrackScope } from './featureUsage.constants'
2
+ export { UsageTracker } from './model/UsageTracker'
3
+ export { FeatureUsageModel } from './model/FeatureUsageModel'
4
+ export type { FeatureUsageScopeProps } from './featureUsage.types'
@@ -0,0 +1,17 @@
1
+ import { sample } from 'effector'
2
+ import { UsageTracker } from './UsageTracker'
3
+ import { UsageTrackScope } from '../featureUsage.constants'
4
+ import { FeatureUsageScopeProps } from '../featureUsage.types'
5
+
6
+ export class FeatureUsageModel {
7
+ public readonly tts = new UsageTracker(UsageTrackScope.PROBLEM)
8
+ public readonly translation = new UsageTracker(UsageTrackScope.PROBLEM)
9
+
10
+ private readonly features = [this.tts, this.translation]
11
+
12
+ public setupScopeResets(scopes: FeatureUsageScopeProps) {
13
+ for (const tracker of this.features) {
14
+ sample({ clock: scopes[tracker.scope], target: tracker.reset })
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,16 @@
1
+ import { createEvent, createStore } from 'effector'
2
+ import { UsageTrackScope } from '../featureUsage.constants'
3
+
4
+ export class UsageTracker {
5
+ public readonly reset = createEvent()
6
+ public readonly track = createEvent()
7
+ public readonly scope: UsageTrackScope
8
+
9
+ public readonly $isUsed = createStore(false)
10
+ .on(this.track, () => true)
11
+ .reset(this.reset)
12
+
13
+ constructor(scope: UsageTrackScope) {
14
+ this.scope = scope
15
+ }
16
+ }
@@ -0,0 +1,114 @@
1
+ # UIMode Specification
2
+
3
+ ## Inputs
4
+
5
+ | Input | Type | Description |
6
+ |----------------------|-------------------|---------------------------------------------------|
7
+ | `user.grade` | `number \| null` | User's grade level. Invalid when `null` or `-1` |
8
+ | `practice.isEnabled` | `boolean` | Whether this is a practice exercise |
9
+ | `practice.grade` | `number \| null` | Grade of the practice problem |
10
+ | `assignment.grade` | `number \| null` | From `assignment.classes[0].grade` |
11
+ | `locale` | `Locale` | e.g. `US`, `CA`, `SE` |
12
+ | `problem.answerType` | `AnswerType` | Current problem's answer type |
13
+ | `problem.characterType` | `number` | Current problem's character type |
14
+ | `problem.hasAnswerVariants` | `boolean` | Whether the current problem has answer variants |
15
+
16
+ ## Output
17
+
18
+ | Field | Type | Values |
19
+ |--------------|------------------|---------------------------------|
20
+ | `general` | `UIMode` | `SIMPLE` or `REGULAR` |
21
+ | `toolbar` | `ToolBarVariants` | `SIMPLE`, `COMMON`, `ADVANCED` |
22
+ | `answerArea` | `UIMode` | `SIMPLE` or `REGULAR` |
23
+
24
+ ---
25
+
26
+ ## Step 1: Determine `isSimpleMode`
27
+
28
+ A grade is "simple" when it is **not null** and is **between 0 and 2 inclusive**.
29
+
30
+ | Condition | Grade used |
31
+ |------------------------------------|----------------------|
32
+ | `practice.isEnabled` is `true` | `practice.grade` |
33
+ | `user.grade` is valid (not null/-1)| `user.grade` |
34
+ | `user.grade` is null or -1 | `assignment.grade` |
35
+
36
+ ### Test cases
37
+
38
+ | # | practice.isEnabled | practice.grade | user.grade | assignment.grade | isSimpleMode |
39
+ |----|--------------------|----------------|------------|------------------|--------------|
40
+ | 1 | true | 0 | - | - | true |
41
+ | 2 | true | 2 | - | - | true |
42
+ | 3 | true | 3 | - | - | false |
43
+ | 4 | true | null | - | - | false |
44
+ | 5 | false | - | 1 | - | true |
45
+ | 6 | false | - | 5 | - | false |
46
+ | 7 | false | - | null | 2 | true |
47
+ | 8 | false | - | -1 | 2 | true |
48
+ | 9 | false | - | null | 5 | false |
49
+ | 10 | false | - | null | null | false |
50
+
51
+ ---
52
+
53
+ ## Step 2: `general`
54
+
55
+ | isSimpleMode | general |
56
+ |--------------|-----------|
57
+ | true | `SIMPLE` |
58
+ | false | `REGULAR` |
59
+
60
+ ---
61
+
62
+ ## Step 3: `toolbar`
63
+
64
+ Effective grade = `assignment.grade ?? practice.grade`
65
+
66
+ | # | assignment.grade | practice.grade | locale | isSimpleMode | toolbar |
67
+ |----|------------------|----------------|--------|--------------|------------|
68
+ | 11 | 7 | - | SE | any | `ADVANCED` |
69
+ | 12 | 8 | - | US | any | `ADVANCED` |
70
+ | 13 | 6 | - | US | any | `ADVANCED` |
71
+ | 14 | 6 | - | CA | any | `ADVANCED` |
72
+ | 15 | 6 | - | SE | true | `SIMPLE` |
73
+ | 16 | 6 | - | SE | false | `COMMON` |
74
+ | 17 | 3 | - | US | true | `SIMPLE` |
75
+ | 18 | 3 | - | US | false | `COMMON` |
76
+ | 19 | null | 8 | US | any | `ADVANCED` |
77
+ | 20 | null | null | - | true | `SIMPLE` |
78
+ | 21 | null | null | - | false | `COMMON` |
79
+
80
+ **Advanced threshold:**
81
+
82
+ | Locale | Grade >= | Result |
83
+ |----------|----------|------------|
84
+ | US or CA | 6 | `ADVANCED` |
85
+ | Other | 7 | `ADVANCED` |
86
+
87
+ **Priority:** `ADVANCED` > `SIMPLE` > `COMMON`
88
+
89
+ ---
90
+
91
+ ## Step 4: `answerArea`
92
+
93
+ | # | isSimpleMode | practice.isEnabled | hasAnswerVariants | answerType | characterType | answerArea |
94
+ |----|--------------|--------------------|-------------------|--------------|---------------|------------|
95
+ | 22 | false | any | any | any | any | `REGULAR` |
96
+ | 23 | true | true | any | any | any | `SIMPLE` |
97
+ | 24 | true | false | true | any | any | `SIMPLE` |
98
+ | 25 | true | false | false | HANDWRITING | 10 | `SIMPLE` |
99
+ | 26 | true | false | false | HANDWRITING | 5 | `REGULAR` |
100
+ | 27 | true | false | false | MULTI_CHOICE | 10 | `REGULAR` |
101
+ | 28 | true | false | false | other | any | `REGULAR` |
102
+
103
+ ---
104
+
105
+ ## Full combined scenarios
106
+
107
+ | # | Mode | user.grade | assignment.grade | practice.grade | locale | hasVariants | answerType | charType | general | toolbar | answerArea |
108
+ |----|----------|------------|------------------|----------------|--------|-------------|-------------|----------|-----------|------------|------------|
109
+ | 29 | practice | - | - | 1 | US | true | - | - | `SIMPLE` | `SIMPLE` | `SIMPLE` |
110
+ | 30 | practice | - | - | 8 | US | false | - | - | `REGULAR` | `ADVANCED` | `REGULAR` |
111
+ | 31 | regular | 2 | 7 | - | SE | true | - | - | `SIMPLE` | `ADVANCED` | `SIMPLE` |
112
+ | 32 | regular | 5 | 3 | - | US | false | SINGLE | - | `REGULAR` | `COMMON` | `REGULAR` |
113
+ | 33 | regular | null | 1 | - | SE | false | HANDWRITING | 10 | `SIMPLE` | `SIMPLE` | `SIMPLE` |
114
+ | 34 | regular | null | null | null | SE | - | - | - | `REGULAR` | `COMMON` | `REGULAR` |
@@ -0,0 +1,364 @@
1
+ jest.mock('@magmamath/react-native-draw-board', () => ({
2
+ ToolBarVariants: {
3
+ COMMON: 'COMMON',
4
+ SIMPLE: 'SIMPLE',
5
+ ADVANCED: 'ADVANCED',
6
+ REPLAY: 'REPLAY',
7
+ NO_CONTROLLER: 'NO_CONTROLLER',
8
+ },
9
+ }))
10
+
11
+ jest.mock('@magmamath/frontend-config', () => ({
12
+ Locale: {
13
+ US: 'en-SE',
14
+ SE: 'sv-SE',
15
+ CA: 'en-CA',
16
+ GB: 'en-GB',
17
+ SCT: 'en-SCT',
18
+ DE: 'de-DE',
19
+ },
20
+ }))
21
+
22
+ import { getUIMode } from '../getUIMode'
23
+ import { UIMode } from '../uiMode.constants'
24
+ import { AnswerType } from '../../../types/answerTypes'
25
+ import { MyScriptMathCharacterTypes } from '../../../types/characterTypes'
26
+ import { ToolBarVariants } from '@magmamath/react-native-draw-board'
27
+ import { Locale } from '@magmamath/frontend-config'
28
+ import { GetUIModeProps } from '../uiMode.types'
29
+
30
+ const defaults: GetUIModeProps = {
31
+ user: { grade: null },
32
+ practice: { isEnabled: false, grade: null },
33
+ assignment: { grade: null },
34
+ locale: Locale.US,
35
+ problem: {
36
+ answerType: AnswerType.HANDWRITING,
37
+ characterType: MyScriptMathCharacterTypes.DEFAULT,
38
+ hasAnswerVariants: false,
39
+ },
40
+ }
41
+
42
+ const getUIModeWithDefaults = (overrides: Partial<GetUIModeProps>) =>
43
+ getUIMode({ ...defaults, ...overrides })
44
+
45
+ describe('practice mode uses practice grade to determine simple mode (grades 0-2 are simple)', () => {
46
+ it('grade 0 → simple', () => {
47
+ const result = getUIModeWithDefaults({ practice: { isEnabled: true, grade: 0 } })
48
+ expect(result.general).toBe(UIMode.SIMPLE)
49
+ })
50
+
51
+ it('grade 2 → simple', () => {
52
+ const result = getUIModeWithDefaults({ practice: { isEnabled: true, grade: 2 } })
53
+ expect(result.general).toBe(UIMode.SIMPLE)
54
+ })
55
+
56
+ it('grade 3 → regular', () => {
57
+ const result = getUIModeWithDefaults({ practice: { isEnabled: true, grade: 3 } })
58
+ expect(result.general).toBe(UIMode.REGULAR)
59
+ })
60
+
61
+ it('null grade → regular', () => {
62
+ const result = getUIModeWithDefaults({ practice: { isEnabled: true, grade: null } })
63
+ expect(result.general).toBe(UIMode.REGULAR)
64
+ })
65
+
66
+ it('young student practicing with answer variants gets full simple experience', () => {
67
+ const result = getUIModeWithDefaults({
68
+ practice: { isEnabled: true, grade: 1 },
69
+ locale: Locale.US,
70
+ problem: {
71
+ answerType: AnswerType.HANDWRITING,
72
+ characterType: MyScriptMathCharacterTypes.DEFAULT,
73
+ hasAnswerVariants: true,
74
+ },
75
+ })
76
+ expect(result).toEqual({
77
+ general: UIMode.SIMPLE,
78
+ toolbar: ToolBarVariants.SIMPLE,
79
+ answerArea: UIMode.SIMPLE,
80
+ })
81
+ })
82
+
83
+ it('older student practicing gets advanced toolbar with regular UI', () => {
84
+ const result = getUIModeWithDefaults({
85
+ practice: { isEnabled: true, grade: 8 },
86
+ locale: Locale.US,
87
+ problem: {
88
+ answerType: AnswerType.HANDWRITING,
89
+ characterType: MyScriptMathCharacterTypes.DEFAULT,
90
+ hasAnswerVariants: false,
91
+ },
92
+ })
93
+ expect(result).toEqual({
94
+ general: UIMode.REGULAR,
95
+ toolbar: ToolBarVariants.ADVANCED,
96
+ answerArea: UIMode.REGULAR,
97
+ })
98
+ })
99
+ })
100
+
101
+ describe('regular mode uses user grade, falls back to assignment grade when user grade is null, undefined, or -1', () => {
102
+ it('user grade 1 → simple', () => {
103
+ const result = getUIModeWithDefaults({ user: { grade: 1 } })
104
+ expect(result.general).toBe(UIMode.SIMPLE)
105
+ })
106
+
107
+ it('user grade 5 → regular', () => {
108
+ const result = getUIModeWithDefaults({ user: { grade: 5 } })
109
+ expect(result.general).toBe(UIMode.REGULAR)
110
+ })
111
+
112
+ it('user grade null falls back to assignment grade 2 → simple', () => {
113
+ const result = getUIModeWithDefaults({ user: { grade: null }, assignment: { grade: 2 } })
114
+ expect(result.general).toBe(UIMode.SIMPLE)
115
+ })
116
+
117
+ it('user grade undefined falls back to assignment grade 2 → simple', () => {
118
+ const result = getUIModeWithDefaults({ user: { grade: undefined }, assignment: { grade: 2 } })
119
+ expect(result.general).toBe(UIMode.SIMPLE)
120
+ })
121
+
122
+ it('user grade -1 (invalid) falls back to assignment grade 2 → simple', () => {
123
+ const result = getUIModeWithDefaults({ user: { grade: -1 }, assignment: { grade: 2 } })
124
+ expect(result.general).toBe(UIMode.SIMPLE)
125
+ })
126
+
127
+ it('user grade null falls back to assignment grade 5 → regular', () => {
128
+ const result = getUIModeWithDefaults({ user: { grade: null }, assignment: { grade: 5 } })
129
+ expect(result.general).toBe(UIMode.REGULAR)
130
+ })
131
+
132
+ it('user grade undefined falls back to assignment grade 5 → regular', () => {
133
+ const result = getUIModeWithDefaults({ user: { grade: undefined }, assignment: { grade: 5 } })
134
+ expect(result.general).toBe(UIMode.REGULAR)
135
+ })
136
+
137
+ it('both user and assignment grade null → regular', () => {
138
+ const result = getUIModeWithDefaults({ user: { grade: null }, assignment: { grade: null } })
139
+ expect(result.general).toBe(UIMode.REGULAR)
140
+ })
141
+
142
+ it('user grade 2 in grade 7 SE assignment gets simple mode but advanced toolbar', () => {
143
+ const result = getUIModeWithDefaults({
144
+ user: { grade: 2 },
145
+ assignment: { grade: 7 },
146
+ locale: Locale.SE,
147
+ problem: {
148
+ answerType: AnswerType.HANDWRITING,
149
+ characterType: MyScriptMathCharacterTypes.DEFAULT,
150
+ hasAnswerVariants: true,
151
+ },
152
+ })
153
+ expect(result).toEqual({
154
+ general: UIMode.SIMPLE,
155
+ toolbar: ToolBarVariants.ADVANCED,
156
+ answerArea: UIMode.SIMPLE,
157
+ })
158
+ })
159
+
160
+ it('user grade 5 in grade 3 US assignment gets fully regular experience', () => {
161
+ const result = getUIModeWithDefaults({
162
+ user: { grade: 5 },
163
+ assignment: { grade: 3 },
164
+ locale: Locale.US,
165
+ problem: {
166
+ answerType: AnswerType.SINGLE_CHOICE,
167
+ characterType: MyScriptMathCharacterTypes.DEFAULT,
168
+ hasAnswerVariants: false,
169
+ },
170
+ })
171
+ expect(result).toEqual({
172
+ general: UIMode.REGULAR,
173
+ toolbar: ToolBarVariants.COMMON,
174
+ answerArea: UIMode.REGULAR,
175
+ })
176
+ })
177
+
178
+ it('unknown user falls back to assignment grade 1 in SE with handwriting whole numbers', () => {
179
+ const result = getUIModeWithDefaults({
180
+ user: { grade: null },
181
+ assignment: { grade: 1 },
182
+ locale: Locale.SE,
183
+ problem: {
184
+ answerType: AnswerType.HANDWRITING,
185
+ characterType: MyScriptMathCharacterTypes.NUMBERS_WHOLE,
186
+ hasAnswerVariants: false,
187
+ },
188
+ })
189
+ expect(result).toEqual({
190
+ general: UIMode.SIMPLE,
191
+ toolbar: ToolBarVariants.SIMPLE,
192
+ answerArea: UIMode.SIMPLE,
193
+ })
194
+ })
195
+
196
+ it('all grades unknown defaults to fully regular experience', () => {
197
+ const result = getUIModeWithDefaults({
198
+ user: { grade: null },
199
+ assignment: { grade: null },
200
+ practice: { isEnabled: false, grade: null },
201
+ locale: Locale.SE,
202
+ })
203
+ expect(result).toEqual({
204
+ general: UIMode.REGULAR,
205
+ toolbar: ToolBarVariants.COMMON,
206
+ answerArea: UIMode.REGULAR,
207
+ })
208
+ })
209
+ })
210
+
211
+ describe('toolbar is ADVANCED for high grades (>=6 US/CA, >=7 elsewhere), SIMPLE for young students, COMMON otherwise', () => {
212
+ it('grade 7 in SE → ADVANCED', () => {
213
+ const result = getUIModeWithDefaults({ assignment: { grade: 7 }, locale: Locale.SE, user: { grade: 7 } })
214
+ expect(result.toolbar).toBe(ToolBarVariants.ADVANCED)
215
+ })
216
+
217
+ it('grade 8 in US → ADVANCED', () => {
218
+ const result = getUIModeWithDefaults({ assignment: { grade: 8 }, locale: Locale.US, user: { grade: 8 } })
219
+ expect(result.toolbar).toBe(ToolBarVariants.ADVANCED)
220
+ })
221
+
222
+ it('grade 6 in US → ADVANCED', () => {
223
+ const result = getUIModeWithDefaults({ assignment: { grade: 6 }, locale: Locale.US, user: { grade: 6 } })
224
+ expect(result.toolbar).toBe(ToolBarVariants.ADVANCED)
225
+ })
226
+
227
+ it('grade 6 in CA → ADVANCED', () => {
228
+ const result = getUIModeWithDefaults({ assignment: { grade: 6 }, locale: Locale.CA, user: { grade: 6 } })
229
+ expect(result.toolbar).toBe(ToolBarVariants.ADVANCED)
230
+ })
231
+
232
+ it('grade 6 in SE with simple mode student → SIMPLE (not advanced in SE until grade 7)', () => {
233
+ const result = getUIModeWithDefaults({ assignment: { grade: 6 }, locale: Locale.SE, user: { grade: 1 } })
234
+ expect(result.toolbar).toBe(ToolBarVariants.SIMPLE)
235
+ })
236
+
237
+ it('grade 6 in SE with regular mode student → COMMON', () => {
238
+ const result = getUIModeWithDefaults({ assignment: { grade: 6 }, locale: Locale.SE, user: { grade: 6 } })
239
+ expect(result.toolbar).toBe(ToolBarVariants.COMMON)
240
+ })
241
+
242
+ it('grade 3 in US with simple mode student → SIMPLE', () => {
243
+ const result = getUIModeWithDefaults({ assignment: { grade: 3 }, locale: Locale.US, user: { grade: 1 } })
244
+ expect(result.toolbar).toBe(ToolBarVariants.SIMPLE)
245
+ })
246
+
247
+ it('grade 3 in US with regular mode student → COMMON', () => {
248
+ const result = getUIModeWithDefaults({ assignment: { grade: 3 }, locale: Locale.US, user: { grade: 3 } })
249
+ expect(result.toolbar).toBe(ToolBarVariants.COMMON)
250
+ })
251
+
252
+ it('no assignment grade falls back to practice grade 8 → ADVANCED', () => {
253
+ const result = getUIModeWithDefaults({
254
+ assignment: { grade: null },
255
+ practice: { isEnabled: true, grade: 8 },
256
+ locale: Locale.US,
257
+ })
258
+ expect(result.toolbar).toBe(ToolBarVariants.ADVANCED)
259
+ })
260
+
261
+ it('no grades at all with simple mode → SIMPLE', () => {
262
+ const result = getUIModeWithDefaults({
263
+ assignment: { grade: null },
264
+ practice: { isEnabled: true, grade: 1 },
265
+ })
266
+ expect(result.toolbar).toBe(ToolBarVariants.SIMPLE)
267
+ })
268
+
269
+ it('no grades at all with regular mode → COMMON', () => {
270
+ const result = getUIModeWithDefaults({
271
+ assignment: { grade: null },
272
+ practice: { isEnabled: false, grade: null },
273
+ user: { grade: 5 },
274
+ })
275
+ expect(result.toolbar).toBe(ToolBarVariants.COMMON)
276
+ })
277
+ })
278
+
279
+ describe('answer area is SIMPLE only in simple mode when practicing, has variants, or handwriting whole numbers', () => {
280
+ it('regular mode → always REGULAR regardless of other inputs', () => {
281
+ const result = getUIModeWithDefaults({
282
+ user: { grade: 5 },
283
+ practice: { isEnabled: true, grade: 5 },
284
+ problem: {
285
+ answerType: AnswerType.HANDWRITING,
286
+ characterType: MyScriptMathCharacterTypes.NUMBERS_WHOLE,
287
+ hasAnswerVariants: true,
288
+ },
289
+ })
290
+ expect(result.answerArea).toBe(UIMode.REGULAR)
291
+ })
292
+
293
+ it('simple mode + practice exercise → SIMPLE', () => {
294
+ const result = getUIModeWithDefaults({
295
+ practice: { isEnabled: true, grade: 1 },
296
+ problem: {
297
+ answerType: AnswerType.HANDWRITING,
298
+ characterType: MyScriptMathCharacterTypes.DEFAULT,
299
+ hasAnswerVariants: false,
300
+ },
301
+ })
302
+ expect(result.answerArea).toBe(UIMode.SIMPLE)
303
+ })
304
+
305
+ it('simple mode + answer variants → SIMPLE', () => {
306
+ const result = getUIModeWithDefaults({
307
+ user: { grade: 1 },
308
+ problem: {
309
+ answerType: AnswerType.HANDWRITING,
310
+ characterType: MyScriptMathCharacterTypes.DEFAULT,
311
+ hasAnswerVariants: true,
312
+ },
313
+ })
314
+ expect(result.answerArea).toBe(UIMode.SIMPLE)
315
+ })
316
+
317
+ it('simple mode + handwriting whole numbers → SIMPLE', () => {
318
+ const result = getUIModeWithDefaults({
319
+ user: { grade: 1 },
320
+ problem: {
321
+ answerType: AnswerType.HANDWRITING,
322
+ characterType: MyScriptMathCharacterTypes.NUMBERS_WHOLE,
323
+ hasAnswerVariants: false,
324
+ },
325
+ })
326
+ expect(result.answerArea).toBe(UIMode.SIMPLE)
327
+ })
328
+
329
+ it('simple mode + handwriting but not whole numbers → REGULAR', () => {
330
+ const result = getUIModeWithDefaults({
331
+ user: { grade: 1 },
332
+ problem: {
333
+ answerType: AnswerType.HANDWRITING,
334
+ characterType: MyScriptMathCharacterTypes.NUMBERS,
335
+ hasAnswerVariants: false,
336
+ },
337
+ })
338
+ expect(result.answerArea).toBe(UIMode.REGULAR)
339
+ })
340
+
341
+ it('simple mode + multiple choice even with whole numbers → REGULAR', () => {
342
+ const result = getUIModeWithDefaults({
343
+ user: { grade: 1 },
344
+ problem: {
345
+ answerType: AnswerType.MULTIPLE_CHOICE,
346
+ characterType: MyScriptMathCharacterTypes.NUMBERS_WHOLE,
347
+ hasAnswerVariants: false,
348
+ },
349
+ })
350
+ expect(result.answerArea).toBe(UIMode.REGULAR)
351
+ })
352
+
353
+ it('simple mode + no special conditions → REGULAR', () => {
354
+ const result = getUIModeWithDefaults({
355
+ user: { grade: 1 },
356
+ problem: {
357
+ answerType: AnswerType.SINGLE_CHOICE,
358
+ characterType: MyScriptMathCharacterTypes.DEFAULT,
359
+ hasAnswerVariants: false,
360
+ },
361
+ })
362
+ expect(result.answerArea).toBe(UIMode.REGULAR)
363
+ })
364
+ })
package/src/index.ts CHANGED
@@ -13,4 +13,5 @@ export * from './features/pmProgress'
13
13
  export * from './features/openEnded'
14
14
  export * from './shared/icons'
15
15
  export * from './features/voice'
16
+ export * from './features/featureUsage'
16
17
  export * from './features/uiMode'