@flipdish/ui-library 0.17.0 → 0.18.0
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/components/atoms/BackgroundPattern/components/grid-check.cjs +2 -1
- package/dist/components/atoms/BackgroundPattern/components/grid-check.cjs.map +1 -1
- package/dist/components/atoms/BackgroundPattern/components/grid-check.d.ts.map +1 -1
- package/dist/components/atoms/BackgroundPattern/components/grid-check.js +2 -1
- package/dist/components/atoms/BackgroundPattern/components/grid-check.js.map +1 -1
- package/dist/components/atoms/BackgroundPattern/index.cjs +4 -1
- package/dist/components/atoms/BackgroundPattern/index.cjs.map +1 -1
- package/dist/components/atoms/BackgroundPattern/index.d.ts +8 -3
- package/dist/components/atoms/BackgroundPattern/index.d.ts.map +1 -1
- package/dist/components/atoms/BackgroundPattern/index.js +4 -1
- package/dist/components/atoms/BackgroundPattern/index.js.map +1 -1
- package/dist/components/molecules/EmptyState/index.cjs +4 -1
- package/dist/components/molecules/EmptyState/index.cjs.map +1 -1
- package/dist/components/molecules/EmptyState/index.d.ts.map +1 -1
- package/dist/components/molecules/EmptyState/index.js +4 -1
- package/dist/components/molecules/EmptyState/index.js.map +1 -1
- package/dist/components/molecules/Pagination/index.cjs +2 -2
- package/dist/components/molecules/Pagination/index.cjs.map +1 -1
- package/dist/components/molecules/Pagination/index.d.ts +1 -1
- package/dist/components/molecules/Pagination/index.d.ts.map +1 -1
- package/dist/components/molecules/Pagination/index.js +2 -2
- package/dist/components/molecules/Pagination/index.js.map +1 -1
- package/dist/components/organisms/Calendar/calendar.utils.cjs +16 -0
- package/dist/components/organisms/Calendar/calendar.utils.cjs.map +1 -0
- package/dist/components/organisms/Calendar/calendar.utils.d.ts +6 -0
- package/dist/components/organisms/Calendar/calendar.utils.d.ts.map +1 -0
- package/dist/components/organisms/Calendar/calendar.utils.js +14 -0
- package/dist/components/organisms/Calendar/calendar.utils.js.map +1 -0
- package/dist/components/organisms/Calendar/components/calendar-header.cjs +2 -1
- package/dist/components/organisms/Calendar/components/calendar-header.cjs.map +1 -1
- package/dist/components/organisms/Calendar/components/calendar-header.d.ts.map +1 -1
- package/dist/components/organisms/Calendar/components/calendar-header.js +2 -1
- package/dist/components/organisms/Calendar/components/calendar-header.js.map +1 -1
- package/dist/components/organisms/Calendar/index.cjs +13 -7
- package/dist/components/organisms/Calendar/index.cjs.map +1 -1
- package/dist/components/organisms/Calendar/index.d.ts.map +1 -1
- package/dist/components/organisms/Calendar/index.js +13 -7
- package/dist/components/organisms/Calendar/index.js.map +1 -1
- package/dist/components/organisms/Charts/components/charts-base.cjs +4 -0
- package/dist/components/organisms/Charts/components/charts-base.cjs.map +1 -1
- package/dist/components/organisms/Charts/components/charts-base.d.ts.map +1 -1
- package/dist/components/organisms/Charts/components/charts-base.js +4 -0
- package/dist/components/organisms/Charts/components/charts-base.js.map +1 -1
- package/dist/components/organisms/GradientPicker/providers/gradient-picker-context.cjs +6 -0
- package/dist/components/organisms/GradientPicker/providers/gradient-picker-context.cjs.map +1 -1
- package/dist/components/organisms/GradientPicker/providers/gradient-picker-context.d.ts.map +1 -1
- package/dist/components/organisms/GradientPicker/providers/gradient-picker-context.js +6 -0
- package/dist/components/organisms/GradientPicker/providers/gradient-picker-context.js.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-list.cjs +4 -2
- package/dist/components/organisms/HeaderNavigation/components/nav-list.cjs.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-list.d.ts.map +1 -1
- package/dist/components/organisms/HeaderNavigation/components/nav-list.js +4 -2
- package/dist/components/organisms/HeaderNavigation/components/nav-list.js.map +1 -1
- package/dist/components/organisms/SidebarNavigation/hooks/use-dual-tier-keyboard.cjs +7 -2
- package/dist/components/organisms/SidebarNavigation/hooks/use-dual-tier-keyboard.cjs.map +1 -1
- package/dist/components/organisms/SidebarNavigation/hooks/use-dual-tier-keyboard.d.ts.map +1 -1
- package/dist/components/organisms/SidebarNavigation/hooks/use-dual-tier-keyboard.js +7 -2
- package/dist/components/organisms/SidebarNavigation/hooks/use-dual-tier-keyboard.js.map +1 -1
- package/dist/components/organisms/TextEditor/components/text-editor-extensions.cjs +19 -2
- package/dist/components/organisms/TextEditor/components/text-editor-extensions.cjs.map +1 -1
- package/dist/components/organisms/TextEditor/components/text-editor-extensions.d.ts.map +1 -1
- package/dist/components/organisms/TextEditor/components/text-editor-extensions.js +19 -2
- package/dist/components/organisms/TextEditor/components/text-editor-extensions.js.map +1 -1
- package/dist/components/organisms/TextEditor/index.cjs +24 -5
- package/dist/components/organisms/TextEditor/index.cjs.map +1 -1
- package/dist/components/organisms/TextEditor/index.d.ts.map +1 -1
- package/dist/components/organisms/TextEditor/index.js +24 -5
- package/dist/components/organisms/TextEditor/index.js.map +1 -1
- package/dist/components/organisms/TextEditor/textEditor.utils.cjs +32 -0
- package/dist/components/organisms/TextEditor/textEditor.utils.cjs.map +1 -0
- package/dist/components/organisms/TextEditor/textEditor.utils.d.ts +14 -0
- package/dist/components/organisms/TextEditor/textEditor.utils.d.ts.map +1 -0
- package/dist/components/organisms/TextEditor/textEditor.utils.js +29 -0
- package/dist/components/organisms/TextEditor/textEditor.utils.js.map +1 -0
- package/dist/hooks/useClipboard/index.cjs +10 -3
- package/dist/hooks/useClipboard/index.cjs.map +1 -1
- package/dist/hooks/useClipboard/index.d.ts.map +1 -1
- package/dist/hooks/useClipboard/index.js +10 -3
- package/dist/hooks/useClipboard/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,6 +12,7 @@ import { createContext, useId, useEffect, useContext } from 'react';
|
|
|
12
12
|
import { CharacterCount } from './components/text-editor-character-count.js';
|
|
13
13
|
import { TextEditorToolbar } from './components/text-editor-toolbar.js';
|
|
14
14
|
import { TextEditorTooltip } from './components/text-editor-tooltip.js';
|
|
15
|
+
import { isAllowedLinkUri, sanitizeLinkUrl } from './textEditor.utils.js';
|
|
15
16
|
|
|
16
17
|
// Creates a data URL for an SVG resize handle with a given color.
|
|
17
18
|
const getResizeHandleBg = (color) => {
|
|
@@ -54,6 +55,9 @@ const TextEditorRoot = ({ className, inputClassName, children, isInvalid, isDisa
|
|
|
54
55
|
openOnClick: false,
|
|
55
56
|
autolink: true,
|
|
56
57
|
defaultProtocol: 'https',
|
|
58
|
+
// Narrow tiptap's default protocol policy (ftp/callto/sms/cid/xmpp also pass
|
|
59
|
+
// upstream) to this design system's http/https/mailto/tel allowlist.
|
|
60
|
+
isAllowedUri: (uri) => isAllowedLinkUri(uri),
|
|
57
61
|
HTMLAttributes: {
|
|
58
62
|
class: 'text-primary underline',
|
|
59
63
|
},
|
|
@@ -116,18 +120,33 @@ const TextEditorRoot = ({ className, inputClassName, children, isInvalid, isDisa
|
|
|
116
120
|
editor.chain().focus().extendMarkRange('link').unsetLink().run();
|
|
117
121
|
return;
|
|
118
122
|
}
|
|
123
|
+
// Strip control characters and reject non-allowlisted schemes (javascript: et al.).
|
|
124
|
+
const safeUrl = sanitizeLinkUrl(url);
|
|
125
|
+
if (safeUrl === null) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Whitespace/control-only input sanitises to '' — treat it as removal like the
|
|
129
|
+
// raw-empty branch above, instead of setting an empty href.
|
|
130
|
+
if (safeUrl === '') {
|
|
131
|
+
editor.chain().focus().extendMarkRange('link').unsetLink().run();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
119
134
|
// Update link.
|
|
120
|
-
editor.chain().focus().extendMarkRange('link').setLink({ href:
|
|
135
|
+
editor.chain().focus().extendMarkRange('link').setLink({ href: safeUrl }).run();
|
|
121
136
|
};
|
|
122
|
-
//
|
|
137
|
+
// Cmd+K (macOS) / Ctrl+K (Windows/Linux) opens the link prompt. Listen on the
|
|
138
|
+
// editor's own element, not `document`, so the shortcut only fires for the
|
|
139
|
+
// focused editor — not every mounted TextEditor on the page.
|
|
123
140
|
const handleKeyDown = (event) => {
|
|
124
|
-
if (event.metaKey && event.key === 'k') {
|
|
141
|
+
if ((event.metaKey || event.ctrlKey) && event.key === 'k') {
|
|
142
|
+
event.preventDefault();
|
|
125
143
|
setLink();
|
|
126
144
|
}
|
|
127
145
|
};
|
|
128
|
-
|
|
146
|
+
const editorElement = editor?.view.dom;
|
|
147
|
+
editorElement?.addEventListener('keydown', handleKeyDown);
|
|
129
148
|
return () => {
|
|
130
|
-
|
|
149
|
+
editorElement?.removeEventListener('keydown', handleKeyDown);
|
|
131
150
|
};
|
|
132
151
|
}, [editor]);
|
|
133
152
|
if (!editor) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/organisms/TextEditor/index.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/organisms/TextEditor/index.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ALLOWED_LINK_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:'];
|
|
4
|
+
// Tiptap strips control characters for validation but stores the original href, so
|
|
5
|
+
// `f\ntp://example.test` would pass a naive scheme check yet persist with its
|
|
6
|
+
// control character intact — strip them before validating AND storing.
|
|
7
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: removing control characters is the point
|
|
8
|
+
const CONTROL_CHARACTERS = /[\u0000-\u001F\u007F]/g;
|
|
9
|
+
/**
|
|
10
|
+
* Sanitizes a user-entered link URL: removes ASCII control characters, then rejects
|
|
11
|
+
* any explicit scheme outside http/https/mailto/tel (blocks `javascript:` et al.).
|
|
12
|
+
* Scheme-less values are treated as relative URLs and allowed.
|
|
13
|
+
*
|
|
14
|
+
* @returns the cleaned URL, or `null` when the URL is not allowed.
|
|
15
|
+
*/
|
|
16
|
+
const sanitizeLinkUrl = (url) => {
|
|
17
|
+
const cleaned = url.replace(CONTROL_CHARACTERS, '').trim();
|
|
18
|
+
const scheme = /^[a-z][a-z0-9+.-]*:/i.exec(cleaned)?.[0].toLowerCase();
|
|
19
|
+
if (scheme && !ALLOWED_LINK_PROTOCOLS.includes(scheme)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return cleaned;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Tiptap `isAllowedUri` narrowing its default protocol policy (which also admits
|
|
26
|
+
* ftp/ftps/callto/sms/cid/xmpp) to the four protocols this design system allows.
|
|
27
|
+
*/
|
|
28
|
+
const isAllowedLinkUri = (uri) => sanitizeLinkUrl(uri) !== null;
|
|
29
|
+
|
|
30
|
+
exports.isAllowedLinkUri = isAllowedLinkUri;
|
|
31
|
+
exports.sanitizeLinkUrl = sanitizeLinkUrl;
|
|
32
|
+
//# sourceMappingURL=textEditor.utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textEditor.utils.cjs","sources":["../../../../src/components/organisms/TextEditor/textEditor.utils.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;AAErE;AACA;AACA;AACA;AACA,MAAM,kBAAkB,GAAG,wBAAwB;AAEnD;;;;;;AAMG;AACI,MAAM,eAAe,GAAG,CAAC,GAAW,KAAmB;AAC5D,IAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;AAC1D,IAAA,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;IACtE,IAAI,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACtD,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,OAAO;AAChB;AAEA;;;AAGG;AACI,MAAM,gBAAgB,GAAG,CAAC,GAAW,KAAc,eAAe,CAAC,GAAG,CAAC,KAAK;;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitizes a user-entered link URL: removes ASCII control characters, then rejects
|
|
3
|
+
* any explicit scheme outside http/https/mailto/tel (blocks `javascript:` et al.).
|
|
4
|
+
* Scheme-less values are treated as relative URLs and allowed.
|
|
5
|
+
*
|
|
6
|
+
* @returns the cleaned URL, or `null` when the URL is not allowed.
|
|
7
|
+
*/
|
|
8
|
+
export declare const sanitizeLinkUrl: (url: string) => string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Tiptap `isAllowedUri` narrowing its default protocol policy (which also admits
|
|
11
|
+
* ftp/ftps/callto/sms/cid/xmpp) to the four protocols this design system allows.
|
|
12
|
+
*/
|
|
13
|
+
export declare const isAllowedLinkUri: (uri: string) => boolean;
|
|
14
|
+
//# sourceMappingURL=textEditor.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textEditor.utils.d.ts","sourceRoot":"","sources":["../../../../src/components/organisms/TextEditor/textEditor.utils.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,IAOtD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,OAAwC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const ALLOWED_LINK_PROTOCOLS = ['http:', 'https:', 'mailto:', 'tel:'];
|
|
2
|
+
// Tiptap strips control characters for validation but stores the original href, so
|
|
3
|
+
// `f\ntp://example.test` would pass a naive scheme check yet persist with its
|
|
4
|
+
// control character intact — strip them before validating AND storing.
|
|
5
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: removing control characters is the point
|
|
6
|
+
const CONTROL_CHARACTERS = /[\u0000-\u001F\u007F]/g;
|
|
7
|
+
/**
|
|
8
|
+
* Sanitizes a user-entered link URL: removes ASCII control characters, then rejects
|
|
9
|
+
* any explicit scheme outside http/https/mailto/tel (blocks `javascript:` et al.).
|
|
10
|
+
* Scheme-less values are treated as relative URLs and allowed.
|
|
11
|
+
*
|
|
12
|
+
* @returns the cleaned URL, or `null` when the URL is not allowed.
|
|
13
|
+
*/
|
|
14
|
+
const sanitizeLinkUrl = (url) => {
|
|
15
|
+
const cleaned = url.replace(CONTROL_CHARACTERS, '').trim();
|
|
16
|
+
const scheme = /^[a-z][a-z0-9+.-]*:/i.exec(cleaned)?.[0].toLowerCase();
|
|
17
|
+
if (scheme && !ALLOWED_LINK_PROTOCOLS.includes(scheme)) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return cleaned;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Tiptap `isAllowedUri` narrowing its default protocol policy (which also admits
|
|
24
|
+
* ftp/ftps/callto/sms/cid/xmpp) to the four protocols this design system allows.
|
|
25
|
+
*/
|
|
26
|
+
const isAllowedLinkUri = (uri) => sanitizeLinkUrl(uri) !== null;
|
|
27
|
+
|
|
28
|
+
export { isAllowedLinkUri, sanitizeLinkUrl };
|
|
29
|
+
//# sourceMappingURL=textEditor.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textEditor.utils.js","sources":["../../../../src/components/organisms/TextEditor/textEditor.utils.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC;AAErE;AACA;AACA;AACA;AACA,MAAM,kBAAkB,GAAG,wBAAwB;AAEnD;;;;;;AAMG;AACI,MAAM,eAAe,GAAG,CAAC,GAAW,KAAmB;AAC5D,IAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;AAC1D,IAAA,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;IACtE,IAAI,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACtD,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,OAAO;AAChB;AAEA;;;AAGG;AACI,MAAM,gBAAgB,GAAG,CAAC,GAAW,KAAc,eAAe,CAAC,GAAG,CAAC,KAAK;;;;"}
|
|
@@ -11,13 +11,18 @@ const DEFAULT_TIMEOUT = 2000;
|
|
|
11
11
|
const useClipboard = () => {
|
|
12
12
|
const [copied, setCopied] = React.useState(false);
|
|
13
13
|
const resetTimerRef = React.useRef(null);
|
|
14
|
+
// `copy` awaits the async clipboard API; guard its post-await setState so a copy
|
|
15
|
+
// resolving after unmount doesn't set state on an unmounted component.
|
|
16
|
+
const isMountedRef = React.useRef(true);
|
|
14
17
|
const scheduleReset = () => {
|
|
15
18
|
if (resetTimerRef.current)
|
|
16
19
|
clearTimeout(resetTimerRef.current);
|
|
17
20
|
resetTimerRef.current = setTimeout(() => setCopied(false), DEFAULT_TIMEOUT);
|
|
18
21
|
};
|
|
19
22
|
React.useEffect(() => {
|
|
23
|
+
isMountedRef.current = true;
|
|
20
24
|
return () => {
|
|
25
|
+
isMountedRef.current = false;
|
|
21
26
|
if (resetTimerRef.current)
|
|
22
27
|
clearTimeout(resetTimerRef.current);
|
|
23
28
|
};
|
|
@@ -33,7 +38,7 @@ const useClipboard = () => {
|
|
|
33
38
|
try {
|
|
34
39
|
textArea.select();
|
|
35
40
|
const success = document.execCommand('copy');
|
|
36
|
-
if (success) {
|
|
41
|
+
if (success && isMountedRef.current) {
|
|
37
42
|
setCopied(id || true);
|
|
38
43
|
scheduleReset();
|
|
39
44
|
}
|
|
@@ -55,8 +60,10 @@ const useClipboard = () => {
|
|
|
55
60
|
if (navigator.clipboard && window.isSecureContext) {
|
|
56
61
|
try {
|
|
57
62
|
await navigator.clipboard.writeText(text);
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
if (isMountedRef.current) {
|
|
64
|
+
setCopied(id || true);
|
|
65
|
+
scheduleReset();
|
|
66
|
+
}
|
|
60
67
|
return { success: true };
|
|
61
68
|
}
|
|
62
69
|
catch (_err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/hooks/useClipboard/index.ts"],"sourcesContent":[null],"names":["useState","useRef","useEffect","useCallback"],"mappings":";;;;AAIA,MAAM,eAAe,GAAG,IAAI;AAqB5B;;;;AAIG;AACI,MAAM,YAAY,GAAG,MAA6B;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAQ,CAAmB,KAAK,CAAC;AAC7D,IAAA,MAAM,aAAa,GAAGC,YAAM,CAAuC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/hooks/useClipboard/index.ts"],"sourcesContent":[null],"names":["useState","useRef","useEffect","useCallback"],"mappings":";;;;AAIA,MAAM,eAAe,GAAG,IAAI;AAqB5B;;;;AAIG;AACI,MAAM,YAAY,GAAG,MAA6B;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAQ,CAAmB,KAAK,CAAC;AAC7D,IAAA,MAAM,aAAa,GAAGC,YAAM,CAAuC,IAAI,CAAC;;;AAGxE,IAAA,MAAM,YAAY,GAAGA,YAAM,CAAC,IAAI,CAAC;IAEjC,MAAM,aAAa,GAAG,MAAK;QACzB,IAAI,aAAa,CAAC,OAAO;AAAE,YAAA,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;AAC9D,QAAA,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;AAC7E,IAAA,CAAC;IAEDC,eAAS,CAAC,MAAK;AACb,QAAA,YAAY,CAAC,OAAO,GAAG,IAAI;AAC3B,QAAA,OAAO,MAAK;AACV,YAAA,YAAY,CAAC,OAAO,GAAG,KAAK;YAC5B,IAAI,aAAa,CAAC,OAAO;AAAE,gBAAA,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;AAChE,QAAA,CAAC;IACH,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAW,KAAI;;QAE7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;AACnD,QAAA,QAAQ,CAAC,KAAK,GAAG,IAAI;AACrB,QAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AACpC,QAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU;AAEhC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;AAEnC,QAAA,IAAI;YACF,QAAQ,CAAC,MAAM,EAAE;YAEjB,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;AAE5C,YAAA,IAAI,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE;AACnC,gBAAA,SAAS,CAAC,EAAE,IAAI,IAAI,CAAC;AACrB,gBAAA,aAAa,EAAE;YACjB;YAEA,OAAO,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,4BAA4B,CAAC,EAAE;QACzG;QAAE,OAAO,GAAG,EAAE;YACZ,OAAO;AACL,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,sBAAsB,CAAC;aACtE;QACH;gBAAU;;YAER,QAAQ,CAAC,MAAM,EAAE;QACnB;AACF,IAAA,CAAC;;IAGD,MAAM,IAAI,GAAGC,iBAAW,CAAC,OAAO,IAAY,EAAE,EAAW,KAAI;QAC3D,IAAI,SAAS,CAAC,SAAS,IAAI,MAAM,CAAC,eAAe,EAAE;AACjD,YAAA,IAAI;gBACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;AAEzC,gBAAA,IAAI,YAAY,CAAC,OAAO,EAAE;AACxB,oBAAA,SAAS,CAAC,EAAE,IAAI,IAAI,CAAC;AACrB,oBAAA,aAAa,EAAE;gBACjB;AAEA,gBAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;YAC1B;YAAE,OAAO,IAAI,EAAE;;AAEb,gBAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B;QACF;AACA,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IAC3B,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;AACzB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClipboard/index.ts"],"names":[],"mappings":"AAMA,KAAK,sBAAsB,GAAG;IAC5B;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB;;;;;;;;;OASG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;CACnF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClipboard/index.ts"],"names":[],"mappings":"AAMA,KAAK,sBAAsB,GAAG;IAC5B;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB;;;;;;;;;OASG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;CACnF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAAO,sBAyE/B,CAAC"}
|
|
@@ -9,13 +9,18 @@ const DEFAULT_TIMEOUT = 2000;
|
|
|
9
9
|
const useClipboard = () => {
|
|
10
10
|
const [copied, setCopied] = useState(false);
|
|
11
11
|
const resetTimerRef = useRef(null);
|
|
12
|
+
// `copy` awaits the async clipboard API; guard its post-await setState so a copy
|
|
13
|
+
// resolving after unmount doesn't set state on an unmounted component.
|
|
14
|
+
const isMountedRef = useRef(true);
|
|
12
15
|
const scheduleReset = () => {
|
|
13
16
|
if (resetTimerRef.current)
|
|
14
17
|
clearTimeout(resetTimerRef.current);
|
|
15
18
|
resetTimerRef.current = setTimeout(() => setCopied(false), DEFAULT_TIMEOUT);
|
|
16
19
|
};
|
|
17
20
|
useEffect(() => {
|
|
21
|
+
isMountedRef.current = true;
|
|
18
22
|
return () => {
|
|
23
|
+
isMountedRef.current = false;
|
|
19
24
|
if (resetTimerRef.current)
|
|
20
25
|
clearTimeout(resetTimerRef.current);
|
|
21
26
|
};
|
|
@@ -31,7 +36,7 @@ const useClipboard = () => {
|
|
|
31
36
|
try {
|
|
32
37
|
textArea.select();
|
|
33
38
|
const success = document.execCommand('copy');
|
|
34
|
-
if (success) {
|
|
39
|
+
if (success && isMountedRef.current) {
|
|
35
40
|
setCopied(id || true);
|
|
36
41
|
scheduleReset();
|
|
37
42
|
}
|
|
@@ -53,8 +58,10 @@ const useClipboard = () => {
|
|
|
53
58
|
if (navigator.clipboard && window.isSecureContext) {
|
|
54
59
|
try {
|
|
55
60
|
await navigator.clipboard.writeText(text);
|
|
56
|
-
|
|
57
|
-
|
|
61
|
+
if (isMountedRef.current) {
|
|
62
|
+
setCopied(id || true);
|
|
63
|
+
scheduleReset();
|
|
64
|
+
}
|
|
58
65
|
return { success: true };
|
|
59
66
|
}
|
|
60
67
|
catch (_err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/hooks/useClipboard/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA,MAAM,eAAe,GAAG,IAAI;AAqB5B;;;;AAIG;AACI,MAAM,YAAY,GAAG,MAA6B;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAmB,KAAK,CAAC;AAC7D,IAAA,MAAM,aAAa,GAAG,MAAM,CAAuC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/hooks/useClipboard/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA,MAAM,eAAe,GAAG,IAAI;AAqB5B;;;;AAIG;AACI,MAAM,YAAY,GAAG,MAA6B;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAmB,KAAK,CAAC;AAC7D,IAAA,MAAM,aAAa,GAAG,MAAM,CAAuC,IAAI,CAAC;;;AAGxE,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;IAEjC,MAAM,aAAa,GAAG,MAAK;QACzB,IAAI,aAAa,CAAC,OAAO;AAAE,YAAA,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;AAC9D,QAAA,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;AAC7E,IAAA,CAAC;IAED,SAAS,CAAC,MAAK;AACb,QAAA,YAAY,CAAC,OAAO,GAAG,IAAI;AAC3B,QAAA,OAAO,MAAK;AACV,YAAA,YAAY,CAAC,OAAO,GAAG,KAAK;YAC5B,IAAI,aAAa,CAAC,OAAO;AAAE,gBAAA,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;AAChE,QAAA,CAAC;IACH,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAW,KAAI;;QAE7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;AACnD,QAAA,QAAQ,CAAC,KAAK,GAAG,IAAI;AACrB,QAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AACpC,QAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU;AAEhC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;AAEnC,QAAA,IAAI;YACF,QAAQ,CAAC,MAAM,EAAE;YAEjB,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;AAE5C,YAAA,IAAI,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE;AACnC,gBAAA,SAAS,CAAC,EAAE,IAAI,IAAI,CAAC;AACrB,gBAAA,aAAa,EAAE;YACjB;YAEA,OAAO,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,4BAA4B,CAAC,EAAE;QACzG;QAAE,OAAO,GAAG,EAAE;YACZ,OAAO;AACL,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,KAAK,EAAE,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,sBAAsB,CAAC;aACtE;QACH;gBAAU;;YAER,QAAQ,CAAC,MAAM,EAAE;QACnB;AACF,IAAA,CAAC;;IAGD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,IAAY,EAAE,EAAW,KAAI;QAC3D,IAAI,SAAS,CAAC,SAAS,IAAI,MAAM,CAAC,eAAe,EAAE;AACjD,YAAA,IAAI;gBACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;AAEzC,gBAAA,IAAI,YAAY,CAAC,OAAO,EAAE;AACxB,oBAAA,SAAS,CAAC,EAAE,IAAI,IAAI,CAAC;AACrB,oBAAA,aAAa,EAAE;gBACjB;AAEA,gBAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;YAC1B;YAAE,OAAO,IAAI,EAAE;;AAEb,gBAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B;QACF;AACA,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IAC3B,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;AACzB;;;;"}
|