Skip to content

Commit 48669d9

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

80 files changed

Lines changed: 311 additions & 78 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

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
}

build-logic/src/main/kotlin/plugin/primitive/ComposePrimitivePlugin.kt

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import io.github.taetae98coding.diary.gradle.plugins
44
import org.gradle.api.Plugin
55
import org.gradle.api.Project
66
import org.gradle.kotlin.dsl.configure
7-
import org.gradle.kotlin.dsl.findByType
87
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension
9-
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
108

119
internal class ComposePrimitivePlugin : Plugin<Project> {
1210
override fun apply(target: Project) {
@@ -15,21 +13,6 @@ internal class ComposePrimitivePlugin : Plugin<Project> {
1513
apply("org.jetbrains.kotlin.plugin.compose")
1614
}
1715

18-
target.extensions
19-
.findByType<KotlinMultiplatformExtension>()
20-
?.apply {
21-
compilerOptions {
22-
optIn.addAll(
23-
"androidx.compose.ui.ExperimentalComposeUiApi",
24-
"androidx.compose.foundation.ExperimentalFoundationApi",
25-
"androidx.compose.foundation.layout.ExperimentalFlexBoxApi",
26-
"androidx.compose.material3.ExperimentalMaterial3Api",
27-
"androidx.compose.material3.ExperimentalMaterial3ExpressiveApi",
28-
"androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi",
29-
)
30-
}
31-
}
32-
3316
target.configure<ComposeCompilerGradlePluginExtension> {
3417
metricsDestination.set(target.projectDir.resolve("build/compose/metrics"))
3518
reportsDestination.set(target.projectDir.resolve("build/compose/reports"))

build-logic/src/main/kotlin/plugin/primitive/WasmPrimitivePlugin.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import io.github.taetae98coding.diary.gradle.plugins
44
import org.gradle.api.Plugin
55
import org.gradle.api.Project
66
import org.gradle.kotlin.dsl.configure
7+
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
78
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
89

910
internal class WasmPrimitivePlugin : Plugin<Project> {
11+
@OptIn(ExperimentalWasmDsl::class)
1012
override fun apply(target: Project) {
1113
target.plugins {
1214
apply("org.jetbrains.kotlin.multiplatform")

0 commit comments

Comments
 (0)