์ํ | ์ฑ์คํ ์ด ๋ฐฐํฌ ์๋ฃ ๋ฐ ์ ๋ฐ์ดํธ ์งํ ์ค(v2.0.3) |
---|---|
๊ธฐ์ ์คํ | SwiftUI, TCA, Keychain, SPM, Firebase, Google Analytics, Github Actions |
์ฑ์คํ ์ด | ์บํ - ์์นด๋ฐ๋ฏธ ๋ฌ๋๋ผ๋ฆฌ ์ต๋ช ์ผ๋ก ๋ต๋ณํ๊ธฐ |
Repository ํจํค์ง | Qapple-Repository |
์ด๋ฉ์ผ ๋ฌธ์ | 0.team.capple@gmail.com |
์ด ์ธ์ | 7๋ช |
---|---|
iOS | ํํจ Hantol, ๋ฆฌ๋ฒ Liver, ์ฐ๋ WellD |
Back-End | ๋ฆฌ๋ฒ Liver, ๋ง๊ณ Mango, ๋ฃจ์ Lucy, ์๋ฆฌ Ari |
UXUI | ๋ผ๋ฌด๋ค Ramune |
์ด ์ธ์ | 10๋ช |
---|---|
iOS | ํํจ Hantol, ์๋ชฌ์ค Simmons, ๋ฌด๋ Mooni |
PM | ํ๋ผ์ด๋ฐ์ด Friday, ์ธ๋ฏธ Sammy |
Back-End | ๋ฆฌ๋ฒ Liver, ๋ง๊ณ Mango, ๋ฃจ์ Lucy, ์๋ฆฌ Ari |
UXUI | ๋ผ๋ฌด๋ค Ramune |
๐
โโโ ๐๏ธ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)
}
}
}
- 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
- ๋ฌด๋ Mooni์ CI/CD ๊ตฌ์ถ๊ธฐ with Github Actions (1)
- ํํจ์ ์บํ ๋ฆฌํฉํ ๋ง ์ฒซ ๋ฒ์งธ ์ด์ผ๊ธฐ - ๋ฐฉํฅ์ฑ ์ค์ ํ๊ธฐ
- ํํจ์ ์บํ ๋ฆฌํฉํ ๋ง ๋ ๋ฒ์งธ ์ด์ผ๊ธฐ - ํ๋ก์ ํธ ์ธํ ํ๊ธฐ
- ํํจ์ ์บํ ๋ฆฌํฉํ ๋ง ์ธ ๋ฒ์งธ ์ด์ผ๊ธฐ - ํธ๋ฌ๋ธ ์ํ
- ํํจ์ ์บํ ๋ฆฌํฉํ ๋ง ๋ค ๋ฒ์งธ ์ด์ผ๊ธฐ - Repository ๋ชจ๋ ๋ง๋ค๊ธฐ