Skip to content

Commit 0e99969

Browse files
authored
Merge pull request #4
dev
2 parents 6899225 + 6cdb202 commit 0e99969

8 files changed

Lines changed: 119 additions & 20 deletions

File tree

composeApp/build.gradle.kts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,23 @@ kotlin {
3131
}
3232
}
3333

34-
jvm("desktop")
34+
jvm("desktop") {
35+
@OptIn(ExperimentalKotlinGradlePluginApi::class)
36+
compilerOptions {
37+
jvmTarget.set(JvmTarget.JVM_11)
38+
freeCompilerArgs.add("-Xexpect-actual-classes")
39+
}
40+
}
41+
42+
targets.configureEach {
43+
compilations.configureEach {
44+
compileTaskProvider.configure {
45+
compilerOptions {
46+
freeCompilerArgs.add("-Xexpect-actual-classes")
47+
}
48+
}
49+
}
50+
}
3551

3652
sourceSets {
3753
val desktopMain by getting
@@ -100,10 +116,7 @@ room {
100116

101117
dependencies {
102118
debugImplementation(compose.uiTooling)
103-
add("kspAndroid", libs.room.compiler)
104-
add("kspIosSimulatorArm64", libs.room.compiler)
105-
add("kspIosX64", libs.room.compiler)
106-
add("kspIosArm64", libs.room.compiler)
119+
ksp(libs.room.compiler)
107120
}
108121

109122
compose.desktop {

composeApp/src/commonMain/kotlin/com/judahben149/eclair/EclairApp.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ package com.judahben149.eclair
22

33
import androidx.compose.material3.MaterialTheme
44
import androidx.compose.runtime.Composable
5+
import com.judahben149.eclair.presentation.screens.chat.ChatScreen
56
import org.jetbrains.compose.ui.tooling.preview.Preview
67

78
@Composable
89
@Preview
910
fun EclairApp() {
1011
MaterialTheme {
11-
12+
ChatScreen()
1213
}
1314
}

composeApp/src/commonMain/kotlin/com/judahben149/eclair/data/local/EclairDatabase.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ package com.judahben149.eclair.data.local
33
import androidx.room.ConstructedBy
44
import androidx.room.Database
55
import androidx.room.RoomDatabase
6+
import androidx.room.RoomDatabaseConstructor
67
import com.judahben149.eclair.data.local.dto.ChatMessageDto
78
import com.judahben149.eclair.data.local.dto.ConversationDto
89

9-
@ConstructedBy(EclairDatabaseConstructor::class)
10+
internal expect object EclairDatabaseCtor : RoomDatabaseConstructor<EclairDatabase>
11+
1012
@Database(entities = [ConversationDto::class, ChatMessageDto::class], version = 1)
13+
@ConstructedBy(EclairDatabaseCtor::class)
1114
abstract class EclairDatabase: RoomDatabase() {
1215
abstract fun chatDao(): ChatDao
1316
}

composeApp/src/commonMain/kotlin/com/judahben149/eclair/data/local/EclairDatabaseConstructor.kt

Lines changed: 0 additions & 9 deletions
This file was deleted.

composeApp/src/commonMain/kotlin/com/judahben149/eclair/presentation/screens/chat/ChatScreen.kt

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,70 @@
11
package com.judahben149.eclair.presentation.screens.chat
22

3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.foundation.layout.Row
5+
import androidx.compose.foundation.layout.fillMaxWidth
6+
import androidx.compose.foundation.layout.padding
7+
import androidx.compose.material3.Button
8+
import androidx.compose.material3.Text
9+
import androidx.compose.material3.TextField
310
import androidx.compose.runtime.Composable
11+
import androidx.compose.runtime.mutableStateOf
12+
import androidx.compose.runtime.remember
13+
import androidx.compose.runtime.collectAsState
14+
import androidx.compose.runtime.getValue
15+
import androidx.compose.ui.unit.dp
16+
import com.judahben149.eclair.domain.enums.MessageOrigin
17+
import com.judahben149.eclair.domain.model.ChatMessage
418
import org.jetbrains.compose.ui.tooling.preview.Preview
19+
import org.koin.compose.viewmodel.koinViewModel
520

621
@Composable
722
fun ChatScreen() {
23+
val viewModel = koinViewModel<ChatViewModel>()
24+
val state by viewModel.state.collectAsState()
825

26+
ChatContent(state) {
27+
viewModel.saveChat(
28+
ChatMessage(
29+
id = "",
30+
conversationId = "conversationId",
31+
message = it,
32+
origin = MessageOrigin.SENT,
33+
timestamp = 0
34+
)
35+
)
36+
}
37+
}
38+
39+
@Composable
40+
fun ChatContent(state: ChatState, onSendMessage: (String) -> Unit) {
41+
val (text, setText) = remember { mutableStateOf("") }
42+
43+
Column(modifier = androidx.compose.ui.Modifier.fillMaxWidth()) {
44+
Column(modifier = androidx.compose.ui.Modifier.weight(1f)) {
45+
state.chats.forEach { chat ->
46+
Text(
47+
text = chat.message,
48+
modifier = androidx.compose.ui.Modifier.padding(8.dp)
49+
)
50+
}
51+
}
52+
53+
Row(modifier = androidx.compose.ui.Modifier.fillMaxWidth().padding(8.dp)) {
54+
TextField(
55+
value = text,
56+
onValueChange = setText,
57+
label = { Text("New Chat") },
58+
modifier = androidx.compose.ui.Modifier.weight(1f).padding(end = 8.dp)
59+
)
60+
Button(onClick = {
61+
if (text.isNotBlank()) {
62+
onSendMessage(text)
63+
setText("")
64+
}
65+
}) { Text("Send") }
66+
}
67+
}
968
}
1069

1170

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,41 @@
11
package com.judahben149.eclair.presentation.screens.chat
22

33
import androidx.lifecycle.ViewModel
4+
import androidx.lifecycle.viewModelScope
5+
import com.judahben149.eclair.domain.model.ChatMessage
46
import com.judahben149.eclair.domain.usecase.ObserveAllChatsUseCase
57
import com.judahben149.eclair.domain.usecase.SaveChatUseCase
8+
import kotlinx.coroutines.flow.MutableStateFlow
9+
import kotlinx.coroutines.flow.asStateFlow
10+
import kotlinx.coroutines.launch
611

712
class ChatViewModel(
813
private val saveChatUseCase: SaveChatUseCase,
914
private val observeAllChatsUseCase: ObserveAllChatsUseCase
1015
): ViewModel() {
1116

17+
private val _state = MutableStateFlow(ChatState())
18+
val state = _state.asStateFlow()
1219

13-
}
20+
init {
21+
observeAllChats("conversationId")
22+
}
23+
24+
fun saveChat(chat: ChatMessage) {
25+
viewModelScope.launch {
26+
saveChatUseCase(chat)
27+
}
28+
}
29+
30+
fun observeAllChats(conversationId: String) {
31+
viewModelScope.launch {
32+
observeAllChatsUseCase(conversationId).collect {
33+
_state.value = _state.value.copy(chats = it)
34+
}
35+
}
36+
}
37+
}
38+
39+
data class ChatState(
40+
val chats: List<ChatMessage> = emptyList()
41+
)
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.judahben149.eclair.data.local
22

33
import androidx.room.Room
4+
import androidx.sqlite.driver.bundled.BundledSQLiteDriver
5+
import kotlinx.coroutines.Dispatchers
46
import java.io.File
57

68
fun getEclairDatabaseBuilder(): EclairDatabase {
79
val dbFile = File(System.getProperty("java.io.tmpdir"), "eclair.db")
8-
910
return Room.databaseBuilder<EclairDatabase>(
1011
name = dbFile.absolutePath,
11-
).build()
12+
)
13+
.setDriver(BundledSQLiteDriver())
14+
.setQueryCoroutineContext(Dispatchers.IO)
15+
.build()
1216
}

composeApp/src/iosMain/kotlin/com/judahben149/eclair/data/local/DatabaseBuilder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ fun getEclairDatabaseBuilder(): EclairDatabase {
1515
// factory = { EclairDatabase::class.instantiateImpl()}
1616
)
1717
.setDriver(BundledSQLiteDriver())
18-
.setQueryCoroutineContext(Dispatchers.IO)
18+
// .setQueryCoroutineContext(Dispatchers.IO)
1919
.build()
2020
}

0 commit comments

Comments
 (0)