diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 1e66c54..cf1e00e 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -4,19 +4,15 @@
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 5f68ff0..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index ba43f69..94a25f7 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,7 +1,6 @@
-
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleMain.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleMain.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleMain.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleMain.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleTest.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleTest.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleTest.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-appleTest.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosMain.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosMain.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosMain.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosMain.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosTest.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosTest.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosTest.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-iosTest.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeMain.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeMain.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeMain.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeMain.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeTest.cinteropLibraries b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeTest.cinteropLibraries
index ea34d7d..72d5eba 100644
--- a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeTest.cinteropLibraries
+++ b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/.composeApp-nativeTest.cinteropLibraries
@@ -1,4 +1,4 @@
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
-/Users/neuradev/Documents/Development/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
+/Users/rustamibrahimov/AndroidStudioProjects/JetHabit/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
\ No newline at end of file
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib
index 26e1164..fafb04b 100644
Binary files a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib and b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-bundled-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-bundled-cinterop-androidXBundledSqlite-0MuvrA.klib differ
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib
index e98780c..204a748 100644
Binary files a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib and b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/androidx.sqlite-sqlite-framework-2.5.0-alpha03-nativeMain-cinterop/androidx.sqlite_sqlite-framework-cinterop-sqlite3-GE3pgw.klib differ
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib
index ad1bbf7..fdf83c7 100644
Binary files a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib and b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.compose.ui-ui-uikit-1.6.10-uikitMain-cinterop/org.jetbrains.compose.ui_ui-uikit-cinterop-utils-DC3XFw.klib differ
diff --git a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib
index f7fc97b..1d4b488 100644
Binary files a/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib and b/.kotlin/metadata/kotlinTransformedCInteropMetadataLibraries/org.jetbrains.kotlinx-atomicfu-0.23.2-nativeMain-cinterop/org.jetbrains.kotlinx_atomicfu-cinterop-interop-yBS35w.klib differ
diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts
index 47edfa7..0d49c6c 100644
--- a/composeApp/build.gradle.kts
+++ b/composeApp/build.gradle.kts
@@ -28,7 +28,7 @@ kotlin {
}
}
- jvmToolchain(21)
+ jvmToolchain(11)
androidTarget()
jvm()
@@ -90,6 +90,9 @@ kotlin {
implementation(libs.room.sqlite)
implementation(libs.room.sqlite.bundled)
+
+ implementation(libs.kotlinx.datetime)
+
}
androidMain.dependencies {
diff --git a/composeApp/composeApp.podspec b/composeApp/composeApp.podspec
index 5bf016c..8b71a6b 100644
--- a/composeApp/composeApp.podspec
+++ b/composeApp/composeApp.podspec
@@ -43,7 +43,7 @@ Pod::Spec.new do |spec|
fi
set -ev
REPO_ROOT="$PODS_TARGET_SRCROOT"
- "$REPO_ROOT/../../../../../../private/var/folders/wd/4r6f7n8j4_jgvw3l8z7mfzpw0000gn/T/wrap2304loc/gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \
+ "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \
-Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \
-Pkotlin.native.cocoapods.archs="$ARCHS" \
-Pkotlin.native.cocoapods.configuration="$CONFIGURATION"
diff --git a/composeApp/src/androidMain/AndroidManifest.xml b/composeApp/src/androidMain/AndroidManifest.xml
index 5ddef33..7ca4648 100644
--- a/composeApp/src/androidMain/AndroidManifest.xml
+++ b/composeApp/src/androidMain/AndroidManifest.xml
@@ -1,6 +1,7 @@
+
= Build.VERSION_CODES.O) {
+ val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT)
+ notificationManager.createNotificationChannel(channel)
+ Notification.Builder(context, CHANNEL_ID)
+ } else {
+ Notification.Builder(context)
+ }
+
+ builder.setContentTitle(title)
+ .setContentText(content)
+ .setSmallIcon(android.R.drawable.ic_dialog_info)
+ .setAutoCancel(true)
+
+ notificationManager.notify(1, builder.build())
+ }
+
+ actual companion object {
+ private lateinit var appContext: Context
+ private const val CHANNEL_ID = "Habit_tracker_notifications"
+ private const val CHANNEL_NAME = "Habit notifications"
+
+ actual fun create(): HabbitNotificationManager {
+ return HabbitNotificationManager(appContext)
+ }
+
+ fun initialize(context: Context) {
+ appContext = context
+ }
+ }
+}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml
index adc1b15..7f9729f 100644
--- a/composeApp/src/commonMain/composeResources/values/strings.xml
+++ b/composeApp/src/commonMain/composeResources/values/strings.xml
@@ -85,4 +85,8 @@
Good habit
Bad habit
+
+ Well done!
+ You have not smoked for more than 10 days!!!
+
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt b/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt
index ee6eb2c..bf6a253 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/domain/GetHabitsForTodayUseCase.kt
@@ -11,7 +11,6 @@ class GetHabitsForTodayUseCase(
private val habitDao: HabitDao,
private val dailyDao: DailyDao
) {
-
suspend fun execute(date: LocalDate): List {
val currentDay = date.dayOfWeek.ordinal
@@ -21,6 +20,7 @@ class GetHabitsForTodayUseCase(
date.compareTo(timestamp) == 0 && it.isChecked
}
.map { it.habitId }
+
val habits = habitDao.getAll()
.filter {
val habitDays = json.decodeFromString>(it.daysToCheck)
@@ -30,7 +30,8 @@ class GetHabitsForTodayUseCase(
DailyHabit(
id = it.id,
title = it.title,
- isChecked = dailyEntries.contains(it.id)
+ isChecked = dailyEntries.contains(it.id),
+ startDate = it.startDate
)
}
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt b/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
index 6df6ce3..9512a32 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/presentation/DailyViewModel.kt
@@ -5,15 +5,29 @@ import base.BaseViewModel
import di.Inject
import feature.daily.domain.GetHabitsForTodayUseCase
import feature.daily.domain.SwitchHabitUseCase
-import feature.daily.ui.models.DailyViewState
-import kotlinx.coroutines.launch
import feature.daily.ui.models.DailyAction
import feature.daily.ui.models.DailyEvent
+import feature.daily.ui.models.DailyViewState
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-import kotlinx.datetime.*
+import kotlinx.datetime.Clock
+import kotlinx.datetime.DateTimeUnit
+import kotlinx.datetime.Instant
+import kotlinx.datetime.LocalDate
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.minus
+import kotlinx.datetime.plus
+import kotlinx.datetime.toLocalDateTime
+import kotlinx.datetime.todayIn
+import org.jetbrains.compose.resources.getString
+import screens.daily.views.daysSinceHabitStarted
import screens.daily.views.mapToHabitCardItemModel
+import tech.mobiledeveloper.jethabit.resources.Res
+import tech.mobiledeveloper.jethabit.resources.no_smoke_ten_days
+import tech.mobiledeveloper.jethabit.resources.well_done
import utils.getTitle
+import utils.notifications.HabbitNotificationManager
class DailyViewModel : BaseViewModel(
initialState = DailyViewState()
@@ -37,7 +51,10 @@ class DailyViewModel : BaseViewModel(
DailyEvent.PreviousDayClicked -> performPreviousClick()
DailyEvent.ReloadScreen -> fetchHabitFor(currentDate.current())
DailyEvent.ComposeAction -> viewAction = DailyAction.OpenCompose
- is DailyEvent.HabitCheckClicked -> switchCheckForHabit(viewEvent.habitId, viewEvent.newValue)
+ is DailyEvent.HabitCheckClicked -> switchCheckForHabit(
+ viewEvent.habitId,
+ viewEvent.newValue
+ )
}
}
@@ -45,7 +62,7 @@ class DailyViewModel : BaseViewModel(
val today = Clock.System.todayIn(TimeZone.currentSystemDefault())
val isToday = date.dayOfYear == today.dayOfYear && date.year == today.year
val title = date.getTitle()
-
+
viewState = viewState.copy(
currentDay = title,
hasNextDay = !isToday
@@ -55,6 +72,15 @@ class DailyViewModel : BaseViewModel(
val habits = getHabitsForTodayUseCase.execute(date)
.map { it.mapToHabitCardItemModel() }
+ val daysSinceStarted = habits.daysSinceHabitStarted(today)
+
+ if (daysSinceStarted != null && daysSinceStarted >= 10) {
+ HabbitNotificationManager.create().sendNotification(
+ title = getString(Res.string.well_done),
+ content = getString(Res.string.no_smoke_ten_days)
+ )
+ }
+
withContext(Dispatchers.Main) {
viewState = viewState.copy(habits = habits)
}
@@ -83,4 +109,5 @@ class DailyViewModel : BaseViewModel(
}
}
-private fun Instant.current(): LocalDate = this.toLocalDateTime(TimeZone.currentSystemDefault()).date
\ No newline at end of file
+private fun Instant.current(): LocalDate =
+ this.toLocalDateTime(TimeZone.currentSystemDefault()).date
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/presentation/models/DailyHabit.kt b/composeApp/src/commonMain/kotlin/feature/daily/presentation/models/DailyHabit.kt
index 8d421fb..d1c9aca 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/presentation/models/DailyHabit.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/presentation/models/DailyHabit.kt
@@ -3,5 +3,6 @@ package feature.daily.presentation.models
class DailyHabit(
val id: String,
val title: String,
- val isChecked: Boolean
+ val isChecked: Boolean,
+ val startDate: String
)
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt b/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
index 395bd88..7439fcc 100644
--- a/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
+++ b/composeApp/src/commonMain/kotlin/feature/daily/ui/views/HabitCardItem.kt
@@ -11,21 +11,32 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import feature.daily.presentation.models.DailyHabit
+import kotlinx.datetime.LocalDate
+import kotlinx.datetime.daysUntil
import ui.themes.JetHabitTheme
data class HabitCardItemModel(
val habitId: String,
val title: String,
- val isChecked: Boolean
+ val isChecked: Boolean,
+ val startDate: String? = null
)
fun DailyHabit.mapToHabitCardItemModel(): HabitCardItemModel =
HabitCardItemModel(
habitId = id,
title = title,
- isChecked = isChecked
+ isChecked = isChecked,
+ startDate = startDate
)
+fun List.daysSinceHabitStarted(currentDate: LocalDate): Int? {
+ val habit = find { !it.startDate.isNullOrEmpty() }
+ return habit?.startDate?.let {
+ LocalDate.parse(it).daysUntil(currentDate)
+ }
+}
+
@Composable
internal fun HabitCardItem(
model: HabitCardItemModel,
diff --git a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
index 0f261ce..59e8365 100644
--- a/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/screens/stats/StatisticsViewModel.kt
@@ -2,22 +2,29 @@ package screens.stats
import androidx.lifecycle.viewModelScope
import base.BaseViewModel
-import data.features.daily.DailyRepository
import di.Inject
+import feature.daily.domain.GetHabitsForTodayUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
+import kotlinx.datetime.Clock
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.toLocalDateTime
+import org.jetbrains.compose.resources.getString
+import screens.daily.views.daysSinceHabitStarted
+import screens.daily.views.mapToHabitCardItemModel
import screens.stats.models.StatsAction
import screens.stats.models.StatsEvent
import screens.stats.models.StatsViewState
import screens.stats.views.StatisticCellModel
+import tech.mobiledeveloper.jethabit.resources.Res
+import tech.mobiledeveloper.jethabit.resources.no_smoke_ten_days
class StatisticsViewModel : BaseViewModel(
initialState = StatsViewState()
) {
-
- private val dailyRepository: DailyRepository = Inject.instance()
+ private val getHabitsForTodayUseCase = Inject.instance()
init {
loadActivities()
@@ -31,44 +38,33 @@ class StatisticsViewModel : BaseViewModel {
-// val medicationList = medicationRepository.fetchCurrentMedications()
-// val diary = dailyRepository.fetchDiary()
-//
-// return medicationList.map { medication ->
-// val filtered = diary.filter { entry ->
-// val startDate = getValueOrNull(medication.startDate) ?: return@filter false
-// val endDate = getValueOrNull(medication.endDate) ?: return@filter false
-// val entryDate = DateTime.fromString(entry.date)
-//
-// val startComparable = startDate.compareTo(entryDate)
-// val endComparable = endDate.compareTo(entryDate)
-//
-// startComparable == 0 && endComparable == 1
-// }
-//
-// val startDate = getValueOrNull(medication.startDate)
-// val endDate = getValueOrNull(medication.endDate)
-// val diff = startDate?.let { endDate?.minus(it)?.days } ?: 0.0
-//
-// StatisticCellModel(
-// title = medication.title,
-// activeDayList = listOf(true, true, true, false, false),
-// duration = diff.toInt().toString(),
-// fact = filtered.size.toString(),
-// percentage = filtered.size.toFloat() / diff.toFloat(),
-// isPeriodic = false
-// )
-// }
+ private suspend fun fetchNonSmokingStatistics(): List {
+ val today = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).date
+ val habits = getHabitsForTodayUseCase.execute(today)
+ .map { it.mapToHabitCardItemModel() }
+
+ val nonSmokingStats = mutableListOf()
+ val daysSinceLast = habits.daysSinceHabitStarted(today)
- return emptyList()
+ if (daysSinceLast != null) {
+ val statistic = StatisticCellModel(
+ title = getString(Res.string.no_smoke_ten_days),
+ activeDayList = emptyList(),
+ duration = "$daysSinceLast days",
+ fact = daysSinceLast.toString(),
+ percentage = 1f,
+ isPeriodic = false
+ )
+
+ nonSmokingStats.add(statistic)
+ }
+ return nonSmokingStats
}
}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt b/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt
index 9588b70..ab26551 100644
--- a/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt
+++ b/composeApp/src/commonMain/kotlin/utils/Date + Utils.kt
@@ -1,12 +1,21 @@
package utils
+import kotlinx.datetime.Clock
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.LocalDate
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.daysUntil
import kotlinx.datetime.plus
+import kotlinx.datetime.todayIn
import kotlinx.datetime.until
fun LocalDate.daysInMonth(): Int {
val start = LocalDate(year, month, 1)
val end = start.plus(1, DateTimeUnit.MONTH)
return start.until(end, DateTimeUnit.DAY)
+}
+
+fun LocalDate.tenDaysPassed(): Boolean {
+ val today = Clock.System.todayIn(TimeZone.currentSystemDefault())
+ return this.daysUntil(today) >= 10
}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/utils/notifications/HabbitNotificationManager.kt b/composeApp/src/commonMain/kotlin/utils/notifications/HabbitNotificationManager.kt
new file mode 100644
index 0000000..ca1ce29
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/utils/notifications/HabbitNotificationManager.kt
@@ -0,0 +1,9 @@
+package utils.notifications
+
+expect class HabbitNotificationManager {
+ fun sendNotification(title: String, content: String)
+
+ companion object {
+ fun create(): HabbitNotificationManager
+ }
+}
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 5576bb3..e3942d4 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,5 +1,6 @@
[versions]
# Plugins
+kotlinxDatetime = "0.6.1"
plugin-android = "8.2.2" # https://developer.android.com/studio/releases/gradle-plugin
plugin-compose = "1.6.10" # https://github.com/JetBrains/compose-jb
@@ -22,6 +23,7 @@ androidx-activityCompose = "1.9.0"
mindsdk = "24"
[libraries]
+kotlinx-datetime-v061 = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDatetime" }
plugin-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
plugin-android = { module = "com.android.tools.build:gradle", version.ref = "plugin-android" }
plugin-compose = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "plugin-compose" }
@@ -42,7 +44,7 @@ kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serializa
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
kotlinx-coroutines-jvm = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" }
-kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.6.0"
+kotlinx-datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.6.1"
room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }