6751bc15cc
This PR is a ux change to make the header, tabbar, and post button disappear when the user scrolls. The main tabbar is now an overlay which means it will display over views, this was needed in order to get the timeline to extend behind it. However, this mean we must add bottom padding to any view where the main tabbar is present to account for the overlap. Changelog-Added: Disappearing header, tabbar, and post button on scroll Signed-off-by: ericholguin <ericholguin@apache.org>
140 lines
5.5 KiB
Swift
140 lines
5.5 KiB
Swift
//
|
|
// MutelistView.swift
|
|
// damus
|
|
//
|
|
// Created by William Casarin on 2023-01-25.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct MutelistView: View {
|
|
let damus_state: DamusState
|
|
@State var show_add_muteitem: Bool = false
|
|
|
|
@State var users: [MuteItem] = []
|
|
@State var hashtags: [MuteItem] = []
|
|
@State var threads: [MuteItem] = []
|
|
@State var words: [MuteItem] = []
|
|
|
|
@State var new_text: String = ""
|
|
|
|
func RemoveAction(item: MuteItem) -> some View {
|
|
Button {
|
|
guard let mutelist = damus_state.mutelist_manager.event,
|
|
let keypair = damus_state.keypair.to_full(),
|
|
let new_ev = remove_from_mutelist(keypair: keypair,
|
|
prev: mutelist,
|
|
to_remove: item)
|
|
else {
|
|
return
|
|
}
|
|
|
|
damus_state.mutelist_manager.set_mutelist(new_ev)
|
|
damus_state.postbox.send(new_ev)
|
|
updateMuteItems()
|
|
} label: {
|
|
Label(NSLocalizedString("Delete", comment: "Button to remove a user from their mutelist."), image: "delete")
|
|
}
|
|
.tint(.red)
|
|
}
|
|
|
|
func updateMuteItems() {
|
|
users = Array(damus_state.mutelist_manager.users)
|
|
hashtags = Array(damus_state.mutelist_manager.hashtags)
|
|
threads = Array(damus_state.mutelist_manager.threads)
|
|
words = Array(damus_state.mutelist_manager.words)
|
|
}
|
|
|
|
var body: some View {
|
|
List {
|
|
Section(NSLocalizedString("Users", comment: "Section header title for a list of muted users.")) {
|
|
ForEach(users, id: \.self) { user in
|
|
if case let MuteItem.user(pubkey, _) = user {
|
|
UserViewRow(damus_state: damus_state, pubkey: pubkey)
|
|
.id(pubkey)
|
|
.swipeActions {
|
|
RemoveAction(item: .user(pubkey, nil))
|
|
}
|
|
.onTapGesture {
|
|
damus_state.nav.push(route: Route.ProfileByKey(pubkey: pubkey))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Section(NSLocalizedString("Hashtags", comment: "Section header title for a list of hashtags that are muted.")) {
|
|
ForEach(hashtags, id: \.self) { item in
|
|
if case let MuteItem.hashtag(hashtag, _) = item {
|
|
Text(verbatim: "#\(hashtag.hashtag)")
|
|
.id(hashtag.hashtag)
|
|
.swipeActions {
|
|
RemoveAction(item: .hashtag(hashtag, nil))
|
|
}
|
|
.onTapGesture {
|
|
damus_state.nav.push(route: Route.Search(search: SearchModel.init(state: damus_state, search: NostrFilter(hashtag: [hashtag.hashtag]))))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Section(NSLocalizedString("Words", comment: "Section header title for a list of words that are muted.")) {
|
|
ForEach(words, id: \.self) { item in
|
|
if case let MuteItem.word(word, _) = item {
|
|
Text(word)
|
|
.id(word)
|
|
.swipeActions {
|
|
RemoveAction(item: .word(word, nil))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Section(
|
|
header: Text(NSLocalizedString("Threads", comment: "Section header title for a list of threads that are muted.")),
|
|
footer: Text("").padding(.bottom, 10 + tabHeight + getSafeAreaBottom())
|
|
) {
|
|
ForEach(threads, id: \.self) { item in
|
|
if case let MuteItem.thread(note_id, _) = item {
|
|
if let event = damus_state.events.lookup(note_id) {
|
|
EventView(damus: damus_state, event: event)
|
|
.id(note_id.hex())
|
|
.swipeActions {
|
|
RemoveAction(item: .thread(note_id, nil))
|
|
}
|
|
} else {
|
|
Text("Error retrieving muted event", comment: "Text for an item that application failed to retrieve the muted event for.")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle(NSLocalizedString("Muted", comment: "Navigation title of view to see list of muted users & phrases."))
|
|
.onAppear {
|
|
updateMuteItems()
|
|
}
|
|
.onReceive(handle_notify(.new_mutes)) { new_mutes in
|
|
updateMuteItems()
|
|
}
|
|
.onReceive(handle_notify(.new_unmutes)) { new_unmutes in
|
|
updateMuteItems()
|
|
}
|
|
.toolbar {
|
|
ToolbarItem(placement: .topBarTrailing) {
|
|
Button {
|
|
self.show_add_muteitem = true
|
|
} label: {
|
|
Image(systemName: "plus")
|
|
}
|
|
}
|
|
}
|
|
.sheet(isPresented: $show_add_muteitem, onDismiss: { self.show_add_muteitem = false }) {
|
|
AddMuteItemView(state: damus_state, new_text: $new_text)
|
|
.presentationDetents([.height(300)])
|
|
.presentationDragIndicator(.visible)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct MutelistView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
MutelistView(damus_state: test_damus_state)
|
|
}
|
|
}
|