Skip to content

Commit afcbe9d

Browse files
committed
better error msgs
1 parent 0ddf0d9 commit afcbe9d

15 files changed

Lines changed: 132 additions & 29 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"build-only": "vite build",
1414
"type-check": "vue-tsc --build",
1515
"format": "prettier --write src/ index.html tsconfig.json vite.config.ts .prettierrc.json",
16-
"fetch-wasm": "curl -L -o src/assets/core.wasm https://github.com/git-calendar/core/releases/download/v0.2.6/core.wasm",
16+
"fetch-wasm": "curl -L -o src/assets/core.wasm https://github.com/git-calendar/core/releases/download/v0.3.0/core.wasm",
1717
"fetch-wasm-latest": "curl -L -o src/assets/core.wasm https://github.com/git-calendar/core/releases/latest/download/core.wasm"
1818
},
1919
"dependencies": {

src/App.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { createCalendarOnce } from '@/utils';
77
import { syncAllWrapper } from '@/services/gitSync';
88
import { settings } from '@/services/settings';
99
import { useAlertModal } from '@/composables/modals/useAlertModal';
10+
import { logError } from '@/services/errorHandling';
1011
import { notifyEventsChanged } from '@/composables/useEventsRefresh';
1112
import { loadCalendars } from '@/services/calendarCache';
1213
1314
const { alert } = useAlertModal();
14-
1515
const coreReady = ref(false); // waits for loadCalendars etc.
1616
1717
async function sync() {
@@ -34,7 +34,8 @@ onBeforeMount(async () => {
3434
3535
coreReady.value = true;
3636
} catch (err) {
37-
alert(String(err));
37+
logError(err);
38+
alert(err);
3839
}
3940
});
4041
</script>

src/assets/locales/cs.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,15 @@
160160
"errorICalFileRequired": "Vyberte soubor iCalendar s příponou .ics, který chcete importovat.",
161161
"errorICalDestinationRequired": "Vyberte dostupný zapisovatelný kalendář jako cíl importu.",
162162
"errorEncryptionKeyRequired": "Pokud je šifrování zapnuté, zadejte šifrovací klíč.",
163-
"noWritableCalendars": "Před importem souboru vytvořte zapisovatelný kalendář."
163+
"noWritableCalendars": "Před importem souboru vytvořte zapisovatelný kalendář.",
164+
"coreError": {
165+
"calendar": "Kalendář „{name}“: {message}",
166+
"network": "Vzdálená služba není dostupná. Zkontrolujte URL, síťové připojení a nastavení proxy a zkuste to znovu.",
167+
"auth": "Ověření se nezdařilo. Zkontrolujte přihlašovací údaje a zkuste to znovu.",
168+
"forbidden": "Připojení k tomuto vzdálenému hostiteli není povoleno. Zkontrolujte URL a zkuste to znovu.",
169+
"validation": "Operace obsahuje neplatná data. Zkontrolujte zadané údaje a zkuste to znovu.",
170+
"storage": "Data kalendáře se nepodařilo načíst nebo uložit. Zkontrolujte dostupné úložiště a zkuste to znovu."
171+
}
164172
},
165173
"colors": {
166174
"blue": "Modrá",

src/assets/locales/en.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,15 @@
160160
"errorICalFileRequired": "Select an iCalendar file with the .ics extension to import.",
161161
"errorICalDestinationRequired": "Select an available writable calendar as the import destination.",
162162
"errorEncryptionKeyRequired": "Enter an encryption key when encryption is enabled.",
163-
"noWritableCalendars": "Create a writable calendar before importing a file."
163+
"noWritableCalendars": "Create a writable calendar before importing a file.",
164+
"coreError": {
165+
"calendar": "Calendar “{name}”: {message}",
166+
"network": "Could not reach the remote service. Check the URL, network connection, and proxy settings, then try again.",
167+
"auth": "Authentication failed. Check your credentials and try again.",
168+
"forbidden": "Connections to this remote host are not allowed. Check the URL and try again.",
169+
"validation": "The operation contains invalid data. Check your input and try again.",
170+
"storage": "Calendar data could not be read or saved. Check the available storage and try again."
171+
}
164172
},
165173
"colors": {
166174
"blue": "Blue",

src/components/DataManagement.vue

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { exportICal, exportZip } from '@/utils';
66
import { CalendarCore } from '@/wasm/core-wrapper';
77
import { useAlertModal } from '@/composables/modals/useAlertModal';
88
import { notifyEventsChanged } from '@/composables/useEventsRefresh';
9+
import { logError } from '@/services/errorHandling';
910
1011
type ExportFormat = 'zip' | 'ical';
1112
@@ -43,7 +44,8 @@ async function exportCalendar() {
4344
}
4445
} catch (err) {
4546
if (!(err instanceof DOMException && err.name === 'AbortError')) {
46-
await alert(String(err));
47+
logError(err, selectedCalendarName.value);
48+
alert(err, selectedCalendarName.value);
4749
}
4850
} finally {
4951
isExporting.value = false;
@@ -72,7 +74,8 @@ async function selectZip(event: Event) {
7274
notifyEventsChanged();
7375
await alert(t('settings.dataManagement.restoreSuccess'));
7476
} catch (err) {
75-
await alert(String(err));
77+
logError(err);
78+
alert(err);
7679
} finally {
7780
isRestoring.value = false;
7881
}

src/components/modals/CalendarModal.vue

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { useI18n } from 'vue-i18n';
99
import { syncAllWrapper } from '@/services/gitSync';
1010
import { cachedCalendars, refreshCalendars } from '@/services/calendarCache';
1111
import { notifyEventsChanged } from '@/composables/useEventsRefresh';
12+
import { logError } from '@/services/errorHandling';
1213
1314
const { t } = useI18n();
1415
const thisModal = useCalendarModal();
@@ -123,12 +124,20 @@ async function saveCalendar() {
123124
notifyEventsChanged();
124125
thisModal.close();
125126
} catch (err) {
126-
alert(String(err));
127+
const calendarName = affectedCalendarName();
128+
logError(err, calendarName);
129+
alert(err, calendarName);
127130
} finally {
128131
isSaving.value = false;
129132
}
130133
}
131134
135+
function affectedCalendarName(): string | undefined {
136+
if (isICalFile.value) return form.destination || undefined;
137+
if (form.how === 'Clone') return undefined;
138+
return form.name || originalCalendar.value?.name;
139+
}
140+
132141
async function createCalendar() {
133142
console.log('creating calendar', form.name, form.remoteURL);
134143
@@ -211,7 +220,9 @@ async function deleteCal() {
211220
notifyEventsChanged();
212221
thisModal.close();
213222
} catch (err) {
214-
alert(String(err));
223+
const calendarName = originalCalendar.value?.name;
224+
logError(err, calendarName);
225+
alert(err, calendarName);
215226
} finally {
216227
isDeleting.value = false;
217228
}

src/components/modals/EventModal.vue

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import StrategyModal from '@/components/modals/StrategyModal.vue';
99
import RepeatModal from '@/components/modals/RepeatModal.vue';
1010
import { useStrategyModal } from '@/composables/modals/useStrategyModal';
1111
import { useAlertModal } from '@/composables/modals/useAlertModal';
12+
import { logError } from '@/services/errorHandling';
1213
import { syncAllWrapper } from '@/services/gitSync';
1314
import cloneDeep from 'lodash-es/cloneDeep';
1415
import { notifyEventsChanged } from '@/composables/useEventsRefresh';
@@ -338,7 +339,8 @@ async function saveEvent() {
338339
void syncAllWrapper();
339340
thisModal.close();
340341
} catch (err) {
341-
alert(String(err));
342+
logError(err, event.calendar);
343+
alert(err, event.calendar);
342344
} finally {
343345
isSaving.value = false;
344346
}
@@ -367,7 +369,8 @@ async function deleteEvent() {
367369
void syncAllWrapper();
368370
thisModal.close();
369371
} catch (err) {
370-
alert(String(err));
372+
logError(err, event.calendar);
373+
alert(err, event.calendar);
371374
} finally {
372375
isDeleting.value = false;
373376
}
@@ -392,7 +395,8 @@ async function updateWithStrategy(strategy: UpdateStrategy) {
392395
void syncAllWrapper();
393396
thisModal.close();
394397
} catch (err) {
395-
alert(String(err));
398+
logError(err, form.calendar);
399+
alert(err, form.calendar);
396400
} finally {
397401
isUpdatingWithStrategy.value = false;
398402
}

src/components/modals/TagModal.vue

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useAlertModal } from '@/composables/modals/useAlertModal';
44
import { useTagModal } from '@/composables/modals/useTagModal';
55
import { refreshCalendars } from '@/services/calendarCache';
66
import { syncAllWrapper } from '@/services/gitSync';
7+
import { logError } from '@/services/errorHandling';
78
import type { Tag } from '@/types/core';
89
import { CalendarCore } from '@/wasm/core-wrapper';
910
import { cloneDeep } from 'lodash-es';
@@ -77,7 +78,8 @@ async function saveTag() {
7778
refreshCalendars();
7879
thisModal.close();
7980
} catch (err) {
80-
alert(String(err));
81+
logError(err, thisModal.calendarName.value);
82+
alert(err, thisModal.calendarName.value);
8183
} finally {
8284
isSaving.value = false;
8385
}
@@ -103,7 +105,8 @@ async function deleteTag() {
103105
refreshCalendars();
104106
thisModal.close();
105107
} catch (err) {
106-
alert(String(err));
108+
logError(err, thisModal.calendarName.value);
109+
alert(err, thisModal.calendarName.value);
107110
} finally {
108111
isDeleting.value = false;
109112
}

