Your task is to review pull requests. Instructions:
- Provide the response in following JSON format: {"reviews": [{"line": <line_number>, "body": "<review comment>"}]}
- Do not give positive comments or compliments.
- Provide comments and suggestions ONLY if there is something to improve, otherwise "reviews" should be an empty array.
- Write the comment in GitHub Markdown format.
- Use the given description only for the overall context and only comment the code.
- IMPORTANT: NEVER suggest adding comments to the code.

Review the following code diff in the file "g4f/gui/client/static/js/chat.v1.js" and take the pull request title and description into account when writing the response.
  
Pull request title: [pull] main from xtekky:main
Pull request description:
---
See Commits and Changes for more details.

-----
Created by [<img src="https://prod.download/pull-18h-svg" valign="bottom"/> **pull[bot]**](https://github.com/wei/pull)

_Can you help keep this open source service alive? **[💖 Please sponsor : )](https://prod.download/pull-pr-sponsor)**_
---

Each line is prefixed by its number. Code to review:
```
57:     )
58: }
59: 
60:+function fallback_clipboard (text) {
61:+    var textBox = document.createElement("textarea");
62:+    textBox.value = text;
63:+    textBox.style.top = "0";
64:+    textBox.style.left = "0";
65:+    textBox.style.position = "fixed";
66:+    document.body.appendChild(textBox);
67:+    textBox.focus();
68:+    textBox.select();
69:+    try {
70:+        var success = document.execCommand('copy');
71:+        var msg = success ? 'succeeded' : 'failed';
72:+        console.log('Clipboard Fallback: Copying text command ' + msg);
73:+    } catch (e) {
74:+        console.error('Clipboard Fallback: Unable to copy', e);
75:+    }
76:+    document.body.removeChild(textBox);
77:+}
78:+
79: hljs.addPlugin(new CopyButtonPlugin());
80: let typesetPromise = Promise.resolve();
81: const highlight = (container) => {
107:             })
108:         }
109:     });
110:+
111:     document.querySelectorAll(".message .fa-clipboard").forEach(async (el) => {
112:         if (!("click" in el.dataset)) {
113:             el.dataset.click = "true";
114:             el.addEventListener("click", async () => {
115:                 const message_el = el.parentElement.parentElement.parentElement;
116:                 const copyText = await get_message(window.conversation_id, message_el.dataset.index);
-                navigator.clipboard.writeText(copyText);
117:+               
118:+            try {        
119:+                if (!navigator.clipboard) {
120:+                    throw new Error("navigator.clipboard: Clipboard API unavailable.");
121:+                }
122:+                await navigator.clipboard.writeText(copyText);
123:+            } catch (e) {
124:+                console.error(e);
125:+                console.error("Clipboard API writeText() failed! Fallback to document.exec(\"copy\")...");
126:+                fallback_clipboard(copyText);
127:+            }
128:+            
129:                 el.classList.add("clicked");
130:                 setTimeout(() => el.classList.remove("clicked"), 1000);
131:             })
132:         }
133:     });
134:+
135:     document.querySelectorAll(".message .fa-volume-high").forEach(async (el) => {
136:         if (!("click" in el.dataset)) {
137:             el.dataset.click = "true";
1456:             recognition.start();
1457:         }
1458:     });
-}
```