Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
627aa70
refactor: 파일이름 변경 및 싱글톤 제거
Roy-wonji Mar 12, 2026
2ba6b25
feat: Auth 모듈 설정 및 테스트 인프라 추가
Roy-wonji Mar 19, 2026
4edf51c
feat: 디자인 시스템 구현 #2
Roy-wonji Mar 19, 2026
178478c
feat: test infrastructure 및 소셜 로그인 기반 구축 #3
Roy-wonji Mar 19, 2026
f8692bc
feat: 로그인 화면 및 TCA 기반 인증 모듈 구현
Roy-wonji Mar 19, 2026
3e996d0
refactor: 디자인 시스템 색상 표준화 및 컴포넌트 업데이트 #2
Roy-wonji Mar 19, 2026
8e9e637
feat: 인증 플로우 통합 및 소셜 로그인 UI 구현 #3
Roy-wonji Mar 19, 2026
89a18d6
feat: 디자인 시스템 구현 #2
Roy-wonji Mar 19, 2026
2b1a75a
feat: 약관 동의 화면 및 디자인 시스템 버튼 컴포넌트 구현 #2, #3
Roy-wonji Mar 19, 2026
4af70cc
feat: 온보딩 모듈 및 Firebase 연동 구현 #4
Roy-wonji Mar 22, 2026
7bd010c
refactor: 온보딩 스텝 네비게이션 개선 및 애니메이션 추가 #4
Roy-wonji Mar 22, 2026
f7179e3
feat: 온보딩 외부 지도 앱 선택 기능 구현 #4
Roy-wonji Mar 22, 2026
cf6eaef
feat: 온보딩 외부 지도 앱 선택 기능 구현 #4
Roy-wonji Mar 22, 2026
f014215
feat: 온보딩 외부 지도 앱 선택 기능 구현 및 url sceheme 추가 #4
Roy-wonji Mar 22, 2026
4b9f038
feat: 온보딩 로고 이미지 추가 및 UI 연동 #4
Roy-wonji Mar 22, 2026
c9e8699
feat: 온보딩시 지도 로고 수정 #4
Roy-wonji Mar 22, 2026
f1c3893
feat: profile 모듈 추가 #5
Roy-wonji Mar 22, 2026
84c3a40
feat: google , apple oauth 로그인 추가 #3
Roy-wonji Mar 23, 2026
4b55fa6
feat: OAuth 인증 시스템 구현 및 Apple/Google 로그인 연동 #3
Roy-wonji Mar 23, 2026
2d6c1d6
feat: OAuth 인증 플로우 개선 및 상태 관리 최적화 #3
Roy-wonji Mar 23, 2026
fff970e
feat: OAuth 인증 완성 및 앱 아이콘 업데이트 #3
Roy-wonji Mar 23, 2026
8ca1295
feat: 스플래시 화면에 토큰 검증 및 자동 라우팅 로직 구현 #3
Roy-wonji Mar 23, 2026
d56da6c
feat: 온보딩 완료 후 메인 화면 라우팅 및 네비게이션 완성 #3
Roy-wonji Mar 23, 2026
434a0e9
fix: 코드 리뷰 이슈 해결 - 성능, 보안, 품질 개선
Roy-wonji Mar 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Entitlements/TimeSpot.entitlements
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
</dict>
</plist>
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ public extension ModulePath {
case Presentation
case Splash
case Home
case Auth
case OnBoarding
case Profile


public static let name: String = "Presentation"
Expand All @@ -36,8 +39,8 @@ public extension ModulePath {
case Foundations

public static let name: String = "Network"
case Networks
case ThirdPartys
case Networks
case ThirdPartys
}
}

