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
63 changes: 4 additions & 59 deletions Nextcloud.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions Share/NCShareExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class NCShareExtension: UIViewController {
let utility = NCUtility()
let global = NCGlobal.shared
var maintenanceMode: Bool = false
var token: Int = 0
var token: Int?

// MARK: - View Life Cycle

Expand Down Expand Up @@ -364,7 +364,7 @@ extension NCShareExtension {
@MainActor
func uploadAndExit() async {
var error: NKError?
token = showUploadBanner(scene: self.view.window?.windowScene)
token = showUploadBanner(scene: self.view.window?.windowScene, blocksTouches: true)

for metadata in self.uploadMetadata {
// BANNER
Expand Down Expand Up @@ -420,7 +420,7 @@ extension NCShareExtension {
self.counterUploaded += 1

if metadata.isDirectoryE2EE {
error = await NCNetworkingE2EEUpload().upload(metadata: metadata, session: session, controller: self, scene: self.view.window?.windowScene)
error = await NCNetworkingE2EEUpload().upload(metadata: metadata, session: session, controller: self, stageBanner: nil, tokenBanner: self.token)
} else if metadata.chunk > 0 {
LucidBanner.shared.update(
systemImage: "gearshape.arrow.triangle.2.circlepath",
Expand Down
24 changes: 20 additions & 4 deletions iOSClient/Activity/NCActivity.swift
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,11 @@ class NCActivity: UIViewController, NCSharePagingContent {
self.commentView?.newCommentField.text?.removeAll()
self.loadComments()
} else {
NCContentPresenter().showError(error: error)
Task {@MainActor in
await showErrorBanner(controller: self.tabBarController,
errorDescription: error.errorDescription,
errorCode: error.errorCode)
}
}
}
}
Expand Down Expand Up @@ -436,7 +440,11 @@ extension NCActivity {
if error == .success, let comments = comments {
self.database.addComments(comments, account: metadata.account, objectId: metadata.fileId)
} else if error.errorCode != NCGlobal.shared.errorResourceNotFound {
NCContentPresenter().showError(error: error)
Task {@MainActor in
await showErrorBanner(controller: self.tabBarController,
errorDescription: error.errorDescription,
errorCode: error.errorCode)
}
}

if let disptachGroup = disptachGroup {
Expand Down Expand Up @@ -574,7 +582,11 @@ extension NCActivity: NCShareCommentsCellDelegate {
if error == .success {
self.loadComments()
} else {
NCContentPresenter().showError(error: error)
Task {@MainActor in
await showErrorBanner(controller: self.tabBarController,
errorDescription: error.errorDescription,
errorCode: error.errorCode)
}
}
}
}))
Expand Down Expand Up @@ -604,7 +616,11 @@ extension NCActivity: NCShareCommentsCellDelegate {
if error == .success {
self.loadComments()
} else {
NCContentPresenter().showError(error: error)
Task {@MainActor in
await showErrorBanner(controller: self.tabBarController,
errorDescription: error.errorDescription,
errorCode: error.errorCode)
}
}
}
}
Expand Down
6 changes: 5 additions & 1 deletion iOSClient/Activity/NCActivityTableViewCell.swift
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,11 @@ extension NCActivityTableViewCell: UICollectionViewDelegate {
(responder as? UIViewController)!.navigationController?.pushViewController(viewController, animated: true)
} else {
let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_trash_file_not_found_")
NCContentPresenter().showError(error: error)
Task {@MainActor in
await showErrorBanner(controller: viewController.controller,
errorDescription: error.errorDescription,
errorCode: error.errorCode)
}
}
}
}
Expand Down
29 changes: 29 additions & 0 deletions iOSClient/Extensions/UIWindowScene+Extension.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// SPDX-FileCopyrightText: Nextcloud GmbH
// SPDX-FileCopyrightText: 2025 Marino Faggiana
// SPDX-License-Identifier: GPL-3.0-or-later

import UIKit

public extension UIWindowScene {

/// Returns the top-left coordinate of the UITabBar in this scene,
/// expressed in the coordinate space of the scene's key window.
///
/// If the scene does not host a UITabBarController as root,
/// or no suitable window is found, the method returns `nil`.
var tabBarTopLeft: CGPoint? {
// Select key window if available, otherwise fallback to the first one.
guard let window = windows.first(where: { $0.isKeyWindow }) ?? windows.first,
let tabBarController = window.rootViewController as? UITabBarController
else {
return nil
}

let tabBar = tabBarController.tabBar

// Convert tab bar's bounds to the window coordinate space.
let frameInWindow = tabBar.convert(tabBar.bounds, to: window)

return CGPoint(x: frameInWindow.minX, y: frameInWindow.minY)
}
}
22 changes: 18 additions & 4 deletions iOSClient/Files/NCFiles.swift
Original file line number Diff line number Diff line change
Expand Up @@ -321,11 +321,17 @@ class NCFiles: NCCollectionViewCommon {
NCContentPresenter().showInfo(description: "Metadata not found")
let error = await NCNetworkingE2EE().uploadMetadata(serverUrl: serverUrl, account: account)
if error != .success {
NCContentPresenter().showError(error: error)
await showErrorBanner(controller: self.controller,
errorDescription: error.errorDescription,
errorCode: error.errorCode)
}
} else {
// show error
NCContentPresenter().showError(error: results.error)
Task {@MainActor in
await showErrorBanner(controller: self.controller,
errorDescription: error.errorDescription,
errorCode: error.errorCode)
}
}

return(metadatas, error, reloadRequired)
Expand All @@ -343,14 +349,22 @@ class NCFiles: NCCollectionViewCommon {

let error = await NCNetworkingE2EE().uploadMetadata(serverUrl: serverUrl, updateVersionV1V2: true, account: account)
if error != .success {
NCContentPresenter().showError(error: error)
Task {@MainActor in
await showErrorBanner(controller: self.controller,
errorDescription: error.errorDescription,
errorCode: error.errorCode)
}
}
NCActivityIndicator.shared.stop()
}
} else {
// Client Diagnostic
await self.database.addDiagnosticAsync(account: account, issue: NCGlobal.shared.diagnosticIssueE2eeErrors)
NCContentPresenter().showError(error: error)
Task {@MainActor in
await showErrorBanner(controller: self.controller,
errorDescription: error.errorDescription,
errorCode: error.errorCode)
}
}

