UNPKG

@tantainnovative/ndpr-toolkit

Version:

Nigeria Data Protection Toolkit — enterprise-grade compliance components for the Nigeria Data Protection Act (NDPA) 2023

1 lines 4.2 kB
import {a as a$1}from'./chunk-LRRENTT5.mjs';import {a as a$2}from'./chunk-DBZSN4WP.mjs';import {b,a}from'./chunk-ZJYULEER.mjs';import {useRef,useState,useEffect,useCallback}from'react';function J(a,h){return h?a$2(a):{load:()=>null,save:()=>{},remove:()=>{}}}function Z({sections:a$2,initialAnswers:h={},adapter:P,storageKey:V="ndpr_dpia_data",useLocalStorage:T=true,onComplete:w}){let y=P!=null?P:J(V,T),g=useRef(y);g.current=y;let[f,m]=useState(0),[o,v]=useState(h),[_,I]=useState(true);useEffect(()=>{let r=false;try{let t=g.current.load();t instanceof Promise?t.then(e=>{r||(e&&v(e),I(!1));},()=>{r||I(!1);}):(t&&v(t),I(!1));}catch(t){r||I(false);}return ()=>{r=true;}},[]);let u=a$2[f]||null,S=useCallback(r=>{Promise.resolve(g.current.save(r)).catch(t=>{console.warn("[ndpr-toolkit] Failed to save DPIA answers:",t);});},[]),$=useCallback((r,t)=>{v(e=>{let s=b(a({},e),{[r]:t});return S(s),s});},[S]),p=useCallback(r=>r.showWhen?r.showWhen.every(t=>{let e=o[t.questionId];switch(t.operator){case "equals":return e===t.value;case "contains":return Array.isArray(e)?e.includes(String(t.value)):false;case "greaterThan":return typeof e=="number"&&typeof t.value=="number"?e>t.value:false;case "lessThan":return typeof e=="number"&&typeof t.value=="number"?e<t.value:false;default:return true}}):true,[o]),A=useCallback(()=>u?u.questions.filter(p):[],[u,p]),D=useCallback(()=>u?A().every(t=>{if(!t.required)return true;let e=o[t.id];return !(e==null||typeof e=="string"&&e.trim()===""||Array.isArray(e)&&e.length===0)}):false,[o,u,A]),O=useCallback(()=>{let r={};return u&&A().forEach(e=>{if(!e.required)return;let s=o[e.id];s==null||typeof s=="string"&&s.trim()===""?r[e.id]="This question is required":Array.isArray(s)&&s.length===0&&(r[e.id]="At least one option must be selected");}),r},[o,u,A]),U=useCallback(()=>D()&&f<a$2.length-1?(m(r=>r+1),true):false,[f,a$2.length,D]),B=useCallback(()=>f>0?(m(r=>r-1),true):false,[f]),F=useCallback(r=>r>=0&&r<a$2.length?(m(r),true):false,[a$2.length]),W=useCallback(()=>a$2.every(r=>r.questions.filter(p).every(e=>{if(!e.required)return true;let s=o[e.id];return !(s==null||typeof s=="string"&&s.trim()===""||Array.isArray(s)&&s.length===0)})),[o,a$2,p]),k=useCallback(()=>{let r=[];return a$2.forEach(t=>{t.questions.forEach(e=>{let s=o[e.id];if(s!=null&&e.riskLevel)if(["select","radio","checkbox"].includes(e.type)&&e.options)(Array.isArray(s)?s:[s]).forEach(l=>{var R;let c=(R=e.options)==null?void 0:R.find(d=>d.value===l);if(c!=null&&c.riskLevel){let d=c.riskLevel,Q=d==="low"?1:d==="medium"?3:5,L=d==="low"?1:d==="medium"?3:5;r.push({id:`risk_${r.length+1}`,description:`${e.text} - ${c.label}`,likelihood:Q,impact:L,score:Q*L,level:d,mitigated:false,relatedQuestionIds:[e.id]});}});else {let n=e.riskLevel,l=n==="low"?1:n==="medium"?3:5,c=n==="low"?1:n==="medium"?3:5;r.push({id:`risk_${r.length+1}`,description:e.text,likelihood:l,impact:c,score:l*c,level:n,mitigated:false,relatedQuestionIds:[e.id]});}});}),r},[o,a$2]),K=useCallback((r,t,e)=>{let s=k(),n={id:`dpia_${Date.now()}`,title:t,processingDescription:e,startedAt:Date.now(),completedAt:Date.now(),assessor:r,answers:o,risks:s,overallRiskLevel:"low",canProceed:true,conclusion:"",version:"1.0"},l=a$1(n);return n.overallRiskLevel=l.overallRiskLevel,n.canProceed=l.canProceed,n.conclusion=l.canProceed?"Based on the assessment, the processing can proceed with appropriate safeguards.":"Based on the assessment, the processing should not proceed without further mitigation measures.",n.recommendations=l.recommendations,w&&w(n),n},[o,k,w]),j=useCallback(()=>{v({}),m(0),Promise.resolve(g.current.remove()).catch(r=>{console.warn("[ndpr-toolkit] Failed to remove DPIA data:",r);});},[]),z=(()=>{let r=0,t=0;return a$2.forEach(e=>{e.questions.forEach(s=>{if(s.required&&p(s)){t++;let n=o[s.id];n!=null&&!(typeof n=="string"&&n.trim()==="")&&!(Array.isArray(n)&&n.length===0)&&r++;}});}),t>0?Math.round(r/t*100):0})();return {currentSectionIndex:f,currentSection:u,answers:o,updateAnswer:$,nextSection:U,prevSection:B,goToSection:F,isCurrentSectionValid:D,getCurrentSectionErrors:O,isComplete:W,completeDPIA:K,getVisibleQuestions:A,resetDPIA:j,progress:z,isLoading:_}}export{Z as a};