forked from atj393/promt-save-reuse-chatgpt-and-gemini
-
Notifications
You must be signed in to change notification settings - Fork 0
/
background.js
159 lines (146 loc) · 5.1 KB
/
background.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
let clickTimeout;
/**
* Listens for a click on the extension icon and distinguishes between single and double clicks.
* A single click triggers the handleSingleClick function, while a double click triggers handleDoubleClick.
*
* @param {chrome.tabs.Tab} tab - The current active tab where the action is performed.
*/
chrome.action.onClicked.addListener((tab) => {
if (clickTimeout) {
clearTimeout(clickTimeout);
clickTimeout = null;
handleDoubleClick(tab);
} else {
clickTimeout = setTimeout(() => {
handleSingleClick(tab);
clickTimeout = null;
}, 300);
}
});
/**
* Sets up context menu items when the extension is installed.
* These menu items allow the user to clear saved data, navigate to a GitHub page, or view the creator's profile.
*/
chrome.runtime.onInstalled.addListener(() => {
chrome.contextMenus.create({
id: "clearData",
title: "Clear All Saved Data",
contexts: ["action"],
});
chrome.contextMenus.create({
id: "navigateGitHub",
title: "How to use?",
contexts: ["action"],
});
chrome.contextMenus.create({
id: "creator",
title: "Goto Developer Profile",
contexts: ["action"],
});
});
/**
* Handles clicks on context menu items by performing actions such as clearing saved data
* or opening specific URLs.
*
* @param {chrome.contextMenus.OnClickData} info - Information about the context menu click event.
*/
chrome.contextMenus.onClicked.addListener((info) => {
if (info.menuItemId === "clearData") {
chrome.storage.local.clear(() => {});
} else if (info.menuItemId === "navigateGitHub") {
chrome.tabs.create({
url: "https://github.com/atj393/promt-save-reuse-chatgpt-and-gemini/wiki/Prompt-Save-Reuse:-ChatGPT-&-Gemini-%E2%80%90-User-Guide",
});
} else if (info.menuItemId === "creator") {
chrome.tabs.create({
url: "https://www.linkedin.com/in/atj393/",
});
}
});
/**
* Handles the action when the extension icon is single-clicked.
* It injects a script into the active tab that either saves the current input or
* retrieves and inserts saved text into the input field.
*
* @param {chrome.tabs.Tab} tab - The current active tab where the action is performed.
*/
function handleSingleClick(tab) {
chrome.scripting.executeScript({
target: { tabId: tab.id },
function: toggleInputStorage,
});
}
/**
* Handles the action when the extension icon is double-clicked.
* It injects a script into the active tab that appends the saved text to the existing content in the input field.
*
* @param{chrome.tabs.Tab}tab - The current active tab where the action is performed.
*/
function handleDoubleClick(tab) {
chrome.scripting.executeScript({
target: { tabId: tab.id },
function: appendStoredText,
});
}
/**
* Toggles the input storage functionality by either saving the current input field text
* to local storage or retrieving and inserting saved text into the input field.
*
* This function is injected into the active tab and interacts directly with the DOM of the page.
*/
function toggleInputStorage() {
const inputFieldChatGPT =
document.querySelector(".ProseMirror[contenteditable='true']") ||
document.querySelector("#prompt-textarea");
const inputFieldGemini = document.querySelector(
'.ql-editor[contenteditable="true"]'
);
const inputField = inputFieldChatGPT || inputFieldGemini;
const url = window.location.href;
if (!inputField) return;
if (inputFieldChatGPT && inputField.innerText.trim()) {
chrome.storage.local.set({ [url]: inputField.innerText.trim() }, () => {});
} else if (inputFieldGemini && inputField.innerText.trim()) {
chrome.storage.local.set({ [url]: inputField.innerText.trim() }, () => {});
} else {
chrome.storage.local.get([url], (result) => {
if (result[url]) {
if (inputFieldChatGPT) {
inputField.innerText = result[url];
} else if (inputFieldGemini) {
inputField.innerHTML = result[url];
}
}
});
}
}
/**
* Appends the stored text from local storage to the current content of the input field.
* It ensures that the input field content is updated and triggers an input event to reflect changes.
*
* This function is injected into the active tab and interacts directly with the DOM of the page.
*/
function appendStoredText() {
const inputFieldChatGPT =
document.querySelector(".ProseMirror[contenteditable='true']") ||
document.querySelector("#prompt-textarea");
const inputFieldGemini = document.querySelector(
'.ql-editor[contenteditable="true"]'
);
const inputField = inputFieldChatGPT || inputFieldGemini;
const url = window.location.href;
if (!inputField) return;
chrome.storage.local.get([url], (result) => {
if (result[url]) {
if (inputFieldChatGPT) {
inputField.innerText += `\n\n ${ result[url] } ` ;
const event = new Event("input", { bubbles: true });
inputField.dispatchEvent(event);
} else if (inputFieldGemini) {
inputField.innerHTML += `<p><br></p><p>${result[url]}</p>`;
const event = new Event("input", { bubbles: true });
inputField.dispatchEvent(event);
}
}
});
}