diff --git a/Diary/Diary.xcodeproj/project.pbxproj b/Diary/Diary.xcodeproj/project.pbxproj
index bc899dc0..f2e8ff92 100644
--- a/Diary/Diary.xcodeproj/project.pbxproj
+++ b/Diary/Diary.xcodeproj/project.pbxproj
@@ -315,7 +315,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.8.0;
+ MARKETING_VERSION = 1.8.1;
OTHER_LDFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary.dev;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -413,7 +413,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.8.0;
+ MARKETING_VERSION = 1.8.1;
OTHER_LDFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -518,7 +518,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.8.0;
+ MARKETING_VERSION = 1.8.1;
OTHER_LDFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = io.github.taetae98coding.diary;
PRODUCT_NAME = "$(TARGET_NAME)";
diff --git a/Diary/Diary/DiaryApp.swift b/Diary/Diary/DiaryApp.swift
index 804f26d0..12081157 100644
--- a/Diary/Diary/DiaryApp.swift
+++ b/Diary/Diary/DiaryApp.swift
@@ -1,10 +1,12 @@
import SwiftUI
import FirebaseCore
+import KMP
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
FirebaseApp.configure()
+ LoggerInitializerKt.setupLogger()
return true
}
diff --git a/app/android/build.gradle.kts b/app/android/build.gradle.kts
index 189c151d..a986ffbb 100644
--- a/app/android/build.gradle.kts
+++ b/app/android/build.gradle.kts
@@ -84,7 +84,12 @@ dependencyGuard {
dependencies {
implementation(projects.app.shared)
+ implementation(projects.logger.core)
+ implementation(projects.logger.analytics.impl)
+ implementation(projects.logger.console.impl)
+ implementation(projects.logger.crashlytics.impl)
implementation(libs.androidx.activity.compose)
+ implementation(libs.androidx.startup.runtime)
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.analytics)
implementation(libs.firebase.crashlytics)
diff --git a/app/android/dependencies/realReleaseRuntimeClasspath.txt b/app/android/dependencies/realReleaseRuntimeClasspath.txt
index 28019611..1bc9218d 100644
--- a/app/android/dependencies/realReleaseRuntimeClasspath.txt
+++ b/app/android/dependencies/realReleaseRuntimeClasspath.txt
@@ -10,7 +10,7 @@ androidx.arch.core:core-common:2.2.0
androidx.arch.core:core-runtime:2.2.0
androidx.autofill:autofill:1.0.0
androidx.biometric:biometric:1.1.0
-androidx.browser:browser:1.9.0
+androidx.browser:browser:1.10.0
androidx.collection:collection-jvm:1.5.0
androidx.collection:collection-ktx:1.5.0
androidx.collection:collection:1.5.0
@@ -244,25 +244,25 @@ com.squareup.okhttp3:okhttp-android:5.3.2
com.squareup.okhttp3:okhttp:5.3.2
com.squareup.okio:okio-jvm:3.17.0
com.squareup.okio:okio:3.17.0
-dev.whyoleg.cryptography:cryptography-bigint-jvm:0.5.0
-dev.whyoleg.cryptography:cryptography-bigint:0.5.0
-dev.whyoleg.cryptography:cryptography-bom:0.5.0
-dev.whyoleg.cryptography:cryptography-core-jvm:0.5.0
-dev.whyoleg.cryptography:cryptography-core:0.5.0
-dev.whyoleg.cryptography:cryptography-provider-base-jvm:0.5.0
-dev.whyoleg.cryptography:cryptography-provider-base:0.5.0
-dev.whyoleg.cryptography:cryptography-provider-jdk-jvm:0.5.0
-dev.whyoleg.cryptography:cryptography-provider-jdk:0.5.0
-dev.whyoleg.cryptography:cryptography-provider-optimal-jvm:0.5.0
-dev.whyoleg.cryptography:cryptography-provider-optimal:0.5.0
-dev.whyoleg.cryptography:cryptography-random-jvm:0.5.0
-dev.whyoleg.cryptography:cryptography-random:0.5.0
-dev.whyoleg.cryptography:cryptography-serialization-asn1-jvm:0.5.0
-dev.whyoleg.cryptography:cryptography-serialization-asn1-modules-jvm:0.5.0
-dev.whyoleg.cryptography:cryptography-serialization-asn1-modules:0.5.0
-dev.whyoleg.cryptography:cryptography-serialization-asn1:0.5.0
-dev.whyoleg.cryptography:cryptography-serialization-pem-jvm:0.5.0
-dev.whyoleg.cryptography:cryptography-serialization-pem:0.5.0
+dev.whyoleg.cryptography:cryptography-bigint-jvm:0.6.0
+dev.whyoleg.cryptography:cryptography-bigint:0.6.0
+dev.whyoleg.cryptography:cryptography-bom:0.6.0
+dev.whyoleg.cryptography:cryptography-core-jvm:0.6.0
+dev.whyoleg.cryptography:cryptography-core:0.6.0
+dev.whyoleg.cryptography:cryptography-provider-base-jvm:0.6.0
+dev.whyoleg.cryptography:cryptography-provider-base:0.6.0
+dev.whyoleg.cryptography:cryptography-provider-jdk-jvm:0.6.0
+dev.whyoleg.cryptography:cryptography-provider-jdk:0.6.0
+dev.whyoleg.cryptography:cryptography-provider-optimal-jvm:0.6.0
+dev.whyoleg.cryptography:cryptography-provider-optimal:0.6.0
+dev.whyoleg.cryptography:cryptography-random-jvm:0.6.0
+dev.whyoleg.cryptography:cryptography-random:0.6.0
+dev.whyoleg.cryptography:cryptography-serialization-asn1-jvm:0.6.0
+dev.whyoleg.cryptography:cryptography-serialization-asn1-modules-jvm:0.6.0
+dev.whyoleg.cryptography:cryptography-serialization-asn1-modules:0.6.0
+dev.whyoleg.cryptography:cryptography-serialization-asn1:0.6.0
+dev.whyoleg.cryptography:cryptography-serialization-pem-jvm:0.6.0
+dev.whyoleg.cryptography:cryptography-serialization-pem:0.6.0
io.coil-kt.coil3:coil-android:3.4.0
io.coil-kt.coil3:coil-compose-android:3.4.0
io.coil-kt.coil3:coil-compose-core-android:3.4.0
@@ -275,12 +275,14 @@ io.coil-kt.coil3:coil-network-core:3.4.0
io.coil-kt.coil3:coil-network-ktor3-android:3.4.0
io.coil-kt.coil3:coil-network-ktor3:3.4.0
io.coil-kt.coil3:coil:3.4.0
-io.github.jan-tennert.supabase:auth-kt-android:3.5.0
-io.github.jan-tennert.supabase:auth-kt:3.5.0
-io.github.jan-tennert.supabase:functions-kt-android:3.5.0
-io.github.jan-tennert.supabase:functions-kt:3.5.0
-io.github.jan-tennert.supabase:supabase-kt-android:3.5.0
-io.github.jan-tennert.supabase:supabase-kt:3.5.0
+io.github.aakira:napier-android:2.7.1
+io.github.aakira:napier:2.7.1
+io.github.jan-tennert.supabase:auth-kt-android:3.6.0
+io.github.jan-tennert.supabase:auth-kt:3.6.0
+io.github.jan-tennert.supabase:functions-kt-android:3.6.0
+io.github.jan-tennert.supabase:functions-kt:3.6.0
+io.github.jan-tennert.supabase:supabase-kt-android:3.6.0
+io.github.jan-tennert.supabase:supabase-kt:3.6.0
io.insert-koin:koin-android:4.2.1
io.insert-koin:koin-androidx-workmanager:4.2.1
io.insert-koin:koin-annotations-jvm:4.2.1
@@ -368,18 +370,18 @@ org.jetbrains.kotlinx:atomicfu-jvm:0.28.0
org.jetbrains.kotlinx:atomicfu:0.28.0
org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.4.0
org.jetbrains.kotlinx:kotlinx-collections-immutable:0.4.0
-org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0-rc01
-org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.11.0-rc01
-org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.11.0-rc01
-org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0-rc01
-org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.11.0-rc01
-org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.11.0-rc01
-org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.8.0-rc01
-org.jetbrains.kotlinx:kotlinx-datetime:0.8.0-rc01
-org.jetbrains.kotlinx:kotlinx-io-bytestring-jvm:0.8.2
-org.jetbrains.kotlinx:kotlinx-io-bytestring:0.8.2
-org.jetbrains.kotlinx:kotlinx-io-core-jvm:0.8.2
-org.jetbrains.kotlinx:kotlinx-io-core:0.8.2
+org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0-rc02
+org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.11.0-rc02
+org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.11.0-rc02
+org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0-rc02
+org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.11.0-rc02
+org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.11.0-rc02
+org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.8.0-rc02
+org.jetbrains.kotlinx:kotlinx-datetime:0.8.0-rc02
+org.jetbrains.kotlinx:kotlinx-io-bytestring-jvm:0.9.0
+org.jetbrains.kotlinx:kotlinx-io-bytestring:0.9.0
+org.jetbrains.kotlinx:kotlinx-io-core-jvm:0.9.0
+org.jetbrains.kotlinx:kotlinx-io-core:0.9.0
org.jetbrains.kotlinx:kotlinx-serialization-bom:1.11.0
org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.11.0
org.jetbrains.kotlinx:kotlinx-serialization-core:1.11.0
diff --git a/app/android/src/main/AndroidManifest.xml b/app/android/src/main/AndroidManifest.xml
index 4a16d6c7..1345f5b0 100644
--- a/app/android/src/main/AndroidManifest.xml
+++ b/app/android/src/main/AndroidManifest.xml
@@ -29,6 +29,9 @@
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
+
diff --git a/app/android/src/main/kotlin/io/github/taetae98coding/diary/initializer/LoggerInitializer.kt b/app/android/src/main/kotlin/io/github/taetae98coding/diary/initializer/LoggerInitializer.kt
new file mode 100644
index 00000000..0a0d4638
--- /dev/null
+++ b/app/android/src/main/kotlin/io/github/taetae98coding/diary/initializer/LoggerInitializer.kt
@@ -0,0 +1,18 @@
+package io.github.taetae98coding.diary.initializer
+
+import android.content.Context
+import androidx.startup.Initializer
+import io.github.taetae98coding.diary.logger.analytics.impl.AndroidAnalyticsLogger
+import io.github.taetae98coding.diary.logger.console.impl.ConsoleLogger
+import io.github.taetae98coding.diary.logger.core.DiaryLogger
+import io.github.taetae98coding.diary.logger.crashlytics.impl.AndroidCrashlyticsLogger
+
+internal class LoggerInitializer : Initializer {
+ override fun create(context: Context) {
+ DiaryLogger.addLogger(ConsoleLogger)
+ DiaryLogger.addLogger(AndroidAnalyticsLogger)
+ DiaryLogger.addLogger(AndroidCrashlyticsLogger)
+ }
+
+ override fun dependencies(): List>> = emptyList()
+}
diff --git a/app/ios/build.gradle.kts b/app/ios/build.gradle.kts
index 18140bef..fff8a3e3 100644
--- a/app/ios/build.gradle.kts
+++ b/app/ios/build.gradle.kts
@@ -22,6 +22,10 @@ kotlin {
commonMain {
dependencies {
implementation(projects.app.shared)
+ implementation(projects.logger.core)
+ implementation(projects.logger.analytics.impl)
+ implementation(projects.logger.console.impl)
+ implementation(projects.logger.crashlytics.impl)
implementation(libs.jetbrains.compose.ui)
}
}
diff --git a/app/ios/src/commonMain/kotlin/io/github/taetae98coding/diary/initializer/LoggerInitializer.kt b/app/ios/src/commonMain/kotlin/io/github/taetae98coding/diary/initializer/LoggerInitializer.kt
new file mode 100644
index 00000000..e1867ad1
--- /dev/null
+++ b/app/ios/src/commonMain/kotlin/io/github/taetae98coding/diary/initializer/LoggerInitializer.kt
@@ -0,0 +1,12 @@
+package io.github.taetae98coding.diary.initializer
+
+import io.github.taetae98coding.diary.logger.analytics.impl.AppleAnalyticsLogger
+import io.github.taetae98coding.diary.logger.console.impl.ConsoleLogger
+import io.github.taetae98coding.diary.logger.core.DiaryLogger
+import io.github.taetae98coding.diary.logger.crashlytics.impl.AppleCrashlyticsLogger
+
+public fun setupLogger() {
+ DiaryLogger.addLogger(ConsoleLogger)
+ DiaryLogger.addLogger(AppleAnalyticsLogger)
+ DiaryLogger.addLogger(AppleCrashlyticsLogger)
+}
diff --git a/app/jvm/build.gradle.kts b/app/jvm/build.gradle.kts
index 0be62818..a8af71ec 100644
--- a/app/jvm/build.gradle.kts
+++ b/app/jvm/build.gradle.kts
@@ -13,6 +13,8 @@ kotlin {
commonMain {
dependencies {
implementation(projects.app.shared)
+ implementation(projects.logger.core)
+ implementation(projects.logger.console.impl)
implementation(libs.jetbrains.compose.ui)
runtimeOnly(compose.desktop.currentOs)
}
diff --git a/app/jvm/src/commonMain/kotlin/io/github/taetae98coding/diary/JvmApp.kt b/app/jvm/src/commonMain/kotlin/io/github/taetae98coding/diary/JvmApp.kt
index a15cd64c..2443a68d 100644
--- a/app/jvm/src/commonMain/kotlin/io/github/taetae98coding/diary/JvmApp.kt
+++ b/app/jvm/src/commonMain/kotlin/io/github/taetae98coding/diary/JvmApp.kt
@@ -5,6 +5,8 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.WindowState
import androidx.compose.ui.window.singleWindowApplication
import io.github.taetae98coding.diary.app.shared.App
+import io.github.taetae98coding.diary.logger.console.impl.ConsoleLogger
+import io.github.taetae98coding.diary.logger.core.DiaryLogger
import java.awt.Dimension
// iPhone 17 Pro Max 비율
@@ -15,6 +17,8 @@ private const val MIN_WIDTH = 360
private const val MIN_HEIGHT = 784
public fun main() {
+ DiaryLogger.addLogger(ConsoleLogger)
+
singleWindowApplication(
state = WindowState(size = DpSize(WIDTH.dp, HEIGHT.dp)),
title = BuildKonfig.APP_NAME,
diff --git a/app/shared/build.gradle.kts b/app/shared/build.gradle.kts
index ef7c8de1..98fee2fb 100644
--- a/app/shared/build.gradle.kts
+++ b/app/shared/build.gradle.kts
@@ -116,6 +116,9 @@ buildkonfig {
buildConfigField(type = STRING, name = "APP_NAME", value = "DiaryDev", nullable = false, const = true)
buildConfigField(type = STRING, name = "GOOGLE_CLIENT_ID", value = requireNotNull(localProperties.getProperty("dev.desktop.google.client.id")), nullable = false, const = true)
}
+ create("wasmJs") {
+ buildConfigField(type = STRING, name = "GOOGLE_CLIENT_ID", value = requireNotNull(localProperties.getProperty("dev.web.google.client.id")), nullable = false, const = true)
+ }
}
targetConfigs("real") {
@@ -126,5 +129,8 @@ buildkonfig {
buildConfigField(type = STRING, name = "APP_NAME", value = "Diary", nullable = false, const = true)
buildConfigField(type = STRING, name = "GOOGLE_CLIENT_ID", value = requireNotNull(localProperties.getProperty("real.desktop.google.client.id")), nullable = false, const = true)
}
+ create("wasmJs") {
+ buildConfigField(type = STRING, name = "GOOGLE_CLIENT_ID", value = requireNotNull(localProperties.getProperty("real.web.google.client.id")), nullable = false, const = true)
+ }
}
}
diff --git a/app/shared/src/commonMain/kotlin/io/github/taetae98coding/diary/app/shared/App.kt b/app/shared/src/commonMain/kotlin/io/github/taetae98coding/diary/app/shared/App.kt
index c3ad1f6a..10046a4c 100644
--- a/app/shared/src/commonMain/kotlin/io/github/taetae98coding/diary/app/shared/App.kt
+++ b/app/shared/src/commonMain/kotlin/io/github/taetae98coding/diary/app/shared/App.kt
@@ -22,7 +22,7 @@ public fun App(configuration: KoinAppDeclaration = {}) {
},
) {
DiaryTheme {
- AppScaffold()
+ AppScaffold(state = rememberAppState())
}
}
}
diff --git a/app/shared/src/commonMain/kotlin/io/github/taetae98coding/diary/app/shared/AppScaffold.kt b/app/shared/src/commonMain/kotlin/io/github/taetae98coding/diary/app/shared/AppScaffold.kt
index a7378777..e499f59e 100644
--- a/app/shared/src/commonMain/kotlin/io/github/taetae98coding/diary/app/shared/AppScaffold.kt
+++ b/app/shared/src/commonMain/kotlin/io/github/taetae98coding/diary/app/shared/AppScaffold.kt
@@ -25,8 +25,8 @@ import org.koin.compose.viewmodel.koinViewModel
@Composable
internal fun AppScaffold(
+ state: AppState,
modifier: Modifier = Modifier,
- state: AppState = rememberAppState(),
) {
NavigationSuiteScaffold(
modifier = modifier
diff --git a/app/shared/src/wasmJsMain/kotlin/io/github/taetae98coding/diary/app/shared/WasmJsAppModule.kt b/app/shared/src/wasmJsMain/kotlin/io/github/taetae98coding/diary/app/shared/WasmJsAppModule.kt
new file mode 100644
index 00000000..6b336a0a
--- /dev/null
+++ b/app/shared/src/wasmJsMain/kotlin/io/github/taetae98coding/diary/app/shared/WasmJsAppModule.kt
@@ -0,0 +1,16 @@
+package io.github.taetae98coding.diary.app.shared
+
+import io.github.taetae98coding.diary.feature.login.di.GoogleClientId
+import org.koin.core.annotation.Configuration
+import org.koin.core.annotation.Factory
+import org.koin.core.annotation.Module
+
+@Module
+@Configuration
+public class WasmJsAppModule {
+ @Factory
+ @GoogleClientId
+ internal fun providesGoogleClientId(): String {
+ return BuildKonfig.GOOGLE_CLIENT_ID
+ }
+}
diff --git a/app/wasm/build.gradle.kts b/app/wasm/build.gradle.kts
index 28468885..df325eea 100644
--- a/app/wasm/build.gradle.kts
+++ b/app/wasm/build.gradle.kts
@@ -17,8 +17,16 @@ kotlin {
commonMain {
dependencies {
implementation(projects.app.shared)
+ implementation(libs.jetbrains.compose.components.resources)
implementation(libs.jetbrains.compose.ui)
+ implementation(libs.jetbrains.compose.material3)
}
}
}
}
+
+compose.resources {
+ publicResClass = false
+ packageOfResClass = "io.github.taetae98coding.diary"
+ generateResClass = always
+}
diff --git a/app/wasm/src/wasmJsMain/composeResources/font/NotoSans.ttf b/app/wasm/src/wasmJsMain/composeResources/font/NotoSans.ttf
new file mode 100644
index 00000000..36e634d2
Binary files /dev/null and b/app/wasm/src/wasmJsMain/composeResources/font/NotoSans.ttf differ
diff --git a/app/wasm/src/wasmJsMain/kotlin/io/github/taetae98coding/diary/WasmApp.kt b/app/wasm/src/wasmJsMain/kotlin/io/github/taetae98coding/diary/WasmApp.kt
index 9a7f971d..32e24a6e 100644
--- a/app/wasm/src/wasmJsMain/kotlin/io/github/taetae98coding/diary/WasmApp.kt
+++ b/app/wasm/src/wasmJsMain/kotlin/io/github/taetae98coding/diary/WasmApp.kt
@@ -1,13 +1,33 @@
package io.github.taetae98coding.diary
+import androidx.compose.material3.MaterialExpressiveTheme
+import androidx.compose.material3.Typography
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.window.ComposeViewport
import io.github.taetae98coding.diary.app.shared.App
import kotlinx.browser.document
+import org.jetbrains.compose.resources.ExperimentalResourceApi
+import org.jetbrains.compose.resources.preloadFont
public fun main() {
ComposeViewport(
viewportContainer = requireNotNull(document.body),
) {
- App()
+ val fontFamily = rememberNotoSansFontFamily()
+
+ fontFamily?.let { family ->
+ MaterialExpressiveTheme(typography = Typography(fontFamily = family)) {
+ App()
+ }
+ }
}
}
+
+@OptIn(ExperimentalResourceApi::class)
+@Composable
+private fun rememberNotoSansFontFamily(): FontFamily? {
+ val font by preloadFont(Res.font.NotoSans)
+ return font?.let { FontFamily(it) }
+}
diff --git a/app/wasm/src/wasmJsMain/resources/index.html b/app/wasm/src/wasmJsMain/resources/index.html
index 3e728e76..af8d0361 100644
--- a/app/wasm/src/wasmJsMain/resources/index.html
+++ b/app/wasm/src/wasmJsMain/resources/index.html
@@ -15,6 +15,7 @@
+