secant-ios-wallet/secant/Utils/DebugMenu.swift

61 lines
1.9 KiB
Swift

//
// DebugMenu.swift
// secant-testnet
//
// Created by Lukáš Korba on 15.04.2022.
//
import SwiftUI
// TODO: [#273] Make sure this code will never be in the production (app store) build (https://github.com/zcash/secant-ios-wallet/issues/273)
// swiftlint:disable:next private_over_fileprivate strict_fileprivate
fileprivate struct DebugMenuModifier: ViewModifier {
enum DragState {
case inactive
case pressing
case dragging(translation: CGSize)
}
@GestureState var dragState = DragState.inactive
var minimumDuration: Double
let action: () -> Void
func body(content: Content) -> some View {
let longPressDrag = LongPressGesture(minimumDuration: minimumDuration)
.sequenced(before: DragGesture())
.updating($dragState) { value, state, _ in
switch value {
// Long press begins.
case .first(true):
state = .pressing
// Long press confirmed, dragging may begin.
case .second(true, let drag):
state = .dragging(translation: drag?.translation ?? .zero)
// Dragging ended or the long press cancelled.
default:
state = .inactive
}
}
.onEnded { value in
guard case .second(true, let drag?) = value else { return }
if drag.translation.height > 0 {
action()
}
}
return content.gesture(longPressDrag)
}
}
extension View {
func accessDebugMenuWithHiddenGesture(minimumDuration: Double = 0.75, action: @escaping () -> Void ) -> some View {
self.modifier(
DebugMenuModifier(minimumDuration: minimumDuration) {
action()
}
)
}
}