import { ChallengeFeedback } from "anastasis-core"; import { h, VNode } from "preact"; import { useAnastasisContext } from "../../context/anastasis"; import { AnastasisClientFrame } from "./index"; export function ChallengeOverviewScreen(): VNode { const reducer = useAnastasisContext() if (!reducer) { return
no reducer in context
} if (!reducer.currentReducerState || reducer.currentReducerState.recovery_state === undefined) { return
invalid state
} const policies = reducer.currentReducerState.recovery_information?.policies ?? []; const knownChallengesArray = reducer.currentReducerState.recovery_information?.challenges ?? []; const challengeFeedback = reducer.currentReducerState?.challenge_feedback ?? {}; const knownChallengesMap: { [uuid: string]: { type: string; instructions: string; cost: string; feedback: ChallengeFeedback | undefined; }; } = {}; for (const ch of knownChallengesArray) { knownChallengesMap[ch.uuid] = { type: ch.type, cost: ch.cost, instructions: ch.instructions, feedback: challengeFeedback[ch.uuid] }; } const policiesWithInfo = policies.map(row => { let isPolicySolved = true const challenges = row.map(({ uuid }) => { const info = knownChallengesMap[uuid]; const isChallengeSolved = info?.feedback?.state === 'solved' isPolicySolved = isPolicySolved && isChallengeSolved return { info, uuid, isChallengeSolved } }).filter(ch => ch.info !== undefined) return { isPolicySolved, challenges } }) const atLeastThereIsOnePolicySolved = policiesWithInfo.find(p => p.isPolicySolved) !== undefined return ( {!policies.length ?

No policies found, try with another version of the secret

: (policies.length === 1 ?

One policy found for this secret. You need to solve all the challenges in order to recover your secret.

:

We have found {policies.length} polices. You need to solve all the challenges from one policy in order to recover your secret.

)} {policiesWithInfo.map((row, i) => { const tableBody = row.challenges.map(({ info, uuid }) => { return ( {info.type} {info.instructions} {info.feedback?.state ?? "unknown"} {info.cost} {info.feedback?.state !== "solved" ? ( reducer.transition("select_challenge", { uuid })}> Solve ) : null} ); }) return (
Policy #{i + 1} {row.challenges.length === 0 &&

This policy doesn't have challenges

} {row.challenges.length === 1 &&

This policy just have one challenge to be solved

} {row.challenges.length > 1 &&

This policy have {row.challenges.length} challenges

} {tableBody}
Challenge type Description Status Cost
); })}
); }