aboutsummaryrefslogtreecommitdiff
path: root/packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2021-10-27 15:13:35 -0300
committerSebastian <sebasjm@gmail.com>2021-10-27 15:13:35 -0300
commit32318a80f48bf52ca7823a0c055164f43bdaf1d6 (patch)
tree08ef42e65d1db93f3958dd75d39f4bff1d03d2b6 /packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx
parent21b60c8f6ff69bf114779a767a3ac3355f69a34f (diff)
downloadwallet-core-32318a80f48bf52ca7823a0c055164f43bdaf1d6.tar.xz
working version with improved ui
Diffstat (limited to 'packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx')
-rw-r--r--packages/anastasis-webui/src/pages/home/ChallengeOverviewScreen.tsx118
1 files changed, 74 insertions, 44 deletions
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 (
- <AnastasisClientFrame title="Recovery: Solve challenges">
- <h2>Policies</h2>
- {!policies.length && <p>
- No policies found
- </p>}
- {policies.map((row, i) => {
+ <AnastasisClientFrame hideNext={!atLeastThereIsOnePolicySolved} title="Recovery: Solve challenges">
+ {!policies.length ? <p>
+ No policies found, try with another version of the secret
+ </p> : (policies.length === 1 ? <p>
+ One policy found for this secret. You need to solve all the challenges in order to recover your secret.
+ </p> : <p>
+ We have found {policies.length} polices. You need to solve all the challenges from one policy in order
+ to recover your secret.
+ </p>)}
+ {policiesWithInfo.map((row, i) => {
+ const tableBody = row.challenges.map(({ info, uuid }) => {
+ return (
+ <tr key={uuid}>
+ <td>{info.type}</td>
+ <td>
+ {info.instructions}
+ </td>
+ <td>{info.feedback?.state ?? "unknown"}</td>
+ <td>{info.cost}</td>
+ <td>
+ {info.feedback?.state !== "solved" ? (
+ <a onClick={() => reducer.transition("select_challenge", { uuid })}>
+ Solve
+ </a>
+ ) : null}
+ </td>
+ </tr>
+ );
+ })
return (
<div key={i}>
- <h3>Policy #{i + 1}</h3>
- {row.map(column => {
- const ch = challenges[column.uuid];
- if (!ch) return <div>
- There is no challenge for this policy
- </div>
- const feedback = challengeFeedback?.[column.uuid];
- return (
- <div key={column.uuid}
- style={{
- borderLeft: "2px solid gray",
- paddingLeft: "0.5em",
- borderRadius: "0.5em",
- marginTop: "0.5em",
- marginBottom: "0.5em",
- }}
- >
- <h4>
- {ch.type} ({ch.instructions})
- </h4>
- <p>Status: {feedback?.state ?? "unknown"}</p>
- {feedback?.state !== "solved" ? (
- <button
- onClick={() => reducer.transition("select_challenge", {
- uuid: column.uuid,
- })}
- >
- Solve
- </button>
- ) : null}
- </div>
- );
- })}
+ <b>Policy #{i + 1}</b>
+ {row.challenges.length === 0 && <p>
+ This policy doesn't have challenges
+ </p>}
+ {row.challenges.length === 1 && <p>
+ This policy just have one challenge to be solved
+ </p>}
+ {row.challenges.length > 1 && <p>
+ This policy have {row.challenges.length} challenges
+ </p>}
+ <table class="table">
+ <thead>
+ <tr>
+ <td>Challenge type</td>
+ <td>Description</td>
+ <td>Status</td>
+ <td>Cost</td>
+ </tr>
+ </thead>
+ <tbody>
+ {tableBody}
+ </tbody>
+ </table>
</div>
);
})}