/* eslint-disable @typescript-eslint/camelcase */ import { AuthMethod, Policy } from "anastasis-core"; import { h, VNode } from "preact"; import { useState } from "preact/hooks"; import { useAnastasisContext } from "../../context/anastasis"; import { authMethods, KnownAuthMethods } from "./authMethod"; import { AnastasisClientFrame } from "./index"; export interface ProviderInfo { url: string; cost: string; isFree: boolean; } export type ProviderInfoByType = { [type in KnownAuthMethods]?: ProviderInfo[]; }; interface Props { index: number; cancel: () => void; confirm: (changes: MethodProvider[]) => void; } export interface MethodProvider { authentication_method: number; provider: string; } export function EditPoliciesScreen({ index: policy_index, cancel, confirm }: Props): VNode { const [changedProvider, setChangedProvider] = useState>([]) const reducer = useAnastasisContext() if (!reducer) { return
no reducer in context
} if (!reducer.currentReducerState || reducer.currentReducerState.backup_state === undefined) { return
invalid state
} const selectableProviders: ProviderInfoByType = {} const allProviders = Object.entries(reducer.currentReducerState.authentication_providers || {}) for (let index = 0; index < allProviders.length; index++) { const [url, status] = allProviders[index] if ("methods" in status) { status.methods.map(m => { const type: KnownAuthMethods = m.type as KnownAuthMethods const values = selectableProviders[type] || [] const isFree = !m.usage_fee || m.usage_fee.endsWith(":0") values.push({ url, cost: m.usage_fee, isFree }) selectableProviders[type] = values }) } } const allAuthMethods = reducer.currentReducerState.authentication_methods ?? []; const policies = reducer.currentReducerState.policies ?? []; const policy = policies[policy_index] for(let method_index = 0; method_index < allAuthMethods.length; method_index++ ) { policy?.methods.find(m => m.authentication_method === method_index)?.provider } function sendChanges(): void { const newMethods: MethodProvider[] = [] allAuthMethods.forEach((method, index) => { const oldValue = policy?.methods.find(m => m.authentication_method === index) if (changedProvider[index] === undefined && oldValue !== undefined) { newMethods.push(oldValue) } if (changedProvider[index] !== undefined && changedProvider[index] !== "") { newMethods.push({ authentication_method: index, provider: changedProvider[index] }) } }) confirm(newMethods) } return
{!policy ?

Creating a new policy #{policy_index}

:

Editing policy #{policy_index}

} {allAuthMethods.map((method, index) => { //take the url from the updated change or from the policy const providerURL = changedProvider[index] === undefined ? policy?.methods.find(m => m.authentication_method === index)?.provider : changedProvider[index]; const type: KnownAuthMethods = method.type as KnownAuthMethods function changeProviderTo(url: string): void { const copy = [...changedProvider] copy[index] = url setChangedProvider(copy) } return (
{authMethods[type]?.icon} {method.instructions}
); })}
}