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)
 | 
						|
    }
 | 
						|
}
 |