src/composables/modals/useAlertModal.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { formatErrorForUser } from '@/services/errorHandling';
12
import { reactive } from 'vue';
23

34
type ModalState = {
@@ -18,11 +19,11 @@ const modalState = reactive<ModalState>({
1819
});
1920

2021
export function useAlertModal() {
21-
function alert(message: string): Promise<void> {
22+
function alert(message: unknown, calendarName?: string): Promise<void> {
2223
return new Promise((resolve) => {
2324
modalState.isOpen = true;
2425
modalState.type = 'alert';
25-
modalState.message = message;
26+
modalState.message = formatErrorForUser(message, calendarName);
2627
modalState.confirmText = 'OK';
2728
modalState.cancelText = '';
2829
modalState.resolve = () => resolve();

src/composables/useCalendarDrag.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { computed, onScopeDispose, ref, shallowRef } from 'vue';
22
import { DateTime } from 'luxon';
33

44
import { useAlertModal } from '@/composables/modals/useAlertModal';
5+
import { logError } from '@/services/errorHandling';
56
import { useEventModal } from '@/composables/modals/useEventModal';
67
import { getCalendar } from '@/services/calendarCache';
78
import { syncAllWrapper } from '@/services/gitSync';
@@ -484,7 +485,8 @@ export function useCalendarDrag(refreshEvents: () => Promise<void>) {
484485
await CalendarCore.updateEvent(completedEvent);
485486
} catch (error) {
486487
reset();
487-
await alert(String(error));
488+
logError(error, completedEvent.calendar);
489+
alert(error, completedEvent.calendar);
488490
return;
489491
}
490492

@@ -493,7 +495,8 @@ export function useCalendarDrag(refreshEvents: () => Promise<void>) {
493495
} catch (error) {
494496
reset();
495497
void syncAllWrapper();
496-
await alert(String(error));
498+
logError(error, completedEvent.calendar);
499+
alert(error, completedEvent.calendar);
497500
return;
498501
}
499502

0 commit comments

Comments
 (0)