@namphuongtechnologi/np-hub 0.2.0 → 0.2.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 +33 -23
- package/dist/{chunk-C5WUIBKX.js → chunk-BO2GWI5I.js} +62 -23
- package/dist/chunk-BO2GWI5I.js.map +1 -0
- package/dist/index.cjs +61 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/np-hub.min.global.js +5 -5
- package/dist/react.cjs +61 -22
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +5 -2
- package/dist/react.d.ts +5 -2
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/register.cjs +61 -22
- package/dist/register.cjs.map +1 -1
- package/dist/register.js +1 -1
- package/dist/{support-widget.element-BlSyAC7w.d.cts → support-widget.element-C6a1k-nt.d.cts} +14 -4
- package/dist/{support-widget.element-BlSyAC7w.d.ts → support-widget.element-C6a1k-nt.d.ts} +14 -4
- package/docs/DEVELOPER_GUIDE.md +9 -8
- package/docs/USAGE_STATIC_REACT.md +13 -2
- package/package.json +1 -1
- package/dist/chunk-C5WUIBKX.js.map +0 -1
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/SupportWidget.tsx"],"sourcesContent":["import {\n createElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { SupportWidgetElement } from \"../component/support-widget.element\";\nimport { WIDGET_EVENTS } from \"../component/events/widget-events\";\nimport { registerSupportWidget } from \"../register\";\nimport type {\n SupportSubmissionInput,\n SupportUserPrefill,\n} from \"../types/public\";\n\nregisterSupportWidget();\n\nexport interface SupportWidgetProps {\n projectId: string;\n isDev?: boolean;\n priority?: number;\n coordinators?: string[];\n emailContacts?: string[];\n toastDuration?: number;\n width?: string | number;\n height?: string | number;\n right?: string | number;\n bottom?: string | number;\n left?: string | number;\n top?: string | number;\n user?: SupportUserPrefill;\n formPrefill?: SupportSubmissionInput;\n onSubmitSuccess?: (detail: unknown) => void;\n onSubmitError?: (detail: unknown) => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport function SupportWidget({\n projectId,\n isDev,\n priority,\n coordinators,\n emailContacts,\n toastDuration,\n width,\n height,\n right,\n bottom,\n left,\n top,\n user,\n formPrefill,\n onSubmitSuccess,\n onSubmitError,\n onOpen,\n onClose,\n}: SupportWidgetProps) {\n const [mounted, setMounted] = useState(false);\n const widgetRef = useRef<SupportWidgetElement | null>(null);\n\n const setWidgetRef = useCallback((node: SupportWidgetElement | null) => {\n widgetRef.current = node;\n }, []);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const el = widgetRef.current;\n if (!el) return;\n el.setConfig({\n projectId,\n isDev,\n priority,\n coordinators,\n emailContacts,\n toastDuration,\n });\n }, [projectId, isDev, priority, coordinators, emailContacts, toastDuration]);\n\n useEffect(() => {\n const el = widgetRef.current;\n if (!el || !user) return;\n el.setUser(user);\n }, [user]);\n\n useEffect(() => {\n const el = widgetRef.current;\n if (!el || !formPrefill) return;\n el.setFormPrefill(formPrefill);\n }, [formPrefill]);\n\n useEffect(() => {\n const el = widgetRef.current;\n if (!el) return;\n\n const handleSuccess = (event: Event) => {\n onSubmitSuccess?.((event as CustomEvent).detail);\n };\n const handleError = (event: Event) => {\n onSubmitError?.((event as CustomEvent).detail);\n };\n\n if (onSubmitSuccess) {\n el.addEventListener(WIDGET_EVENTS.SUBMIT_SUCCESS, handleSuccess);\n }\n if (onSubmitError) {\n el.addEventListener(WIDGET_EVENTS.SUBMIT_ERROR, handleError);\n }\n if (onOpen) {\n el.addEventListener(WIDGET_EVENTS.OPEN, onOpen);\n }\n if (onClose) {\n el.addEventListener(WIDGET_EVENTS.CLOSE, onClose);\n }\n\n return () => {\n if (onSubmitSuccess) {\n el.removeEventListener(WIDGET_EVENTS.SUBMIT_SUCCESS, handleSuccess);\n }\n if (onSubmitError) {\n el.removeEventListener(WIDGET_EVENTS.SUBMIT_ERROR, handleError);\n }\n if (onOpen) {\n el.removeEventListener(WIDGET_EVENTS.OPEN, onOpen);\n }\n if (onClose) {\n el.removeEventListener(WIDGET_EVENTS.CLOSE, onClose);\n }\n };\n }, [onSubmitSuccess, onSubmitError, onOpen, onClose]);\n\n if (!mounted) {\n return null;\n }\n\n return createElement(\"np-hub\", {\n ref: setWidgetRef,\n \"project-id\": projectId,\n ...(isDev ? { \"is-dev\": true } : {}),\n ...(width !== undefined ? { width } : {}),\n ...(height !== undefined ? { height } : {}),\n ...(right !== undefined ? { right } : {}),\n ...(bottom !== undefined ? { bottom } : {}),\n ...(left !== undefined ? { left } : {}),\n ...(top !== undefined ? { top } : {}),\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/react/SupportWidget.tsx"],"sourcesContent":["import {\n createElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { SupportWidgetElement } from \"../component/support-widget.element\";\nimport { WIDGET_EVENTS } from \"../component/events/widget-events\";\nimport { registerSupportWidget } from \"../register\";\nimport type {\n SupportSubmissionInput,\n SupportUserPrefill,\n} from \"../types/public\";\n\nregisterSupportWidget();\n\nexport interface SupportWidgetProps {\n projectId: string;\n isDev?: boolean;\n priority?: number;\n coordinators?: string[];\n emailContacts?: string[];\n toastDuration?: number | { success?: number; error?: number };\n width?: string | number;\n height?: string | number;\n right?: string | number;\n bottom?: string | number;\n left?: string | number;\n top?: string | number;\n user?: SupportUserPrefill;\n formPrefill?: SupportSubmissionInput;\n onSubmitSuccess?: (detail: unknown) => void;\n onSubmitError?: (detail: unknown) => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport function SupportWidget({\n projectId,\n isDev,\n priority,\n coordinators,\n emailContacts,\n toastDuration,\n width,\n height,\n right,\n bottom,\n left,\n top,\n user,\n formPrefill,\n onSubmitSuccess,\n onSubmitError,\n onOpen,\n onClose,\n}: SupportWidgetProps) {\n const [mounted, setMounted] = useState(false);\n const widgetRef = useRef<SupportWidgetElement | null>(null);\n\n const setWidgetRef = useCallback((node: SupportWidgetElement | null) => {\n widgetRef.current = node;\n }, []);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n useEffect(() => {\n const el = widgetRef.current;\n if (!el) return;\n el.setConfig({\n projectId,\n isDev,\n priority,\n coordinators,\n emailContacts,\n toastDuration,\n });\n }, [projectId, isDev, priority, coordinators, emailContacts, toastDuration]);\n\n useEffect(() => {\n const el = widgetRef.current;\n if (!el || !user) return;\n el.setUser(user);\n }, [user]);\n\n useEffect(() => {\n const el = widgetRef.current;\n if (!el || !formPrefill) return;\n el.setFormPrefill(formPrefill);\n }, [formPrefill]);\n\n useEffect(() => {\n const el = widgetRef.current;\n if (!el) return;\n\n const handleSuccess = (event: Event) => {\n onSubmitSuccess?.((event as CustomEvent).detail);\n };\n const handleError = (event: Event) => {\n onSubmitError?.((event as CustomEvent).detail);\n };\n\n if (onSubmitSuccess) {\n el.addEventListener(WIDGET_EVENTS.SUBMIT_SUCCESS, handleSuccess);\n }\n if (onSubmitError) {\n el.addEventListener(WIDGET_EVENTS.SUBMIT_ERROR, handleError);\n }\n if (onOpen) {\n el.addEventListener(WIDGET_EVENTS.OPEN, onOpen);\n }\n if (onClose) {\n el.addEventListener(WIDGET_EVENTS.CLOSE, onClose);\n }\n\n return () => {\n if (onSubmitSuccess) {\n el.removeEventListener(WIDGET_EVENTS.SUBMIT_SUCCESS, handleSuccess);\n }\n if (onSubmitError) {\n el.removeEventListener(WIDGET_EVENTS.SUBMIT_ERROR, handleError);\n }\n if (onOpen) {\n el.removeEventListener(WIDGET_EVENTS.OPEN, onOpen);\n }\n if (onClose) {\n el.removeEventListener(WIDGET_EVENTS.CLOSE, onClose);\n }\n };\n }, [onSubmitSuccess, onSubmitError, onOpen, onClose]);\n\n if (!mounted) {\n return null;\n }\n\n return createElement(\"np-hub\", {\n ref: setWidgetRef,\n \"project-id\": projectId,\n ...(isDev ? { \"is-dev\": true } : {}),\n ...(width !== undefined ? { width } : {}),\n ...(height !== undefined ? { height } : {}),\n ...(right !== undefined ? { right } : {}),\n ...(bottom !== undefined ? { bottom } : {}),\n ...(left !== undefined ? { left } : {}),\n ...(top !== undefined ? { top } : {}),\n });\n}\n"],"mappings":"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","names":[]}
|
package/dist/register.cjs
CHANGED
|
@@ -191,9 +191,9 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
191
191
|
this.prefilledAttachments = [];
|
|
192
192
|
this.previewUrls = [];
|
|
193
193
|
this.closeAfterSuccessTimer = null;
|
|
194
|
-
this.toastAutoCloseTimer = null;
|
|
195
194
|
this.toastCountdownInterval = null;
|
|
196
|
-
this.
|
|
195
|
+
this.toastSuccessDuration = 4e3;
|
|
196
|
+
this.toastErrorDuration = 4e3;
|
|
197
197
|
this.toastRemainingMs = 0;
|
|
198
198
|
this.toastTotalMs = 0;
|
|
199
199
|
this.isToastPaused = false;
|
|
@@ -221,7 +221,6 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
221
221
|
disconnectedCallback() {
|
|
222
222
|
window.removeEventListener("resize", this.handleResize);
|
|
223
223
|
this.clearCloseAfterSuccessTimer();
|
|
224
|
-
this.clearToastAutoCloseTimer();
|
|
225
224
|
this.clearToastCountdown();
|
|
226
225
|
}
|
|
227
226
|
attributeChangedCallback() {
|
|
@@ -234,6 +233,10 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
234
233
|
this.user = user;
|
|
235
234
|
this.prefillFromState();
|
|
236
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Updates the widget configuration.
|
|
238
|
+
* Supports custom toast auto-close durations via `toastDuration`.
|
|
239
|
+
*/
|
|
237
240
|
setConfig(config) {
|
|
238
241
|
this.config = {
|
|
239
242
|
...this.config,
|
|
@@ -259,7 +262,23 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
259
262
|
this.emailContacts = config.emailContacts;
|
|
260
263
|
}
|
|
261
264
|
if (config.toastDuration !== void 0) {
|
|
262
|
-
|
|
265
|
+
const duration = config.toastDuration;
|
|
266
|
+
if (typeof duration === "number") {
|
|
267
|
+
const val = this.normalizeToastDuration(duration);
|
|
268
|
+
this.toastSuccessDuration = val;
|
|
269
|
+
this.toastErrorDuration = val;
|
|
270
|
+
} else if (duration && typeof duration === "object") {
|
|
271
|
+
if (duration.success !== void 0) {
|
|
272
|
+
this.toastSuccessDuration = this.normalizeToastDuration(duration.success);
|
|
273
|
+
} else {
|
|
274
|
+
this.toastSuccessDuration = 4e3;
|
|
275
|
+
}
|
|
276
|
+
if (duration.error !== void 0) {
|
|
277
|
+
this.toastErrorDuration = this.normalizeToastDuration(duration.error);
|
|
278
|
+
} else {
|
|
279
|
+
this.toastErrorDuration = 4e3;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
263
282
|
}
|
|
264
283
|
}
|
|
265
284
|
setFormPrefill(data) {
|
|
@@ -277,9 +296,14 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
277
296
|
var _a, _b;
|
|
278
297
|
this.clearCloseAfterSuccessTimer();
|
|
279
298
|
this.resetFormData();
|
|
299
|
+
this.hideToast(false);
|
|
280
300
|
(_b = (_a = this.shadowRoot) == null ? void 0 : _a.getElementById("modal")) == null ? void 0 : _b.classList.remove("show");
|
|
281
301
|
this.dispatchEvent(new CustomEvent(WIDGET_EVENTS.CLOSE, { bubbles: true }));
|
|
282
302
|
}
|
|
303
|
+
/**
|
|
304
|
+
* Helper method to trigger a mock/demo toast popup for testing and development.
|
|
305
|
+
* @param type - Either "success" or "error"
|
|
306
|
+
*/
|
|
283
307
|
showDemoToast(type) {
|
|
284
308
|
if (type === "success") {
|
|
285
309
|
this.showToast({
|
|
@@ -306,9 +330,27 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
306
330
|
};
|
|
307
331
|
const toastDurationAttr = this.getAttribute("toast-duration");
|
|
308
332
|
if (toastDurationAttr !== null) {
|
|
309
|
-
const
|
|
310
|
-
if (
|
|
311
|
-
|
|
333
|
+
const trimmed = toastDurationAttr.trim();
|
|
334
|
+
if (trimmed.startsWith("{")) {
|
|
335
|
+
try {
|
|
336
|
+
const parsed = JSON.parse(trimmed);
|
|
337
|
+
if (parsed && typeof parsed === "object") {
|
|
338
|
+
if (parsed.success !== void 0) {
|
|
339
|
+
this.toastSuccessDuration = this.normalizeToastDuration(Number(parsed.success));
|
|
340
|
+
}
|
|
341
|
+
if (parsed.error !== void 0) {
|
|
342
|
+
this.toastErrorDuration = this.normalizeToastDuration(Number(parsed.error));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
} catch (e) {
|
|
346
|
+
}
|
|
347
|
+
} else {
|
|
348
|
+
const parsed = parseInt(trimmed, 10);
|
|
349
|
+
if (!isNaN(parsed)) {
|
|
350
|
+
const val = this.normalizeToastDuration(parsed);
|
|
351
|
+
this.toastSuccessDuration = val;
|
|
352
|
+
this.toastErrorDuration = val;
|
|
353
|
+
}
|
|
312
354
|
}
|
|
313
355
|
}
|
|
314
356
|
}
|
|
@@ -749,7 +791,7 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
749
791
|
this.clearFieldError("email");
|
|
750
792
|
this.clearFieldError("content");
|
|
751
793
|
}
|
|
752
|
-
showToast(payload, autoCloseMs
|
|
794
|
+
showToast(payload, autoCloseMs) {
|
|
753
795
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
|
|
754
796
|
const toastEl = (_a = this.shadowRoot) == null ? void 0 : _a.getElementById("toast");
|
|
755
797
|
const titleEl = (_b = this.shadowRoot) == null ? void 0 : _b.getElementById("toast-title");
|
|
@@ -770,7 +812,6 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
770
812
|
if (!toastEl || !titleEl || !messageEl || !detailsEl || !requestCodeEl || !linkRowEl || !linkEl || !countdownBarEl) {
|
|
771
813
|
return;
|
|
772
814
|
}
|
|
773
|
-
this.clearToastAutoCloseTimer();
|
|
774
815
|
this.clearToastCountdown();
|
|
775
816
|
titleEl.textContent = payload.title;
|
|
776
817
|
messageEl.textContent = payload.message;
|
|
@@ -799,8 +840,9 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
799
840
|
linkRowEl.classList.add("is-hidden");
|
|
800
841
|
detailsEl.classList.add("is-hidden");
|
|
801
842
|
}
|
|
802
|
-
this.
|
|
803
|
-
this.
|
|
843
|
+
const duration = autoCloseMs !== void 0 ? autoCloseMs : payload.type === "success" ? this.toastSuccessDuration : this.toastErrorDuration;
|
|
844
|
+
this.toastRemainingMs = duration;
|
|
845
|
+
this.toastTotalMs = duration;
|
|
804
846
|
const toastCardEl = (_l = this.shadowRoot) == null ? void 0 : _l.querySelector(".toast-card");
|
|
805
847
|
this.isToastPaused = Boolean(toastCardEl == null ? void 0 : toastCardEl.matches(":hover"));
|
|
806
848
|
toastEl.classList.remove("success", "error");
|
|
@@ -811,7 +853,7 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
811
853
|
countdownBarEl
|
|
812
854
|
);
|
|
813
855
|
}
|
|
814
|
-
hideToast() {
|
|
856
|
+
hideToast(shouldCloseModal = true) {
|
|
815
857
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
816
858
|
const toastEl = (_a = this.shadowRoot) == null ? void 0 : _a.getElementById("toast");
|
|
817
859
|
const titleEl = (_b = this.shadowRoot) == null ? void 0 : _b.getElementById("toast-title");
|
|
@@ -832,7 +874,7 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
832
874
|
if (!toastEl || !titleEl || !messageEl || !detailsEl || !requestCodeEl || !linkRowEl || !linkEl || !countdownBarEl) {
|
|
833
875
|
return;
|
|
834
876
|
}
|
|
835
|
-
|
|
877
|
+
const isSuccess = toastEl.classList.contains("success");
|
|
836
878
|
this.clearToastCountdown();
|
|
837
879
|
this.toastRemainingMs = 0;
|
|
838
880
|
this.toastTotalMs = 0;
|
|
@@ -853,6 +895,9 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
853
895
|
countdownEl.classList.add("is-hidden");
|
|
854
896
|
}
|
|
855
897
|
toastEl.classList.remove("success", "error", "show");
|
|
898
|
+
if (isSuccess && shouldCloseModal) {
|
|
899
|
+
this.close();
|
|
900
|
+
}
|
|
856
901
|
}
|
|
857
902
|
startToastCountdown(countdownEl, secondsEl, barEl) {
|
|
858
903
|
const updateCountdown = () => {
|
|
@@ -895,12 +940,6 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
895
940
|
title: content.type === "success" ? "G\u1EEDi y\xEAu c\u1EA7u th\xE0nh c\xF4ng" : "G\u1EEDi y\xEAu c\u1EA7u th\u1EA5t b\u1EA1i"
|
|
896
941
|
};
|
|
897
942
|
}
|
|
898
|
-
clearToastAutoCloseTimer() {
|
|
899
|
-
if (this.toastAutoCloseTimer !== null) {
|
|
900
|
-
window.clearTimeout(this.toastAutoCloseTimer);
|
|
901
|
-
this.toastAutoCloseTimer = null;
|
|
902
|
-
}
|
|
903
|
-
}
|
|
904
943
|
normalizeToastDuration(value) {
|
|
905
944
|
if (!Number.isFinite(value) || value <= 0) {
|
|
906
945
|
return 4e3;
|
|
@@ -952,7 +991,7 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
952
991
|
async submit() {
|
|
953
992
|
var _a;
|
|
954
993
|
this.clearCloseAfterSuccessTimer();
|
|
955
|
-
this.hideToast();
|
|
994
|
+
this.hideToast(false);
|
|
956
995
|
if (!this.validateRequiredFields()) {
|
|
957
996
|
this.dispatchEvent(
|
|
958
997
|
new CustomEvent(WIDGET_EVENTS.SUBMIT_ERROR, {
|
|
@@ -1042,8 +1081,8 @@ var SupportWidgetElement = class extends HTMLElement {
|
|
|
1042
1081
|
})
|
|
1043
1082
|
);
|
|
1044
1083
|
this.closeAfterSuccessTimer = window.setTimeout(() => {
|
|
1045
|
-
this.
|
|
1046
|
-
},
|
|
1084
|
+
this.hideToast();
|
|
1085
|
+
}, this.toastSuccessDuration);
|
|
1047
1086
|
} catch (error) {
|
|
1048
1087
|
const errorContent = mapHttpClientError(error);
|
|
1049
1088
|
this.showToast(this.toToastPayload(errorContent));
|