Build iOS App / Build .ipa and publish source (push) Successful in 22s
- Merge button: use the proper SF Symbol 'arrow.triangle.merge' instead of the download icon 'arrow.down.circle'. - Add a Settings toggle 'Delete branch after merge'. When on, the merge call passes delete_branch_after_merge=true and the head branch is deleted after a successful merge (best-effort). - PR detail bottom tab bar: floating capsule style (regularMaterial + shadow) like the latest iOS tab bars, instead of a full-width bar. - Bump to 2.0.
60 lines
1.9 KiB
Swift
60 lines
1.9 KiB
Swift
import Foundation
|
|
import SwiftUI
|
|
|
|
enum MergeGateMode: String, CaseIterable, Identifiable {
|
|
case warn = "Warn on red (allow merge with confirm)"
|
|
case block = "Block merge when CI is red"
|
|
|
|
var id: String { rawValue }
|
|
}
|
|
|
|
/// Central settings: instance + token (Keychain) and app preferences.
|
|
@MainActor
|
|
final class SettingsStore: ObservableObject {
|
|
static let shared = SettingsStore()
|
|
|
|
@Published var instanceURL: String {
|
|
didSet { KeychainHelper.set(instanceURL, key: "instanceURL") }
|
|
}
|
|
@Published var token: String {
|
|
didSet { KeychainHelper.set(token, key: "token") }
|
|
}
|
|
@Published var mergeGateMode: MergeGateMode {
|
|
didSet { UserDefaults.standard.set(mergeGateMode.rawValue,
|
|
forKey: "mergeGateMode") }
|
|
}
|
|
@Published var deleteBranchAfterMerge: Bool {
|
|
didSet { UserDefaults.standard.set(deleteBranchAfterMerge,
|
|
forKey: "deleteBranchAfterMerge") }
|
|
}
|
|
|
|
private init() {
|
|
instanceURL = KeychainHelper.get("instanceURL") ?? "https://gitea.bueso.eu"
|
|
token = KeychainHelper.get("token") ?? ""
|
|
let raw = UserDefaults.standard.string(forKey: "mergeGateMode")
|
|
mergeGateMode = MergeGateMode(rawValue: raw ?? "") ?? .warn
|
|
deleteBranchAfterMerge = UserDefaults.standard.bool(forKey: "deleteBranchAfterMerge")
|
|
}
|
|
|
|
var isConfigured: Bool {
|
|
!token.isEmpty && !instanceURL.isEmpty
|
|
}
|
|
|
|
var baseURL: URL? {
|
|
URL(string: instanceURL.hasSuffix("/") ?
|
|
String(instanceURL.dropLast()) : instanceURL)
|
|
}
|
|
|
|
func client() -> GiteaClient? {
|
|
guard let base = baseURL else { return nil }
|
|
return GiteaClient(instanceURL: base, token: token)
|
|
}
|
|
|
|
func logout() {
|
|
KeychainHelper.delete("instanceURL")
|
|
KeychainHelper.delete("token")
|
|
instanceURL = "https://gitea.bueso.eu"
|
|
token = ""
|
|
}
|
|
}
|