Skip to content

Commit 2d9b1b6

Browse files
authored
FORGE-1034-Builder Pattern (#107)
* Fixes for various stylings in the views. * Fixes based on feedback * Make Ditto Optional and clear it out on logout * weak var ditto * weak var in config * Builder Pattern Implementation on Android + iOS
1 parent 990b9b9 commit 2d9b1b6

File tree

16 files changed

+368
-359
lines changed

16 files changed

+368
-359
lines changed

sdks/kotlin/src/main/java/com/ditto/dittochat/DittoChat.kt

Lines changed: 116 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,46 @@ package com.ditto.dittochat
22

33
import android.content.Context
44
import com.google.gson.Gson
5+
import dagger.Module
6+
import dagger.Provides
7+
import dagger.hilt.InstallIn
8+
import dagger.hilt.components.SingletonComponent
59
import kotlinx.coroutines.flow.Flow
610
import java.util.Date
711
import java.util.UUID
12+
import javax.inject.Inject
813
import javax.inject.Singleton
914

1015
interface DittoChat {
1116
suspend fun createRoom(config: RoomConfig): String
1217
suspend fun createMessage(config: MessageConfig)
1318
fun setCurrentUser(config: UserConfig)
1419

15-
val publicRoomsFlow: kotlinx.coroutines.flow.Flow<List<Room>>
16-
val dittoChatConfig: ChatConfig
20+
val publicRoomsFlow: Flow<List<Room>>
21+
val hasAdminPrivileges: Boolean
22+
val retentionPolicy: ChatRetentionPolicy
23+
val acceptLargeImages: Boolean
24+
val primaryColor: String?
1725

1826
val localStore: LocalData
1927
val p2pStore: DittoData
2028
suspend fun readRoomById(id: String): Room
21-
fun allUsersFlow(): kotlinx.coroutines.flow.Flow<List<ChatUser>>
29+
fun allUsersFlow(): Flow<List<ChatUser>>
2230

2331
suspend fun updateRoom(room: Room)
2432
fun logout()
2533
}
2634

27-
class DittoChatImpl(
28-
override val dittoChatConfig: ChatConfig,
35+
@Singleton
36+
class DittoChatImpl private constructor(
37+
private val ditto: live.ditto.Ditto?,
38+
override val retentionPolicy: ChatRetentionPolicy,
39+
private val usersCollection: String,
40+
private val userId: String?,
41+
private val userEmail: String?,
42+
override val hasAdminPrivileges: Boolean,
43+
override val acceptLargeImages: Boolean,
44+
override val primaryColor: String?,
2945
override val localStore: LocalData,
3046
override val p2pStore: DittoData
3147
) : DittoChat {
@@ -39,6 +55,13 @@ class DittoChatImpl(
3955
localStore.currentUserId = value
4056
}
4157

58+
init {
59+
userId?.let { setCurrentUser(UserConfig(it)) }
60+
userEmail?.let {
61+
// Setup roles subscription if needed
62+
}
63+
}
64+
4265
override suspend fun createRoom(config: RoomConfig): String {
4366
val room = p2pStore.createRoom(config.id, config.name, config.isGenerated)
4467
?: throw Exception("Room creation failed")
@@ -143,4 +166,91 @@ class DittoChatImpl(
143166

144167
val peerKeyString: String
145168
get() = p2pStore.peerKeyString
146-
}
169+
170+
// Builder Pattern
171+
class Builder @Inject constructor(
172+
private val localStore: LocalData
173+
) {
174+
private var ditto: live.ditto.Ditto? = null
175+
var retentionPolicy: ChatRetentionPolicy = ChatRetentionPolicy(days = 30)
176+
private set
177+
var usersCollection: String = "users"
178+
private set
179+
var userId: String? = null
180+
private set
181+
var hasAdminPrivileges: Boolean = false
182+
private set
183+
var userEmail: String? = null
184+
private set
185+
var acceptLargeImages: Boolean = true
186+
private set
187+
var primaryColor: String? = null
188+
private set
189+
190+
fun setDitto(ditto: live.ditto.Ditto) = apply {
191+
this.ditto = ditto
192+
}
193+
194+
fun setRetentionPolicy(policy: ChatRetentionPolicy) = apply {
195+
this.retentionPolicy = policy
196+
}
197+
198+
fun setRetentionDays(days: Int) = apply {
199+
this.retentionPolicy = ChatRetentionPolicy(days = days)
200+
}
201+
202+
fun setUsersCollection(collection: String) = apply {
203+
this.usersCollection = collection
204+
}
205+
206+
fun setUserId(id: String?) = apply {
207+
this.userId = id
208+
}
209+
210+
fun setUserEmail(email: String?) = apply {
211+
this.userEmail = email
212+
}
213+
214+
fun setHasAdminPrivileges(hasAdminPrivileges: Boolean) = apply {
215+
this.hasAdminPrivileges = hasAdminPrivileges
216+
}
217+
218+
fun setAcceptLargeImages(accept: Boolean) = apply {
219+
this.acceptLargeImages = accept
220+
}
221+
222+
fun setPrimaryColor(color: String?) = apply {
223+
this.primaryColor = color
224+
}
225+
226+
fun build(): DittoChatImpl {
227+
requireNotNull(ditto) { "Ditto instance is required" }
228+
229+
val dittoStore = DittoDataImpl(
230+
privateStore = localStore,
231+
ditto = ditto!!,
232+
usersCollection = usersCollection,
233+
chatRetentionPolicy = retentionPolicy
234+
)
235+
236+
return DittoChatImpl(
237+
ditto = ditto,
238+
retentionPolicy = retentionPolicy,
239+
usersCollection = usersCollection,
240+
userId = userId,
241+
userEmail = userEmail,
242+
hasAdminPrivileges = hasAdminPrivileges,
243+
acceptLargeImages = acceptLargeImages,
244+
primaryColor = primaryColor,
245+
localStore = localStore,
246+
p2pStore = dittoStore
247+
)
248+
}
249+
}
250+
251+
companion object {
252+
fun builder(localStore: LocalData): Builder {
253+
return Builder(localStore)
254+
}
255+
}
256+
}

sdks/kotlin/src/main/java/com/ditto/dittochat/DittoDataImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import live.ditto.*
99
import java.util.*
1010
import javax.inject.Inject
1111

12-
class DittoDataImpl(
12+
internal class DittoDataImpl(
1313
private val privateStore: LocalData,
1414
override val ditto: Ditto,
1515
private val gson: Gson = Gson(),

sdks/kotlin/src/main/java/com/ditto/dittochat/LocalDataImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import kotlinx.coroutines.flow.*
1010
import kotlinx.coroutines.launch
1111
import androidx.core.content.edit
1212

13-
class LocalDataImpl(
13+
internal class LocalDataImpl(
1414
private val context: Context,
1515
private val gson: Gson
1616
) : LocalData {

sdks/kotlin/src/main/java/com/ditto/dittochat/ui/ChatScreen.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,15 @@ fun ChatScreen(
134134
onTextChange = viewModel::updateInputText,
135135
onSave = viewModel::saveEditedMessage,
136136
onCancel = viewModel::cancelEdit,
137-
primaryColor = viewModel.dittoChat.dittoChatConfig.primaryColor ?: Color(0xFF4F46E5)
137+
primaryColor = Color(viewModel.dittoChat.primaryColor?.toInt() ?: 0xFF4F46E5.toInt())
138138
)
139139
} else {
140140
ChatInputBar(
141141
text = inputText,
142142
onTextChange = viewModel::updateInputText,
143143
onSendClick = viewModel::sendMessage,
144144
onCameraClick = { imagePicker.launch("image/*") },
145-
primaryColor = viewModel.dittoChat.dittoChatConfig.primaryColor ?: Color(0xFF4F46E5)
145+
primaryColor = Color(viewModel.dittoChat.primaryColor?.toInt() ?: 0xFF4F46E5.toInt())
146146
)
147147
}
148148
}
@@ -170,8 +170,8 @@ fun ChatScreen(
170170
onEditClick = { viewModel.startEditMessage(it) },
171171
onDeleteClick = { viewModel.deleteMessage(it) },
172172
onImageClick = { viewModel.showAttachment(it) },
173-
hasAdminPrivileges = viewModel.dittoChat.dittoChatConfig.hasAdminPrivileges,
174-
primaryColor = viewModel.dittoChat.dittoChatConfig.primaryColor
173+
hasAdminPrivileges = viewModel.dittoChat.hasAdminPrivileges,
174+
primaryColor = Color(viewModel.dittoChat.primaryColor?.toInt() ?: 0xFF4F46E5.toInt())
175175
)
176176
}
177177
}
Lines changed: 18 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,39 @@
1-
package com.ditto.dittochat
1+
package com.ditto.dittochat.ui
22

33
import android.content.Context
4-
import com.ditto.dittochat.ui.DittoChatUI
4+
import com.ditto.dittochat.DittoChat
5+
import com.ditto.dittochat.DittoChatImpl
6+
import com.ditto.dittochat.LocalData
7+
import com.ditto.dittochat.LocalDataImpl
58
import com.google.gson.Gson
69
import dagger.Module
710
import dagger.Provides
811
import dagger.hilt.InstallIn
912
import dagger.hilt.android.qualifiers.ApplicationContext
1013
import dagger.hilt.components.SingletonComponent
1114
import live.ditto.Ditto
12-
import live.ditto.DittoIdentity
13-
import live.ditto.android.DefaultAndroidDittoDependencies
1415
import javax.inject.Singleton
1516

1617
@Module
1718
@InstallIn(SingletonComponent::class)
18-
object DittoChatModule {
19+
internal object DittoChatModule {
1920

2021
@Provides
2122
@Singleton
22-
internal fun provideLocalDataInterface(
23-
@ApplicationContext context: Context,
24-
gson: Gson
25-
): LocalData {
26-
return LocalDataImpl(context, gson)
23+
fun provideDittoChatBuilder(
24+
localStore: LocalData
25+
): DittoChatImpl.Builder {
26+
return DittoChatImpl.Builder(localStore)
2727
}
2828

29-
internal fun provideDittoDataInterface(
30-
localStore: LocalData,
31-
ditto: Ditto
32-
): DittoData {
33-
return DittoDataImpl(
34-
privateStore = localStore,
35-
ditto = ditto,
36-
gson = Gson(),
37-
usersCollection = "users",
38-
chatRetentionPolicy = ChatRetentionPolicy(days = 30)
29+
@Provides
30+
@Singleton
31+
fun provideLocalData(
32+
@ApplicationContext context: Context
33+
): LocalData {
34+
return LocalDataImpl(
35+
context,
36+
Gson()
3937
)
4038
}
41-
42-
internal fun provideDittoChat(
43-
localStore: LocalData,
44-
p2pStore: DittoData,
45-
dittoChatConfig: ChatConfig
46-
): DittoChat {
47-
return DittoChatImpl(dittoChatConfig, localStore, p2pStore)
48-
}
49-
50-
fun provideDittoChatUI(ditto: Ditto, localData: LocalData, dittoChatConfig: ChatConfig): DittoChatUI {
51-
return DittoChatUI(provideDittoChat(
52-
localData,
53-
provideDittoDataInterface(
54-
localData,
55-
ditto
56-
),
57-
dittoChatConfig
58-
))
59-
}
6039
}

sdks/kotlin/src/main/java/com/ditto/dittochat/ui/RoomsListScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ internal fun RoomsListScreen(
7272
Surface(
7373
modifier = Modifier.size(48.dp),
7474
shape = CircleShape,
75-
color = viewModel.dittoChat.dittoChatConfig.primaryColor ?: Color(0xFF4F46E5),
75+
color = Color(viewModel.dittoChat.primaryColor?.toInt() ?: 0xFF4F46E5.toInt()),
7676
onClick = { viewModel.showCreateRoomDialog() }
7777
) {
7878
Box(contentAlignment = Alignment.Center) {

sdks/swift/Sources/DittoChatCore/Data/DittoDataInterface.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import UIKit
1212

1313
@MainActor
1414
protocol DittoDataInterface {
15-
var ditto: Ditto { get }
15+
var ditto: Ditto? { get }
1616
var publicRoomsPublisher: CurrentValueSubject<[Room], Never> { get }
1717
var peerKeyString: String { get }
1818
var sdkVersion: String { get }
@@ -33,7 +33,7 @@ protocol DittoDataInterface {
3333
func attachmentPublisher(
3434
for token: DittoAttachmentToken,
3535
in collectionId: String
36-
) -> DittoStore.FetchAttachmentPublisher
36+
) -> DittoStore.FetchAttachmentPublisher?
3737
func createUpdateMessage(document: [String: Any?])
3838

3939
func addUser(_ usr: ChatUser)

0 commit comments

Comments
 (0)