Skip to content

Commit

Permalink
Improve debug menu (#22250)
Browse files Browse the repository at this point in the history
  • Loading branch information
kean authored Dec 21, 2023
2 parents 91ff1ea + 5e77085 commit 2b6639d
Show file tree
Hide file tree
Showing 9 changed files with 339 additions and 324 deletions.
1 change: 1 addition & 0 deletions WordPress/Classes/System/WordPress-Bridging-Header.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@
#import "WPAnimatedBox.h"
#import "WPAnalyticsTrackerWPCom.h"
#import "WPAppAnalytics.h"
#import "WPAnalyticsTrackerAutomatticTracks.h"
#import "WPAuthTokenIssueSolver.h"
#import "WPBlogTableViewCell.h"
#import "WPUploadStatusButton.h"
Expand Down
1 change: 0 additions & 1 deletion WordPress/Classes/System/WordPressAppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -889,7 +889,6 @@ extension WordPressAppDelegate {
WPStyleGuide.configureLightNavigationBarAppearance()
WPStyleGuide.configureToolbarAppearance()

UISegmentedControl.appearance().setTitleTextAttributes( [NSAttributedString.Key.font: WPStyleGuide.regularTextFont()], for: .normal)
UISwitch.appearance().onTintColor = .primary

let navReferenceAppearance = UINavigationBar.appearance(whenContainedInInstancesOf: [UIReferenceLibraryViewController.self])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ class AppSettingsViewController: UITableViewController {

func pushDebugMenu() -> ImmuTableAction {
return { [weak self] row in
let controller = DebugMenuViewController(style: .insetGrouped)
let controller = DebugMenuViewController()
self?.navigationController?.pushViewController(controller, animated: true)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ struct DebugFeatureFlagsView: View {
}
.tint(Color(UIColor.jetpackGreen))
.listStyle(.grouped)
.searchable(text: $viewModel.filterTerm)
.searchable(text: $viewModel.filterTerm, placement: .navigationBarDrawer(displayMode: .always))
.navigationTitle(navigationTitle)
.navigationBarTitleDisplayMode(.inline)
.apply(addToolbarTitleMenu)
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import SwiftUI

struct RemoteConfigDebugView: View {
@StateObject private var viewModel = RemoteConfigDebugViewModel()

var body: some View {
List {
listContent
}
.listStyle(.plain)
.searchable(text: $viewModel.searchText, placement: .navigationBarDrawer(displayMode: .always))
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(Strings.reset, action: viewModel.resetAll)
}
}
.navigationTitle(Strings.title)
}

@ViewBuilder private var listContent: some View {
ForEach(viewModel.parameters, id: \.self) { parameter in
let (value, isOverriden) = viewModel.getValue(for: parameter)
NavigationLink {
RemoteConfigEditorView(viewModel: viewModel, parameter: parameter)
} label: {
RemoteConfigDebugRow(title: parameter.description, value: value ?? "", isOverriden: isOverriden)
}
}
}
}

private struct RemoteConfigDebugRow: View {
let title: String
let value: String
var isOverriden = false

var body: some View {
HStack {
VStack(alignment: .leading, spacing: 4) {
HStack {
Text(title)
if isOverriden {
Circle()
.frame(width: 8, height: 8)
.foregroundStyle(.blue)
}
}
Text(value)
.font(.caption)
.foregroundStyle(.secondary)
}
}
}
}

private struct RemoteConfigEditorView: View {
@ObservedObject var viewModel: RemoteConfigDebugViewModel
let parameter: RemoteConfigParameter

@FocusState private var isTextFieldFocused: Bool
private var store: RemoteConfigStore { viewModel.store }

var body: some View {
List {
let binding = viewModel.binding(for: parameter)
Section(Strings.overridenValue) {
TextField(viewModel.getOriginalValue(for: parameter) ?? "", text: binding)
.focused($isTextFieldFocused, equals: true)
Button(Strings.reset, role: .destructive) {
viewModel.reset(parameter)
}.disabled(binding.wrappedValue.isEmpty)
}
Section {
let value = store.value(for: parameter.key).map { String(describing: $0) }
RemoteConfigDebugRow(title: Strings.currentValue, value: viewModel.getValue(for: parameter).value ?? "")
RemoteConfigDebugRow(title: Strings.remoteConfigValue, value: value ?? "")
RemoteConfigDebugRow(title: Strings.defaultValue, value: parameter.defaultValue?.description ?? "")
}
}
.onAppear { isTextFieldFocused = true }
.navigationTitle(parameter.description)
}
}

private final class RemoteConfigDebugViewModel: ObservableObject {
@Published var parameters: [RemoteConfigParameter] = []
@Published var searchText = "" {
didSet { reload() }
}

let store = RemoteConfigStore()
let overrideStore = RemoteConfigOverrideStore()

init() {
reload()
}

func binding(for parameter: RemoteConfigParameter) -> Binding<String> {
Binding(get: {
self.overrideStore.overriddenValue(for: parameter) ?? ""
}, set: {
if $0.isEmpty {
self.overrideStore.reset(parameter)
} else {
self.overrideStore.override(parameter, withValue: $0)
}
self.objectWillChange.send()
})
}

func getOriginalValue(for parameter: RemoteConfigParameter) -> String? {
parameter.originalValue(using: store).map { String(describing: $0) }
}

func getValue(for parameter: RemoteConfigParameter) -> (value: String?, isOverriden: Bool) {
let overridenValue = overrideStore.overriddenValue(for: parameter)
let value = overridenValue ?? getOriginalValue(for: parameter)
return (value, overridenValue != nil)
}

func reset(_ parameter: RemoteConfigParameter) {
overrideStore.reset(parameter)
objectWillChange.send()
}

func resetAll() {
RemoteConfigParameter.allCases.forEach(reset)
}

private func reload() {
parameters = RemoteConfigParameter.allCases.filter {
guard !searchText.isEmpty else { return true }
return $0.description.localizedCaseInsensitiveContains(searchText)
}
}
}

private enum Strings {
static let title = NSLocalizedString("debugMenu.remoteConfig.title", value: "Remote Config", comment: "Remote Config Debug Menu screen title")
static let reset = NSLocalizedString("debugMenu.remoteConfig.reset", value: "Reset", comment: "Remote Config Debug Menu reset button title")
static let overridenValue = NSLocalizedString("debugMenu.remoteConfig.overridenValue", value: "Remote Config", comment: "Remote Config Debug Menu section title")
static let currentValue = NSLocalizedString("debugMenu.remoteConfig.currentValue", value: "Current Value", comment: "Remote Config Debug Menu section title")
static let remoteConfigValue = NSLocalizedString("debugMenu.remoteConfig.remoteConfigValue", value: "Remote Config Value", comment: "Remote Config Debug Menu section title")
static let defaultValue = NSLocalizedString("debugMenu.remoteConfig.defaultValue", value: "Default Value", comment: "Remote Config Debug Menu section title")
}

private extension RemoteConfigParameter {
func originalValue(using store: RemoteConfigStore = .init()) -> Any? {
if let value = store.value(for: key) {
return value
}
return defaultValue
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -268,12 +268,6 @@ extension WPStyleGuide {
return (approved ? blockLinkColor : blockUnapprovedLinkColor)
}

// Filters Helpers
public static func configureSegmentedControl(_ segmentedControl: UISegmentedControl) {
let style = [ NSAttributedString.Key.font: WPFontManager.systemRegularFont(ofSize: 12) ]
segmentedControl.setTitleTextAttributes(style, for: UIControl.State())
}

// User Cell Helpers
public static func configureFollowButton(_ button: UIButton) {
// General
Expand Down
Loading

0 comments on commit 2b6639d

Please sign in to comment.