testforce-engine 0.0.3-alpha → 0.0.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/index.d.mts CHANGED
@@ -21,6 +21,10 @@ declare enum TestStatus {
21
21
  NOT_STARTED = "NotStarted",
22
22
  ENDED = "Ended"
23
23
  }
24
+ declare enum ProctoringType {
25
+ BASIC = "basic",
26
+ AI = "ai"
27
+ }
24
28
  interface Test {
25
29
  name: string;
26
30
  type: TestType;
@@ -46,6 +50,8 @@ interface Test {
46
50
  status: TestStatus;
47
51
  lastVisitedQuestionId: string;
48
52
  timeTaken: Record<string, any>;
53
+ publishedAt: Date;
54
+ proctoring: ProctoringType;
49
55
  }
50
56
  interface Section {
51
57
  name: string;
@@ -74,6 +80,7 @@ interface Question {
74
80
  displayOrder: number;
75
81
  duration: number;
76
82
  questionResponse: SolutionDetails$1;
83
+ imageUrl: string;
77
84
  }
78
85
  interface SolutionDetails$1 {
79
86
  markedSolution?: string[];
@@ -172,7 +179,7 @@ declare const useTestSolutionBody: () => {
172
179
  currentQuestionStatus: QuestionStatusType;
173
180
  };
174
181
 
175
- declare const useTestTimer: () => {
182
+ declare const useTestTimer: (type: "web" | "app") => {
176
183
  timer: number;
177
184
  };
178
185
 
package/dist/index.d.ts CHANGED
@@ -21,6 +21,10 @@ declare enum TestStatus {
21
21
  NOT_STARTED = "NotStarted",
22
22
  ENDED = "Ended"
23
23
  }
24
+ declare enum ProctoringType {
25
+ BASIC = "basic",
26
+ AI = "ai"
27
+ }
24
28
  interface Test {
25
29
  name: string;
26
30
  type: TestType;
@@ -46,6 +50,8 @@ interface Test {
46
50
  status: TestStatus;
47
51
  lastVisitedQuestionId: string;
48
52
  timeTaken: Record<string, any>;
53
+ publishedAt: Date;
54
+ proctoring: ProctoringType;
49
55
  }
50
56
  interface Section {
51
57
  name: string;
@@ -74,6 +80,7 @@ interface Question {
74
80
  displayOrder: number;
75
81
  duration: number;
76
82
  questionResponse: SolutionDetails$1;
83
+ imageUrl: string;
77
84
  }
78
85
  interface SolutionDetails$1 {
79
86
  markedSolution?: string[];
@@ -172,7 +179,7 @@ declare const useTestSolutionBody: () => {
172
179
  currentQuestionStatus: QuestionStatusType;
173
180
  };
174
181
 
175
- declare const useTestTimer: () => {
182
+ declare const useTestTimer: (type: "web" | "app") => {
176
183
  timer: number;
177
184
  };
178
185
 
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var ne=Object.create;var L=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty;var ue=(n,e)=>{for(var t in e)L(n,t,{get:e[t],enumerable:!0})},G=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of re(e))!oe.call(n,s)&&s!==t&&L(n,s,{get:()=>e[s],enumerable:!(r=se(e,s))||r.enumerable});return n};var k=(n,e,t)=>(t=n!=null?ne(ie(n)):{},G(e||!n||!n.__esModule?L(t,"default",{value:n,enumerable:!0}):t,n)),ae=n=>G(L({},"__esModule",{value:!0}),n);var Ae={};ue(Ae,{AttemptStatus:()=>w,TestEngineProvider:()=>z,useQuestionStopWatch:()=>te,useTestEngine:()=>D,useTestEngineBody:()=>$,useTestEngineFooter:()=>j,useTestQuestionStatus:()=>Q,useTestSolutionBody:()=>X,useTestTimer:()=>ee});module.exports=ae(Ae);var Z=require("react");var B=k(require("react")),w=(i=>(i.ATTEMPTED="ATTEMPTED",i.NOT_ATTEMPTED="NOT_ATTEMPTED",i.NOT_VISITED="NOT_VISITED",i.MARKED_FOR_REVIEW="MARKED_FOR_REVIEW",i.ATTEMPTED_AND_MARKED_FOR_REVIEW="ATTEMPTED_AND_MARKED_FOR_REVIEW",i.ACITVE_QUESTION="ACITVE_QUESTION",i))(w||{});var q={test:void 0,solutions:{},currentQuestionIndex:0,currentSectionIndex:0,currentQuestionAnswer:{},userSettings:{},isSolution:!1,submitting:!1},C=B.default.createContext([q,()=>{},()=>{}]);C.displayName="TestEngineContext";var K=(n,e)=>{switch(e.type){case"UPDATE_TEST":return{...n,test:e.value};case"UPDATE_SOLUTIONS":return{...n,solutions:e.value};case"UPDATE_CURRENT_ANSWER":return{...n,currentQuestionAnswer:e.value};case"UPDATE_USER_SETTINGS":return{...n,userSettings:e.value};case"UPDATE_TEST_SUBMITTING":return{...n,submitting:e.value};case"UPDATE_QUESTION_COORDINATES":return{...n,currentSectionIndex:e.value.currentSectionIndex,currentQuestionIndex:e.value.currentQuestionIndex}}};var y=k(require("react"));var J=require("react-native-mmkv"),ce=()=>{if(!(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof window<"u"&&window.localStorage)return{getItem:e=>localStorage.getItem(e)?JSON.parse(localStorage.getItem(e)):null,setItem:(e,t)=>localStorage.setItem(e,JSON.stringify(t)),removeItem:e=>localStorage.removeItem(e)};{let e=new J.MMKV({id:"testforce-engine"});return{getItem:t=>{try{let r=e.getString(t);return r?JSON.parse(r):null}catch(r){return console.log(r),null}},setItem:(t,r)=>{try{e.set(t,JSON.stringify(r))}catch(s){console.log(s)}},removeItem:t=>{try{e.delete(t)}catch(r){console.log(r)}}}}},l=ce();var de=({test:n,submitTest:e,...t})=>{let[r,s]=y.default.useState(!1),[u,i]=y.default.useReducer(K,{...q,test:n,isSolution:t.isSolution}),c=async()=>{let T=await l.getItem(`${n?._id}-test-initiated`),_=await l.getItem(`${n._id}-solutions`)||{};i(T?{type:"UPDATE_SOLUTIONS",value:_}:{type:"UPDATE_SOLUTIONS",value:n?.sections?.reduce((o,S)=>(S.questions?.forEach(a=>{a.questionResponse&&(o[a._id]={...a.questionResponse})}),o),{})||{}});let d=await l.getItem(`${n._id}-currentSectionIndex`)||0,E=await l.getItem(`${n._id}-currentQuestionIndex`)||0;i({type:"UPDATE_QUESTION_COORDINATES",value:{currentSectionIndex:d,currentQuestionIndex:E}}),s(!0)};return(0,Z.useEffect)(()=>{c()},[]),r?y.default.createElement(C.Provider,{value:[u,i,e],...t}):y.default.createElement(y.default.Fragment,null)},z=de;var A=k(require("react"));var me=()=>{let n=A.default.useContext(C);if(n===void 0)throw new Error("useTestEngine must be use within TestEngineProvider");let[e,t,r]=n,s=A.default.useMemo(()=>e.test?.sections[e.currentSectionIndex],[e.currentSectionIndex]),u=A.default.useMemo(()=>s?.questions[e.currentQuestionIndex],[e.currentQuestionIndex,s]);A.default.useEffect(()=>{u&&(e.solutions[u._id]?c({...e.solutions[u._id],isSaved:!0}):(e.isSolution||o({...e.solutions,[u._id]:{}}),c({}))),l.setItem(`${e.test?._id}-currentSectionIndex`,e.currentSectionIndex),l.setItem(`${e.test?._id}-currentQuestionIndex`,e.currentQuestionIndex)},[e.currentSectionIndex,e.currentQuestionIndex]);let i=A.default.useCallback(m=>t({type:"UPDATE_TEST",value:m}),[t]),c=A.default.useCallback(m=>t({type:"UPDATE_CURRENT_ANSWER",value:m}),[t]),T=A.default.useCallback(async m=>(await _(),t({type:"UPDATE_QUESTION_COORDINATES",value:m})),[t]),_=async()=>{let m=await l.getItem(`${e?.test?._id}-timers`)||{};e.test?.sections.forEach(U=>{U.questions?.forEach(R=>{m[R._id]&&!e.solutions[R._id]&&(e.solutions[R._id]={}),e.solutions[R._id]&&(e.solutions[R._id].timeTaken=m[R._id])})})},d=A.default.useCallback(m=>t({type:"UPDATE_USER_SETTINGS",value:m}),[t]),E=A.default.useCallback(m=>t({type:"UPDATE_TEST_SUBMITTING",value:m}),[t]);A.default.useEffect(()=>{e.isSolution||l.setItem(`${e.test?._id}-solutions`,e.solutions)},[e.solutions]);let o=A.default.useCallback(m=>t({type:"UPDATE_SOLUTIONS",value:m}),[t]),S=A.default.useCallback(async()=>{if(!await l.getItem(`${e.test?._id}-test-initiated`)&&e.test?.status==="Paused"){let U=await l.getItem(`${e?.test?._id}-timers`)||{},R={};e.test?.sections?.forEach((p,g)=>{p.questions?.forEach((I,v)=>{I._id===e.test?.lastVisitedQuestionId&&T({currentSectionIndex:g,currentQuestionIndex:v}),I.questionResponse&&(R[I._id]=JSON.stringify(I.questionResponse.timeTaken||0))})}),l.setItem(`${e?.test?._id}-timers`,{...U,...R})}e?.isSolution||l.setItem(`${e.test?._id}-test-initiated`,"true")},[]);A.default.useEffect(()=>{S()},[]);let a=async()=>{await l.removeItem(`${e.test?._id}-currentQuestionIndex`),await l.removeItem(`${e.test?._id}-currentSectionIndex`),await l.removeItem(`${e.test?._id}-solutions`),await l.removeItem(`${e.test?._id}-test-initiated`),await l.removeItem(`${e?.test?._id}-timers`)},f=A.default.useCallback(async(m=!1,U=!1)=>{E(!0);let R=await l.getItem(`${e.test?._id}-solutions`)||{},p=await l.getItem(`${e?.test?._id}-timers`)||{},g=[];e.test?.sections.forEach(v=>{v.questions.forEach(P=>{let F={questionId:P._id};R[P._id]&&(F.markedSolution=R[P._id].markedSolution||[],F.timeTaken=parseInt(p[P._id]||0),F.markedForReview=R[P._id].markedForReview||!1,g.push(F))})});let I={submittedBy:U?"autoSubmit":"user",questionResponses:g,testMappingId:e.test?.testMappingId,type:m?"Pause":"Submit",testId:e.test?._id};return m&&(I.lastVisitedQuestionId=u?._id),e.test?.timerLevel==="TEST"&&e.test.type==="TEST"&&m&&p[e?.test?._id]&&(I.timeTaken={[e.test?._id]:p[e?.test?._id]}),g.length||delete I.questionResponses,await a(),E(!1),r({payload:I,pause:m,autoSubmit:U}),I},[u]);return A.default.useMemo(()=>({...e,currentSection:s,currentQuestion:u,handleSubmitTest:f,handleUpdateTestDetails:i,handleUpdateQuestionCoordinates:T,handleUpdateSolutions:o,handleUpdateCurrentAnswer:c,handleUpdateUserSettings:d,handleResetLocal:a}),[e,s,u,f,i,T,o,c,d,a])},D=me;var N=k(require("react"));var Ee=()=>{let{currentQuestion:n,currentQuestionAnswer:e,test:t,solutions:r,isSolution:s,handleUpdateCurrentAnswer:u,handleUpdateSolutions:i}=D(),c=N.default.useMemo(()=>t?.type==="QUIZ"&&!!r[n?._id]?.markedSolution?.length,[t,r,n]),T=(0,N.useCallback)(()=>{u({...e,markedSolution:[],isSaved:!1}),i({...r,[n?._id]:{...e,markedSolution:[]}})},[e,n,r,u,i]),_=(0,N.useCallback)(o=>{if(!(s||c))if(e?.markedSolution?.includes(o)){let S=e.markedSolution.filter(a=>a!==o);return S?.length===0?T():u({...e,markedSolution:S,isSaved:!1})}else{if(n?.type==="SINGLE")return u({...e,markedSolution:[o],isSaved:!1});{let S=e?.markedSolution?.length?e?.markedSolution:[];return u({...e,markedSolution:[...S,o],isSaved:!1})}}},[s,c,n,e,u,T]),d=(0,N.useCallback)(o=>{s||c||(u({...e,markedSolution:o?[o]:[],isSaved:!1}),o||T())},[s,c,u,e,T]),E=(0,N.useCallback)(()=>{u({...e,markedForReview:!e?.markedForReview}),i({...r,[n._id]:{...r[n._id],markedForReview:!e?.markedForReview}})},[u,i,e,r,n]);return{isQuizAnswer:c,handleClearResponse:T,handleSelectOption:_,handleIntegerInputChange:d,handleMarkForReview:E}},$=Ee;var O=require("react");var W=k(require("react"));var fe=({includeAllSections:n}={})=>{let{currentQuestionIndex:e,solutions:t,currentSectionIndex:r,test:s,isSolution:u}=D(),[i,c]=W.default.useState({MARKED_FOR_REVIEW:{count:0},ATTEMPTED:{count:0},ATTEMPTED_AND_MARKED_FOR_REVIEW:{count:0},NOT_ATTEMPTED:{count:0},NOT_VISITED:{count:0},ACITVE_QUESTION:{count:0}}),T=()=>{let o={...i};Object.values(o).forEach(S=>S.count=0),n?s?.sections?.forEach((S,a)=>{S?.questions?.forEach((f,b)=>{let m=u||s.type==="QUIZ"?E(b,a):_(b,a);o[m].count+=1})}):s?.sections[r]?.questions.forEach((S,a)=>{let f=u||s.type==="QUIZ"?E(a,r):_(a,r);o[f].count+=1}),c(o)};W.default.useEffect(()=>{T()},[e,t,r]);let _=(o,S)=>{let a=s?.sections[S]?.questions[o],f;return t[a?._id]&&t[a?._id].markedSolution?.length&&t[a?._id].markedForReview?f="ATTEMPTED_AND_MARKED_FOR_REVIEW":t[a?._id]&&t[a?._id].markedForReview?f="MARKED_FOR_REVIEW":t[a?._id]&&t[a?._id].markedSolution?.length?f="ATTEMPTED":t[a?._id]?f="NOT_ATTEMPTED":f="NOT_VISITED",f};function d(o,S){let a=o.slice().sort(),f=S.slice().sort();if(a.length!==f.length)return!1;for(let b=0;b<a.length;b++)if(a[b]!==f[b])return!1;return!0}let E=(o,S)=>{let a=s?.sections[S]?.questions[o],f;return t[a?._id]&&t[a?._id].markedSolution?.length?d(t[a?._id].markedSolution,a.solution)?f="ATTEMPTED":f="NOT_ATTEMPTED":f="NOT_VISITED",f};return{getQuestionStatus:_,questionStatusMap:i,getAnsweredQuestionStatus:E,areArraysEqual:d}},Q=fe;var Ie=()=>{let{handleUpdateQuestionCoordinates:n,currentQuestionIndex:e,currentSectionIndex:t,currentSection:r,currentQuestionAnswer:s,handleUpdateSolutions:u,solutions:i,currentQuestion:c,handleUpdateCurrentAnswer:T,test:_,userSettings:d}=D(),{getAnsweredQuestionStatus:E}=Q(),[o,S]=(0,O.useState)([]);(0,O.useEffect)(()=>{if(d?.selectedFilter){let p=r?.questions?.map((g,I)=>{if(d?.selectedFilter===E(I,t))return I})?.filter(g=>g!==void 0);S(p),p?.length&&n({currentSectionIndex:t,currentQuestionIndex:p[0]||0})}else S([])},[d?.selectedFilter,r]);let a=()=>{s?.isSaved||(delete s?.isSaved,u({...i,[c?._id]:{...s}}))},f=()=>{if(d?.selectedFilter){let I=o?.findIndex(v=>v===e);I>=0&&o[I+1]>=0&&n({currentSectionIndex:t,currentQuestionIndex:o[I+1]});return}let p=r?.questions[e+1]?t:_?.sections[t+1]?t+1:t,g=r?.questions[e+1]?e+1:0;n({currentSectionIndex:p,currentQuestionIndex:g})},b=()=>{if(d?.selectedFilter){let I=o?.findIndex(v=>v===e);I>=0&&o[I-1]>=0&&n({currentSectionIndex:t,currentQuestionIndex:o[I-1]});return}let p=r?.questions[e-1]?t:_?.sections[t-1]?t-1:t,g=r?.questions[e-1]?e-1:_.sections[p]?.questions?.length-1;n({currentSectionIndex:p,currentQuestionIndex:g})},m=(0,O.useMemo)(()=>{if(d?.selectedFilter){let p=o?.findIndex(g=>g===e);return!o[p+1]}return!_?.sections[t+1]&&!r?.questions[e+1]},[t,e,o,d?.selectedFilter]),U=(0,O.useMemo)(()=>d?.selectedFilter?o?.findIndex(g=>g===e)<=0:t===0&&e===0,[t,e,o,d?.selectedFilter]);return{handleNext:f,handlePrevious:b,handleSaveAnswer:a,handleMarkForReview:()=>{T({...s,markedForReview:!s?.markedForReview}),u({...i,[c._id]:{...i[c._id],markedForReview:!s?.markedForReview}})},isLastQuestion:m,isFirstQuestion:U}},j=Ie;var V=k(require("react"));var H={1:{label:"A"},2:{label:"B"},3:{label:"C"},4:{label:"D"}},_e=()=>{let{currentQuestionIndex:n,test:e,currentSection:t,currentSectionIndex:r,currentQuestion:s}=D(),{getAnsweredQuestionStatus:u}=Q(),i=V.default.useMemo(()=>u(n,r)==="ATTEMPTED"?"correct":u(n,r)==="NOT_ATTEMPTED"?"incorrect":"skipped",[n,r]),c=V.default.useMemo(()=>{switch(i){case"correct":return e?.marksLevel==="TEST"?"+"+e.positiveMarks:"+"+t?.positiveMarks;case"incorrect":return e?.marksLevel==="TEST"?e.isNegativeMarkingEnabled?"-"+e.negativeMarks:0:t?.isNegativeMarkingEnabled?"-"+t?.negativeMarks:0;case"skipped":return 0}},[i,r,n]);return{correctAnswer:V.default.useMemo(()=>{if(!s)return"";if(s.type==="INTEGER")return s.solution[0];if(s.type==="SINGLE"){let _=s.options.findIndex(d=>d._id===s.solution[0]);return H[_+1]?.label||""}return s.type==="MULTIPLE"?s.solution.map(d=>{let E=s.options.findIndex(o=>o._id===d);return H[E+1]?.label||""}).join(", "):""},[s]),currentAnswerMarks:c,currentQuestionStatus:i}},X=_e;var M=k(require("react"));var pe=()=>{let{test:n,handleSubmitTest:e}=D(),t=M.default.useRef(null),[r,s]=M.default.useState(n?.timeTaken?.[n?._id]??n?.duration??0),u=M.default.useCallback(async c=>{t.current&&clearTimeout(t.current);let T=await l.getItem(`${n?._id}-timers`);if(c<=0){e(!1,!0);return}T[n._id]=c+"",l.setItem(`${n?._id}-timers`,T),s(c),t.current=setTimeout(()=>{u(c-1)},1e3)},[n,e]),i=M.default.useCallback(async()=>{if(!n?._id)return;let c=await l.getItem(`${n._id}-timers`);c||(await l.setItem(`${n._id}-timers`,{}),c={});let T=parseInt(c?.[n._id]||n?.timeTaken?.[n._id]||n?.duration||0);u(T)},[n,u]);return M.default.useEffect(()=>(i(),()=>{t.current&&clearTimeout(t.current)}),[i,n?._id]),{timer:r}},ee=pe;var h=k(require("react"));var ge=n=>{let e=n==="app"?950:1e3,{currentQuestion:t,solutions:r,test:s}=D(),{isQuizAnswer:u}=$(),i=h.default.useRef(null),[c,T]=h.default.useState(0),_=async E=>{if(!t)return;let o=await l.getItem(`${s?._id}-timers`);if((r[t?._id]?.markedSolution||[])?.length===0)o[t?._id]=E+"",l.setItem(`${s?._id}-timers`,o),T(E);else{clearTimeout(i.current);return}i.current=setTimeout(()=>{_(E+1)},e)},d=async()=>{i.current&&(clearTimeout(i.current),i.current=null);let E=await l.getItem(`${s?._id}-timers`);E||(await l.setItem(`${s?._id}-timers`,{}),E={});let o=parseInt(E?.[t?._id]||s?.timeTaken?.[t?._id]||0);T(o),_(o)};return h.default.useEffect(()=>(t?._id&&d(),()=>{i.current&&(clearTimeout(i.current),i.current=null)}),[t]),h.default.useEffect(()=>{i.current===null&&setTimeout(()=>{i.current===null&&d()},e)},[r]),h.default.useEffect(()=>{u&&(clearTimeout(i.current),i.current=null)},[u]),{questionStopWatch:c}},te=ge;0&&(module.exports={AttemptStatus,TestEngineProvider,useQuestionStopWatch,useTestEngine,useTestEngineBody,useTestEngineFooter,useTestQuestionStatus,useTestSolutionBody,useTestTimer});
1
+ "use strict";var ne=Object.create;var F=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty;var ue=(n,e)=>{for(var t in e)F(n,t,{get:e[t],enumerable:!0})},B=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of re(e))!oe.call(n,s)&&s!==t&&F(n,s,{get:()=>e[s],enumerable:!(o=se(e,s))||o.enumerable});return n};var U=(n,e,t)=>(t=n!=null?ne(ie(n)):{},B(e||!n||!n.__esModule?F(t,"default",{value:n,enumerable:!0}):t,n)),ae=n=>B(F({},"__esModule",{value:!0}),n);var Ae={};ue(Ae,{AttemptStatus:()=>w,TestEngineProvider:()=>z,useQuestionStopWatch:()=>te,useTestEngine:()=>D,useTestEngineBody:()=>$,useTestEngineFooter:()=>j,useTestQuestionStatus:()=>Q,useTestSolutionBody:()=>X,useTestTimer:()=>ee});module.exports=ae(Ae);var Z=require("react");var K=U(require("react")),w=(r=>(r.ATTEMPTED="ATTEMPTED",r.NOT_ATTEMPTED="NOT_ATTEMPTED",r.NOT_VISITED="NOT_VISITED",r.MARKED_FOR_REVIEW="MARKED_FOR_REVIEW",r.ATTEMPTED_AND_MARKED_FOR_REVIEW="ATTEMPTED_AND_MARKED_FOR_REVIEW",r.ACITVE_QUESTION="ACITVE_QUESTION",r))(w||{});var W={test:void 0,solutions:{},currentQuestionIndex:0,currentSectionIndex:0,currentQuestionAnswer:{},userSettings:{},isSolution:!1,submitting:!1},P=K.default.createContext([W,()=>{},()=>{}]);P.displayName="TestEngineContext";var J=(n,e)=>{switch(e.type){case"UPDATE_TEST":return{...n,test:e.value};case"UPDATE_SOLUTIONS":return{...n,solutions:e.value};case"UPDATE_CURRENT_ANSWER":return{...n,currentQuestionAnswer:e.value};case"UPDATE_USER_SETTINGS":return{...n,userSettings:e.value};case"UPDATE_TEST_SUBMITTING":return{...n,submitting:e.value};case"UPDATE_QUESTION_COORDINATES":return{...n,currentSectionIndex:e.value.currentSectionIndex,currentQuestionIndex:e.value.currentQuestionIndex}}};var O=U(require("react"));var L=U(require("@react-native-async-storage/async-storage")),ce=()=>!(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof window<"u"&&window.localStorage?{getItem:e=>localStorage.getItem(e)?JSON.parse(localStorage.getItem(e)):null,setItem:(e,t)=>localStorage.setItem(e,JSON.stringify(t)),removeItem:e=>localStorage.removeItem(e)}:{getItem:async e=>{try{let t=await L.default.getItem(e);return t?JSON.parse(t):null}catch(t){return console.log(t),null}},setItem:async(e,t)=>{try{await L.default.setItem(e,JSON.stringify(t))}catch(o){console.log(o)}},removeItem:async e=>{try{await L.default.removeItem(e)}catch(t){console.log(t)}}},c=ce();var de=({test:n,submitTest:e,...t})=>{let[o,s]=O.default.useState(!1),[u,r]=O.default.useReducer(J,{...W,test:n,isSolution:t.isSolution}),T=async()=>{let l=await c.getItem(`${n?._id}-test-initiated`),m=await c.getItem(`${n._id}-solutions`)||{};r(l?{type:"UPDATE_SOLUTIONS",value:m}:{type:"UPDATE_SOLUTIONS",value:n?.sections?.reduce((i,E)=>(E.questions?.forEach(a=>{a.questionResponse&&(i[a._id]={...a.questionResponse})}),i),{})||{}});let d=await c.getItem(`${n._id}-currentSectionIndex`)||0,I=await c.getItem(`${n._id}-currentQuestionIndex`)||0;r({type:"UPDATE_QUESTION_COORDINATES",value:{currentSectionIndex:d,currentQuestionIndex:I}}),s(!0)};return(0,Z.useEffect)(()=>{T()},[]),o?O.default.createElement(P.Provider,{value:[u,r,e],...t}):O.default.createElement(O.default.Fragment,null)},z=de;var A=U(require("react"));var Te=()=>{let n=A.default.useContext(P);if(n===void 0)throw new Error("useTestEngine must be use within TestEngineProvider");let[e,t,o]=n,s=A.default.useMemo(()=>e.test?.sections[e.currentSectionIndex],[e.currentSectionIndex]),u=A.default.useMemo(()=>s?.questions[e.currentQuestionIndex],[e.currentQuestionIndex,s]);A.default.useEffect(()=>{u&&(e.solutions[u._id]?T({...e.solutions[u._id],isSaved:!0}):(e.isSolution||i({...e.solutions,[u._id]:{}}),T({}))),c.setItem(`${e.test?._id}-currentSectionIndex`,e.currentSectionIndex),c.setItem(`${e.test?._id}-currentQuestionIndex`,e.currentQuestionIndex)},[e.currentSectionIndex,e.currentQuestionIndex]);let r=A.default.useCallback(S=>t({type:"UPDATE_TEST",value:S}),[t]),T=A.default.useCallback(S=>t({type:"UPDATE_CURRENT_ANSWER",value:S}),[t]),l=A.default.useCallback(async S=>(await m(),t({type:"UPDATE_QUESTION_COORDINATES",value:S})),[t]),m=async()=>{let S=await c.getItem(`${e?.test?._id}-timers`)||{};e.test?.sections.forEach(v=>{v.questions?.forEach(R=>{S[R._id]&&!e.solutions[R._id]&&(e.solutions[R._id]={}),e.solutions[R._id]&&(e.solutions[R._id].timeTaken=S[R._id])})})},d=A.default.useCallback(S=>t({type:"UPDATE_USER_SETTINGS",value:S}),[t]),I=A.default.useCallback(S=>t({type:"UPDATE_TEST_SUBMITTING",value:S}),[t]);A.default.useEffect(()=>{e.isSolution||c.setItem(`${e.test?._id}-solutions`,e.solutions)},[e.solutions]);let i=A.default.useCallback(S=>t({type:"UPDATE_SOLUTIONS",value:S}),[t]),E=A.default.useCallback(async()=>{if(!await c.getItem(`${e.test?._id}-test-initiated`)&&e.test?.status==="Paused"){let v=await c.getItem(`${e?.test?._id}-timers`)||{},R={};e.test?.sections?.forEach((_,g)=>{_.questions?.forEach((p,y)=>{p._id===e.test?.lastVisitedQuestionId&&l({currentSectionIndex:g,currentQuestionIndex:y}),p.questionResponse&&(R[p._id]=JSON.stringify(p.questionResponse.timeTaken||0))})}),c.setItem(`${e?.test?._id}-timers`,{...v,...R})}e?.isSolution||c.setItem(`${e.test?._id}-test-initiated`,"true")},[]);A.default.useEffect(()=>{E()},[]);let a=async()=>{await c.removeItem(`${e.test?._id}-currentQuestionIndex`),await c.removeItem(`${e.test?._id}-currentSectionIndex`),await c.removeItem(`${e.test?._id}-solutions`),await c.removeItem(`${e.test?._id}-test-initiated`),await c.removeItem(`${e?.test?._id}-timers`)},f=A.default.useCallback(async(S=!1,v=!1)=>{I(!0);let R=await c.getItem(`${e.test?._id}-solutions`)||{},_=await c.getItem(`${e?.test?._id}-timers`)||{},g=[];e.test?.sections.forEach(y=>{y.questions.forEach(M=>{let C={questionId:M._id};R[M._id]&&(C.markedSolution=R[M._id].markedSolution||[],C.timeTaken=parseInt(_[M._id]||0),C.markedForReview=R[M._id].markedForReview||!1,g.push(C))})});let p={submittedBy:v?"autoSubmit":"user",questionResponses:g,testMappingId:e.test?.testMappingId,type:S?"Pause":"Submit",testId:e.test?._id};return S&&(p.lastVisitedQuestionId=u?._id),e.test?.timerLevel==="TEST"&&e.test.type==="TEST"&&S&&_[e?.test?._id]&&(p.timeTaken={[e.test?._id]:_[e?.test?._id]}),g.length||delete p.questionResponses,await a(),I(!1),o({payload:p,pause:S,autoSubmit:v}),p},[u]);return A.default.useMemo(()=>({...e,currentSection:s,currentQuestion:u,handleSubmitTest:f,handleUpdateTestDetails:r,handleUpdateQuestionCoordinates:l,handleUpdateSolutions:i,handleUpdateCurrentAnswer:T,handleUpdateUserSettings:d,handleResetLocal:a}),[e,s,u,f,r,l,i,T,d,a])},D=Te;var N=U(require("react"));var Ee=()=>{let{currentQuestion:n,currentQuestionAnswer:e,test:t,solutions:o,isSolution:s,handleUpdateCurrentAnswer:u,handleUpdateSolutions:r}=D(),T=N.default.useMemo(()=>t?.type==="QUIZ"&&!!o[n?._id]?.markedSolution?.length,[t,o,n]),l=(0,N.useCallback)(()=>{u({...e,markedSolution:[],isSaved:!1}),r({...o,[n?._id]:{...e,markedSolution:[]}})},[e,n,o,u,r]),m=(0,N.useCallback)(i=>{if(!(s||T))if(e?.markedSolution?.includes(i)){let E=e.markedSolution.filter(a=>a!==i);return E?.length===0?l():u({...e,markedSolution:E,isSaved:!1})}else{if(n?.type==="SINGLE")return u({...e,markedSolution:[i],isSaved:!1});{let E=e?.markedSolution?.length?e?.markedSolution:[];return u({...e,markedSolution:[...E,i],isSaved:!1})}}},[s,T,n,e,u,l]),d=(0,N.useCallback)(i=>{s||T||(u({...e,markedSolution:i?[i]:[],isSaved:!1}),i||l())},[s,T,u,e,l]),I=(0,N.useCallback)(()=>{u({...e,markedForReview:!e?.markedForReview}),r({...o,[n._id]:{...o[n._id],markedForReview:!e?.markedForReview}})},[u,r,e,o,n]);return{isQuizAnswer:T,handleClearResponse:l,handleSelectOption:m,handleIntegerInputChange:d,handleMarkForReview:I}},$=Ee;var k=require("react");var G=U(require("react"));var Ie=({includeAllSections:n}={})=>{let{currentQuestionIndex:e,solutions:t,currentSectionIndex:o,test:s,isSolution:u}=D(),[r,T]=G.default.useState({MARKED_FOR_REVIEW:{count:0},ATTEMPTED:{count:0},ATTEMPTED_AND_MARKED_FOR_REVIEW:{count:0},NOT_ATTEMPTED:{count:0},NOT_VISITED:{count:0},ACITVE_QUESTION:{count:0}}),l=()=>{let i={...r};Object.values(i).forEach(E=>E.count=0),n?s?.sections?.forEach((E,a)=>{E?.questions?.forEach((f,b)=>{let S=u||s.type==="QUIZ"?I(b,a):m(b,a);i[S].count+=1})}):s?.sections[o]?.questions.forEach((E,a)=>{let f=u||s.type==="QUIZ"?I(a,o):m(a,o);i[f].count+=1}),T(i)};G.default.useEffect(()=>{l()},[e,t,o]);let m=(i,E)=>{let a=s?.sections[E]?.questions[i],f;return t[a?._id]&&t[a?._id].markedSolution?.length&&t[a?._id].markedForReview?f="ATTEMPTED_AND_MARKED_FOR_REVIEW":t[a?._id]&&t[a?._id].markedForReview?f="MARKED_FOR_REVIEW":t[a?._id]&&t[a?._id].markedSolution?.length?f="ATTEMPTED":t[a?._id]?f="NOT_ATTEMPTED":f="NOT_VISITED",f};function d(i,E){let a=i.slice().sort(),f=E.slice().sort();if(a.length!==f.length)return!1;for(let b=0;b<a.length;b++)if(a[b]!==f[b])return!1;return!0}let I=(i,E)=>{let a=s?.sections[E]?.questions[i],f;return t[a?._id]&&t[a?._id].markedSolution?.length?d(t[a?._id].markedSolution,a.solution)?f="ATTEMPTED":f="NOT_ATTEMPTED":f="NOT_VISITED",f};return{getQuestionStatus:m,questionStatusMap:r,getAnsweredQuestionStatus:I,areArraysEqual:d}},Q=Ie;var fe=()=>{let{handleUpdateQuestionCoordinates:n,currentQuestionIndex:e,currentSectionIndex:t,currentSection:o,currentQuestionAnswer:s,handleUpdateSolutions:u,solutions:r,currentQuestion:T,handleUpdateCurrentAnswer:l,test:m,userSettings:d}=D(),{getAnsweredQuestionStatus:I}=Q(),[i,E]=(0,k.useState)([]);(0,k.useEffect)(()=>{if(d?.selectedFilter){let _=o?.questions?.map((g,p)=>{if(d?.selectedFilter===I(p,t))return p})?.filter(g=>g!==void 0);E(_),_?.length&&n({currentSectionIndex:t,currentQuestionIndex:_[0]||0})}else E([])},[d?.selectedFilter,o]);let a=()=>{s?.isSaved||(delete s?.isSaved,u({...r,[T?._id]:{...s}}))},f=()=>{if(d?.selectedFilter){let p=i?.findIndex(y=>y===e);p>=0&&i[p+1]>=0&&n({currentSectionIndex:t,currentQuestionIndex:i[p+1]});return}let _=o?.questions[e+1]?t:m?.sections[t+1]?t+1:t,g=o?.questions[e+1]?e+1:0;n({currentSectionIndex:_,currentQuestionIndex:g})},b=()=>{if(d?.selectedFilter){let p=i?.findIndex(y=>y===e);p>=0&&i[p-1]>=0&&n({currentSectionIndex:t,currentQuestionIndex:i[p-1]});return}let _=o?.questions[e-1]?t:m?.sections[t-1]?t-1:t,g=o?.questions[e-1]?e-1:m.sections[_]?.questions?.length-1;n({currentSectionIndex:_,currentQuestionIndex:g})},S=(0,k.useMemo)(()=>{if(d?.selectedFilter){let _=i?.findIndex(g=>g===e);return!i[_+1]}return!m?.sections[t+1]&&!o?.questions[e+1]},[t,e,i,d?.selectedFilter]),v=(0,k.useMemo)(()=>d?.selectedFilter?i?.findIndex(g=>g===e)<=0:t===0&&e===0,[t,e,i,d?.selectedFilter]);return{handleNext:f,handlePrevious:b,handleSaveAnswer:a,handleMarkForReview:()=>{l({...s,markedForReview:!s?.markedForReview}),u({...r,[T._id]:{...r[T._id],markedForReview:!s?.markedForReview}})},isLastQuestion:S,isFirstQuestion:v}},j=fe;var V=U(require("react"));var H={1:{label:"A"},2:{label:"B"},3:{label:"C"},4:{label:"D"}},pe=()=>{let{currentQuestionIndex:n,test:e,currentSection:t,currentSectionIndex:o,currentQuestion:s}=D(),{getAnsweredQuestionStatus:u}=Q(),r=V.default.useMemo(()=>u(n,o)==="ATTEMPTED"?"correct":u(n,o)==="NOT_ATTEMPTED"?"incorrect":"skipped",[n,o]),T=V.default.useMemo(()=>{switch(r){case"correct":return e?.marksLevel==="TEST"?"+"+e.positiveMarks:"+"+t?.positiveMarks;case"incorrect":return e?.marksLevel==="TEST"?e.isNegativeMarkingEnabled?"-"+e.negativeMarks:0:t?.isNegativeMarkingEnabled?"-"+t?.negativeMarks:0;case"skipped":return 0}},[r,o,n]);return{correctAnswer:V.default.useMemo(()=>{if(!s)return"";if(s.type==="INTEGER")return s.solution[0];if(s.type==="SINGLE"){let m=s.options.findIndex(d=>d._id===s.solution[0]);return H[m+1]?.label||""}return s.type==="MULTIPLE"?s.solution.map(d=>{let I=s.options.findIndex(i=>i._id===d);return H[I+1]?.label||""}).join(", "):""},[s]),currentAnswerMarks:T,currentQuestionStatus:r}},X=pe;var q=U(require("react"));var _e=n=>{let{test:e,handleSubmitTest:t}=D(),o=q.default.useRef(null),[s,u]=q.default.useState(e?.timeTaken?.[e?._id]??e?.duration??0),r=async l=>{let m=await c.getItem(`${e?._id}-timers`);if(l<=0){t(!1,!0);return}m[e._id]=l+"",c.setItem(`${e?._id}-timers`,m),u(l),o.current=setTimeout(()=>{r(l-1)},n==="app"?950:1e3)},T=async()=>{let l=await c.getItem(`${e?._id}-timers`);l||(await c.setItem(`${e?._id}-timers`,{}),l={});let m=parseInt(l?.[e?._id]||e?.timeTaken?.[e?._id]||e?.duration||0);r(m)};return q.default.useEffect(()=>(T(),()=>{o.current&&clearTimeout(o.current)}),[]),{timer:s}},ee=_e;var h=U(require("react"));var ge=n=>{let e=n==="app"?950:1e3,{currentQuestion:t,solutions:o,test:s}=D(),{isQuizAnswer:u}=$(),r=h.default.useRef(null),[T,l]=h.default.useState(0),m=async I=>{if(!t)return;let i=await c.getItem(`${s?._id}-timers`);if((o[t?._id]?.markedSolution||[])?.length===0)i[t?._id]=I+"",c.setItem(`${s?._id}-timers`,i),l(I);else{clearTimeout(r.current);return}r.current=setTimeout(()=>{m(I+1)},e)},d=async()=>{r.current&&(clearTimeout(r.current),r.current=null);let I=await c.getItem(`${s?._id}-timers`);I||(await c.setItem(`${s?._id}-timers`,{}),I={});let i=parseInt(I?.[t?._id]||s?.timeTaken?.[t?._id]||0);l(i),m(i)};return h.default.useEffect(()=>(t?._id&&d(),()=>{r.current&&(clearTimeout(r.current),r.current=null)}),[t]),h.default.useEffect(()=>{r.current===null&&setTimeout(()=>{r.current===null&&d()},e)},[o]),h.default.useEffect(()=>{u&&(clearTimeout(r.current),r.current=null)},[u]),{questionStopWatch:T}},te=ge;0&&(module.exports={AttemptStatus,TestEngineProvider,useQuestionStopWatch,useTestEngine,useTestEngineBody,useTestEngineFooter,useTestQuestionStatus,useTestSolutionBody,useTestTimer});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{useEffect as Y}from"react";import K from"react";var w=(r=>(r.ATTEMPTED="ATTEMPTED",r.NOT_ATTEMPTED="NOT_ATTEMPTED",r.NOT_VISITED="NOT_VISITED",r.MARKED_FOR_REVIEW="MARKED_FOR_REVIEW",r.ATTEMPTED_AND_MARKED_FOR_REVIEW="ATTEMPTED_AND_MARKED_FOR_REVIEW",r.ACITVE_QUESTION="ACITVE_QUESTION",r))(w||{});var F={test:void 0,solutions:{},currentQuestionIndex:0,currentSectionIndex:0,currentQuestionAnswer:{},userSettings:{},isSolution:!1,submitting:!1},O=K.createContext([F,()=>{},()=>{}]);O.displayName="TestEngineContext";var V=(n,e)=>{switch(e.type){case"UPDATE_TEST":return{...n,test:e.value};case"UPDATE_SOLUTIONS":return{...n,solutions:e.value};case"UPDATE_CURRENT_ANSWER":return{...n,currentQuestionAnswer:e.value};case"UPDATE_USER_SETTINGS":return{...n,userSettings:e.value};case"UPDATE_TEST_SUBMITTING":return{...n,submitting:e.value};case"UPDATE_QUESTION_COORDINATES":return{...n,currentSectionIndex:e.value.currentSectionIndex,currentQuestionIndex:e.value.currentQuestionIndex}}};import y from"react";import{MMKV as J}from"react-native-mmkv";var Z=()=>{if(!(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof window<"u"&&window.localStorage)return{getItem:e=>localStorage.getItem(e)?JSON.parse(localStorage.getItem(e)):null,setItem:(e,t)=>localStorage.setItem(e,JSON.stringify(t)),removeItem:e=>localStorage.removeItem(e)};{let e=new J({id:"testforce-engine"});return{getItem:t=>{try{let o=e.getString(t);return o?JSON.parse(o):null}catch(o){return console.log(o),null}},setItem:(t,o)=>{try{e.set(t,JSON.stringify(o))}catch(s){console.log(s)}},removeItem:t=>{try{e.delete(t)}catch(o){console.log(o)}}}}},l=Z();var j=({test:n,submitTest:e,...t})=>{let[o,s]=y.useState(!1),[u,r]=y.useReducer(V,{...F,test:n,isSolution:t.isSolution}),c=async()=>{let T=await l.getItem(`${n?._id}-test-initiated`),_=await l.getItem(`${n._id}-solutions`)||{};r(T?{type:"UPDATE_SOLUTIONS",value:_}:{type:"UPDATE_SOLUTIONS",value:n?.sections?.reduce((i,S)=>(S.questions?.forEach(a=>{a.questionResponse&&(i[a._id]={...a.questionResponse})}),i),{})||{}});let d=await l.getItem(`${n._id}-currentSectionIndex`)||0,E=await l.getItem(`${n._id}-currentQuestionIndex`)||0;r({type:"UPDATE_QUESTION_COORDINATES",value:{currentSectionIndex:d,currentQuestionIndex:E}}),s(!0)};return Y(()=>{c()},[]),o?y.createElement(O.Provider,{value:[u,r,e],...t}):y.createElement(y.Fragment,null)},H=j;import A from"react";var ee=()=>{let n=A.useContext(O);if(n===void 0)throw new Error("useTestEngine must be use within TestEngineProvider");let[e,t,o]=n,s=A.useMemo(()=>e.test?.sections[e.currentSectionIndex],[e.currentSectionIndex]),u=A.useMemo(()=>s?.questions[e.currentQuestionIndex],[e.currentQuestionIndex,s]);A.useEffect(()=>{u&&(e.solutions[u._id]?c({...e.solutions[u._id],isSaved:!0}):(e.isSolution||i({...e.solutions,[u._id]:{}}),c({}))),l.setItem(`${e.test?._id}-currentSectionIndex`,e.currentSectionIndex),l.setItem(`${e.test?._id}-currentQuestionIndex`,e.currentQuestionIndex)},[e.currentSectionIndex,e.currentQuestionIndex]);let r=A.useCallback(m=>t({type:"UPDATE_TEST",value:m}),[t]),c=A.useCallback(m=>t({type:"UPDATE_CURRENT_ANSWER",value:m}),[t]),T=A.useCallback(async m=>(await _(),t({type:"UPDATE_QUESTION_COORDINATES",value:m})),[t]),_=async()=>{let m=await l.getItem(`${e?.test?._id}-timers`)||{};e.test?.sections.forEach(k=>{k.questions?.forEach(R=>{m[R._id]&&!e.solutions[R._id]&&(e.solutions[R._id]={}),e.solutions[R._id]&&(e.solutions[R._id].timeTaken=m[R._id])})})},d=A.useCallback(m=>t({type:"UPDATE_USER_SETTINGS",value:m}),[t]),E=A.useCallback(m=>t({type:"UPDATE_TEST_SUBMITTING",value:m}),[t]);A.useEffect(()=>{e.isSolution||l.setItem(`${e.test?._id}-solutions`,e.solutions)},[e.solutions]);let i=A.useCallback(m=>t({type:"UPDATE_SOLUTIONS",value:m}),[t]),S=A.useCallback(async()=>{if(!await l.getItem(`${e.test?._id}-test-initiated`)&&e.test?.status==="Paused"){let k=await l.getItem(`${e?.test?._id}-timers`)||{},R={};e.test?.sections?.forEach((p,g)=>{p.questions?.forEach((I,v)=>{I._id===e.test?.lastVisitedQuestionId&&T({currentSectionIndex:g,currentQuestionIndex:v}),I.questionResponse&&(R[I._id]=JSON.stringify(I.questionResponse.timeTaken||0))})}),l.setItem(`${e?.test?._id}-timers`,{...k,...R})}e?.isSolution||l.setItem(`${e.test?._id}-test-initiated`,"true")},[]);A.useEffect(()=>{S()},[]);let a=async()=>{await l.removeItem(`${e.test?._id}-currentQuestionIndex`),await l.removeItem(`${e.test?._id}-currentSectionIndex`),await l.removeItem(`${e.test?._id}-solutions`),await l.removeItem(`${e.test?._id}-test-initiated`),await l.removeItem(`${e?.test?._id}-timers`)},f=A.useCallback(async(m=!1,k=!1)=>{E(!0);let R=await l.getItem(`${e.test?._id}-solutions`)||{},p=await l.getItem(`${e?.test?._id}-timers`)||{},g=[];e.test?.sections.forEach(v=>{v.questions.forEach(N=>{let P={questionId:N._id};R[N._id]&&(P.markedSolution=R[N._id].markedSolution||[],P.timeTaken=parseInt(p[N._id]||0),P.markedForReview=R[N._id].markedForReview||!1,g.push(P))})});let I={submittedBy:k?"autoSubmit":"user",questionResponses:g,testMappingId:e.test?.testMappingId,type:m?"Pause":"Submit",testId:e.test?._id};return m&&(I.lastVisitedQuestionId=u?._id),e.test?.timerLevel==="TEST"&&e.test.type==="TEST"&&m&&p[e?.test?._id]&&(I.timeTaken={[e.test?._id]:p[e?.test?._id]}),g.length||delete I.questionResponses,await a(),E(!1),o({payload:I,pause:m,autoSubmit:k}),I},[u]);return A.useMemo(()=>({...e,currentSection:s,currentQuestion:u,handleSubmitTest:f,handleUpdateTestDetails:r,handleUpdateQuestionCoordinates:T,handleUpdateSolutions:i,handleUpdateCurrentAnswer:c,handleUpdateUserSettings:d,handleResetLocal:a}),[e,s,u,f,r,T,i,c,d,a])},D=ee;import ne,{useCallback as C}from"react";var se=()=>{let{currentQuestion:n,currentQuestionAnswer:e,test:t,solutions:o,isSolution:s,handleUpdateCurrentAnswer:u,handleUpdateSolutions:r}=D(),c=ne.useMemo(()=>t?.type==="QUIZ"&&!!o[n?._id]?.markedSolution?.length,[t,o,n]),T=C(()=>{u({...e,markedSolution:[],isSaved:!1}),r({...o,[n?._id]:{...e,markedSolution:[]}})},[e,n,o,u,r]),_=C(i=>{if(!(s||c))if(e?.markedSolution?.includes(i)){let S=e.markedSolution.filter(a=>a!==i);return S?.length===0?T():u({...e,markedSolution:S,isSaved:!1})}else{if(n?.type==="SINGLE")return u({...e,markedSolution:[i],isSaved:!1});{let S=e?.markedSolution?.length?e?.markedSolution:[];return u({...e,markedSolution:[...S,i],isSaved:!1})}}},[s,c,n,e,u,T]),d=C(i=>{s||c||(u({...e,markedSolution:i?[i]:[],isSaved:!1}),i||T())},[s,c,u,e,T]),E=C(()=>{u({...e,markedForReview:!e?.markedForReview}),r({...o,[n._id]:{...o[n._id],markedForReview:!e?.markedForReview}})},[u,r,e,o,n]);return{isQuizAnswer:c,handleClearResponse:T,handleSelectOption:_,handleIntegerInputChange:d,handleMarkForReview:E}},L=se;import{useEffect as ie,useMemo as G,useState as oe}from"react";import W from"react";var re=({includeAllSections:n}={})=>{let{currentQuestionIndex:e,solutions:t,currentSectionIndex:o,test:s,isSolution:u}=D(),[r,c]=W.useState({MARKED_FOR_REVIEW:{count:0},ATTEMPTED:{count:0},ATTEMPTED_AND_MARKED_FOR_REVIEW:{count:0},NOT_ATTEMPTED:{count:0},NOT_VISITED:{count:0},ACITVE_QUESTION:{count:0}}),T=()=>{let i={...r};Object.values(i).forEach(S=>S.count=0),n?s?.sections?.forEach((S,a)=>{S?.questions?.forEach((f,U)=>{let m=u||s.type==="QUIZ"?E(U,a):_(U,a);i[m].count+=1})}):s?.sections[o]?.questions.forEach((S,a)=>{let f=u||s.type==="QUIZ"?E(a,o):_(a,o);i[f].count+=1}),c(i)};W.useEffect(()=>{T()},[e,t,o]);let _=(i,S)=>{let a=s?.sections[S]?.questions[i],f;return t[a?._id]&&t[a?._id].markedSolution?.length&&t[a?._id].markedForReview?f="ATTEMPTED_AND_MARKED_FOR_REVIEW":t[a?._id]&&t[a?._id].markedForReview?f="MARKED_FOR_REVIEW":t[a?._id]&&t[a?._id].markedSolution?.length?f="ATTEMPTED":t[a?._id]?f="NOT_ATTEMPTED":f="NOT_VISITED",f};function d(i,S){let a=i.slice().sort(),f=S.slice().sort();if(a.length!==f.length)return!1;for(let U=0;U<a.length;U++)if(a[U]!==f[U])return!1;return!0}let E=(i,S)=>{let a=s?.sections[S]?.questions[i],f;return t[a?._id]&&t[a?._id].markedSolution?.length?d(t[a?._id].markedSolution,a.solution)?f="ATTEMPTED":f="NOT_ATTEMPTED":f="NOT_VISITED",f};return{getQuestionStatus:_,questionStatusMap:r,getAnsweredQuestionStatus:E,areArraysEqual:d}},Q=re;var ue=()=>{let{handleUpdateQuestionCoordinates:n,currentQuestionIndex:e,currentSectionIndex:t,currentSection:o,currentQuestionAnswer:s,handleUpdateSolutions:u,solutions:r,currentQuestion:c,handleUpdateCurrentAnswer:T,test:_,userSettings:d}=D(),{getAnsweredQuestionStatus:E}=Q(),[i,S]=oe([]);ie(()=>{if(d?.selectedFilter){let p=o?.questions?.map((g,I)=>{if(d?.selectedFilter===E(I,t))return I})?.filter(g=>g!==void 0);S(p),p?.length&&n({currentSectionIndex:t,currentQuestionIndex:p[0]||0})}else S([])},[d?.selectedFilter,o]);let a=()=>{s?.isSaved||(delete s?.isSaved,u({...r,[c?._id]:{...s}}))},f=()=>{if(d?.selectedFilter){let I=i?.findIndex(v=>v===e);I>=0&&i[I+1]>=0&&n({currentSectionIndex:t,currentQuestionIndex:i[I+1]});return}let p=o?.questions[e+1]?t:_?.sections[t+1]?t+1:t,g=o?.questions[e+1]?e+1:0;n({currentSectionIndex:p,currentQuestionIndex:g})},U=()=>{if(d?.selectedFilter){let I=i?.findIndex(v=>v===e);I>=0&&i[I-1]>=0&&n({currentSectionIndex:t,currentQuestionIndex:i[I-1]});return}let p=o?.questions[e-1]?t:_?.sections[t-1]?t-1:t,g=o?.questions[e-1]?e-1:_.sections[p]?.questions?.length-1;n({currentSectionIndex:p,currentQuestionIndex:g})},m=G(()=>{if(d?.selectedFilter){let p=i?.findIndex(g=>g===e);return!i[p+1]}return!_?.sections[t+1]&&!o?.questions[e+1]},[t,e,i,d?.selectedFilter]),k=G(()=>d?.selectedFilter?i?.findIndex(g=>g===e)<=0:t===0&&e===0,[t,e,i,d?.selectedFilter]);return{handleNext:f,handlePrevious:U,handleSaveAnswer:a,handleMarkForReview:()=>{T({...s,markedForReview:!s?.markedForReview}),u({...r,[c._id]:{...r[c._id],markedForReview:!s?.markedForReview}})},isLastQuestion:m,isFirstQuestion:k}},ae=ue;import $ from"react";var B={1:{label:"A"},2:{label:"B"},3:{label:"C"},4:{label:"D"}},ce=()=>{let{currentQuestionIndex:n,test:e,currentSection:t,currentSectionIndex:o,currentQuestion:s}=D(),{getAnsweredQuestionStatus:u}=Q(),r=$.useMemo(()=>u(n,o)==="ATTEMPTED"?"correct":u(n,o)==="NOT_ATTEMPTED"?"incorrect":"skipped",[n,o]),c=$.useMemo(()=>{switch(r){case"correct":return e?.marksLevel==="TEST"?"+"+e.positiveMarks:"+"+t?.positiveMarks;case"incorrect":return e?.marksLevel==="TEST"?e.isNegativeMarkingEnabled?"-"+e.negativeMarks:0:t?.isNegativeMarkingEnabled?"-"+t?.negativeMarks:0;case"skipped":return 0}},[r,o,n]);return{correctAnswer:$.useMemo(()=>{if(!s)return"";if(s.type==="INTEGER")return s.solution[0];if(s.type==="SINGLE"){let _=s.options.findIndex(d=>d._id===s.solution[0]);return B[_+1]?.label||""}return s.type==="MULTIPLE"?s.solution.map(d=>{let E=s.options.findIndex(i=>i._id===d);return B[E+1]?.label||""}).join(", "):""},[s]),currentAnswerMarks:c,currentQuestionStatus:r}},le=ce;import M from"react";var de=()=>{let{test:n,handleSubmitTest:e}=D(),t=M.useRef(null),[o,s]=M.useState(n?.timeTaken?.[n?._id]??n?.duration??0),u=M.useCallback(async c=>{t.current&&clearTimeout(t.current);let T=await l.getItem(`${n?._id}-timers`);if(c<=0){e(!1,!0);return}T[n._id]=c+"",l.setItem(`${n?._id}-timers`,T),s(c),t.current=setTimeout(()=>{u(c-1)},1e3)},[n,e]),r=M.useCallback(async()=>{if(!n?._id)return;let c=await l.getItem(`${n._id}-timers`);c||(await l.setItem(`${n._id}-timers`,{}),c={});let T=parseInt(c?.[n._id]||n?.timeTaken?.[n._id]||n?.duration||0);u(T)},[n,u]);return M.useEffect(()=>(r(),()=>{t.current&&clearTimeout(t.current)}),[r,n?._id]),{timer:o}},Te=de;import h from"react";var me=n=>{let e=n==="app"?950:1e3,{currentQuestion:t,solutions:o,test:s}=D(),{isQuizAnswer:u}=L(),r=h.useRef(null),[c,T]=h.useState(0),_=async E=>{if(!t)return;let i=await l.getItem(`${s?._id}-timers`);if((o[t?._id]?.markedSolution||[])?.length===0)i[t?._id]=E+"",l.setItem(`${s?._id}-timers`,i),T(E);else{clearTimeout(r.current);return}r.current=setTimeout(()=>{_(E+1)},e)},d=async()=>{r.current&&(clearTimeout(r.current),r.current=null);let E=await l.getItem(`${s?._id}-timers`);E||(await l.setItem(`${s?._id}-timers`,{}),E={});let i=parseInt(E?.[t?._id]||s?.timeTaken?.[t?._id]||0);T(i),_(i)};return h.useEffect(()=>(t?._id&&d(),()=>{r.current&&(clearTimeout(r.current),r.current=null)}),[t]),h.useEffect(()=>{r.current===null&&setTimeout(()=>{r.current===null&&d()},e)},[o]),h.useEffect(()=>{u&&(clearTimeout(r.current),r.current=null)},[u]),{questionStopWatch:c}},Se=me;export{w as AttemptStatus,H as TestEngineProvider,Se as useQuestionStopWatch,D as useTestEngine,L as useTestEngineBody,ae as useTestEngineFooter,Q as useTestQuestionStatus,le as useTestSolutionBody,Te as useTestTimer};
1
+ import{useEffect as Y}from"react";import J from"react";var w=(n=>(n.ATTEMPTED="ATTEMPTED",n.NOT_ATTEMPTED="NOT_ATTEMPTED",n.NOT_VISITED="NOT_VISITED",n.MARKED_FOR_REVIEW="MARKED_FOR_REVIEW",n.ATTEMPTED_AND_MARKED_FOR_REVIEW="ATTEMPTED_AND_MARKED_FOR_REVIEW",n.ACITVE_QUESTION="ACITVE_QUESTION",n))(w||{});var C={test:void 0,solutions:{},currentQuestionIndex:0,currentSectionIndex:0,currentQuestionAnswer:{},userSettings:{},isSolution:!1,submitting:!1},k=J.createContext([C,()=>{},()=>{}]);k.displayName="TestEngineContext";var q=(r,e)=>{switch(e.type){case"UPDATE_TEST":return{...r,test:e.value};case"UPDATE_SOLUTIONS":return{...r,solutions:e.value};case"UPDATE_CURRENT_ANSWER":return{...r,currentQuestionAnswer:e.value};case"UPDATE_USER_SETTINGS":return{...r,userSettings:e.value};case"UPDATE_TEST_SUBMITTING":return{...r,submitting:e.value};case"UPDATE_QUESTION_COORDINATES":return{...r,currentSectionIndex:e.value.currentSectionIndex,currentQuestionIndex:e.value.currentQuestionIndex}}};import O from"react";import F from"@react-native-async-storage/async-storage";var Z=()=>!(typeof navigator<"u"&&navigator.product==="ReactNative")&&typeof window<"u"&&window.localStorage?{getItem:e=>localStorage.getItem(e)?JSON.parse(localStorage.getItem(e)):null,setItem:(e,t)=>localStorage.setItem(e,JSON.stringify(t)),removeItem:e=>localStorage.removeItem(e)}:{getItem:async e=>{try{let t=await F.getItem(e);return t?JSON.parse(t):null}catch(t){return console.log(t),null}},setItem:async(e,t)=>{try{await F.setItem(e,JSON.stringify(t))}catch(o){console.log(o)}},removeItem:async e=>{try{await F.removeItem(e)}catch(t){console.log(t)}}},c=Z();var j=({test:r,submitTest:e,...t})=>{let[o,i]=O.useState(!1),[u,n]=O.useReducer(q,{...C,test:r,isSolution:t.isSolution}),T=async()=>{let l=await c.getItem(`${r?._id}-test-initiated`),m=await c.getItem(`${r._id}-solutions`)||{};n(l?{type:"UPDATE_SOLUTIONS",value:m}:{type:"UPDATE_SOLUTIONS",value:r?.sections?.reduce((s,E)=>(E.questions?.forEach(a=>{a.questionResponse&&(s[a._id]={...a.questionResponse})}),s),{})||{}});let d=await c.getItem(`${r._id}-currentSectionIndex`)||0,I=await c.getItem(`${r._id}-currentQuestionIndex`)||0;n({type:"UPDATE_QUESTION_COORDINATES",value:{currentSectionIndex:d,currentQuestionIndex:I}}),i(!0)};return Y(()=>{T()},[]),o?O.createElement(k.Provider,{value:[u,n,e],...t}):O.createElement(O.Fragment,null)},H=j;import A from"react";var ee=()=>{let r=A.useContext(k);if(r===void 0)throw new Error("useTestEngine must be use within TestEngineProvider");let[e,t,o]=r,i=A.useMemo(()=>e.test?.sections[e.currentSectionIndex],[e.currentSectionIndex]),u=A.useMemo(()=>i?.questions[e.currentQuestionIndex],[e.currentQuestionIndex,i]);A.useEffect(()=>{u&&(e.solutions[u._id]?T({...e.solutions[u._id],isSaved:!0}):(e.isSolution||s({...e.solutions,[u._id]:{}}),T({}))),c.setItem(`${e.test?._id}-currentSectionIndex`,e.currentSectionIndex),c.setItem(`${e.test?._id}-currentQuestionIndex`,e.currentQuestionIndex)},[e.currentSectionIndex,e.currentQuestionIndex]);let n=A.useCallback(S=>t({type:"UPDATE_TEST",value:S}),[t]),T=A.useCallback(S=>t({type:"UPDATE_CURRENT_ANSWER",value:S}),[t]),l=A.useCallback(async S=>(await m(),t({type:"UPDATE_QUESTION_COORDINATES",value:S})),[t]),m=async()=>{let S=await c.getItem(`${e?.test?._id}-timers`)||{};e.test?.sections.forEach(v=>{v.questions?.forEach(R=>{S[R._id]&&!e.solutions[R._id]&&(e.solutions[R._id]={}),e.solutions[R._id]&&(e.solutions[R._id].timeTaken=S[R._id])})})},d=A.useCallback(S=>t({type:"UPDATE_USER_SETTINGS",value:S}),[t]),I=A.useCallback(S=>t({type:"UPDATE_TEST_SUBMITTING",value:S}),[t]);A.useEffect(()=>{e.isSolution||c.setItem(`${e.test?._id}-solutions`,e.solutions)},[e.solutions]);let s=A.useCallback(S=>t({type:"UPDATE_SOLUTIONS",value:S}),[t]),E=A.useCallback(async()=>{if(!await c.getItem(`${e.test?._id}-test-initiated`)&&e.test?.status==="Paused"){let v=await c.getItem(`${e?.test?._id}-timers`)||{},R={};e.test?.sections?.forEach((_,g)=>{_.questions?.forEach((p,y)=>{p._id===e.test?.lastVisitedQuestionId&&l({currentSectionIndex:g,currentQuestionIndex:y}),p.questionResponse&&(R[p._id]=JSON.stringify(p.questionResponse.timeTaken||0))})}),c.setItem(`${e?.test?._id}-timers`,{...v,...R})}e?.isSolution||c.setItem(`${e.test?._id}-test-initiated`,"true")},[]);A.useEffect(()=>{E()},[]);let a=async()=>{await c.removeItem(`${e.test?._id}-currentQuestionIndex`),await c.removeItem(`${e.test?._id}-currentSectionIndex`),await c.removeItem(`${e.test?._id}-solutions`),await c.removeItem(`${e.test?._id}-test-initiated`),await c.removeItem(`${e?.test?._id}-timers`)},f=A.useCallback(async(S=!1,v=!1)=>{I(!0);let R=await c.getItem(`${e.test?._id}-solutions`)||{},_=await c.getItem(`${e?.test?._id}-timers`)||{},g=[];e.test?.sections.forEach(y=>{y.questions.forEach(N=>{let M={questionId:N._id};R[N._id]&&(M.markedSolution=R[N._id].markedSolution||[],M.timeTaken=parseInt(_[N._id]||0),M.markedForReview=R[N._id].markedForReview||!1,g.push(M))})});let p={submittedBy:v?"autoSubmit":"user",questionResponses:g,testMappingId:e.test?.testMappingId,type:S?"Pause":"Submit",testId:e.test?._id};return S&&(p.lastVisitedQuestionId=u?._id),e.test?.timerLevel==="TEST"&&e.test.type==="TEST"&&S&&_[e?.test?._id]&&(p.timeTaken={[e.test?._id]:_[e?.test?._id]}),g.length||delete p.questionResponses,await a(),I(!1),o({payload:p,pause:S,autoSubmit:v}),p},[u]);return A.useMemo(()=>({...e,currentSection:i,currentQuestion:u,handleSubmitTest:f,handleUpdateTestDetails:n,handleUpdateQuestionCoordinates:l,handleUpdateSolutions:s,handleUpdateCurrentAnswer:T,handleUpdateUserSettings:d,handleResetLocal:a}),[e,i,u,f,n,l,s,T,d,a])},D=ee;import ne,{useCallback as P}from"react";var se=()=>{let{currentQuestion:r,currentQuestionAnswer:e,test:t,solutions:o,isSolution:i,handleUpdateCurrentAnswer:u,handleUpdateSolutions:n}=D(),T=ne.useMemo(()=>t?.type==="QUIZ"&&!!o[r?._id]?.markedSolution?.length,[t,o,r]),l=P(()=>{u({...e,markedSolution:[],isSaved:!1}),n({...o,[r?._id]:{...e,markedSolution:[]}})},[e,r,o,u,n]),m=P(s=>{if(!(i||T))if(e?.markedSolution?.includes(s)){let E=e.markedSolution.filter(a=>a!==s);return E?.length===0?l():u({...e,markedSolution:E,isSaved:!1})}else{if(r?.type==="SINGLE")return u({...e,markedSolution:[s],isSaved:!1});{let E=e?.markedSolution?.length?e?.markedSolution:[];return u({...e,markedSolution:[...E,s],isSaved:!1})}}},[i,T,r,e,u,l]),d=P(s=>{i||T||(u({...e,markedSolution:s?[s]:[],isSaved:!1}),s||l())},[i,T,u,e,l]),I=P(()=>{u({...e,markedForReview:!e?.markedForReview}),n({...o,[r._id]:{...o[r._id],markedForReview:!e?.markedForReview}})},[u,n,e,o,r]);return{isQuizAnswer:T,handleClearResponse:l,handleSelectOption:m,handleIntegerInputChange:d,handleMarkForReview:I}},L=se;import{useEffect as ie,useMemo as B,useState as oe}from"react";import G from"react";var re=({includeAllSections:r}={})=>{let{currentQuestionIndex:e,solutions:t,currentSectionIndex:o,test:i,isSolution:u}=D(),[n,T]=G.useState({MARKED_FOR_REVIEW:{count:0},ATTEMPTED:{count:0},ATTEMPTED_AND_MARKED_FOR_REVIEW:{count:0},NOT_ATTEMPTED:{count:0},NOT_VISITED:{count:0},ACITVE_QUESTION:{count:0}}),l=()=>{let s={...n};Object.values(s).forEach(E=>E.count=0),r?i?.sections?.forEach((E,a)=>{E?.questions?.forEach((f,U)=>{let S=u||i.type==="QUIZ"?I(U,a):m(U,a);s[S].count+=1})}):i?.sections[o]?.questions.forEach((E,a)=>{let f=u||i.type==="QUIZ"?I(a,o):m(a,o);s[f].count+=1}),T(s)};G.useEffect(()=>{l()},[e,t,o]);let m=(s,E)=>{let a=i?.sections[E]?.questions[s],f;return t[a?._id]&&t[a?._id].markedSolution?.length&&t[a?._id].markedForReview?f="ATTEMPTED_AND_MARKED_FOR_REVIEW":t[a?._id]&&t[a?._id].markedForReview?f="MARKED_FOR_REVIEW":t[a?._id]&&t[a?._id].markedSolution?.length?f="ATTEMPTED":t[a?._id]?f="NOT_ATTEMPTED":f="NOT_VISITED",f};function d(s,E){let a=s.slice().sort(),f=E.slice().sort();if(a.length!==f.length)return!1;for(let U=0;U<a.length;U++)if(a[U]!==f[U])return!1;return!0}let I=(s,E)=>{let a=i?.sections[E]?.questions[s],f;return t[a?._id]&&t[a?._id].markedSolution?.length?d(t[a?._id].markedSolution,a.solution)?f="ATTEMPTED":f="NOT_ATTEMPTED":f="NOT_VISITED",f};return{getQuestionStatus:m,questionStatusMap:n,getAnsweredQuestionStatus:I,areArraysEqual:d}},Q=re;var ue=()=>{let{handleUpdateQuestionCoordinates:r,currentQuestionIndex:e,currentSectionIndex:t,currentSection:o,currentQuestionAnswer:i,handleUpdateSolutions:u,solutions:n,currentQuestion:T,handleUpdateCurrentAnswer:l,test:m,userSettings:d}=D(),{getAnsweredQuestionStatus:I}=Q(),[s,E]=oe([]);ie(()=>{if(d?.selectedFilter){let _=o?.questions?.map((g,p)=>{if(d?.selectedFilter===I(p,t))return p})?.filter(g=>g!==void 0);E(_),_?.length&&r({currentSectionIndex:t,currentQuestionIndex:_[0]||0})}else E([])},[d?.selectedFilter,o]);let a=()=>{i?.isSaved||(delete i?.isSaved,u({...n,[T?._id]:{...i}}))},f=()=>{if(d?.selectedFilter){let p=s?.findIndex(y=>y===e);p>=0&&s[p+1]>=0&&r({currentSectionIndex:t,currentQuestionIndex:s[p+1]});return}let _=o?.questions[e+1]?t:m?.sections[t+1]?t+1:t,g=o?.questions[e+1]?e+1:0;r({currentSectionIndex:_,currentQuestionIndex:g})},U=()=>{if(d?.selectedFilter){let p=s?.findIndex(y=>y===e);p>=0&&s[p-1]>=0&&r({currentSectionIndex:t,currentQuestionIndex:s[p-1]});return}let _=o?.questions[e-1]?t:m?.sections[t-1]?t-1:t,g=o?.questions[e-1]?e-1:m.sections[_]?.questions?.length-1;r({currentSectionIndex:_,currentQuestionIndex:g})},S=B(()=>{if(d?.selectedFilter){let _=s?.findIndex(g=>g===e);return!s[_+1]}return!m?.sections[t+1]&&!o?.questions[e+1]},[t,e,s,d?.selectedFilter]),v=B(()=>d?.selectedFilter?s?.findIndex(g=>g===e)<=0:t===0&&e===0,[t,e,s,d?.selectedFilter]);return{handleNext:f,handlePrevious:U,handleSaveAnswer:a,handleMarkForReview:()=>{l({...i,markedForReview:!i?.markedForReview}),u({...n,[T._id]:{...n[T._id],markedForReview:!i?.markedForReview}})},isLastQuestion:S,isFirstQuestion:v}},ae=ue;import $ from"react";var K={1:{label:"A"},2:{label:"B"},3:{label:"C"},4:{label:"D"}},ce=()=>{let{currentQuestionIndex:r,test:e,currentSection:t,currentSectionIndex:o,currentQuestion:i}=D(),{getAnsweredQuestionStatus:u}=Q(),n=$.useMemo(()=>u(r,o)==="ATTEMPTED"?"correct":u(r,o)==="NOT_ATTEMPTED"?"incorrect":"skipped",[r,o]),T=$.useMemo(()=>{switch(n){case"correct":return e?.marksLevel==="TEST"?"+"+e.positiveMarks:"+"+t?.positiveMarks;case"incorrect":return e?.marksLevel==="TEST"?e.isNegativeMarkingEnabled?"-"+e.negativeMarks:0:t?.isNegativeMarkingEnabled?"-"+t?.negativeMarks:0;case"skipped":return 0}},[n,o,r]);return{correctAnswer:$.useMemo(()=>{if(!i)return"";if(i.type==="INTEGER")return i.solution[0];if(i.type==="SINGLE"){let m=i.options.findIndex(d=>d._id===i.solution[0]);return K[m+1]?.label||""}return i.type==="MULTIPLE"?i.solution.map(d=>{let I=i.options.findIndex(s=>s._id===d);return K[I+1]?.label||""}).join(", "):""},[i]),currentAnswerMarks:T,currentQuestionStatus:n}},le=ce;import V from"react";var de=r=>{let{test:e,handleSubmitTest:t}=D(),o=V.useRef(null),[i,u]=V.useState(e?.timeTaken?.[e?._id]??e?.duration??0),n=async l=>{let m=await c.getItem(`${e?._id}-timers`);if(l<=0){t(!1,!0);return}m[e._id]=l+"",c.setItem(`${e?._id}-timers`,m),u(l),o.current=setTimeout(()=>{n(l-1)},r==="app"?950:1e3)},T=async()=>{let l=await c.getItem(`${e?._id}-timers`);l||(await c.setItem(`${e?._id}-timers`,{}),l={});let m=parseInt(l?.[e?._id]||e?.timeTaken?.[e?._id]||e?.duration||0);n(m)};return V.useEffect(()=>(T(),()=>{o.current&&clearTimeout(o.current)}),[]),{timer:i}},me=de;import h from"react";var Te=r=>{let e=r==="app"?950:1e3,{currentQuestion:t,solutions:o,test:i}=D(),{isQuizAnswer:u}=L(),n=h.useRef(null),[T,l]=h.useState(0),m=async I=>{if(!t)return;let s=await c.getItem(`${i?._id}-timers`);if((o[t?._id]?.markedSolution||[])?.length===0)s[t?._id]=I+"",c.setItem(`${i?._id}-timers`,s),l(I);else{clearTimeout(n.current);return}n.current=setTimeout(()=>{m(I+1)},e)},d=async()=>{n.current&&(clearTimeout(n.current),n.current=null);let I=await c.getItem(`${i?._id}-timers`);I||(await c.setItem(`${i?._id}-timers`,{}),I={});let s=parseInt(I?.[t?._id]||i?.timeTaken?.[t?._id]||0);l(s),m(s)};return h.useEffect(()=>(t?._id&&d(),()=>{n.current&&(clearTimeout(n.current),n.current=null)}),[t]),h.useEffect(()=>{n.current===null&&setTimeout(()=>{n.current===null&&d()},e)},[o]),h.useEffect(()=>{u&&(clearTimeout(n.current),n.current=null)},[u]),{questionStopWatch:T}},Se=Te;export{w as AttemptStatus,H as TestEngineProvider,Se as useQuestionStopWatch,D as useTestEngine,L as useTestEngineBody,ae as useTestEngineFooter,Q as useTestQuestionStatus,le as useTestSolutionBody,me as useTestTimer};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testforce-engine",
3
- "version": "0.0.3-alpha",
3
+ "version": "0.0.3",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -13,17 +13,16 @@
13
13
  "author": "",
14
14
  "license": "ISC",
15
15
  "dependencies": {
16
- "@babel/runtime": "^7.26.9"
16
+ "@babel/runtime": "^7.26.9",
17
+ "@react-native-async-storage/async-storage": "^2.1.1"
17
18
  },
18
19
  "devDependencies": {
19
- "@types/react": "18.3.1",
20
+ "@types/react": "^19.0.8",
20
21
  "tsup": "^8.3.6",
21
22
  "typescript": "^5.7.3"
22
23
  },
23
24
  "peerDependencies": {
24
25
  "react": ">=18",
25
- "react-dom": ">=18",
26
- "react-native": ">=0.76",
27
- "react-native-mmkv": ">=3.2"
26
+ "react-native": ">=0.72"
28
27
  }
29
28
  }