2023-02-18 06:26:48 +00:00
|
|
|
import DesignSystem
|
2023-02-17 12:30:56 +00:00
|
|
|
import Env
|
|
|
|
import Models
|
2023-02-18 06:26:48 +00:00
|
|
|
import SwiftUI
|
2023-02-17 12:30:56 +00:00
|
|
|
|
|
|
|
struct StatusRowSwipeView: View {
|
|
|
|
@EnvironmentObject private var theme: Theme
|
|
|
|
@EnvironmentObject private var preferences: UserPreferences
|
2023-02-22 11:49:36 +00:00
|
|
|
@EnvironmentObject private var currentAccount: CurrentAccount
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
enum Mode {
|
|
|
|
case leading, trailing
|
|
|
|
}
|
2023-02-22 18:09:39 +00:00
|
|
|
|
2023-02-22 11:49:36 +00:00
|
|
|
func privateBoost() -> Bool {
|
|
|
|
return viewModel.status.visibility == .priv && viewModel.status.account.id == currentAccount.account?.id
|
|
|
|
}
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
let viewModel: StatusRowViewModel
|
|
|
|
let mode: Mode
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
var body: some View {
|
|
|
|
switch mode {
|
|
|
|
case .leading:
|
|
|
|
leadingSwipeActions
|
|
|
|
case .trailing:
|
|
|
|
trailingSwipeActions
|
|
|
|
}
|
|
|
|
}
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
@ViewBuilder
|
|
|
|
private var trailingSwipeActions: some View {
|
|
|
|
if preferences.swipeActionsStatusTrailingRight != StatusAction.none, !viewModel.isRemote {
|
|
|
|
makeSwipeButton(action: preferences.swipeActionsStatusTrailingRight)
|
|
|
|
.tint(preferences.swipeActionsStatusTrailingRight.color(themeTintColor: theme.tintColor, useThemeColor: preferences.swipeActionsUseThemeColor, outside: true))
|
|
|
|
}
|
|
|
|
if preferences.swipeActionsStatusTrailingLeft != StatusAction.none, !viewModel.isRemote {
|
|
|
|
makeSwipeButton(action: preferences.swipeActionsStatusTrailingLeft)
|
|
|
|
.tint(preferences.swipeActionsStatusTrailingLeft.color(themeTintColor: theme.tintColor, useThemeColor: preferences.swipeActionsUseThemeColor, outside: false))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ViewBuilder
|
|
|
|
private var leadingSwipeActions: some View {
|
|
|
|
if preferences.swipeActionsStatusLeadingLeft != StatusAction.none, !viewModel.isRemote {
|
|
|
|
makeSwipeButton(action: preferences.swipeActionsStatusLeadingLeft)
|
|
|
|
.tint(preferences.swipeActionsStatusLeadingLeft.color(themeTintColor: theme.tintColor, useThemeColor: preferences.swipeActionsUseThemeColor, outside: true))
|
|
|
|
}
|
|
|
|
if preferences.swipeActionsStatusLeadingRight != StatusAction.none, !viewModel.isRemote {
|
|
|
|
makeSwipeButton(action: preferences.swipeActionsStatusLeadingRight)
|
|
|
|
.tint(preferences.swipeActionsStatusLeadingRight.color(themeTintColor: theme.tintColor, useThemeColor: preferences.swipeActionsUseThemeColor, outside: false))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ViewBuilder
|
|
|
|
private func makeSwipeButton(action: StatusAction) -> some View {
|
|
|
|
switch action {
|
|
|
|
case .reply:
|
|
|
|
makeSwipeButtonForRouterPath(action: action, destination: .replyToStatusEditor(status: viewModel.status))
|
|
|
|
case .quote:
|
|
|
|
makeSwipeButtonForRouterPath(action: action, destination: .quoteStatusEditor(status: viewModel.status))
|
|
|
|
case .favorite:
|
|
|
|
makeSwipeButtonForTask(action: action) {
|
|
|
|
if viewModel.isFavorited {
|
|
|
|
await viewModel.unFavorite()
|
|
|
|
} else {
|
|
|
|
await viewModel.favorite()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case .boost:
|
2023-02-22 11:49:36 +00:00
|
|
|
makeSwipeButtonForTask(action: action, privateBoost: privateBoost()) {
|
2023-02-17 12:30:56 +00:00
|
|
|
if viewModel.isReblogged {
|
|
|
|
await viewModel.unReblog()
|
|
|
|
} else {
|
|
|
|
await viewModel.reblog()
|
|
|
|
}
|
|
|
|
}
|
2023-02-22 11:49:36 +00:00
|
|
|
.disabled(viewModel.status.visibility == .direct || viewModel.status.visibility == .priv && viewModel.status.account.id != currentAccount.account?.id)
|
2023-02-17 12:30:56 +00:00
|
|
|
case .bookmark:
|
|
|
|
makeSwipeButtonForTask(action: action) {
|
|
|
|
if viewModel.isBookmarked {
|
|
|
|
await viewModel.unbookmark()
|
|
|
|
} else {
|
|
|
|
await
|
|
|
|
viewModel.bookmark()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case .none:
|
|
|
|
EmptyView()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ViewBuilder
|
2023-02-21 17:52:30 +00:00
|
|
|
private func makeSwipeButtonForRouterPath(action: StatusAction, destination: SheetDestination) -> some View {
|
2023-02-17 12:30:56 +00:00
|
|
|
Button {
|
|
|
|
HapticManager.shared.fireHaptic(of: .notification(.success))
|
|
|
|
viewModel.routerPath.presentedSheet = destination
|
|
|
|
} label: {
|
|
|
|
makeSwipeLabel(action: action, style: preferences.swipeActionsIconStyle)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ViewBuilder
|
2023-02-22 11:49:36 +00:00
|
|
|
private func makeSwipeButtonForTask(action: StatusAction, privateBoost: Bool = false, task: @escaping () async -> Void) -> some View {
|
2023-02-17 12:30:56 +00:00
|
|
|
Button {
|
|
|
|
Task {
|
|
|
|
HapticManager.shared.fireHaptic(of: .notification(.success))
|
|
|
|
await task()
|
|
|
|
}
|
|
|
|
} label: {
|
2023-02-22 11:49:36 +00:00
|
|
|
makeSwipeLabel(action: action, style: preferences.swipeActionsIconStyle, privateBoost: privateBoost)
|
2023-02-17 12:30:56 +00:00
|
|
|
}
|
|
|
|
}
|
2023-02-18 06:26:48 +00:00
|
|
|
|
2023-02-17 12:30:56 +00:00
|
|
|
@ViewBuilder
|
2023-02-22 11:49:36 +00:00
|
|
|
private func makeSwipeLabel(action: StatusAction, style: UserPreferences.SwipeActionsIconStyle, privateBoost: Bool = false) -> some View {
|
2023-02-18 06:26:48 +00:00
|
|
|
switch style {
|
2023-02-17 12:30:56 +00:00
|
|
|
case .iconOnly:
|
2023-02-22 11:49:36 +00:00
|
|
|
Label(action.displayName(isReblogged: viewModel.isReblogged, isFavorited: viewModel.isFavorited, isBookmarked: viewModel.isBookmarked, privateBoost: privateBoost), systemImage: action.iconName(isReblogged: viewModel.isReblogged, isFavorited: viewModel.isFavorited, isBookmarked: viewModel.isBookmarked, privateBoost: privateBoost))
|
2023-02-17 12:30:56 +00:00
|
|
|
.labelStyle(.iconOnly)
|
|
|
|
.environment(\.symbolVariants, .none)
|
|
|
|
case .iconWithText:
|
2023-02-22 11:49:36 +00:00
|
|
|
Label(action.displayName(isReblogged: viewModel.isReblogged, isFavorited: viewModel.isFavorited, isBookmarked: viewModel.isBookmarked, privateBoost: privateBoost), systemImage: action.iconName(isReblogged: viewModel.isReblogged, isFavorited: viewModel.isFavorited, isBookmarked: viewModel.isBookmarked, privateBoost: privateBoost))
|
2023-02-17 12:30:56 +00:00
|
|
|
.labelStyle(.titleAndIcon)
|
|
|
|
.environment(\.symbolVariants, .none)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|