import type { PickerAdapter } from '../types/filePicker' import type { FileBrowserLocation, FileDirectoryListing, FileDirectoryTree, FileSearchResult, ServerMount, } from '../types/fileBrowserTypes' import type { PickerRequest } from '../types/filePicker' import { useApi } from './useApi' import { getInjectedPlatformContext } from './platformContextHelpers' import { createFilePickerAdapter, type FilePickerAdapterOptions } from './createFilePickerAdapter' export { encodePlatformPickerPath, decodePlatformPickerPath } from './createFilePickerAdapter' function query(location: FileBrowserLocation, request?: PickerRequest): URLSearchParams { const params = new URLSearchParams({ mount_id: location.mount_id, path: location.path }) if (request?.refresh) params.set('refresh', 'true') return params } /** Adapt the authenticated MINT mount API without exposing absolute host paths. */ export function usePlatformFilePickerAdapter( options: FilePickerAdapterOptions & { apiBaseUrl?: string } = {}, ): PickerAdapter { const api = useApi({ baseUrl: options.apiBaseUrl ?? getInjectedPlatformContext()?.platformApiUrl, }) return createFilePickerAdapter({ async listMounts(request) { try { const url = `/filesystem/mounts${request?.refresh ? '?refresh=true' : ''}` const { mounts } = await api.get<{ mounts: ServerMount[] }>(url, { signal: request?.signal, }) return mounts } catch (cause) { if ((cause as { response?: { status?: number } }).response?.status === 404) return [] throw cause } }, browse(location, request) { return api.get(`/filesystem/browse?${query(location, request)}`, { signal: request?.signal, }) }, tree(location, request) { return api.get(`/filesystem/tree?${query(location, request)}`, { signal: request?.signal, }) }, search(location, text, recursive, request) { const params = query(location, request) params.set('q', text) params.set('recursive', String(recursive)) return api.get(`/filesystem/search?${params}`, { signal: request?.signal }) }, }, options) }