Skip to content

Commit 3ab089e

Browse files
authored
Merge pull request #19 from lirena00/fix_storage
updated to version v1.3.2
2 parents 2e4d9d5 + 9c693e5 commit 3ab089e

File tree

4 files changed

+132
-104
lines changed

4 files changed

+132
-104
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "monochromate",
33
"description": "An extension that greyscales the webpage to reduce doomscrolling",
44
"private": true,
5-
"version": "1.3.1",
5+
"version": "1.3.2",
66
"type": "module",
77
"scripts": {
88
"dev": "wxt",

src/entrypoints/background.ts

Lines changed: 61 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export default defineBackground(() => {
88
scheduleEnd: "09:00",
99
schedule: true,
1010
};
11+
let settingsInitialized = false;
1112

1213
// Debounce helper to prevent too frequent tab updates
1314
const debounce = (func: Function, wait: number) => {
@@ -107,8 +108,10 @@ export default defineBackground(() => {
107108

108109
// Optimized update function that only changes what's needed
109110
const updateSettings = (changes: Partial<typeof currentSettings>) => {
111+
if (!settingsInitialized) {
112+
return;
113+
}
110114
const newSettings = { ...currentSettings, ...changes };
111-
112115
// Only update storage if something changed
113116
if (JSON.stringify(newSettings) !== JSON.stringify(currentSettings)) {
114117
browser.storage.local.set({ Monofilter: newSettings });
@@ -126,35 +129,13 @@ export default defineBackground(() => {
126129
}
127130
};
128131

129-
// Initialize
130-
browser.storage.local.get("Monofilter").then((data) => {
131-
if (!data.Monofilter) {
132-
updateSettings({
133-
enabled: true,
134-
intensity: 100,
135-
blacklist: ["localhost"],
136-
scheduleStart: "17:00",
137-
scheduleEnd: "09:00",
138-
schedule: true,
139-
});
140-
} else {
141-
currentSettings = data.Monofilter;
142-
if (currentSettings.enabled) {
143-
applyGreyscaleToAllTabsDebounced(
144-
currentSettings.intensity,
145-
currentSettings.blacklist
146-
);
147-
}
148-
}
149-
});
150-
151132
const updateScheduleAlarm = () => {
152133
browser.alarms.clear("StartMonochromate").then(() => {
153134
if (!currentSettings.scheduleStart) return;
154135
const [startHours, startMinutes] = currentSettings.scheduleStart
155136
.split(":")
156137
.map(Number);
157-
const startTime = getNextTime(startHours, startMinutes);
138+
const startTime = getTime(startHours, startMinutes);
158139
browser.alarms.create("StartMonochromate", {
159140
when: startTime,
160141
periodInMinutes: 24 * 60,
@@ -166,41 +147,59 @@ export default defineBackground(() => {
166147
const [endHours, endMinutes] = currentSettings.scheduleEnd
167148
.split(":")
168149
.map(Number);
169-
const endTime = getNextTime(endHours, endMinutes);
150+
const endTime = getTime(endHours, endMinutes);
170151
browser.alarms.create("EndMonochromate", {
171152
when: endTime,
172153
periodInMinutes: 24 * 60,
173154
});
174155
});
175156
};
176157

177-
// Set initial alarm
178-
updateScheduleAlarm();
179-
180-
function getNextTime(hour: number, minute: number): number {
181-
const now = new Date();
158+
function getTime(hour: number, minute: number): number {
182159
const target = new Date();
183160
target.setHours(hour, minute, 0, 0);
184-
if (target.getTime() <= now.getTime()) target.setDate(target.getDate() + 1);
185161
return target.getTime();
186162
}
187163

164+
browser.storage.local.get("Monofilter").then((data) => {
165+
if (!data.Monofilter) {
166+
updateSettings({
167+
enabled: true,
168+
intensity: 100,
169+
blacklist: ["localhost"],
170+
scheduleStart: "17:00",
171+
scheduleEnd: "09:00",
172+
schedule: true,
173+
});
174+
} else {
175+
currentSettings = data.Monofilter;
176+
if (currentSettings.enabled) {
177+
applyGreyscaleToAllTabsDebounced(
178+
currentSettings.intensity,
179+
currentSettings.blacklist
180+
);
181+
}
182+
}
183+
settingsInitialized = true;
184+
updateScheduleAlarm();
185+
});
186+
188187
browser.alarms.onAlarm.addListener((alarm) => {
189-
if (alarm.name === "StartMonochromate" && currentSettings.schedule) {
190-
// Enable greyscale mode
188+
if (
189+
alarm.name === "StartMonochromate" &&
190+
currentSettings.schedule &&
191+
settingsInitialized
192+
) {
191193
updateSettings({ enabled: true });
192-
applyGreyscaleToAllTabsDebounced(
193-
currentSettings.intensity,
194-
currentSettings.blacklist
195-
);
196-
} else if (alarm.name === "EndMonochromate" && currentSettings.schedule) {
197-
// Disable greyscale mode
194+
} else if (
195+
alarm.name === "EndMonochromate" &&
196+
currentSettings.schedule &&
197+
settingsInitialized
198+
) {
198199
updateSettings({ enabled: false });
199-
disableGreyscaleForAllTabs();
200200
}
201201
});
202202

203-
// Optimized message handler
204203
browser.runtime.onMessage.addListener((message) => {
205204
switch (message.type) {
206205
case "toggleGreyscale":
@@ -220,15 +219,10 @@ export default defineBackground(() => {
220219
blacklist: message.value,
221220
});
222221
break;
223-
case "setScheduleStart":
224-
updateSettings({
225-
scheduleStart: message.value,
226-
});
227-
updateScheduleAlarm();
228-
break;
229-
case "setScheduleEnd":
222+
case "saveSchedule":
230223
updateSettings({
231-
scheduleEnd: message.value,
224+
scheduleStart: message.startTime,
225+
scheduleEnd: message.endTime,
232226
});
233227
updateScheduleAlarm();
234228
break;
@@ -282,3 +276,21 @@ export default defineBackground(() => {
282276
}
283277
});
284278
});
279+
280+
browser.runtime.onInstalled.addListener((details) => {
281+
if (details.reason === "install") {
282+
browser.tabs.create({
283+
url: "https://monochromate.lirena.in/thanks?utm_source=extension&utm_medium=install",
284+
});
285+
} else if (details.reason === "update") {
286+
const previousVersion = details.previousVersion;
287+
const currentVersion = browser.runtime.getManifest().version;
288+
if (previousVersion !== currentVersion) {
289+
browser.tabs.create({
290+
url:
291+
"https://monochromate.lirena.in/release-notes/?utm_source=extension&utm_medium=update#v" +
292+
currentVersion,
293+
});
294+
}
295+
}
296+
});

src/entrypoints/popup/App.tsx

Lines changed: 69 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
ChevronDown,
1212
ChevronUp,
1313
ArrowLeft,
14+
Save,
1415
AlarmClock,
1516
Loader2,
1617
} from "lucide-react";
@@ -30,6 +31,7 @@ const Icons = {
3031
ChevronDown: () => <ChevronDown size={15} />,
3132
ChevronUp: () => <ChevronUp size={15} />,
3233
ArrowLeft: () => <ArrowLeft size={18} />,
34+
Save: () => <Save size={15} />,
3335
Discord: () => <Discord />,
3436
Loader: () => <Loader2 size={24} className="animate-spin" />,
3537
};
@@ -60,6 +62,8 @@ export default function App() {
6062
const [currentUrl, setCurrentUrl] = useState("");
6163
const [startMonochromate, setStartMonochromate] = useState("");
6264
const [endMonochromate, setEndMonochromate] = useState("");
65+
const [tempStartTime, setTempStartTime] = useState("");
66+
const [tempEndTime, setTempEndTime] = useState("");
6367
const [scheduleToggle, setScheduleToggle] = useState(false);
6468
const [view, setView] = useState<"main" | "blacklist">("main");
6569

@@ -101,8 +105,12 @@ export default function App() {
101105
setEnabled(data.Monofilter.enabled ?? false);
102106
setIntensity(data.Monofilter.intensity ?? 100);
103107
setBlacklist(data.Monofilter.blacklist ?? []);
104-
setStartMonochromate(data.Monofilter.scheduleStart ?? "17:00");
105-
setEndMonochromate(data.Monofilter.scheduleEnd ?? "09:00");
108+
const scheduleStart = data.Monofilter.scheduleStart ?? "17:00";
109+
const scheduleEnd = data.Monofilter.scheduleEnd ?? "09:00";
110+
setStartMonochromate(scheduleStart);
111+
setEndMonochromate(scheduleEnd);
112+
setTempStartTime(scheduleStart);
113+
setTempEndTime(scheduleEnd);
106114
setScheduleToggle(data.Monofilter.schedule ?? true);
107115
}
108116
// Only turn off loading when data is actually loaded
@@ -124,8 +132,12 @@ export default function App() {
124132
setEnabled(newValue.enabled ?? false);
125133
setIntensity(newValue.intensity ?? 100);
126134
setBlacklist(newValue.blacklist ?? []);
127-
setStartMonochromate(newValue.scheduleStart ?? "17:00");
128-
setEndMonochromate(newValue.scheduleEnd ?? "09:00");
135+
const scheduleStart = newValue.scheduleStart ?? "17:00";
136+
const scheduleEnd = newValue.scheduleEnd ?? "09:00";
137+
setStartMonochromate(scheduleStart);
138+
setEndMonochromate(scheduleEnd);
139+
setTempStartTime(scheduleStart);
140+
setTempEndTime(scheduleEnd);
129141
setScheduleToggle(newValue.schedule ?? true);
130142
}
131143
}
@@ -168,33 +180,18 @@ export default function App() {
168180
},
169181
[loading]
170182
);
171-
const changeStartTime = useCallback(
172-
(e: React.ChangeEvent<HTMLInputElement>) => {
173-
if (loading) return;
174-
175-
const newStartTime = e.target.value;
176-
setStartMonochromate(newStartTime);
177-
browser.runtime.sendMessage({
178-
type: "setScheduleStart",
179-
value: newStartTime,
180-
});
181-
},
182-
[loading]
183-
);
184183

185-
const changeEndTime = useCallback(
186-
(e: React.ChangeEvent<HTMLInputElement>) => {
187-
if (loading) return;
184+
const saveScheduleTimes = useCallback(() => {
185+
if (loading) return;
188186

189-
const newEndTime = e.target.value;
190-
setEndMonochromate(newEndTime);
191-
browser.runtime.sendMessage({
192-
type: "setScheduleEnd",
193-
value: newEndTime,
194-
});
195-
},
196-
[loading]
197-
);
187+
setStartMonochromate(tempStartTime);
188+
setEndMonochromate(tempEndTime);
189+
browser.runtime.sendMessage({
190+
type: "saveSchedule",
191+
startTime: tempStartTime,
192+
endTime: tempEndTime,
193+
});
194+
}, [tempStartTime, tempEndTime, loading]);
198195

199196
const toggleSchedule = useCallback(() => {
200197
if (loading) return;
@@ -371,35 +368,54 @@ export default function App() {
371368
</div>
372369

373370
<div
374-
className={`flex gap-2 items-center ${
375-
!scheduleToggle ? "opacity-60" : ""
376-
}`}
371+
className={`space-y-3 ${!scheduleToggle ? "opacity-60" : ""}`}
377372
>
378-
<div className="flex-1 bg-white rounded-lg border border-neutral-200 px-3 py-2 hover:border-neutral-400 transition-all">
379-
<div className="flex items-center justify-between">
380-
<span className="text-xs text-neutral-500">Start:</span>
381-
<input
382-
type="time"
383-
className="bg-transparent border-0 text-sm text-right focus:outline-hidden"
384-
value={startMonochromate}
385-
onChange={(e) => changeStartTime(e)}
386-
disabled={!scheduleToggle}
387-
/>
373+
<div className="flex gap-2 items-center">
374+
<div className="flex-1 bg-white rounded-lg border border-neutral-200 px-3 py-2 hover:border-neutral-400 transition-all">
375+
<div className="flex items-center justify-between">
376+
<span className="text-xs text-neutral-500">Start:</span>
377+
<input
378+
type="time"
379+
className="bg-transparent border-0 text-sm text-right focus:outline-hidden"
380+
value={tempStartTime}
381+
onChange={(e) => setTempStartTime(e.target.value)}
382+
disabled={!scheduleToggle}
383+
/>
384+
</div>
388385
</div>
389-
</div>
390386

391-
<div className="flex-1 bg-white rounded-lg border border-neutral-200 px-3 py-2 hover:border-neutral-400 transition-all">
392-
<div className="flex items-center justify-between">
393-
<span className="text-xs text-neutral-500">End:</span>
394-
<input
395-
type="time"
396-
className="bg-transparent border-0 text-sm text-right focus:outline-hidden"
397-
value={endMonochromate}
398-
onChange={(e) => changeEndTime(e)}
399-
disabled={!scheduleToggle}
400-
/>
387+
<div className="flex-1 bg-white rounded-lg border border-neutral-200 px-3 py-2 hover:border-neutral-400 transition-all">
388+
<div className="flex items-center justify-between">
389+
<span className="text-xs text-neutral-500">End:</span>
390+
<input
391+
type="time"
392+
className="bg-transparent border-0 text-sm text-right focus:outline-hidden"
393+
value={tempEndTime}
394+
onChange={(e) => setTempEndTime(e.target.value)}
395+
disabled={!scheduleToggle}
396+
/>
397+
</div>
401398
</div>
402399
</div>
400+
401+
<button
402+
onClick={saveScheduleTimes}
403+
disabled={
404+
!scheduleToggle ||
405+
(tempStartTime === startMonochromate &&
406+
tempEndTime === endMonochromate)
407+
}
408+
className={`w-full flex items-center justify-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors ${
409+
!scheduleToggle ||
410+
(tempStartTime === startMonochromate &&
411+
tempEndTime === endMonochromate)
412+
? "bg-neutral-200 text-neutral-400 cursor-not-allowed"
413+
: "bg-neutral-900 text-white hover:bg-neutral-800"
414+
}`}
415+
>
416+
<Icons.Save />
417+
Save Schedule
418+
</button>
403419
</div>
404420
</div>
405421

wxt.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default defineConfig({
1010
modules: ["@wxt-dev/module-react"],
1111
manifest: {
1212
name: "Monochromate",
13-
version: "1.3.1",
13+
version: "1.3.2",
1414
description:
1515
"An extension that greyscales the webpage to reduce doomscrolling",
1616
permissions: ["storage", "activeTab", "scripting", "alarms"],

0 commit comments

Comments
 (0)