Skip to content
Snippets Groups Projects
Commit f2be55e0 authored by Aggarwal Himanshu's avatar Aggarwal Himanshu
Browse files

Update components to support applying filters to cryptocurrencies

parent 518855d1
No related branches found
No related tags found
2 merge requests!17Merge develop into main,!9Add support for filtering cryptocurrencies using the filter components
...@@ -13,11 +13,7 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) { ...@@ -13,11 +13,7 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) {
useEffect(() => { useEffect(() => {
if (selectedFilter) { if (selectedFilter) {
setRadioValue( setRadioValue(Object.keys(filterOptions[selectedFilter].options)[0]);
filterOptions[selectedFilter].options[
Object.keys(filterOptions[selectedFilter].options)[0]
].name
);
} }
}, [filterOptions, selectedFilter]); }, [filterOptions, selectedFilter]);
...@@ -35,7 +31,7 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) { ...@@ -35,7 +31,7 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) {
const onFilterAdd = () => { const onFilterAdd = () => {
addFilter({ addFilter({
subject: filterOptions[selectedFilter].name, subject: selectedFilter,
condition: radioValue, condition: radioValue,
value: inputValue, value: inputValue,
}); });
...@@ -49,18 +45,22 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) { ...@@ -49,18 +45,22 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) {
"dark:bg-dark-600 w-56 h-max max-h-72 rounded-xl mt-2 transition-all duration-100 p-1 overflow-y-scroll shadow-lg shadow-dark-600" "dark:bg-dark-600 w-56 h-max max-h-72 rounded-xl mt-2 transition-all duration-100 p-1 overflow-y-scroll shadow-lg shadow-dark-600"
)} )}
> >
{Object.keys(filterOptions).map((key) => { {Object.keys(filterOptions).length > 0 ? (
return ( Object.keys(filterOptions).map((key) => {
<FilterDropdownItem return (
key={"primary_option_" + key} <FilterDropdownItem
selected={selectedFilter === key} key={"primary_option_" + key}
id={key} selected={selectedFilter === key}
onClick={onSelectedFilterChange} id={key}
> onClick={onSelectedFilterChange}
{filterOptions[key].name} >
</FilterDropdownItem> {filterOptions[key].name}
); </FilterDropdownItem>
})} );
})
) : (
<FilterDropdownItem disabled>No options available</FilterDropdownItem>
)}
</div> </div>
<CSSTransition <CSSTransition
in={selectedFilter} in={selectedFilter}
...@@ -79,6 +79,9 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) { ...@@ -79,6 +79,9 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) {
inputValue={inputValue} inputValue={inputValue}
onInputChange={onInputChange} onInputChange={onInputChange}
onFilterAdd={onFilterAdd} onFilterAdd={onFilterAdd}
inputLeftSymbol={filterOptions[selectedFilter]?.symbol_left}
inputRightSymbol={filterOptions[selectedFilter]?.symbol_right}
inputType={filterOptions[selectedFilter]?.input_type}
/> />
</span> </span>
) : ( ) : (
...@@ -98,6 +101,9 @@ export function SecondaryFilterDropdown({ ...@@ -98,6 +101,9 @@ export function SecondaryFilterDropdown({
inputValue, inputValue,
onInputChange, onInputChange,
onFilterAdd, onFilterAdd,
inputLeftSymbol,
inputRightSymbol,
inputType,
}) { }) {
return ( return (
<div <div
...@@ -115,6 +121,10 @@ export function SecondaryFilterDropdown({ ...@@ -115,6 +121,10 @@ export function SecondaryFilterDropdown({
onRadioChange={onRadioChange} onRadioChange={onRadioChange}
inputValue={inputValue} inputValue={inputValue}
onInputChange={onInputChange} onInputChange={onInputChange}
inputLeftSymbol={inputLeftSymbol}
inputRightSymbol={inputRightSymbol}
inputType={inputType}
onSubmit={onFilterAdd}
/> />
<div className="flex flex-row space-x-2 mb-2"> <div className="flex flex-row space-x-2 mb-2">
<Button <Button
...@@ -126,6 +136,7 @@ export function SecondaryFilterDropdown({ ...@@ -126,6 +136,7 @@ export function SecondaryFilterDropdown({
<Button <Button
className="bg-indigo-600 text-white font-semibold w-full" className="bg-indigo-600 text-white font-semibold w-full"
onClick={onFilterAdd} onClick={onFilterAdd}
type="submit"
> >
Filter Filter
</Button> </Button>
...@@ -135,17 +146,24 @@ export function SecondaryFilterDropdown({ ...@@ -135,17 +146,24 @@ export function SecondaryFilterDropdown({
} }
// selected: boolean // selected: boolean
function FilterDropdownItem({ children, selected, onClick, id }) { function FilterDropdownItem({
children,
selected,
onClick,
id,
disabled = false,
}) {
return ( return (
<div <div
className={classNames( className={classNames(
"py-3 px-4 rounded-xl dark:text-neutral-100 hover:bg-dark-800 border-1 transition-all duration-100 cursor-pointer", "py-3 px-4 rounded-xl dark:text-neutral-100 border-1 transition-all duration-100 cursor-pointer",
{ {
"border-transparent": !selected, "border-transparent": !selected,
"bg-dark-800 border-indigo-600 font-semibold": selected, "bg-dark-800 border-indigo-600 font-semibold": selected,
"hover:bg-dark-800": !disabled,
} }
)} )}
onClick={() => onClick(id)} onClick={disabled || !onClick ? undefined : () => onClick(id)}
> >
<div className="flex flex-row items-center"> <div className="flex flex-row items-center">
{children} {children}
......
...@@ -3,31 +3,38 @@ import React from "react"; ...@@ -3,31 +3,38 @@ import React from "react";
import Input from "../inputs/Input"; import Input from "../inputs/Input";
export function RadioInputForm({ export function RadioInputForm({
inputLeftSymbol,
inputRightSymbol,
inputType,
options, options,
radioValue, radioValue,
onRadioChange, onRadioChange,
inputValue, inputValue,
onInputChange, onInputChange,
onSubmit,
}) { }) {
return ( return (
<div> <form onSubmit={onSubmit}>
<div className="flex flex-col py-2 space-y-2"> <div className="flex flex-col py-2 space-y-2">
{Object.keys(options).map((key) => { {Object.keys(options).map((key) => {
return ( return (
<div key={"radio_option_" + options[key].id}> <div key={"radio_option_" + key}>
<Radio <Radio
selected={radioValue} selected={radioValue}
radioValue={options[key].name} radioValue={key}
id={options[key].id} radioLabel={options[key].name}
id={key}
onChange={onRadioChange} onChange={onRadioChange}
/> />
<div className="my-1"> <div className="my-1">
{options[key].name === radioValue && ( {key === radioValue && (
<Input <Input
type="text"
placeholder="Enter a value here..." placeholder="Enter a value here..."
initialValue={inputValue} initialValue={inputValue}
onChange={onInputChange} onChange={onInputChange}
symbolLeft={inputLeftSymbol}
symbolRight={inputRightSymbol}
type={inputType}
/> />
)} )}
</div> </div>
...@@ -35,11 +42,11 @@ export function RadioInputForm({ ...@@ -35,11 +42,11 @@ export function RadioInputForm({
); );
})} })}
</div> </div>
</div> </form>
); );
} }
export function Radio({ selected, radioValue, onChange }) { export function Radio({ selected, radioValue, radioLabel, onChange }) {
return ( return (
<label className="inline-flex items-center w-full"> <label className="inline-flex items-center w-full">
<input <input
...@@ -55,7 +62,7 @@ export function Radio({ selected, radioValue, onChange }) { ...@@ -55,7 +62,7 @@ export function Radio({ selected, radioValue, onChange }) {
"dark:text-indigo-500": selected === radioValue, "dark:text-indigo-500": selected === radioValue,
})} })}
> >
{radioValue} {radioLabel}
</span> </span>
</label> </label>
); );
......
...@@ -32,10 +32,23 @@ export default function Home() { ...@@ -32,10 +32,23 @@ export default function Home() {
const [dropdownOpen, setDropdownOpen] = useState(false); const [dropdownOpen, setDropdownOpen] = useState(false);
const [searchText, setSearchText] = useState(""); const [searchText, setSearchText] = useState("");
const listOfCoins = useCryptoList("usd", 21, false); const listOfCoins = useCryptoList("usd", 21, false);
const filteredCoins = listOfCoins.data?.filter((coin) => {
// Filter coins based on search
let filteredCoins = listOfCoins.data?.filter((coin) => {
return coin.name.toLowerCase().includes(searchText.toLowerCase()); return coin.name.toLowerCase().includes(searchText.toLowerCase());
}); });
// Apply filters
for (let i = 0; i < filters.length; i++) {
const { subject, condition, value } = filters[i];
filteredCoins = filteredCoins.filter((coin) => {
return filterOptions[subject]?.options[condition]?.function(
coin[subject],
value
);
});
}
return ( return (
<div> <div>
<Head> <Head>
...@@ -60,9 +73,14 @@ export default function Home() { ...@@ -60,9 +73,14 @@ export default function Home() {
return ( return (
<Filter <Filter
key={"filter_" + idx} key={"filter_" + idx}
subject={filter.subject} subject={filterOptions[filter.subject]?.name}
condition={filter.condition} condition={
filterOptions[filter.subject]?.options[filter.condition]
?.name
}
value={filter.value} value={filter.value}
symbolLeft={filterOptions[filter.subject]?.symbol_left}
symbolRight={filterOptions[filter.subject]?.symbol_right}
buttonIcon={<XIcon className="w-5 h-5" />} buttonIcon={<XIcon className="w-5 h-5" />}
onButtonClick={() => removeFilter(filter)} onButtonClick={() => removeFilter(filter)}
/> />
...@@ -80,7 +98,17 @@ export default function Home() { ...@@ -80,7 +98,17 @@ export default function Home() {
<FilterDropdown <FilterDropdown
setOpen={setDropdownOpen} setOpen={setDropdownOpen}
addFilter={addFilter} addFilter={addFilter}
filterOptions={filterOptions} filterOptions={Object.keys(filterOptions)
.filter(
(option) =>
filters.filter(
(filter) => filter.subject === option
).length === 0
)
.reduce((obj, key) => {
obj[key] = filterOptions[key];
return obj;
}, {})}
/> />
)} )}
</div> </div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment