2022-02-18 06:06:17 -08:00
|
|
|
//
|
|
|
|
// WelcomeView.swift
|
|
|
|
// secant-testnet
|
|
|
|
//
|
|
|
|
// Created by Francisco Gindre on 1/6/22.
|
|
|
|
//
|
|
|
|
|
|
|
|
import SwiftUI
|
2022-04-04 04:23:57 -07:00
|
|
|
import ComposableArchitecture
|
2022-02-18 06:06:17 -08:00
|
|
|
|
|
|
|
struct WelcomeView: View {
|
2022-04-04 04:23:57 -07:00
|
|
|
var store: WelcomeStore
|
|
|
|
|
|
|
|
enum DragState {
|
|
|
|
case inactive
|
|
|
|
case pressing
|
|
|
|
case dragging(translation: CGSize)
|
|
|
|
}
|
|
|
|
|
2022-02-18 06:06:17 -08:00
|
|
|
let topPaddingRatio: Double = 0.18
|
|
|
|
let horizontalPaddingRatio: Double = 0.07
|
|
|
|
|
2022-04-04 04:23:57 -07:00
|
|
|
@GestureState var dragState = DragState.inactive
|
|
|
|
|
2022-02-18 06:06:17 -08:00
|
|
|
var body: some View {
|
2022-04-04 04:23:57 -07:00
|
|
|
let longPressDrag = LongPressGesture(minimumDuration: 0.75)
|
|
|
|
.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 }
|
|
|
|
|
2022-04-14 02:25:05 -07:00
|
|
|
if drag.translation.height > 0 {
|
2022-04-04 04:23:57 -07:00
|
|
|
ViewStore(store).send(.debugMenuStartup)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return GeometryReader { proxy in
|
2022-02-18 06:06:17 -08:00
|
|
|
ZStack(alignment: .top) {
|
|
|
|
VStack(alignment: .center, spacing: 80) {
|
|
|
|
let diameter = proxy.size.width - 40
|
|
|
|
ZcashBadge()
|
|
|
|
.frame(
|
|
|
|
width: diameter,
|
|
|
|
height: diameter
|
|
|
|
)
|
2022-04-04 04:23:57 -07:00
|
|
|
.gesture(longPressDrag)
|
2022-02-18 06:06:17 -08:00
|
|
|
|
|
|
|
VStack {
|
2022-02-25 04:27:50 -08:00
|
|
|
Text("welcomeScreen.title")
|
2022-02-18 06:06:17 -08:00
|
|
|
.titleText()
|
|
|
|
|
2022-02-25 04:27:50 -08:00
|
|
|
Text("welcomeScreen.subtitle")
|
2022-02-18 06:06:17 -08:00
|
|
|
.captionText()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.frame(alignment: .center)
|
|
|
|
.applyScreenBackground()
|
|
|
|
.animation(.easeInOut, value: 3)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct ZcashBadge: View {
|
|
|
|
@Environment(\.colorScheme) var colorScheme
|
|
|
|
|
|
|
|
var body: some View {
|
|
|
|
ZStack {
|
|
|
|
GeometryReader { proxy in
|
|
|
|
let outterPadding = proxy.size.height * 0.015
|
|
|
|
let firstPadding = proxy.size.height * 0.075 + outterPadding
|
|
|
|
let secondRingPadding = firstPadding * 1.5
|
|
|
|
let outerShadowDrop = proxy.size.height * 0.14
|
|
|
|
let outerShadowOffset = proxy.size.height * 0.055
|
|
|
|
|
|
|
|
Circle()
|
|
|
|
.fill(
|
|
|
|
LinearGradient(
|
|
|
|
colors: [
|
|
|
|
Asset.Colors.ZcashBadge.outerRingGradientStart.color,
|
|
|
|
Asset.Colors.ZcashBadge.outerRingGradientEnd.color
|
|
|
|
],
|
|
|
|
startPoint: UnitPoint(x: 0.5, y: 0),
|
|
|
|
endPoint: UnitPoint(x: 0.5, y: 1)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.if(colorScheme == .light) { view in
|
|
|
|
view.shadow(
|
|
|
|
color: Asset.Colors.ZcashBadge.shadowColor.color,
|
|
|
|
radius: outerShadowDrop,
|
|
|
|
x: outerShadowOffset,
|
|
|
|
y: outerShadowOffset
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
Circle()
|
|
|
|
.foregroundColor(Asset.Colors.ZcashBadge.thickRing.color)
|
|
|
|
.padding(outterPadding)
|
|
|
|
|
|
|
|
Circle()
|
|
|
|
.foregroundColor(Asset.Colors.ZcashBadge.thinRing.color)
|
|
|
|
.padding(firstPadding)
|
|
|
|
|
|
|
|
Circle()
|
|
|
|
.foregroundColor(Asset.Colors.ZcashBadge.innerCircle.color)
|
|
|
|
.padding(secondRingPadding)
|
|
|
|
|
|
|
|
ZcashSymbol()
|
|
|
|
.fill(Asset.Colors.ZcashBadge.zcashLogoFill.color)
|
|
|
|
.padding(firstPadding + secondRingPadding)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct WelcomeView_Previews: PreviewProvider {
|
|
|
|
static let squarePreviewSize: CGFloat = 360
|
|
|
|
|
|
|
|
static var previews: some View {
|
|
|
|
ZcashBadge()
|
|
|
|
.applyScreenBackground()
|
|
|
|
.previewLayout(
|
|
|
|
.fixed(
|
|
|
|
width: squarePreviewSize,
|
|
|
|
height: squarePreviewSize
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.preferredColorScheme(.dark)
|
|
|
|
|
|
|
|
ZStack {
|
|
|
|
ZcashBadge()
|
|
|
|
}
|
|
|
|
.padding()
|
|
|
|
.applyScreenBackground()
|
|
|
|
.previewLayout(
|
|
|
|
.fixed(
|
|
|
|
width: squarePreviewSize,
|
|
|
|
height: squarePreviewSize
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.preferredColorScheme(.light)
|
|
|
|
|
|
|
|
Group {
|
2022-04-04 04:23:57 -07:00
|
|
|
WelcomeView(store: .demo)
|
2022-02-18 06:06:17 -08:00
|
|
|
.preferredColorScheme(.dark)
|
|
|
|
|
2022-04-04 04:23:57 -07:00
|
|
|
WelcomeView(store: .demo)
|
2022-02-18 06:06:17 -08:00
|
|
|
.previewDevice("iPhone SE (2nd generation)")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|