Enable guest photo deletion and ownership flags
This commit is contained in:
@@ -27,6 +27,7 @@ export const messages: Record<LocaleCode, NestedMessages> = {
|
||||
close: 'Schließen',
|
||||
back: 'Zurück',
|
||||
loading: 'Lädt...',
|
||||
cancel: 'Abbrechen',
|
||||
},
|
||||
},
|
||||
consent: {
|
||||
@@ -502,6 +503,13 @@ export const messages: Record<LocaleCode, NestedMessages> = {
|
||||
prev: 'Zurück',
|
||||
next: 'Weiter',
|
||||
likes: '{count} Likes',
|
||||
deleteTitle: 'Foto löschen?',
|
||||
deleteDescription: 'Das Foto wird aus der Galerie entfernt und kann nicht wiederhergestellt werden.',
|
||||
deleteConfirm: 'Foto löschen',
|
||||
deleteAria: 'Foto löschen',
|
||||
deleting: 'Wird gelöscht…',
|
||||
deletedToast: 'Foto gelöscht.',
|
||||
deleteFailed: 'Foto konnte nicht gelöscht werden.',
|
||||
},
|
||||
},
|
||||
share: {
|
||||
@@ -945,6 +953,7 @@ export const messages: Record<LocaleCode, NestedMessages> = {
|
||||
close: 'Close',
|
||||
back: 'Back',
|
||||
loading: 'Loading...',
|
||||
cancel: 'Cancel',
|
||||
},
|
||||
},
|
||||
consent: {
|
||||
@@ -1420,6 +1429,13 @@ export const messages: Record<LocaleCode, NestedMessages> = {
|
||||
prev: 'Prev',
|
||||
next: 'Next',
|
||||
likes: '{count} likes',
|
||||
deleteTitle: 'Delete this photo?',
|
||||
deleteDescription: 'This photo will be removed from the gallery and cannot be restored.',
|
||||
deleteConfirm: 'Delete photo',
|
||||
deleteAria: 'Delete photo',
|
||||
deleting: 'Deleting…',
|
||||
deletedToast: 'Photo deleted.',
|
||||
deleteFailed: 'Photo could not be deleted.',
|
||||
},
|
||||
},
|
||||
share: {
|
||||
|
||||
@@ -96,6 +96,48 @@ export async function unlikePhoto(id: number): Promise<number> {
|
||||
return json.likes_count ?? json.data?.likes_count ?? 0;
|
||||
}
|
||||
|
||||
export async function deletePhoto(eventToken: string, id: number): Promise<void> {
|
||||
const headers = buildCsrfHeaders();
|
||||
const url = `/api/v1/events/${encodeURIComponent(eventToken)}/photos/${id}`;
|
||||
|
||||
const res = await fetch(url, {
|
||||
method: 'DELETE',
|
||||
credentials: 'include',
|
||||
headers: {
|
||||
...headers,
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
let payload: unknown = null;
|
||||
try {
|
||||
payload = await res.clone().json();
|
||||
} catch (error) {
|
||||
console.warn('Delete photo: failed to parse error payload', error);
|
||||
}
|
||||
|
||||
if (res.status === 419) {
|
||||
const error: UploadError = new Error('CSRF token mismatch. Please refresh the page and try again.');
|
||||
error.code = 'csrf_mismatch';
|
||||
error.status = res.status;
|
||||
throw error;
|
||||
}
|
||||
|
||||
const error: UploadError = new Error(
|
||||
(payload as { error?: { message?: string } } | null)?.error?.message ?? `Delete failed: ${res.status}`
|
||||
);
|
||||
error.code = (payload as { error?: { code?: string } } | null)?.error?.code ?? 'delete_failed';
|
||||
error.status = res.status;
|
||||
const meta = (payload as { error?: { meta?: Record<string, unknown> } } | null)?.error?.meta;
|
||||
if (meta) {
|
||||
error.meta = meta;
|
||||
}
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
type UploadOptions = {
|
||||
guestName?: string;
|
||||
onProgress?: (percent: number) => void;
|
||||
|
||||
Reference in New Issue
Block a user