Skip to content
Snippets Groups Projects
Commit d09122af authored by Dima Rifai's avatar Dima Rifai Committed by mcfarhat
Browse files

Issue #413 - Refactor onBlur functionality

parent 1cf39566
Branches
No related tags found
1 merge request!521Issue #413 - Add validation/fallback for payloadStartDate and payloadToBlock...
import React, { useEffect , useState } from "react"; import React, { useEffect, useState } from "react";
import moment from "moment"; import moment from "moment";
import { SearchRangesResult } from "../../hooks/common/useSearchRanges"; import { SearchRangesResult } from "../../hooks/common/useSearchRanges";
import { Select, SelectContent, SelectTrigger, SelectItem } from "../ui/select"; import { Select, SelectContent, SelectTrigger, SelectItem } from "../ui/select";
import { Input } from "../ui/input"; import { Input } from "../ui/input";
import DateTimePicker from "../DateTimePicker"; import DateTimePicker from "../DateTimePicker";
import ErrorMessage from "../ErrorMessage";// Import the ErrorMessage component import ErrorMessage from "../ErrorMessage"; // Import the ErrorMessage component
interface SearchRangesProps { interface SearchRangesProps {
rangesProps: SearchRangesResult; rangesProps: SearchRangesResult;
safeTimeRangeDisplay?: boolean; safeTimeRangeDisplay?: boolean;
...@@ -37,23 +36,77 @@ const SearchRanges: React.FC<SearchRangesProps> = ({ ...@@ -37,23 +36,77 @@ const SearchRanges: React.FC<SearchRangesProps> = ({
setLastTimeUnitValue, setLastTimeUnitValue,
} = rangesProps; } = rangesProps;
// Validate and update numeric values
const [rangeError, setRangeError] = useState<string | null>(null);
const handleOnBlur = (
e: React.FocusEvent<HTMLInputElement>,
fieldSetter: Function,
validateField: Function | null
) => {
const value = e.target.value;
const numericValue = value ? Number(value) : undefined;
// Fetch the latest block number dynamically
let validated = true;
if (validateField) {
validated = validateField(e, numericValue);
}
validated ? fieldSetter(numericValue) : fieldSetter(null);
};
const validateToBlock = (
e: React.FocusEvent<HTMLInputElement>,
value: number | undefined,
) => {
if (value !== undefined && value <= 0) {
setRangeError("Block Number must be a positive number");
e.target.value = "";
return false;
}
if (value && fromBlock && !isNaN(value) && value < fromBlock) {
setRangeError("To block must be greater than From block");
e.target.value = "";
return false;
}
return true;
};
const validateFromBlock = (
e: React.FocusEvent<HTMLInputElement>,
value: number | undefined,
) => {
if (value !== undefined && value <= 0) {
setRangeError("Block Number must be a positive number");
e.target.value = "";
return false;
}
if (value && toBlock && !isNaN(value) && value > toBlock) {
setRangeError("From block must be less than To block");
e.target.value = "";
return false;
}
return true;
};
const handleNumericInput = ( const handleNumericInput = (
e: React.ChangeEvent<HTMLInputElement>, e: React.ChangeEvent<HTMLInputElement>,
allowDecimal: boolean = false allowDecimal: boolean = false
) => { ) => {
let cleanedValue = e.target.value; let cleanedValue = e.target.value;
// Clean the value based on the logic // Clean the value based on the logic
cleanedValue = allowDecimal cleanedValue = allowDecimal
? cleanedValue.replace(/[^0-9.]/g, "") // Allow numbers and decimal point ? cleanedValue.replace(/[^0-9.]/g, "") // Allow numbers and decimal point
: cleanedValue.replace(/[^0-9]/g, ""); // Only allow numbers : cleanedValue.replace(/[^0-9]/g, ""); // Only allow numbers
if (allowDecimal && cleanedValue.split(".").length > 2) { if (allowDecimal && cleanedValue.split(".").length > 2) {
cleanedValue = cleanedValue.slice(0, cleanedValue.indexOf(".") + 1) + cleanedValue =
cleanedValue.split(".").slice(1).join(""); // Remove extra decimals cleanedValue.slice(0, cleanedValue.indexOf(".") + 1) +
cleanedValue.split(".").slice(1).join(""); // Remove extra decimals
} }
if (cleanedValue.length > 15) { if (cleanedValue.length > 15) {
cleanedValue = cleanedValue.slice(0, 15); // Limit to 15 digits cleanedValue = cleanedValue.slice(0, 15); // Limit to 15 digits
} }
...@@ -68,10 +121,9 @@ const SearchRanges: React.FC<SearchRangesProps> = ({ ...@@ -68,10 +121,9 @@ const SearchRanges: React.FC<SearchRangesProps> = ({
) { ) {
setStartDate(moment(startDate).subtract(1, "hours").toDate()); setStartDate(moment(startDate).subtract(1, "hours").toDate());
} }
//eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [startDate, endDate]); }, [startDate, endDate]);
const [blockRangeError, setBlockRangeError] = useState<string | null>(null); // Error state for block range validation
return ( return (
<div className="py-2 flex flex-col gap-y-2"> <div className="py-2 flex flex-col gap-y-2">
...@@ -109,11 +161,7 @@ const SearchRanges: React.FC<SearchRangesProps> = ({ ...@@ -109,11 +161,7 @@ const SearchRanges: React.FC<SearchRangesProps> = ({
type="text" // Use type="text" to allow custom validation type="text" // Use type="text" to allow custom validation
defaultValue={lastBlocksValue || ""} defaultValue={lastBlocksValue || ""}
onChange={(e) => handleNumericInput(e)} onChange={(e) => handleNumericInput(e)}
onBlur={(e) => { onBlur={(e) => handleOnBlur(e,setLastBlocksValue,null)}
const value = e.target.value;
const numericValue = value ? Number(value) : undefined;
setLastBlocksValue(numericValue);
}}
placeholder={"Last"} placeholder={"Last"}
/> />
</div> </div>
...@@ -129,11 +177,7 @@ const SearchRanges: React.FC<SearchRangesProps> = ({ ...@@ -129,11 +177,7 @@ const SearchRanges: React.FC<SearchRangesProps> = ({
className="bg-theme border-0 border-b-2 text-text" className="bg-theme border-0 border-b-2 text-text"
defaultValue={lastTimeUnitValue || ""} defaultValue={lastTimeUnitValue || ""}
onChange={(e) => handleNumericInput(e,true)} onChange={(e) => handleNumericInput(e,true)}
onBlur={(e) => { onBlur={(e) => handleOnBlur(e,setLastTimeUnitValue,null)}
const value = e.target.value;
const numericValue = value ? Number(value) : undefined;
setLastTimeUnitValue(numericValue);
}}
placeholder={"Last"} placeholder={"Last"}
/> />
</div> </div>
...@@ -174,11 +218,7 @@ const SearchRanges: React.FC<SearchRangesProps> = ({ ...@@ -174,11 +218,7 @@ const SearchRanges: React.FC<SearchRangesProps> = ({
data-testid="from-block-input" data-testid="from-block-input"
defaultValue={fromBlock || ""} defaultValue={fromBlock || ""}
onChange={(e) => handleNumericInput(e)} onChange={(e) => handleNumericInput(e)}
onBlur={(e) => { onBlur={(e) => handleOnBlur(e,setFromBlock,validateFromBlock)}
const value = e.target.value;
const numericValue = value ? Number(value) : undefined;
setFromBlock(numericValue);
}}
placeholder="From" placeholder="From"
/> />
</div> </div>
...@@ -190,35 +230,15 @@ const SearchRanges: React.FC<SearchRangesProps> = ({ ...@@ -190,35 +230,15 @@ const SearchRanges: React.FC<SearchRangesProps> = ({
defaultValue={toBlock || ""} defaultValue={toBlock || ""}
onChange={(e) => handleNumericInput(e)} onChange={(e) => handleNumericInput(e)}
placeholder={"To"} placeholder={"To"}
onBlur={(e: React.FocusEvent<HTMLInputElement>) => { onBlur={(e) => handleOnBlur(e,setToBlock,validateToBlock)}
const value = e.target.value;
const numericValue = value ? Number(value) : undefined;
if (
numericValue &&
fromBlock &&
!isNaN(numericValue) &&
!isNaN(Number(fromBlock)) &&
numericValue < Number(fromBlock)
) {
setBlockRangeError("To block must be greater than From block");
e.target.value = "";
} else if (numericValue !=undefined && numericValue <= 0 && fromBlock) {
setBlockRangeError("To block must be greater than From block");
e.target.value = "";
} else {
setToBlock(numericValue);
setBlockRangeError(null);
}
}
}
/> />
</div> </div>
</div> </div>
)} )}
{blockRangeError && ( {rangeError && (
<ErrorMessage <ErrorMessage
message={blockRangeError} message={rangeError}
onClose={() => setBlockRangeError(null)} // Close the error message onClose={() => setRangeError(null)} // Close the error message
timeout={3000} timeout={3000}
/> />
)} )}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment