-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoptions.js
More file actions
79 lines (66 loc) · 2.15 KB
/
options.js
File metadata and controls
79 lines (66 loc) · 2.15 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
const CONFIG_KEY = "settings";
const defaults = {
patterns: [],
timeoutMessage: "Time's up. Get back to what matters.",
defaultDurationMinutes: 20
};
async function loadSettings() {
const data = await browser.storage.local.get(CONFIG_KEY);
const settings = {
...defaults,
...(data[CONFIG_KEY] || {})
};
document.getElementById("patterns").value = settings.patterns.join("\n");
document.getElementById("timeoutMessage").value = settings.timeoutMessage;
document.getElementById("defaultDuration").value = settings.defaultDurationMinutes;
}
function validatePatterns(lines) {
for (const raw of lines) {
const pattern = raw.trim();
if (!pattern) {
continue;
}
if (pattern.toLowerCase().startsWith("regex:")) {
const regexBody = pattern.slice("regex:".length).trim();
try {
// Validate regex ahead of saving.
new RegExp(regexBody);
} catch (err) {
return `Invalid regex pattern: ${pattern}`;
}
}
}
return null;
}
async function saveSettings() {
const status = document.getElementById("status");
const rawPatterns = document.getElementById("patterns").value;
const timeoutMessage = document.getElementById("timeoutMessage").value.trim();
const defaultDurationMinutes = Number(document.getElementById("defaultDuration").value);
const patterns = rawPatterns
.split("\n")
.map((item) => item.trim())
.filter(Boolean);
const patternError = validatePatterns(patterns);
if (patternError) {
status.textContent = patternError;
status.style.color = "#b40f24";
return;
}
if (!Number.isFinite(defaultDurationMinutes) || defaultDurationMinutes <= 0) {
status.textContent = "Default duration must be a positive number.";
status.style.color = "#b40f24";
return;
}
await browser.storage.local.set({
[CONFIG_KEY]: {
patterns,
timeoutMessage: timeoutMessage || defaults.timeoutMessage,
defaultDurationMinutes: Math.floor(defaultDurationMinutes)
}
});
status.textContent = "Settings saved.";
status.style.color = "#13612d";
}
document.getElementById("saveBtn").addEventListener("click", saveSettings);
loadSettings();