jb-image-input
Version:
image input web component
103 lines (90 loc) • 3.02 kB
text/typescript
import { JBImageInputWebComponent, type JBImageInputBridge, type JBImageInputConfig, type ValidationValue } from "jb-image-input";
import { type ValidationItem } from "jb-validation";
import { RefObject, useEffect } from "react";
export type JBImageInputAttributes<TValue> = {
validationList?: ValidationItem<ValidationValue<TValue>>[],
config?: JBImageInputConfig,
value?: TValue,
bridge?: JBImageInputBridge<TValue>,
multiple?: boolean,
name?: string,
file?: File,
acceptTypes?: string,
maxFileSize?: number,
required?: boolean | string,
label?: string,
message?: string,
}
export function useJBImageInputAttribute<TValue>(element: RefObject<JBImageInputWebComponent<TValue>>, props: JBImageInputAttributes<TValue>) {
useEffect(() => {
if (props.config && element.current) {
element.current.config = props.config;
}
}, [props.config]);
useEffect(() => {
if (props.bridge && element.current) {
element.current.bridge = props.bridge;
}
}, [props.bridge]);
useEffect(() => {
if (props.validationList && element.current) {
element.current.validation.list = props.validationList;
}
}, [props.validationList]);
useEffect(() => {
if (props.multiple) {
element.current?.setAttribute('multiple', 'true');
} else {
element.current?.removeAttribute('multiple');
}
}, [props.multiple]);
useEffect(() => {
if (props.value !== undefined && element.current) {
element.current.value = props.value;
}
}, [props.value]);
useEffect(() => {
if (props.file) {
element.current?.selectImageByFile(props.file);
}
}, [props.file]);
useEffect(() => {
if (props.acceptTypes && element.current) {
element.current.acceptTypes = props.acceptTypes;
}
}, [props.acceptTypes]);
useEffect(() => {
if (props.maxFileSize !== undefined && element.current) {
element.current.maxFileSize = props.maxFileSize;
}
}, [props.maxFileSize]);
useEffect(() => {
if (props.name) {
element?.current?.setAttribute('name', props.name || '');
} else {
element?.current?.removeAttribute('name');
}
}, [props.name]);
useEffect(() => {
if (props.label) {
element?.current?.setAttribute('label', props.label || '');
} else {
element?.current?.removeAttribute('label');
}
}, [props.label]);
useEffect(() => {
if (props.message) {
element?.current?.setAttribute('message', props.message || '');
} else {
element?.current?.removeAttribute('message');
}
}, [props.message]);
useEffect(() => {
if (typeof props.required === "string") {
element?.current?.setAttribute('required', props.required);
}
if (typeof props.required === "boolean") {
props.required?element?.current?.setAttribute('required', ''):element?.current?.removeAttribute('required');
}
}, [props.required]);
}