├── .gitignore ├── androidApp ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── bouyahya │ │ └── chatmultiplatform │ │ └── android │ │ ├── ChatMultiplatformApp.kt │ │ ├── MainActivity.kt │ │ └── MyApplicationTheme.kt │ └── res │ ├── values │ └── styles.xml │ └── xml │ ├── backup_rules.xml │ ├── data_extraction_rules.xml │ └── network_security_config.xml ├── build.gradle.kts ├── buildSrc ├── build.gradle.kts └── src │ └── main │ └── kotlin │ ├── Accompanist.kt │ ├── Compose.kt │ ├── Coroutines.kt │ ├── Koin.kt │ ├── KotlinPlugins.kt │ ├── Kotlinx.kt │ ├── Ktor.kt │ ├── Material3.kt │ ├── Moko.kt │ ├── SplashScreen.kt │ └── SqlDelight.kt ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── iosApp ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── shared.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── Pods-iosApp │ │ ├── Pods-iosApp-Info.plist │ │ ├── Pods-iosApp-acknowledgements.markdown │ │ ├── Pods-iosApp-acknowledgements.plist │ │ ├── Pods-iosApp-dummy.m │ │ ├── Pods-iosApp-frameworks-Debug-input-files.xcfilelist │ │ ├── Pods-iosApp-frameworks-Debug-output-files.xcfilelist │ │ ├── Pods-iosApp-frameworks-Release-input-files.xcfilelist │ │ ├── Pods-iosApp-frameworks-Release-output-files.xcfilelist │ │ ├── Pods-iosApp-frameworks.sh │ │ ├── Pods-iosApp-resources-Debug-input-files.xcfilelist │ │ ├── Pods-iosApp-resources-Debug-output-files.xcfilelist │ │ ├── Pods-iosApp-resources-Release-input-files.xcfilelist │ │ ├── Pods-iosApp-resources-Release-output-files.xcfilelist │ │ ├── Pods-iosApp-resources.sh │ │ ├── Pods-iosApp-umbrella.h │ │ ├── Pods-iosApp.debug.xcconfig │ │ ├── Pods-iosApp.modulemap │ │ └── Pods-iosApp.release.xcconfig │ │ └── shared │ │ ├── shared.debug.xcconfig │ │ └── shared.release.xcconfig ├── iosApp.xcodeproj │ └── project.pbxproj ├── iosApp.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── iosApp │ ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json │ ├── ComposeView.swift │ ├── ContentView.swift │ ├── Info.plist │ ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json │ └── iOSApp.swift ├── settings.gradle.kts └── shared ├── build.gradle.kts ├── shared.podspec └── src ├── androidMain └── kotlin │ └── com │ └── bouyahya │ └── chatmultiplatform │ ├── Platform.kt │ ├── core │ └── network │ │ └── HttpClientFactory.kt │ └── di │ └── PlatformModule.kt ├── commonMain └── kotlin │ └── com │ └── bouyahya │ └── chatmultiplatform │ ├── Greeting.kt │ ├── Platform.kt │ ├── core │ ├── Constants.kt │ ├── network │ │ ├── HttpClient.kt │ │ └── HttpClientFactory.kt │ └── utils │ │ └── Resource.kt │ ├── data │ └── ChatMultiplatformRepositoryImpl.kt │ ├── di │ ├── AppModule.kt │ ├── NetworkModule.kt │ └── PlatformModule.kt │ ├── domain │ ├── models │ │ ├── MessageData.kt │ │ └── User.kt │ ├── repositories │ │ └── ChatMultiplatformRepository.kt │ └── usecases │ │ └── ChatMultiplatformUseCase.kt │ └── presentation │ ├── ChatMultiplatformEvent.kt │ ├── ChatMultiplatformScreen.kt │ ├── ChatMultiplatformState.kt │ ├── ChatMultiplatformViewModel.kt │ └── components │ ├── AppBarComponent.kt │ ├── ChatComponent.kt │ ├── ConnectComponent.kt │ ├── ConnectedUsersComponent.kt │ ├── CustomTextField.kt │ ├── ReceiverComponent.kt │ └── SenderComponent.kt └── iosMain └── kotlin └── com └── bouyahya └── chatmultiplatform ├── App.kt ├── Platform.kt ├── core └── network │ └── HttpClientFactory.kt └── di └── PlatformModule.kt /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | .idea 4 | .DS_Store 5 | build 6 | captures 7 | .externalNativeBuild 8 | .cxx 9 | local.properties 10 | xcuserdata -------------------------------------------------------------------------------- /androidApp/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.application") 3 | kotlin("android") 4 | id("org.jetbrains.compose") 5 | } 6 | 7 | android { 8 | namespace = "com.bouyahya.chatmultiplatform.android" 9 | compileSdk = 34 10 | defaultConfig { 11 | applicationId = "com.bouyahya.chatmultiplatform.android" 12 | minSdk = 24 13 | targetSdk = 33 14 | versionCode = 1 15 | versionName = "1.0" 16 | } 17 | buildFeatures { 18 | compose = true 19 | } 20 | composeOptions { 21 | kotlinCompilerExtensionVersion = "1.5.3" 22 | } 23 | packagingOptions { 24 | resources { 25 | excludes += "/META-INF/{AL2.0,LGPL2.1}" 26 | } 27 | } 28 | buildTypes { 29 | getByName("release") { 30 | isMinifyEnabled = false 31 | } 32 | } 33 | compileOptions { 34 | sourceCompatibility = JavaVersion.VERSION_1_8 35 | targetCompatibility = JavaVersion.VERSION_1_8 36 | } 37 | kotlinOptions { 38 | jvmTarget = "1.8" 39 | } 40 | } 41 | 42 | dependencies { 43 | implementation(project(":shared")) 44 | implementation(Koin.koinAndroid) 45 | implementation("androidx.compose.ui:ui:1.5.1") 46 | implementation("androidx.compose.ui:ui-tooling:1.5.1") 47 | implementation("androidx.compose.ui:ui-tooling-preview:1.5.1") 48 | implementation("androidx.compose.foundation:foundation:1.5.1") 49 | implementation("androidx.compose.material:material:1.5.1") 50 | implementation("androidx.activity:activity-compose:1.7.0") 51 | } -------------------------------------------------------------------------------- /androidApp/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 19 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /androidApp/src/main/java/com/bouyahya/chatmultiplatform/android/ChatMultiplatformApp.kt: -------------------------------------------------------------------------------- 1 | package com.bouyahya.chatmultiplatform.android 2 | 3 | import android.app.Application 4 | import com.bouyahya.chatmultiplatform.di.initKoin 5 | 6 | class ChatMultiplatformApp : Application() { 7 | override fun onCreate() { 8 | super.onCreate() 9 | initKoin() 10 | } 11 | } -------------------------------------------------------------------------------- /androidApp/src/main/java/com/bouyahya/chatmultiplatform/android/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.bouyahya.chatmultiplatform.android 2 | 3 | import android.os.Bundle 4 | import androidx.activity.ComponentActivity 5 | import androidx.activity.compose.setContent 6 | import androidx.compose.foundation.layout.fillMaxSize 7 | import androidx.compose.material.* 8 | import androidx.compose.runtime.Composable 9 | import androidx.compose.ui.Modifier 10 | import androidx.compose.ui.tooling.preview.Preview 11 | import com.bouyahya.chatmultiplatform.presentation.ChatMultiplatformScreen 12 | import org.koin.androidx.compose.getViewModel 13 | 14 | class MainActivity : ComponentActivity() { 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | setContent { 18 | MyApplicationTheme { 19 | Surface( 20 | modifier = Modifier.fillMaxSize(), 21 | color = MaterialTheme.colors.background 22 | ) { 23 | ChatMultiplatformScreen( 24 | chatMultiplatformViewModel = getViewModel() 25 | ) 26 | } 27 | } 28 | } 29 | } 30 | } 31 | 32 | @Composable 33 | fun GreetingView(text: String) { 34 | Text(text = text) 35 | } 36 | 37 | @Preview 38 | @Composable 39 | fun DefaultPreview() { 40 | MyApplicationTheme { 41 | GreetingView("Hello, Android!") 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /androidApp/src/main/java/com/bouyahya/chatmultiplatform/android/MyApplicationTheme.kt: -------------------------------------------------------------------------------- 1 | package com.bouyahya.chatmultiplatform.android 2 | 3 | import androidx.compose.foundation.isSystemInDarkTheme 4 | import androidx.compose.foundation.shape.RoundedCornerShape 5 | import androidx.compose.material.MaterialTheme 6 | import androidx.compose.material.Shapes 7 | import androidx.compose.material.Typography 8 | import androidx.compose.material.darkColors 9 | import androidx.compose.material.lightColors 10 | import androidx.compose.runtime.Composable 11 | import androidx.compose.ui.graphics.Color 12 | import androidx.compose.ui.text.TextStyle 13 | import androidx.compose.ui.text.font.FontFamily 14 | import androidx.compose.ui.text.font.FontWeight 15 | import androidx.compose.ui.unit.dp 16 | import androidx.compose.ui.unit.sp 17 | 18 | @Composable 19 | fun MyApplicationTheme( 20 | darkTheme: Boolean = isSystemInDarkTheme(), 21 | content: @Composable () -> Unit 22 | ) { 23 | val colors = if (darkTheme) { 24 | darkColors( 25 | primary = Color(0xFFBB86FC), 26 | primaryVariant = Color(0xFF3700B3), 27 | secondary = Color(0xFF03DAC5) 28 | ) 29 | } else { 30 | lightColors( 31 | primary = Color(0xFF6200EE), 32 | primaryVariant = Color(0xFF3700B3), 33 | secondary = Color(0xFF03DAC5) 34 | ) 35 | } 36 | val typography = Typography( 37 | body1 = TextStyle( 38 | fontFamily = FontFamily.Default, 39 | fontWeight = FontWeight.Normal, 40 | fontSize = 16.sp 41 | ) 42 | ) 43 | val shapes = Shapes( 44 | small = RoundedCornerShape(4.dp), 45 | medium = RoundedCornerShape(4.dp), 46 | large = RoundedCornerShape(0.dp) 47 | ) 48 | 49 | MaterialTheme( 50 | colors = colors, 51 | typography = typography, 52 | shapes = shapes, 53 | content = content 54 | ) 55 | } 56 | -------------------------------------------------------------------------------- /androidApp/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 |