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

Merge branch 'develop' into 'main'

Merge develop into main

See merge request !17
parents c10a8194 beb01760
No related branches found
No related tags found
1 merge request!17Merge develop into main
Showing
with 541 additions and 186 deletions
...@@ -32,3 +32,9 @@ yarn-error.log* ...@@ -32,3 +32,9 @@ yarn-error.log*
# vercel # vercel
.vercel .vercel
# parcel
.parcel-cache
# docs
docs
{
plugins: {
tailwindcss: {},
autoprefixer: {},
}
}
\ No newline at end of file
import classNames from "classnames";
import React from "react"; import React from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
export default function Button({ children, className, onClick }) { /**
* Custom button component
*
* @component
* @example
* return (
* <Button className="bg-indigo-500 text-white" onClick={() => console.log("Button pressed")}>
* Hello!
* </Button>
* )
*/
function Button({ children, className, onClick, type, disabled }) {
return ( return (
<button <button
className={classNames("py-2 px-5 rounded-xl", className)} className={classNames("py-2 px-5 rounded-xl", className, {
onClick={onClick} "brightness-50 cursor-default": disabled,
})}
onClick={disabled ? undefined : onClick}
type={type ? type : "button"}
> >
{children} {children}
</button> </button>
); );
} }
Button.propTypes = {
/**
* The content inside the button
*/
children: PropTypes.node.isRequired,
/**
* Additional CSS classes for the button (optional)
*/
className: PropTypes.string,
/**
* The function to run when button is pressed
*/
onClick: PropTypes.func,
/**
* The type of button
*/
type: PropTypes.string,
/**
* Whether the button is disabled
*/
disabled: PropTypes.bool,
};
Button.defaultProps = {
type: "button",
};
export default Button;
import React from "react";
import Button from "./Button";
export default function FilterButton({ icon, onClick }) {
return (
<Button
className="mx-1 mt-2 font-sans font-normal bg-dark-600 rounded-lg dark:text-neutral-200 dark:hover:text-indigo-600 inline-flex h-10 w-10 justify-center items-center whitespace-nowrap"
onClick={onClick}
>
<span className="text-white">{icon}</span>
</Button>
);
}
import React from "react";
import classNames from "classnames";
import Button from "./Button";
import PropTypes from "prop-types";
/**
* Button component for toggling items on/off
*
* @component
* @example
* return (
* <ToggleButton id={"demo"} active={"demo2"} setActive={() => console.log("active!")}>
* Demo
* </ToggleButton>
* )
*/
function ToggleButton({ children, setActive, active, id, className }) {
return (
<Button
className={classNames(
"px-3 py-2 rounded-md font-light",
{
"dark:bg-white dark:text-gray-800": active === id,
"dark:bg-black dark:text-gray-400": active !== id,
},
className
)}
onClick={() => setActive(id)}
>
{children}
</Button>
);
}
ToggleButton.propTypes = {
/**
* The content inside the button
*/
children: PropTypes.node.isRequired,
/**
* Additional CSS classes for the button (optional)
*/
className: PropTypes.string,
/**
* The id of the currently active button
*/
active: PropTypes.string.isRequired,
/**
* The function to run to make button active
*/
setActive: PropTypes.func.isRequired,
/**
* Unique identifier for the button
*/
id: PropTypes.string.isRequired,
};
export default ToggleButton;
import ToggleButton from "./ToggleButton";
import Button from "./Button";
import FilterButton from "./FilterButton";
export { Button, ToggleButton, FilterButton };
...@@ -5,9 +5,15 @@ import classNames from "classnames"; ...@@ -5,9 +5,15 @@ import classNames from "classnames";
import Image from "next/image"; import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { useCryptoTimeSeriesData } from "../../queries"; import { useCryptoTimeSeriesData } from "../../queries";
import PropTypes from "prop-types";
const Chart = dynamic(() => import("react-apexcharts"), { ssr: false }); const Chart = dynamic(() => import("react-apexcharts"), { ssr: false });
/**
* Card component with an embedded chart for Crypto
*
* @component
*/
function CryptoChartCard({ function CryptoChartCard({
currencyName, currencyName,
currencyId, currencyId,
...@@ -103,4 +109,43 @@ function CryptoChartCard({ ...@@ -103,4 +109,43 @@ function CryptoChartCard({
); );
} }
CryptoChartCard.propTypes = {
/**
* The name of the cryptocurrency
*/
currencyName: PropTypes.string.isRequired,
/**
* The id of the cryptocurrency
*/
currencyId: PropTypes.string.isRequired,
/**
* The symbol of the cryptocurrency
*/
symbol: PropTypes.string.isRequired,
/**
* The icon for the cryptocurrency
*/
icon: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,
/**
* Any specific info for the cryptocurrency
*/
info: PropTypes.string.isRequired,
/**
* The specific detail for the cryptocurrency
*/
detail: PropTypes.string.isRequired,
/**
* A color for the detail text
*/
detailColor: PropTypes.string.isRequired,
/**
* The options for the embedded chart
*/
options: PropTypes.object.isRequired,
/**
* The type of the chart
*/
type: PropTypes.string.isRequired,
};
export default CryptoChartCard; export default CryptoChartCard;
import classNames from "classnames";
import React, { useState, useRef } from "react"; import React, { useState, useRef } from "react";
import ReactECharts from "echarts-for-react"; import ReactECharts from "echarts-for-react";
import { useCryptoTimeSeriesRangeData } from "../../queries"; import { useCryptoList, useCryptoTimeSeriesRangeData } from "../../queries";
import moment from "moment"; import moment from "moment";
import { ToggleButton } from "../button";
import Dropdown from "../dropdown/Dropdown";
import { ChevronDoubleRightIcon } from "@heroicons/react/outline";
const unixNow = () => { const unixNow = () => {
return moment().unix(); return moment().unix();
...@@ -15,13 +17,16 @@ const unixSubtractId = (id) => { ...@@ -15,13 +17,16 @@ const unixSubtractId = (id) => {
function CompareChart() { function CompareChart() {
const [timerange, setTimerange] = useState("6month"); const [timerange, setTimerange] = useState("6month");
const chartRef = useRef(null); const chartRef = useRef(null);
const listOfCoins = useCryptoList("usd", 21, false);
const [firstCrypto, setFirstCrypto] = useState("solana");
const [secondCrypto, setSecondCrypto] = useState("avalanche-2");
const cryptoQuery = useCryptoTimeSeriesRangeData( const cryptoQuery = useCryptoTimeSeriesRangeData(
"solana", firstCrypto,
unixSubtractId(timerange), unixSubtractId(timerange),
unixNow() unixNow()
); );
const cryptoQuery2 = useCryptoTimeSeriesRangeData( const cryptoQuery2 = useCryptoTimeSeriesRangeData(
"avalanche-2", secondCrypto,
unixSubtractId(timerange), unixSubtractId(timerange),
unixNow() unixNow()
); );
...@@ -67,7 +72,7 @@ function CompareChart() { ...@@ -67,7 +72,7 @@ function CompareChart() {
{ {
type: "line", type: "line",
data: cryptoQuery.data?.prices, data: cryptoQuery.data?.prices,
name: "Solana", name: firstCrypto,
smooth: true, smooth: true,
symbol: "none", symbol: "none",
lineStyle: { lineStyle: {
...@@ -82,7 +87,7 @@ function CompareChart() { ...@@ -82,7 +87,7 @@ function CompareChart() {
{ {
type: "line", type: "line",
data: cryptoQuery2.data?.prices, data: cryptoQuery2.data?.prices,
name: "Avalanche", name: secondCrypto,
smooth: true, smooth: true,
symbol: "none", symbol: "none",
lineStyle: { lineStyle: {
...@@ -118,6 +123,24 @@ function CompareChart() { ...@@ -118,6 +123,24 @@ function CompareChart() {
<ToggleButton id="1year" active={timerange} setActive={setTimerange}> <ToggleButton id="1year" active={timerange} setActive={setTimerange}>
1Y 1Y
</ToggleButton> </ToggleButton>
<div className="flex-1">{/* Space Fillter */}</div>
<div className="flex flex-row space-x-5 items-center">
<Dropdown
list={listOfCoins.isLoading ? [] : listOfCoins.data}
value={firstCrypto}
setValue={setFirstCrypto}
disabled={[secondCrypto]}
/>
<ChevronDoubleRightIcon className="w-5 h-5 dark:text-gray-300" />
<Dropdown
list={listOfCoins.isLoading ? [] : listOfCoins.data}
value={secondCrypto}
setValue={setSecondCrypto}
disabled={[firstCrypto]}
/>
</div>
</div> </div>
<div className="h-[600px] mt-10"> <div className="h-[600px] mt-10">
<ReactECharts <ReactECharts
...@@ -132,18 +155,4 @@ function CompareChart() { ...@@ -132,18 +155,4 @@ function CompareChart() {
); );
} }
function ToggleButton({ children, setActive, active, id }) {
return (
<button
className={classNames(" px-3 py-2 rounded-md font-light", {
"dark:bg-white dark:text-gray-800": active === id,
"dark:bg-black dark:text-gray-400": active !== id,
})}
onClick={() => setActive(id)}
>
{children}
</button>
);
}
export default CompareChart; export default CompareChart;
import React, { useState, useEffect, useRef, useCallback } from "react";
import classNames from "classnames";
import { ChevronDownIcon } from "@heroicons/react/outline";
import { useOnClickOutside } from "../../hooks";
import DropdownItem from "./DropdownItem";
function getCoin(list, id) {
for (let i = 0; i < list.length; i++) {
if (list[i].id == id) {
return list[i];
}
}
return null;
}
function Dropdown({ list, value, setValue, disabled }) {
const [open, setOpen] = useState(false);
const ref = useRef(null);
const callbackDropdownClose = useCallback(() => setOpen(false), []);
useOnClickOutside(ref, callbackDropdownClose);
useEffect(() => {
setOpen(false);
}, [value]);
return (
<div className="relative" ref={ref}>
<button
className={classNames(" px-3 py-2 rounded-md font-light", {
"dark:bg-white dark:text-gray-800": false,
"dark:bg-black dark:text-gray-400": true,
})}
onClick={() => setOpen(!open)}
>
<div className="flex flex-row items-center space-x-2">
<p>{getCoin(list, value)?.name}</p>
<ChevronDownIcon className="h-5 w-5" />
</div>
</button>
{open && (
<div className="absolute h-fit max-h-52 min-w-[9rem] w-fit bg-dark-900 top-12 right-0 rounded-xl z-50 overflow-y-scroll">
<div className="my-2">
{list.map((coin, index) => {
return (
<DropdownItem
onClick={() => setValue(coin.id)}
key={index}
selected={coin.id === value}
disabled={disabled.includes(coin.id)}
>
{coin.name}
</DropdownItem>
);
})}
</div>
</div>
)}
</div>
);
}
export default Dropdown;
import classNames from "classnames";
import React from "react";
function DropdownItem({ children, onClick, selected, disabled }) {
return (
<div
className={classNames("py-2 px-4 rounded-xl mx-2", {
"opacity-75 dark:text-gray-500": disabled,
"bg-white dark:text-black": selected,
"hover:bg-dark-600 dark:text-white cursor-pointer":
!disabled && !selected,
})}
onClick={selected || disabled ? undefined : onClick}
>
{children}
</div>
);
}
export default DropdownItem;
import { ArrowRightIcon } from "@heroicons/react/outline"; import React, { useState, useEffect, useRef } from "react";
import classNames from "classnames";
import React, { useState, useEffect } from "react";
import Button from "../button/Button";
import { RadioInputForm } from "../radio/RadioForm";
import { CSSTransition } from "react-transition-group"; import { CSSTransition } from "react-transition-group";
import FilterDropdownItem from "./FilterDropdownItem";
import SecondaryFilterDropdown from "./SecondaryFilterDropdown";
import classNames from "classnames";
export function FilterDropdown({ filterOptions, setOpen, addFilter }) { export function FilterDropdown({
filterOptions,
setOpen,
addFilter,
dropdownRef,
}) {
const [selectedFilter, setSelectedFilter] = useState(null); const [selectedFilter, setSelectedFilter] = useState(null);
const [radioValue, setRadioValue] = useState("is"); const [radioValue, setRadioValue] = useState("is");
const [inputValue, setInputValue] = useState(""); const [inputValue, setInputValue] = useState("");
const secondaryDropdownRef = useRef(null);
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 +35,7 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) { ...@@ -35,7 +35,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,
}); });
...@@ -43,33 +43,38 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) { ...@@ -43,33 +43,38 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) {
}; };
return ( return (
<div className="absolute flex flex-row z-50"> <div className="absolute flex flex-row z-50" ref={dropdownRef}>
<div <div
className={classNames( className={classNames(
"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 !== null}
classNames="secondary-dropdown" classNames="secondary-dropdown"
timeout={300} timeout={300}
unmountOnExit unmountOnExit
nodeRef={secondaryDropdownRef}
> >
{selectedFilter ? ( {selectedFilter ? (
<span className="ml-3"> <span className="ml-3" ref={secondaryDropdownRef}>
<SecondaryFilterDropdown <SecondaryFilterDropdown
open={true} open={true}
onSelectedFilterChange={onSelectedFilterChange} onSelectedFilterChange={onSelectedFilterChange}
...@@ -79,82 +84,17 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) { ...@@ -79,82 +84,17 @@ 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>
) : ( ) : (
<div></div> <div ref={secondaryDropdownRef}></div>
)} )}
</CSSTransition> </CSSTransition>
</div> </div>
); );
} }
export function SecondaryFilterDropdown({ export default FilterDropdown;
open,
onSelectedFilterChange,
radioOptions,
radioValue,
onRadioChange,
inputValue,
onInputChange,
onFilterAdd,
}) {
return (
<div
className={classNames(
"dark:bg-dark-600 w-72 max-h-72 rounded-xl mt-2 transition-all duration-100 px-5 py-2 overflow-y-scroll shadow-lg shadow-dark-600",
{
block: open,
hidden: !open,
}
)}
>
<RadioInputForm
options={radioOptions}
radioValue={radioValue}
onRadioChange={onRadioChange}
inputValue={inputValue}
onInputChange={onInputChange}
/>
<div className="flex flex-row space-x-2 mb-2">
<Button
className="bg-neutral-100 text-gray-700 font-semibold"
onClick={() => onSelectedFilterChange(null)}
>
Cancel
</Button>
<Button
className="bg-indigo-600 text-white font-semibold w-full"
onClick={onFilterAdd}
>
Filter
</Button>
</div>
</div>
);
}
// selected: boolean
function FilterDropdownItem({ children, selected, onClick, id }) {
return (
<div
className={classNames(
"py-3 px-4 rounded-xl dark:text-neutral-100 hover:bg-dark-800 border-1 transition-all duration-100 cursor-pointer",
{
"border-transparent": !selected,
"bg-dark-800 border-indigo-600 font-semibold": selected,
}
)}
onClick={() => onClick(id)}
>
<div className="flex flex-row items-center">
{children}
{selected && (
<span className="ml-auto">
<ArrowRightIcon className="w-4 h-4" />
</span>
)}
</div>
</div>
);
}
import React from "react";
import classNames from "classnames";
import { ArrowRightIcon } from "@heroicons/react/outline";
// selected: boolean
function FilterDropdownItem({
children,
selected,
onClick,
id,
disabled = false,
}) {
return (
<div
className={classNames(
"py-3 px-4 rounded-xl dark:text-neutral-100 border-1 transition-all duration-100 cursor-pointer",
{
"border-transparent": !selected,
"bg-dark-800 border-indigo-600 font-semibold": selected,
"hover:bg-dark-800": !disabled,
}
)}
onClick={disabled || !onClick ? undefined : () => onClick(id)}
>
<div className="flex flex-row items-center">
{children}
{selected && (
<span className="ml-auto">
<ArrowRightIcon className="w-4 h-4" />
</span>
)}
</div>
</div>
);
}
export default FilterDropdownItem;
import React from "react";
import { Button } from "../button";
import RadioInputForm from "../radio/RadioForm";
import classNames from "classnames";
export function SecondaryFilterDropdown({
open,
onSelectedFilterChange,
radioOptions,
radioValue,
onRadioChange,
inputValue,
onInputChange,
onFilterAdd,
inputLeftSymbol,
inputRightSymbol,
inputType,
}) {
return (
<div
className={classNames(
"dark:bg-dark-600 w-72 max-h-72 rounded-xl mt-2 transition-all duration-100 px-5 py-2 overflow-y-scroll shadow-lg shadow-dark-600",
{
block: open,
hidden: !open,
}
)}
>
<RadioInputForm
options={radioOptions}
radioValue={radioValue}
onRadioChange={onRadioChange}
inputValue={inputValue}
onInputChange={onInputChange}
inputLeftSymbol={inputLeftSymbol}
inputRightSymbol={inputRightSymbol}
inputType={inputType}
onSubmit={onFilterAdd}
/>
<div className="flex flex-row space-x-2 mb-2">
<Button
className="bg-neutral-100 text-gray-700 font-semibold"
onClick={() => onSelectedFilterChange(null)}
>
Cancel
</Button>
<Button
className="bg-indigo-600 text-white font-semibold w-full"
onClick={onFilterAdd}
type="submit"
disabled={inputValue === ""}
>
Filter
</Button>
</div>
</div>
);
}
export default SecondaryFilterDropdown;
import React from "react"; import React from "react";
import Button from "../button/Button";
export function Filter({ function Filter({
subject, subject,
condition, condition,
value, value,
symbolLeft,
symbolRight,
buttonIcon, buttonIcon,
onButtonClick, onButtonClick,
}) { }) {
...@@ -14,33 +17,22 @@ export function Filter({ ...@@ -14,33 +17,22 @@ export function Filter({
<span className="font-light dark:text-neutral-300"> <span className="font-light dark:text-neutral-300">
{condition}&nbsp; {condition}&nbsp;
</span> </span>
<span>{value}</span> <span>
{symbolLeft}
{value}
{symbolRight}
</span>
</div> </div>
{/* Button */} {/* Button */}
<button <Button
onClick={onButtonClick} onClick={onButtonClick}
className="mr-2 p-2 bg-dark-600 hover:dark:bg-dark-800 rounded-r-lg justify-center items-center h-10 w-10 inline-flex font-thin text-white" className="mr-2 p-2 bg-dark-600 hover:dark:bg-dark-800 rounded-r-lg rounded-l-none justify-center items-center h-10 w-10 inline-flex font-thin text-white"
> >
<span>{buttonIcon}</span> <span>{buttonIcon}</span>
</button> </Button>
</div> </div>
); );
} }
export function FilterButton({ icon, onClick }) { export default Filter;
return (
<button
className="mx-1 mt-2 font-sans font-normal bg-dark-600 rounded-lg dark:text-neutral-200 dark:hover:text-indigo-600 inline-flex h-10 w-10 justify-center items-center whitespace-nowrap"
onClick={onClick}
>
{icon}
</button>
);
}
export function Filters({ children }) {
return (
<div className="flex flex-wrap justify-start items-center">{children}</div>
);
}
import React from "react";
function Filters({ children }) {
return (
<div className="flex flex-wrap justify-start items-center">{children}</div>
);
}
export default Filters;
import Filter from "./Filter";
import Filters from "./Filters";
export { Filter, Filters };
import classNames from "classnames";
import React from "react"; import React from "react";
function Input({ placeholder, type, onChange, initialValue }) { function Input({
className,
placeholder,
type,
onChange,
initialValue,
symbolLeft,
symbolRight,
}) {
return ( return (
<input <span className="relative flex w-full flex-wrap items-stretch mb-3">
className="w-full h-12 text-base focus:ring-indigo-500 focus:border-indigo-500 border-1 border-transparent font-semibold outline-none dark:text-white px-3 pr-3 rounded-2xl bg-dark-800" {symbolLeft && (
placeholder={placeholder} <span className="absolute left-3 w-5 text-center items-center justify-center h-full z-10 py-3">
type={type ? type : "text"} <p className="dark:text-white align-top font-extralight">
onChange={onChange} {symbolLeft}
defaultValue={initialValue || ""} </p>
></input> </span>
)}
<input
className={classNames(
"relative w-full h-12 text-base focus:ring-indigo-500 focus:border-indigo-500 border-1 border-transparent font-semibold outline-none dark:text-white rounded-2xl bg-dark-800",
{
"pr-3": !symbolRight,
"pr-8": symbolRight,
"pl-3": !symbolLeft,
"pl-8": symbolLeft,
},
className
)}
placeholder={placeholder}
type={type ? type : "text"}
onChange={onChange}
defaultValue={initialValue || ""}
></input>
{symbolRight && (
<span className="absolute right-3 w-5 text-center items-center justify-center h-full z-10 py-3">
<p className="dark:text-white align-top font-extralight">
{symbolRight}
</p>
</span>
)}
</span>
); );
} }
......
import React from "react"; import React from "react";
import { SearchIcon } from "@heroicons/react/outline"; import { SearchIcon } from "@heroicons/react/outline";
import Input from "./Input";
function SearchInput({ onChange }) { function SearchInput({ onChange }) {
return ( return (
<div className="relative"> <div className="relative">
<input <Input
className="w-52 h-12 text-base font-semibold outline-none dark:text-white px-3 pr-10 rounded-2xl bg-dark-700" className="w-52 h-12 text-base font-semibold outline-none dark:text-white px-3 pr-10 rounded-2xl bg-dark-700"
placeholder="Search" placeholder="Search"
type="text" type="text"
onChange={onChange} onChange={onChange}
></input> symbolRight={<SearchIcon className="w-6 h-6 dark:text-white" />}
<button className="absolute top-0 right-3 bottom-0 w-6"> ></Input>
<SearchIcon className="w-6 h-6 dark:text-white" />
</button>
</div> </div>
); );
} }
......
import React from "react";
import classNames from "classnames";
function Radio({ selected, radioValue, radioLabel, onChange }) {
return (
<label className="inline-flex items-center w-full">
<input
type="radio"
className="form-radio h-4 w-4 accent-indigo-600 hover:accent-indigo-700"
value={radioValue}
checked={selected === radioValue}
onChange={onChange}
/>
<span
className={classNames("font-poppins ml-2 text-base", {
"dark:text-white font-extralight": selected !== radioValue,
"dark:text-indigo-500": selected === radioValue,
})}
>
{radioLabel}
</span>
</label>
);
}
export default Radio;
import classNames from "classnames";
import React from "react"; import React from "react";
import Input from "../inputs/Input"; import Input from "../inputs/Input";
import Radio from "./Radio";
export function RadioInputForm({ 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,28 +42,8 @@ export function RadioInputForm({ ...@@ -35,28 +42,8 @@ export function RadioInputForm({
); );
})} })}
</div> </div>
</div> </form>
); );
} }
export function Radio({ selected, radioValue, onChange }) { export default RadioInputForm;
return (
<label className="inline-flex items-center w-full">
<input
type="radio"
className="form-radio h-4 w-4 accent-indigo-600 hover:accent-indigo-700"
value={radioValue}
checked={selected === radioValue}
onChange={onChange}
/>{" "}
<span
className={classNames("font-poppins ml-2 text-base", {
"dark:text-white font-extralight": selected !== radioValue,
"dark:text-indigo-500": selected === radioValue,
})}
>
{radioValue}
</span>
</label>
);
}
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