From 1019f9a9c39349650eefe8f36686e746f158eceb Mon Sep 17 00:00:00 2001 From: Max Goedjen <max.goedjen@gmail.com> Date: Sun, 19 Jul 2020 00:30:38 -0700 Subject: [PATCH] . --- Secretive.xcodeproj/project.pbxproj | 24 +-- Secretive/{AppDelegate.swift => App.swift} | 0 Secretive/Base.lproj/Main.storyboard | 160 ------------------ .../Controllers/LaunchAgentController.swift | 2 - Secretive/Views/ContentView.swift | 95 ++++++----- Secretive/Views/NoticeView.swift | 57 ------- 6 files changed, 61 insertions(+), 277 deletions(-) rename Secretive/{AppDelegate.swift => App.swift} (100%) delete mode 100644 Secretive/Base.lproj/Main.storyboard delete mode 100644 Secretive/Views/NoticeView.swift diff --git a/Secretive.xcodeproj/project.pbxproj b/Secretive.xcodeproj/project.pbxproj index 7b398a0..6bc6521 100644 --- a/Secretive.xcodeproj/project.pbxproj +++ b/Secretive.xcodeproj/project.pbxproj @@ -12,11 +12,10 @@ 50524B442420969E008DBD97 /* OpenSSHWriterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50524B432420969D008DBD97 /* OpenSSHWriterTests.swift */; }; 50571E0324393C2600F76F6C /* JustUpdatedChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50571E0224393C2600F76F6C /* JustUpdatedChecker.swift */; }; 50571E0524393D1500F76F6C /* LaunchAgentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50571E0424393D1500F76F6C /* LaunchAgentController.swift */; }; - 50617D8323FCE48E0099B055 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617D8223FCE48E0099B055 /* AppDelegate.swift */; }; + 50617D8323FCE48E0099B055 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617D8223FCE48E0099B055 /* App.swift */; }; 50617D8523FCE48E0099B055 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617D8423FCE48E0099B055 /* ContentView.swift */; }; 50617D8723FCE48E0099B055 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50617D8623FCE48E0099B055 /* Assets.xcassets */; }; 50617D8A23FCE48E0099B055 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50617D8923FCE48E0099B055 /* Preview Assets.xcassets */; }; - 50617D8D23FCE48E0099B055 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50617D8B23FCE48E0099B055 /* Main.storyboard */; }; 50617D9923FCE48E0099B055 /* SecretiveTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50617D9823FCE48E0099B055 /* SecretiveTests.swift */; }; 50617DB123FCE4AB0099B055 /* SecretKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50617DA823FCE4AB0099B055 /* SecretKit.framework */; }; 50617DBA23FCE4AB0099B055 /* SecretKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 50617DAA23FCE4AB0099B055 /* SecretKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -41,7 +40,6 @@ 506838A12415EA5600F55094 /* AnySecret.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506838A02415EA5600F55094 /* AnySecret.swift */; }; 506838A32415EA5D00F55094 /* AnySecretStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506838A22415EA5D00F55094 /* AnySecretStore.swift */; }; 506AB87E2412334700335D91 /* SecretAgent.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 50A3B78A24026B7500D209EA /* SecretAgent.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 50731669241E00C20023809E /* NoticeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50731668241E00C20023809E /* NoticeView.swift */; }; 507CE4ED2420A3C70029F750 /* Agent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A3B79F24026B9900D209EA /* Agent.swift */; }; 507CE4EE2420A3CA0029F750 /* SocketController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A3B79D24026B9900D209EA /* SocketController.swift */; }; 507CE4F02420A4C50029F750 /* SigningWitness.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507CE4EF2420A4C50029F750 /* SigningWitness.swift */; }; @@ -211,11 +209,10 @@ 50571E0224393C2600F76F6C /* JustUpdatedChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JustUpdatedChecker.swift; sourceTree = "<group>"; }; 50571E0424393D1500F76F6C /* LaunchAgentController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchAgentController.swift; sourceTree = "<group>"; }; 50617D7F23FCE48E0099B055 /* Secretive.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Secretive.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 50617D8223FCE48E0099B055 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; + 50617D8223FCE48E0099B055 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = "<group>"; }; 50617D8423FCE48E0099B055 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; }; 50617D8623FCE48E0099B055 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 50617D8923FCE48E0099B055 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; }; - 50617D8C23FCE48E0099B055 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 50617D8E23FCE48E0099B055 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 50617D8F23FCE48E0099B055 /* Secretive.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Secretive.entitlements; sourceTree = "<group>"; }; 50617D9423FCE48E0099B055 /* SecretiveTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SecretiveTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -243,7 +240,6 @@ 5068389D241471CD00F55094 /* SecretStoreList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretStoreList.swift; sourceTree = "<group>"; }; 506838A02415EA5600F55094 /* AnySecret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnySecret.swift; sourceTree = "<group>"; }; 506838A22415EA5D00F55094 /* AnySecretStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnySecretStore.swift; sourceTree = "<group>"; }; - 50731668241E00C20023809E /* NoticeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeView.swift; sourceTree = "<group>"; }; 507CE4EF2420A4C50029F750 /* SigningWitness.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigningWitness.swift; sourceTree = "<group>"; }; 507CE4F32420A8C10029F750 /* SigningRequestProvenance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigningRequestProvenance.swift; sourceTree = "<group>"; }; 507CE4F52420A96F0029F750 /* SigningRequestTracer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SigningRequestTracer.swift; sourceTree = "<group>"; }; @@ -394,11 +390,10 @@ 50617D8123FCE48E0099B055 /* Secretive */ = { isa = PBXGroup; children = ( - 50617D8223FCE48E0099B055 /* AppDelegate.swift */, + 50617D8223FCE48E0099B055 /* App.swift */, 508A58B0241ED1C40069DC07 /* Views */, 508A58B1241ED1EA0069DC07 /* Controllers */, 50617D8623FCE48E0099B055 /* Assets.xcassets */, - 50617D8B23FCE48E0099B055 /* Main.storyboard */, 50617D8E23FCE48E0099B055 /* Info.plist */, 50617D8F23FCE48E0099B055 /* Secretive.entitlements */, 506772C62424784600034DED /* Credits.rtf */, @@ -501,7 +496,6 @@ isa = PBXGroup; children = ( 50617D8423FCE48E0099B055 /* ContentView.swift */, - 50731668241E00C20023809E /* NoticeView.swift */, 50C385A42407A76D00AF2719 /* SecretDetailView.swift */, 5099A02323FD2AAA0062B6F2 /* CreateSecretView.swift */, 50B8550C24138C4F009958AC /* DeleteSecretView.swift */, @@ -854,7 +848,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 50617D8D23FCE48E0099B055 /* Main.storyboard in Resources */, 50617D8A23FCE48E0099B055 /* Preview Assets.xcassets in Resources */, 50617D8723FCE48E0099B055 /* Assets.xcassets in Resources */, 506772C72424784600034DED /* Credits.rtf in Resources */, @@ -930,8 +923,7 @@ 50571E0524393D1500F76F6C /* LaunchAgentController.swift in Sources */, 50B8550D24138C4F009958AC /* DeleteSecretView.swift in Sources */, 50BB046B2418AAAE00D6E079 /* EmptyStoreView.swift in Sources */, - 50731669241E00C20023809E /* NoticeView.swift in Sources */, - 50617D8323FCE48E0099B055 /* AppDelegate.swift in Sources */, + 50617D8323FCE48E0099B055 /* App.swift in Sources */, 506772C92425BB8500034DED /* NoStoresView.swift in Sources */, 508A58B5241ED48F0069DC07 /* PreviewAgentStatusChecker.swift in Sources */, 508A58AA241E06B40069DC07 /* PreviewUpdater.swift in Sources */, @@ -1070,14 +1062,6 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 50617D8B23FCE48E0099B055 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 50617D8C23FCE48E0099B055 /* Base */, - ); - name = Main.storyboard; - sourceTree = "<group>"; - }; 50A3B79524026B7600D209EA /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( diff --git a/Secretive/AppDelegate.swift b/Secretive/App.swift similarity index 100% rename from Secretive/AppDelegate.swift rename to Secretive/App.swift diff --git a/Secretive/Base.lproj/Main.storyboard b/Secretive/Base.lproj/Main.storyboard deleted file mode 100644 index b7df350..0000000 --- a/Secretive/Base.lproj/Main.storyboard +++ /dev/null @@ -1,160 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="16085" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> - <dependencies> - <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16085"/> - <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> - </dependencies> - <scenes> - <!--Application--> - <scene sceneID="JPo-4y-FX3"> - <objects> - <application id="hnw-xV-0zn" sceneMemberID="viewController"> - <menu key="mainMenu" title="Main Menu" systemMenu="main" autoenablesItems="NO" id="AYu-sK-qS6"> - <items> - <menuItem title="Secretive" id="1Xt-HY-uBw"> - <modifierMask key="keyEquivalentModifierMask"/> - <menu key="submenu" title="Secretive" systemMenu="apple" id="uQy-DD-JDr"> - <items> - <menuItem title="About Secretive" id="5kV-Vb-QxS"> - <modifierMask key="keyEquivalentModifierMask"/> - <connections> - <action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/> - </connections> - </menuItem> - <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/> - <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/> - <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/> - <menuItem title="Services" id="NMo-om-nkz"> - <modifierMask key="keyEquivalentModifierMask"/> - <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/> - </menuItem> - <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/> - <menuItem title="Hide Secretive" keyEquivalent="h" id="Olw-nP-bQN"> - <connections> - <action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/> - </connections> - </menuItem> - <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO"> - <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> - <connections> - <action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/> - </connections> - </menuItem> - <menuItem title="Show All" id="Kd2-mp-pUS"> - <modifierMask key="keyEquivalentModifierMask"/> - <connections> - <action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/> - </connections> - </menuItem> - <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/> - <menuItem title="Quit Secretive" keyEquivalent="q" id="4sb-4s-VLi"> - <connections> - <action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/> - </connections> - </menuItem> - </items> - </menu> - </menuItem> - <menuItem title="File" id="dMs-cI-mzQ"> - <modifierMask key="keyEquivalentModifierMask"/> - <menu key="submenu" title="File" autoenablesItems="NO" id="bib-Uj-vzu"> - <items> - <menuItem title="New" enabled="NO" keyEquivalent="n" id="Was-JA-tGl"> - <connections> - <action selector="addWithSender:" target="Voe-Tx-rLC" id="U1t-YZ-Hn5"/> - </connections> - </menuItem> - <menuItem isSeparatorItem="YES" id="m54-Is-iLE"/> - <menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG"> - <connections> - <action selector="performClose:" target="Ady-hI-5gd" id="HmO-Ls-i7Q"/> - </connections> - </menuItem> - </items> - </menu> - </menuItem> - <menuItem title="Window" id="aUF-d1-5bR"> - <modifierMask key="keyEquivalentModifierMask"/> - <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo"> - <items> - <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV"> - <connections> - <action selector="performMiniaturize:" target="Ady-hI-5gd" id="VwT-WD-YPe"/> - </connections> - </menuItem> - <menuItem title="Zoom" id="R4o-n2-Eq4"> - <modifierMask key="keyEquivalentModifierMask"/> - <connections> - <action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/> - </connections> - </menuItem> - <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/> - <menuItem title="Bring All to Front" id="LE2-aR-0XJ"> - <modifierMask key="keyEquivalentModifierMask"/> - <connections> - <action selector="arrangeInFront:" target="Ady-hI-5gd" id="DRN-fu-gQh"/> - </connections> - </menuItem> - </items> - </menu> - </menuItem> - <menuItem title="Help" id="wpr-3q-Mcd"> - <modifierMask key="keyEquivalentModifierMask"/> - <menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ"> - <items> - <menuItem title="Setup Helper App" id="04y-R6-7bF"> - <modifierMask key="keyEquivalentModifierMask"/> - <connections> - <action selector="runSetupWithSender:" target="Voe-Tx-rLC" id="Fty-2m-eng"/> - </connections> - </menuItem> - <menuItem isSeparatorItem="YES" id="Ddf-5M-Bmf"/> - <menuItem title="Secretive Help" keyEquivalent="?" id="FKE-Sm-Kum"> - <connections> - <action selector="showHelp:" target="Ady-hI-5gd" id="y7X-2Q-9no"/> - </connections> - </menuItem> - </items> - </menu> - </menuItem> - </items> - </menu> - <connections> - <outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/> - </connections> - </application> - <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Secretive" customModuleProvider="target"> - <connections> - <outlet property="newMenuItem" destination="Was-JA-tGl" id="C8s-uk-gMA"/> - <outlet property="toolbar" destination="bvo-mt-QR4" id="XSF-g2-znt"/> - </connections> - </customObject> - <toolbar implicitIdentifier="09D11707-F4A3-4FD5-970E-AC5832E91C2B" autosavesConfiguration="NO" displayMode="iconAndLabel" sizeMode="regular" id="bvo-mt-QR4"> - <allowedToolbarItems> - <toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="9Xm-OQ-a7h"/> - <toolbarItem implicitItemIdentifier="728E7E6E-F692-41A1-9439-C6EF9BE96CBA" label="Secretive" paletteLabel="" sizingBehavior="auto" id="xbD-W8-Ypr"> - <nil key="toolTip"/> - <textField key="view" horizontalHuggingPriority="251" verticalHuggingPriority="750" id="Mg0-Hm-7bW"> - <rect key="frame" x="0.0" y="14" width="65" height="16"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" lineBreakMode="clipping" title="Secretive" id="EXw-BM-zF7"> - <font key="font" usesAppearanceFont="YES"/> - <color key="textColor" name="windowFrameTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - </toolbarItem> - </allowedToolbarItems> - <defaultToolbarItems> - <toolbarItem reference="9Xm-OQ-a7h"/> - <toolbarItem reference="xbD-W8-Ypr"/> - <toolbarItem reference="9Xm-OQ-a7h"/> - </defaultToolbarItems> - </toolbar> - <customObject id="YLy-65-1bz" customClass="NSFontManager"/> - <customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/> - </objects> - <point key="canvasLocation" x="75" y="0.0"/> - </scene> - </scenes> -</document> diff --git a/Secretive/Controllers/LaunchAgentController.swift b/Secretive/Controllers/LaunchAgentController.swift index 8077da5..21b8a3e 100644 --- a/Secretive/Controllers/LaunchAgentController.swift +++ b/Secretive/Controllers/LaunchAgentController.swift @@ -8,8 +8,6 @@ struct LaunchAgentController { } func relaunch() { - _ = setEnabled(false) - _ = setEnabled(true) } private func setEnabled(_ enabled: Bool) -> Bool { diff --git a/Secretive/Views/ContentView.swift b/Secretive/Views/ContentView.swift index f2597cc..ea684f8 100644 --- a/Secretive/Views/ContentView.swift +++ b/Secretive/Views/ContentView.swift @@ -10,17 +10,12 @@ struct ContentView<UpdaterType: UpdaterProtocol, AgentStatusCheckerType: AgentSt var runSetupBlock: (() -> Void)? @State private var active: AnySecret.ID? + @State private var showingCreation = false @State private var showingDeletion = false @State private var deletingSecret: AnySecret? var body: some View { VStack { -// if updater.update != nil { -// updateNotice() -// } -// if !agentStatusChecker.running { -// agentNotice() -// } if storeList.anyAvailable { NavigationView { List(selection: $active) { @@ -74,43 +69,67 @@ struct ContentView<UpdaterType: UpdaterProtocol, AgentStatusCheckerType: AgentSt NoStoresView() } } + .sheet(isPresented: $showingCreation) { + CreateSecretView(store: storeList.modifiableStore!) { + self.showingCreation = false + } + } + .frame(minWidth: 640, minHeight: 320) .toolbar { - self.toolbar +// if updater.update != nil { +// updateNotice() +// } +// if !agentStatusChecker.running { +// agentNotice() +// } + ToolbarItem { + Button(action: { + self.showingCreation = true + }, label: { + Image(systemName: "plus") + }) + } } } - var toolbar: ToolbarItem<Void, Button<Image>> { - ToolbarItem { - Button(action: { - print("OK") - }, label: { - Image(systemName: "plus") - }) - } - } - - func updateNotice() -> some View { - guard let update = updater.update else { return AnyView(Spacer()) } - let severity: NoticeView.Severity - let text: String - if update.critical { - severity = .critical - text = "Critical Security Update Required" - } else { - severity = .advisory - text = "Update Available" - } - return AnyView(NoticeView(text: text, severity: severity, actionTitle: "Update") { - NSWorkspace.shared.open(update.html_url) - }) - } - - func agentNotice() -> some View { - NoticeView(text: "Secret Agent isn't running. Run setup again to fix.", severity: .advisory, actionTitle: "Run Setup") { - self.runSetupBlock?() - } - } +// func updateNotice() -> ToolbarItem<Void, some View> { +// guard let update = updater.update else { fatalError() } +// let color: Color +// let text: String +// if update.critical { +// text = "Critical Security Update Required" +// color = .orange +// } else { +// text = "Update Available" +// color = .red +// } +// return ToolbarItem { +// Button(action: { +// NSWorkspace.shared.open(update.html_url) +// }, label: { +// Text(text) +// .font(.headline) +// .foregroundColor(.white) +// }) +// .background(color) +// .cornerRadius(5) +// } +// } +// +// func agentNotice() -> ToolbarItem<Void, AnyView> { +// ToolbarItem { +// Button(action: { +// self.runSetupBlock?() +// }, label: { +// Text("Agent is not running.") +// .font(.headline) +// .foregroundColor(.white) +// }) +// .background(Color.orange) +// .cornerRadius(5) +// } +// } func delete<SecretType: Secret>(secret: SecretType) { deletingSecret = AnySecret(secret) diff --git a/Secretive/Views/NoticeView.swift b/Secretive/Views/NoticeView.swift deleted file mode 100644 index dceba20..0000000 --- a/Secretive/Views/NoticeView.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Foundation -import SwiftUI - -struct NoticeView: View { - - let text: String - let severity: Severity - let actionTitle: String? - let action: (() -> Void)? - - var body: some View { - HStack { - Text(text).bold() - Spacer() - if action != nil { - Button(action: action!) { - Text(actionTitle!) - } - } - }.padding().background(color) - } - - var color: Color { - switch severity { - case .advisory: - return Color.orange - case .critical: - return Color.red - } - } - -} - -extension NoticeView { - - enum Severity { - case advisory, critical - } - -} - -#if DEBUG - -struct NoticeView_Previews: PreviewProvider { - static var previews: some View { - Group { - NoticeView(text: "Agent Not Running", severity: .advisory, actionTitle: "Run Setup") { - print("OK") - } - NoticeView(text: "Critical Security Update Required", severity: .critical, actionTitle: "Update") { - print("OK") - } - } - } -} - -#endif