Created onboardingview
Added onboardingview to the app. First use only
This commit is contained in:
parent
534e615919
commit
30886771c5
9 changed files with 114 additions and 24 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -3,3 +3,6 @@ xcuserdata
|
||||||
|
|
||||||
# Rust
|
# Rust
|
||||||
target/
|
target/
|
||||||
|
|
||||||
|
# DS Store
|
||||||
|
**/.DS_Store
|
||||||
|
|
|
||||||
21
Apple/App/Assets.xcassets/OnboardingBackground.imageset/Contents.json
vendored
Normal file
21
Apple/App/Assets.xcassets/OnboardingBackground.imageset/Contents.json
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "background.jpeg",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Apple/App/Assets.xcassets/OnboardingBackground.imageset/background.jpeg
vendored
Normal file
BIN
Apple/App/Assets.xcassets/OnboardingBackground.imageset/background.jpeg
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 134 KiB |
|
|
@ -1,32 +1,44 @@
|
||||||
import NetworkExtension
|
import NetworkExtension
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
|
@available(macOS 13.0, *)
|
||||||
@main
|
@main
|
||||||
@MainActor
|
@MainActor
|
||||||
struct BurrowApp: App {
|
struct BurrowApp: App {
|
||||||
//To connect to the App Delegate
|
// To connect to the App Delegate
|
||||||
@NSApplicationDelegateAdaptor(AppDelegate.self) var delegate
|
@NSApplicationDelegateAdaptor(AppDelegate.self)
|
||||||
|
var delegate
|
||||||
|
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup {
|
WindowGroup(id: "onboarding", content: {
|
||||||
TunnelView()
|
OnboardingView().frame(width: 1000, height: 600.0).scaledToFill().fixedSize()
|
||||||
}
|
}).windowStyle(.hiddenTitleBar).windowResizability(.contentSize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@available(macOS 13.0, *)
|
||||||
@MainActor
|
@MainActor
|
||||||
class AppDelegate: NSObject, NSApplicationDelegate {
|
class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
|
|
||||||
static let tunnel = Tunnel { manager, proto in
|
static let tunnel = Tunnel { manager, proto in
|
||||||
proto.serverAddress = "hackclub.com"
|
proto.serverAddress = "hackclub.com"
|
||||||
manager.localizedDescription = "Burrow"
|
manager.localizedDescription = "Burrow"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verifies app status
|
||||||
|
func checkFirstTime() {
|
||||||
|
let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")
|
||||||
|
if launchedBefore {
|
||||||
|
print("Not first launch.")
|
||||||
|
closeApp()
|
||||||
|
} else {
|
||||||
|
print("First launch, setting UserDefault.")
|
||||||
|
setVisited()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var statusItem: NSStatusItem?
|
var statusItem: NSStatusItem?
|
||||||
var popOver = NSPopover()
|
var popOver = NSPopover()
|
||||||
func applicationDidFinishLaunching(_ notification: Notification) {
|
func applicationDidFinishLaunching(_ notification: Notification) {
|
||||||
|
checkFirstTime()
|
||||||
let menuView = MenuView(tunnel: AppDelegate.tunnel)
|
let menuView = MenuView(tunnel: AppDelegate.tunnel)
|
||||||
// Creating apopOver
|
// Creating apopOver
|
||||||
popOver.behavior = .transient
|
popOver.behavior = .transient
|
||||||
|
|
@ -41,13 +53,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
menuButton.action = #selector(menuButtonToggle)
|
menuButton.action = #selector(menuButtonToggle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@objc func menuButtonToggle() {
|
@objc func
|
||||||
|
menuButtonToggle() {
|
||||||
|
|
||||||
if let menuButton = statusItem?.button {
|
if let menuButton = statusItem?.button {
|
||||||
|
|
||||||
self.popOver.show(relativeTo: menuButton.bounds, of: menuButton, preferredEdge: NSRectEdge.minY)
|
self.popOver.show(relativeTo: menuButton.bounds, of: menuButton, preferredEdge: NSRectEdge.minY)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ struct MenuView: View {
|
||||||
@ObservedObject var tunnel: Tunnel
|
@ObservedObject var tunnel: Tunnel
|
||||||
|
|
||||||
private func start() {
|
private func start() {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
try tunnel.start()
|
try tunnel.start()
|
||||||
} catch {
|
} catch {
|
||||||
|
|
|
||||||
54
Apple/App/Menu/OnboardingView.swift
Normal file
54
Apple/App/Menu/OnboardingView.swift
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
//
|
||||||
|
// OnboardingView.swift
|
||||||
|
// App
|
||||||
|
//
|
||||||
|
// Created by Juan Pablo Gutierrez on 25/05/23.
|
||||||
|
//
|
||||||
|
// Represents the onboarding screen
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
//Sets burrow visited status
|
||||||
|
func setVisited() {
|
||||||
|
UserDefaults.standard.set(true, forKey: "launchedBefore")
|
||||||
|
}
|
||||||
|
|
||||||
|
func closeApp() {
|
||||||
|
setVisited()
|
||||||
|
NSApp.windows.first?.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(macOS 13.0, *)
|
||||||
|
struct OnboardingView: View {
|
||||||
|
var body: some View {
|
||||||
|
ZStack(alignment: .center) {
|
||||||
|
Image("OnboardingBackground")
|
||||||
|
.resizable(resizingMode: .stretch)
|
||||||
|
.aspectRatio(contentMode: .fit)
|
||||||
|
.scaledToFill()
|
||||||
|
Color.black
|
||||||
|
.opacity(0.6)
|
||||||
|
.cornerRadius(15)
|
||||||
|
.blur(radius: 0.2)
|
||||||
|
.edgesIgnoringSafeArea(.all)
|
||||||
|
.frame(width: 450, height: 300)
|
||||||
|
VStack(alignment: .center) {
|
||||||
|
Text("Welcome to burrow").font(.system(size: 24, weight: .bold, design: .rounded))
|
||||||
|
Spacer().frame(height: /*@START_MENU_TOKEN@*/20.0/*@END_MENU_TOKEN@*/)
|
||||||
|
Text("It is a best-in-class tool for burrowing through firewalls.").font(.system(size: 14))
|
||||||
|
Spacer().frame(height: 10.0)
|
||||||
|
Text("Built by teenagers at HackClub").font(.system(size: 14))
|
||||||
|
Button(action: closeApp, label: {
|
||||||
|
Text("Start burrowing")
|
||||||
|
.font(
|
||||||
|
.system(
|
||||||
|
size : 14,
|
||||||
|
weight: .regular,
|
||||||
|
design: .rounded))
|
||||||
|
.padding(.all, 30.0)
|
||||||
|
.foregroundColor(.white)
|
||||||
|
}).buttonBorderShape(.roundedRectangle).buttonStyle(.borderless)
|
||||||
|
}.padding(20.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,6 @@ import Foundation
|
||||||
import NetworkExtension
|
import NetworkExtension
|
||||||
|
|
||||||
extension Tunnel {
|
extension Tunnel {
|
||||||
|
|
||||||
enum Status: CustomStringConvertible, Equatable, Hashable {
|
enum Status: CustomStringConvertible, Equatable, Hashable {
|
||||||
case unknown
|
case unknown
|
||||||
case permissionRequired
|
case permissionRequired
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,10 @@
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AA26D72A10004900F14CE6 /* MenuView.swift */; };
|
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43AA26D72A10004900F14CE6 /* MenuView.swift */; };
|
||||||
|
91D80FC72A20615500952E28 /* OnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D80FC62A20615500952E28 /* OnboardingView.swift */; };
|
||||||
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; };
|
D020F65829E4A697002790F6 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D020F65729E4A697002790F6 /* PacketTunnelProvider.swift */; };
|
||||||
D020F65D29E4A697002790F6 /* BurrowNetworkExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
D020F65D29E4A697002790F6 /* BurrowNetworkExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D020F65329E4A697002790F6 /* BurrowNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */; };
|
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */; };
|
||||||
D05B9F7829E39EEC008CB1F9 /* TunnelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */; };
|
|
||||||
D05B9F7A29E39EED008CB1F9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D05B9F7929E39EED008CB1F9 /* Assets.xcassets */; };
|
D05B9F7A29E39EED008CB1F9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D05B9F7929E39EED008CB1F9 /* Assets.xcassets */; };
|
||||||
D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */; };
|
D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */; };
|
||||||
D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FE2A086E1C00AD070D /* Status.swift */; };
|
D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BCC5FE2A086E1C00AD070D /* Status.swift */; };
|
||||||
|
|
@ -46,6 +46,7 @@
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
43AA26D72A10004900F14CE6 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = "<group>"; };
|
43AA26D72A10004900F14CE6 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = "<group>"; };
|
||||||
|
91D80FC62A20615500952E28 /* OnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingView.swift; sourceTree = "<group>"; wrapsLines = 0; };
|
||||||
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; };
|
D020F63D29E4A1FF002790F6 /* Identity.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Identity.xcconfig; sourceTree = "<group>"; };
|
||||||
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Compiler.xcconfig; sourceTree = "<group>"; };
|
D020F64029E4A1FF002790F6 /* Compiler.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Compiler.xcconfig; sourceTree = "<group>"; };
|
||||||
D020F64229E4A1FF002790F6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
D020F64229E4A1FF002790F6 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
|
@ -62,7 +63,6 @@
|
||||||
D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; };
|
D020F66929E4AA74002790F6 /* App-macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App-macOS.entitlements"; sourceTree = "<group>"; };
|
||||||
D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
D05B9F7229E39EEC008CB1F9 /* Burrow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Burrow.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; };
|
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurrowApp.swift; sourceTree = "<group>"; };
|
||||||
D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelView.swift; sourceTree = "<group>"; };
|
|
||||||
D05B9F7929E39EED008CB1F9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
D05B9F7929E39EED008CB1F9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
D0B98FBF29FD8072004E7149 /* build-rust.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-rust.sh"; sourceTree = "<group>"; };
|
D0B98FBF29FD8072004E7149 /* build-rust.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "build-rust.sh"; sourceTree = "<group>"; };
|
||||||
D0B98FC629FDC5B5004E7149 /* Tunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tunnel.swift; sourceTree = "<group>"; };
|
D0B98FC629FDC5B5004E7149 /* Tunnel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tunnel.swift; sourceTree = "<group>"; };
|
||||||
|
|
@ -96,6 +96,7 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
43AA26D72A10004900F14CE6 /* MenuView.swift */,
|
43AA26D72A10004900F14CE6 /* MenuView.swift */,
|
||||||
|
91D80FC62A20615500952E28 /* OnboardingView.swift */,
|
||||||
);
|
);
|
||||||
path = Menu;
|
path = Menu;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
@ -149,7 +150,6 @@
|
||||||
children = (
|
children = (
|
||||||
43AA26D62A0FFFD000F14CE6 /* Menu */,
|
43AA26D62A0FFFD000F14CE6 /* Menu */,
|
||||||
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */,
|
D05B9F7529E39EEC008CB1F9 /* BurrowApp.swift */,
|
||||||
D05B9F7729E39EEC008CB1F9 /* TunnelView.swift */,
|
|
||||||
D0B98FC629FDC5B5004E7149 /* Tunnel.swift */,
|
D0B98FC629FDC5B5004E7149 /* Tunnel.swift */,
|
||||||
D0BCC5FE2A086E1C00AD070D /* Status.swift */,
|
D0BCC5FE2A086E1C00AD070D /* Status.swift */,
|
||||||
D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */,
|
D0BCC5FC2A086D4700AD070D /* NetworkExtension+Async.swift */,
|
||||||
|
|
@ -311,10 +311,10 @@
|
||||||
files = (
|
files = (
|
||||||
D0BCC6082A0981FE00AD070D /* Tunnel.swift in Sources */,
|
D0BCC6082A0981FE00AD070D /* Tunnel.swift in Sources */,
|
||||||
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */,
|
43AA26D82A10004900F14CE6 /* MenuView.swift in Sources */,
|
||||||
D05B9F7829E39EEC008CB1F9 /* TunnelView.swift in Sources */,
|
|
||||||
D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */,
|
D0BCC5FF2A086E1C00AD070D /* Status.swift in Sources */,
|
||||||
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */,
|
D05B9F7629E39EEC008CB1F9 /* BurrowApp.swift in Sources */,
|
||||||
D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */,
|
D0BCC5FD2A086D4700AD070D /* NetworkExtension+Async.swift in Sources */,
|
||||||
|
91D80FC72A20615500952E28 /* OnboardingView.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -377,6 +377,10 @@
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */;
|
baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = Burrow;
|
||||||
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||||
|
INFOPLIST_KEY_LSUIElement = YES;
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Hack Club";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
|
|
@ -384,6 +388,10 @@
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */;
|
baseConfigurationReference = D020F64929E4A34B002790F6 /* App.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = Burrow;
|
||||||
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||||
|
INFOPLIST_KEY_LSUIElement = YES;
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Hack Club";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict/>
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>$(INFOPLIST_KEY_CFBundleDisplayName)</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue