-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpopup.js
More file actions
131 lines (111 loc) · 4.12 KB
/
Copy pathpopup.js
File metadata and controls
131 lines (111 loc) · 4.12 KB
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
const DEFAULT_PROMPT = [
"Baca soal pada gambar dan jawab hanya jawaban akhirnya saja.",
"Jangan pakai pembuka, ucapan terima kasih, analisis, langkah-langkah, markdown, atau penjelasan.",
"Kalau soal pilihan ganda, jawab format: A. isi jawaban.",
"Kalau soal isian/hitungan, jawab hasil akhirnya saja."
].join(" ");
const LEGACY_DEFAULT_PROMPT = [
"Kamu adalah study helper.",
"Baca soal dari gambar ini, lalu jawab dalam Bahasa Indonesia.",
"Berikan langkah pentingnya secara ringkas, lalu tulis jawaban akhir dengan jelas.",
"Jika gambar tidak cukup jelas, sebutkan bagian yang perlu di-crop ulang."
].join(" ");
const elements = {
apiKey: document.getElementById("apiKey"),
model: document.getElementById("model"),
prompt: document.getElementById("prompt"),
save: document.getElementById("save"),
capture: document.getElementById("capture"),
analyzeVisible: document.getElementById("analyzeVisible"),
status: document.getElementById("status"),
latestAnswer: document.getElementById("latestAnswer"),
copyAnswer: document.getElementById("copyAnswer"),
toggleKey: document.getElementById("toggleKey")
};
init();
async function init() {
const stored = await chrome.storage.local.get([
"geminiApiKey",
"geminiModel",
"answerPrompt",
"latestAnswer"
]);
elements.apiKey.value = stored.geminiApiKey || "";
elements.model.value = stored.geminiModel || "gemini-2.5-flash";
elements.prompt.value = !stored.answerPrompt || stored.answerPrompt === LEGACY_DEFAULT_PROMPT
? DEFAULT_PROMPT
: stored.answerPrompt;
renderLatestAnswer(stored.latestAnswer);
elements.save.addEventListener("click", saveSettings);
elements.capture.addEventListener("click", captureScreen);
elements.analyzeVisible.addEventListener("click", analyzeVisiblePage);
elements.copyAnswer.addEventListener("click", copyLatestAnswer);
elements.toggleKey.addEventListener("click", toggleKeyVisibility);
}
async function saveSettings() {
await chrome.storage.local.set({
geminiApiKey: elements.apiKey.value.trim(),
geminiModel: elements.model.value.trim() || "gemini-2.5-flash",
answerPrompt: elements.prompt.value.trim() || DEFAULT_PROMPT
});
setStatus("Settings saved.");
}
async function captureScreen() {
setStatus("Saving settings and capturing tab...");
elements.capture.disabled = true;
elements.analyzeVisible.disabled = true;
try {
await saveSettings();
const response = await chrome.runtime.sendMessage({ type: "capture-screen" });
if (!response.ok) {
throw new Error(response.error);
}
setStatus("Crop overlay opened.");
} catch (error) {
setStatus(error.message || String(error), true);
} finally {
elements.capture.disabled = false;
elements.analyzeVisible.disabled = false;
}
}
async function analyzeVisiblePage() {
setStatus("Saving settings and analyzing visible page...");
elements.capture.disabled = true;
elements.analyzeVisible.disabled = true;
try {
await saveSettings();
const response = await chrome.runtime.sendMessage({ type: "analyze-visible-page" });
if (!response.ok) {
throw new Error(response.error);
}
setStatus("Visible page analysis opened.");
} catch (error) {
setStatus(error.message || String(error), true);
} finally {
elements.capture.disabled = false;
elements.analyzeVisible.disabled = false;
}
}
async function copyLatestAnswer() {
const text = elements.latestAnswer.textContent.trim();
if (!text || text === "Belum ada jawaban.") {
setStatus("No answer to copy.", true);
return;
}
await navigator.clipboard.writeText(text);
setStatus("Answer copied.");
}
function toggleKeyVisibility() {
const showing = elements.apiKey.type === "text";
elements.apiKey.type = showing ? "password" : "text";
elements.toggleKey.textContent = showing ? "Show" : "Hide";
}
function renderLatestAnswer(latestAnswer) {
elements.latestAnswer.textContent = latestAnswer && latestAnswer.answer
? latestAnswer.answer
: "Belum ada jawaban.";
}
function setStatus(message, isError = false) {
elements.status.textContent = message;
elements.status.classList.toggle("error", isError);
}