summaryrefslogtreecommitdiff
path: root/Hutch/Views/Repositories/HgRepositorySettingsViewModel.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-13 14:20:27 -0500
committerChristian Cleberg <[email protected]>2026-04-13 14:20:27 -0500
commit5e63048ab6a741ae947f7fe42efcb5206a3f3963 (patch)
treecf8eb2e3bc3b2edb20ef96a2599e684378120e5b /Hutch/Views/Repositories/HgRepositorySettingsViewModel.swift
parent0b84ecaf7ba0fb2cd3f3867da8dc732450b55b50 (diff)
downloadhutch-5e63048ab6a741ae947f7fe42efcb5206a3f3963.tar.gz
hutch-5e63048ab6a741ae947f7fe42efcb5206a3f3963.tar.bz2
hutch-5e63048ab6a741ae947f7fe42efcb5206a3f3963.zip
fix: mercurial parity and graphql handlingv3.0.4
- implements consistent UX between repo types - ensures centralized services and routes are used between repo types - graphql error handling is centralized - error messages are consistent Implements: https://todo.sr.ht/~ccleberg/hutch/58 Implements: https://todo.sr.ht/~ccleberg/hutch/59
Diffstat (limited to 'Hutch/Views/Repositories/HgRepositorySettingsViewModel.swift')
-rw-r--r--Hutch/Views/Repositories/HgRepositorySettingsViewModel.swift37
1 files changed, 30 insertions, 7 deletions
diff --git a/Hutch/Views/Repositories/HgRepositorySettingsViewModel.swift b/Hutch/Views/Repositories/HgRepositorySettingsViewModel.swift
index a1a11ae..7b8d7f7 100644
--- a/Hutch/Views/Repositories/HgRepositorySettingsViewModel.swift
+++ b/Hutch/Views/Repositories/HgRepositorySettingsViewModel.swift
@@ -64,11 +64,14 @@ final class HgRepositorySettingsViewModel {
let repositoryRid: String
let repositoryName: String
private let client: SRHTClient
+ private var initialDescription: String
+ private var initialVisibility: Visibility
var editedDescription: String
var editedVisibility: Visibility
var editedNonPublishing: Bool
var isSavingInfo = false
+ private(set) var loadedNonPublishing = false
private(set) var acls: [HgACLEntry] = []
private(set) var isLoadingACLs = false
@@ -82,12 +85,25 @@ final class HgRepositorySettingsViewModel {
var didDelete = false
var error: String?
+ var normalizedEditedDescription: String {
+ editedDescription.trimmingCharacters(in: .whitespacesAndNewlines)
+ }
+
+ var isInfoDirty: Bool {
+ normalizedEditedDescription != initialDescription ||
+ editedVisibility != initialVisibility ||
+ editedNonPublishing != loadedNonPublishing
+ }
+
init(repository: RepositorySummary, client: SRHTClient) {
self.repositoryId = repository.id
self.repositoryRid = repository.rid
self.repositoryName = repository.name
self.client = client
- self.editedDescription = repository.description ?? ""
+ let description = repository.description ?? ""
+ self.initialDescription = description
+ self.initialVisibility = repository.visibility
+ self.editedDescription = description
self.editedVisibility = repository.visibility
self.editedNonPublishing = false
}
@@ -159,9 +175,14 @@ final class HgRepositorySettingsViewModel {
)
if let repository = result.repository {
- editedDescription = repository.description ?? ""
+ let description = repository.description ?? ""
+ initialDescription = description
+ initialVisibility = repository.visibility
+ editedDescription = description
editedVisibility = repository.visibility
- editedNonPublishing = repository.nonPublishing ?? false
+ let nonPublishing = repository.nonPublishing ?? false
+ editedNonPublishing = nonPublishing
+ loadedNonPublishing = nonPublishing
}
} catch {
self.error = error.userFacingMessage
@@ -175,7 +196,7 @@ final class HgRepositorySettingsViewModel {
do {
let input: [String: any Sendable] = [
- "description": editedDescription,
+ "description": normalizedEditedDescription,
"visibility": editedVisibility.rawValue,
"nonPublishing": editedNonPublishing
]
@@ -185,6 +206,9 @@ final class HgRepositorySettingsViewModel {
variables: ["id": repositoryId, "input": input],
responseType: HgUpdateRepositoryResponse.self
)
+ initialDescription = normalizedEditedDescription
+ initialVisibility = editedVisibility
+ loadedNonPublishing = editedNonPublishing
return true
} catch {
self.error = error.userFacingMessage
@@ -237,9 +261,8 @@ final class HgRepositorySettingsViewModel {
}
newACLEntity = ""
} catch {
- let message = error.localizedDescription
- if message.localizedCaseInsensitiveContains("No such repository or user found") {
- self.error = "That user is not available on hg.sr.ht yet. They need to create or activate an hg.sr.ht repository first."
+ if error.matchesGraphQLErrorClassification(.serviceNotProvisioned) {
+ self.error = error.userFacingMessage
} else {
self.error = error.userFacingMessage
}