File size: 724 Bytes
28faefd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
export type CreateFieldValidationArgs = {
	validate: (v: string) => string | void | undefined;
};

export function createFieldValidation(args: CreateFieldValidationArgs) {
	let valid = $state(true);
	let msg = $state<string>();

	const onblur = (e: Event & { currentTarget: HTMLInputElement }) => {
		const v = e.currentTarget?.value;
		const m = args.validate(v);
		valid = !m;
		msg = m ?? undefined;
	};

	const oninput = (e: Event & { currentTarget: HTMLInputElement }) => {
		if (valid) return;
		const v = e.currentTarget.value;
		const m = args.validate(v);
		msg = m ? m : undefined;
	};

	return {
		get valid() {
			return valid;
		},
		get msg() {
			return msg;
		},
		attrs: {
			onblur,
			oninput,
		},
	};
}