Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions Share/Model/NCShareViewModel+Accounts.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,13 @@ extension NCShareViewModel {
autoUploadDirectory = NCManageDatabase.shared.getAccountAutoUploadDirectory(
account: account, urlBase: session.urlBase, userId: session.userId)
// Publish the local browser before capabilities can trigger a network request.
await initializeFolderBrowser(refreshFromServer: false)
await initializeFolderBrowser()
guard !Task.isCancelled, !isClosing, accountChangeID == changeID else { return }
isSwitchingAccount = false
loadAccounts()
await loadServerCapabilities(account: account, changeID: changeID)
guard !Task.isCancelled, !isClosing, accountChangeID == changeID else { return }
if serverCapabilities != nil, let root = rootFolder {
requestFolderChildren(root, refresh: true)
}
if serverCapabilities != nil { refreshInitialFolderBrowser() }
}
}

Expand All @@ -95,11 +93,9 @@ extension NCShareViewModel {
capabilitiesTask = Task { @MainActor in
await loadServerCapabilities(account: account, changeID: changeID)
guard isCurrentCapabilitiesRequest(account: account, changeID: changeID), serverCapabilities != nil else { return }
if let rootFolder {
requestFolderChildren(rootFolder, refresh: true)
} else {
await initializeFolderBrowser()
}
if rootFolder == nil { await initializeFolderBrowser() }
guard isCurrentCapabilitiesRequest(account: account, changeID: changeID) else { return }
refreshInitialFolderBrowser()
}
}

Expand Down
46 changes: 30 additions & 16 deletions Share/Model/NCShareViewModel+Folders.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ extension NCShareViewModel {
isLoading = false
}

func initializeFolderBrowser(refreshFromServer: Bool = true) async {
func initializeFolderBrowser() async {
let session = sessionStore.getSession()
let browserID = folderBrowserID
let home = utilityFileSystem.getHomeServer(session: session)
Expand All @@ -68,17 +68,22 @@ extension NCShareViewModel {
expandedFolderURLs = [home]
recentFolders = recent
folderChildren = [home: cached]
// Make cached destinations usable without waiting for the server refresh.
if refreshFromServer { requestFolderChildren(root) }
}

func refreshInitialFolderBrowser() {
guard let rootFolder else { return }
if let latest = recentFolders.first {
selectFolder(latest, fromRecents: true, automatically: true)
}
requestFolderChildren(rootFolder, refresh: true)
}

func toggleFolder(_ folder: NCShareFolderItem) {
guard canUseFolderBrowser, canAccessFolder(folder) else { return }
if expandedFolderURLs.contains(folder.serverUrl) {
expandedFolderURLs.remove(folder.serverUrl)
} else {
expandedFolderURLs.insert(folder.serverUrl)
if !loadedFolderURLs.contains(folder.serverUrl) { requestFolderChildren(folder) }
selectFolder(folder)
}
}

Expand All @@ -100,10 +105,11 @@ extension NCShareViewModel {
}
}

/// Validates the destination on the server, then selects and expands it.
/// Validates the destination on the server before selecting it.
/// fromRecents controls which of the two occurrences displays the checkmark.
func selectFolder(_ folder: NCShareFolderItem, fromRecents: Bool = false) {
guard canUseFolderBrowser, let capabilities = serverCapabilities, canAccessFolder(folder) else { return }
func selectFolder(_ folder: NCShareFolderItem, fromRecents: Bool = false, automatically: Bool = false) {
guard canSelectFolder, automatically || !isLoadingAccounts, let capabilities = serverCapabilities else { return }
guard canAccessFolder(folder, showError: !automatically) else { return }
let session = sessionStore.getSession()
let browserID = folderBrowserID
isLoading = true
Expand All @@ -120,35 +126,43 @@ extension NCShareViewModel {
recentFolders.removeAll { $0.serverUrl == folder.serverUrl }
if fromRecents { return }
}
showAlert(description: result.error == .success ? "_share_folder_unavailable_" : result.error.errorDescription)
if !automatically {
showAlert(description: result.error == .success ? "_share_folder_unavailable_" : result.error.errorDescription)
}
return
}
let selected = folderSnapshot(metadata, url: folder.serverUrl, parent: nil, session: session)
guard canAccessFolder(selected) else { return }
guard canAccessFolder(selected, showError: !automatically) else { return }
guard isCurrentBrowser(browserID, account: session.account), isAuthenticated else { return }
let home = utilityFileSystem.getHomeServer(session: session)
if folder.serverUrl != home,
let error = FileNameValidator.checkFileName(metadata.fileNameView, account: session.account, capabilities: capabilities) {
showAlert(description: error.errorDescription)
if !automatically { showAlert(description: error.errorDescription) }
return
}
selectedFolder = selected
isRecentFolderSelected = fromRecents
expandedFolderURLs.insert(selected.serverUrl)
requestFolderChildren(selected)
if !automatically {
expandedFolderURLs.insert(selected.serverUrl)
requestFolderChildren(selected)
}
}
}

var canUseFolderBrowser: Bool {
isAuthenticated && !isClosing && isAccountReady && !isLoading && !isPreparingUpload && !isLoadingAccounts
canSelectFolder && !isLoadingAccounts
}

private var canSelectFolder: Bool {
isAuthenticated && !isClosing && isAccountReady && !isLoading && !isPreparingUpload
}

private func canAccessFolder(_ folder: NCShareFolderItem) -> Bool {
private func canAccessFolder(_ folder: NCShareFolderItem, showError: Bool = true) -> Bool {
let session = sessionStore.getSession()
let home = utilityFileSystem.getHomeServer(session: session)
guard folder.serverUrl == home || folder.serverUrl.hasPrefix(home + "/") else { return false }
if folder.isEncrypted && !NCPreferences().isEndToEndEnabled(account: session.account) {
showAlert(description: "_e2e_goto_settings_for_enable_")
if showError { showAlert(description: "_e2e_goto_settings_for_enable_") }
return false
}
return true
Expand Down
Loading