159 lines
5.7 KiB
TypeScript
159 lines
5.7 KiB
TypeScript
/* eslint-disable @typescript-eslint/camelcase */
|
|
import { BackupStates, RecoveryStates } from "@gnu-taler/anastasis-core";
|
|
import { h, VNode } from "preact";
|
|
import { useState } from "preact/hooks";
|
|
import { useAnastasisContext } from "../../context/anastasis";
|
|
import { AnastasisClientFrame, withProcessLabel } from "./index";
|
|
|
|
export function ContinentSelectionScreen(): VNode {
|
|
const reducer = useAnastasisContext();
|
|
|
|
// FIXME: remove this when #7056 is fixed
|
|
const countryFromReducer =
|
|
(reducer?.currentReducerState as any).selected_country || "";
|
|
const [countryCode, setCountryCode] = useState(countryFromReducer);
|
|
|
|
if (
|
|
!reducer ||
|
|
!reducer.currentReducerState ||
|
|
!("continents" in reducer.currentReducerState)
|
|
) {
|
|
return <div />;
|
|
}
|
|
const selectContinent = (continent: string): void => {
|
|
reducer.transition("select_continent", { continent });
|
|
};
|
|
const selectCountry = (country: string): void => {
|
|
setCountryCode(country);
|
|
};
|
|
|
|
const continentList = reducer.currentReducerState.continents || [];
|
|
const countryList = reducer.currentReducerState.countries || [];
|
|
const theContinent = reducer.currentReducerState.selected_continent || "";
|
|
// const cc = reducer.currentReducerState.selected_country || "";
|
|
const theCountry = countryList.find((c) => c.code === countryCode);
|
|
const selectCountryAction = async () => {
|
|
//selection should be when the select box changes it value
|
|
if (!theCountry) return;
|
|
reducer.transition("select_country", {
|
|
country_code: countryCode,
|
|
});
|
|
};
|
|
|
|
// const step1 = reducer.currentReducerState.backup_state === BackupStates.ContinentSelecting ||
|
|
// reducer.currentReducerState.recovery_state === RecoveryStates.ContinentSelecting;
|
|
|
|
const errors = !theCountry ? "Select a country" : undefined;
|
|
|
|
const handleBack = async () => {
|
|
// We want to go to the start, even if we already selected
|
|
// a country.
|
|
// FIXME: What if we don't want to lose all information here?
|
|
// Can we do some kind of soft reset?
|
|
reducer.reset();
|
|
};
|
|
|
|
return (
|
|
<AnastasisClientFrame
|
|
hideNext={errors}
|
|
title={withProcessLabel(reducer, "Where do you live?")}
|
|
onNext={selectCountryAction}
|
|
onBack={handleBack}
|
|
>
|
|
<div class="columns">
|
|
<div class="column is-one-third">
|
|
<div class="field">
|
|
<label class="label">Continent</label>
|
|
<div class="control is-expanded has-icons-left">
|
|
<div class="select is-fullwidth">
|
|
<select
|
|
onChange={(e) => selectContinent(e.currentTarget.value)}
|
|
value={theContinent}
|
|
>
|
|
<option key="none" disabled selected value="">
|
|
{" "}
|
|
Choose a continent{" "}
|
|
</option>
|
|
{continentList.map((prov) => (
|
|
<option key={prov.name} value={prov.name}>
|
|
{prov.name}
|
|
</option>
|
|
))}
|
|
</select>
|
|
<div class="icon is-small is-left">
|
|
<i class="mdi mdi-earth" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="field">
|
|
<label class="label">Country</label>
|
|
<div class="control is-expanded has-icons-left">
|
|
<div class="select is-fullwidth">
|
|
<select
|
|
onChange={(e) => selectCountry((e.target as any).value)}
|
|
disabled={!theContinent}
|
|
value={theCountry?.code || ""}
|
|
>
|
|
<option key="none" disabled selected value="">
|
|
{" "}
|
|
Choose a country{" "}
|
|
</option>
|
|
{countryList.map((prov) => (
|
|
<option key={prov.name} value={prov.code}>
|
|
{prov.name}
|
|
</option>
|
|
))}
|
|
</select>
|
|
<div class="icon is-small is-left">
|
|
<i class="mdi mdi-earth" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* {theCountry && <div class="field">
|
|
<label class="label">Available currencies:</label>
|
|
<div class="control">
|
|
<input class="input is-small" type="text" readonly value={theCountry.currency} />
|
|
</div>
|
|
</div>} */}
|
|
</div>
|
|
<div class="column is-two-third">
|
|
<p>
|
|
Your selection will help us ask right information to uniquely
|
|
identify you when you want to recover your secret again.
|
|
</p>
|
|
<p>
|
|
Choose the country that issued most of your long-term legal
|
|
documents or personal identifiers.
|
|
</p>
|
|
<div
|
|
style={{
|
|
border: "1px solid gray",
|
|
borderRadius: "0.5em",
|
|
backgroundColor: "#fbfcbd",
|
|
padding: "0.5em",
|
|
}}
|
|
>
|
|
<p>
|
|
If you just want to try out Anastasis, we recomment that you
|
|
choose <b>Testcontinent</b> with <b>Demoland</b>. For this special
|
|
country, you will be asked for a simple number and not real,
|
|
personal identifiable information.
|
|
</p>
|
|
{/*
|
|
<p>
|
|
Because of the diversity of personally identifying information in
|
|
different countries and cultures, we do not support all countries
|
|
yet. If you want to improve the supported countries,{" "}
|
|
<a href="mailto:contact@anastasis.lu">contact us</a>.
|
|
</p> */}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</AnastasisClientFrame>
|
|
);
|
|
}
|