๐ Qapple-iOS / ์์นด๋ฐ๋ฏธ ๋ฌ๋๋ผ๋ฆฌ ์ต๋ช
์ผ๋ก ์ํตํ๊ธฐ!
์์ฆ 1) MVP ๊ฐ๋ฐ์ ํตํ ๋น ๋ฅธ ํผ๋๋ฐฑ ์์ง (24. 01. 22 ~ 24. 04. 01)
์์ฆ 2) ์ ์ง๋ณด์ ๋ฐ TCA ๋ฆฌํฉํ ๋ง (24. 04. 01 ~ ์งํ ์ค)
๐
โโโ ๐๏ธQapple
โย ย โโโ ๐๏ธQapple
โย ย โย ย โโโ ๐QappleApp.swift # ์ฑ์ ์ง์
์
โย ย โย ย โโโ ๐๏ธQappleBox # ์ฑ์ ์ค์ ๋ฐ ๋ณด์ ๊ด๋ จ ํ์ผ ์ ์ฅ์ (๊ณต๊ฐ X)
โย ย โย ย โโโ ๐๏ธResource # ์ฑ์์ ์ฌ์ฉํ๋ ๋ฆฌ์์ค (UI ๋ฐ ์ค์ ๊ด๋ จ)
โย ย โย ย โโโ ๐๏ธSourceCode
โย ย โย ย โโโ ๐๏ธApp # ์ฑ์ ํต์ฌ ์ค์ ๋ฐ ์ง์
์ ๊ด๋ จ ์ฝ๋
โย ย โย ย โโโ ๐๏ธData
โย ย โย ย โย ย โโโ ๐๏ธRepository # ๋ฐ์ดํฐ ์ ์ฅ์ (๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐ ์บ์ฑ)
โย ย โย ย โย ย โโโ ๐๏ธService # API ํต์ ๋ฐ ๋ฐ์ดํฐ ์๋น์ค
โย ย โย ย โโโ ๐๏ธEntity # ๋ฐ์ดํฐ ๋ชจ๋ธ ์ ์
โย ย โย ย โโโ ๐๏ธFeature
โย ย โย ย โย ย โโโ ๐๏ธ0.SignUpFlow # ํ์๊ฐ์
๋ฐ ๋ก๊ทธ์ธ ๊ด๋ จ ํ๋ฉด
โย ย โย ย โย ย โโโ ๐๏ธ1.MainFlow # ์ฑ์ ๋ฉ์ธ ํ๋ฉด ๋ฐ ๊ธฐ๋ณธ ๋ค๋น๊ฒ์ด์
โย ย โย ย โย ย โโโ ๐๏ธ2.QuestionTab # ์ง๋ฌธ ๊ด๋ จ UI ๋ฐ ๋ก์ง
โย ย โย ย โย ย โโโ ๐๏ธ3.BulletinBoard # ๊ฒ์ํ ๊ด๋ จ UI ๋ฐ ๋ก์ง
โย ย โย ย โย ย โโโ ๐๏ธ4.Comment # ๋๊ธ๊ด๋ จ UI ๋ฐ ๋ก์ง
โย ย โย ย โย ย โโโ ๐๏ธ5.Profile # ์ฌ์ฉ์ ํ๋กํ ๊ด๋ จ UI ๋ฐ ๋ก์ง
โย ย โย ย โย ย โโโ ๐๏ธ6.Notification # ์๋ฆผ ๊ธฐ๋ฅ (ํธ์ ์๋ฆผ ๋ฑ)
โย ย โย ย โย ย โโโ ๐๏ธ7.SeeMoreSheet # ๋๋ณด๊ธฐ ์ํธ UI
โย ย โย ย โย ย โโโ ๐๏ธ8.Report # ์ ๊ณ ๊ธฐ๋ฅ
โย ย โย ย โโโ ๐๏ธUIComponent # ๊ณตํต UI ์ปดํฌ๋ํธ
โย ย โย ย โโโ ๐๏ธUtility # ์ ํธ๋ฆฌํฐ ํจ์ ๋ฐ ํฌํผ ํด๋์ค
โย ย โโโ Qapple.xcodeproj # Xcode ํ๋ก์ ํธ ํ์ผ
โย ย โโโ ๐๏ธQappleTests # ํ
์คํธ ์ฝ๋ ํด๋
โโโ ๐README.md
์บํ ํ์ TCA๋ฅผ ํ์ฉํ ์คํํ ๋ค๋น๊ฒ์ด์
์ ์ ์ํ์ต๋๋ค.
NavigationStack์ ๋ด๋นํ๋ Reducer๊ฐ ํ์ View์์ ๋ฐ์ํ๋ Action๋ค์ ๊ด์ฐฐํฉ๋๋ค. ๊ทธ ์ค ํน์ ํ Action์ด ์คํ๋ ๊ฒฝ์ฐ Path๊ฐ ๋ณ๊ฒฝ๋ ์ ์๊ฒ ํ์ต๋๋ค.
๊ด์ฐฐ์ ์ํ๋ Reducer์ Path ์ด๊ฑฐํ์ผ๋ก ์ ์ํฉ๋๋ค.
// in SighUpFlowFeature.swift
extension SignUpFlowFeature {
@ Reducer ( state : . equatable )
enum Path {
case emailForm ( EmailFormFeature )
case authCodeForm ( AuthCodeFormFeature )
case nicknameForm ( NicknameFormFeature )
case termsAgreement ( TermsAgreementFeature )
case signUpComplete ( SignUpCompleteFeature )
}
}
ํธ๋ฆฌ๊ฑฐ๊ฑฐ๊ฐ ๋ (์ถ์ ์ ํ ) ์ก์
์ ์ ํํ ํ ํด๋น ์ก์
์ ์คํ ์ฝ๋๋ฅผ ์ฌ์ ์ํฉ๋๋ค.
// in SighUpFlowFeature.swift
case let . path ( stackAction ) :
switch stackAction {
case let . element ( id : _, action : . emailForm ( . sendCertificationEmailResponse ( email ) ) ) :
state . path . append ( . authCodeForm ( . init ( emailText : email ) ) )
return . none
case let . element ( id : _, action : . authCodeForm ( . authCodeFormComplete ( email ) ) ) :
state . path . append ( . nicknameForm ( . init ( emailText : email ) ) )
return . none
case let . element ( id : _, action : . nicknameForm ( . nicknameFormComplete ( email , nickname ) ) ) :
state . path . append ( . termsAgreement ( . init ( emailText : email , nicknameText : nickname ) ) )
return . none
case . element ( id : _ , action : . termsAgreement ( . signUpResponse ) ) :
state . path . append ( . signUpComplete ( . init ( ) ) )
HapticService . notification ( type : . success )
return . none
case . element ( id : _ , action : . signUpComplete ( . startButtonTapped ) ) :
state . $isSignIn . withLock { $0 = true }
state . path . removeAll ( )
return . none
default:
return . none
}
Path์ ์ถ๊ฐ๋๋ ์ด๊ฑฐํ์ ํ์
์ ๋ฐ๋ฅธ ์ถ๊ฐ๋ View๋ฅผ ์ ์ด์ค๋๋ค.
// in SignUpView.swift
var body : some View {
NavigationStack ( path : $store . scope ( state : \. path , action : \. path ) ) {
SocialLoginView ( store : store . scope ( state : \. socialLogin , action : \. socialLogin ) )
} destination : { store in
switch store . case {
case let . emailForm ( store ) : EmailFormView ( store : store )
case let . authCodeForm ( store ) : AuthCodeFormView ( store : store )
case let . nicknameForm ( store ) : NicknameFormView ( store : store )
case let . termsAgreement ( store ) : TermsAgreementView ( store : store )
case let . signUpComplete ( store ) : SignUpCompleteView ( store : store )
}
}
}
ํ๋ฆ ์์๋(NicknameFormView Push ๊ณผ์ )
- SignUp(ํ์๊ฐ์
)
- SocialLoginView
- EmailFormView
- AuthCodeFormView
- NicknameFormView
- TermsAgreementView
- TermsContentView
- SignUpCompleteView
- MainFlow(์ฑ ๋ฉ์ธ)
- QuestionTab
- TodayQuestionView
- AnswerListView
- WriteAnswerView
- CompleteAnswerView
- QuestionListView
- AnswerListView
- WriteAnswerView
- CompleteAnswerView
- BulletinBoardTab
- BulletinBoardView
- BulletinBoardSearchView
- BulletinBoardPostView
- CommentView
- ProfileTab
- ProfileView
- ProfileEditView
- MyAnswerListView
- PeopleWhoMadeQappleView
- NotifiactionView
- SeeMoreSheetView
- ReportView