commit - acca18c6e20774cb2f39457d1967704a4565dd43
commit + b25c20b4f35df866bfc43d44cdc78b9876b1b028
blob - /dev/null
blob + 193ee72409b8b2a15037f9abbe1ec93489efbd1e (mode 644)
--- /dev/null
+++ apple/Alias.swift
+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
+import SwiftUI
+
+@main
+struct AliasApp: App {
+ var body: some Scene {
+ WindowGroup {
+ ContentView()
+ }
+ }
+}
blob - /dev/null
blob + 1a4f6ecc8d51ee6db1cf36fd216aa631bcce0d71 (mode 644)
--- /dev/null
+++ apple/AliasData.swift
+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
+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
+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
+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
+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
+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
+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
+[
+ {
+ "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