diff --git a/Coder-Desktop/Coder-Desktop/Views/FileSync/FilePicker.swift b/Coder-Desktop/Coder-Desktop/Views/FileSync/FilePicker.swift index 032a0c3..6f39296 100644 --- a/Coder-Desktop/Coder-Desktop/Views/FileSync/FilePicker.swift +++ b/Coder-Desktop/Coder-Desktop/Views/FileSync/FilePicker.swift @@ -23,8 +23,7 @@ struct FilePicker: View { VStack(spacing: 0) { if model.rootIsLoading { Spacer() - ProgressView() - .controlSize(.large) + CircularProgressView(value: nil) Spacer() } else if let loadError = model.error { Text("\(loadError.description)") @@ -125,7 +124,8 @@ struct FilePickerEntry: View { Label { Text(entry.name) ZStack { - ProgressView().controlSize(.small).opacity(entry.isLoading && entry.error == nil ? 1 : 0) + CircularProgressView(value: nil, strokeWidth: 2, diameter: 10) + .opacity(entry.isLoading && entry.error == nil ? 1 : 0) Image(systemName: "exclamationmark.triangle.fill") .opacity(entry.error != nil ? 1 : 0) } diff --git a/Coder-Desktop/Coder-Desktop/Views/FileSync/FileSyncSessionModal.swift b/Coder-Desktop/Coder-Desktop/Views/FileSync/FileSyncSessionModal.swift index 3e48ffd..b510867 100644 --- a/Coder-Desktop/Coder-Desktop/Views/FileSync/FileSyncSessionModal.swift +++ b/Coder-Desktop/Coder-Desktop/Views/FileSync/FileSyncSessionModal.swift @@ -68,7 +68,7 @@ struct FileSyncSessionModal: View { Text(msg).foregroundStyle(.secondary) } if loading { - ProgressView().controlSize(.small) + CircularProgressView(value: nil, strokeWidth: 3, diameter: 15) } Button("Cancel", action: { dismiss() }).keyboardShortcut(.cancelAction) Button(existingSession == nil ? "Add" : "Save") { Task { await submit() }} diff --git a/Coder-Desktop/Coder-Desktop/Views/VPN/VPNMenuItem.swift b/Coder-Desktop/Coder-Desktop/Views/VPN/VPNMenuItem.swift index c10b932..3b92dc9 100644 --- a/Coder-Desktop/Coder-Desktop/Views/VPN/VPNMenuItem.swift +++ b/Coder-Desktop/Coder-Desktop/Views/VPN/VPNMenuItem.swift @@ -72,6 +72,8 @@ struct MenuItemView: View { @State private var apps: [WorkspaceApp] = [] + @State private var loadingApps: Bool = true + var hasApps: Bool { !apps.isEmpty } private var itemName: AttributedString { @@ -129,9 +131,13 @@ struct MenuItemView: View { MenuItemIcons(item: item, wsURL: wsURL) } if isExpanded { - if hasApps { + switch (loadingApps, hasApps) { + case (true, _): + CircularProgressView(value: nil, strokeWidth: 3, diameter: 15) + .padding(.top, 5) + case (false, true): MenuItemCollapsibleView(apps: apps) - } else { + case (false, false): HStack { Text(item.status == .off ? "Workspace is offline." : "No apps available.") .font(.body) @@ -146,6 +152,7 @@ struct MenuItemView: View { } func loadApps() async { + defer { loadingApps = false } // If this menu item is an agent, and the user is logged in if case let .agent(agent) = item, let client = state.client, diff --git a/Coder-Desktop/Coder-Desktop/Views/VPN/WorkspaceAppIcon.swift b/Coder-Desktop/Coder-Desktop/Views/VPN/WorkspaceAppIcon.swift index 2eb45cc..94104d2 100644 --- a/Coder-Desktop/Coder-Desktop/Views/VPN/WorkspaceAppIcon.swift +++ b/Coder-Desktop/Coder-Desktop/Views/VPN/WorkspaceAppIcon.swift @@ -19,7 +19,7 @@ struct WorkspaceAppIcon: View { ) { $0 } placeholder: { if app.icon != nil { - ProgressView().controlSize(.small) + CircularProgressView(value: nil, strokeWidth: 2, diameter: 10) } else { Image(systemName: "questionmark").frame( width: Theme.Size.appIconWidth,