commit b25c20b4f35df866bfc43d44cdc78b9876b1b028 from: Oliver Lowe date: Sat Apr 23 03:53:30 2022 UTC add prototype swiftui app 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(_ 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