@magmamath/students-features 1.3.26-rc.2 → 1.3.26-rc.3
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/commonjs/features/fluency/assets/success.mp3 +0 -0
- package/dist/commonjs/features/fluency/components/fluency-solving/FluencySolvingCard.js +10 -4
- package/dist/commonjs/features/fluency/components/fluency-solving/FluencySolvingCard.js.map +1 -1
- package/dist/commonjs/features/fluency/hooks/useSuccessSound.js +29 -0
- package/dist/commonjs/features/fluency/hooks/useSuccessSound.js.map +1 -0
- package/dist/commonjs/features/fluency/model/FluencyModel.js +3 -0
- package/dist/commonjs/features/fluency/model/FluencyModel.js.map +1 -1
- package/dist/module/features/fluency/assets/success.mp3 +0 -0
- package/dist/module/features/fluency/components/fluency-solving/FluencySolvingCard.js +10 -4
- package/dist/module/features/fluency/components/fluency-solving/FluencySolvingCard.js.map +1 -1
- package/dist/module/features/fluency/hooks/useSuccessSound.js +22 -0
- package/dist/module/features/fluency/hooks/useSuccessSound.js.map +1 -0
- package/dist/module/features/fluency/model/FluencyModel.js +3 -0
- package/dist/module/features/fluency/model/FluencyModel.js.map +1 -1
- package/dist/typescript/commonjs/features/fluency/components/fluency-solving/FluencySolvingCard.d.ts.map +1 -1
- package/dist/typescript/commonjs/features/fluency/hooks/useSuccessSound.d.ts +4 -0
- package/dist/typescript/commonjs/features/fluency/hooks/useSuccessSound.d.ts.map +1 -0
- package/dist/typescript/commonjs/features/fluency/model/FluencyModel.d.ts +1 -0
- package/dist/typescript/commonjs/features/fluency/model/FluencyModel.d.ts.map +1 -1
- package/dist/typescript/module/features/fluency/components/fluency-solving/FluencySolvingCard.d.ts.map +1 -1
- package/dist/typescript/module/features/fluency/hooks/useSuccessSound.d.ts +4 -0
- package/dist/typescript/module/features/fluency/hooks/useSuccessSound.d.ts.map +1 -0
- package/dist/typescript/module/features/fluency/model/FluencyModel.d.ts +1 -0
- package/dist/typescript/module/features/fluency/model/FluencyModel.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/features/fluency/assets/success.mp3 +0 -0
- package/src/features/fluency/components/fluency-solving/FluencySolvingCard.tsx +8 -2
- package/src/features/fluency/hooks/useSuccessSound.ts +21 -0
- package/src/features/fluency/model/FluencyModel.ts +4 -0
|
Binary file
|
|
@@ -11,6 +11,7 @@ var _FluencyEquationCard = require("./FluencyEquationCard.js");
|
|
|
11
11
|
var _reactNativeUi = require("@magmamath/react-native-ui");
|
|
12
12
|
var _FluencyContext = require("../../context/FluencyContext.js");
|
|
13
13
|
var _useCardSnapAnimation = require("../../hooks/useCardSnapAnimation.js");
|
|
14
|
+
var _useSuccessSound = require("../../hooks/useSuccessSound.js");
|
|
14
15
|
var _commonConstants = require("../../../../shared/common.constants.js");
|
|
15
16
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
16
17
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
@@ -20,11 +21,16 @@ const FluencySolvingCard = () => {
|
|
|
20
21
|
model
|
|
21
22
|
} = (0, _FluencyContext.useFluency)();
|
|
22
23
|
const animation = (0, _useCardSnapAnimation.useCardSnapAnimation)();
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
const {
|
|
25
|
+
play: playSuccess
|
|
26
|
+
} = (0, _useSuccessSound.useSuccessSound)();
|
|
27
|
+
const submit = () => {
|
|
28
|
+
const input = model.input.$state.getState();
|
|
29
|
+
const problem = model.solving.$problem.getState();
|
|
30
|
+
const isCorrect = Number(input) === problem.answer;
|
|
31
|
+
if (isCorrect) playSuccess();
|
|
27
32
|
animation.trigger(isCorrect ? 'right' : 'left');
|
|
33
|
+
void model.submitFx();
|
|
28
34
|
};
|
|
29
35
|
(0, _react.useEffect)(() => {
|
|
30
36
|
if (!_commonConstants.isWeb) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_FluencyNumpad","_FluencyEquationCard","_reactNativeUi","_FluencyContext","_useCardSnapAnimation","_commonConstants","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","FluencySolvingCard","model","useFluency","animation","useCardSnapAnimation","submit","isCorrect","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_FluencyNumpad","_FluencyEquationCard","_reactNativeUi","_FluencyContext","_useCardSnapAnimation","_useSuccessSound","_commonConstants","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","FluencySolvingCard","model","useFluency","animation","useCardSnapAnimation","play","playSuccess","useSuccessSound","submit","input","$state","getState","problem","solving","$problem","isCorrect","Number","answer","trigger","submitFx","useEffect","isWeb","handleKeyDown","event","isDigit","test","key","value","erase","window","addEventListener","removeEventListener","jsxs","View","children","jsx","style","styles","wrapper","FluencyEquationCard","animationStyles","snapStyles","FluencyNumpad","onEnterPress","exports","StyleSheet","create","alignItems","paddingVertical","SPACING","paddingHorizontal","marginTop"],"sourceRoot":"../../../../../../src","sources":["features/fluency/components/fluency-solving/FluencySolvingCard.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,oBAAA,GAAAH,OAAA;AACA,IAAAI,cAAA,GAAAJ,OAAA;AACA,IAAAK,eAAA,GAAAL,OAAA;AACA,IAAAM,qBAAA,GAAAN,OAAA;AACA,IAAAO,gBAAA,GAAAP,OAAA;AACA,IAAAQ,gBAAA,GAAAR,OAAA;AAA2D,IAAAS,WAAA,GAAAT,OAAA;AAAA,SAAAU,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAZ,wBAAAY,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAEpD,MAAMW,kBAAkB,GAAGA,CAAA,KAAM;EACtC,MAAM;IAAEC;EAAM,CAAC,GAAG,IAAAC,0BAAU,EAAC,CAAC;EAC9B,MAAMC,SAAS,GAAG,IAAAC,0CAAoB,EAAC,CAAC;EACxC,MAAM;IAAEC,IAAI,EAAEC;EAAY,CAAC,GAAG,IAAAC,gCAAe,EAAC,CAAC;EAE/C,MAAMC,MAAM,GAAGA,CAAA,KAAM;IACnB,MAAMC,KAAK,GAAGR,KAAK,CAACQ,KAAK,CAACC,MAAM,CAACC,QAAQ,CAAC,CAAC;IAC3C,MAAMC,OAAO,GAAGX,KAAK,CAACY,OAAO,CAACC,QAAQ,CAACH,QAAQ,CAAC,CAAC;IACjD,MAAMI,SAAS,GAAGC,MAAM,CAACP,KAAK,CAAC,KAAKG,OAAO,CAACK,MAAM;IAClD,IAAIF,SAAS,EAAET,WAAW,CAAC,CAAC;IAC5BH,SAAS,CAACe,OAAO,CAACH,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,KAAKd,KAAK,CAACkB,QAAQ,CAAC,CAAC;EACvB,CAAC;EAED,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAI,CAACC,sBAAK,EAAE;IAEZ,MAAMC,aAAa,GAAIC,KAAoB,IAAK;MAC9C,MAAMC,OAAO,GAAG,MAAM,CAACC,IAAI,CAACF,KAAK,CAACG,GAAG,CAAC;MACtC,IAAIF,OAAO,EAAE,OAAOvB,KAAK,CAACQ,KAAK,CAACV,GAAG,CAAC;QAAE4B,KAAK,EAAEX,MAAM,CAACO,KAAK,CAACG,GAAG;MAAE,CAAC,CAAC;MACjE,IAAIH,KAAK,CAACG,GAAG,KAAK,WAAW,EAAE,OAAOzB,KAAK,CAACQ,KAAK,CAACV,GAAG,CAAC;QAAE6B,KAAK,EAAE;MAAS,CAAC,CAAC;MAC1E,IAAIL,KAAK,CAACG,GAAG,KAAK,OAAO,EAAE;QACzBlB,MAAM,CAAC,CAAC;QACR;MACF;IACF,CAAC;IAEDqB,MAAM,CAACC,gBAAgB,CAAC,SAAS,EAAER,aAAa,CAAC;IACjD,OAAO,MAAMO,MAAM,CAACE,mBAAmB,CAAC,SAAS,EAAET,aAAa,CAAC;EACnE,CAAC,EAAE,EAAE,CAAC;EAEN,oBACE,IAAA3C,WAAA,CAAAqD,IAAA,EAAC7D,YAAA,CAAA8D,IAAI;IAAAC,QAAA,gBACH,IAAAvD,WAAA,CAAAwD,GAAA,EAAChE,YAAA,CAAA8D,IAAI;MAACG,KAAK,EAAEC,MAAM,CAACC,OAAQ;MAAAJ,QAAA,eAC1B,IAAAvD,WAAA,CAAAwD,GAAA,EAAC9D,oBAAA,CAAAkE,mBAAmB;QAACC,eAAe,EAAErC,SAAS,CAACsC;MAAW,CAAE;IAAC,CAC1D,CAAC,eACP,IAAA9D,WAAA,CAAAwD,GAAA,EAAC/D,cAAA,CAAAsE,aAAa;MAACC,YAAY,EAAEnC;IAAO,CAAE,CAAC;EAAA,CACnC,CAAC;AAEX,CAAC;AAAAoC,OAAA,CAAA5C,kBAAA,GAAAA,kBAAA;AAED,MAAMqC,MAAM,GAAGQ,uBAAU,CAACC,MAAM,CAAC;EAC/BR,OAAO,EAAE;IACPS,UAAU,EAAE,QAAQ;IACpBC,eAAe,EAAEC,sBAAO,CAAC,GAAG,CAAC;IAC7BC,iBAAiB,EAAED,sBAAO,CAAC,GAAG,CAAC;IAC/BE,SAAS,EAAEF,sBAAO,CAAC,GAAG;EACxB;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useSuccessSound = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _expoAudio = require("expo-audio");
|
|
9
|
+
var _success = _interopRequireDefault(require("../assets/success.mp3"));
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
// @ts-ignore
|
|
12
|
+
|
|
13
|
+
const useSuccessSound = () => {
|
|
14
|
+
const playerRef = (0, _react.useRef)(null);
|
|
15
|
+
(0, _react.useEffect)(() => {
|
|
16
|
+
const player = (0, _expoAudio.createAudioPlayer)(_success.default);
|
|
17
|
+
playerRef.current = player;
|
|
18
|
+
return () => player.remove();
|
|
19
|
+
}, []);
|
|
20
|
+
const play = () => {
|
|
21
|
+
playerRef.current?.seekTo(0);
|
|
22
|
+
playerRef.current?.play();
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
play
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
exports.useSuccessSound = useSuccessSound;
|
|
29
|
+
//# sourceMappingURL=useSuccessSound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_expoAudio","_success","_interopRequireDefault","e","__esModule","default","useSuccessSound","playerRef","useRef","useEffect","player","createAudioPlayer","SUCCESS_SOUND","current","remove","play","seekTo","exports"],"sourceRoot":"../../../../../src","sources":["features/fluency/hooks/useSuccessSound.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AAEA,IAAAE,QAAA,GAAAC,sBAAA,CAAAH,OAAA;AAAiD,SAAAG,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AADjD;;AAGO,MAAMG,eAAe,GAAGA,CAAA,KAAM;EACnC,MAAMC,SAAS,GAAG,IAAAC,aAAM,EAAqB,IAAI,CAAC;EAElD,IAAAC,gBAAS,EAAC,MAAM;IACd,MAAMC,MAAM,GAAG,IAAAC,4BAAiB,EAACC,gBAAa,CAAC;IAC/CL,SAAS,CAACM,OAAO,GAAGH,MAAM;IAC1B,OAAO,MAAMA,MAAM,CAACI,MAAM,CAAC,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,IAAI,GAAGA,CAAA,KAAM;IACjBR,SAAS,CAACM,OAAO,EAAEG,MAAM,CAAC,CAAC,CAAC;IAC5BT,SAAS,CAACM,OAAO,EAAEE,IAAI,CAAC,CAAC;EAC3B,CAAC;EAED,OAAO;IAAEA;EAAK,CAAC;AACjB,CAAC;AAAAE,OAAA,CAAAX,eAAA,GAAAA,eAAA","ignoreList":[]}
|
|
@@ -14,6 +14,9 @@ var _FluencyInputModel = require("./FluencyInputModel.js");
|
|
|
14
14
|
class FluencyModel {
|
|
15
15
|
setMode = (0, _effector.createEvent)();
|
|
16
16
|
$mode = (0, _effector.restore)(this.setMode, _fluencyConstants.FluencyMode.ADDITION);
|
|
17
|
+
checkAnswer() {
|
|
18
|
+
return Number(this.input.$state.getState()) === this.solving.$problem.getState().answer;
|
|
19
|
+
}
|
|
17
20
|
constructor({
|
|
18
21
|
api
|
|
19
22
|
}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_effector","require","_fluencyConstants","_FluencyDaysStreakModel","_FluencyMatrixModel","_FluencyApiModel","_FluencySolvingModel","_FluencyInputModel","FluencyModel","setMode","createEvent","$mode","restore","FluencyMode","ADDITION","
|
|
1
|
+
{"version":3,"names":["_effector","require","_fluencyConstants","_FluencyDaysStreakModel","_FluencyMatrixModel","_FluencyApiModel","_FluencySolvingModel","_FluencyInputModel","FluencyModel","setMode","createEvent","$mode","restore","FluencyMode","ADDITION","checkAnswer","Number","input","$state","getState","solving","$problem","answer","constructor","api","FluencyApiModel","streak","FluencyDaysStreakModel","matrix","FluencyMatrixModel","FluencySolvingModel","FluencyInputModel","submitFx","attach","source","problem","effect","isCorrect","sample","clock","done","fn","erase","target","set","exports"],"sourceRoot":"../../../../../src","sources":["features/fluency/model/FluencyModel.ts"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAEA,IAAAC,iBAAA,GAAAD,OAAA;AACA,IAAAE,uBAAA,GAAAF,OAAA;AACA,IAAAG,mBAAA,GAAAH,OAAA;AACA,IAAAI,gBAAA,GAAAJ,OAAA;AACA,IAAAK,oBAAA,GAAAL,OAAA;AACA,IAAAM,kBAAA,GAAAN,OAAA;AAQO,MAAMO,YAAY,CAAC;EAQRC,OAAO,GAAG,IAAAC,qBAAW,EAAc,CAAC;EACpCC,KAAK,GAAG,IAAAC,iBAAO,EAAC,IAAI,CAACH,OAAO,EAAEI,6BAAW,CAACC,QAAQ,CAAC;EAE5DC,WAAWA,CAAA,EAAY;IAC5B,OAAOC,MAAM,CAAC,IAAI,CAACC,KAAK,CAACC,MAAM,CAACC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAACC,OAAO,CAACC,QAAQ,CAACF,QAAQ,CAAC,CAAC,CAACG,MAAM;EACzF;EAEAC,WAAWA,CAAC;IAAEC;EAAuB,CAAC,EAAE;IACtC,IAAI,CAACA,GAAG,GAAG,IAAIC,gCAAe,CAACD,GAAG,CAAC;IACnC,IAAI,CAACE,MAAM,GAAG,IAAIC,8CAAsB,CAAC,CAAC;IAC1C,IAAI,CAACC,MAAM,GAAG,IAAIC,sCAAkB,CAAC,CAAC;IACtC,IAAI,CAACT,OAAO,GAAG,IAAIU,wCAAmB,CAAC,CAAC;IACxC,IAAI,CAACb,KAAK,GAAG,IAAIc,oCAAiB,CAAC,CAAC;IAEpC,IAAI,CAACC,QAAQ,GAAG,IAAAC,gBAAM,EAAC;MACrBC,MAAM,EAAE;QAAEjB,KAAK,EAAE,IAAI,CAACA,KAAK,CAACC,MAAM;QAAEiB,OAAO,EAAE,IAAI,CAACf,OAAO,CAACC;MAAS,CAAC;MACpEe,MAAM,EAAEA,CAAC;QAAEnB,KAAK;QAAEkB;MAAQ,CAAC,MAAM;QAAEE,SAAS,EAAErB,MAAM,CAACC,KAAK,CAAC,KAAKkB,OAAO,CAACb;MAAO,CAAC;IAClF,CAAC,CAAC;IAEF,IAAAgB,gBAAM,EAAC;MACLC,KAAK,EAAE,IAAI,CAACP,QAAQ,CAACQ,IAAI;MACzBC,EAAE,EAAEA,CAAA,MAAO;QAAEC,KAAK,EAAE;MAAe,CAAC,CAAC;MACrCC,MAAM,EAAE,IAAI,CAAC1B,KAAK,CAAC2B;IACrB,CAAC,CAAC;EACJ;AACF;AAACC,OAAA,CAAArC,YAAA,GAAAA,YAAA","ignoreList":[]}
|
|
Binary file
|
|
@@ -7,6 +7,7 @@ import { FluencyEquationCard } from "./FluencyEquationCard.js";
|
|
|
7
7
|
import { SPACING } from '@magmamath/react-native-ui';
|
|
8
8
|
import { useFluency } from "../../context/FluencyContext.js";
|
|
9
9
|
import { useCardSnapAnimation } from "../../hooks/useCardSnapAnimation.js";
|
|
10
|
+
import { useSuccessSound } from "../../hooks/useSuccessSound.js";
|
|
10
11
|
import { isWeb } from "../../../../shared/common.constants.js";
|
|
11
12
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
12
13
|
export const FluencySolvingCard = () => {
|
|
@@ -14,11 +15,16 @@ export const FluencySolvingCard = () => {
|
|
|
14
15
|
model
|
|
15
16
|
} = useFluency();
|
|
16
17
|
const animation = useCardSnapAnimation();
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const {
|
|
19
|
+
play: playSuccess
|
|
20
|
+
} = useSuccessSound();
|
|
21
|
+
const submit = () => {
|
|
22
|
+
const input = model.input.$state.getState();
|
|
23
|
+
const problem = model.solving.$problem.getState();
|
|
24
|
+
const isCorrect = Number(input) === problem.answer;
|
|
25
|
+
if (isCorrect) playSuccess();
|
|
21
26
|
animation.trigger(isCorrect ? 'right' : 'left');
|
|
27
|
+
void model.submitFx();
|
|
22
28
|
};
|
|
23
29
|
useEffect(() => {
|
|
24
30
|
if (!isWeb) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","View","StyleSheet","FluencyNumpad","FluencyEquationCard","SPACING","useFluency","useCardSnapAnimation","isWeb","jsx","_jsx","jsxs","_jsxs","FluencySolvingCard","model","animation","submit","isCorrect","
|
|
1
|
+
{"version":3,"names":["React","useEffect","View","StyleSheet","FluencyNumpad","FluencyEquationCard","SPACING","useFluency","useCardSnapAnimation","useSuccessSound","isWeb","jsx","_jsx","jsxs","_jsxs","FluencySolvingCard","model","animation","play","playSuccess","submit","input","$state","getState","problem","solving","$problem","isCorrect","Number","answer","trigger","submitFx","handleKeyDown","event","isDigit","test","key","set","value","erase","window","addEventListener","removeEventListener","children","style","styles","wrapper","animationStyles","snapStyles","onEnterPress","create","alignItems","paddingVertical","paddingHorizontal","marginTop"],"sourceRoot":"../../../../../../src","sources":["features/fluency/components/fluency-solving/FluencySolvingCard.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AACxC,SAASC,IAAI,EAAEC,UAAU,QAAQ,cAAc;AAC/C,SAASC,aAAa,QAAQ,oBAAiB;AAC/C,SAASC,mBAAmB,QAAQ,0BAAuB;AAC3D,SAASC,OAAO,QAAQ,4BAA4B;AACpD,SAASC,UAAU,QAAQ,iCAA8B;AACzD,SAASC,oBAAoB,QAAQ,qCAAkC;AACvE,SAASC,eAAe,QAAQ,gCAA6B;AAC7D,SAASC,KAAK,QAAQ,wCAAqC;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAE3D,OAAO,MAAMC,kBAAkB,GAAGA,CAAA,KAAM;EACtC,MAAM;IAAEC;EAAM,CAAC,GAAGT,UAAU,CAAC,CAAC;EAC9B,MAAMU,SAAS,GAAGT,oBAAoB,CAAC,CAAC;EACxC,MAAM;IAAEU,IAAI,EAAEC;EAAY,CAAC,GAAGV,eAAe,CAAC,CAAC;EAE/C,MAAMW,MAAM,GAAGA,CAAA,KAAM;IACnB,MAAMC,KAAK,GAAGL,KAAK,CAACK,KAAK,CAACC,MAAM,CAACC,QAAQ,CAAC,CAAC;IAC3C,MAAMC,OAAO,GAAGR,KAAK,CAACS,OAAO,CAACC,QAAQ,CAACH,QAAQ,CAAC,CAAC;IACjD,MAAMI,SAAS,GAAGC,MAAM,CAACP,KAAK,CAAC,KAAKG,OAAO,CAACK,MAAM;IAClD,IAAIF,SAAS,EAAER,WAAW,CAAC,CAAC;IAC5BF,SAAS,CAACa,OAAO,CAACH,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,KAAKX,KAAK,CAACe,QAAQ,CAAC,CAAC;EACvB,CAAC;EAED9B,SAAS,CAAC,MAAM;IACd,IAAI,CAACS,KAAK,EAAE;IAEZ,MAAMsB,aAAa,GAAIC,KAAoB,IAAK;MAC9C,MAAMC,OAAO,GAAG,MAAM,CAACC,IAAI,CAACF,KAAK,CAACG,GAAG,CAAC;MACtC,IAAIF,OAAO,EAAE,OAAOlB,KAAK,CAACK,KAAK,CAACgB,GAAG,CAAC;QAAEC,KAAK,EAAEV,MAAM,CAACK,KAAK,CAACG,GAAG;MAAE,CAAC,CAAC;MACjE,IAAIH,KAAK,CAACG,GAAG,KAAK,WAAW,EAAE,OAAOpB,KAAK,CAACK,KAAK,CAACgB,GAAG,CAAC;QAAEE,KAAK,EAAE;MAAS,CAAC,CAAC;MAC1E,IAAIN,KAAK,CAACG,GAAG,KAAK,OAAO,EAAE;QACzBhB,MAAM,CAAC,CAAC;QACR;MACF;IACF,CAAC;IAEDoB,MAAM,CAACC,gBAAgB,CAAC,SAAS,EAAET,aAAa,CAAC;IACjD,OAAO,MAAMQ,MAAM,CAACE,mBAAmB,CAAC,SAAS,EAAEV,aAAa,CAAC;EACnE,CAAC,EAAE,EAAE,CAAC;EAEN,oBACElB,KAAA,CAACZ,IAAI;IAAAyC,QAAA,gBACH/B,IAAA,CAACV,IAAI;MAAC0C,KAAK,EAAEC,MAAM,CAACC,OAAQ;MAAAH,QAAA,eAC1B/B,IAAA,CAACP,mBAAmB;QAAC0C,eAAe,EAAE9B,SAAS,CAAC+B;MAAW,CAAE;IAAC,CAC1D,CAAC,eACPpC,IAAA,CAACR,aAAa;MAAC6C,YAAY,EAAE7B;IAAO,CAAE,CAAC;EAAA,CACnC,CAAC;AAEX,CAAC;AAED,MAAMyB,MAAM,GAAG1C,UAAU,CAAC+C,MAAM,CAAC;EAC/BJ,OAAO,EAAE;IACPK,UAAU,EAAE,QAAQ;IACpBC,eAAe,EAAE9C,OAAO,CAAC,GAAG,CAAC;IAC7B+C,iBAAiB,EAAE/C,OAAO,CAAC,GAAG,CAAC;IAC/BgD,SAAS,EAAEhD,OAAO,CAAC,GAAG;EACxB;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
import { createAudioPlayer } from 'expo-audio';
|
|
5
|
+
// @ts-ignore
|
|
6
|
+
import SUCCESS_SOUND from '../assets/success.mp3';
|
|
7
|
+
export const useSuccessSound = () => {
|
|
8
|
+
const playerRef = useRef(null);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const player = createAudioPlayer(SUCCESS_SOUND);
|
|
11
|
+
playerRef.current = player;
|
|
12
|
+
return () => player.remove();
|
|
13
|
+
}, []);
|
|
14
|
+
const play = () => {
|
|
15
|
+
playerRef.current?.seekTo(0);
|
|
16
|
+
playerRef.current?.play();
|
|
17
|
+
};
|
|
18
|
+
return {
|
|
19
|
+
play
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=useSuccessSound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","createAudioPlayer","SUCCESS_SOUND","useSuccessSound","playerRef","player","current","remove","play","seekTo"],"sourceRoot":"../../../../../src","sources":["features/fluency/hooks/useSuccessSound.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACzC,SAAsBC,iBAAiB,QAAQ,YAAY;AAC3D;AACA,OAAOC,aAAa,MAAM,uBAAuB;AAEjD,OAAO,MAAMC,eAAe,GAAGA,CAAA,KAAM;EACnC,MAAMC,SAAS,GAAGJ,MAAM,CAAqB,IAAI,CAAC;EAElDD,SAAS,CAAC,MAAM;IACd,MAAMM,MAAM,GAAGJ,iBAAiB,CAACC,aAAa,CAAC;IAC/CE,SAAS,CAACE,OAAO,GAAGD,MAAM;IAC1B,OAAO,MAAMA,MAAM,CAACE,MAAM,CAAC,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,IAAI,GAAGA,CAAA,KAAM;IACjBJ,SAAS,CAACE,OAAO,EAAEG,MAAM,CAAC,CAAC,CAAC;IAC5BL,SAAS,CAACE,OAAO,EAAEE,IAAI,CAAC,CAAC;EAC3B,CAAC;EAED,OAAO;IAAEA;EAAK,CAAC;AACjB,CAAC","ignoreList":[]}
|
|
@@ -10,6 +10,9 @@ import { FluencyInputModel } from "./FluencyInputModel.js";
|
|
|
10
10
|
export class FluencyModel {
|
|
11
11
|
setMode = createEvent();
|
|
12
12
|
$mode = restore(this.setMode, FluencyMode.ADDITION);
|
|
13
|
+
checkAnswer() {
|
|
14
|
+
return Number(this.input.$state.getState()) === this.solving.$problem.getState().answer;
|
|
15
|
+
}
|
|
13
16
|
constructor({
|
|
14
17
|
api
|
|
15
18
|
}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["attach","createEvent","restore","sample","FluencyMode","FluencyDaysStreakModel","FluencyMatrixModel","FluencyApiModel","FluencySolvingModel","FluencyInputModel","FluencyModel","setMode","$mode","ADDITION","
|
|
1
|
+
{"version":3,"names":["attach","createEvent","restore","sample","FluencyMode","FluencyDaysStreakModel","FluencyMatrixModel","FluencyApiModel","FluencySolvingModel","FluencyInputModel","FluencyModel","setMode","$mode","ADDITION","checkAnswer","Number","input","$state","getState","solving","$problem","answer","constructor","api","streak","matrix","submitFx","source","problem","effect","isCorrect","clock","done","fn","erase","target","set"],"sourceRoot":"../../../../../src","sources":["features/fluency/model/FluencyModel.ts"],"mappings":";;AAAA,SAASA,MAAM,EAAEC,WAAW,EAAEC,OAAO,EAAEC,MAAM,QAAQ,UAAU;AAE/D,SAASC,WAAW,QAAQ,yBAAsB;AAClD,SAASC,sBAAsB,QAAQ,6BAA0B;AACjE,SAASC,kBAAkB,QAAQ,yBAAsB;AACzD,SAASC,eAAe,QAAQ,sBAAmB;AACnD,SAASC,mBAAmB,QAAQ,0BAAuB;AAC3D,SAASC,iBAAiB,QAAQ,wBAAqB;AAQvD,OAAO,MAAMC,YAAY,CAAC;EAQRC,OAAO,GAAGV,WAAW,CAAc,CAAC;EACpCW,KAAK,GAAGV,OAAO,CAAC,IAAI,CAACS,OAAO,EAAEP,WAAW,CAACS,QAAQ,CAAC;EAE5DC,WAAWA,CAAA,EAAY;IAC5B,OAAOC,MAAM,CAAC,IAAI,CAACC,KAAK,CAACC,MAAM,CAACC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAACC,OAAO,CAACC,QAAQ,CAACF,QAAQ,CAAC,CAAC,CAACG,MAAM;EACzF;EAEAC,WAAWA,CAAC;IAAEC;EAAuB,CAAC,EAAE;IACtC,IAAI,CAACA,GAAG,GAAG,IAAIhB,eAAe,CAACgB,GAAG,CAAC;IACnC,IAAI,CAACC,MAAM,GAAG,IAAInB,sBAAsB,CAAC,CAAC;IAC1C,IAAI,CAACoB,MAAM,GAAG,IAAInB,kBAAkB,CAAC,CAAC;IACtC,IAAI,CAACa,OAAO,GAAG,IAAIX,mBAAmB,CAAC,CAAC;IACxC,IAAI,CAACQ,KAAK,GAAG,IAAIP,iBAAiB,CAAC,CAAC;IAEpC,IAAI,CAACiB,QAAQ,GAAG1B,MAAM,CAAC;MACrB2B,MAAM,EAAE;QAAEX,KAAK,EAAE,IAAI,CAACA,KAAK,CAACC,MAAM;QAAEW,OAAO,EAAE,IAAI,CAACT,OAAO,CAACC;MAAS,CAAC;MACpES,MAAM,EAAEA,CAAC;QAAEb,KAAK;QAAEY;MAAQ,CAAC,MAAM;QAAEE,SAAS,EAAEf,MAAM,CAACC,KAAK,CAAC,KAAKY,OAAO,CAACP;MAAO,CAAC;IAClF,CAAC,CAAC;IAEFlB,MAAM,CAAC;MACL4B,KAAK,EAAE,IAAI,CAACL,QAAQ,CAACM,IAAI;MACzBC,EAAE,EAAEA,CAAA,MAAO;QAAEC,KAAK,EAAE;MAAe,CAAC,CAAC;MACrCC,MAAM,EAAE,IAAI,CAACnB,KAAK,CAACoB;IACrB,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FluencySolvingCard.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/fluency/components/fluency-solving/FluencySolvingCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"FluencySolvingCard.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/fluency/components/fluency-solving/FluencySolvingCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAUxC,eAAO,MAAM,kBAAkB,yBAuC9B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSuccessSound.d.ts","sourceRoot":"","sources":["../../../../../../src/features/fluency/hooks/useSuccessSound.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe;;CAe3B,CAAA"}
|
|
@@ -20,6 +20,7 @@ export declare class FluencyModel {
|
|
|
20
20
|
readonly submitFx: Effect<void, SubmitResult, Error>;
|
|
21
21
|
readonly setMode: import("effector").EventCallable<FluencyMode>;
|
|
22
22
|
readonly $mode: import("effector").StoreWritable<FluencyMode>;
|
|
23
|
+
checkAnswer(): boolean;
|
|
23
24
|
constructor({ api }: FluencyModelProps);
|
|
24
25
|
}
|
|
25
26
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FluencyModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/fluency/model/FluencyModel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,KAAK,YAAY,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAA;AAE1C,KAAK,iBAAiB,GAAG;IACvB,GAAG,EAAE,EAAE,CAAA;CACR,CAAA;AAED,qBAAa,YAAY;IACvB,SAAgB,GAAG,EAAE,eAAe,CAAA;IACpC,SAAgB,MAAM,EAAE,sBAAsB,CAAA;IAC9C,SAAgB,MAAM,EAAE,kBAAkB,CAAA;IAC1C,SAAgB,OAAO,EAAE,mBAAmB,CAAA;IAC5C,SAAgB,KAAK,EAAE,iBAAiB,CAAA;IACxC,SAAgB,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAA;IAE3D,SAAgB,OAAO,gDAA6B;IACpD,SAAgB,KAAK,gDAA8C;
|
|
1
|
+
{"version":3,"file":"FluencyModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/fluency/model/FluencyModel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,KAAK,YAAY,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAA;AAE1C,KAAK,iBAAiB,GAAG;IACvB,GAAG,EAAE,EAAE,CAAA;CACR,CAAA;AAED,qBAAa,YAAY;IACvB,SAAgB,GAAG,EAAE,eAAe,CAAA;IACpC,SAAgB,MAAM,EAAE,sBAAsB,CAAA;IAC9C,SAAgB,MAAM,EAAE,kBAAkB,CAAA;IAC1C,SAAgB,OAAO,EAAE,mBAAmB,CAAA;IAC5C,SAAgB,KAAK,EAAE,iBAAiB,CAAA;IACxC,SAAgB,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAA;IAE3D,SAAgB,OAAO,gDAA6B;IACpD,SAAgB,KAAK,gDAA8C;IAE5D,WAAW,IAAI,OAAO;gBAIjB,EAAE,GAAG,EAAE,EAAE,iBAAiB;CAkBvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FluencySolvingCard.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/fluency/components/fluency-solving/FluencySolvingCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"FluencySolvingCard.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/fluency/components/fluency-solving/FluencySolvingCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAUxC,eAAO,MAAM,kBAAkB,yBAuC9B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSuccessSound.d.ts","sourceRoot":"","sources":["../../../../../../src/features/fluency/hooks/useSuccessSound.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe;;CAe3B,CAAA"}
|
|
@@ -20,6 +20,7 @@ export declare class FluencyModel {
|
|
|
20
20
|
readonly submitFx: Effect<void, SubmitResult, Error>;
|
|
21
21
|
readonly setMode: import("effector").EventCallable<FluencyMode>;
|
|
22
22
|
readonly $mode: import("effector").StoreWritable<FluencyMode>;
|
|
23
|
+
checkAnswer(): boolean;
|
|
23
24
|
constructor({ api }: FluencyModelProps);
|
|
24
25
|
}
|
|
25
26
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FluencyModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/fluency/model/FluencyModel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,KAAK,YAAY,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAA;AAE1C,KAAK,iBAAiB,GAAG;IACvB,GAAG,EAAE,EAAE,CAAA;CACR,CAAA;AAED,qBAAa,YAAY;IACvB,SAAgB,GAAG,EAAE,eAAe,CAAA;IACpC,SAAgB,MAAM,EAAE,sBAAsB,CAAA;IAC9C,SAAgB,MAAM,EAAE,kBAAkB,CAAA;IAC1C,SAAgB,OAAO,EAAE,mBAAmB,CAAA;IAC5C,SAAgB,KAAK,EAAE,iBAAiB,CAAA;IACxC,SAAgB,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAA;IAE3D,SAAgB,OAAO,gDAA6B;IACpD,SAAgB,KAAK,gDAA8C;
|
|
1
|
+
{"version":3,"file":"FluencyModel.d.ts","sourceRoot":"","sources":["../../../../../../src/features/fluency/model/FluencyModel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,KAAK,YAAY,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAA;AAE1C,KAAK,iBAAiB,GAAG;IACvB,GAAG,EAAE,EAAE,CAAA;CACR,CAAA;AAED,qBAAa,YAAY;IACvB,SAAgB,GAAG,EAAE,eAAe,CAAA;IACpC,SAAgB,MAAM,EAAE,sBAAsB,CAAA;IAC9C,SAAgB,MAAM,EAAE,kBAAkB,CAAA;IAC1C,SAAgB,OAAO,EAAE,mBAAmB,CAAA;IAC5C,SAAgB,KAAK,EAAE,iBAAiB,CAAA;IACxC,SAAgB,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,CAAA;IAE3D,SAAgB,OAAO,gDAA6B;IACpD,SAAgB,KAAK,gDAA8C;IAE5D,WAAW,IAAI,OAAO;gBAIjB,EAAE,GAAG,EAAE,EAAE,iBAAiB;CAkBvC"}
|
package/package.json
CHANGED
|
Binary file
|
|
@@ -5,15 +5,21 @@ import { FluencyEquationCard } from './FluencyEquationCard'
|
|
|
5
5
|
import { SPACING } from '@magmamath/react-native-ui'
|
|
6
6
|
import { useFluency } from '../../context/FluencyContext'
|
|
7
7
|
import { useCardSnapAnimation } from '../../hooks/useCardSnapAnimation'
|
|
8
|
+
import { useSuccessSound } from '../../hooks/useSuccessSound'
|
|
8
9
|
import { isWeb } from '../../../../shared/common.constants'
|
|
9
10
|
|
|
10
11
|
export const FluencySolvingCard = () => {
|
|
11
12
|
const { model } = useFluency()
|
|
12
13
|
const animation = useCardSnapAnimation()
|
|
14
|
+
const { play: playSuccess } = useSuccessSound()
|
|
13
15
|
|
|
14
|
-
const submit =
|
|
15
|
-
const
|
|
16
|
+
const submit = () => {
|
|
17
|
+
const input = model.input.$state.getState()
|
|
18
|
+
const problem = model.solving.$problem.getState()
|
|
19
|
+
const isCorrect = Number(input) === problem.answer
|
|
20
|
+
if (isCorrect) playSuccess()
|
|
16
21
|
animation.trigger(isCorrect ? 'right' : 'left')
|
|
22
|
+
void model.submitFx()
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
useEffect(() => {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react'
|
|
2
|
+
import { AudioPlayer, createAudioPlayer } from 'expo-audio'
|
|
3
|
+
// @ts-ignore
|
|
4
|
+
import SUCCESS_SOUND from '../assets/success.mp3'
|
|
5
|
+
|
|
6
|
+
export const useSuccessSound = () => {
|
|
7
|
+
const playerRef = useRef<AudioPlayer | null>(null)
|
|
8
|
+
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const player = createAudioPlayer(SUCCESS_SOUND)
|
|
11
|
+
playerRef.current = player
|
|
12
|
+
return () => player.remove()
|
|
13
|
+
}, [])
|
|
14
|
+
|
|
15
|
+
const play = () => {
|
|
16
|
+
playerRef.current?.seekTo(0)
|
|
17
|
+
playerRef.current?.play()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return { play }
|
|
21
|
+
}
|
|
@@ -24,6 +24,10 @@ export class FluencyModel {
|
|
|
24
24
|
public readonly setMode = createEvent<FluencyMode>()
|
|
25
25
|
public readonly $mode = restore(this.setMode, FluencyMode.ADDITION)
|
|
26
26
|
|
|
27
|
+
public checkAnswer(): boolean {
|
|
28
|
+
return Number(this.input.$state.getState()) === this.solving.$problem.getState().answer
|
|
29
|
+
}
|
|
30
|
+
|
|
27
31
|
constructor({ api }: FluencyModelProps) {
|
|
28
32
|
this.api = new FluencyApiModel(api)
|
|
29
33
|
this.streak = new FluencyDaysStreakModel()
|