Commit Diff


commit - acca18c6e20774cb2f39457d1967704a4565dd43
commit + b25c20b4f35df866bfc43d44cdc78b9876b1b028
blob - /dev/null
blob + 193ee72409b8b2a15037f9abbe1ec93489efbd1e (mode 644)
--- /dev/null
+++ apple/Alias.swift
@@ -0,0 +1,10 @@
+import Foundation
+import SwiftUI
+
+struct Alias: Hashable, Codable, Identifiable {
+    var id: Int
+    var recipient: String
+    var destination: String
+    var expiry: String
+    var note: String
+}
\ No newline at end of file
blob - /dev/null
blob + ee70c2e55a9cdf49943c48ccf17bf8db1752792a (mode 644)
--- /dev/null
+++ apple/AliasApp.swift
@@ -0,0 +1,10 @@
+import SwiftUI
+
+@main
+struct AliasApp: App {
+    var body: some Scene {
+        WindowGroup {
+            ContentView()
+        }
+    }
+}
blob - /dev/null
blob + 1a4f6ecc8d51ee6db1cf36fd216aa631bcce0d71 (mode 644)
--- /dev/null
+++ apple/AliasData.swift
@@ -0,0 +1,25 @@
+import Foundation
+
+var aliases: [Alias] = load("aliases.json")
+
+func load<T: Decodable>(_ filename: String) -> T {
+    let data: Data
+
+    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
+        else {
+            fatalError("Couldn't find \(filename) in main bundle.")
+    }
+
+    do {
+        data = try Data(contentsOf: file)
+    } catch {
+        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
+    }
+
+    do {
+        let decoder = JSONDecoder()
+        return try decoder.decode(T.self, from: data)
+    } catch {
+        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
+    }
+}
blob - /dev/null
blob + 38af6c41384a010c8dfa4f15d470d4f0d35f4936 (mode 644)
--- /dev/null
+++ apple/AliasDetail.swift
@@ -0,0 +1,31 @@
+import SwiftUI
+
+struct AliasDetail: View {
+	var alias: Alias
+
+	var body: some View {
+		ScrollView {
+			VStack(alignment: .leading) {
+				Text(alias.recipient)
+					.font(.title)
+
+                HStack {
+                    Text("Delivers to \(alias.destination)")
+                    Spacer()
+                    Text("Expires \(alias.expiry)")
+                }
+                	.font(.subheadline)
+                	.foregroundColor(.secondary)
+
+                Divider()
+
+                Text("Note")
+                    .font(.title2)
+                Text(alias.note)
+            }
+            .padding()
+        }
+        .navigationTitle(alias.recipient)
+        .navigationBarTitleDisplayMode(.inline)
+    }
+}
\ No newline at end of file
blob - /dev/null
blob + 77b4451c90fc7372139d078016fe037b55378461 (mode 644)
--- /dev/null
+++ apple/AliasList.swift
@@ -0,0 +1,22 @@
+import SwiftUI
+
+struct AliasList: View {
+    var body: some View {
+        NavigationView {
+            List(aliases) { alias in
+                NavigationLink {
+                    AliasDetail(alias: alias)
+                } label: {
+                    AliasRow(alias: alias)
+                }
+            }
+            .navigationTitle("Aliases")
+        }
+    }
+}
+
+struct LandmarkList_Previews: PreviewProvider {
+    static var previews: some View {
+		AliasList()
+    }
+}
blob - /dev/null
blob + 39d0dd052dfbd852651230635bb6780dbd1337d3 (mode 644)
--- /dev/null
+++ apple/AliasRow.swift
@@ -0,0 +1,21 @@
+import SwiftUI
+
+struct AliasRow: View {
+    var alias: Alias
+
+	var body: some View {
+		HStack {
+			Text(alias.recipient)
+		}
+	}
+}
+
+struct LandmarkRow_Previews: PreviewProvider {
+	static var previews: some View {
+		Group {
+			AliasRow(alias: aliases[0])
+            AliasRow(alias: aliases[1])
+		}
+		.previewLayout(.fixed(width: 300, height: 70))
+	}
+}
blob - /dev/null
blob + a4fc745a011e67b81d1c1bc2732d56e8f5d55a15 (mode 644)
--- /dev/null
+++ apple/ContentView.swift
@@ -0,0 +1,13 @@
+import SwiftUI
+
+struct ContentView: View {
+    var body: some View {
+        AliasList()
+    }
+}
+
+struct ContentView_Previews: PreviewProvider {
+    static var previews: some View {
+        ContentView()
+    }
+}
blob - /dev/null
blob + 09888a84e017e83bc71e1e843ba854aad514ef1f (mode 644)
--- /dev/null
+++ apple/Login.swift
@@ -0,0 +1,13 @@
+import SwiftUI
+
+struct Login: View {
+	var body: some View {
+		Form {
+			TextField(text: $username, prompt: Text("me@example.com")) {
+				Text("Username")
+		}
+			SecureField(text: $password, prompt: Text("Required")) {
+				Text("Password")
+		}
+	}
+}
\ No newline at end of file
blob - /dev/null
blob + a8aba7b257748713587713472bae813d4ef56353 (mode 644)
--- /dev/null
+++ apple/README
@@ -0,0 +1,2 @@
+This is untested barebones SwiftUI code for creating a CRUD macOS, iOS, iPadOS
+app for mailmux.
blob - /dev/null
blob + aa73bf51dee87c2735db641552498e2e93b21b03 (mode 644)
--- /dev/null
+++ apple/aliases.json
@@ -0,0 +1,14 @@
+[
+    {
+        "Recipient": "windclothes_isoamarine17",
+        "Destination": "o@olowe.co",
+        "Expiry": "1970-01-01T00:00:00Z",
+        "Note": ""
+    },
+    {
+        "Recipient": "kotukutuku_cryptogamic30",
+        "Destination": "o@olowe.co",
+        "Expiry": "1970-01-01T00:00:00Z",
+        "Note": ""
+    }
+]
\ No newline at end of file