Skip to content

Team-Capple/Qapple-iOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽ Qapple-iOS / ์•„์นด๋ฐ๋ฏธ ๋Ÿฌ๋„ˆ๋ผ๋ฆฌ ์ต๋ช…์œผ๋กœ ์†Œํ†ตํ•˜๊ธฐ!

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

์ƒํƒœ ์•ฑ์Šคํ† ์–ด ๋ฐฐํฌ ์™„๋ฃŒ ๋ฐ ์—…๋ฐ์ดํŠธ ์ง„ํ–‰ ์ค‘(v2.0.3)
๊ธฐ์ˆ  ์Šคํƒ SwiftUI, TCA, Keychain, SPM, Firebase, Google Analytics, Github Actions
์•ฑ์Šคํ† ์–ด ์บํ”Œ - ์•„์นด๋ฐ๋ฏธ ๋Ÿฌ๋„ˆ๋ผ๋ฆฌ ์ต๋ช…์œผ๋กœ ๋‹ต๋ณ€ํ•˜๊ธฐ
Repository ํŒจํ‚ค์ง€ Qapple-Repository
์ด๋ฉ”์ผ ๋ฌธ์˜ 0.team.capple@gmail.com

์‹œ์ฆŒ 1) MVP ๊ฐœ๋ฐœ์„ ํ†ตํ•œ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘ (24. 01. 22 ~ 24. 04. 01)

์ด ์ธ์› 7๋ช…
iOS ํ•œํ†จ Hantol, ๋ฆฌ๋ฒ„ Liver, ์›ฐ๋”” WellD
Back-End ๋ฆฌ๋ฒ„ Liver, ๋ง๊ณ  Mango, ๋ฃจ์‹œ Lucy, ์•„๋ฆฌ Ari
UXUI ๋ผ๋ฌด๋„ค Ramune

์‹œ์ฆŒ 2) ์œ ์ง€๋ณด์ˆ˜ ๋ฐ TCA ๋ฆฌํŒฉํ† ๋ง (24. 04. 01 ~ ์ง„ํ–‰ ์ค‘)

์ด ์ธ์› 10๋ช…
iOS ํ•œํ†จ Hantol, ์‹œ๋ชฌ์Šค Simmons, ๋ฌด๋‹ˆ Mooni
PM ํ”„๋ผ์ด๋ฐ์ด Friday, ์„ธ๋ฏธ Sammy
Back-End ๋ฆฌ๋ฒ„ Liver, ๋ง๊ณ  Mango, ๋ฃจ์‹œ Lucy, ์•„๋ฆฌ Ari
UXUI ๋ผ๋ฌด๋„ค Ramune

์Šคํฌ๋ฆฐ์ƒท

Group 1000012348 1

ํด๋” ๊ตฌ์กฐ

๐ŸŽ
โ”œโ”€โ”€ ๐Ÿ—‚๏ธ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                       

์ด๋ฒคํŠธ Flow

image

๋„ค๋น„๊ฒŒ์ด์…˜ Flow

์บํ”Œ ํŒ€์€ TCA๋ฅผ ํ™œ์šฉํ•œ ์Šคํƒํ˜• ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

NavigationStack์„ ๋‹ด๋‹นํ•˜๋Š” Reducer๊ฐ€ ํ•˜์œ„ View์—์„œ ๋ฐœ์ƒํ•˜๋Š” Action๋“ค์„ ๊ด€์ฐฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํŠน์ •ํ•œ Action์ด ์‹คํ–‰๋  ๊ฒฝ์šฐ Path๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„ค๋น„๊ฒŒ์ด์…˜ ๊ณผ์ •

  1. ๊ด€์ฐฐ์„ ์›ํ•˜๋Š” 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)
    }
}
  1. ํŠธ๋ฆฌ๊ฑฐ๊ฑฐ๊ฐ€ ๋ (์ถ”์ ์„ ํ• ) ์•ก์…˜์„ ์„ ํƒํ•œ ํ›„ ํ•ด๋‹น ์•ก์…˜์˜ ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
// 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
    }
  1. 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 ๊ณผ์ •)

image

๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ

- 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

ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

About

๐ŸŽ Qapple์˜ iOS ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ!

Resources

Stars

Watchers

Forks

Releases

No releases published

Contributors 5

Languages