Expand All @@ -64,7 +67,6 @@ public extension ModulePath {
case DataInterface
case DomainInterface


public static let name: String = "Domain"
}
}
Expand All @@ -75,7 +77,7 @@ public extension ModulePath {
case Shared
case DesignSystem
case Utill

public static let name: String = "Shared"
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ public extension Project {
scripts: [ProjectDescription.TargetScript] = [],
dependencies: [ProjectDescription.TargetDependency] = [],
sources: ProjectDescription.SourceFilesList = ["Sources/**"],
testSources: ProjectDescription.SourceFilesList = ["Tests/Sources/**"],
resources: ProjectDescription.ResourceFileElements? = nil,
infoPlist: ProjectDescription.InfoPlist = .default,
entitlements: ProjectDescription.Entitlements? = nil,
Expand Down Expand Up @@ -194,7 +195,7 @@ public extension Project {
bundleId: "\(bundleId).\(name)Tests",
deploymentTargets: deploymentTarget,
infoPlist: .default,
sources: ["Tests/Sources/**"],
sources: testSources,
dependencies: [.target(name: name)]
)
targets.append(appTestTarget)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ extension Settings {
.setCFBundleDisplayName(Project.Environment.appName)
.setMarketingVersion(.appVersion())
.setEnableBackgroundModes()
.setASAuthenticationServicesEnabled()
.setPushNotificationsEnabled()
.setEnableBackgroundModes()
.setArchs()
.setOtherLdFlags()
.setCurrentProjectVersion(.appBuildVersion())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,34 @@ extension InfoPlistDictionary {
func setCFBundleURLTypes() -> InfoPlistDictionary {
let dict: [String: Plist.Value] = [
"CFBundleURLTypes": .array([
// TimeSpot 앱 스킴
.dictionary([
"CFBundleURLName": .string("timespot"),
"CFBundleURLSchemes": .array([
.string("timespot")
])
]),
// 구글 OAuth
.dictionary([
"CFBundleURLName": .string("google-oauth"),
"CFBundleURLSchemes": .array([
.string("${REVERSED_CLIENT_ID}")
// .string("com.googleusercontent.apps.882277748169-glpolfiecue4lqqps6hmgj9t8lm1g5qp")
])
]),
// 구글 지도
.dictionary([
"CFBundleURLName": .string("google-maps"),
"CFBundleURLSchemes": .array([
.string("googlemaps"),
.string("comgooglemaps")
])
]),
// 네이버 지도
.dictionary([
"CFBundleURLName": .string("naver-maps"),
"CFBundleURLSchemes": .array([
.string("nmap"),
.string("nmapmobile")
])
])
])
Expand Down Expand Up @@ -181,7 +205,10 @@ extension InfoPlistDictionary {
func setGoogleClientID(_ value: String) -> InfoPlistDictionary {
return self.merging(["GOOGLE_CLIENT_ID": .string(value)]) { (_, new) in new }
}

func setGoogleClientiOSID(_ value: String) -> InfoPlistDictionary {
return self.merging(["GOOGLE_IOS_CLIENT_ID": .string(value)]) { (_, new) in new }
}

func setBaseURL(_ value: String) -> InfoPlistDictionary {
return self.merging(["BASE_URL": .string(value)]) { (_, new) in new }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ public extension InfoPlist {
.setBaseURL("$(BASE_URL)")
.setNMFGovClientId("$(NMFGovClientId)")
.setNMFGovClientSecret("$(NMFGovClientSecret)")
.setGoogleReversedClientID("${REVERSED_CLIENT_ID}")
.setGoogleClientID("${GOOGLE_CLIENT_ID}")
.setGoogleClientiOSID("${GOOGLE_IOS_CLIENT_ID}")
.setGIDClientID("${GOOGLE_CLIENT_ID}")

.setUILaunchScreens()
.setLocationPermissions()

Expand Down
6 changes: 4 additions & 2 deletions Projects/App/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@ let project = Project.makeAppModule(
.Data(implements: .Repository)
],
sources: ["Sources/**"],
resources: ["Resources/**"],
resources: ["Resources/**", "FontAsset/**"],
infoPlist: .appInfoPlist,
entitlements: .file(path: "../../Entitlements/TimeSpot.entitlements"),
schemes: [
// 테스트 플랜 스킴: 커스텀 구성명 사용 (.dev / .stage / .prod 중 택1)
Scheme.makeTestPlanScheme(target: .dev, name: Project.Environment.appName),

],
hasTests: true
hasTests: true,

)

Original file line number Diff line number Diff line change
@@ -1,93 +1,33 @@
{
"images" : [
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
"filename" : "darklogo 1.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "darklogo.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"idiom" : "ios-marketing",
"scale" : "1x",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"filename" : "lightlogo.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
14 changes: 14 additions & 0 deletions Projects/App/Resources/GoogleService-Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>675750881243-906jvg87rchck7ao25ffmcttebpcuc5o.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.675750881243-906jvg87rchck7ao25ffmcttebpcuc5o</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>io.TimeSpot.co</string>
</dict>
</plist>
2 changes: 1 addition & 1 deletion Projects/App/Sources/Application/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
}

// 네이버맵 초기화 (Home 모듈의 NaverMapInitializer 사용)
NaverMapInitializer.shared.initialize()
NaverMapInitializer.initialize()

return true
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@ import SwiftUI
import ComposableArchitecture

@main
struct NomadSpotApp: App {
struct TimeSpotApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

init() {

}

var body: some Scene {
WindowGroup {
let store = Store(initialState: AppReducer.State()) {
#if DEBUG
AppReducer()
._printChanges()
._printChanges(.actionLabels)
#else
AppReducer()
#endif
}

AppView(store: store)
Expand Down
23 changes: 10 additions & 13 deletions Projects/App/Sources/ContentView.swift
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import SwiftUI

public struct ContentView: View {
public init() {}

public var body: some View {
Text("Hello, World!")
.padding()
}
}


#Preview {
ContentView()
import Presentation
import ComposableArchitecture

#Preview("login") {
LoginView(store: Store(
initialState: LoginFeature.State(),
reducer: {
LoginFeature()
}
))
}
34 changes: 14 additions & 20 deletions Projects/App/Sources/Di/DiRegister.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ import WeaveDI


/// 🚀 **앱 전역 DI 관리자**
public class AppDIManager: @unchecked Sendable {
@MainActor
public final class AppDIManager {
public static let shared = AppDIManager()

private init() {}
Expand All @@ -32,25 +33,18 @@ public class AppDIManager: @unchecked Sendable {
return KeychainTokenProvider(keychainManager: keychainManager) as TokenProviding
}
.register(DirectionInterface.self) { DirectionRepositoryImpl() }
// .register(ProfileInterface.self) { ProfileRepositoryImpl() }
// // MARK: - 로그인
// .register { AuthRepositoryImpl() as AuthInterface }
// .register { GoogleOAuthRepositoryImpl() as GoogleOAuthInterface }
// .register { AppleLoginRepositoryImpl() as AppleAuthRequestInterface }
// .register { AppleOAuthRepositoryImpl() as AppleOAuthInterface }
// .register { AppleOAuthProvider() as AppleOAuthProviderInterface }
// .register { GoogleOAuthProvider() as GoogleOAuthProviderInterface }
// // MARK: - 온보딩
// .register { OnBoardingRepositoryImpl() as OnBoardingInterface }
// .register { SignUpRepositoryImpl() as SignUpInterface }
// // MARK: - 출석
// .register { AttendanceRepositoryImpl() as AttendanceInterface }
// // MARK: - 마이페이지
// .register { MyPageRepositoryImpl() as MyPageRepositoryInterface }
// // MARK: - 스케줄
// .register { ScheduleRepositoryImpl() as ScheduleInterface }
// // MARK: - QRCode
// .register { QRCodeRepositoryImpl() as QRCodeInterface }
// MARK: - 로그인
.register { AuthRepositoryImpl() as AuthInterface }
.register { GoogleOAuthRepositoryImpl() as GoogleOAuthInterface }
.register { GoogleOAuthProvider() as GoogleOAuthProviderInterface }
.register { AppleLoginRepositoryImpl() as AppleAuthRequestInterface }
.register { AppleOAuthRepositoryImpl() as AppleOAuthInterface }
.register { AppleOAuthProvider() as AppleOAuthProviderInterface }
// MARK: - 회원가입
.register { SignUpRepositoryImpl() as SignUpInterface }



.configure()
}
}
Loading