blob: 9d1d4242992bbbb60c0b8bff60d2d66507ef98be (
plain) (
blame)
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
|
import { reactive, watch, type Ref } from 'vue';
type UseValidationRule<T> = {
validator: (value: T) => boolean;
message: string;
};
export function useValidation<T>({ source, rules }: { source: Ref<T>; rules: UseValidationRule<T>[] }) {
const state = reactive<{
message: string;
status: undefined | 'error';
}>({
message: '',
status: undefined,
});
watch([source], () => {
state.message = '';
state.status = undefined;
for (const rule of rules) {
if (!rule.validator(source.value)) {
state.message = rule.message;
state.status = 'error';
}
}
});
return state;
}
|