61 lines
1.9 KiB
Swift
61 lines
1.9 KiB
Swift
//
|
|
// DebugMenu.swift
|
|
// secant-testnet
|
|
//
|
|
// Created by Lukáš Korba on 15.04.2022.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
// TODO: Make sure this code will never be in the production (app store) build, issue 273 (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()
|
|
}
|
|
)
|
|
}
|
|
}
|