Skip to content

Commit 8c386b4

Browse files
authored
Merge pull request #43 from EST-iOS-TEAM2/feature/#40
[FEAT] Loading Indicator와 Toast popup을 추가합니다.
2 parents 9eb4e34 + 76a222d commit 8c386b4

File tree

16 files changed

+371
-52
lines changed

16 files changed

+371
-52
lines changed

Dietto/Dietto/Data/Network/NetworkError.swift

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,25 @@ public enum NetworkError: LocalizedError {
3333
return "서버 오류가 발생했습니다. (\(code))"
3434
case .invalidResponse:
3535
return "서버 응답이 유효하지 않습니다."
36-
case .decodingFailed(let error):
36+
case .decodingFailed( _):
3737
return "잠시 후 다시 시도해주세요."
3838
case .requestCancelled:
3939
return "요청이 취소되었습니다."
40-
case .unknown(let error):
40+
case .unknown(let _):
4141
return "알 수 없는 에러가 발생했습니다. 관리자에게 문의하세요."
4242
case .unacceptableStatusCode:
4343
return "에러가 발생했습니다. 잠시후 다시 시도하세요."
4444
}
4545
}
4646
}
47+
48+
extension NetworkError {
49+
var asToast: ToastEntity {
50+
return ToastEntity(
51+
type: .error,
52+
title: "오류 발생",
53+
message: self.errorDescription ?? "알 수 없는 오류입니다.",
54+
duration: 3
55+
)
56+
}
57+
}

Dietto/Dietto/Data/Repository/NetworkRepository.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77

88
import Foundation
99

10-
//MARK: - Alan Protocol
10+
//MARK: - Alan Interface
1111
protocol NetworkRepository {
1212
func fetch<T: Decodable>(promptType: PromptType, rawValues: [Any], outputType: T.Type) async throws -> T}
1313

