mastodon-ios/Mastodon/Scene/Report/ReportResult/ReportResultView.swift

224 lines
8.8 KiB
Swift

//
// ReportResultView.swift
// Mastodon
//
// Created by MainasuK on 2022-5-11.
//
import UIKit
import SwiftUI
import MastodonSDK
import MastodonAsset
import MastodonCore
import MastodonUI
import MastodonLocalization
import CoreDataStack
struct ReportResultView: View {
@ObservedObject var viewModel: ReportResultViewModel
var avatarView: some View {
HStack {
Spacer()
ZStack {
AnimatedImage(imageURL: viewModel.avatarURL)
.frame(width: 106, height: 106, alignment: .center)
.background(Color(UIColor.systemFill))
.cornerRadius(27)
Text(L10n.Scene.Report.reported)
.font(Font(FontFamily.Staatliches.regular.font(size: 49) as CTFont))
.foregroundColor(Color(Asset.Scene.Report.reportBanner.color))
.padding(EdgeInsets(top: 0, leading: 10, bottom: -2, trailing: 10))
.background(Color(viewModel.backgroundColor))
.cornerRadius(7)
.padding(7)
.background(Color(Asset.Scene.Report.reportBanner.color))
.cornerRadius(12)
.rotationEffect(.degrees(-8))
.offset(x: 0, y: -5)
}
Spacer()
}
.padding()
}
var body: some View {
ScrollView(.vertical) {
HStack {
VStack(alignment: .leading, spacing: 8) {
Text(viewModel.headline)
.foregroundColor(Color(Asset.Colors.Label.primary.color))
.font(Font(UIFontMetrics(forTextStyle: .largeTitle).scaledFont(for: .systemFont(ofSize: 28, weight: .bold)) as CTFont))
if viewModel.isReported {
avatarView
Text(verbatim: L10n.Scene.Report.StepFinal.whileWeReviewThisYouCanTakeActionAgainstUser("@\(viewModel.username)"))
.foregroundColor(Color(Asset.Colors.Label.secondary.color))
.font(Font(UIFontMetrics(forTextStyle: .largeTitle).scaledFont(for: .systemFont(ofSize: 17, weight: .regular)) as CTFont))
} else {
Text(verbatim: L10n.Scene.Report.StepFinal.whenYouSeeSomethingYouDontLikeOnMastodonYouCanRemoveThePersonFromYourExperience)
.foregroundColor(Color(Asset.Colors.Label.secondary.color))
.font(Font(UIFontMetrics(forTextStyle: .largeTitle).scaledFont(for: .systemFont(ofSize: 17, weight: .regular)) as CTFont))
}
}
Spacer()
}
.padding()
VStack(spacing: 32) {
// Follow
VStack(alignment: .leading, spacing: 4) {
Text(L10n.Scene.Report.StepFinal.unfollowUser("@\(viewModel.username)"))
.font(.headline)
.foregroundColor(Color(Asset.Colors.Label.primary.color))
ReportActionButton(
action: {
viewModel.followActionPublisher.send()
},
title: viewModel.relationshipViewModel.isFollowing ? L10n.Scene.Report.StepFinal.unfollow : L10n.Scene.Report.StepFinal.unfollowed,
isBusy: viewModel.isRequestFollow
)
}
// Mute
VStack(alignment: .leading, spacing: 4) {
Text(L10n.Scene.Report.StepFinal.muteUser("@\(viewModel.username)"))
.font(.headline)
.foregroundColor(Color(Asset.Colors.Label.primary.color))
Text(verbatim: L10n.Scene.Report.StepFinal.youWontSeeTheirPostsOrReblogsInYourHomeFeedTheyWontKnowTheyVeBeenMuted)
.foregroundColor(Color(Asset.Colors.Label.secondary.color))
.font(Font(UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: .systemFont(ofSize: 13, weight: .regular)) as CTFont))
ReportActionButton(
action: {
viewModel.muteActionPublisher.send()
},
title: viewModel.relationshipViewModel.isMuting ? L10n.Common.Controls.Friendship.muted : L10n.Common.Controls.Friendship.mute,
isBusy: viewModel.isRequestMute
)
}
// Block
VStack(alignment: .leading, spacing: 4) {
Text(L10n.Scene.Report.StepFinal.blockUser("@\(viewModel.username)"))
.font(.headline)
.foregroundColor(Color(Asset.Colors.Label.primary.color))
Text(verbatim: L10n.Scene.Report.StepFinal.theyWillNoLongerBeAbleToFollowOrSeeYourPostsButTheyCanSeeIfTheyveBeenBlocked)
.foregroundColor(Color(Asset.Colors.Label.secondary.color))
.font(Font(UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: .systemFont(ofSize: 13, weight: .regular)) as CTFont))
ReportActionButton(
action: {
viewModel.blockActionPublisher.send()
},
title: viewModel.relationshipViewModel.isBlocking ? L10n.Common.Controls.Friendship.blocked : L10n.Common.Controls.Friendship.block,
isBusy: viewModel.isRequestBlock
)
}
}
.padding()
Spacer()
.frame(minHeight: viewModel.bottomPaddingHeight)
}
.background(
Color(viewModel.backgroundColor)
)
}
}
struct ReportActionButton: View {
var action: () -> Void
var title: String
var isBusy: Bool
var body: some View {
Button {
action()
} label: {
ZStack {
ProgressView()
.opacity(isBusy ? 1 : 0)
.progressViewStyle(CircularProgressViewStyle(tint: .gray))
Text(title)
.font(.headline)
.foregroundColor(Color(UIColor.black))
.opacity(isBusy ? 0 : 1)
}
.frame(maxWidth: .infinity)
.padding()
.background(Color(UIColor.white)) // using white for Light & Dark
.cornerRadius(10)
.shadow(color: .black.opacity(0.1), radius: 2, x: 0, y: 1)
}
}
}
//#if DEBUG
//
//struct ReportResultView_Previews: PreviewProvider {
//
// static func viewModel(isReported: Bool) -> ReportResultViewModel {
// let context = AppContext.shared
// let request = MastodonUser.sortedFetchRequest
// request.fetchLimit = 1
//
// let property = MastodonUser.Property(
// identifier: "1",
// domain: "domain.com",
// id: "1",
// acct: "@user@domain.com",
// username: "user",
// displayName: "User",
// avatar: "",
// avatarStatic: "",
// header: "",
// headerStatic: "",
// note: "",
// url: "",
// statusesCount: Int64(100),
// followingCount: Int64(100),
// followersCount: Int64(100),
// locked: false,
// bot: false,
// suspended: false,
// createdAt: Date(),
// updatedAt: Date(),
// emojis: [],
// fields: []
// )
// let user = try! context.managedObjectContext.fetch(request).first ?? MastodonUser.insert(into: context.managedObjectContext, property: property)
//
// return ReportResultViewModel(
// context: context,
// authContext: nil,
// user: .init(objectID: user.objectID),
// isReported: isReported
// )
// }
// static var previews: some View {
// Group {
// NavigationView {
// ReportResultView(viewModel: viewModel(isReported: true))
// .navigationBarTitle(Text(""))
// .navigationBarTitleDisplayMode(.inline)
// }
// NavigationView {
// ReportResultView(viewModel: viewModel(isReported: false))
// .navigationBarTitle(Text(""))
// .navigationBarTitleDisplayMode(.inline)
// }
// NavigationView {
// ReportResultView(viewModel: viewModel(isReported: true))
// .navigationBarTitle(Text(""))
// .navigationBarTitleDisplayMode(.inline)
// }
// .preferredColorScheme(.dark)
// }
// }
//
//}
//
//#endif