Dorian f07ce10b1a refactor: update dependencies and remove unused code
- Added new dependencies: `adler2`, `crc32fast`, `flate2`, `miniz_oxide`, and `libredox`.
- Updated existing dependencies: `tokio-rustls` to version 0.26.4 and `filetime` to version 0.2.27.
- Removed the `backup.rs` file as it is no longer needed.
- Introduced tests for configuration and credential management.
- Enhanced the `identity` module to generate W3C compliant DID documents.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 00:19:30 +00:00

132 lines
3.5 KiB
TypeScript

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<FileBrowserItem[]>([])
const loading = ref(false)
const error = ref<string | null>(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<boolean> {
if (authenticated.value) return true
const ok = await fileBrowserClient.login()
authenticated.value = ok
return ok
}
async function navigate(path: string): Promise<void> {
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<void> {
await navigate(currentPath.value)
}
async function uploadFile(file: File): Promise<void> {
await fileBrowserClient.upload(currentPath.value, file)
await refresh()
}
async function deleteItem(path: string): Promise<void> {
await fileBrowserClient.deleteItem(path)
await refresh()
}
function downloadUrl(path: string): string {
return fileBrowserClient.downloadUrl(path)
}
async function fetchBlobUrl(path: string): Promise<string> {
return fileBrowserClient.fetchBlobUrl(path)
}
async function downloadFile(path: string): Promise<void> {
return fileBrowserClient.downloadFile(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,
fetchBlobUrl,
downloadFile,
reset,
}
})