diff options
Diffstat (limited to 'Hutch/Views/Repositories')
| -rw-r--r-- | Hutch/Views/Repositories/HgRepositoryDetailView.swift | 63 | ||||
| -rw-r--r-- | Hutch/Views/Repositories/RepositoryDetailView.swift | 43 |
2 files changed, 90 insertions, 16 deletions
diff --git a/Hutch/Views/Repositories/HgRepositoryDetailView.swift b/Hutch/Views/Repositories/HgRepositoryDetailView.swift index 4a61c1d..ac7c04f 100644 --- a/Hutch/Views/Repositories/HgRepositoryDetailView.swift +++ b/Hutch/Views/Repositories/HgRepositoryDetailView.swift @@ -19,12 +19,23 @@ struct HgRepositoryDetailView: View { @State private var showShareUnavailableAlert = false @State private var didCopyFileContents = false @State private var copyResetTask: Task<Void, Never>? + @State private var pinChangeCount = 0 private var canManageRepository: Bool { guard let currentUser = appState.currentUser else { return false } return normalizedUsername(currentUser.username) == normalizedUsername(repository.owner.canonicalName) } + private var currentUserKey: String? { + appState.currentUser?.canonicalName + } + + private var isPinnedToHome: Bool { + _ = pinChangeCount + guard let currentUserKey else { return false } + return HomePinStore.isPinned(.repository(repository), for: currentUserKey, defaults: appState.accountDefaults) + } + private var shareURL: URL? { guard let viewModel, let selectedFilePath = viewModel.selectedFilePath else { return nil } return SRHTWebURL.file( @@ -58,17 +69,7 @@ struct HgRepositoryDetailView: View { } } - SRHTShareButton(url: SRHTWebURL.repository(repository), target: .repository) { - Image(systemName: "square.and.arrow.up") - } - - if canManageRepository { - Button { - showSettings = true - } label: { - Image(systemName: "gear") - } - } + repositoryActionsMenu } } .sheet(isPresented: $showSettings) { @@ -106,6 +107,46 @@ struct HgRepositoryDetailView: View { return trimmed.hasPrefix("~") ? String(trimmed.dropFirst()) : trimmed } + private func togglePinnedState() { + guard let currentUserKey else { return } + HomePinStore.togglePin(.repository(repository), for: currentUserKey, defaults: appState.accountDefaults) + pinChangeCount += 1 + } + + private var repositoryActionsMenu: some View { + Menu { + if currentUserKey != nil { + Button { + togglePinnedState() + } label: { + Label( + isPinnedToHome ? "Unpin from Home" : "Pin to Home", + systemImage: isPinnedToHome ? "pin.slash" : "pin" + ) + } + } + + if let shareURL = SRHTWebURL.repository(repository) { + ShareLink(item: shareURL) { + Label("Share", systemImage: "square.and.arrow.up") + } + } + + if canManageRepository { + Divider() + + Button { + showSettings = true + } label: { + Label("Repository Settings", systemImage: "gear") + } + } + } label: { + Image(systemName: "ellipsis.circle") + } + .accessibilityLabel("Repository actions") + } + @ViewBuilder private func content(_ viewModel: HgRepositoryDetailViewModel) -> some View { VStack(spacing: 0) { diff --git a/Hutch/Views/Repositories/RepositoryDetailView.swift b/Hutch/Views/Repositories/RepositoryDetailView.swift index 2715134..6e7343f 100644 --- a/Hutch/Views/Repositories/RepositoryDetailView.swift +++ b/Hutch/Views/Repositories/RepositoryDetailView.swift @@ -13,12 +13,23 @@ struct RepositoryDetailView: View { @State private var showSettings = false @State private var showACLs = false @State private var currentRepository: RepositorySummary + @State private var pinChangeCount = 0 private var canManageRepository: Bool { guard let currentUser = appState.currentUser else { return false } return normalizedUsername(currentUser.username) == normalizedUsername(currentRepository.owner.canonicalName) } + private var currentUserKey: String? { + appState.currentUser?.canonicalName + } + + private var isPinnedToHome: Bool { + _ = pinChangeCount + guard let currentUserKey else { return false } + return HomePinStore.isPinned(.repository(currentRepository), for: currentUserKey, defaults: appState.accountDefaults) + } + init( repository: RepositorySummary, onRepositoryUpdated: ((RepositorySummary) -> Void)? = nil, @@ -43,12 +54,8 @@ struct RepositoryDetailView: View { .navigationTitle(currentRepository.name) .navigationBarTitleDisplayMode(.inline) .toolbar { - ToolbarItemGroup(placement: .topBarTrailing) { + ToolbarItem(placement: .topBarTrailing) { repositoryActionsMenu - - SRHTShareButton(url: SRHTWebURL.repository(currentRepository), target: .repository) { - Image(systemName: "square.and.arrow.up") - } } } .sheet(isPresented: $showSettings) { @@ -82,6 +89,7 @@ struct RepositoryDetailView: View { client: appState.client ) } + RecentActivityStore.recordRepository(currentRepository, defaults: appState.accountDefaults) } } } @@ -130,6 +138,25 @@ struct RepositoryDetailView: View { private var repositoryActionsMenu: some View { Menu { + if currentUserKey != nil { + Button { + togglePinnedState() + } label: { + Label( + isPinnedToHome ? "Unpin from Home" : "Pin to Home", + systemImage: isPinnedToHome ? "pin.slash" : "pin" + ) + } + } + + if let shareURL = SRHTWebURL.repository(currentRepository) { + ShareLink(item: shareURL) { + Label("Share", systemImage: "square.and.arrow.up") + } + } + + Divider() + if let repositoryURL = SRHTWebURL.repository(currentRepository) { Button { openURL(repositoryURL) @@ -184,4 +211,10 @@ struct RepositoryDetailView: View { } .accessibilityLabel("Repository actions") } + + private func togglePinnedState() { + guard let currentUserKey else { return } + HomePinStore.togglePin(.repository(currentRepository), for: currentUserKey, defaults: appState.accountDefaults) + pinChangeCount += 1 + } } |
