- KFImage 공통 옵션(다운샘플링, scaleFactor, backgroundDecode, cancelOnDisappear, retry) 캡슐화한 DownsampledKFImage 추가 - 채팅-캐릭터 탭 Character/Recent/배너 뷰에서 인라인 KFImage 제거 → 공통 뷰 적용 - 수평 리스트 HStack → LazyHStack으로 교체해 프리로딩/메모리 개선 Why: 대형 원본 디코딩으로 인한 메모리 스파이크 완화 및 일관된 이미지 로딩 정책 적용. 유지보수성 및 성능 향상.
		
			
				
	
	
		
			56 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
//
 | 
						|
//  RecentCharacterSectionView.swift
 | 
						|
//  SodaLive
 | 
						|
//
 | 
						|
//  Created by klaus on 8/29/25.
 | 
						|
//
 | 
						|
 | 
						|
import SwiftUI
 | 
						|
 | 
						|
struct RecentCharacterSectionView: View {
 | 
						|
    let titleCount: Int
 | 
						|
    let items: [RecentCharacter]
 | 
						|
    var onTap: (RecentCharacter) -> Void = { _ in }
 | 
						|
    
 | 
						|
    var body: some View {
 | 
						|
        VStack(alignment: .leading, spacing: 16) {
 | 
						|
            HStack(spacing: 0) {
 | 
						|
                Text("최근 대화한 캐릭터 ")
 | 
						|
                    .font(.custom(Font.preBold.rawValue, size: 20))
 | 
						|
                    .foregroundColor(.white)
 | 
						|
                
 | 
						|
                Text("\(titleCount)")
 | 
						|
                    .font(.custom(Font.preBold.rawValue, size: 20))
 | 
						|
                    .foregroundColor(Color(hex: "FDCA2F"))
 | 
						|
                
 | 
						|
                Spacer()
 | 
						|
            }
 | 
						|
            .padding(.horizontal, 24)
 | 
						|
            
 | 
						|
            ScrollView(.horizontal, showsIndicators: false) {
 | 
						|
                LazyHStack(spacing: 16) {
 | 
						|
                    ForEach(items.indices, id: \.self) { idx in
 | 
						|
                        let item = items[idx]
 | 
						|
                        RecentCharacterItemView(character: item)
 | 
						|
                            .onTapGesture { onTap(item) }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                .padding(.horizontal, 24)
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#Preview {
 | 
						|
    RecentCharacterSectionView(
 | 
						|
        titleCount: 3,
 | 
						|
        items: [
 | 
						|
            RecentCharacter(characterId: 1, name: "라라", imageUrl: "https://picsum.photos/200"),
 | 
						|
            RecentCharacter(characterId: 2, name: "마리", imageUrl: "https://picsum.photos/200"),
 | 
						|
            RecentCharacter(characterId: 3, name: "Nana", imageUrl: "https://picsum.photos/200")
 | 
						|
        ]
 | 
						|
    )
 | 
						|
    .padding()
 | 
						|
    .background(Color.black)
 | 
						|
}
 |