mirror of https://github.com/lukechilds/damus.git
committed by
William Casarin
11 changed files with 290 additions and 77 deletions
@ -0,0 +1,25 @@ |
|||
// |
|||
// DamusViewModel.swift |
|||
// damus |
|||
// |
|||
// Created by Sam DuBois on 12/21/22. |
|||
// |
|||
|
|||
import SwiftUI |
|||
|
|||
class DamusViewModel: ObservableObject { |
|||
@Published var status: String = "Not connected" |
|||
@Published var active_sheet: Sheets? = nil |
|||
@Published var damus_state: DamusState? = nil |
|||
@Published var selected_timeline: Timeline? = .home |
|||
@Published var is_thread_open: Bool = false |
|||
@Published var is_profile_open: Bool = false |
|||
@Published var event: NostrEvent? = nil |
|||
@Published var active_profile: String? = nil |
|||
@Published var active_search: NostrFilter? = nil |
|||
@Published var active_event_id: String? = nil |
|||
@Published var profile_open: Bool = false |
|||
@Published var thread_open: Bool = false |
|||
@Published var search_open: Bool = false |
|||
@Published var filter_state : FilterState = .posts_and_replies |
|||
} |
@ -0,0 +1,41 @@ |
|||
// |
|||
// EditAccountButton.swift |
|||
// damus |
|||
// |
|||
// Created by Sam DuBois on 12/21/22. |
|||
// |
|||
|
|||
import SwiftUI |
|||
|
|||
struct EditAccountButton: View { |
|||
|
|||
@EnvironmentObject var viewModel: DamusViewModel |
|||
|
|||
@State private var presentEditAccountView: Bool = false |
|||
|
|||
var body: some View { |
|||
Button { |
|||
presentEditAccountView.toggle() |
|||
} label: { |
|||
Text("Edit") |
|||
.padding(.horizontal, 20) |
|||
.padding(.vertical, 7) |
|||
.font(.caption.weight(.bold)) |
|||
.foregroundColor(.white) |
|||
.background(viewModel.damus_state != nil ? hex_to_rgb(viewModel.damus_state!.pubkey) : .black) |
|||
.cornerRadius(20) |
|||
} |
|||
.sheet(isPresented: $presentEditAccountView, content: { |
|||
EditAccountView() |
|||
}) |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
struct EditAccountButton_Previews: PreviewProvider { |
|||
static var previews: some View { |
|||
EditAccountButton() |
|||
.environmentObject(DamusViewModel()) |
|||
} |
|||
} |
@ -0,0 +1,122 @@ |
|||
// |
|||
// EditAccountView.swift |
|||
// damus |
|||
// |
|||
// Created by Sam DuBois on 12/20/22. |
|||
// |
|||
|
|||
import SwiftUI |
|||
|
|||
struct EditAccountView: View { |
|||
|
|||
@EnvironmentObject var viewModel: DamusViewModel |
|||
@Environment(\.dismiss) var dismiss |
|||
|
|||
@State var account: AccountModel = AccountModel() |
|||
@State var loading: Bool = true |
|||
@State var error: Error? |
|||
|
|||
var body: some View { |
|||
NavigationView { |
|||
if let state = viewModel.damus_state, !loading { |
|||
Form { |
|||
HStack { |
|||
Spacer() |
|||
ProfilePicView(pubkey: state.pubkey, size: 100, highlight: .main, profiles: state.profiles) |
|||
Spacer() |
|||
} |
|||
.listRowBackground(Color.clear) |
|||
|
|||
Section(header: Text("Photo")) { |
|||
TextField("Photo URL", text: $account.picture) |
|||
} |
|||
|
|||
Section(header: Text("Details")) { |
|||
TextField("Username", text: $account.real_name) |
|||
TextField("Personal Name", text: $account.nick_name) |
|||
TextEditor(text: $account.about) |
|||
.frame(height: 150) |
|||
|
|||
} |
|||
|
|||
Section(header: Text("Keys")) { |
|||
TextField("Public Key", text: .constant(account.keypair.pubkey)) |
|||
TextField("Secret Key", text: .constant(account.keypair.privkey ?? "")) |
|||
} |
|||
} |
|||
.toolbar { |
|||
ToolbarItem(placement: .confirmationAction) { |
|||
Button { |
|||
self.loading = true |
|||
viewModel.damus_state!.pool.register_handler(sub_id: "editaccount", handler: handle_event) |
|||
viewModel.damus_state!.pool.connect() |
|||
} label: { |
|||
Text("Save") |
|||
} |
|||
} |
|||
ToolbarItem(placement: .cancellationAction) { |
|||
Button { |
|||
dismiss() |
|||
} label: { |
|||
Text("Cancel") |
|||
} |
|||
} |
|||
} |
|||
} else { |
|||
ProgressView() |
|||
} |
|||
} |
|||
.onAppear { |
|||
if let state = viewModel.damus_state { |
|||
|
|||
guard let profile = state.profiles.lookup(id: state.pubkey) else { return } |
|||
|
|||
account = AccountModel(keys: state.keypair, real: profile.display_name ?? "", user: profile.name ?? "", about: profile.about ?? "", picture: profile.picture ?? "") |
|||
|
|||
loading = false |
|||
} |
|||
} |
|||
} |
|||
|
|||
func handle_event(relay: String, ev: NostrConnectionEvent) { |
|||
switch ev { |
|||
case .ws_event(let wsev): |
|||
switch wsev { |
|||
case .connected: |
|||
let metadata = account_to_metadata(account) |
|||
let m_metadata_ev = make_metadata_event(keypair: account.keypair, metadata: metadata) |
|||
|
|||
if let state = viewModel.damus_state { |
|||
if let metadata_ev = m_metadata_ev { |
|||
state.pool.send(.event(metadata_ev)) |
|||
} |
|||
} |
|||
|
|||
case .error(let error): |
|||
self.loading = false |
|||
print(error) |
|||
default: |
|||
dismiss() |
|||
} |
|||
case .nostr_event(let resp): |
|||
switch resp { |
|||
case .notice(let msg): |
|||
// TODO handle message |
|||
// self.loading = false |
|||
// self.error = msg |
|||
print(msg) |
|||
case .event: |
|||
print("event in account edit request?") |
|||
case .eose: |
|||
break |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
struct EditAccountView_Previews: PreviewProvider { |
|||
static var previews: some View { |
|||
EditAccountView() |
|||
.environmentObject(DamusViewModel()) |
|||
} |
|||
} |
Loading…
Reference in new issue