Files
SwiftForge/SwiftForge/Views/CreateRepositoryView.swift
2025-07-05 14:38:17 -06:00

118 lines
3.6 KiB
Swift

//
// CreateRepositoryView.swift
// SwiftForge
//
// Created by Atridad Lahiji on 2025-01-27.
//
import SwiftUI
struct CreateRepositoryView: View {
@Environment(\.dismiss) private var dismiss
@EnvironmentObject private var authManager: AuthenticationManager
@State private var repositoryName = ""
@State private var description = ""
@State private var isPrivate = false
@State private var initializeWithReadme = true
@State private var isCreating = false
@State private var showError = false
@State private var errorMessage = ""
var body: some View {
NavigationView {
Form {
Section(header: Text("Repository Details")) {
TextField("Repository name", text: $repositoryName)
.textFieldStyle(.roundedBorder)
TextField("Description (optional)", text: $description, axis: .vertical)
.textFieldStyle(.roundedBorder)
.lineLimit(3...6)
}
Section(header: Text("Settings")) {
Toggle("Private repository", isOn: $isPrivate)
Toggle("Initialize with README", isOn: $initializeWithReadme)
}
Section {
VStack(spacing: 8) {
Text("Repository will be created under your account")
.font(.caption)
.foregroundColor(.secondary)
if !repositoryName.isEmpty {
Text("github.com/username/\(repositoryName)")
.font(.caption)
.foregroundColor(.blue)
}
}
}
}
.navigationTitle("New Repository")
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Cancel") {
dismiss()
}
}
ToolbarItem(placement: .confirmationAction) {
Button("Create") {
createRepository()
}
.disabled(repositoryName.isEmpty || isCreating)
}
}
.alert("Error", isPresented: $showError) {
Button("OK") {}
} message: {
Text(errorMessage)
}
}
}
private func createRepository() {
guard !repositoryName.isEmpty else { return }
guard let apiService = authManager.getAPIService() else {
errorMessage = "Not authenticated"
showError = true
return
}
isCreating = true
Task {
do {
let _ = try await apiService.createRepository(
name: repositoryName,
description: description.isEmpty ? nil : description,
isPrivate: isPrivate,
autoInit: initializeWithReadme
)
// Success - dismiss the sheet
await MainActor.run {
dismiss()
}
} catch {
await MainActor.run {
isCreating = false
errorMessage = error.localizedDescription
showError = true
}
}
}
}
}
#if DEBUG
struct CreateRepositoryView_Previews: PreviewProvider {
static var previews: some View {
CreateRepositoryView()
}
}
#endif