return (metadatas, error, reloadRequired)
Expand Down
11 changes: 11 additions & 0 deletions iOSClient/GUI/Lucid Banner/ErrorBannerView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,25 @@ struct ErrorBannerView: View {

// MARK: - Helper

@MainActor
func showErrorBanner(controller: UITabBarController?, errorDescription: String, errorCode: Int, sleepBefore: Double = 1) async {
let scene = SceneManager.shared.getWindow(controller: controller)?.windowScene
await showErrorBanner(scene: scene, errorDescription: errorDescription, errorCode: errorCode, sleepBefore: sleepBefore)
}

@MainActor
func showErrorBanner(scene: UIWindowScene?, errorDescription: String, errorCode: Int, sleepBefore: Double = 1) async {
try? await Task.sleep(nanoseconds: UInt64(sleepBefore * 1e9))
var scene = scene
if scene == nil {
scene = UIApplication.shared.mainAppWindow?.windowScene
}

LucidBanner.shared.show(
scene: scene,
subtitle: errorDescription,
footnote: "(Code: \(errorCode))",
vPosition: .top,
autoDismissAfter: NCGlobal.shared.dismissAfterSecond,
swipeToDismiss: true,
onTap: { _, _ in
Expand Down
18 changes: 9 additions & 9 deletions iOSClient/GUI/Lucid Banner/HudBannerView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -160,13 +160,13 @@ struct HudBannerView: View {
// MARK: - Helper

@MainActor
func showHudBanner(
scene: UIWindowScene?,
title: String? = nil,
subtitle: String? = nil,
onTap: ((_ token: Int, _ stage: String?) -> Void)? = nil
) -> Int {
LucidBanner.shared.show(
func showHudBanner(scene: UIWindowScene?, title: String? = nil, subtitle: String? = nil, onTap: ((_ token: Int?, _ stage: String?) -> Void)? = nil) -> Int? {
var scene = scene
if scene == nil {
scene = UIApplication.shared.mainAppWindow?.windowScene
}

return LucidBanner.shared.show(
scene: scene,
title: title,
subtitle: subtitle,
Expand All @@ -182,7 +182,7 @@ func showHudBanner(

@MainActor
func completeHudBannerSuccess(
token: Int
token: Int?
) {
LucidBanner.shared.update(
stage: .success,
Expand All @@ -194,7 +194,7 @@ func completeHudBannerSuccess(
@MainActor
func completeHudBannerError(
subtitle: String? = nil,
token: Int
token: Int?
) {
LucidBanner.shared.update(
subtitle: subtitle,
Expand Down
Loading
Loading