14-
//MARK: - Alan Protocol Implement
14+
//MARK: - Alan Implement
1515
final class NetworkRepositoryImpl: NetworkRepository {
1616

1717
private let promptManager: PromptManager
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// ToastEntity.swift
3+
// Dietto
4+
//
5+
// Created by 안세훈 on 6/4/25.
6+
//
7+
8+
import Foundation
9+
10+
struct ToastEntity: Equatable {
11+
var type: ToastStyle
12+
var title: String
13+
var message: String
14+
var duration: Double = 3
15+
}

Dietto/Dietto/Domain/Usecases/AlanUsecase.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import Foundation
99

10-
//MARK: - Usecase
10+
//MARK: - Interface
1111

1212
protocol AlanUsecase {
1313
func fetchRecommend(ingredients: [IngredientEntity]) async throws -> [RecommendEntity]
@@ -26,14 +26,12 @@ final class AlanUsecaseImpl : AlanUsecase {
2626
//추천식단
2727
func fetchRecommend(ingredients: [IngredientEntity]) async throws -> [RecommendEntity] {
2828
let wrapper = try await repository.fetch(promptType: .recommend, rawValues: ingredients, outputType: RecommendDTO.self)
29-
3029
return wrapper.recommendation
3130
}
3231

3332
//아티클
3433
func fetchArticle(topics: [InterestEntity]) async throws -> [ArticleEntity] {
3534
let wrapper = try await repository.fetch(promptType: .article, rawValues: topics, outputType: ArticleDTO.self)
36-
3735
return wrapper.articles
3836
}
3937

Dietto/Dietto/Extensions/Font+.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import SwiftUI
1111
extension Font {
1212
static let AppLogo: Font = .custom("NerkoOne-regular", size: 32)
1313
static let NerkoOne40: Font = .custom("NerkoOne-regular", size: 40)
14+
static let NerkoOne80: Font = .custom("NerkoOne-regular", size: 80)
1415

1516
static let pretendardBlack32: Font = .custom("Pretendard-Black", size: 32)
1617
static let pretendardBlack28: Font = .custom("Pretendard-Black", size: 28)

Dietto/Dietto/Presentation/Article/View/ArticleView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ struct ArticleView: View {
3737
.background(Color.appMain)
3838
.clipShape(Capsule())
3939
}
40+
4041
}
4142
.padding([.leading, .trailing], 16)
4243
Text("내 관심사")

Dietto/Dietto/Presentation/Article/ViewModel/ArticleViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import SwiftUI
1010
final class ArticleViewModel: ObservableObject {
1111
@Published var selectedInterests: [InterestEntity] = []
1212
@Published var articles: [ArticleEntity] = []
13+
@Published var isLoading : Bool = false
1314

1415
private let alanUsecase: AlanUsecase
1516
private let storageUsecase: InterestsUsecase
@@ -64,6 +65,5 @@ final class ArticleViewModel: ObservableObject {
6465
addInterest(title)
6566
storageUsecase.insertInterests(InterestEntity(title: title))
6667
}
67-
print(selectedInterests)
6868
}
6969
}

Dietto/Dietto/Presentation/Common/ContainerView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import SwiftUI
1010
struct ContainerView<Content: View>: View {
1111
var paddingSize: CGFloat
1212
var height: CGFloat
13-
let content: () -> Content // ✅ 변수명은 소문자!
13+
let content: () -> Content
1414

1515
init(paddingSize: CGFloat, height: CGFloat, @ViewBuilder content: @escaping () -> Content) {
1616
self.paddingSize = paddingSize
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
//
2+
// ProgressViews.swift
3+
// Dietto
4+
//
5+
// Created by 안세훈 on 6/2/25.
6+
//
7+
8+
import SwiftUI
9+
10+
struct LogoProgress: View {
11+
@Binding var isAnimated: Bool
12+
var width: CGFloat = 190
13+
var message : String
14+
15+
var body: some View {
16+
VStack {
17+
Spacer()
18+
ZStack {
19+
//가려진 뷰
20+
VStack(spacing: 3) {
21+
Text("Dietto")
22+
.font(.NerkoOne80)
23+
.frame(width: width)
24+
.scaledToFit()
25+
.foregroundStyle(.black.opacity(0.3))
26+
Text(message)
27+
.font(.pretendardBlack12)
28+
.frame(width: width)
29+
.scaledToFit()
30+
.foregroundStyle(.black.opacity(0.3))
31+
}
32+
//진행중인 뷰
33+
VStack(spacing: 3) {
34+
Text("Dietto")
35+
.font(.NerkoOne80)
36+
.frame(width: width)
37+
.scaledToFit()
38+
.foregroundStyle(.appMain)
39+
.mask {
40+
Rectangle()
41+
.frame(width: isAnimated ? width : 0)
42+
.offset(x: isAnimated ? 0 : -width)
43+
}
44+
Text(message)
45+
.font(.pretendardBlack12)
46+
.frame(width: width)
47+
.scaledToFit()
48+
.foregroundStyle(.appMain)
49+
.mask {
50+
Rectangle()
51+
.frame(width: isAnimated ? width : 0)
52+
.offset(x: isAnimated ? 0 : -width)
53+
}
54+
}
55+
}
56+
Spacer()
57+
}
58+
.frame(maxWidth: .infinity)
59+
.background(Color.black.opacity(0.25))
60+
}
61+
}
62+
//MARK: - ViewModifer
63+
64+
struct LogoProgressModifier: ViewModifier {
65+
@Binding var isPresented: Bool
66+
@State private var isAnimated = false
67+
@State var message: String = "TEST"
68+
69+
var speed: Double = 0.3
70+
var delayTime: Double = 0.3
71+
72+
func body(content: Content) -> some View {
73+
ZStack {
74+
content
75+
if isPresented {
76+
Rectangle()
77+
.fill(Color.black.opacity(0.3))
78+
.ignoresSafeArea()
79+
80+
LogoProgress(isAnimated: $isAnimated, message: message)
81+
.onAppear {
82+
isAnimated = true
83+
}
84+
.animation(
85+
.easeInOut
86+
.speed(speed)
87+
.delay(delayTime)
88+
.repeatForever(autoreverses: false),
89+
value: isAnimated
90+
)
91+
}
92+
}
93+
}
94+
}
95+
96+
97+
////MARK: - 프리뷰 하려고 임시로 만들어놓은 것.
98+
//
99+
//#Preview {
100+
// AnimatedLoadingPreview()
101+
//}
102+
//
103+
//struct AnimatedLoadingPreview: View {
104+
// @State private var isAnimated = false
105+
// @State var message = "카리나카리나카리나카리나카리나"
106+
//
107+
// var body: some View {
108+
// LogoProgress(isAnimated: $isAnimated, message: message)
109+
// .onAppear {
110+
// withAnimation(
111+
// .easeInOut
112+
// .speed(0.3)
113+
// .delay(0.3)
114+
// .repeatForever(autoreverses: false)
115+
// ) {
116+
// isAnimated = true
117+
// }
118+
// }
119+
// }
120+
//}

Dietto/Dietto/Presentation/Common/PillText.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ struct PillText: View {
1313
var onDelete: (() -> Void)? = nil // X 버튼 클릭 액션
1414

1515
var body: some View {
16-
HStack() {
16+
HStack(spacing : 2) {
1717
Button(action: {
1818
onAdd?()
1919
}) {
@@ -29,11 +29,11 @@ struct PillText: View {
2929
Image(systemName: "xmark")
3030
.font(.pretendardBold12)
3131
.foregroundStyle(.white)
32-
.padding(4)
32+
.padding(2)
3333
}
3434
.buttonStyle(PlainButtonStyle())
3535
}
36-
.padding(.horizontal, 10)
36+
.padding(.horizontal, 8)
3737
.padding(.vertical, 4)
3838
.background(Capsule().fill(Color.appMain))
3939
.fixedSize()

0 commit comments

Comments
 (0)