222 lines
7.2 KiB
Swift
222 lines
7.2 KiB
Swift
//
|
|
// CanChargeView.swift
|
|
// SodaLive
|
|
//
|
|
// Created by klaus on 2023/08/11.
|
|
//
|
|
|
|
import SwiftUI
|
|
import StoreKit
|
|
|
|
enum CanChargeCurrentTab: String {
|
|
case iap, pg
|
|
}
|
|
|
|
struct CanChargeView: View {
|
|
|
|
@StateObject var storeManager = StoreManager()
|
|
@StateObject var viewModel = CanChargeViewModel()
|
|
|
|
@State var currentTab: CanChargeCurrentTab = .pg
|
|
|
|
let refresh: () -> Void
|
|
let afterCompletionToGoBack: Bool
|
|
|
|
var body: some View {
|
|
BaseView(isLoading: $storeManager.isLoading) {
|
|
VStack(spacing: 13.3) {
|
|
DetailNavigationBar(title: "충전하기")
|
|
|
|
if UserDefaults.bool(forKey: .auth) {
|
|
CanChargeTabView(currentTab: $currentTab)
|
|
}
|
|
|
|
if UserDefaults.bool(forKey: .auth) && currentTab == .pg {
|
|
ScrollView(.vertical, showsIndicators: false) {
|
|
VStack(spacing: 13.3) {
|
|
ForEach(viewModel.cans, id: \.self) { item in
|
|
CanPgItemView(item: item)
|
|
.onTapGesture {
|
|
AppState.shared.setAppStep(
|
|
step: .canPgPayment(canResponse: item, refresh: refresh, afterCompletionToGoBack: afterCompletionToGoBack)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
.onAppear {
|
|
viewModel.getCans()
|
|
}
|
|
}
|
|
} else {
|
|
ScrollView(.vertical, showsIndicators: false) {
|
|
VStack(spacing: 13.3) {
|
|
ForEach(storeManager.products, id: \.self) { item in
|
|
CanItemView(item: item)
|
|
.onTapGesture {
|
|
AppState.shared.setAppStep(
|
|
step: .canPayment(canProduct: item, refresh: refresh, afterCompletionToGoBack: afterCompletionToGoBack)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
.onAppear {
|
|
storeManager.getProducts()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.popup(isPresented: $storeManager.isShowPopup, type: .toast, position: .top, autohideIn: 1) {
|
|
GeometryReader { geo in
|
|
HStack {
|
|
Spacer()
|
|
Text(storeManager.errorMessage)
|
|
.padding(.vertical, 13.3)
|
|
.padding(.horizontal, 6.7)
|
|
.frame(width: geo.size.width - 66.7, alignment: .center)
|
|
.font(.custom(Font.medium.rawValue, size: 12))
|
|
.background(Color(hex: "9970ff"))
|
|
.foregroundColor(Color.white)
|
|
.multilineTextAlignment(.leading)
|
|
.fixedSize(horizontal: false, vertical: true)
|
|
.cornerRadius(20)
|
|
.padding(.top, 66.7)
|
|
Spacer()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct CanItemView: View {
|
|
|
|
let item: SKProduct
|
|
|
|
var body: some View {
|
|
HStack(spacing: 0) {
|
|
Text(item.localizedTitle)
|
|
.font(.custom(Font.bold.rawValue, size: 15.3))
|
|
.foregroundColor(Color(hex: "eeeeee"))
|
|
|
|
Spacer()
|
|
|
|
Text("\(NumberFormatter.localizedString(from: item.price, number: .currency))")
|
|
.font(.custom(Font.bold.rawValue, size: 15.3))
|
|
.foregroundColor(Color(hex: "eeeeee"))
|
|
}
|
|
.padding(.horizontal, 13.3)
|
|
.padding(.vertical, 23.3)
|
|
.background(Color(hex: "111111"))
|
|
.cornerRadius(16.7)
|
|
.padding(.horizontal, 13.3)
|
|
.frame(width: screenSize().width)
|
|
}
|
|
}
|
|
|
|
struct CanPgItemView: View {
|
|
let item: GetCanResponse
|
|
|
|
var body: some View {
|
|
HStack(spacing: 0) {
|
|
Text(item.title)
|
|
.font(.custom(Font.bold.rawValue, size: 15.3))
|
|
.foregroundColor(Color(hex: "eeeeee"))
|
|
|
|
Spacer()
|
|
|
|
Text("\(item.price) 원")
|
|
.font(.custom(Font.bold.rawValue, size: 15.3))
|
|
.foregroundColor(Color(hex: "eeeeee"))
|
|
}
|
|
.padding(.horizontal, 13.3)
|
|
.padding(.vertical, 23.3)
|
|
.background(Color(hex: "111111"))
|
|
.cornerRadius(16.7)
|
|
.padding(.horizontal, 13.3)
|
|
.frame(width: screenSize().width)
|
|
}
|
|
}
|
|
|
|
struct CanChargeTabView: View {
|
|
|
|
@Binding var currentTab: CanChargeCurrentTab
|
|
|
|
var body: some View {
|
|
VStack(spacing: 0) {
|
|
HStack(spacing: 0) {
|
|
let tabWidth = screenSize().width / 2
|
|
|
|
CanChargeTab(
|
|
title: "PG",
|
|
action: {
|
|
if currentTab != .pg {
|
|
currentTab = .pg
|
|
}
|
|
},
|
|
color: {
|
|
currentTab == .pg ?
|
|
Color.grayee :
|
|
Color.gray77
|
|
},
|
|
width: tabWidth,
|
|
isShowDivider: { currentTab == .pg }
|
|
)
|
|
|
|
CanChargeTab(
|
|
title: "인 앱 결제",
|
|
action: {
|
|
if currentTab != .iap {
|
|
currentTab = .iap
|
|
}
|
|
},
|
|
color: {
|
|
currentTab == .iap ?
|
|
Color.grayee :
|
|
Color.gray77
|
|
},
|
|
width: tabWidth,
|
|
isShowDivider: { currentTab == .iap }
|
|
)
|
|
}
|
|
|
|
Rectangle()
|
|
.frame(width: screenSize().width, height: 1)
|
|
.foregroundColor(Color.gray90.opacity(0.5))
|
|
}
|
|
}
|
|
}
|
|
|
|
struct CanChargeTab: View {
|
|
let title: String
|
|
let action: () -> Void
|
|
let color: () -> Color
|
|
let width: CGFloat
|
|
let isShowDivider: () -> Bool
|
|
|
|
var body: some View {
|
|
Button(action: action) {
|
|
VStack(spacing: 0) {
|
|
Spacer()
|
|
|
|
Text(title)
|
|
.font(.custom(Font.medium.rawValue, size: 16.7))
|
|
.foregroundColor(color())
|
|
.frame(width: width)
|
|
|
|
Spacer()
|
|
|
|
Rectangle()
|
|
.frame(width: width, height: 3)
|
|
.foregroundColor(Color.button.opacity(isShowDivider() ? 1 : 0))
|
|
}
|
|
.frame(height: 50)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct CanChargeView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
CanChargeView(refresh: {}, afterCompletionToGoBack: false)
|
|
}
|
|
}
|