Add upload, preview sheet

This commit is contained in:
Christoph Hagen
2025-02-15 01:02:25 +01:00
parent 0753d91f29
commit 2cad27b504
14 changed files with 358 additions and 115 deletions

View File

@ -1,20 +0,0 @@
import SwiftUI
struct WebContentView: View {
@EnvironmentObject
private var server: WebServer
var body: some View {
if server.isRunning {
WebView(viewModel: server)
} else {
VStack {
Text("Webserver disabled")
.font(.title)
Text("Enable it to check out the generated content")
}
.foregroundStyle(.secondary)
}
}
}

View File

@ -1,51 +0,0 @@
import SwiftUI
import SFSafeSymbols
struct WebDetailView: View {
@EnvironmentObject
private var content: Content
@EnvironmentObject
private var server: WebServer
var text: String {
server.isRunning ? "Stop" : "Start"
}
var body: some View {
VStack {
TextField("", text: $server.currentUrl)
.disabled(true)
.textFieldStyle(.roundedBorder)
HStack {
Button(text, action: toggleWebServer)
.disabled(!server.isRunning && content.storage.outputScope == nil)
Button(action: { server.reloadPage() }) {
Label("Reload", systemSymbol: .arrowClockwise)
}
.disabled(!server.isRunning)
Button(action: { server.loadHomeUrl() }) {
Label("Home", systemSymbol: .house)
}
.disabled(!server.isRunning)
Spacer()
}
Spacer()
}
.padding()
}
private func toggleWebServer() {
guard !server.isRunning else {
server.stopServer()
return
}
guard let folder = content.storage.outputScope?.url.path() else {
print("No output folder to start server")
return
}
server.startServer(in: folder)
}
}

View File

@ -10,6 +10,9 @@ final class WebServer: NSObject, ObservableObject, WKNavigationDelegate {
@Published
var isRunning = false
@Published
var isStarting = false
@Published
var port: Int
@ -19,6 +22,10 @@ final class WebServer: NSObject, ObservableObject, WKNavigationDelegate {
@Published
var currentUrl: String = ""
var isNotReady: Bool {
isStarting || !isRunning
}
init(port: Int) {
self.port = port
super.init()
@ -40,6 +47,9 @@ final class WebServer: NSObject, ObservableObject, WKNavigationDelegate {
print("WebServer: Already running")
return
}
guard !isStarting else { return }
self.isStarting = true
Task {
var vaporArgs = CommandLine.arguments
let allowedCommands = ["serve", "routes"]
@ -52,11 +62,10 @@ final class WebServer: NSObject, ObservableObject, WKNavigationDelegate {
app.middleware.use(TryFilesMiddleware(publicDirectory: directory))
app.http.server.configuration.port = 8000
DispatchQueue.main.async {
self.isRunning = true
}
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) {
self.loadHomeUrl()
self.isStarting = false
self.isRunning = true
}
print("WebServer: Starting")
try await app.execute()

View File

@ -0,0 +1,74 @@
import SwiftUI
struct WebsitePreviewSheet: View {
@EnvironmentObject
private var content: Content
@EnvironmentObject
private var server: WebServer
@Environment(\.dismiss)
private var dismiss
var body: some View {
VStack {
HStack {
Button(action: { server.loadHomeUrl() }) {
Image(systemSymbol: .house)
}
.disabled(server.isNotReady)
Button(action: { server.reloadPage() }) {
Image(systemSymbol: .arrowClockwise)
}
.disabled(server.isNotReady)
TextField("", text: $server.currentUrl)
.disabled(true)
.textFieldStyle(.roundedBorder)
Spacer()
Button("Close", action: dismissSheet)
}
.padding()
if server.isRunning {
WebView(viewModel: server)
} else if server.isStarting {
Spacer()
ProgressView()
Text("Loading preview...")
.font(.title)
.foregroundStyle(.secondary)
Spacer()
} else {
Spacer()
Text("Webserver disabled")
.font(.title)
.foregroundStyle(.secondary)
Text("Enable it to check out the generated content")
.foregroundStyle(.secondary)
Spacer()
}
}
.frame(minWidth: 500, idealWidth: 600, idealHeight: 600)
.onAppear(perform: startWebServer)
}
private func dismissSheet() {
if server.isRunning {
server.stopServer()
}
dismiss()
}
private func startWebServer() {
guard !server.isRunning else {
server.stopServer()
return
}
guard let folder = content.storage.outputScope?.url.path() else {
print("No output folder to start server")
return
}
server.startServer(in: folder)
}
}