diff --git a/Packages/Lists/Sources/Lists/Edit/ListEditView.swift b/Packages/Lists/Sources/Lists/Edit/ListEditView.swift index f45323ce..635a45d9 100644 --- a/Packages/Lists/Sources/Lists/Edit/ListEditView.swift +++ b/Packages/Lists/Sources/Lists/Edit/ListEditView.swift @@ -72,8 +72,17 @@ public struct ListEditView: View { .background(theme.secondaryBackgroundColor) .toolbar { ToolbarItem { - Button("action.done") { - dismiss() + Button { + Task { + await viewModel.update() + dismiss() + } + } label: { + if viewModel.isUpdating { + ProgressView() + } else { + Text("action.done") + } } } } diff --git a/Packages/Timeline/Sources/Timeline/View/TimelineQuickAccessPills.swift b/Packages/Timeline/Sources/Timeline/View/TimelineQuickAccessPills.swift index af782fa9..5c197944 100644 --- a/Packages/Timeline/Sources/Timeline/View/TimelineQuickAccessPills.swift +++ b/Packages/Timeline/Sources/Timeline/View/TimelineQuickAccessPills.swift @@ -2,9 +2,11 @@ import SwiftUI import Env import Models import DesignSystem +import Network @MainActor struct TimelineQuickAccessPills: View { + @Environment(Client.self) private var client @Environment(Theme.self) private var theme @Environment(CurrentAccount.self) private var currentAccount @@ -23,11 +25,28 @@ struct TimelineQuickAccessPills: View { } .scrollClipDisabled() .scrollIndicators(.never) + .onChange(of: currentAccount.lists, { _, lists in + guard client.isAuth else { return } + var filters = pinnedFilters + for (index, filter) in filters.enumerated() { + switch filter { + case .list(let list): + if let accountList = lists.first(where: { $0.id == list.id }), + accountList.title != list.title { + filters[index] = .list(list: accountList) + } + default: + break + } + } + pinnedFilters = filters + }) + } @ViewBuilder private func makePill(_ filter: TimelineFilter) -> some View { - if !isFilterSupport(filter) { + if !isFilterSupported(filter) { EmptyView() } else if filter == timeline { makeButton(filter) @@ -47,6 +66,11 @@ struct TimelineQuickAccessPills: View { Label(filter.title.replacingOccurrences(of: "#", with: ""), systemImage: filter.iconName()) .font(.callout) + case let .list(list): + if let list = currentAccount.lists.first(where: { $0.id == list.id }) { + Label(list.title, systemImage: filter.iconName()) + .font(.callout) + } default: Label(filter.localizedTitle(), systemImage: filter.iconName()) .font(.callout) @@ -62,7 +86,7 @@ struct TimelineQuickAccessPills: View { draggedItem: $draggedFilter)) } - private func isFilterSupport(_ filter: TimelineFilter) -> Bool { + private func isFilterSupported(_ filter: TimelineFilter) -> Bool { switch filter { case .list(let list): return currentAccount.lists.contains(where: { $0.id == list.id }) diff --git a/Packages/Timeline/Sources/Timeline/View/TimelineView.swift b/Packages/Timeline/Sources/Timeline/View/TimelineView.swift index aca9aae5..cfd66714 100644 --- a/Packages/Timeline/Sources/Timeline/View/TimelineView.swift +++ b/Packages/Timeline/Sources/Timeline/View/TimelineView.swift @@ -140,6 +140,19 @@ public struct TimelineView: View { } } } + .onChange(of: account.lists, { _, lists in + guard client.isAuth else { return } + switch timeline { + case let .list(list): + if let accountList = lists.first(where: { $0.id == list.id }), + list.id == accountList.id, + accountList.title != list.title { + timeline = .list(list: accountList) + } + default: + break + } + }) .onChange(of: timeline) { _, newValue in switch newValue { case let .remoteLocal(server, _):