From 264c37218c004a8852cac10fc6bc902c52b73e8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Tue, 25 Nov 2025 16:35:51 +0800 Subject: [PATCH] Merge profile to dashboard --- .../Abstract/NavigationButtonsView.swift | 60 +++ .../Abstract/NavigationSheetContent.swift | 48 ++ .../Views/Abstract/ShareButton.swift | 23 +- .../Views/Abstract/ViewModifiers.swift | 39 ++ .../Views/Dashboard/ActiveDashboardView.swift | 135 +++--- .../Dashboard/ButtonVisibilityState.swift | 38 ++ .../Views/Dashboard/Cards/ClashModeCard.swift | 2 +- .../Dashboard/Cards/ConnectionsCard.swift | 2 +- .../Views/Dashboard/Cards/ProfileCard.swift | 459 ++++++++++++++++-- .../Cards/ProfileSelectorButton.swift | 288 +++++++++++ .../Views/Dashboard/Cards/StatusCard.swift | 2 +- .../Views/Dashboard/Cards/TrafficCard.swift | 2 +- .../Dashboard/Cards/TrafficTotalCard.swift | 2 +- .../Views/Dashboard/DashboardView.swift | 60 +++ .../Dashboard/Overview/OverviewView.swift | 7 - ApplicationLibrary/Views/NavigationPage.swift | 11 +- .../Views/Profile/EditProfileView.swift | 48 +- .../Views/Profile/NewProfileView.swift | 66 ++- .../Views/Profile/NewProfileViewModel.swift | 60 ++- .../Views/Profile/ProfileActionToolbar.swift | 109 +++++ .../Views/Profile/ProfileSheetHelpers.swift | 78 +++ .../Views/Profile/ProfileView.swift | 51 +- .../Views/Profile/QRCodeSheet.swift | 78 +++ Library/Network/CommandClient.swift | 19 +- Localizable.xcstrings | 20 +- MacLibrary/MainViewModel.swift | 8 +- SFI/MainView.swift | 181 +++++-- 27 files changed, 1590 insertions(+), 306 deletions(-) create mode 100644 ApplicationLibrary/Views/Abstract/NavigationButtonsView.swift create mode 100644 ApplicationLibrary/Views/Abstract/NavigationSheetContent.swift create mode 100644 ApplicationLibrary/Views/Abstract/ViewModifiers.swift create mode 100644 ApplicationLibrary/Views/Dashboard/ButtonVisibilityState.swift create mode 100644 ApplicationLibrary/Views/Dashboard/Cards/ProfileSelectorButton.swift create mode 100644 ApplicationLibrary/Views/Profile/ProfileActionToolbar.swift create mode 100644 ApplicationLibrary/Views/Profile/ProfileSheetHelpers.swift create mode 100644 ApplicationLibrary/Views/Profile/QRCodeSheet.swift diff --git a/ApplicationLibrary/Views/Abstract/NavigationButtonsView.swift b/ApplicationLibrary/Views/Abstract/NavigationButtonsView.swift new file mode 100644 index 0000000..609d5d1 --- /dev/null +++ b/ApplicationLibrary/Views/Abstract/NavigationButtonsView.swift @@ -0,0 +1,60 @@ +import SwiftUI + +@MainActor +public struct NavigationButtonsView: View { + public let showGroupsButton: Bool + public let showConnectionsButton: Bool + public let groupsCount: Int + public let connectionsCount: Int + public let onGroupsTap: () -> Void + public let onConnectionsTap: () -> Void + + public init( + showGroupsButton: Bool, + showConnectionsButton: Bool, + groupsCount: Int, + connectionsCount: Int, + onGroupsTap: @escaping () -> Void, + onConnectionsTap: @escaping () -> Void + ) { + self.showGroupsButton = showGroupsButton + self.showConnectionsButton = showConnectionsButton + self.groupsCount = groupsCount + self.connectionsCount = connectionsCount + self.onGroupsTap = onGroupsTap + self.onConnectionsTap = onConnectionsTap + } + + public var body: some View { + HStack(spacing: 12) { + if showGroupsButton { + Divider() + Text(verbatim: "\(groupsCount)") + .font(.subheadline) + .foregroundStyle(.secondary) + .fixedSize() + Button { + onGroupsTap() + } label: { + Label("Groups", systemImage: "rectangle.3.group.fill") + } + .labelStyle(.iconOnly) + .foregroundStyle(.primary) + } + if showConnectionsButton { + Divider() + Text(verbatim: "\(connectionsCount)") + .font(.subheadline) + .foregroundStyle(.secondary) + .fixedSize() + Button { + onConnectionsTap() + } label: { + Label("Connections", systemImage: "list.bullet.rectangle.portrait.fill") + } + .labelStyle(.iconOnly) + .foregroundStyle(.primary) + } + } + } +} diff --git a/ApplicationLibrary/Views/Abstract/NavigationSheetContent.swift b/ApplicationLibrary/Views/Abstract/NavigationSheetContent.swift new file mode 100644 index 0000000..c086787 --- /dev/null +++ b/ApplicationLibrary/Views/Abstract/NavigationSheetContent.swift @@ -0,0 +1,48 @@ +import Library +import SwiftUI + +@MainActor +public struct SheetContent: View { + private let title: String + private let content: Content + + public init(_ title: String, @ViewBuilder content: () -> Content) { + self.title = title + self.content = content() + } + + public var body: some View { + #if os(iOS) || os(tvOS) + NavigationStackCompat { + content + .navigationTitle(title) + #if os(iOS) + .navigationBarTitleDisplayMode(.inline) + #endif + } + .presentationDetentsIfAvailable() + #endif + } +} + +@MainActor +public struct GroupsSheetContent: View { + public init() {} + + public var body: some View { + SheetContent("Groups") { + GroupListView() + } + } +} + +@MainActor +public struct ConnectionsSheetContent: View { + public init() {} + + public var body: some View { + SheetContent("Connections") { + ConnectionListView() + } + } +} diff --git a/ApplicationLibrary/Views/Abstract/ShareButton.swift b/ApplicationLibrary/Views/Abstract/ShareButton.swift index 467cc68..4cdbadd 100644 --- a/ApplicationLibrary/Views/Abstract/ShareButton.swift +++ b/ApplicationLibrary/Views/Abstract/ShareButton.swift @@ -58,6 +58,7 @@ public struct ShareButtonCompat