@zuzjs/ui 0.8.1 → 0.8.3
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/dist/cjs/comps/Accordion/index.js +1 -1
- package/dist/cjs/comps/Actionbar/index.js +1 -1
- package/dist/cjs/comps/Alert/index.js +1 -1
- package/dist/cjs/comps/AutoComplete/index.d.ts +1 -1
- package/dist/cjs/comps/AutoComplete/index.js +3 -2
- package/dist/cjs/comps/Avatar/index.js +5 -5
- package/dist/cjs/comps/Box/index.js +1 -1
- package/dist/cjs/comps/Button/index.js +1 -1
- package/dist/cjs/comps/CheckBox/index.d.ts +1 -0
- package/dist/cjs/comps/CheckBox/index.js +1 -1
- package/dist/cjs/comps/CheckBox/types.d.ts +1 -0
- package/dist/cjs/comps/ColorScheme/index.js +1 -1
- package/dist/cjs/comps/ContextMenu/index.d.ts +2 -0
- package/dist/cjs/comps/ContextMenu/index.js +6 -6
- package/dist/cjs/comps/ContextMenu/item.js +1 -1
- package/dist/cjs/comps/ContextMenu/types.d.ts +3 -1
- package/dist/cjs/comps/CookiesConsent/index.js +1 -1
- package/dist/cjs/comps/Cover/index.js +1 -1
- package/dist/cjs/comps/Cropper/index.d.ts +8 -0
- package/dist/cjs/comps/Cropper/index.js +20 -0
- package/dist/cjs/comps/Cropper/types.d.ts +14 -0
- package/dist/cjs/comps/Cropper/types.js +5 -0
- package/dist/cjs/comps/Crumb/index.d.ts +2 -1
- package/dist/cjs/comps/Crumb/index.js +13 -3
- package/dist/cjs/comps/Crumb/types.d.ts +1 -0
- package/dist/cjs/comps/Drawer/index.js +1 -1
- package/dist/cjs/comps/Fab/index.js +1 -1
- package/dist/cjs/comps/Filters/index.js +1 -1
- package/dist/cjs/comps/Form/index.js +22 -6
- package/dist/cjs/comps/Icon/index.js +1 -1
- package/dist/cjs/comps/Image/index.js +1 -1
- package/dist/cjs/comps/Input/index.d.ts +2 -2
- package/dist/cjs/comps/Input/index.js +1 -1
- package/dist/cjs/comps/KeyboardKeys/index.js +1 -1
- package/dist/cjs/comps/Label/index.js +1 -1
- package/dist/cjs/comps/List/index.d.ts +1 -1
- package/dist/cjs/comps/List/index.js +1 -1
- package/dist/cjs/comps/Network/index.js +1 -1
- package/dist/cjs/comps/Overlay/index.js +1 -1
- package/dist/cjs/comps/Pagination/index.js +1 -1
- package/dist/cjs/comps/Password/index.d.ts +6 -2
- package/dist/cjs/comps/Password/index.js +15 -5
- package/dist/cjs/comps/PinInput/index.d.ts +1 -1
- package/dist/cjs/comps/PinInput/index.js +8 -3
- package/dist/cjs/comps/ProgressBar/index.js +2 -2
- package/dist/cjs/comps/Radio/index.js +1 -1
- package/dist/cjs/comps/ScrollView/index.js +1 -1
- package/dist/cjs/comps/Search/index.d.ts +1 -1
- package/dist/cjs/comps/Search/index.js +1 -1
- package/dist/cjs/comps/Segmented/index.js +1 -1
- package/dist/cjs/comps/Select/index.d.ts +1 -0
- package/dist/cjs/comps/Select/index.js +3 -3
- package/dist/cjs/comps/Select/types.d.ts +6 -1
- package/dist/cjs/comps/Sheet/index.js +1 -1
- package/dist/cjs/comps/Sidebar/index.js +1 -1
- package/dist/cjs/comps/Slider/index.js +1 -1
- package/dist/cjs/comps/Span/index.js +1 -1
- package/dist/cjs/comps/Spinner/index.js +1 -1
- package/dist/cjs/comps/Switch/index.d.ts +1 -0
- package/dist/cjs/comps/Switch/index.js +1 -1
- package/dist/cjs/comps/TabView/body.js +1 -1
- package/dist/cjs/comps/TabView/index.js +1 -1
- package/dist/cjs/comps/TabView/tab.js +1 -1
- package/dist/cjs/comps/Table/col.js +1 -1
- package/dist/cjs/comps/Table/index.js +56 -2
- package/dist/cjs/comps/Table/row.js +1 -1
- package/dist/cjs/comps/Text/index.js +1 -1
- package/dist/cjs/comps/TextArea/index.js +1 -1
- package/dist/cjs/comps/TextWheel/index.js +3 -3
- package/dist/cjs/comps/Tooltip/index.js +1 -1
- package/dist/cjs/comps/Treeview/index.js +1 -1
- package/dist/cjs/comps/Treeview/item.js +1 -1
- package/dist/cjs/comps/VideoPlayer/index.js +1 -0
- package/dist/cjs/comps/index.d.ts +2 -0
- package/dist/cjs/comps/index.js +2 -0
- package/dist/cjs/funs/events.d.ts +31 -7
- package/dist/cjs/funs/events.js +57 -19
- package/dist/cjs/funs/index.d.ts +5 -3
- package/dist/cjs/funs/index.js +39 -84
- package/dist/cjs/hooks/index.d.ts +2 -0
- package/dist/cjs/hooks/index.js +2 -0
- package/dist/cjs/hooks/useDB.d.ts +5 -1
- package/dist/cjs/hooks/useDB.js +52 -4
- package/dist/cjs/hooks/useImage.js +2 -2
- package/dist/cjs/hooks/useImageCropper.d.ts +10 -0
- package/dist/cjs/hooks/useImageCropper.js +67 -0
- package/dist/cjs/hooks/useSlider.d.ts +1 -1
- package/dist/cjs/hooks/useUploader.d.ts +46 -0
- package/dist/cjs/hooks/useUploader.js +101 -0
- package/dist/cjs/hooks/useWebSocket.d.ts +2 -2
- package/dist/cjs/hooks/useWebSocket.js +13 -2
- package/dist/cjs/types/index.d.ts +3 -0
- package/dist/css/styles.css +1 -1
- package/dist/esm/comps/Accordion/index.js +1 -1
- package/dist/esm/comps/Actionbar/index.js +1 -1
- package/dist/esm/comps/Alert/index.js +1 -1
- package/dist/esm/comps/AutoComplete/index.d.ts +1 -1
- package/dist/esm/comps/AutoComplete/index.js +3 -2
- package/dist/esm/comps/Avatar/index.js +5 -5
- package/dist/esm/comps/Box/index.js +1 -1
- package/dist/esm/comps/Button/index.js +1 -1
- package/dist/esm/comps/CheckBox/index.d.ts +1 -0
- package/dist/esm/comps/CheckBox/index.js +1 -1
- package/dist/esm/comps/CheckBox/types.d.ts +1 -0
- package/dist/esm/comps/ColorScheme/index.js +1 -1
- package/dist/esm/comps/ContextMenu/index.d.ts +2 -0
- package/dist/esm/comps/ContextMenu/index.js +6 -6
- package/dist/esm/comps/ContextMenu/item.js +1 -1
- package/dist/esm/comps/ContextMenu/types.d.ts +3 -1
- package/dist/esm/comps/CookiesConsent/index.js +1 -1
- package/dist/esm/comps/Cover/index.js +1 -1
- package/dist/esm/comps/Cropper/index.d.ts +8 -0
- package/dist/esm/comps/Cropper/index.js +20 -0
- package/dist/esm/comps/Cropper/types.d.ts +14 -0
- package/dist/esm/comps/Cropper/types.js +5 -0
- package/dist/esm/comps/Crumb/index.d.ts +2 -1
- package/dist/esm/comps/Crumb/index.js +13 -3
- package/dist/esm/comps/Crumb/types.d.ts +1 -0
- package/dist/esm/comps/Drawer/index.js +1 -1
- package/dist/esm/comps/Fab/index.js +1 -1
- package/dist/esm/comps/Filters/index.js +1 -1
- package/dist/esm/comps/Form/index.js +22 -6
- package/dist/esm/comps/Icon/index.js +1 -1
- package/dist/esm/comps/Image/index.js +1 -1
- package/dist/esm/comps/Input/index.d.ts +2 -2
- package/dist/esm/comps/Input/index.js +1 -1
- package/dist/esm/comps/KeyboardKeys/index.js +1 -1
- package/dist/esm/comps/Label/index.js +1 -1
- package/dist/esm/comps/List/index.d.ts +1 -1
- package/dist/esm/comps/List/index.js +1 -1
- package/dist/esm/comps/Network/index.js +1 -1
- package/dist/esm/comps/Overlay/index.js +1 -1
- package/dist/esm/comps/Pagination/index.js +1 -1
- package/dist/esm/comps/Password/index.d.ts +6 -2
- package/dist/esm/comps/Password/index.js +15 -5
- package/dist/esm/comps/PinInput/index.d.ts +1 -1
- package/dist/esm/comps/PinInput/index.js +8 -3
- package/dist/esm/comps/ProgressBar/index.js +2 -2
- package/dist/esm/comps/Radio/index.js +1 -1
- package/dist/esm/comps/ScrollView/index.js +1 -1
- package/dist/esm/comps/Search/index.d.ts +1 -1
- package/dist/esm/comps/Search/index.js +1 -1
- package/dist/esm/comps/Segmented/index.js +1 -1
- package/dist/esm/comps/Select/index.d.ts +1 -0
- package/dist/esm/comps/Select/index.js +3 -3
- package/dist/esm/comps/Select/types.d.ts +6 -1
- package/dist/esm/comps/Sheet/index.js +1 -1
- package/dist/esm/comps/Sidebar/index.js +1 -1
- package/dist/esm/comps/Slider/index.js +1 -1
- package/dist/esm/comps/Span/index.js +1 -1
- package/dist/esm/comps/Spinner/index.js +1 -1
- package/dist/esm/comps/Switch/index.d.ts +1 -0
- package/dist/esm/comps/Switch/index.js +1 -1
- package/dist/esm/comps/TabView/body.js +1 -1
- package/dist/esm/comps/TabView/index.js +1 -1
- package/dist/esm/comps/TabView/tab.js +1 -1
- package/dist/esm/comps/Table/col.js +1 -1
- package/dist/esm/comps/Table/index.js +56 -2
- package/dist/esm/comps/Table/row.js +1 -1
- package/dist/esm/comps/Text/index.js +1 -1
- package/dist/esm/comps/TextArea/index.js +1 -1
- package/dist/esm/comps/TextWheel/index.js +3 -3
- package/dist/esm/comps/Tooltip/index.js +1 -1
- package/dist/esm/comps/Treeview/index.js +1 -1
- package/dist/esm/comps/Treeview/item.js +1 -1
- package/dist/esm/comps/VideoPlayer/index.js +1 -0
- package/dist/esm/comps/index.d.ts +2 -0
- package/dist/esm/comps/index.js +2 -0
- package/dist/esm/funs/events.d.ts +31 -7
- package/dist/esm/funs/events.js +57 -19
- package/dist/esm/funs/index.d.ts +5 -3
- package/dist/esm/funs/index.js +39 -84
- package/dist/esm/hooks/index.d.ts +2 -0
- package/dist/esm/hooks/index.js +2 -0
- package/dist/esm/hooks/useDB.d.ts +5 -1
- package/dist/esm/hooks/useDB.js +52 -4
- package/dist/esm/hooks/useImage.js +2 -2
- package/dist/esm/hooks/useImageCropper.d.ts +10 -0
- package/dist/esm/hooks/useImageCropper.js +67 -0
- package/dist/esm/hooks/useSlider.d.ts +1 -1
- package/dist/esm/hooks/useUploader.d.ts +46 -0
- package/dist/esm/hooks/useUploader.js +101 -0
- package/dist/esm/hooks/useWebSocket.d.ts +2 -2
- package/dist/esm/hooks/useWebSocket.js +13 -2
- package/dist/esm/types/index.d.ts +3 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -17,11 +17,11 @@ const TextWheel = forwardRef((props, ref) => {
|
|
|
17
17
|
this.updateValue(v);
|
|
18
18
|
if (divRef.current) {
|
|
19
19
|
const chars = v.toString().split('');
|
|
20
|
-
divRef.current.querySelectorAll('
|
|
20
|
+
divRef.current.querySelectorAll('.--wheel-char').forEach((charElement, index) => {
|
|
21
21
|
const char = chars[index];
|
|
22
22
|
if (charElement instanceof HTMLElement) {
|
|
23
23
|
charElement.setAttribute('data-value', char);
|
|
24
|
-
const track = charElement.querySelector('
|
|
24
|
+
const track = charElement.querySelector('.--wheel-char-track');
|
|
25
25
|
if (track instanceof HTMLElement) {
|
|
26
26
|
track.style.setProperty('--v', char);
|
|
27
27
|
}
|
|
@@ -50,5 +50,5 @@ const TextWheel = forwardRef((props, ref) => {
|
|
|
50
50
|
background: `linear-gradient(0deg, ${color}, transparent, transparent, transparent, ${color})`,
|
|
51
51
|
} })] });
|
|
52
52
|
});
|
|
53
|
-
TextWheel.displayName = `TextWheel`;
|
|
53
|
+
TextWheel.displayName = `Zuz.TextWheel`;
|
|
54
54
|
export default TextWheel;
|
|
@@ -22,5 +22,5 @@ const TreeView = forwardRef((props, ref) => {
|
|
|
22
22
|
.filter(node => roots.includes(node.tag))
|
|
23
23
|
.map(node => _jsx(TreeItem, { treeTag: treeViewTag ? `-${treeViewTag}` : ``, selected: selected, onSelect: e => handleSelect(e), icons: icons, meta: node, roots: roots, expanded: node.expanded || false, skeleton: rest.skeleton, nodes: nodes }, `--node-${node.tag}`)) });
|
|
24
24
|
});
|
|
25
|
-
TreeView.displayName = `
|
|
25
|
+
TreeView.displayName = `Zuz.TreeView`;
|
|
26
26
|
export default TreeView;
|
|
@@ -27,7 +27,7 @@ const TreeItem = forwardRef((props, ref) => {
|
|
|
27
27
|
: _nodes.length == 0 ? SVGIcons.chevronBottom : isOpen ? SVGIcons.chevronBottom : SVGIcons.chevronRight }), _jsxs(Button, { className: `--node-meta flex aic`, onClick: (e) => onSelect(tag), children: [((icons?.nodeOpen && icons?.nodeClose) || (isRoot && icons?.rootOpen && icons?.rootClose)) &&
|
|
28
28
|
_jsx(Icon, { skeleton: rest.skeleton, className: `--node-icon ${isRoot ? `--icon-root` : ``}`, name: icon || (isOpen ?
|
|
29
29
|
isRoot ? icons?.rootOpen || icons.nodeOpen : icons.nodeOpen
|
|
30
|
-
: isRoot ? icons?.rootClose || icons?.nodeClose : icons?.nodeClose) }), _jsx(Text, { ...{ className: `--node-label` }, skeleton: rest.skeleton, children: label })] })] }), isOpen && _nodes.length > 0 && _jsx(Box, { className: `--sub-node tree-sub-node-${tag} flex cols`, children: _nodes.map(node => _jsx(TreeItem, { treeTag: treeTag, selected: selected, onSelect: onSelect, icons: icons, roots: roots, expanded: node.expanded || false, meta: node, nodes: nodes }, `--node-${node.tag}`)) })] });
|
|
30
|
+
: isRoot ? icons?.rootClose || icons?.nodeClose : icons?.nodeClose) }), _jsx(Text, { ...{ className: `--node-label ${isRoot ? `--node-label-root` : ``}`.trim() }, skeleton: rest.skeleton, children: label })] })] }), isOpen && _nodes.length > 0 && _jsx(Box, { className: `--sub-node tree-sub-node-${tag} flex cols`, children: _nodes.map(node => _jsx(TreeItem, { treeTag: treeTag, selected: selected, onSelect: onSelect, icons: icons, roots: roots, expanded: node.expanded || false, meta: node, nodes: nodes }, `--node-${node.tag}`)) })] });
|
|
31
31
|
});
|
|
32
32
|
TreeItem.displayName = `TreeItem`;
|
|
33
33
|
export default TreeItem;
|
|
@@ -20,6 +20,8 @@ export * from './ContextMenu/types';
|
|
|
20
20
|
export { default as CookiesConsent } from './CookiesConsent';
|
|
21
21
|
export * from './CookiesConsent/types';
|
|
22
22
|
export { default as Cover, type CoverProps } from './Cover';
|
|
23
|
+
export { default as Cropper } from './Cropper';
|
|
24
|
+
export * from './Cropper/types';
|
|
23
25
|
export { default as Crumb } from './Crumb';
|
|
24
26
|
export * from './Crumb/types';
|
|
25
27
|
export { default as Drawer } from './Drawer';
|
package/dist/esm/comps/index.js
CHANGED
|
@@ -20,6 +20,8 @@ export * from './ContextMenu/types';
|
|
|
20
20
|
export { default as CookiesConsent } from './CookiesConsent';
|
|
21
21
|
export * from './CookiesConsent/types';
|
|
22
22
|
export { default as Cover } from './Cover';
|
|
23
|
+
export { default as Cropper } from './Cropper';
|
|
24
|
+
export * from './Cropper/types';
|
|
23
25
|
export { default as Crumb } from './Crumb';
|
|
24
26
|
export * from './Crumb/types';
|
|
25
27
|
export { default as Drawer } from './Drawer';
|
|
@@ -1,17 +1,41 @@
|
|
|
1
|
+
export interface EventListener {
|
|
2
|
+
fun: (...args: any[]) => void;
|
|
3
|
+
context?: any;
|
|
4
|
+
id: symbol;
|
|
5
|
+
}
|
|
1
6
|
export interface Event {
|
|
2
7
|
event: String | Symbol;
|
|
3
|
-
listeners: Array<
|
|
4
|
-
fun: (...args: any[]) => void;
|
|
5
|
-
context?: any;
|
|
6
|
-
}>;
|
|
8
|
+
listeners: Array<EventListener>;
|
|
7
9
|
}
|
|
8
10
|
declare class Events {
|
|
9
11
|
_events: Event[];
|
|
10
12
|
constructor();
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Registers an event listener.
|
|
15
|
+
* @param event The name of the event.
|
|
16
|
+
* @param fun The callback function.
|
|
17
|
+
* @param context Optional context (this) for the callback.
|
|
18
|
+
* @returns A function to unsubscribe this specific listener.
|
|
19
|
+
*/
|
|
20
|
+
on(event: String | Symbol, fun: (...args: any[]) => void, context?: any): () => void;
|
|
21
|
+
/**
|
|
22
|
+
* Removes event listeners matching a specific event and function.
|
|
23
|
+
* Note: This removes *all* listeners for the event that use the exact same function reference.
|
|
24
|
+
* It's often more reliable to use the unsubscribe function returned by 'on'.
|
|
25
|
+
* @param event The name of the event.
|
|
26
|
+
* @param fun The callback function to remove.
|
|
27
|
+
*/
|
|
14
28
|
off(event: String | Symbol, fun: (...args: any[]) => void): void;
|
|
29
|
+
/**
|
|
30
|
+
* Emits an event, calling all registered listeners.
|
|
31
|
+
* @param event The name of the event.
|
|
32
|
+
* @param args Arguments to pass to the listeners.
|
|
33
|
+
*/
|
|
15
34
|
emit(event: String | Symbol, ...args: any[]): void;
|
|
35
|
+
/**
|
|
36
|
+
* Removes all listeners for a specific event.
|
|
37
|
+
* @param event The name of the event.
|
|
38
|
+
*/
|
|
39
|
+
removeAllListeners(event: String | Symbol): void;
|
|
16
40
|
}
|
|
17
41
|
export default Events;
|
package/dist/esm/funs/events.js
CHANGED
|
@@ -3,42 +3,80 @@ class Events {
|
|
|
3
3
|
constructor() {
|
|
4
4
|
this._events = [];
|
|
5
5
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Registers an event listener.
|
|
8
|
+
* @param event The name of the event.
|
|
9
|
+
* @param fun The callback function.
|
|
10
|
+
* @param context Optional context (this) for the callback.
|
|
11
|
+
* @returns A function to unsubscribe this specific listener.
|
|
12
|
+
*/
|
|
13
|
+
on(event, fun, context) {
|
|
14
|
+
const evt = this._events.find(x => x.event === event);
|
|
15
|
+
const id = Symbol('listener_id'); // Give each listener a unique ID
|
|
16
|
+
const listener = {
|
|
17
|
+
fun: fun, // Store original function
|
|
18
|
+
context: context,
|
|
19
|
+
id: id,
|
|
20
|
+
};
|
|
9
21
|
if (!evt) {
|
|
10
|
-
|
|
22
|
+
this._events.push({ event: event, listeners: [listener] });
|
|
11
23
|
}
|
|
12
|
-
|
|
24
|
+
else {
|
|
13
25
|
evt.listeners.push(listener);
|
|
14
26
|
}
|
|
27
|
+
// Return an unsubscribe function
|
|
28
|
+
return () => {
|
|
29
|
+
const currentEvt = this._events.find(x => x.event === event);
|
|
30
|
+
if (currentEvt) {
|
|
31
|
+
currentEvt.listeners = currentEvt.listeners.filter(l => l.id !== id);
|
|
32
|
+
if (currentEvt.listeners.length === 0) {
|
|
33
|
+
this._events = this._events.filter(e => e.event !== event);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
15
37
|
}
|
|
16
|
-
|
|
17
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Removes event listeners matching a specific event and function.
|
|
40
|
+
* Note: This removes *all* listeners for the event that use the exact same function reference.
|
|
41
|
+
* It's often more reliable to use the unsubscribe function returned by 'on'.
|
|
42
|
+
* @param event The name of the event.
|
|
43
|
+
* @param fun The callback function to remove.
|
|
44
|
+
*/
|
|
45
|
+
off(event, fun) {
|
|
46
|
+
const evt = this._events.find(x => x.event === event);
|
|
18
47
|
if (evt) {
|
|
19
|
-
|
|
48
|
+
// Filter out listeners where the 'fun' property matches the provided function.
|
|
49
|
+
evt.listeners = evt.listeners.filter(listener => listener.fun !== fun);
|
|
50
|
+
// Optional: If no listeners remain for this event, remove the event entry.
|
|
51
|
+
if (evt.listeners.length === 0) {
|
|
52
|
+
this._events = this._events.filter(e => e.event !== event);
|
|
53
|
+
}
|
|
20
54
|
}
|
|
21
55
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
56
|
+
/**
|
|
57
|
+
* Emits an event, calling all registered listeners.
|
|
58
|
+
* @param event The name of the event.
|
|
59
|
+
* @param args Arguments to pass to the listeners.
|
|
60
|
+
*/
|
|
28
61
|
emit(event, ...args) {
|
|
29
|
-
const evt = this._events.find(x => x.event
|
|
62
|
+
const evt = this._events.find(x => x.event === event);
|
|
30
63
|
if (evt) {
|
|
31
|
-
|
|
32
|
-
evt.listeners.forEach(({ fun, context }) => {
|
|
64
|
+
[...evt.listeners].forEach(({ fun, context }) => {
|
|
33
65
|
try {
|
|
34
|
-
// f(args)
|
|
35
66
|
fun.apply(context, args);
|
|
36
67
|
}
|
|
37
68
|
catch (e) {
|
|
38
|
-
console.error(e);
|
|
69
|
+
console.error(`Error during event '${String(event)}' emission:`, e);
|
|
39
70
|
}
|
|
40
71
|
});
|
|
41
72
|
}
|
|
42
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Removes all listeners for a specific event.
|
|
76
|
+
* @param event The name of the event.
|
|
77
|
+
*/
|
|
78
|
+
removeAllListeners(event) {
|
|
79
|
+
this._events = this._events.filter(e => e.event !== event);
|
|
80
|
+
}
|
|
43
81
|
}
|
|
44
82
|
export default Events;
|
package/dist/esm/funs/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { AxiosProgressEvent } from "axios";
|
|
2
1
|
import { ReactElement, ReactNode, Ref } from "react";
|
|
3
2
|
import { KeyCode } from "../types/enums.js";
|
|
4
3
|
import { dynamicObject, FormatNumberParams, sortOptions } from "../types/index.js";
|
|
@@ -49,8 +48,6 @@ export declare const cleanProps: <T extends dynamicObject>(props: T, withProps?:
|
|
|
49
48
|
export declare const withZuz: (cx: string | string[]) => string;
|
|
50
49
|
export declare const setDeep: (object: dynamicObject, path: string, value: any, seperator?: string) => dynamicObject;
|
|
51
50
|
export declare const removeDuplicatesFromArray: <T>(array: T[]) => T[];
|
|
52
|
-
export declare const withPost: <T>(uri: string, data: dynamicObject | FormData, timeout?: number, onProgress?: (ev: AxiosProgressEvent) => void) => Promise<T>;
|
|
53
|
-
export declare const withGet: <T>(uri: string, timeout?: number, ignoreKind?: boolean) => Promise<T>;
|
|
54
51
|
export declare const withTime: (fun: (...args: any[]) => any) => {
|
|
55
52
|
result: any;
|
|
56
53
|
executionTime: number;
|
|
@@ -75,3 +72,8 @@ export declare const clamp: (value: number, min: number, max: number) => number;
|
|
|
75
72
|
export declare function mergeRefs<T>(...refs: (Ref<T> | undefined)[]): Ref<T>;
|
|
76
73
|
export declare const slugify: (text: string, separator?: string) => string;
|
|
77
74
|
export declare const truncate: (selector: string, lines?: number) => void;
|
|
75
|
+
export declare const checkPasswordStrength: (password: string) => {
|
|
76
|
+
score: number;
|
|
77
|
+
result: string;
|
|
78
|
+
suggestion: string[];
|
|
79
|
+
};
|
package/dist/esm/funs/index.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
1
|
import Hashids from "hashids";
|
|
3
|
-
import Cookies from "js-cookie";
|
|
4
2
|
import md5 from "md5";
|
|
5
3
|
import moment from "moment";
|
|
6
4
|
import { nanoid } from "nanoid";
|
|
@@ -205,88 +203,6 @@ export const removeDuplicatesFromArray = (array) => {
|
|
|
205
203
|
return accumulator;
|
|
206
204
|
}, []);
|
|
207
205
|
};
|
|
208
|
-
export const withPost = async (uri, data, timeout = 60, onProgress) => {
|
|
209
|
-
const _cookies = Cookies.get();
|
|
210
|
-
if (data instanceof FormData) {
|
|
211
|
-
for (const c in _cookies) {
|
|
212
|
-
data.append(c, _cookies[c]);
|
|
213
|
-
}
|
|
214
|
-
return new Promise((resolve, reject) => {
|
|
215
|
-
axios({
|
|
216
|
-
method: 'post',
|
|
217
|
-
url: uri,
|
|
218
|
-
data: data,
|
|
219
|
-
timeout: timeout * 1000,
|
|
220
|
-
headers: {
|
|
221
|
-
'Content-Type': 'multipart/form-data',
|
|
222
|
-
},
|
|
223
|
-
onUploadProgress: ev => onProgress && onProgress(ev)
|
|
224
|
-
})
|
|
225
|
-
.then(resp => {
|
|
226
|
-
if (resp.data && "kind" in resp.data) {
|
|
227
|
-
resolve(resp.data);
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
reject(resp.data);
|
|
231
|
-
}
|
|
232
|
-
})
|
|
233
|
-
.catch(err => reject(err));
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
return new Promise((resolve, reject) => {
|
|
237
|
-
axios.post(uri, {
|
|
238
|
-
...data,
|
|
239
|
-
..._cookies,
|
|
240
|
-
__stmp: new Date().getTime() / 1000
|
|
241
|
-
}, {
|
|
242
|
-
timeout: 1000 * timeout,
|
|
243
|
-
headers: {
|
|
244
|
-
'Content-Type': 'application/json',
|
|
245
|
-
}
|
|
246
|
-
})
|
|
247
|
-
.then(resp => {
|
|
248
|
-
if (resp.data && "kind" in resp.data) {
|
|
249
|
-
resolve(resp.data);
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
reject(resp.data);
|
|
253
|
-
}
|
|
254
|
-
})
|
|
255
|
-
.catch(err => {
|
|
256
|
-
if (err?.response?.data)
|
|
257
|
-
reject(err.response.data);
|
|
258
|
-
else
|
|
259
|
-
reject(err.code && err.code == `ERR_NETWORK` ? { error: err.code, message: navigator.onLine ? `Unable to connect to the server. It may be temporarily down.` : `Network error: Unable to connect. Please check your internet connection and try again.` } : err);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
};
|
|
263
|
-
export const withGet = async (uri, timeout = 60, ignoreKind = false) => {
|
|
264
|
-
return new Promise((resolve, reject) => {
|
|
265
|
-
axios
|
|
266
|
-
.get(uri, { timeout: timeout * 1000 })
|
|
267
|
-
.then((resp) => {
|
|
268
|
-
if (ignoreKind || (resp.data && "kind" in resp.data)) {
|
|
269
|
-
resolve(resp.data);
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
reject(resp.data);
|
|
273
|
-
}
|
|
274
|
-
})
|
|
275
|
-
.catch((err) => {
|
|
276
|
-
if (err?.response?.data)
|
|
277
|
-
reject(err.response.data);
|
|
278
|
-
else
|
|
279
|
-
reject(err.code === `ERR_NETWORK`
|
|
280
|
-
? {
|
|
281
|
-
error: err.code,
|
|
282
|
-
message: navigator.onLine
|
|
283
|
-
? `Unable to connect to the server. It may be temporarily down.`
|
|
284
|
-
: `Network error: Unable to connect. Please check your internet connection and try again.`,
|
|
285
|
-
}
|
|
286
|
-
: err);
|
|
287
|
-
});
|
|
288
|
-
});
|
|
289
|
-
};
|
|
290
206
|
export const withTime = (fun) => {
|
|
291
207
|
const start = new Date().getTime();
|
|
292
208
|
const result = fun();
|
|
@@ -546,3 +462,42 @@ export const truncate = (selector, lines = 2) => {
|
|
|
546
462
|
}
|
|
547
463
|
});
|
|
548
464
|
};
|
|
465
|
+
export const checkPasswordStrength = (password) => {
|
|
466
|
+
const suggestions = [];
|
|
467
|
+
let score = 0;
|
|
468
|
+
if (password.length >= 8) {
|
|
469
|
+
score++;
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
suggestions.push("Use at least 8 characters");
|
|
473
|
+
}
|
|
474
|
+
if (/[a-z]/.test(password)) {
|
|
475
|
+
score++;
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
suggestions.push("Add lowercase letters");
|
|
479
|
+
}
|
|
480
|
+
if (/[A-Z]/.test(password)) {
|
|
481
|
+
score++;
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
suggestions.push("Add uppercase letters");
|
|
485
|
+
}
|
|
486
|
+
if (/\d/.test(password)) {
|
|
487
|
+
score++;
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
suggestions.push("Include numbers");
|
|
491
|
+
}
|
|
492
|
+
if (/[^A-Za-z0-9]/.test(password)) {
|
|
493
|
+
score++;
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
suggestions.push("Add special characters (e.g. !, @, #)");
|
|
497
|
+
}
|
|
498
|
+
return {
|
|
499
|
+
score,
|
|
500
|
+
result: score <= 2 ? "Weak" : score == 3 ? "Moderate" : score == 4 ? "Strong" : "Excellent",
|
|
501
|
+
suggestion: suggestions
|
|
502
|
+
};
|
|
503
|
+
};
|
|
@@ -19,6 +19,7 @@ export { default as useFileManager } from './useFileManager';
|
|
|
19
19
|
export { default as useFacebookPixel } from './useFacebookPixel';
|
|
20
20
|
export { default as useGoogleTagManager } from './useGoogleTagManager';
|
|
21
21
|
export { default as useImage } from './useImage';
|
|
22
|
+
export { default as useImageCropper } from './useImageCropper';
|
|
22
23
|
export { default as useIntersectionObserver } from './useIntersectionObserver';
|
|
23
24
|
export { default as useScrollbar } from './useScrollbar';
|
|
24
25
|
export { default as useSheet } from './useSheet';
|
|
@@ -27,5 +28,6 @@ export { default as useNetworkStatus } from './useNetworkStatus';
|
|
|
27
28
|
export { default as useResizeObserver } from './useResizeObserver';
|
|
28
29
|
export { default as useSlider } from './useSlider';
|
|
29
30
|
export { default as useTruncateText } from './useTruncateText';
|
|
31
|
+
export { default as useUploader } from './useUploader';
|
|
30
32
|
export { default as useViewTransition } from './useViewTransition';
|
|
31
33
|
export { default as useWebSocket, type WebSocketOptions } from './useWebSocket';
|
package/dist/esm/hooks/index.js
CHANGED
|
@@ -20,6 +20,7 @@ export { default as useFileManager } from './useFileManager';
|
|
|
20
20
|
export { default as useFacebookPixel } from './useFacebookPixel';
|
|
21
21
|
export { default as useGoogleTagManager } from './useGoogleTagManager';
|
|
22
22
|
export { default as useImage } from './useImage';
|
|
23
|
+
export { default as useImageCropper } from './useImageCropper';
|
|
23
24
|
export { default as useIntersectionObserver } from './useIntersectionObserver';
|
|
24
25
|
export { default as useScrollbar } from './useScrollbar';
|
|
25
26
|
export { default as useSheet } from './useSheet';
|
|
@@ -28,5 +29,6 @@ export { default as useNetworkStatus } from './useNetworkStatus';
|
|
|
28
29
|
export { default as useResizeObserver } from './useResizeObserver';
|
|
29
30
|
export { default as useSlider } from './useSlider';
|
|
30
31
|
export { default as useTruncateText } from './useTruncateText';
|
|
32
|
+
export { default as useUploader } from './useUploader';
|
|
31
33
|
export { default as useViewTransition } from './useViewTransition';
|
|
32
34
|
export { default as useWebSocket } from './useWebSocket';
|
|
@@ -17,10 +17,14 @@ export interface IDBSchema {
|
|
|
17
17
|
unique?: boolean;
|
|
18
18
|
}
|
|
19
19
|
declare const useDB: (options: IDBOptions) => {
|
|
20
|
+
getAll: <T>(storeName: string) => Promise<T>;
|
|
20
21
|
getByID: <T>(storeName: string, id: string | number) => Promise<T>;
|
|
21
22
|
getStore: <T>(storeName: string, id: string | number) => Promise<T>;
|
|
22
23
|
insert: <T>(storeName: string, value: T, key?: any) => Promise<number>;
|
|
23
|
-
update: <T>(storeName: string,
|
|
24
|
+
update: <T>(storeName: string, values: {
|
|
25
|
+
[x: string | number | symbol]: T;
|
|
26
|
+
}) => Promise<void>;
|
|
27
|
+
update_one: <T extends Object>(storeName: string, value: Partial<T>, key: IDBValidKey) => Promise<void>;
|
|
24
28
|
remove: (storeName: string, key: IDBValidKey) => Promise<void>;
|
|
25
29
|
error: string | null;
|
|
26
30
|
};
|
package/dist/esm/hooks/useDB.js
CHANGED
|
@@ -65,6 +65,25 @@ const useDB = (options) => {
|
|
|
65
65
|
reject(err.message || 'Database either corrupted or not initialized');
|
|
66
66
|
});
|
|
67
67
|
});
|
|
68
|
+
const getAll = (storeName) => new Promise((resolve, reject) => {
|
|
69
|
+
connect().then((db) => {
|
|
70
|
+
const { store } = createTransaction(storeName, DBMode.readOnly);
|
|
71
|
+
const request = store.getAll();
|
|
72
|
+
request.onsuccess = (evt) => {
|
|
73
|
+
const result = evt.target.result;
|
|
74
|
+
if (undefined == result)
|
|
75
|
+
reject('Record not found');
|
|
76
|
+
resolve(evt.target.result);
|
|
77
|
+
};
|
|
78
|
+
request.onerror = (evt) => {
|
|
79
|
+
reject(`SELECT Failed. ${evt.target.result}`);
|
|
80
|
+
};
|
|
81
|
+
})
|
|
82
|
+
.catch(err => {
|
|
83
|
+
console.log(`[getAll]`, err);
|
|
84
|
+
reject('Database either corrupted or not initialized');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
68
87
|
const getByID = (storeName, id) => new Promise((resolve, reject) => {
|
|
69
88
|
connect().then((db) => {
|
|
70
89
|
const { store } = createTransaction(storeName, DBMode.readOnly);
|
|
@@ -80,7 +99,7 @@ const useDB = (options) => {
|
|
|
80
99
|
};
|
|
81
100
|
})
|
|
82
101
|
.catch(err => {
|
|
83
|
-
|
|
102
|
+
console.log(`[getByID]`, err);
|
|
84
103
|
reject('Database either corrupted or not initialized');
|
|
85
104
|
});
|
|
86
105
|
});
|
|
@@ -99,16 +118,43 @@ const useDB = (options) => {
|
|
|
99
118
|
reject(err.message || 'Database either corrupted or not initialized');
|
|
100
119
|
});
|
|
101
120
|
});
|
|
102
|
-
const
|
|
121
|
+
const update_one = (storeName, value, key) => new Promise((resolve, reject) => {
|
|
103
122
|
connect().then((db) => {
|
|
104
123
|
const { store } = createTransaction(storeName, DBMode.readWrite);
|
|
105
|
-
const
|
|
124
|
+
const getReq = store.get(key);
|
|
125
|
+
getReq.onsuccess = () => {
|
|
126
|
+
const existing = getReq.result;
|
|
127
|
+
if (!existing) {
|
|
128
|
+
reject(`Record with key ${key} not found.`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const updateReq = store.put({ ...existing, ...value });
|
|
132
|
+
updateReq.onsuccess = () => resolve();
|
|
133
|
+
updateReq.onerror = (evt) => reject(`Update failed. ${evt.target.error}`);
|
|
134
|
+
};
|
|
135
|
+
getReq.onerror = (evt) => {
|
|
136
|
+
reject(`Failed to get existing record. ${evt.target.error}`);
|
|
137
|
+
};
|
|
138
|
+
})
|
|
139
|
+
.catch(err => {
|
|
140
|
+
reject('Database either corrupted or not initialized');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
const update = (storeName, values) => new Promise((resolve, reject) => {
|
|
144
|
+
connect().then((db) => {
|
|
145
|
+
const { store } = createTransaction(storeName, DBMode.readWrite);
|
|
146
|
+
let completed = 0;
|
|
147
|
+
const request = store.put(values);
|
|
106
148
|
request.onsuccess = (evt) => {
|
|
107
149
|
resolve();
|
|
108
150
|
};
|
|
151
|
+
request.onerror = (evt) => {
|
|
152
|
+
reject(`UPDATE Failed. ${evt.target.result}`);
|
|
153
|
+
};
|
|
109
154
|
})
|
|
110
155
|
.catch(err => {
|
|
111
|
-
reject(
|
|
156
|
+
reject(`UPDATE Failed. ${err}`);
|
|
157
|
+
// reject('Database either corrupted or not initialized');
|
|
112
158
|
});
|
|
113
159
|
});
|
|
114
160
|
const remove = (storeName, key) => new Promise((resolve, reject) => {
|
|
@@ -125,10 +171,12 @@ const useDB = (options) => {
|
|
|
125
171
|
});
|
|
126
172
|
});
|
|
127
173
|
return {
|
|
174
|
+
getAll,
|
|
128
175
|
getByID,
|
|
129
176
|
getStore,
|
|
130
177
|
insert,
|
|
131
178
|
update,
|
|
179
|
+
update_one,
|
|
132
180
|
remove,
|
|
133
181
|
error
|
|
134
182
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useEffect, useRef, useState } from "react";
|
|
3
3
|
const useImage = (url, crossOrigin, referrerPolicy) => {
|
|
4
|
-
const img = useRef(null);
|
|
5
4
|
const [state, setState] = useState({ loaded: false, error: null });
|
|
5
|
+
const img = useRef(null);
|
|
6
6
|
useEffect(() => {
|
|
7
7
|
if (url && url !== ``) {
|
|
8
8
|
var _img = new Image();
|
|
@@ -17,7 +17,7 @@ const useImage = (url, crossOrigin, referrerPolicy) => {
|
|
|
17
17
|
};
|
|
18
18
|
_img.src = url;
|
|
19
19
|
}
|
|
20
|
-
}, []);
|
|
20
|
+
}, [url]);
|
|
21
21
|
return [img.current ? img.current.src : ``, state.loaded, state.error];
|
|
22
22
|
};
|
|
23
23
|
export default useImage;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CropShape } from '..';
|
|
2
|
+
declare const useImageCropper: (imageUrl: string, cropSize: number, cropShape?: CropShape, scale?: number) => {
|
|
3
|
+
canvasRef: import("react").RefObject<HTMLCanvasElement | null>;
|
|
4
|
+
crop: () => string | null;
|
|
5
|
+
setScale: import("react").Dispatch<import("react").SetStateAction<number>>;
|
|
6
|
+
handleMouseDown: () => void;
|
|
7
|
+
handleMouseUp: () => void;
|
|
8
|
+
handleMouseMove: (e: React.MouseEvent<HTMLCanvasElement>) => void;
|
|
9
|
+
};
|
|
10
|
+
export default useImageCropper;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { CropShape } from '..';
|
|
3
|
+
const useImageCropper = (imageUrl, cropSize, cropShape = CropShape.Circle, scale = 1) => {
|
|
4
|
+
const [dragging, setDragging] = useState(false);
|
|
5
|
+
const [offset, setOffset] = useState({ x: 0, y: 0 });
|
|
6
|
+
const [_scale, setScale] = useState(scale);
|
|
7
|
+
const imgRef = useRef(null);
|
|
8
|
+
const canvasRef = useRef(null);
|
|
9
|
+
const draw = () => {
|
|
10
|
+
const canvas = canvasRef.current;
|
|
11
|
+
const ctx = canvas?.getContext('2d');
|
|
12
|
+
const img = imgRef.current;
|
|
13
|
+
if (!canvas || !ctx || !img)
|
|
14
|
+
return;
|
|
15
|
+
canvas.width = cropSize;
|
|
16
|
+
canvas.height = cropSize;
|
|
17
|
+
ctx.clearRect(0, 0, cropSize, cropSize);
|
|
18
|
+
ctx.globalAlpha = 0.5;
|
|
19
|
+
ctx.drawImage(img, offset.x, offset.y, img.width * _scale, img.height * _scale);
|
|
20
|
+
ctx.globalAlpha = 1.0;
|
|
21
|
+
ctx.save();
|
|
22
|
+
if (cropShape === CropShape.Circle) {
|
|
23
|
+
ctx.beginPath();
|
|
24
|
+
ctx.arc(cropSize / 2, cropSize / 2, cropSize / 2, 0, Math.PI * 2);
|
|
25
|
+
ctx.closePath();
|
|
26
|
+
ctx.clip();
|
|
27
|
+
}
|
|
28
|
+
ctx.drawImage(img, offset.x, offset.y, img.width * _scale, img.height * _scale);
|
|
29
|
+
ctx.restore();
|
|
30
|
+
};
|
|
31
|
+
useEffect(draw, [_scale]);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (imageUrl) {
|
|
34
|
+
const img = new Image();
|
|
35
|
+
img.onload = () => {
|
|
36
|
+
imgRef.current = img;
|
|
37
|
+
draw();
|
|
38
|
+
};
|
|
39
|
+
img.src = imageUrl;
|
|
40
|
+
}
|
|
41
|
+
}, [imageUrl, offset]);
|
|
42
|
+
const handleMouseDown = () => setDragging(true);
|
|
43
|
+
const handleMouseUp = () => setDragging(false);
|
|
44
|
+
const handleMouseMove = (e) => {
|
|
45
|
+
if (!dragging || !imgRef.current)
|
|
46
|
+
return;
|
|
47
|
+
setOffset(prev => ({
|
|
48
|
+
x: prev.x + e.movementX,
|
|
49
|
+
y: prev.y + e.movementY,
|
|
50
|
+
}));
|
|
51
|
+
};
|
|
52
|
+
const crop = () => {
|
|
53
|
+
const canvas = canvasRef.current;
|
|
54
|
+
if (!canvas)
|
|
55
|
+
return null;
|
|
56
|
+
return canvas.toDataURL('image/png');
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
canvasRef,
|
|
60
|
+
crop,
|
|
61
|
+
setScale,
|
|
62
|
+
handleMouseDown,
|
|
63
|
+
handleMouseUp,
|
|
64
|
+
handleMouseMove,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
export default useImageCropper;
|