Skip to content

Commit 9c420c9

Browse files
committed
fix: reset all state and re-initialize when api key changes
1 parent 6e7f102 commit 9c420c9

File tree

5 files changed

+61
-25
lines changed

5 files changed

+61
-25
lines changed

.changeset/rare-clowns-stop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"react-use-zendesk": minor
3+
---
4+
5+
fix: reset all state and re-initialize when api key changes

apps/docs/app/components/ExampleList.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ export const ExampleList: React.FC = () => {
217217
>
218218
Reset Widget
219219
</a>
220+
<br />
221+
Internally the library call this method when api key changes
220222
</div>
221223
),
222224
buttonText: "reset",
Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,53 @@
1+
const IdScript = "ze-snippet";
2+
13
export function initialize(apiKey: string, onLoad: () => void) {
24
if (
35
!!apiKey &&
4-
typeof window !== "undefined" &&
5-
typeof window.zE === "undefined"
6+
typeof window !== "undefined"
7+
// && typeof window.zE === "undefined"
68
) {
7-
var appendScript = function () {
8-
setTimeout(function () {
9-
var s = document.createElement("script");
10-
s.id = "ze-snippet";
11-
s.type = "text/javascript";
12-
s.async = true;
13-
s.onload = onLoad;
14-
15-
s.src = "https://static.zdassets.com/ekr/snippet.js?key=" + apiKey;
16-
17-
var x = document.getElementsByTagName("script")[0];
18-
x?.parentNode.insertBefore(s, x);
19-
}, 0);
9+
const setup = () => {
10+
removeNodes();
11+
appendScript(apiKey, onLoad);
2012
};
21-
2213
if (document.readyState === "complete") {
23-
appendScript();
14+
setup();
2415
} else if (window.attachEvent) {
25-
window.attachEvent("onload", appendScript);
16+
window.attachEvent("onload", setup);
2617
} else {
27-
window.addEventListener("load", appendScript, false);
18+
window.addEventListener("load", setup, false);
2819
}
2920
}
3021
}
22+
23+
export function removeNodes() {
24+
if (typeof window !== "undefined") {
25+
delete window.zE;
26+
delete (window as any).zEmbed;
27+
delete (window as any).zEACLoaded;
28+
delete (window as any).zEWebpackACJsonp;
29+
var scriptElement = document.getElementById(IdScript);
30+
var frameElement = document.querySelector("iframe#launcher");
31+
if (scriptElement) {
32+
scriptElement.remove();
33+
}
34+
if (frameElement) {
35+
frameElement.remove();
36+
}
37+
}
38+
}
39+
40+
export function appendScript(apiKey: string, onLoad: () => void) {
41+
setTimeout(function () {
42+
const s = document.createElement("script");
43+
s.id = IdScript;
44+
s.type = "text/javascript";
45+
s.async = true;
46+
s.onload = onLoad;
47+
48+
s.src = "https://static.zdassets.com/ekr/snippet.js?key=" + apiKey;
49+
50+
const x = document.getElementsByTagName("script")[0];
51+
x?.parentNode.insertBefore(s, x);
52+
}, 0);
53+
}

packages/react-use-zendesk/src/provider.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,20 @@ export const ZendeskProvider: React.FC<
5959
"unreadMessages",
6060
function (unreadMessages: number) {
6161
setUnreadMessages(unreadMessages);
62-
onUnreadMessages && onUnreadMessages(unreadMessages);
63-
}
62+
!!onUnreadMessagesRef.current &&
63+
onUnreadMessagesRef.current(unreadMessages);
64+
},
6465
);
66+
6567
isRegisteredCb.current = true;
6668
}
6769

6870
useEffect(() => {
6971
initialize(apiKey, registerCallback);
72+
return () => {
73+
isRegisteredCb.current = false;
74+
resetWidget();
75+
};
7076
}, [apiKey]);
7177

7278
const show = React.useCallback(() => {
@@ -101,14 +107,14 @@ export const ZendeskProvider: React.FC<
101107
(conversationFields: Array<ZendeskConversationField>) => {
102108
ZendeskApi("messenger:set", "conversationFields", conversationFields);
103109
},
104-
[]
110+
[],
105111
);
106112

107113
const setConversationTags = React.useCallback(
108114
(conversationTags: Array<string>) => {
109115
ZendeskApi("messenger:set", "conversationTags", conversationTags);
110116
},
111-
[]
117+
[],
112118
);
113119

114120
const loginUser = React.useCallback((jwtToken: string) => {
@@ -117,7 +123,7 @@ export const ZendeskProvider: React.FC<
117123
"loginUser",
118124
(callback: (token: string) => void) => {
119125
callback(jwtToken);
120-
}
126+
},
121127
);
122128
}, []);
123129

packages/react-use-zendesk/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export type ZendeskContextValues = {
2020
setZIndex: (newZIndex: number) => void;
2121
setCookies: (isEnabled: boolean) => void;
2222
setConversationFields: (
23-
conversationFields: Array<ZendeskConversationField>
23+
conversationFields: Array<ZendeskConversationField>,
2424
) => void;
2525
setConversationTags: (conversationTags: Array<string>) => void;
2626
loginUser: (jwtToken: string) => void;

0 commit comments

Comments
 (0)