Skip to content

Commit 067fe2d

Browse files
authored
Merge pull request #8 from sollarp/dev
Dev
2 parents d93c496 + 60bcc33 commit 067fe2d

File tree

9 files changed

+201
-25
lines changed

9 files changed

+201
-25
lines changed

.idea/deploymentTargetDropDown.xml

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/java/com/chatgptlite/wanted/constants/Constants.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ const val urlToAvatarGPT = "https://gptapk.com/wp-content/uploads/2023/02/chatgp
88
const val urlToGithub = "https://github.com/lambiengcode"
99

1010
const val matchResultString = "\"text\":"
11-
const val matchResultTurboString = "\"content\":"
11+
const val matchResultTurboString = "\"content\":"

app/src/main/java/com/chatgptlite/wanted/data/remote/ConversationRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ import com.chatgptlite.wanted.models.ConversationModel
55
interface ConversationRepository {
66
suspend fun fetchConversations() : MutableList<ConversationModel>
77
fun newConversation(conversation: ConversationModel) : ConversationModel
8-
fun deleteConversation()
8+
suspend fun deleteConversation(conversationId: String)
99
}

app/src/main/java/com/chatgptlite/wanted/data/remote/ConversationRepositoryImpl.kt

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.chatgptlite.wanted.data.remote
22

