Skip to content

fix(web): update-alias-to-object #1629

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 9 additions & 11 deletions web/src/components/DisputePreview/Alias.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ import Skeleton from "react-loading-skeleton";
import { isAddress } from "viem";
import { useEnsAddress } from "wagmi";

import { Alias } from "context/NewDisputeContext";
import { isUndefined } from "utils/index";

import { AddressOrName, IdenticonOrAvatar } from "../ConnectWallet/AccountDisplay";

const AliasContainer = styled.div`
Expand All @@ -26,28 +23,29 @@ const TextContainer = styled.div`
`;

interface IAlias {
alias: Alias;
name: string;
address: `0x${string}`;
}

const AliasDisplay: React.FC<IAlias> = ({ alias }) => {
const AliasDisplay: React.FC<IAlias> = ({ name, address }) => {
const { data: addressFromENS, isLoading } = useEnsAddress({
query: {
// if alias.address is not an Address, we treat it as ENS and try to fetch address from there
enabled: !isAddress(alias.address),
enabled: !isAddress(address),
},
name: alias.address,
name: address,
chainId: 1,
});

// try fetching ens name, else go with address
const address = addressFromENS ?? (alias.address as `0x${string}`);
const resolvedAddress = addressFromENS ?? (address as `0x${string}`);

return (
<AliasContainer>
{isLoading ? <Skeleton width={30} height={24} /> : <IdenticonOrAvatar address={address} size="24" />}
{isLoading ? <Skeleton width={30} height={24} /> : <IdenticonOrAvatar address={resolvedAddress} size="24" />}
<TextContainer>
{isLoading ? <Skeleton width={30} height={24} /> : <AddressOrName address={address} />}&nbsp;
{!isUndefined(alias.name) && alias.name !== "" ? <label>({alias.name})</label> : null}
{isLoading ? <Skeleton width={30} height={24} /> : <AddressOrName address={resolvedAddress} />}&nbsp;
<label>({name})</label>
</TextContainer>
</AliasContainer>
);
Expand Down
4 changes: 2 additions & 2 deletions web/src/components/DisputePreview/DisputeContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ export const DisputeContext: React.FC<IDisputeContext> = ({ disputeDetails, isRp
<>
<Divider />
<AliasesContainer>
{disputeDetails.aliases.map((alias) => (
<AliasDisplay alias={alias} key={alias.address} />
{Object.keys(disputeDetails.aliases).map((key) => (
<AliasDisplay name={key} key={key} address={disputeDetails.aliases[key]} />
))}
</AliasesContainer>
</>
Expand Down
27 changes: 19 additions & 8 deletions web/src/context/NewDisputeContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@ export type Answer = {
reserved?: boolean;
};

export type Alias = {
export type AliasArray = {
id?: string;
name: string;
address: string | Address;
isValid?: boolean;
};

export type Alias = Record<string, string>;
export interface IDisputeTemplate {
answers: Answer[];
aliases?: Alias[];
arbitrableAddress?: string;
arbitrableChainID?: string;
arbitratorAddress?: string;
Expand All @@ -34,6 +34,7 @@ export interface IDisputeTemplate {
question: string;
specification?: string;
title: string;
aliases?: Alias;
// attachment: Attachment;
// type: string;
}
Expand All @@ -42,6 +43,7 @@ interface IDisputeData extends IDisputeTemplate {
courtId?: string;
numberOfJurors: number;
arbitrationCost?: string;
aliasesArray?: AliasArray[];
}

interface INewDisputeContext {
Expand All @@ -64,7 +66,7 @@ const initialDisputeData: IDisputeData = {
{ title: "", id: "1" },
{ title: "", id: "2" },
],
aliases: [
aliasesArray: [
{ name: "", address: "", id: "1" },
{ name: "", address: "", id: "2" },
],
Expand Down Expand Up @@ -113,13 +115,22 @@ export const NewDisputeProvider: React.FC<{ children: React.ReactNode }> = ({ ch
};

const constructDisputeTemplate = (disputeData: IDisputeData) => {
const baseTemplate = { ...disputeData } as IDisputeTemplate;
const baseTemplate = { ...disputeData };

if (!isUndefined(baseTemplate.aliases)) {
baseTemplate.aliases = baseTemplate.aliases.filter((item) => item.address !== "" && item.isValid);
if (baseTemplate.aliases.length === 0) delete baseTemplate.aliases;
if (!isUndefined(baseTemplate.aliasesArray)) {
baseTemplate.aliasesArray = baseTemplate.aliasesArray.filter((item) => item.address !== "" && item.isValid);
if (baseTemplate.aliasesArray.length === 0) delete baseTemplate.aliasesArray;
else {
const aliases: Alias = {};

for (const alias of baseTemplate.aliasesArray) {
aliases[alias.name] = alias.address;
}

baseTemplate.aliases = aliases;
}
}
if (!isUndefined(baseTemplate.policyURI) && baseTemplate.policyURI === "") delete baseTemplate.policyURI;

return baseTemplate;
return baseTemplate as IDisputeTemplate;
};
4 changes: 3 additions & 1 deletion web/src/pages/Resolver/NavigationButtons/NextButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ const NextButton: React.FC<INextButton> = ({ nextRoute }) => {
disputeData.question !== "" && disputeData.answers.every((answer) => answer.title !== "");

//check if any filled address or ens is invalid
const areFilledAddressesValid = disputeData?.aliases?.every((alias) => alias.address === "" || alias.isValid);
const areFilledAddressesValid = disputeData?.aliasesArray?.every(
(alias) => alias.address !== "" && alias.isValid && alias.name !== ""
);

const isButtonDisabled =
(location.pathname.includes("/resolver/title") && !disputeData.title) ||
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import styled, { css } from "styled-components";

import { usePublicClient } from "wagmi";

import { Alias, useNewDisputeContext } from "context/NewDisputeContext";
import { AliasArray, useNewDisputeContext } from "context/NewDisputeContext";
import { isUndefined } from "utils/index";
import { validateAddress } from "utils/validateAddressOrEns";

Expand Down Expand Up @@ -41,7 +41,7 @@ const AliasContainer = styled.div`
const PersonFields: React.FC = () => {
const { disputeData, setDisputeData } = useNewDisputeContext();
const validationTimerRef = useRef<NodeJS.Timeout | null>(null);
const publicClient = usePublicClient();
const publicClient = usePublicClient({ chainId: 1 });

const debounceValidateAddress = (address: string, key: number) => {
// Clear the existing timer
Expand All @@ -52,32 +52,32 @@ const PersonFields: React.FC = () => {
// Set a new timer for validation after 500 milliseconds
validationTimerRef.current = setTimeout(async () => {
const isValid = await validateAddress(address, publicClient);
const updatedAliases = disputeData.aliases;
const updatedAliases = disputeData.aliasesArray;
if (isUndefined(updatedAliases) || isUndefined(updatedAliases[key])) return;
updatedAliases[key].isValid = isValid;

setDisputeData({ ...disputeData, aliases: updatedAliases });
setDisputeData({ ...disputeData, aliasesArray: updatedAliases });
}, 500);
};
const handleAliasesWrite = (event: React.ChangeEvent<HTMLInputElement>) => {
const key = parseInt(event.target.id.replace(/\D/g, ""), 10) - 1;
const aliases = disputeData.aliases;
const aliases = disputeData.aliasesArray;
if (isUndefined(aliases)) return;

aliases[key] = { ...aliases[key], [event.target.name]: event.target.value };
setDisputeData({ ...disputeData, aliases });
setDisputeData({ ...disputeData, aliasesArray: aliases });

//since resolving ens is async, we update asynchronously too with debounce
event.target.name === "address" && debounceValidateAddress(event.target.value, key);
};

const showError = (alias: Alias) => {
const showError = (alias: AliasArray) => {
return alias.address !== "" && !alias.isValid;
};

return (
<Container>
{disputeData.aliases?.map((alias, index) => (
{disputeData.aliasesArray?.map((alias, index) => (
<AliasContainer key={alias?.id}>
<LabeledInput
name="name"
Expand Down
12 changes: 6 additions & 6 deletions web/src/pages/Resolver/Parameters/NotablePersons/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,22 +26,22 @@ const NotablePersons: React.FC = () => {

//value here is the total number of fields-
const updateNumberOfAliases = (value: number) => {
let defaultAlias = { name: "", address: "", id: value.toString() };
let aliases = disputeData.aliases;
const defaultAlias = { name: "", address: "", id: value.toString() };
const aliases = disputeData.aliasesArray;

if (isUndefined(aliases)) {
return setDisputeData({ ...disputeData, aliases: [defaultAlias] });
return setDisputeData({ ...disputeData, aliasesArray: [defaultAlias] });
}
if (value < aliases?.length) return setDisputeData({ ...disputeData, aliases: aliases.splice(0, value) });
if (value > aliases?.length) return setDisputeData({ ...disputeData, aliases: [...aliases, defaultAlias] });
if (value < aliases?.length) return setDisputeData({ ...disputeData, aliasesArray: aliases.splice(0, value) });
if (value > aliases?.length) return setDisputeData({ ...disputeData, aliasesArray: [...aliases, defaultAlias] });
};

return (
<Container>
<Header text="Notable Persons" />
<PersonFields />
<StyledPlusMinusField
currentValue={disputeData.aliases?.length ?? 2}
currentValue={disputeData.aliasesArray?.length ?? 2}
updateValue={updateNumberOfAliases}
minValue={2}
/>
Expand Down
Loading