All checks were successful
continuous-integration/drone/push Build is passing
48 lines
1.1 KiB
TypeScript
48 lines
1.1 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
|
import { TextInput } from "./TextInput";
|
|
|
|
export function MACInput(p: {
|
|
label: string;
|
|
editable: boolean;
|
|
value?: string;
|
|
onValueChange?: (newVal: string | undefined) => void;
|
|
}): React.ReactElement {
|
|
const { onValueChange, ...props } = p;
|
|
return (
|
|
<TextInput
|
|
onValueChange={(v) => {
|
|
onValueChange?.(sanitizeMacAddress(v));
|
|
}}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function sanitizeMacAddress(s: string | undefined): string | undefined {
|
|
if (s === "" || s === undefined) return s;
|
|
|
|
const split = s.split(":");
|
|
if (split.length > 6) split.splice(6);
|
|
|
|
let needAnotherIteration = false;
|
|
|
|
const res = split
|
|
.map((e) => {
|
|
if (e === "") return e;
|
|
|
|
const num = parseInt(e, 16);
|
|
if (isNaN(num)) return "0";
|
|
|
|
const s = num.toString(16).padStart(2, "0");
|
|
if (num > 0xff) {
|
|
needAnotherIteration = true;
|
|
return s.slice(0, 2) + ":" + s.slice(2);
|
|
}
|
|
|
|
return s;
|
|
})
|
|
.join(":");
|
|
|
|
return needAnotherIteration ? sanitizeMacAddress(res) : res;
|
|
}
|