mirror of
https://github.com/nicoverbruggen/phpmon.git
synced 2025-08-07 20:10:08 +02:00
👌 Cleanup
This commit is contained in:
@ -143,10 +143,10 @@
|
|||||||
C4570C3B28FC355300D18420 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C473319E2470923A009A0597 /* Localizable.strings */; };
|
C4570C3B28FC355300D18420 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C473319E2470923A009A0597 /* Localizable.strings */; };
|
||||||
C4570C3C28FC355400D18420 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C473319E2470923A009A0597 /* Localizable.strings */; };
|
C4570C3C28FC355400D18420 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C473319E2470923A009A0597 /* Localizable.strings */; };
|
||||||
C459B4BD27F6093700E9B4B4 /* nginx-proxy.test in Resources */ = {isa = PBXBuildFile; fileRef = C459B4BC27F6093700E9B4B4 /* nginx-proxy.test */; };
|
C459B4BD27F6093700E9B4B4 /* nginx-proxy.test in Resources */ = {isa = PBXBuildFile; fileRef = C459B4BC27F6093700E9B4B4 /* nginx-proxy.test */; };
|
||||||
C45B9149295607F400F4EC78 /* ServiceWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* ServiceWrapper.swift */; };
|
C45B9149295607F400F4EC78 /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* Service.swift */; };
|
||||||
C45B914A295607F400F4EC78 /* ServiceWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* ServiceWrapper.swift */; };
|
C45B914A295607F400F4EC78 /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* Service.swift */; };
|
||||||
C45B914B295607F400F4EC78 /* ServiceWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* ServiceWrapper.swift */; };
|
C45B914B295607F400F4EC78 /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* Service.swift */; };
|
||||||
C45B914C295607F400F4EC78 /* ServiceWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* ServiceWrapper.swift */; };
|
C45B914C295607F400F4EC78 /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* Service.swift */; };
|
||||||
C45B914E295608E300F4EC78 /* ValetServicesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B914D295608E300F4EC78 /* ValetServicesManager.swift */; };
|
C45B914E295608E300F4EC78 /* ValetServicesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B914D295608E300F4EC78 /* ValetServicesManager.swift */; };
|
||||||
C45B914F295608E300F4EC78 /* ValetServicesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B914D295608E300F4EC78 /* ValetServicesManager.swift */; };
|
C45B914F295608E300F4EC78 /* ValetServicesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B914D295608E300F4EC78 /* ValetServicesManager.swift */; };
|
||||||
C45B9150295608E300F4EC78 /* ValetServicesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B914D295608E300F4EC78 /* ValetServicesManager.swift */; };
|
C45B9150295608E300F4EC78 /* ValetServicesManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B914D295608E300F4EC78 /* ValetServicesManager.swift */; };
|
||||||
@ -802,7 +802,7 @@
|
|||||||
C44F868D2835BD8D005C353A /* phpmon-config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "phpmon-config.json"; sourceTree = "<group>"; };
|
C44F868D2835BD8D005C353A /* phpmon-config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "phpmon-config.json"; sourceTree = "<group>"; };
|
||||||
C450C8C528C919EC002A2B4B /* PreferenceName.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferenceName.swift; sourceTree = "<group>"; };
|
C450C8C528C919EC002A2B4B /* PreferenceName.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferenceName.swift; sourceTree = "<group>"; };
|
||||||
C459B4BC27F6093700E9B4B4 /* nginx-proxy.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "nginx-proxy.test"; sourceTree = "<group>"; };
|
C459B4BC27F6093700E9B4B4 /* nginx-proxy.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "nginx-proxy.test"; sourceTree = "<group>"; };
|
||||||
C45B9148295607F400F4EC78 /* ServiceWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceWrapper.swift; sourceTree = "<group>"; };
|
C45B9148295607F400F4EC78 /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = "<group>"; };
|
||||||
C45B914D295608E300F4EC78 /* ValetServicesManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValetServicesManager.swift; sourceTree = "<group>"; };
|
C45B914D295608E300F4EC78 /* ValetServicesManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValetServicesManager.swift; sourceTree = "<group>"; };
|
||||||
C45B91522956123A00F4EC78 /* FakeServicesManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FakeServicesManager.swift; sourceTree = "<group>"; };
|
C45B91522956123A00F4EC78 /* FakeServicesManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FakeServicesManager.swift; sourceTree = "<group>"; };
|
||||||
C45E2A76291992DA005C7CFD /* FeatureTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureTestCase.swift; sourceTree = "<group>"; };
|
C45E2A76291992DA005C7CFD /* FeatureTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureTestCase.swift; sourceTree = "<group>"; };
|
||||||
@ -1298,7 +1298,7 @@
|
|||||||
C45B9147295607E200F4EC78 /* Services */ = {
|
C45B9147295607E200F4EC78 /* Services */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C45B9148295607F400F4EC78 /* ServiceWrapper.swift */,
|
C45B9148295607F400F4EC78 /* Service.swift */,
|
||||||
C45E76132854A65300B4FE0C /* ServicesManager.swift */,
|
C45E76132854A65300B4FE0C /* ServicesManager.swift */,
|
||||||
C45B914D295608E300F4EC78 /* ValetServicesManager.swift */,
|
C45B914D295608E300F4EC78 /* ValetServicesManager.swift */,
|
||||||
C45B91522956123A00F4EC78 /* FakeServicesManager.swift */,
|
C45B91522956123A00F4EC78 /* FakeServicesManager.swift */,
|
||||||
@ -1978,7 +1978,7 @@
|
|||||||
5420395926135DC100FB00FA /* PrefsVC.swift in Sources */,
|
5420395926135DC100FB00FA /* PrefsVC.swift in Sources */,
|
||||||
C4C8900328F0E28800CE5E97 /* FileSystemProtocol.swift in Sources */,
|
C4C8900328F0E28800CE5E97 /* FileSystemProtocol.swift in Sources */,
|
||||||
C43603A0275E67610028EFC6 /* AppDelegate+Notifications.swift in Sources */,
|
C43603A0275E67610028EFC6 /* AppDelegate+Notifications.swift in Sources */,
|
||||||
C45B9149295607F400F4EC78 /* ServiceWrapper.swift in Sources */,
|
C45B9149295607F400F4EC78 /* Service.swift in Sources */,
|
||||||
5489625828312FAD004F647A /* CreatedFromFile.swift in Sources */,
|
5489625828312FAD004F647A /* CreatedFromFile.swift in Sources */,
|
||||||
C4068CA727B07A1300544CD5 /* SelectPreferenceView.swift in Sources */,
|
C4068CA727B07A1300544CD5 /* SelectPreferenceView.swift in Sources */,
|
||||||
C45B91532956123A00F4EC78 /* FakeServicesManager.swift in Sources */,
|
C45B91532956123A00F4EC78 /* FakeServicesManager.swift in Sources */,
|
||||||
@ -2256,7 +2256,7 @@
|
|||||||
C471E7F228F9BAC70021E251 /* PhpEnv.swift in Sources */,
|
C471E7F228F9BAC70021E251 /* PhpEnv.swift in Sources */,
|
||||||
C471E7E628F9BAC20021E251 /* Process.swift in Sources */,
|
C471E7E628F9BAC20021E251 /* Process.swift in Sources */,
|
||||||
C471E81928F9BAE80021E251 /* NSMenuItemExtension.swift in Sources */,
|
C471E81928F9BAE80021E251 /* NSMenuItemExtension.swift in Sources */,
|
||||||
C45B914B295607F400F4EC78 /* ServiceWrapper.swift in Sources */,
|
C45B914B295607F400F4EC78 /* Service.swift in Sources */,
|
||||||
C471E7D928F9BA8F0021E251 /* TestableShell.swift in Sources */,
|
C471E7D928F9BA8F0021E251 /* TestableShell.swift in Sources */,
|
||||||
C471E81428F9BAE80021E251 /* NSWindowExtension.swift in Sources */,
|
C471E81428F9BAE80021E251 /* NSWindowExtension.swift in Sources */,
|
||||||
C471E7D328F9BA8F0021E251 /* ActiveShell.swift in Sources */,
|
C471E7D328F9BA8F0021E251 /* ActiveShell.swift in Sources */,
|
||||||
@ -2309,7 +2309,7 @@
|
|||||||
C471E8A528F9BB8F0021E251 /* AppDelegate+InterApp.swift in Sources */,
|
C471E8A528F9BB8F0021E251 /* AppDelegate+InterApp.swift in Sources */,
|
||||||
C471E8A628F9BB8F0021E251 /* App.swift in Sources */,
|
C471E8A628F9BB8F0021E251 /* App.swift in Sources */,
|
||||||
C471E8A728F9BB8F0021E251 /* App+ActivationPolicy.swift in Sources */,
|
C471E8A728F9BB8F0021E251 /* App+ActivationPolicy.swift in Sources */,
|
||||||
C45B914C295607F400F4EC78 /* ServiceWrapper.swift in Sources */,
|
C45B914C295607F400F4EC78 /* Service.swift in Sources */,
|
||||||
C471E8A828F9BB8F0021E251 /* App+GlobalHotkey.swift in Sources */,
|
C471E8A828F9BB8F0021E251 /* App+GlobalHotkey.swift in Sources */,
|
||||||
C471E8A928F9BB8F0021E251 /* InterAppHandler.swift in Sources */,
|
C471E8A928F9BB8F0021E251 /* InterAppHandler.swift in Sources */,
|
||||||
C471E8AA28F9BB8F0021E251 /* Startup.swift in Sources */,
|
C471E8AA28F9BB8F0021E251 /* Startup.swift in Sources */,
|
||||||
@ -2501,7 +2501,7 @@
|
|||||||
C4AF9F7B2754499000D44ED0 /* Valet.swift in Sources */,
|
C4AF9F7B2754499000D44ED0 /* Valet.swift in Sources */,
|
||||||
C4C1019C27C65C6F001FACC2 /* Process.swift in Sources */,
|
C4C1019C27C65C6F001FACC2 /* Process.swift in Sources */,
|
||||||
C4F780C025D80B6E000DBC97 /* Startup.swift in Sources */,
|
C4F780C025D80B6E000DBC97 /* Startup.swift in Sources */,
|
||||||
C45B914A295607F400F4EC78 /* ServiceWrapper.swift in Sources */,
|
C45B914A295607F400F4EC78 /* Service.swift in Sources */,
|
||||||
C4C0E8E327F88B13002D32A9 /* ValetDomainScanner.swift in Sources */,
|
C4C0E8E327F88B13002D32A9 /* ValetDomainScanner.swift in Sources */,
|
||||||
C4CCBA6D275C567B008C7055 /* PMWindowController.swift in Sources */,
|
C4CCBA6D275C567B008C7055 /* PMWindowController.swift in Sources */,
|
||||||
C4B5635F276AB09000F12CCB /* VersionExtractor.swift in Sources */,
|
C4B5635F276AB09000F12CCB /* VersionExtractor.swift in Sources */,
|
||||||
|
@ -8,16 +8,16 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
class HomebrewService: Decodable, Equatable, Hashable {
|
final class HomebrewService: Sendable, Decodable {
|
||||||
let name: String
|
let name: String
|
||||||
let service_name: String
|
let service_name: String
|
||||||
var running: Bool
|
let running: Bool
|
||||||
var loaded: Bool
|
let loaded: Bool
|
||||||
var pid: Int?
|
let pid: Int?
|
||||||
var user: String?
|
let user: String?
|
||||||
var status: String?
|
let status: String?
|
||||||
var log_path: String?
|
let log_path: String?
|
||||||
var error_log_path: String?
|
let error_log_path: String?
|
||||||
|
|
||||||
init(
|
init(
|
||||||
name: String,
|
name: String,
|
||||||
@ -57,17 +57,4 @@ class HomebrewService: Decodable, Equatable, Hashable {
|
|||||||
error_log_path: nil
|
error_log_path: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func hash(into hasher: inout Hasher) {
|
|
||||||
hasher.combine(name)
|
|
||||||
hasher.combine(service_name)
|
|
||||||
hasher.combine(pid)
|
|
||||||
hasher.combine(status)
|
|
||||||
hasher.combine(running)
|
|
||||||
hasher.combine(user)
|
|
||||||
}
|
|
||||||
|
|
||||||
static func == (lhs: HomebrewService, rhs: HomebrewService) -> Bool {
|
|
||||||
return lhs.hashValue == rhs.hashValue
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -26,13 +26,15 @@ class FakeServicesManager: ServicesManager {
|
|||||||
self.fixedFormulae = formulae
|
self.fixedFormulae = formulae
|
||||||
self.fixedStatus = status
|
self.fixedStatus = status
|
||||||
|
|
||||||
self.serviceWrappers = self.formulae.map {
|
self.services = self.formulae.map {
|
||||||
let wrapper = ServiceWrapper(
|
let wrapper = Service(
|
||||||
formula: $0,
|
formula: $0,
|
||||||
service: HomebrewService.dummy(named: $0.name, enabled: true)
|
service: HomebrewService.dummy(named: $0.name, enabled: true)
|
||||||
)
|
)
|
||||||
return wrapper
|
return wrapper
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.firstRunComplete = true
|
||||||
}
|
}
|
||||||
|
|
||||||
override var formulae: [HomebrewFormula] {
|
override var formulae: [HomebrewFormula] {
|
||||||
|
@ -17,11 +17,7 @@ public enum ServiceStatus: String {
|
|||||||
case missing
|
case missing
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public struct Service: Hashable {
|
||||||
Service wrapper, that contains the Homebrew JSON output (if determined) and the formula.
|
|
||||||
This helps the app determine whether a service should run as an administrator or not.
|
|
||||||
*/
|
|
||||||
public struct ServiceWrapper: Hashable {
|
|
||||||
var formula: HomebrewFormula
|
var formula: HomebrewFormula
|
||||||
var status: ServiceStatus = .missing
|
var status: ServiceStatus = .missing
|
||||||
|
|
||||||
@ -37,7 +33,7 @@ public struct ServiceWrapper: Hashable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func == (lhs: ServiceWrapper, rhs: ServiceWrapper) -> Bool {
|
public static func == (lhs: Service, rhs: Service) -> Bool {
|
||||||
return lhs.hashValue == rhs.hashValue
|
return lhs.hashValue == rhs.hashValue
|
||||||
}
|
}
|
||||||
|
|
@ -13,7 +13,9 @@ class ServicesManager: ObservableObject {
|
|||||||
|
|
||||||
@ObservedObject static var shared: ServicesManager = ValetServicesManager()
|
@ObservedObject static var shared: ServicesManager = ValetServicesManager()
|
||||||
|
|
||||||
@Published var serviceWrappers = [ServiceWrapper]()
|
@Published var services = [Service]()
|
||||||
|
|
||||||
|
@Published var firstRunComplete: Bool = false
|
||||||
|
|
||||||
public static func useFake() {
|
public static func useFake() {
|
||||||
ServicesManager.shared = FakeServicesManager.init(
|
ServicesManager.shared = FakeServicesManager.init(
|
||||||
@ -26,18 +28,18 @@ class ServicesManager: ObservableObject {
|
|||||||
The order of services is important, so easy access is accomplished
|
The order of services is important, so easy access is accomplished
|
||||||
without much fanfare through subscripting.
|
without much fanfare through subscripting.
|
||||||
*/
|
*/
|
||||||
subscript(name: String) -> ServiceWrapper? {
|
subscript(name: String) -> Service? {
|
||||||
return self.serviceWrappers.first { wrapper in
|
return self.services.first { wrapper in
|
||||||
wrapper.name == name
|
wrapper.name == name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public var statusMessage: String {
|
public var statusMessage: String {
|
||||||
if self.serviceWrappers.isEmpty {
|
if self.services.isEmpty {
|
||||||
return "Loading..."
|
return "Loading..."
|
||||||
}
|
}
|
||||||
|
|
||||||
let statuses = self.serviceWrappers[0...2].map { $0.status }
|
let statuses = self.services[0...2].map { $0.status }
|
||||||
|
|
||||||
if statuses.contains(.missing) {
|
if statuses.contains(.missing) {
|
||||||
return "A key service is not installed."
|
return "A key service is not installed."
|
||||||
@ -50,11 +52,11 @@ class ServicesManager: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public var statusColor: Color {
|
public var statusColor: Color {
|
||||||
if self.serviceWrappers.isEmpty {
|
if self.services.isEmpty {
|
||||||
return .yellow
|
return .yellow
|
||||||
}
|
}
|
||||||
|
|
||||||
let statuses = self.serviceWrappers[0...2].map { $0.status }
|
let statuses = self.services[0...2].map { $0.status }
|
||||||
if statuses.contains(.missing) {
|
if statuses.contains(.missing) {
|
||||||
return .red
|
return .red
|
||||||
}
|
}
|
||||||
@ -109,8 +111,8 @@ class ServicesManager: ObservableObject {
|
|||||||
init() {
|
init() {
|
||||||
Log.info("The services manager will determine which Valet services exist on this system.")
|
Log.info("The services manager will determine which Valet services exist on this system.")
|
||||||
|
|
||||||
serviceWrappers = formulae.map {
|
services = formulae.map {
|
||||||
ServiceWrapper(formula: $0)
|
Service(formula: $0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,10 @@ class ValetServicesManager: ServicesManager {
|
|||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
// Load the initial services state
|
// Load the initial services state
|
||||||
Task { await self.reloadServicesStatus() }
|
Task {
|
||||||
|
await self.reloadServicesStatus()
|
||||||
|
firstRunComplete = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -58,18 +61,22 @@ class ValetServicesManager: ServicesManager {
|
|||||||
.filter({ return userServiceNames.contains($0.name) })
|
.filter({ return userServiceNames.contains($0.name) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure that Homebrew services' output is stored
|
||||||
self.homebrewServices = []
|
self.homebrewServices = []
|
||||||
|
|
||||||
for await services in group {
|
for await services in group {
|
||||||
homebrewServices.append(contentsOf: services)
|
homebrewServices.append(contentsOf: services)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dispatch the update of the new service wrappers
|
||||||
Task { @MainActor in
|
Task { @MainActor in
|
||||||
// Ensure both commands complete (but run concurrently)
|
// Ensure both commands complete (but run concurrently)
|
||||||
serviceWrappers = formulae.map { formula in
|
services = formulae.map { formula in
|
||||||
ServiceWrapper(formula: formula, service: homebrewServices.first(where: { service in
|
Service(
|
||||||
service.name == formula.name
|
formula: formula,
|
||||||
}))
|
service: homebrewServices.first(where: { service in
|
||||||
|
service.name == formula.name
|
||||||
|
})
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Broadcast that all services have been updated
|
// Broadcast that all services have been updated
|
||||||
|
@ -96,7 +96,7 @@ extension MainMenu {
|
|||||||
Valet.notifyAboutUnsupportedTLD()
|
Valet.notifyAboutUnsupportedTLD()
|
||||||
|
|
||||||
// Find out which services are active
|
// Find out which services are active
|
||||||
Log.info("The services manager knows about \(ServicesManager.shared.serviceWrappers.count) services.")
|
Log.info("The services manager knows about \(ServicesManager.shared.services.count) services.")
|
||||||
|
|
||||||
// Start the background refresh timer
|
// Start the background refresh timer
|
||||||
startSharedTimer()
|
startSharedTimer()
|
||||||
|
@ -44,7 +44,7 @@ struct ServicesView: View {
|
|||||||
init(manager: ServicesManager, perRow: Int) {
|
init(manager: ServicesManager, perRow: Int) {
|
||||||
self.manager = manager
|
self.manager = manager
|
||||||
self.perRow = perRow
|
self.perRow = perRow
|
||||||
self.rowCount = manager.serviceWrappers.chunked(by: perRow).count
|
self.rowCount = manager.services.chunked(by: perRow).count
|
||||||
self.height = CGFloat(
|
self.height = CGFloat(
|
||||||
(rowHeight * rowCount)
|
(rowHeight * rowCount)
|
||||||
+ ((rowCount - 1) * rowSpacing)
|
+ ((rowCount - 1) * rowSpacing)
|
||||||
@ -55,7 +55,7 @@ struct ServicesView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
VStack(alignment: .leading, spacing: CGFloat(self.rowSpacing)) {
|
VStack(alignment: .leading, spacing: CGFloat(self.rowSpacing)) {
|
||||||
ForEach(manager.serviceWrappers.chunked(by: perRow), id: \.self) { chunk in
|
ForEach(manager.services.chunked(by: perRow), id: \.self) { chunk in
|
||||||
HStack {
|
HStack {
|
||||||
ForEach(chunk, id: \.self) { service in
|
ForEach(chunk, id: \.self) { service in
|
||||||
ServiceView(service: service)
|
ServiceView(service: service)
|
||||||
@ -86,7 +86,7 @@ struct ServicesView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ServiceView: View {
|
struct ServiceView: View {
|
||||||
var service: ServiceWrapper
|
var service: Service
|
||||||
@State var isBusy: Bool = false
|
@State var isBusy: Bool = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@ -117,7 +117,6 @@ struct ServiceView: View {
|
|||||||
Text("?")
|
Text("?")
|
||||||
}
|
}
|
||||||
.focusable(false)
|
.focusable(false)
|
||||||
// .buttonStyle(BlueButton())
|
|
||||||
.frame(minWidth: 70, alignment: .center)
|
.frame(minWidth: 70, alignment: .center)
|
||||||
}
|
}
|
||||||
if service.status == .active || service.status == .inactive {
|
if service.status == .active || service.status == .inactive {
|
||||||
@ -134,7 +133,9 @@ struct ServiceView: View {
|
|||||||
.resizable()
|
.resizable()
|
||||||
.frame(width: 12.0, height: 12.0)
|
.frame(width: 12.0, height: 12.0)
|
||||||
.foregroundColor(
|
.foregroundColor(
|
||||||
service.status == .active ? Color("IconColorGreen") : Color("IconColorRed")
|
service.status == .active
|
||||||
|
? Color("IconColorGreen")
|
||||||
|
: Color("IconColorRed")
|
||||||
)
|
)
|
||||||
}.frame(width: 25, height: 25)
|
}.frame(width: 25, height: 25)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user