typescript-typenfehler behoben.. npm run lint läuft nun fehlerfrei durch.
This commit is contained in:
@@ -160,32 +160,41 @@ export async function fetchAchievements(
|
||||
tasks: toNumber(personalRaw.tasks),
|
||||
likes: toNumber(personalRaw.likes),
|
||||
badges: Array.isArray(personalRaw.badges)
|
||||
? personalRaw.badges.map((badge: any): AchievementBadge => ({
|
||||
id: safeString(badge.id),
|
||||
title: safeString(badge.title),
|
||||
description: safeString(badge.description),
|
||||
earned: Boolean(badge.earned),
|
||||
progress: toNumber(badge.progress),
|
||||
target: toNumber(badge.target, 1),
|
||||
}))
|
||||
? personalRaw.badges.map((badge): AchievementBadge => {
|
||||
const record = badge as Record<string, unknown>;
|
||||
return {
|
||||
id: safeString(record.id),
|
||||
title: safeString(record.title),
|
||||
description: safeString(record.description),
|
||||
earned: Boolean(record.earned),
|
||||
progress: toNumber(record.progress),
|
||||
target: toNumber(record.target, 1),
|
||||
};
|
||||
})
|
||||
: [],
|
||||
}
|
||||
: null;
|
||||
|
||||
const uploadsBoard = Array.isArray(leaderboards.uploads)
|
||||
? leaderboards.uploads.map((row: any): LeaderboardEntry => ({
|
||||
guest: safeString(row.guest),
|
||||
photos: toNumber(row.photos),
|
||||
likes: toNumber(row.likes),
|
||||
}))
|
||||
? leaderboards.uploads.map((row): LeaderboardEntry => {
|
||||
const record = row as Record<string, unknown>;
|
||||
return {
|
||||
guest: safeString(record.guest),
|
||||
photos: toNumber(record.photos),
|
||||
likes: toNumber(record.likes),
|
||||
};
|
||||
})
|
||||
: [];
|
||||
|
||||
const likesBoard = Array.isArray(leaderboards.likes)
|
||||
? leaderboards.likes.map((row: any): LeaderboardEntry => ({
|
||||
guest: safeString(row.guest),
|
||||
photos: toNumber(row.photos),
|
||||
likes: toNumber(row.likes),
|
||||
}))
|
||||
? leaderboards.likes.map((row): LeaderboardEntry => {
|
||||
const record = row as Record<string, unknown>;
|
||||
return {
|
||||
guest: safeString(record.guest),
|
||||
photos: toNumber(record.photos),
|
||||
likes: toNumber(record.likes),
|
||||
};
|
||||
})
|
||||
: [];
|
||||
|
||||
const topPhotoRaw = highlights.top_photo ?? null;
|
||||
@@ -210,21 +219,27 @@ export async function fetchAchievements(
|
||||
: null;
|
||||
|
||||
const timeline = Array.isArray(highlights.timeline)
|
||||
? highlights.timeline.map((row: any): TimelinePoint => ({
|
||||
date: safeString(row.date),
|
||||
photos: toNumber(row.photos),
|
||||
guests: toNumber(row.guests),
|
||||
}))
|
||||
? highlights.timeline.map((row): TimelinePoint => {
|
||||
const record = row as Record<string, unknown>;
|
||||
return {
|
||||
date: safeString(record.date),
|
||||
photos: toNumber(record.photos),
|
||||
guests: toNumber(record.guests),
|
||||
};
|
||||
})
|
||||
: [];
|
||||
|
||||
const feed = feedRaw.map((row: any): FeedEntry => ({
|
||||
photoId: toNumber(row.photo_id),
|
||||
guest: safeString(row.guest),
|
||||
task: row.task ?? null,
|
||||
likes: toNumber(row.likes),
|
||||
createdAt: safeString(row.created_at),
|
||||
thumbnail: row.thumbnail ? safeString(row.thumbnail) : null,
|
||||
}));
|
||||
const feed = feedRaw.map((row): FeedEntry => {
|
||||
const record = row as Record<string, unknown>;
|
||||
return {
|
||||
photoId: toNumber(record.photo_id),
|
||||
guest: safeString(record.guest),
|
||||
task: (record as { task?: string }).task ?? null,
|
||||
likes: toNumber(record.likes),
|
||||
createdAt: safeString(record.created_at),
|
||||
thumbnail: record.thumbnail ? safeString(record.thumbnail) : null,
|
||||
};
|
||||
});
|
||||
|
||||
const payload: AchievementsPayload = {
|
||||
summary: {
|
||||
|
||||
@@ -40,8 +40,9 @@ async function handleResponse<T>(response: Response): Promise<T> {
|
||||
const data = await response.json().catch(() => null);
|
||||
|
||||
if (!response.ok) {
|
||||
const error = new Error((data && data.error && data.error.message) || 'Request failed');
|
||||
(error as any).code = data?.error?.code ?? response.status;
|
||||
const errorPayload = data as { error?: { message?: string; code?: unknown } } | null;
|
||||
const error = new Error(errorPayload?.error?.message ?? 'Request failed') as Error & { code?: unknown };
|
||||
error.code = errorPayload?.error?.code ?? response.status;
|
||||
throw error;
|
||||
}
|
||||
|
||||
@@ -78,4 +79,3 @@ export async function fetchGalleryPhotos(token: string, cursor?: string | null,
|
||||
|
||||
return handleResponse<GalleryPhotosResponse>(response);
|
||||
}
|
||||
|
||||
|
||||
@@ -98,8 +98,8 @@ async function requestJson<T>(url: string): Promise<T> {
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const error = new Error('Help request failed');
|
||||
(error as any).status = response.status;
|
||||
const error = new Error('Help request failed') as Error & { status?: number };
|
||||
error.status = response.status;
|
||||
throw error;
|
||||
}
|
||||
|
||||
|
||||
@@ -62,10 +62,12 @@ export async function likePhoto(id: number): Promise<number> {
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
let payload: any = null;
|
||||
let payload: unknown = null;
|
||||
try {
|
||||
payload = await res.clone().json();
|
||||
} catch {}
|
||||
} catch (error) {
|
||||
console.warn('Like 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.');
|
||||
@@ -75,12 +77,13 @@ export async function likePhoto(id: number): Promise<number> {
|
||||
}
|
||||
|
||||
const error: UploadError = new Error(
|
||||
payload?.error?.message ?? `Like failed: ${res.status}`
|
||||
(payload as { error?: { message?: string } } | null)?.error?.message ?? `Like failed: ${res.status}`
|
||||
);
|
||||
error.code = payload?.error?.code ?? 'like_failed';
|
||||
error.code = (payload as { error?: { code?: string } } | null)?.error?.code ?? 'like_failed';
|
||||
error.status = res.status;
|
||||
if (payload?.error?.meta) {
|
||||
error.meta = payload.error.meta as Record<string, unknown>;
|
||||
const meta = (payload as { error?: { meta?: Record<string, unknown> } } | null)?.error?.meta;
|
||||
if (meta) {
|
||||
error.meta = meta;
|
||||
}
|
||||
|
||||
throw error;
|
||||
@@ -114,7 +117,7 @@ export async function uploadPhoto(
|
||||
const url = `/api/v1/events/${encodeURIComponent(eventToken)}/upload`;
|
||||
const headers = getCsrfHeaders();
|
||||
|
||||
const attemptUpload = (attempt: number): Promise<any> =>
|
||||
const attemptUpload = (): Promise<Record<string, unknown>> =>
|
||||
new Promise((resolve, reject) => {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', url, true);
|
||||
@@ -139,7 +142,7 @@ export async function uploadPhoto(
|
||||
|
||||
xhr.onload = () => {
|
||||
const status = xhr.status;
|
||||
const payload = xhr.response ?? null;
|
||||
const payload = (xhr.response ?? null) as Record<string, unknown> | null;
|
||||
|
||||
if (status >= 200 && status < 300) {
|
||||
resolve(payload);
|
||||
@@ -147,12 +150,13 @@ export async function uploadPhoto(
|
||||
}
|
||||
|
||||
const error: UploadError = new Error(
|
||||
payload?.error?.message ?? `Upload failed: ${status}`
|
||||
(payload as { error?: { message?: string } } | null)?.error?.message ?? `Upload failed: ${status}`
|
||||
);
|
||||
error.code = payload?.error?.code ?? (status === 0 ? 'network_error' : 'upload_failed');
|
||||
error.code = (payload as { error?: { code?: string } } | null)?.error?.code ?? (status === 0 ? 'network_error' : 'upload_failed');
|
||||
error.status = status;
|
||||
if (payload?.error?.meta) {
|
||||
error.meta = payload.error.meta as Record<string, unknown>;
|
||||
const meta = (payload as { error?: { meta?: Record<string, unknown> } } | null)?.error?.meta;
|
||||
if (meta) {
|
||||
error.meta = meta;
|
||||
}
|
||||
reject(error);
|
||||
};
|
||||
@@ -174,8 +178,9 @@ export async function uploadPhoto(
|
||||
|
||||
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
||||
try {
|
||||
const json = await attemptUpload(attempt + 1);
|
||||
return json?.photo_id ?? json?.id ?? json?.data?.id ?? 0;
|
||||
const json = await attemptUpload();
|
||||
const payload = json as { photo_id?: number; id?: number; data?: { id?: number } };
|
||||
return payload.photo_id ?? payload.id ?? payload.data?.id ?? 0;
|
||||
} catch (error) {
|
||||
const err = error as UploadError;
|
||||
|
||||
@@ -213,13 +218,16 @@ export async function createPhotoShareLink(eventToken: string, photoId: number):
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
let payload: any = null;
|
||||
let payload: unknown = null;
|
||||
try {
|
||||
payload = await res.clone().json();
|
||||
} catch {}
|
||||
} catch (error) {
|
||||
console.warn('Share link error payload parse failed', error);
|
||||
}
|
||||
|
||||
const error: UploadError = new Error(payload?.error?.message ?? 'Share link creation failed');
|
||||
error.code = payload?.error?.code ?? 'share_failed';
|
||||
const errorPayload = payload as { error?: { message?: string; code?: string } } | null;
|
||||
const error: UploadError = new Error(errorPayload?.error?.message ?? 'Share link creation failed');
|
||||
error.code = errorPayload?.error?.code ?? 'share_failed';
|
||||
error.status = res.status;
|
||||
throw error;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user