feat: load news and calendars from cache on startup

Also check calendars for cache before trying to load
This commit is contained in:
2 * r + 2 * t 2025-04-09 15:27:05 +10:00
parent 5b221fb72d
commit 1cc7e12a57
2 changed files with 35 additions and 4 deletions

View file

@ -134,7 +134,8 @@ export default class Calendar extends GObject.Object {
icalStr = cal.value;
} else {
console.error(`Failed to get calendar from ${config.webcals.get()[i]}:\n${cal.reason}`);
icalStr = await readFileAsync(`${this.#cacheDir}/${webcal}`);
if (GLib.file_test(`${this.#cacheDir}/${webcal}`, GLib.FileTest.EXISTS))
icalStr = await readFileAsync(`${this.#cacheDir}/${webcal}`);
}
if (icalStr) {
@ -202,6 +203,23 @@ export default class Calendar extends GObject.Object {
GLib.mkdir_with_parents(this.#cacheDir, 0o755);
const cals = config.webcals.get().map(async c => {
const webcal = pathToFileName(c);
if (GLib.file_test(`${this.#cacheDir}/${webcal}`, GLib.FileTest.EXISTS)) {
const data = await readFileAsync(`${this.#cacheDir}/${webcal}`);
const comp = new ical.Component(ical.parse(data));
const name = (comp.getFirstPropertyValue("x-wr-calname") ?? `Calendar ${this.#calCount++}`) as string;
this.#calendars[name] = comp;
}
});
Promise.allSettled(cals).then(() => {
this.#cachedEvents = {};
this.#cachedMonths.clear();
this.notify("calendars");
this.updateUpcoming();
});
this.updateCalendars().catch(console.error);
config.webcals.subscribe(() => this.updateCalendars().catch(console.error));
config.upcomingDays.subscribe(() => this.updateUpcoming());

View file

@ -106,6 +106,13 @@ export default class News extends GObject.Object {
}
this.notify("articles");
this.updateCategories();
this.#loading = false;
this.notify("loading");
}
updateCategories() {
this.#categories = {};
for (const article of this.#articles) {
for (const category of article.category) {
@ -114,14 +121,20 @@ export default class News extends GObject.Object {
}
}
this.notify("categories");
this.#loading = false;
this.notify("loading");
}
constructor() {
super();
if (GLib.file_test(this.#cachePath, GLib.FileTest.EXISTS))
readFileAsync(this.#cachePath)
.then(data => {
this.#articles = JSON.parse(data);
this.notify("articles");
this.updateCategories();
})
.catch(console.error);
this.getNews().catch(console.error);
config.apiKey.subscribe(() => this.getNews().catch(console.error));
config.countries.subscribe(() => this.getNews().catch(console.error));