@ask-ell/react 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/package.json +5 -18
- package/src/forms.d.ts +32 -0
- package/src/forms.d.ts.map +1 -0
- package/src/forms.js +55 -0
- package/src/index.d.ts +4 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +6 -0
- package/src/keyboard-events.d.ts +5 -0
- package/src/keyboard-events.d.ts.map +1 -0
- package/src/keyboard-events.js +17 -0
- package/src/select-events.d.ts +2 -0
- package/src/select-events.d.ts.map +1 -0
- package/src/select-events.js +7 -0
- package/src/forms.ts +0 -92
- package/src/index.ts +0 -3
- package/src/keyboard-events.ts +0 -19
- package/src/select-events.ts +0 -5
- package/tsconfig.json +0 -10
- package/tsconfig.lib.json +0 -14
package/README.md
CHANGED
package/package.json
CHANGED
|
@@ -1,24 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ask-ell/react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"private": false,
|
|
5
|
-
"type": "
|
|
6
|
-
"main": "./
|
|
7
|
-
"
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
"./package.json": "./package.json",
|
|
11
|
-
".": {
|
|
12
|
-
"types": "./dist/index.d.ts",
|
|
13
|
-
"import": "./dist/index.js",
|
|
14
|
-
"default": "./dist/index.js"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"main": "./src/index.js",
|
|
7
|
+
"types": "./src/index.d.ts",
|
|
17
8
|
"dependencies": {
|
|
18
|
-
"react": "^19.2.0",
|
|
19
9
|
"tslib": "^2.3.0"
|
|
20
|
-
},
|
|
21
|
-
"devDependencies": {
|
|
22
|
-
"@types/react": "^19.2.2"
|
|
23
10
|
}
|
|
24
|
-
}
|
|
11
|
+
}
|
package/src/forms.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Dispatch, FormEvent, SetStateAction } from "react";
|
|
2
|
+
export declare enum SubmitMode {
|
|
3
|
+
ON_TRIGGER = 0,
|
|
4
|
+
AUTOMATIC = 1
|
|
5
|
+
}
|
|
6
|
+
export type ErrorSetter<FormData> = (key: keyof FormData) => (errorMessage: string) => void;
|
|
7
|
+
export type OnSubmitCallbackParams<FormData> = {
|
|
8
|
+
formData: FormData;
|
|
9
|
+
appendError: ErrorSetter<FormData>;
|
|
10
|
+
};
|
|
11
|
+
export type OnSubmitCallback<FormData> = (params: OnSubmitCallbackParams<FormData>) => void;
|
|
12
|
+
export type UseFormParams<FormData> = {
|
|
13
|
+
defaultValue: FormData;
|
|
14
|
+
onSubmit: OnSubmitCallback<FormData>;
|
|
15
|
+
submitMode?: SubmitMode;
|
|
16
|
+
};
|
|
17
|
+
type FormDataFieldUpdater<FormData> = <Key extends keyof FormData>(key: Key) => (value: FormData[Key]) => void;
|
|
18
|
+
type SubmitTrigger = () => void;
|
|
19
|
+
export interface ErrorsMap<FormData> extends Map<keyof FormData, string[]> {
|
|
20
|
+
}
|
|
21
|
+
export type FormController<FormData> = {
|
|
22
|
+
formData: FormData;
|
|
23
|
+
errors: ErrorsMap<FormData>;
|
|
24
|
+
setFormData: Dispatch<SetStateAction<FormData>>;
|
|
25
|
+
updateFormData: FormDataFieldUpdater<FormData>;
|
|
26
|
+
submit: SubmitTrigger;
|
|
27
|
+
reset: () => void;
|
|
28
|
+
};
|
|
29
|
+
export declare function useFormController<FormData>({ defaultValue, onSubmit, submitMode }: UseFormParams<FormData>): FormController<FormData>;
|
|
30
|
+
export declare const preventDefault: (callback: () => void) => (event: FormEvent) => void;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=forms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../../packages/react/src/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAY,MAAM,OAAO,CAAC;AAEtE,oBAAY,UAAU;IAClB,UAAU,IAAA;IACV,SAAS,IAAA;CACZ;AAED,MAAM,MAAM,WAAW,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,MAAM,QAAQ,KAAK,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5F,MAAM,MAAM,sBAAsB,CAAC,QAAQ,IAAI;IAC3C,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;AAE5F,MAAM,MAAM,aAAa,CAAC,QAAQ,IAAI;IAClC,YAAY,EAAE,QAAQ,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,UAAU,CAAA;CAC1B,CAAC;AAEF,KAAK,oBAAoB,CAAC,QAAQ,IAAI,CAAC,GAAG,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AAE/G,KAAK,aAAa,GAAG,MAAM,IAAI,CAAC;AAEhC,MAAM,WAAW,SAAS,CAAC,QAAQ,CAAE,SAAQ,GAAG,CAAC,MAAM,QAAQ,EAAE,MAAM,EAAE,CAAC;CAAI;AAE9E,MAAM,MAAM,cAAc,CAAC,QAAQ,IAAI;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC5B,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,cAAc,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,CAiDrI;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,IAAI,MAAM,OAAO,SAAS,KAAG,IAG3E,CAAC"}
|
package/src/forms.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.preventDefault = exports.SubmitMode = void 0;
|
|
4
|
+
exports.useFormController = useFormController;
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
var SubmitMode;
|
|
7
|
+
(function (SubmitMode) {
|
|
8
|
+
SubmitMode[SubmitMode["ON_TRIGGER"] = 0] = "ON_TRIGGER";
|
|
9
|
+
SubmitMode[SubmitMode["AUTOMATIC"] = 1] = "AUTOMATIC";
|
|
10
|
+
})(SubmitMode || (exports.SubmitMode = SubmitMode = {}));
|
|
11
|
+
function useFormController({ defaultValue, onSubmit, submitMode }) {
|
|
12
|
+
const [formData, setFormData] = (0, react_1.useState)(defaultValue);
|
|
13
|
+
const [errors, setErrors] = (0, react_1.useState)(new Map());
|
|
14
|
+
const appendError = (key) => (message) => {
|
|
15
|
+
const existingErrors = errors.get(key) ?? [];
|
|
16
|
+
existingErrors.push(message);
|
|
17
|
+
errors.set(key, existingErrors);
|
|
18
|
+
setErrors(new Map(errors));
|
|
19
|
+
};
|
|
20
|
+
const prepareOnSubmit = (callback) => {
|
|
21
|
+
errors.clear();
|
|
22
|
+
setErrors(new Map(errors));
|
|
23
|
+
callback();
|
|
24
|
+
};
|
|
25
|
+
const updateFormData = (key) => (value) => {
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
const newFormData = {
|
|
28
|
+
...formData,
|
|
29
|
+
[key]: value
|
|
30
|
+
};
|
|
31
|
+
setFormData(() => newFormData);
|
|
32
|
+
if (submitMode === SubmitMode.AUTOMATIC) {
|
|
33
|
+
prepareOnSubmit(() => onSubmit({ formData: newFormData, appendError }));
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
const submit = () => prepareOnSubmit(() => onSubmit({ formData, appendError }));
|
|
38
|
+
const reset = () => {
|
|
39
|
+
setFormData(defaultValue);
|
|
40
|
+
errors.clear();
|
|
41
|
+
};
|
|
42
|
+
return {
|
|
43
|
+
formData,
|
|
44
|
+
errors,
|
|
45
|
+
setFormData,
|
|
46
|
+
updateFormData,
|
|
47
|
+
submit,
|
|
48
|
+
reset
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const preventDefault = (callback) => (event) => {
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
callback();
|
|
54
|
+
};
|
|
55
|
+
exports.preventDefault = preventDefault;
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/react/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA"}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./forms.js"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./keyboard-events.js"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./select-events.js"), exports);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ChangeEvent, KeyboardEvent } from 'react';
|
|
2
|
+
export declare const handleEnterKeyDown: (callback: () => void) => (event: KeyboardEvent<HTMLInputElement>) => void;
|
|
3
|
+
export declare const handleKeyboardEvent: (callback: (fieldValue: string) => void) => <TargetType>(event: KeyboardEvent<TargetType>) => void;
|
|
4
|
+
export declare const handleChangeEvent: (callback: (fieldValue: string) => void) => <TargetType>(event: ChangeEvent<TargetType>) => void;
|
|
5
|
+
//# sourceMappingURL=keyboard-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboard-events.d.ts","sourceRoot":"","sources":["../../../../packages/react/src/keyboard-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAGnD,eAAO,MAAM,kBAAkB,GAC5B,UAAU,MAAM,IAAI,MAAM,OAAO,aAAa,CAAC,gBAAgB,CAAC,SAIhE,CAAC;AAEJ,eAAO,MAAM,mBAAmB,GAC7B,UAAU,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,MAAM,UAAU,EAAE,OAAO,aAAa,CAAC,UAAU,CAAC,SAExF,CAAC;AAEJ,eAAO,MAAM,iBAAiB,GAC3B,UAAU,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,MAAM,UAAU,EAAE,OAAO,WAAW,CAAC,UAAU,CAAC,SAEtF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleChangeEvent = exports.handleKeyboardEvent = exports.handleEnterKeyDown = void 0;
|
|
4
|
+
const handleEnterKeyDown = (callback) => (event) => {
|
|
5
|
+
if (event.key === 'Enter') {
|
|
6
|
+
callback();
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
exports.handleEnterKeyDown = handleEnterKeyDown;
|
|
10
|
+
const handleKeyboardEvent = (callback) => (event) => {
|
|
11
|
+
callback(event.target.value);
|
|
12
|
+
};
|
|
13
|
+
exports.handleKeyboardEvent = handleKeyboardEvent;
|
|
14
|
+
const handleChangeEvent = (callback) => (event) => {
|
|
15
|
+
callback(event.target.value);
|
|
16
|
+
};
|
|
17
|
+
exports.handleChangeEvent = handleChangeEvent;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-events.d.ts","sourceRoot":"","sources":["../../../../packages/react/src/select-events.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,GAC1B,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,MAC5B,CAAC,EAAE,OAAO,CAAC,KAAG,IAElB,CAAC"}
|
package/src/forms.ts
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { Dispatch, FormEvent, SetStateAction, useState } from "react";
|
|
2
|
-
|
|
3
|
-
export enum SubmitMode {
|
|
4
|
-
ON_TRIGGER,
|
|
5
|
-
AUTOMATIC
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export type ErrorSetter<FormData> = (key: keyof FormData) => (errorMessage: string) => void;
|
|
9
|
-
|
|
10
|
-
export type OnSubmitCallbackParams<FormData> = {
|
|
11
|
-
formData: FormData;
|
|
12
|
-
appendError: ErrorSetter<FormData>;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export type OnSubmitCallback<FormData> = (params: OnSubmitCallbackParams<FormData>) => void;
|
|
16
|
-
|
|
17
|
-
export type UseFormParams<FormData> = {
|
|
18
|
-
defaultValue: FormData;
|
|
19
|
-
onSubmit: OnSubmitCallback<FormData>;
|
|
20
|
-
submitMode?: SubmitMode
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
type FormDataFieldUpdater<FormData> = <Key extends keyof FormData>(key: Key) => (value: FormData[Key]) => void;
|
|
24
|
-
|
|
25
|
-
type SubmitTrigger = () => void;
|
|
26
|
-
|
|
27
|
-
export interface ErrorsMap<FormData> extends Map<keyof FormData, string[]> { }
|
|
28
|
-
|
|
29
|
-
export type FormController<FormData> = {
|
|
30
|
-
formData: FormData;
|
|
31
|
-
errors: ErrorsMap<FormData>;
|
|
32
|
-
setFormData: Dispatch<SetStateAction<FormData>>;
|
|
33
|
-
updateFormData: FormDataFieldUpdater<FormData>;
|
|
34
|
-
submit: SubmitTrigger;
|
|
35
|
-
reset: () => void;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
export function useFormController<FormData>({ defaultValue, onSubmit, submitMode }: UseFormParams<FormData>): FormController<FormData> {
|
|
39
|
-
const [formData, setFormData] = useState<FormData>(defaultValue);
|
|
40
|
-
const [errors, setErrors] = useState<ErrorsMap<FormData>>(new Map());
|
|
41
|
-
|
|
42
|
-
const appendError: ErrorSetter<FormData> = (key: keyof FormData) => (message: string): void => {
|
|
43
|
-
const existingErrors: string[] = errors.get(key) ?? [];
|
|
44
|
-
existingErrors.push(message);
|
|
45
|
-
errors.set(key, existingErrors);
|
|
46
|
-
setErrors(new Map(errors));
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const prepareOnSubmit = (callback: () => void) => {
|
|
50
|
-
errors.clear()
|
|
51
|
-
setErrors(new Map(errors));
|
|
52
|
-
callback();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const updateFormData: FormDataFieldUpdater<FormData> = <Key extends keyof FormData>(key: Key) => (value: FormData[Key]) => {
|
|
56
|
-
setTimeout((): void => {
|
|
57
|
-
const newFormData: FormData = {
|
|
58
|
-
...formData,
|
|
59
|
-
[key]: value
|
|
60
|
-
}
|
|
61
|
-
setFormData(() => newFormData);
|
|
62
|
-
if (submitMode === SubmitMode.AUTOMATIC) {
|
|
63
|
-
prepareOnSubmit(
|
|
64
|
-
(): void => onSubmit({ formData: newFormData, appendError })
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
const submit: SubmitTrigger = (): void => prepareOnSubmit(
|
|
71
|
-
(): void => onSubmit({ formData, appendError })
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
const reset = (): void => {
|
|
75
|
-
setFormData(defaultValue)
|
|
76
|
-
errors.clear();
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return {
|
|
80
|
-
formData,
|
|
81
|
-
errors,
|
|
82
|
-
setFormData,
|
|
83
|
-
updateFormData,
|
|
84
|
-
submit,
|
|
85
|
-
reset
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export const preventDefault = (callback: () => void) => (event: FormEvent): void => {
|
|
90
|
-
event.preventDefault();
|
|
91
|
-
callback();
|
|
92
|
-
};
|
package/src/index.ts
DELETED
package/src/keyboard-events.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { ChangeEvent, KeyboardEvent } from 'react';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export const handleEnterKeyDown =
|
|
5
|
-
(callback: () => void) => (event: KeyboardEvent<HTMLInputElement>) => {
|
|
6
|
-
if (event.key === 'Enter') {
|
|
7
|
-
callback();
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export const handleKeyboardEvent =
|
|
12
|
-
(callback: (fieldValue: string) => void) => <TargetType>(event: KeyboardEvent<TargetType>) => {
|
|
13
|
-
callback((event.target as any).value as string);
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export const handleChangeEvent =
|
|
17
|
-
(callback: (fieldValue: string) => void) => <TargetType>(event: ChangeEvent<TargetType>) => {
|
|
18
|
-
callback((event.target as any).value as string);
|
|
19
|
-
};
|
package/src/select-events.ts
DELETED
package/tsconfig.json
DELETED
package/tsconfig.lib.json
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.base.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"baseUrl": ".",
|
|
5
|
-
"rootDir": "src",
|
|
6
|
-
"outDir": "dist",
|
|
7
|
-
"tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
|
|
8
|
-
"emitDeclarationOnly": false,
|
|
9
|
-
"forceConsistentCasingInFileNames": true,
|
|
10
|
-
"types": ["node"]
|
|
11
|
-
},
|
|
12
|
-
"include": ["src/**/*.ts"],
|
|
13
|
-
"references": []
|
|
14
|
-
}
|