Add upload, preview sheet
This commit is contained in:
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
}
|
@ -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()
|
||||
|
74
CHDataManagement/Server/WebsitePreviewSheet.swift
Normal file
74
CHDataManagement/Server/WebsitePreviewSheet.swift
Normal 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)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user