3+
import android.content.ContentValues
4+
import android.util.Log
35
import com.chatgptlite.wanted.constants.conversationCollection
6+
import com.chatgptlite.wanted.helpers.DataHolder
47
import com.chatgptlite.wanted.models.ConversationModel
8+
import com.google.firebase.firestore.FieldValue
59
import com.google.firebase.firestore.FirebaseFirestore
610
import com.google.firebase.firestore.Query
711
import com.google.firebase.firestore.QuerySnapshot
@@ -11,12 +15,11 @@ import javax.inject.Inject
1115
class ConversationRepositoryImpl @Inject constructor(
1216
private val fsInstance: FirebaseFirestore,
1317
) : ConversationRepository {
18+
1419
override suspend fun fetchConversations(): MutableList<ConversationModel> {
15-
val result: QuerySnapshot = fsInstance.collection(conversationCollection)
16-
.orderBy("createdAt", Query.Direction.DESCENDING).get().await()
1720

18-
if (result.documents.isNotEmpty()) {
19-
val documents = result.documents
21+
if (getFireBaseSnapShot().documents.isNotEmpty()) {
22+
val documents = getFireBaseSnapShot().documents
2023

2124
return documents.map {
2225
it.toObject(ConversationModel::class.java)
@@ -31,8 +34,45 @@ class ConversationRepositoryImpl @Inject constructor(
3134
return conversation
3235
}
3336

34-
override fun deleteConversation() {
35-
TODO("Not yet implemented")
37+
override suspend fun deleteConversation(conversationId: String) {
38+
var desiredKey: String? = null
39+
40+
getFireBaseSnapShot().documents.map { documentSnapshot ->
41+
val id = documentSnapshot.getString("id")
42+
if (id == conversationId) {
43+
desiredKey = documentSnapshot.id
44+
} else {
45+
null
46+
}
47+
}
48+
DataHolder.docPath = desiredKey.toString()
49+
50+
val docRef = fsInstance
51+
.collection("conversations")
52+
.document(DataHolder.docPath)
53+
54+
// Remove the 'capital' field from the document
55+
val updates = hashMapOf<String, Any>(
56+
"id" to FieldValue.delete(),
57+
"title" to FieldValue.delete(),
58+
"createdAt" to FieldValue.delete()
59+
)
60+
docRef.update(updates)
61+
.addOnSuccessListener {
62+
Log.d(
63+
ContentValues.TAG,
64+
"DocumentSnapshot successfully deleted from message!"
65+
)
66+
}
67+
.addOnFailureListener { e ->
68+
Log.w(
69+
ContentValues.TAG,
70+
"Error deleting document", e
71+
)
72+
}
3673
}
74+
private suspend fun getFireBaseSnapShot() =
75+
fsInstance.collection(conversationCollection)
76+
.orderBy("createdAt", Query.Direction.DESCENDING).get().await()
3777

3878
}

app/src/main/java/com/chatgptlite/wanted/data/remote/MessageRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ import kotlinx.coroutines.flow.Flow
66
interface MessageRepository {
77
fun fetchMessages(conversationId: String): Flow<List<MessageModel>>
88
fun createMessage(message: MessageModel): MessageModel
9-
fun deleteMessage(message: MessageModel)
9+
fun deleteMessage()
1010
}

app/src/main/java/com/chatgptlite/wanted/data/remote/MessageRepositoryImpl.kt

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.chatgptlite.wanted.data.remote
22

3+
import android.content.ContentValues
4+
import android.util.Log
35
import com.chatgptlite.wanted.constants.messageCollection
6+
import com.chatgptlite.wanted.helpers.DataHolder
47
import com.chatgptlite.wanted.models.MessageModel
8+
import com.google.firebase.firestore.FieldValue
59
import com.google.firebase.firestore.FirebaseFirestore
610
import com.google.firebase.firestore.Query
711
import com.google.firebase.firestore.QuerySnapshot
@@ -14,9 +18,13 @@ import javax.inject.Inject
1418
class MessageRepositoryImpl @Inject constructor(
1519
private val fsInstance: FirebaseFirestore,
1620
) : MessageRepository {
17-
override fun fetchMessages(conversationId: String): Flow<List<MessageModel>> = callbackFlow {
18-
val result: QuerySnapshot =
19-
fsInstance.collection(messageCollection).whereEqualTo("conversationId", conversationId)
21+
private lateinit var result: QuerySnapshot
22+
override fun fetchMessages(conversationId: String): Flow<List<MessageModel>> =
23+
callbackFlow {
24+
result =
25+
fsInstance
26+
.collection(messageCollection)
27+
.whereEqualTo("conversationId", conversationId)
2028
.orderBy("createdAt", Query.Direction.DESCENDING).get().await()
2129

2230
if (result.documents.isNotEmpty()) {
@@ -44,7 +52,32 @@ class MessageRepositoryImpl @Inject constructor(
4452
return message
4553
}
4654

47-
override fun deleteMessage(message: MessageModel) {
48-
TODO("Not yet implemented")
55+
override fun deleteMessage() {
56+
val docRef = fsInstance
57+
.collection("messages")
58+
.document(DataHolder.docPath)
59+
60+
// Remove the fields from the document
61+
val updates = hashMapOf<String, Any>(
62+
"answer" to FieldValue.delete(),
63+
"conversationId" to FieldValue.delete(),
64+
"createdAt" to FieldValue.delete(),
65+
"id" to FieldValue.delete(),
66+
"question" to FieldValue.delete()
67+
)
68+
docRef.update(updates)
69+
.addOnSuccessListener {
70+
Log.d(
71+
ContentValues.TAG,
72+
"DocumentSnapshot successfully deleted from message!"
73+
)
74+
}
75+
.addOnFailureListener { e ->
76+
Log.w(
77+
ContentValues.TAG,
78+
"Error deleting document", e
79+
)
80+
}
81+
4982
}
5083
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.chatgptlite.wanted.helpers
2+
3+
object DataHolder {
4+
var docPath: String = ""
5+
}

app/src/main/java/com/chatgptlite/wanted/ui/common/AppDrawer.kt

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ import androidx.compose.foundation.lazy.LazyColumn
2222
import androidx.compose.foundation.shape.CircleShape
2323
import androidx.compose.foundation.shape.RoundedCornerShape
2424
import androidx.compose.material.icons.Icons
25-
import androidx.compose.material.icons.filled.Edit
26-
import androidx.compose.material.icons.filled.Message
27-
import androidx.compose.material.icons.filled.Settings
28-
import androidx.compose.material.icons.filled.WbSunny
25+
import androidx.compose.material.icons.filled.*
2926
import androidx.compose.material.icons.outlined.AddComment
3027
import androidx.compose.material3.Divider
3128
import androidx.compose.material3.Icon
@@ -159,7 +156,7 @@ private fun ColumnScope.HistoryConversations(
159156
.weight(1f, false),
160157
) {
161158
items(conversations.size) { index ->
162-
ChatItem(
159+
RecycleChatItem(
163160
text = conversations[index].title,
164161
Icons.Filled.Message,
165162
selected = conversations[index].id == conversationId,
@@ -170,6 +167,12 @@ private fun ColumnScope.HistoryConversations(
170167
conversationViewModel.onConversation(conversations[index])
171168
}
172169
},
170+
onDeleteClicked = {
171+
scope.launch {
172+
conversationViewModel.deleteConversation(conversations[index].id)
173+
conversationViewModel.deleteMessages(conversations[index].id)
174+
}
175+
}
173176
)
174177
}
175178
}
@@ -240,6 +243,67 @@ private fun ChatItem(
240243
)
241244
}
242245
}
246+
@Composable
247+
private fun RecycleChatItem(
248+
text: String,
249+
icon: ImageVector = Icons.Filled.Edit,
250+
selected: Boolean,
251+
onChatClicked: () -> Unit,
252+
onDeleteClicked: () -> Unit
253+
) {
254+
val background = if (selected) {
255+
Modifier.background(MaterialTheme.colorScheme.primaryContainer)
256+
} else {
257+
Modifier
258+
}
259+
Row(
260+
modifier = Modifier
261+
.height(56.dp)
262+
.fillMaxWidth()
263+
.padding(horizontal = 34.dp)
264+
.clip(CircleShape)
265+
.then(background)
266+
.clickable(onClick = onChatClicked),
267+
verticalAlignment = CenterVertically
268+
) {
269+
val iconTint = if (selected) {
270+
MaterialTheme.colorScheme.primary
271+
} else {
272+
MaterialTheme.colorScheme.onSurfaceVariant
273+
}
274+
Icon(
275+
icon,
276+
tint = iconTint,
277+
modifier = Modifier
278+
.padding(start = 16.dp, top = 16.dp, bottom = 16.dp)
279+
.size(25.dp),
280+
contentDescription = null,
281+
)
282+
Text(
283+
text,
284+
style = MaterialTheme.typography.bodyMedium,
285+
color = if (selected) {
286+
MaterialTheme.colorScheme.primary
287+
} else {
288+
MaterialTheme.colorScheme.onSurface
289+
},
290+
modifier = Modifier.padding(start = 12.dp).fillMaxWidth(0.85f),
291+
maxLines = 1,
292+
overflow = TextOverflow.Ellipsis,
293+
)
294+
Spacer(Modifier.weight(0.9f, true))
295+
Icon(
296+
imageVector = Icons.Filled.Delete,
297+
contentDescription = "Delete",
298+
tint = if (selected) {
299+
MaterialTheme.colorScheme.primary
300+
} else {
301+
MaterialTheme.colorScheme.onSurface
302+
},
303+
modifier = Modifier.clickable { onDeleteClicked() }
304+
)
305+
}
306+
}
243307

244308
@Composable
245309
private fun ProfileItem(text: String, urlToImage: String?, onProfileClicked: () -> Unit) {

app/src/main/java/com/chatgptlite/wanted/ui/conversations/ConversationViewModel.kt

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,11 @@ class ConversationViewModel @Inject constructor(
134134
var response: String = ""
135135

136136
for (message in messagesMap[conversationId]!!.reversed()) {
137-
response += """
138-
Human:${message.question.trim()}
139-
Bot:${if (message.answer == "Let me thinking...") "" else message.answer.trim()}"""
137+
response += """Human:${message.question.trim()}
138+
|Bot:${
139+
if (message.answer == "Let me thinking...") ""
140+
else message.answer.trim()
141+
}""".trimMargin()
140142
}
141143

142144
return response
@@ -150,8 +152,7 @@ Bot:${if (message.answer == "Let me thinking...") "" else message.answer.trim()}
150152

151153
val response: MutableList<MessageTurbo> = mutableListOf(
152154
MessageTurbo(
153-
role = TurboRole.system,
154-
content = "Markdown style if exists code"
155+
role = TurboRole.system, content = "Markdown style if exists code"
155156
)
156157
)
157158

@@ -166,8 +167,24 @@ Bot:${if (message.answer == "Let me thinking...") "" else message.answer.trim()}
166167
return response.toList()
167168
}
168169

170+
fun deleteMessages(conversationId: String) {
171+
172+
val conversations: MutableList<ConversationModel> = _conversations.value.toMutableList()
173+
val conversationToRemove = conversations.find { it.id == conversationId }
174+
175+
if (conversationToRemove != null) {
176+
conversations.remove(conversationToRemove)
177+
_conversations.value = conversations
178+
}
179+
messageRepo.deleteMessage()
180+
}
181+
182+
suspend fun deleteConversation(conversationId: String) =
183+
conversationRepo.deleteConversation(conversationId)
184+
169185
private suspend fun fetchMessages() {
170-
if (_currentConversation.value.isEmpty() || _messages.value[_currentConversation.value] != null) return
186+
if (_currentConversation.value.isEmpty() ||
187+
_messages.value[_currentConversation.value] != null) return
171188

172189
val flow: Flow<List<MessageModel>> = messageRepo.fetchMessages(_currentConversation.value)
173190

0 commit comments

Comments
 (0)