Merge pull request #382 from Luca-Timo/refactor/external-media-types

refactor(events): type external-media list response, drop any casts
This commit is contained in:
Paul Nothaft
2026-05-04 14:46:35 +02:00
committed by GitHub
2 changed files with 41 additions and 13 deletions
@@ -92,7 +92,7 @@ const FolderTreeNode: React.FC<{
staleTime: 30_000
});
const dirs: ExternalEntry[] = (data?.entries || []).filter((e: ExternalEntry) => e.type === 'dir');
const dirs = (data?.entries || []).filter(e => e.type === 'dir');
const showEmpty = isExpanded && !isLoading && !isError && dirs.length === 0;
const indentStyle = { paddingLeft: depth * 16 + 4 };
const childIndentStyle = { paddingLeft: (depth + 1) * 16 + 4 };
@@ -158,7 +158,7 @@ const FolderTreeNode: React.FC<{
{t('events.externalFolderEmpty', 'No subfolders')}
</div>
)}
{dirs.map((d) => {
{dirs.map(d => {
const childPath = path ? `${path}/${d.name}` : d.name;
return (
<FolderTreeNode
+39 -11
View File
@@ -1,22 +1,50 @@
import { api } from '../config/api';
export interface ExternalEntry { name: string; type: 'dir' | 'file'; size?: number; mtime?: string }
export interface ExternalEntry {
name: string;
type: 'dir' | 'file';
size?: number;
mtime?: string;
}
export interface ExternalMediaListResponse {
path: string;
entries: ExternalEntry[];
canNavigateUp: boolean;
}
export interface ExternalMediaImportOptions {
recursive?: boolean;
map?: { individual?: string; collages?: string };
}
export interface ExternalMediaImportResult {
imported: number;
skipped: number;
thumbnailsQueued: number;
}
export const externalMediaService = {
async list(pathRel: string = ''): Promise<{ path: string; entries: ExternalEntry[]; canNavigateUp: boolean }> {
async list(pathRel: string = ''): Promise<ExternalMediaListResponse> {
const params = new URLSearchParams();
if (pathRel) params.set('path', pathRel);
const res = await api.get(`/admin/external-media/list?${params.toString()}`);
const res = await api.get<ExternalMediaListResponse>(`/admin/external-media/list?${params.toString()}`);
return res.data;
},
async importEvent(eventId: number, externalPath: string, options?: { recursive?: boolean; map?: { individual?: string; collages?: string } }): Promise<{ imported: number; skipped: number; thumbnailsQueued: number }> {
const res = await api.post(`/admin/external-media/events/${eventId}/import-external`, {
external_path: externalPath,
recursive: options?.recursive ?? true,
map: options?.map
});
async importEvent(
eventId: number,
externalPath: string,
options?: ExternalMediaImportOptions
): Promise<ExternalMediaImportResult> {
const res = await api.post<ExternalMediaImportResult>(
`/admin/external-media/events/${eventId}/import-external`,
{
external_path: externalPath,
recursive: options?.recursive ?? true,
map: options?.map
}
);
return res.data;
}
}
};