From a2194b137271ff94e9eb88a3b7dd24dab8259bec Mon Sep 17 00:00:00 2001 From: qunash Date: Fri, 21 Apr 2023 14:13:10 +0300 Subject: [PATCH 1/2] ~fix toolbar disappearing after chatgpt UI changes --- src/components/slashCommandsMenu.tsx | 4 +- src/content-scripts/mainUI.tsx | 58 +++++++++++----------------- 2 files changed, 25 insertions(+), 37 deletions(-) diff --git a/src/components/slashCommandsMenu.tsx b/src/components/slashCommandsMenu.tsx index 1ba0b55..7a66920 100644 --- a/src/components/slashCommandsMenu.tsx +++ b/src/components/slashCommandsMenu.tsx @@ -43,10 +43,10 @@ const SlashCommandItem = (props: { } // const renderSlashButton = (textarea: HTMLTextAreaElement, show: boolean, onClick: () => void) => { -// let div = document.querySelector('wcg-slash-button-div') +// let div = document.querySelector('div.wcg-slash-button-div') // if (div) div.remove() -// div = document.createElement('wcg-slash-button-div') +// div = document.createElement('div.wcg-slash-button-div') // div.className = "self-center" // textarea.parentElement.insertBefore(div, textarea.parentElement.firstChild) // render(, div) diff --git a/src/content-scripts/mainUI.tsx b/src/content-scripts/mainUI.tsx index 9b9750a..bbeda1a 100644 --- a/src/content-scripts/mainUI.tsx +++ b/src/content-scripts/mainUI.tsx @@ -12,18 +12,22 @@ import SlashCommandsMenu, { slashCommands } from 'src/components/slashCommandsMe import { apiExtractText } from './api' let isProcessing = false +let updatingUI = false +const rootEl = getRootElement() let btnSubmit: HTMLButtonElement | null | undefined let textarea: HTMLTextAreaElement | null let chatGptFooter: HTMLDivElement | null +let toolbar: HTMLElement | null function renderSlashCommandsMenu() { - let div = document.querySelector('wcg-slash-commands-menu') + let div = document.querySelector('div.wcg-slash-commands-menu') if (div) div.remove() - div = document.createElement('wcg-slash-commands-menu') + div = document.createElement('div') + div.className = "wcg-slash-commands-menu" const textareaParentParent = textarea?.parentElement?.parentElement textareaParentParent?.insertBefore(div, textareaParentParent.firstChild) @@ -70,9 +74,7 @@ async function handleSubmit(query: string) { try { const results = await processQuery(query, userConfig) - // console.info("WebChatGPT results --> ", results) const compiledPrompt = await compilePrompt(results, query) - // console.info("WebChatGPT compiledPrompt --> ", compiledPrompt) textarea.value = compiledPrompt pressEnter() } catch (error) { @@ -95,7 +97,6 @@ async function onSubmit(event: MouseEvent | KeyboardEvent) { if (!isProcessing && (event.type === "click" || (isKeyEvent && event.key === 'Enter'))) { const query = textarea?.value.trim() - // if query is empty or undefined, return if (!query) return textarea.value = "" @@ -132,11 +133,13 @@ function showErrorMessage(error: Error) { async function updateUI() { - formChild = document.querySelector('form')?.children[0] as HTMLElement - textarea = getTextArea() - // console.info("UpdateUI textarea: ", textarea) + if (updatingUI) return - const toolbar = getWebChatGPTToolbar() + updatingUI = true + + textarea = getTextArea() + toolbar = getWebChatGPTToolbar() + console.info("toolbar --> ", toolbar) if (!textarea) { toolbar?.remove() return @@ -155,27 +158,19 @@ async function updateUI() { renderSlashCommandsMenu() - // textarea.parentElement.style.flexDirection = 'row' - chatGptFooter = getFooter() if (chatGptFooter) { const lastChild = chatGptFooter.lastElementChild as HTMLElement if (lastChild) lastChild.style.padding = '0 0 0.5em 0' } + + updatingUI = false } async function renderToolbar() { try { const textareaParentParent = textarea?.parentElement?.parentElement - // const textareaParentParent = formChild - // if (textareaParentParent && textareaParentParent.parentElement) { - // textareaParentParent.style.flexDirection = 'column' - // textareaParentParent.parentElement.style.flexDirection = 'column' - // textareaParentParent.parentElement.style.gap = '0px' - // textareaParentParent.parentElement.style.marginBottom = '0.5em' - // } - const { shadowRootDiv, shadowRoot } = await createShadowRoot('content-scripts/mainUI.css') shadowRootDiv.classList.add('wcg-toolbar') textareaParentParent?.appendChild(shadowRootDiv) @@ -188,12 +183,15 @@ async function renderToolbar() { } } -const form = document.querySelector('form') -const formParent = form?.parentElement -const rootEl = getRootElement() -let formChild = document.querySelector('form')?.children[0] as HTMLElement -const mutationObserver = new MutationObserver(() => { +const mutationObserver = new MutationObserver((mutations) => { + + if (!mutations.some(mutation => mutation.removedNodes.length > 0)) return + + console.info("WebChatGPT: Mutation observer triggered") + + if (getWebChatGPTToolbar()) return + try { updateUI() } catch (e) { @@ -206,17 +204,7 @@ const mutationObserver = new MutationObserver(() => { window.onload = function () { updateUI() - if (formChild) { - mutationObserver.observe(formChild, { childList: true }) - } - - if (rootEl) { - mutationObserver.observe(rootEl, { childList: true }) - } - - if (formParent) { - mutationObserver.observe(formParent, { childList: true }) - } + mutationObserver.observe(rootEl, { childList: true, subtree: true }) } window.onunload = function () { From ed12d17680ce1df19c603e790d9c8739789e52cc Mon Sep 17 00:00:00 2001 From: qunash Date: Fri, 21 Apr 2023 14:13:37 +0300 Subject: [PATCH 2/2] release 3.2.7 --- ...chrome.zip => webchatgpt-3.2.7-chrome.zip} | Bin 419834 -> 419874 bytes ...refox.zip => webchatgpt-3.2.7-firefox.zip} | Bin 419873 -> 419913 bytes package.json | 2 +- src/manifest.json | 2 +- src/manifest.v2.json | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) rename build/{webchatgpt-3.2.6-chrome.zip => webchatgpt-3.2.7-chrome.zip} (98%) rename build/{webchatgpt-3.2.6-firefox.zip => webchatgpt-3.2.7-firefox.zip} (98%) diff --git a/build/webchatgpt-3.2.6-chrome.zip b/build/webchatgpt-3.2.7-chrome.zip similarity index 98% rename from build/webchatgpt-3.2.6-chrome.zip rename to build/webchatgpt-3.2.7-chrome.zip index 8e41c07949dd78f0498c6eb63fa69e8dc127ad43..c802f581483f674641441d221456fd612760e65a 100644 GIT binary patch delta 3132 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 delta 3122 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 T1#-B!6qukwYS0o9f)D6#LYPk_ diff --git a/build/webchatgpt-3.2.6-firefox.zip b/build/webchatgpt-3.2.7-firefox.zip similarity index 98% rename from build/webchatgpt-3.2.6-firefox.zip rename to build/webchatgpt-3.2.7-firefox.zip index fb3208699b7555c4cd531208538cfde99225d9bd..93012d424829454e0db7e60cc08de261e1c2bbb0 100644 GIT binary patch delta 2852 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 delta 2863 zcmZWr2{@E%8=m>bd>IT9W$0Mqlu#)9lH;c+WZxTR3?>@JmJ`L$A&ML{yd5c#{t_YE z5F$dBW8cNGByDPJSyZ!^#g-zlQCMUN7HW&c2qHMy4_n8mONU4}@JlC}gCQOTWrzUoD2Si2zZ`lg z!=S7|!pO}?Fgp$@AX9Q;sW@zSa@N zX;=PKoPY5|ErSa2W^n;qFcuf%J}1h;vn z=;(Eb{h}Dr>l_BHw9`3FW_j$UQy5crDvyWbmrF`10#_xj{P@g4l=OHbJ& z5o2_qP9ROLw+~0mS~9L38#-B?2T#lWTd^?byaWV=#2$*^_U~OA6%H%4%lJ?A+EQKP zZJW!#jkJb|7tjJ4BnC@fIuSguuk_`zb|KXH?8jQd5a}8bM^mOea z2zS#Sn%Ump;lfww;LKBDa3!>DchAEH-EuR(0FJoPz55)!QCd&2AvacT%BMD3C*&rO z0lwhsUiY-D82o?p1gyJbMuwDBQFx#0v9-54o0s0_JZYzKPEdTEPy^#Hmdyhjj$$5# zN~?6SC6*h=23?o^;w!$h)*=X-Y^wnyY#20ato%2vWhg|c>DO!6Pc2PdZ6d@Nd@ySg@(S&Mn2wlu~Md8qWF zU#ux`e9rI_ElRoM9Flx#vIM?&iJ6TSsfu}~rRp##+E7;Oo4+7T)AbR}pN@77aA*ut+B?b`zR^a%JQoTdwXP~8@X<@lLM`lRlIx$IOWliB$ef$5d}>a=jJ4_r zlFSZXZKX)DHr^^yl;1X}7)p!h?$$RjjanuySUfSMktQY%@*&Fo7nKB!-q~o7D6vnK z?`!j4CdZ8M=1Y@)V>nS}B<~W9W24P1UO1(mUbSv8t}c2LT28gbe>r9@j(uiD@)}q! zR!O=>>o!O6c3^591*LpV)#Zi`1+`F6)L>t_FH~GOr#+}SFjXyldL+^kC)txTwR}Z0 zrudP+BTxRtcY)0}ZQP26l8(<6IpUt*@pmAtXSe&kznUIhTD-z ze!JG9s7muedh!KpzmT{2Qj<|PogT_w>-5x|q}eP8iqEz;jATE|f2I)pcu)NFy^C@X zhlP$oRjBcZ*=QZTrZc!&uK!e(o_ZgPDt7k1w_Wh~&Daw3^N){iH4N7H>q`Ftr}_(-VCY$CJzU6yDvrRz_L9FzVN^iHI8dF%8~_hn#{-Zn!#2Xk!RRNsG~6dOw( zKHE?*{`(h0)`5tavI22V%BTfwUiaSv z7~gOSHH2(w!b|U@X0H!5eC@{~Lhj0s;%4g>^JI!=InjZJt6YCJru5p?2o+^TuaF zv}KXwHB&;9;qS2mR~7RsIhP+RMa+*0YT}hr&eqJt4|UyoQ;MSHt-mAA`SZS-R3!FW z!iD-}9Apwl2aQRv=F!`ap0H=-EE!{DAF47;U8VJvC#y#Zx3m7l@(G_kQ}iHVD)VFh zDgLs-@!mTYL7 zgmE;^)47dsPA&x`UHwGDFu9iz1`G5ZwjU3juv0dCg%5pG>P&3~N#Oe!Vk1xzZlzccj0`RycU} z;H|9tyG^LSUt8hd!O$viZRTn%&?^TU9cWRW-iV|$oh}HWc7zuJkWr8r2<=02F-~`) zy-=7R==Mw>`X@$P5BeMuprarW2HP{3Yl~I^(*ni(s8MnZ>B-`Ljn z)Lu)iKO!N7kti0yzv;ZSBoL($vh1BJk#vsiPd)GB#*RJg74Sne;B|pTA!HPgbAjbS zr!y=9+1&v%&afD;a)EULF98;VUXO#r1o*%)Hly2q&-&P}SO~->8fyYVcoTg*J=_BV z*+5jEAE7$fP$;=62q?aW1aUuDZNH5lxDsG{XuShe5@6vUngPZ20Bs_>xKRQuf-3Dn zgU%kb5a1`mFfb>=(nvLMo(PMB9<~qa#TXha5@88oMu1`c&ElDu9OXPJ0+Bn3L^%pg6bRSN%aX(`1<|UtnItEIS*tc&~$}0ka-}`6_(kW>6SVkRIt^kGD{e&S+Xw; zpDWC>ZH)lhB(^oj3IhyoLVt_fBU8^d%PW~FTbp!#>zp2&*f@fg`Skf70xA%V