import { ref, computed } from 'vue' import { defineStore } from 'pinia' import { fileBrowserClient, type FileBrowserItem } from '@/api/filebrowser-client' export const useCloudStore = defineStore('cloud', () => { const currentPath = ref('/') const items = ref([]) const loading = ref(false) const error = ref(null) const authenticated = ref(false) const breadcrumbs = computed(() => { const parts = currentPath.value.split('/').filter(Boolean) const crumbs = [{ name: 'Home', path: '/' }] let path = '' for (const part of parts) { path += `/${part}` crumbs.push({ name: part, path }) } return crumbs }) const sortedItems = computed(() => { const dirs = items.value.filter((i) => i.isDir) const files = items.value.filter((i) => !i.isDir) dirs.sort((a, b) => a.name.localeCompare(b.name)) files.sort((a, b) => a.name.localeCompare(b.name)) return [...dirs, ...files] }) async function init(): Promise { if (authenticated.value) return true const ok = await fileBrowserClient.login() authenticated.value = ok return ok } async function navigate(path: string): Promise { loading.value = true error.value = null try { if (!authenticated.value) { const ok = await init() if (!ok) { error.value = 'Failed to authenticate with File Browser' return } } try { const result = await fileBrowserClient.listDirectory(path) items.value = result currentPath.value = path } catch { // Directory may not exist — try to create it, then retry if (path !== '/') { try { const parentPath = path.substring(0, path.lastIndexOf('/')) || '/' const dirName = path.substring(path.lastIndexOf('/') + 1) await fileBrowserClient.createFolder(parentPath, dirName) const result = await fileBrowserClient.listDirectory(path) items.value = result currentPath.value = path } catch { // Fall back to root const result = await fileBrowserClient.listDirectory('/') items.value = result currentPath.value = '/' } } else { throw new Error('Failed to list root directory') } } } catch (e) { error.value = e instanceof Error ? e.message : 'Failed to load files' } finally { loading.value = false } } async function refresh(): Promise { await navigate(currentPath.value) } async function uploadFile(file: File): Promise { await fileBrowserClient.upload(currentPath.value, file) await refresh() } async function deleteItem(path: string): Promise { await fileBrowserClient.deleteItem(path) await refresh() } function downloadUrl(path: string): string { return fileBrowserClient.downloadUrl(path) } function reset(): void { currentPath.value = '/' items.value = [] loading.value = false error.value = null } return { currentPath, items, loading, error, authenticated, breadcrumbs, sortedItems, init, navigate, refresh, uploadFile, deleteItem, downloadUrl, reset, } })