You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.8 KiB
130 lines
4.8 KiB
//
|
|
// DailyGiftPage.swift
|
|
// AllIn
|
|
//
|
|
// Created by Emre on 02/02/2024.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct DailyGiftPage: View {
|
|
|
|
enum Step {
|
|
case first
|
|
case second
|
|
case end
|
|
}
|
|
|
|
@State private var step: Step = .first
|
|
@State private var scale: CGFloat = 1.0
|
|
@State private var scale2: CGFloat = 0
|
|
@State private var rotate: CGFloat = 1
|
|
@Binding var show: Bool
|
|
@Binding var gain: Int
|
|
|
|
var body: some View {
|
|
GeometryReader { geometry in
|
|
LinearGradient(
|
|
gradient: Gradient(colors: [
|
|
Color.black.opacity(0.6),
|
|
Color.black.opacity(0.9)
|
|
]),
|
|
startPoint: .top,
|
|
endPoint: .bottom
|
|
)
|
|
.edgesIgnoringSafeArea(.all)
|
|
|
|
VStack {
|
|
Text("daily_reward_title")
|
|
.textStyle(weight: .bold, color: .white, size: 25)
|
|
|
|
Group {
|
|
switch step {
|
|
case .first:
|
|
Image("giftImage")
|
|
.transition(
|
|
.asymmetric(
|
|
insertion: .scale(scale: 0.9).combined(with: .opacity),
|
|
removal: .scale(scale: 1.7).combined(with: .opacity))
|
|
)
|
|
.scaleEffect(scale)
|
|
.rotationEffect(.degrees(Double(scale) * 10), anchor: .center)
|
|
.rotationEffect(.degrees(-10), anchor: .center)
|
|
.onAppear {
|
|
withAnimation(Animation.easeInOut(duration: 1).repeatForever()) {
|
|
scale = 1.1
|
|
}
|
|
}
|
|
case .second:
|
|
ZStack {
|
|
Image("giftEarnImage")
|
|
.rotationEffect(.degrees(Double(rotate) * 10), anchor: .center)
|
|
.rotationEffect(.degrees(-10), anchor: .center)
|
|
.onAppear {
|
|
withAnimation(Animation.easeInOut(duration: 1).repeatForever()) {
|
|
rotate = 1.3
|
|
}
|
|
}
|
|
HStack {
|
|
Text("+" + gain.description)
|
|
.textStyle(weight: .black, color: .white, size: 55)
|
|
Image("allcoinWhiteIcon")
|
|
.resizable()
|
|
.frame(width: 40, height: 40)
|
|
}
|
|
}
|
|
.scaleEffect(scale2)
|
|
.onAppear {
|
|
withAnimation(Animation.easeInOut(duration: 0.8)) {
|
|
scale2 = 1.0
|
|
}
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
|
|
withAnimation {
|
|
show = false
|
|
step = .first
|
|
}
|
|
}
|
|
}
|
|
.onDisappear {
|
|
scale2 = 0
|
|
}
|
|
default :
|
|
EmptyView()
|
|
}
|
|
}
|
|
.frame(width: geometry.size.width * 0.8, height: geometry.size.height * 0.4)
|
|
.onTapGesture {
|
|
withAnimation {
|
|
switch step {
|
|
case .first:
|
|
step = .second
|
|
withAnimation {
|
|
AppStateContainer.shared.user?.nbCoins += gain
|
|
}
|
|
case .second:
|
|
show = false
|
|
step = .end
|
|
case .end:
|
|
step = .first
|
|
}
|
|
}
|
|
}
|
|
|
|
Text("daily_reward_subtitle")
|
|
.textStyle(weight: .medium, color: .white, size: 13)
|
|
.multilineTextAlignment(.center)
|
|
.padding(.horizontal, geometry.size.width * 0.13)
|
|
.opacity(0.67)
|
|
}
|
|
.frame(width: geometry.size.width, height: geometry.size.height)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
struct DailyGiftPage_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
DailyGiftPage(show: .constant(false), gain: .constant(20))
|
|
}
|
|
}
|