Commit IP input prototype
This commit is contained in:
Executable
+70
@@ -0,0 +1,70 @@
|
||||
import type React from "react";
|
||||
import { forwardRef, InputHTMLAttributes, useEffect } from "react";
|
||||
|
||||
import { InfoWrapper, InfoWrapperProps } from "@components/form/InfoWrapper.js";
|
||||
import { ExclamationCircleIcon } from "@heroicons/react/24/outline";
|
||||
import { useState } from "react";
|
||||
import type { InputProps } from "./Input.js";
|
||||
|
||||
export const IPInput = forwardRef<HTMLInputElement, InputProps>(function Input(
|
||||
{
|
||||
label,
|
||||
description,
|
||||
prefix,
|
||||
suffix,
|
||||
action,
|
||||
error,
|
||||
disabled,
|
||||
value,
|
||||
...rest
|
||||
}: InputProps,
|
||||
ref
|
||||
) {
|
||||
const [numericalValue, setNumericalValue] = useState<number>();
|
||||
const [facadeInputValue, setFacadeInputValue] = useState<string>();
|
||||
|
||||
useEffect(() => {
|
||||
if (typeof value === "number") {
|
||||
setFacadeInputValue(
|
||||
value
|
||||
.toString(16)
|
||||
.match(/.{1,3}/g)
|
||||
?.map((v) => parseInt(v, 10))
|
||||
?.join(".")
|
||||
);
|
||||
}
|
||||
}, [value]);
|
||||
|
||||
return (
|
||||
<InfoWrapper label={label} description={description} error={error}>
|
||||
<div className="relative flex rounded-md">
|
||||
<input value={numericalValue} ref={ref} hidden />
|
||||
<input
|
||||
value={facadeInputValue}
|
||||
onChange={(e) => {
|
||||
setFacadeInputValue(e.target.value);
|
||||
setNumericalValue(
|
||||
parseInt(
|
||||
e.target.value
|
||||
.split(".")
|
||||
.map((v) => parseInt(v).toString(16))
|
||||
.join(""),
|
||||
16
|
||||
)
|
||||
);
|
||||
}}
|
||||
className={`flex h-10 w-full rounded-md border-none bg-backgroundPrimary px-3 text-sm text-textPrimary focus:outline-none focus:ring-2 focus:ring-accent ${
|
||||
prefix ? "rounded-l-none" : ""
|
||||
} ${action ? "rounded-r-none" : ""} ${
|
||||
disabled
|
||||
? "cursor-not-allowed text-textSecondary brightness-disabled hover:brightness-disabled"
|
||||
: ""
|
||||
}`}
|
||||
disabled={disabled}
|
||||
step="any"
|
||||
{...rest}
|
||||
/>
|
||||
</div>
|
||||
</InfoWrapper>
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user