From 32318a80f48bf52ca7823a0c055164f43bdaf1d6 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 27 Oct 2021 15:13:35 -0300 Subject: working version with improved ui --- .../src/pages/home/ChallengeOverviewScreen.tsx | 118 +++++++++++++-------- 1 file changed, 74 insertions(+), 44 deletions(-) (limited to 'packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx') diff --git a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx index c9b52e91b..3bb3fb837 100644 --- a/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx @@ -1,3 +1,4 @@ +import { ChallengeFeedback } from "anastasis-core"; import { h, VNode } from "preact"; import { useAnastasisContext } from "../../context/anastasis"; import { AnastasisClientFrame } from "./index"; @@ -13,65 +14,94 @@ export function ChallengeOverviewScreen(): VNode { } const policies = reducer.currentReducerState.recovery_information?.policies ?? []; - const chArr = reducer.currentReducerState.recovery_information?.challenges ?? []; - const challengeFeedback = reducer.currentReducerState?.challenge_feedback; + const knownChallengesArray = reducer.currentReducerState.recovery_information?.challenges ?? []; + const challengeFeedback = reducer.currentReducerState?.challenge_feedback ?? {}; - const challenges: { + const knownChallengesMap: { [uuid: string]: { type: string; instructions: string; cost: string; + feedback: ChallengeFeedback | undefined; }; } = {}; - for (const ch of chArr) { - challenges[ch.uuid] = { + 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

- {!policies.length &&

- No policies found -

} - {policies.map((row, i) => { + + {!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.map(column => { - const ch = challenges[column.uuid]; - if (!ch) return
- There is no challenge for this policy -
- const feedback = challengeFeedback?.[column.uuid]; - return ( -
-

- {ch.type} ({ch.instructions}) -

-

Status: {feedback?.state ?? "unknown"}

- {feedback?.state !== "solved" ? ( - - ) : null} -
- ); - })} + 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 typeDescriptionStatusCost
); })} -- cgit v1.2.3