Skip to content

Commit 49f6897

Browse files
fix: 앱 시작 시점 계정정보 바로 불러오도록 수정
feat: 크래시 버튼 제거
1 parent cae98db commit 49f6897

83 files changed

Lines changed: 432 additions & 199 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/docs/clock-convention.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
- UseCase, Repository, DataSource 등 시간을 다루는 모든 레이어에 적용된다.
99
- 타임스탬프가 필요한 경우: `clock.now().toEpochMilliseconds()`.
1010

11+
### 예외: Compose 레이어
12+
13+
- Composable, `remember*` 함수, ScaffoldState 등 **Compose 레이어**에서는 `Clock.System` 직접 사용을 허용한다.
14+
- 이유: Composable/`remember*` 시그니처에 `Clock`을 강제 주입하면 호출부 부담이 커지고, UI 상태 초기값에 사용되는 현재 시각은 테스트 결정성보다 호출 시점의 자연스러운 사용성이 더 중요하다.
15+
- 대신 Compose 레이어가 호출하는 ViewModel/UseCase/Repository는 컨벤션을 지킨다.
16+
1117
### 이유
1218

1319
- 테스트에서 시간을 고정할 수 있어야 TC가 결정론적으로 동작한다.

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,7 @@ xcuserdata/
2222

2323
# Google
2424
google-services.json
25-
GoogleService-Info.plist
25+
GoogleService-Info.plist
26+
27+
# SPM
28+
exportedKMP*/

CLAUDE.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ Kotlin Multiplatform 일기/메모 앱 (Android, iOS, JVM, WASM).
1717

1818
ProjectGuard로 강제한다. domain은 data/feature를 알 수 없고, feature는 data를 직접 참조할 수 없다.
1919

20+
## 의존성 추가 규칙
21+
22+
- **코드 최소화**: 상위 의존성으로 transitively 포함되는 의존성은 명시적으로 추가하지 않는다.
23+
- 예: `compose-material3` 추가 시 `compose-foundation`, `compose-ui`는 transitive로 함께 적용되므로 별도로 추가하지 않는다.
24+
- **범위 최소화**: 실제 사용하는 최소 범위의 의존성만 추가한다.
25+
- 예: `compose-runtime`만 필요하면 `compose-runtime`만 추가한다. `compose-ui`, `compose-foundation` 등 상위 의존성은 추가하지 않는다.
26+
2027
## 공통 컨벤션
2128

2229
- Clock 주입: @.claude/docs/clock-convention.md

Diary/Diary.xcodeproj/project.pbxproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@
315315
"$(inherited)",
316316
"@executable_path/Frameworks",
317317
);
318-
MARKETING_VERSION = 1.8.1;
318+
MARKETING_VERSION = 1.8.2;
319319
OTHER_LDFLAGS = "";
320320
PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary.dev;
321321
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -413,7 +413,7 @@
413413
"$(inherited)",
414414
"@executable_path/Frameworks",
415415
);
416-
MARKETING_VERSION = 1.8.1;
416+
MARKETING_VERSION = 1.8.2;
417417
OTHER_LDFLAGS = "";
418418
PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary;
419419
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -518,7 +518,7 @@
518518
"$(inherited)",
519519
"@executable_path/Frameworks",
520520
);
521-
MARKETING_VERSION = 1.8.1;
521+
MARKETING_VERSION = 1.8.2;
522522
OTHER_LDFLAGS = "";
523523
PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary;
524524
PRODUCT_NAME = "$(TARGET_NAME)";

app/android/dependencies/realReleaseRuntimeClasspath.txt

Lines changed: 116 additions & 116 deletions
Large diffs are not rendered by default.

app/shared/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ kotlin {
5050
implementation(projects.feature.routine)
5151
implementation(projects.feature.tag)
5252
implementation(projects.library.navigation3Runtime)
53+
implementation(projects.logger.analytics.api)
5354
implementation(libs.jetbrains.compose.material3.navigation.suite)
5455
implementation(libs.jetbrains.navigation3.ui)
5556
implementation(libs.coil.compose)

app/shared/src/commonMain/kotlin/io/github/taetae98coding/diary/app/shared/AppNavigation.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.navigation3.scene.Scene
1212
import androidx.navigation3.scene.SinglePaneSceneStrategy
1313
import androidx.navigation3.ui.NavDisplay
1414
import androidx.navigationevent.NavigationEvent
15+
import io.github.taetae98coding.diary.app.shared.navigation3.rememberAnalyticsNavEntryDecorator
1516
import io.github.taetae98coding.diary.app.shared.navigation3.rememberRetainedValuesStoreNavEntryDecorator
1617
import io.github.taetae98coding.diary.feature.calendar.calendarEntry
1718
import io.github.taetae98coding.diary.feature.login.loginEntry
@@ -32,6 +33,7 @@ internal fun AppNavigation(
3233
rememberSaveableStateHolderNavEntryDecorator(),
3334
rememberRetainedValuesStoreNavEntryDecorator(),
3435
rememberViewModelStoreNavEntryDecorator(),
36+
rememberAnalyticsNavEntryDecorator(),
3537
),
3638
sceneStrategies = listOf(
3739
DialogSceneStrategy(),
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.github.taetae98coding.diary.app.shared.navigation3
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.remember
5+
import androidx.lifecycle.Lifecycle
6+
import androidx.lifecycle.compose.LifecycleEventEffect
7+
import androidx.navigation3.runtime.NavEntryDecorator
8+
import io.github.taetae98coding.diary.logger.analytics.api.AnalyticsLogEntry
9+
import io.github.taetae98coding.diary.logger.core.DiaryLogger
10+
11+
internal class AnalyticsNavEntryDecorator<T : Any> :
12+
NavEntryDecorator<T>(
13+
decorate = { entry ->
14+
val screenName = entry.contentKey::class.simpleName.orEmpty()
15+
16+
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
17+
DiaryLogger.log(
18+
AnalyticsLogEntry(
19+
name = "screen_view",
20+
params = mapOf("screen_name" to screenName),
21+
),
22+
)
23+
}
24+
25+
entry.Content()
26+
},
27+
)
28+
29+
@Composable
30+
internal fun <T : Any> rememberAnalyticsNavEntryDecorator(): AnalyticsNavEntryDecorator<T> {
31+
return remember { AnalyticsNavEntryDecorator() }
32+
}

app/shared/src/nonAppleMain/kotlin/io/github/taetae98coding/diary/app/shared/AppNavigation.nonApple.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import androidx.navigation3.ui.defaultPredictivePopTransitionSpec
88
import androidx.navigation3.ui.defaultTransitionSpec
99
import androidx.navigationevent.NavigationEvent
1010

11-
internal actual fun <T : Any> platformTransitionSpec(state: io.github.taetae98coding.diary.app.shared.AppState): androidx.compose.animation.AnimatedContentTransitionScope<androidx.navigation3.scene.Scene<T>>.() -> androidx.compose.animation.ContentTransform {
11+
internal actual fun <T : Any> platformTransitionSpec(state: AppState): AnimatedContentTransitionScope<Scene<T>>.() -> ContentTransform {
1212
return defaultTransitionSpec()
1313
}
1414

app/wasm/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ kotlin {
1818
dependencies {
1919
implementation(projects.app.shared)
2020
implementation(libs.jetbrains.compose.components.resources)
21-
implementation(libs.jetbrains.compose.ui)
2221
implementation(libs.jetbrains.compose.material3)
2322
}
2423
}

0 commit comments

Comments
 (0)