Skip to content

Commit

Permalink
fix: using states instead of saving on url
Browse files Browse the repository at this point in the history
  • Loading branch information
mikarasv committed May 7, 2024
1 parent 95b81fe commit 29c2453
Show file tree
Hide file tree
Showing 8 changed files with 270 additions and 190 deletions.
2 changes: 1 addition & 1 deletion web/app/components/Input.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export const Input = ({
if (isCheckbox) {
return (
<div className="w-full text-left flex justify-between p-2">
<label htmlFor={id} className="text-xl select-none">
<label htmlFor={id} className="text-xl select-none cursor-pointer">
{label}
</label>
<div className="relative inline-block w-10 mr-4 align-top select-none">
Expand Down
54 changes: 12 additions & 42 deletions web/app/components/RootSection.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,17 @@
import { useLocation } from "@remix-run/react";
import { Section } from "napi-pallas";
import { useState } from "react";
import { EraType } from "~/interfaces";
import { EraType, IUiConfigs } from "~/interfaces";
import { ExampleCard } from "~/routes/tx";
import { SearchParams, exampleCbor, getTopicMeta } from "~/utils";
import { exampleCbor, getTopicMeta } from "~/utils";
import { HexBlock, PropBlock, TopicMeta } from "./constructors";
import { DataSection, ValidationInformation } from "./index";

export function RootSection(props: {
data: Section;
topics: Record<string, TopicMeta>;
era: EraType;
uiConfigs: IUiConfigs;
}) {
const location = useLocation();
const searchParams = new URLSearchParams(location.search);
const initialOpen = searchParams.get(SearchParams.OPEN) === "true";
const goesBeginning = searchParams.get(SearchParams.BEGINNING) === "true";
const [open, setOpen] = useState<boolean>(initialOpen);
const handleClick = () => setOpen(!open);
const goesBeginning = props.uiConfigs.beginning;
const topic = getTopicMeta(props.data.topic, props.topics);

if (props.data.error)
Expand All @@ -39,22 +33,10 @@ export function RootSection(props: {
return (
<div className="flex flex-col">
{goesBeginning && (
<div className="mb-14">
<button
className={`flex items-center w-full text-left select-none duration-300`}
onClick={handleClick}
>
<div
className={`h-8 w-8 inline-flex items-center justify-center duration-300 `}
>
{open ?? initialOpen ? "▼" : "▶"}
</div>
<div className="flex justify-between w-full">
<h4 className="text-3xl ">Tx Validations - {props.era}</h4>
</div>
</button>
{open && <ValidationInformation />}
</div>
<ValidationInformation
era={props.era}
initialOpen={props.uiConfigs.alwaysOpen}
/>
)}
<h4 className="text-3xl">{topic.title}</h4>
{!!props.data.bytes && (
Expand All @@ -67,22 +49,10 @@ export function RootSection(props: {
<DataSection key={c.identity} data={c} topics={props.topics} />
))}
{!goesBeginning && (
<div className="mb-14">
<button
className={`flex items-center w-full text-left select-none duration-300`}
onClick={handleClick}
>
<div
className={`h-8 w-8 inline-flex items-center justify-center duration-300 `}
>
{open ?? initialOpen ? "▼" : "▶"}
</div>
<div className="flex justify-between w-full">
<h4 className="text-3xl ">Tx Validations - {props.era}</h4>
</div>
</button>
{open && <ValidationInformation />}
</div>
<ValidationInformation
era={props.era}
initialOpen={props.uiConfigs.alwaysOpen}
/>
)}
</div>
);
Expand Down
17 changes: 12 additions & 5 deletions web/app/components/Validations/Configurations/Configurations.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
import { useEffect, useState } from "react";
import { Dispatch, SetStateAction, useEffect, useState } from "react";
import { Button } from "~/components/Button";
import { IProtocolParam, TabNames, TabType } from "~/interfaces";
import { IProtocolParam, IUiConfigs, TabNames, TabType } from "~/interfaces";
import { ContextTab } from "./ContextTab";
import { UITab } from "./UITab";

interface ConfigsModalProps {
closeModal: () => void;
latestParams: IProtocolParam[] | undefined;
uiConfigs: IUiConfigs;
setUiConfigs: Dispatch<SetStateAction<IUiConfigs>>;
}

export function ConfigsModal({ closeModal, latestParams }: ConfigsModalProps) {
export function ConfigsModal({
closeModal,
latestParams,
uiConfigs,
setUiConfigs,
}: ConfigsModalProps) {
const tabs: TabType[] = [TabNames.Context, TabNames.UI_Options];
const [selected, setSelected] = useState<TabType>(TabNames.Context);

Expand All @@ -31,7 +38,7 @@ export function ConfigsModal({ closeModal, latestParams }: ConfigsModalProps) {

return (
<div className="fixed inset-0 z-10 w-screen overflow-y-auto">
<div className="fixed inset-0 bg-gray-500 bg-opacity-70" />
<div className="fixed inset-0 bg-gray-500 bg-opacity-90" />
<div className="relative flex min-h-screen items-center justify-center p-4">
<div className="relative w-3/4 text-center ring-2 ring-inset ring-black text-black bg-white shadow-small rounded-xl p-8">
<h3 className="text-4xl">Tx Validation Configurations</h3>
Expand Down Expand Up @@ -71,7 +78,7 @@ export function ConfigsModal({ closeModal, latestParams }: ConfigsModalProps) {
selected == TabNames.UI_Options ? "block" : "hidden"
}`}
>
<UITab />
<UITab uiConfigs={uiConfigs} setUiConfigs={setUiConfigs} />
</div>
</div>
</div>
Expand Down
173 changes: 104 additions & 69 deletions web/app/components/Validations/Configurations/UITab.tsx
Original file line number Diff line number Diff line change
@@ -1,89 +1,124 @@
import { useLocation, useNavigate } from "@remix-run/react";
import { useContext } from "react";
import { Dispatch, SetStateAction, useContext, useEffect } from "react";
import { Input } from "~/components/Input";
import { ValidationsContext } from "~/contexts/validations.context";
import { SearchParams } from "~/utils";
import { Eras, IUiConfigs } from "~/interfaces";
import {
AlonzoValidations,
BabbageValidations,
ByronValidations,
ShelleyMAValidations,
UIOptions,
} from "~/utils";

export const UITab = () => {
const { validations } = useContext(ValidationsContext);
const navigate = useNavigate();
const location = useLocation();
const shownValidations =
new URLSearchParams(location.search).get(SearchParams.LIST)?.split(",") ??
[];
export const UITab = ({
uiConfigs,
setUiConfigs,
}: {
uiConfigs: IUiConfigs;
setUiConfigs: Dispatch<SetStateAction<IUiConfigs>>;
}) => {
const { context, validations: contextValidations } =
useContext(ValidationsContext);

useEffect(() => {
let newValidations = contextValidations.map((v) => v.name);
switch (context.selectedEra) {
case Eras.Byron:
newValidations = ByronValidations;
break;
case Eras.ShelleyMA:
newValidations = ShelleyMAValidations;
break;
case Eras.Alonzo:
newValidations = AlonzoValidations;
break;
case Eras.Babbage:
newValidations = BabbageValidations;
break;
}
setUiConfigs((prev) => ({
...prev,
validationsToSee: newValidations,
}));
}, [context.selectedEra]);

const changeValidations =
(validation: string) => (event: React.ChangeEvent<HTMLInputElement>) => {
const isChecked = !event.target.checked;
const newSearchParams = new URLSearchParams(location.search);
const currentValues =
newSearchParams.get(SearchParams.LIST)?.split(",") ?? [];

if (isChecked && !currentValues.includes(validation)) {
currentValues.push(validation);
} else {
const index = currentValues.indexOf(validation);
if (index > -1) currentValues.splice(index, 1);
}

if (currentValues.length > 0)
newSearchParams.set(SearchParams.LIST, currentValues.join(","));
else newSearchParams.delete(SearchParams.LIST);

navigate(`?${newSearchParams.toString()}`);
const isChecked = event.target.checked;
setUiConfigs((prev) => ({
...prev,
validationsToSee: isChecked
? prev.validationsToSee.includes(validation)
? prev.validationsToSee
: [...prev.validationsToSee, validation]
: prev.validationsToSee.filter((v) => v !== validation),
}));
};

const changeQuery =
(q: SearchParams) => (e: React.ChangeEvent<HTMLInputElement>) => {
const changeUIOptions =
(q: UIOptions) => (e: React.ChangeEvent<HTMLInputElement>) => {
const isChecked = e.target.checked;
const newSearchParams = new URLSearchParams(location.search);

newSearchParams.set(q, `${isChecked}`);

navigate(`?${newSearchParams.toString()}`, { replace: true });
setUiConfigs((prev) => ({ ...prev, [q]: isChecked }));
};

const searchParams = new URLSearchParams(location.search);
const initialOpen = searchParams.get(SearchParams.OPEN) === "true";
const beginning = searchParams.get(SearchParams.BEGINNING) === "true";
const initialOpen = uiConfigs.alwaysOpen;
const beginning = uiConfigs.beginning;

const validations =
context.selectedEra === Eras.Byron
? ByronValidations
: context.selectedEra === Eras.ShelleyMA
? ShelleyMAValidations
: context.selectedEra === Eras.Alonzo
? AlonzoValidations
: context.selectedEra === Eras.Babbage
? BabbageValidations
: [];

return (
<div className="flex flex-col overflow-y-auto h-96">
<div className="text-left text-3xl mb-3">Select validations to show</div>
{validations.map((validation, index, arr) => (
<div key={validation.name}>
<Input
name={validation.name}
id={validation.name}
label={validation.name}
isCheckbox
checked={shownValidations.includes(validation.name)}
onChange={changeValidations(validation.name)}
/>
{index !== arr.length - 1 && <hr />}
<div
className={`${
context.selectedEra === Eras.Conway ? "hidden" : "block"
}`}
>
<div className="text-left text-3xl mb-3">
Select validations to show
</div>
))}
<hr className="border-2 border-black my-4" />
<div>
<div className="text-left text-3xl mt-3">Others</div>
{validations.map((validation, index, arr) => (
<div key={validation}>
<Input
name={validation}
id={validation}
label={validation}
isCheckbox
checked={uiConfigs.validationsToSee.includes(validation)}
onChange={changeValidations(validation)}
/>
{index !== arr.length - 1 && <hr />}
</div>
))}

<Input
name={"alwaysOpen"}
id={"alwaysOpen"}
label={"Validations section always open"}
isCheckbox
checked={initialOpen}
onChange={changeQuery(SearchParams.OPEN)}
/>
<Input
name={"beginning"}
id={"beginning"}
label={"Show at beginning"}
isCheckbox
checked={beginning}
onChange={changeQuery(SearchParams.BEGINNING)}
/>
<hr className="border-2 border-black my-4" />
</div>
<div className="text-left text-3xl mt-3">Others</div>

<Input
name={"alwaysOpen"}
id={"alwaysOpen"}
label={"Validations section always open"}
isCheckbox
checked={initialOpen}
onChange={changeUIOptions(UIOptions.OPEN)}
/>
<Input
name={"beginning"}
id={"beginning"}
label={"Show at beginning"}
isCheckbox
checked={beginning}
onChange={changeUIOptions(UIOptions.BEGINNING)}
/>
</div>
);
};

0 comments on commit 29c2453

Please sign in to comment.