118 lines
3.6 KiB
Swift
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
|