97 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
//
 | 
						|
//  ChatBgSelectionViewModel.swift
 | 
						|
//  SodaLive
 | 
						|
//
 | 
						|
//  Created by klaus on 9/4/25.
 | 
						|
//
 | 
						|
 | 
						|
import Foundation
 | 
						|
import Combine
 | 
						|
import Moya
 | 
						|
 | 
						|
final class ChatBgSelectionViewModel: ObservableObject {
 | 
						|
    // MARK: - Published State
 | 
						|
    @Published var isLoading: Bool = false
 | 
						|
    @Published var errorMessage: String = ""
 | 
						|
    @Published var isShowPopup = false
 | 
						|
    
 | 
						|
    @Published var galleryItems: [CharacterImageListItemResponse] = []
 | 
						|
    
 | 
						|
    private let repository = CharacterDetailGalleryRepository()
 | 
						|
    private var subscription = Set<AnyCancellable>()
 | 
						|
    private var currentPage = 0
 | 
						|
    private var isLast = false
 | 
						|
    
 | 
						|
    var characterId: Int64 = 0
 | 
						|
    
 | 
						|
    // MARK: - Public Methods
 | 
						|
    func loadInitialData() {
 | 
						|
        currentPage = 0
 | 
						|
        isLast = false
 | 
						|
        galleryItems.removeAll()
 | 
						|
        loadImageList()
 | 
						|
    }
 | 
						|
    
 | 
						|
    func loadMoreIfNeeded(currentItem: CharacterImageListItemResponse) {
 | 
						|
        guard !isLast,
 | 
						|
              !isLoading,
 | 
						|
              let lastItem = galleryItems.last,
 | 
						|
              lastItem.id == currentItem.id else { return }
 | 
						|
        
 | 
						|
        loadImageList()
 | 
						|
    }
 | 
						|
    
 | 
						|
    // MARK: - Private Methods
 | 
						|
    private func loadImageList() {
 | 
						|
        guard !isLoading else { return }
 | 
						|
        
 | 
						|
        isLoading = true
 | 
						|
        
 | 
						|
        repository.getMyCharacterImageList(
 | 
						|
            characterId: characterId,
 | 
						|
            page: currentPage,
 | 
						|
            size: 20
 | 
						|
        )
 | 
						|
        .receive(on: DispatchQueue.main)
 | 
						|
        .sink { result in
 | 
						|
            switch result {
 | 
						|
            case .finished:
 | 
						|
                DEBUG_LOG("finish")
 | 
						|
            case .failure(let error):
 | 
						|
                ERROR_LOG(error.localizedDescription)
 | 
						|
            }
 | 
						|
        } receiveValue: { [weak self] response in
 | 
						|
            let responseData = response.data
 | 
						|
            self?.isLoading = false
 | 
						|
            
 | 
						|
            do {
 | 
						|
                let jsonDecoder = JSONDecoder()
 | 
						|
                let decoded = try jsonDecoder.decode(ApiResponse<CharacterImageListResponse>.self, from: responseData)
 | 
						|
                
 | 
						|
                if let data = decoded.data, decoded.success {
 | 
						|
                    self?.currentPage += 1
 | 
						|
                    self?.handleImageListResponse(data)
 | 
						|
                } else {
 | 
						|
                    if let message = decoded.message {
 | 
						|
                        self?.errorMessage = message
 | 
						|
                    } else {
 | 
						|
                        self?.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
 | 
						|
                    }
 | 
						|
                    
 | 
						|
                    self?.isShowPopup = true
 | 
						|
                }
 | 
						|
            } catch {
 | 
						|
                ERROR_LOG(String(describing: error))
 | 
						|
                self?.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
 | 
						|
                self?.isShowPopup = true
 | 
						|
            }
 | 
						|
        }
 | 
						|
        .store(in: &subscription)
 | 
						|
    }
 | 
						|
    
 | 
						|
    private func handleImageListResponse(_ response: CharacterImageListResponse) {
 | 
						|
        galleryItems.append(contentsOf: response.items)
 | 
						|
        isLast = response.items.isEmpty
 | 
						|
    }
 | 
						|
}
 |