diff --git a/.run/ChiaChat.run.xml b/.run/ChiaChat.run.xml new file mode 100644 index 00000000..34fa3a64 --- /dev/null +++ b/.run/ChiaChat.run.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.run/desktopApp.run.xml b/.run/desktopApp.run.xml new file mode 100644 index 00000000..7af7e15f --- /dev/null +++ b/.run/desktopApp.run.xml @@ -0,0 +1,28 @@ + + + + + + + + true + true + false + + + \ No newline at end of file diff --git a/.run/webApp-run .run.xml b/.run/webApp-run .run.xml new file mode 100644 index 00000000..1e939ed2 --- /dev/null +++ b/.run/webApp-run .run.xml @@ -0,0 +1,23 @@ + + + + + + + true + true + false + + + \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index b3e97eca..00000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# ChiaChat diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index fb1c8dd0..0e2b047c 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -1,50 +1,33 @@ plugins { - id("com.android.application") - kotlin("android") - id("org.jetbrains.compose") version Versions.composeMultiplatform + kotlin("multiplatform") + id("com.android.application") + id("org.jetbrains.compose") } -val resPath = "src/commonMain/resources" - -android { - compileSdk = 33 - defaultConfig { - applicationId = "org.chiachat.app.android" - minSdk = 26 - targetSdk = 33 - versionCode = 1 - versionName = "1.0" - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - kotlinOptions { jvmTarget = "17" } - - buildTypes { - getByName("release") { - isMinifyEnabled = true - isShrinkResources = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") +kotlin { + android() + sourceSets { + val androidMain by getting { + dependencies { + implementation(project(":shared")) + implementation("androidx.appcompat:appcompat:1.5.1") + implementation("androidx.activity:activity-compose:1.6.1") + } + } } - } - sourceSets["main"].apply { - assets.srcDirs(project(":ui").file(resPath), project(":shared").file(resPath)) - } } -dependencies { - implementation(project(":ui")) - implementation("androidx.activity:activity-compose:1.6.1") - implementation(Deps.Koin.compose) - - /*testImplementation(Deps.Test.junitApi) - testRuntimeOnly(Deps.Test.junitEngine) - androidTestImplementation("androidx.test:runner:1.4.0") - androidTestImplementation(Deps.Test.junitApi) - androidTestImplementation("de.mannodermaus.junit5:android-test-core:1.3.0") - androidTestRuntimeOnly("de.mannodermaus.junit5:android-test-runner:1.3.0")*/ +android { + compileSdk = 33 + defaultConfig { + applicationId = "org.chiachat.app" + minSdk = 24 + targetSdk = 33 + versionCode = 1 + versionName = "1.0" + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } } diff --git a/androidApp/proguard-rules.pro b/androidApp/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/androidApp/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index b6228691..0e1eb5f4 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -4,20 +4,20 @@ + android:theme="@style/Theme.AppCompat.Light.NoActionBar"> + android:name="org.chiachat.app.android.MainActivity" + > - \ No newline at end of file + \ No newline at end of file diff --git a/androidApp/src/main/ic_launcher-playstore.png b/androidApp/src/main/ic_launcher-playstore.png deleted file mode 100644 index 539f4dc5..00000000 Binary files a/androidApp/src/main/ic_launcher-playstore.png and /dev/null differ diff --git a/androidApp/src/main/java/org/chiachat/app/android/AndroidModules.kt b/androidApp/src/main/java/org/chiachat/app/android/AndroidModules.kt deleted file mode 100644 index 60d82c24..00000000 --- a/androidApp/src/main/java/org/chiachat/app/android/AndroidModules.kt +++ /dev/null @@ -1,22 +0,0 @@ -package org.chiachat.app.android - -import android.content.Context -import com.soywiz.korio.android.AndroidCoroutineContext -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import org.koin.core.qualifier.named -import org.koin.dsl.module - -class AndroidModules(androidContext: Context) { - val ioContext = Dispatchers.IO + AndroidCoroutineContext(androidContext) - val vmContext = Dispatchers.Default + AndroidCoroutineContext(androidContext) - - val context = module { single { androidContext } } - - val scopes = module { - factory(named("ioScope")) { CoroutineScope(ioContext) } - factory(named("vmScope")) { CoroutineScope(vmContext) } - } - - val all = context + scopes -} diff --git a/androidApp/src/main/java/org/chiachat/app/android/MainActivity.kt b/androidApp/src/main/java/org/chiachat/app/android/MainActivity.kt deleted file mode 100644 index 6876b27a..00000000 --- a/androidApp/src/main/java/org/chiachat/app/android/MainActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package org.chiachat.app.android - -import android.content.Context -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.addCallback -import androidx.activity.compose.setContent -import kotlinx.coroutines.runBlocking -import org.chiachat.app.SharedAppModules -import org.chiachat.app.compose.ComposeAppModules -import org.chiachat.app.compose.ComposeRoot -import org.chiachat.app.compose.services.NavigationService -import org.chiachat.app.db.PlatformDb -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject -import org.koin.core.context.startKoin -import org.koin.core.context.stopKoin - -class MainActivity : ComponentActivity(), KoinComponent { - val context: Context = this - - val app = ComposeRoot() - - init { - runBlocking { - val androidModules = AndroidModules(context) - startKoin { modules(androidModules.all) } - val driver = PlatformDb().getDriver() - val sharedModules = SharedAppModules(driver) - val composeModules = ComposeAppModules() - stopKoin() - - startKoin { - modules(androidModules.all + composeModules.all + sharedModules.all) - allowOverride(false) - } - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - - super.onCreate(savedInstanceState) - setContent { app.View() } - - val navigationService: NavigationService by inject() - val callback = onBackPressedDispatcher.addCallback(this) { navigationService.back() } - - callback.isEnabled = true - } -} diff --git a/androidApp/src/main/kotlin/org/chiachat/app/android/MainActivity.kt b/androidApp/src/main/kotlin/org/chiachat/app/android/MainActivity.kt new file mode 100644 index 00000000..d25db0c2 --- /dev/null +++ b/androidApp/src/main/kotlin/org/chiachat/app/android/MainActivity.kt @@ -0,0 +1,22 @@ +package org.chiachat.app.android + +import AndroidRoot +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.appcompat.app.AppCompatActivity +import org.koin.core.context.stopKoin + +class MainActivity : AppCompatActivity() { + val root = AndroidRoot(this) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + root.View() + } + } + + override fun onDestroy() { + super.onDestroy() + stopKoin() + } +} diff --git a/androidApp/src/main/res/drawable-v24/ic_launcher_background.xml b/androidApp/src/main/res/drawable-v24/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/androidApp/src/main/res/drawable-v24/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml b/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/androidApp/src/main/res/values-night/themes.xml b/androidApp/src/main/res/values-night/themes.xml new file mode 100644 index 00000000..710bfabb --- /dev/null +++ b/androidApp/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/androidApp/src/main/res/values/themes.xml b/androidApp/src/main/res/values/themes.xml new file mode 100644 index 00000000..50dcf6d3 --- /dev/null +++ b/androidApp/src/main/res/values/themes.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 0f1bd39f..e370bc66 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,34 +1,24 @@ -buildscript { - repositories { - gradlePluginPortal() - google() - mavenCentral() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - } - dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}") - classpath("com.android.tools.build:gradle:7.2.2") - classpath(Plugin.kotlin) - classpath(Plugin.kotlinxSerialization) - classpath(Plugin.proguard) - classpath(Plugin.junitAndroid) - } -} - plugins { - id(Plugin.Id.detekt) version Versions.detekt - id(Plugin.Id.kover) version Versions.kover - id(Plugin.Id.ktfmt) version Versions.ktfmtGradle + // this is necessary to avoid the plugins to be loaded multiple times + // in each subproject's classloader + kotlin("jvm") apply false + kotlin("multiplatform") apply false + kotlin("android") apply false + id("com.android.application") apply false + id("com.android.library") apply false + id("org.jetbrains.compose") apply false + + id(Plugin.Id.detekt) version Versions.detekt + id(Plugin.Id.kover) version Versions.kover + id(Plugin.Id.ktfmt) version Versions.ktfmtGradle } -group = "org.chiachat" -version = "1.0.0" tasks { - val checkAndDetekt by - registering(io.gitlab.arturbosch.detekt.Detekt::class) { - dependsOn("check") + val detektAndCheck by + registering(io.gitlab.arturbosch.detekt.Detekt::class) { + dependsOn(":check") description = "Runs detekt static code analysis on all modules" buildUponDefaultConfig = true allRules = true @@ -41,13 +31,13 @@ tasks { config.setFrom("$rootDir/config/detekt/detekt.yml") baseline.set(file("$rootDir/config/detekt/baseline.xml")) reports { - html.required.set(true) - xml.required.set(true) - sarif.required.set(true) + html.required.set(true) + xml.required.set(true) + sarif.required.set(true) } - } - val detektProjectBaseline by - registering(io.gitlab.arturbosch.detekt.DetektCreateBaselineTask::class) { + } + val detektProjectBaseline by + registering(io.gitlab.arturbosch.detekt.DetektCreateBaselineTask::class) { description = "Overrides current baseline." buildUponDefaultConfig.set(true) ignoreFailures.set(true) @@ -58,120 +48,51 @@ tasks { include("**/*.kt") exclude("**/resources/**") exclude("**/build/**") - } + } } val detektReportMergeSarif by - tasks.registering(io.gitlab.arturbosch.detekt.report.ReportMergeTask::class) { - output.set(rootProject.layout.buildDirectory.file("reports/detekt/merge.sarif")) - } - -allprojects { - repositories { - mavenCentral() - mavenLocal() - google() - maven { url = uri("https://jitpack.io") } - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - } +tasks.registering(io.gitlab.arturbosch.detekt.report.ReportMergeTask::class) { + output.set(rootProject.layout.buildDirectory.file("reports/detekt/merge.sarif")) } subprojects { - apply(plugin = Plugin.Id.detekt) - - detekt { - source = - objects - .fileCollection() - .from( - io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_SRC_DIR_JAVA, - io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_TEST_SRC_DIR_JAVA, - io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_SRC_DIR_KOTLIN, - io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_TEST_SRC_DIR_KOTLIN, - ) - buildUponDefaultConfig = true - baseline = file("$rootDir/config/detekt/baseline.xml") - } - - tasks.withType detekt@{ - jvmTarget = "17" - reports { - xml.required.set(true) - html.required.set(true) - txt.required.set(true) - sarif.required.set(true) - md.required.set(true) + repositories { + google() + mavenCentral() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } - basePath = rootProject.projectDir.absolutePath - finalizedBy(detektReportMergeSarif) - detektReportMergeSarif.configure { input.from(this@detekt.sarifReportFile) } - } - tasks.withType().configureEach { - jvmTarget = "17" - } - tasks { - whenTaskAdded { - if (name == "testDebugUnitTest") { - this.enabled = false - } - } - } -} -val rootPackage = "org.chiachat.app" -val basePackage = listOf("*", "compose").map { "$rootPackage.$it" } -val excludedPackages = - listOf("type", "selections", "adapter", "apollo", "test", "android.test", "compose").map { - "$rootPackage.$it.*" - } + "*.BuildConfig" + "*.MainActivity" + "*.**Test" + "*.**Module**" + "*.ChiaChatDbImpl*" - -koverMerged { - enable() // create Kover merged report tasks from this project and subprojects with enabled Kover - // plugin - - filters { - classes { - includes += basePackage - excludes += excludedPackages + apply(plugin = Plugin.Id.detekt) + + detekt { + source = + objects + .fileCollection() + .from( + io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_SRC_DIR_JAVA, + io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_TEST_SRC_DIR_JAVA, + io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_SRC_DIR_KOTLIN, + io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_TEST_SRC_DIR_KOTLIN, + ) + buildUponDefaultConfig = true + baseline = file("$rootDir/config/detekt/baseline.xml") } - projects { excludes += listOf(":androidApp", ":desktopApp", ":iosApp", ":webApp") } - } - - xmlReport { - enable() - onCheck.set(true) - reportFile.set(layout.buildDirectory.file("reports/kover/xml/report.xml")) - } - - htmlReport { - enable() - onCheck.set(true) - reportDir.set(layout.buildDirectory.dir("reports/kover/html")) - } - verify { - - // set to true to run koverMergedVerify task during the execution of the check task - // (if it exists) of the current project - onCheck.set(true) - rule { // add verification rule - // set to false to disable rule checking - isEnabled = true - // custom name for the rule - name = "Minimum Test Coverage" - // specify by which entity the code for separate coverage evaluation will be - target = kotlinx.kover.api.VerificationTarget.ALL - // grouped - - bound { // add rule bound - minValue = 25 - maxValue = 100 - // change coverage metric to evaluate (LINE, INSTRUCTION, BRANCH) - counter = kotlinx.kover.api.CounterType.LINE - // change counter value (COVERED_COUNT, MISSED_COUNT, - // COVERED_PERCENTAGE, MISSED_PERCENTAGE) - valueType = kotlinx.kover.api.VerificationValueType.COVERED_PERCENTAGE - } + tasks.withType detekt@{ + jvmTarget = "17" + reports { + xml.required.set(true) + html.required.set(true) + txt.required.set(true) + sarif.required.set(true) + md.required.set(true) + } + basePath = rootProject.projectDir.absolutePath + finalizedBy(detektReportMergeSarif) + detektReportMergeSarif.configure { input.from(this@detekt.sarifReportFile) } + } + tasks.withType().configureEach { + jvmTarget = "17" } - } } diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index 3ff75f7e..031b69a3 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -20,14 +20,15 @@ object Versions { const val activityCompose = "1.4.0-beta01" const val navCompose = "2.4.2" const val accompanist = "0.24.11-rc" - const val composeMultiplatform = "1.2.1-rc03" + const val composeMultiplatform = "1.2.1" const val nativeCoroutines = "0.12.5" const val kor = "3.3.0" const val ktfmtGradle = "0.11.0" const val conveyor = "1.2" const val kotlinxSerialization = "1.4.1" const val mpsettings = "1.0.0-RC" - const val trixnity = "3.0.0-beta3" + const val trixnity = "3.0.0" + const val circuit = "0.4.0" } object Plugin { @@ -70,7 +71,7 @@ object Deps { const val uiGraphics = "androidx.compose.ui:ui-graphics:${Versions.compose}" const val uiTooling = "androidx.compose.ui:ui-tooling:${Versions.compose}" const val foundationLayout = "androidx.compose.foundation:foundation-layout:${Versions.compose}" - const val material = "androidx.compose.material3:material:${Versions.compose}" + const val material = "androidx.compose.material:material:${Versions.compose}" const val navigation = "androidx.navigation:navigation-compose:${Versions.navCompose}" const val coilCompose = "io.coil-kt:coil-compose:2.0.0" @@ -78,6 +79,7 @@ object Deps { "com.google.accompanist:accompanist-navigation-animation:${Versions.accompanist}" const val accompanistSwipeRefresh = "com.google.accompanist:accompanist-swiperefresh:${Versions.accompanist}" + const val circuit = "com.slack.circuit:circuit-core:${Versions.circuit}" } object Kor { diff --git a/conveyor.conf b/conveyor.conf deleted file mode 100644 index a4815b23..00000000 --- a/conveyor.conf +++ /dev/null @@ -1,22 +0,0 @@ -// This is a hashbang include. You can run the command after the #! to see what -// configuration is being extracted from the Gradle build using the Conveyor plugin. -include "#!./gradlew -q printConveyorConfig" - -// This just adds a few nice-to-haves like telling the JVM to use system proxy settings. -include required("/stdlib/jvm/enhancements/client/v1.conf") - -app { - // The base URL is where the download site will be placed. Packages will check here for updates. - site.base-url = "downloads.chiachat.org" - - // This is optional. If not specified the last component of the rdns name will be turned into a display name. - display-name = "ChiaChat" - version = "0.0.1" - - icons = "shared/src/commonMain/resources/icons/chiachat-*.png" - vcs-url = "https://github.com/chiachat/chiachat" -} - -conveyor.compatibility-level = 4 - -conveyor.license-key = "zduw-wncj" diff --git a/desktopApp/build.gradle.kts b/desktopApp/build.gradle.kts index df0c2a36..066d6c69 100644 --- a/desktopApp/build.gradle.kts +++ b/desktopApp/build.gradle.kts @@ -1,96 +1,40 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { - kotlin("multiplatform") - id("org.jetbrains.compose") version Versions.composeMultiplatform - // id(Plugin.Id.conveyor) version Versions.conveyor + kotlin("multiplatform") + id("org.jetbrains.compose") } -repositories { - mavenCentral() - google() - maven { url = uri("https://jitpack.io") } - maven { url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev") } -} - -java { toolchain { languageVersion.set(JavaLanguageVersion.of(17)) } } - kotlin { - jvm { - compilations.all { kotlinOptions.jvmTarget = "11" } - withJava() - } - - sourceSets { - val jvmMain by getting { - dependencies { - implementation(project(":ui")) - implementation(compose.desktop.currentOs) - } + jvm {} + sourceSets { + val jvmMain by getting { + dependencies { + implementation(compose.desktop.currentOs) + implementation(project(":shared")) + } + } } - val jvmTest by getting - } } -/*dependencies { - // Use the configurations created by the Conveyor plugin to tell Gradle/Conveyor where to find the - // artifacts for each platform. - linuxAmd64(compose.desktop.linux_x64) - macAmd64(compose.desktop.macos_x64) - macAarch64(compose.desktop.macos_arm64) - windowsAmd64(compose.desktop.windows_x64) -}*/ - -val ico = File("../ui/src/commonMain/resources/icons/chiachat/chiachat-trans-256x256.ico") -val icns = File("../ui/src/commonMain/resources/icons/chiachat/chiachat-trans-256x256.icns") -val png = File("../ui/src/commonMain/resources/icons/chiachat/chiachat-trans-256x256.png") - compose.desktop { - application { - mainClass = "org.chiachat.app.desktop.MainKt" - - buildTypes.release.proguard { - this.isEnabled.set(true) - configurationFiles.from(project.file("compose-desktop.pro")) + application { + mainClass = "org.jetbrains.compose.demo.widgets.MainKt" + + nativeDistributions { + targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) + packageName = "ComposeChiaChat" + packageVersion = "1.0.0" + + windows { + menu = true + // see https://wixtoolset.org/documentation/manual/v3/howtos/general/generate_guids.html + upgradeUuid = "a61b72be-1b0c-4de5-9607-791c17687428" + } + + macOS { + bundleID = "org.chiachat.app" + } + } } - - nativeDistributions { - targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "ChiaChat" - packageVersion = "1.0.0" - - modules("java.sql") - - macOS { iconFile.set(icns) } - windows { - iconFile.set(ico) - console = true - } - linux { - iconFile.set(png) - packageName = "chia-chat" - debMaintainer = "andrea@chiachat.org" - } - } - } } - -configurations.all { - attributes { - // https://github.com/JetBrains/compose-jb/issues/1404#issuecomment-1146894731 - attribute(Attribute.of("ui", String::class.java), "awt") - } -} - -/*dependencies { - // Force override the Kotlin stdlib version used by Compose to 1.7 in the machine specific - // configurations, as otherwise we can end up - // with a mix of 1.6 and 1.7 on our classpath. This is the same logic as is applied to the regular - // Compose configurations normally. - val v = "1.7.10" - for (m in setOf("linuxAmd64", "macAmd64", "macAarch64", "windowsAmd64")) { - m("org.jetbrains.kotlin:kotlin-stdlib:$v") - m("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$v") - m("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$v") - } - }*/ diff --git a/desktopApp/compose-desktop.pro b/desktopApp/compose-desktop.pro deleted file mode 100644 index 2ddd624c..00000000 --- a/desktopApp/compose-desktop.pro +++ /dev/null @@ -1,7 +0,0 @@ --optimizationpasses 3 --overloadaggressively --repackageclasses '' --allowaccessmodification - --keep class app.cash.sqldelight.driver.jdbc.sqlite.** { *; } --keep class org.sqlite.** { *; } \ No newline at end of file diff --git a/desktopApp/src/jvmMain/kotlin/org/chiachat/app/desktop/DesktopApp.kt b/desktopApp/src/jvmMain/kotlin/org/chiachat/app/desktop/DesktopApp.kt deleted file mode 100644 index a91cca52..00000000 --- a/desktopApp/src/jvmMain/kotlin/org/chiachat/app/desktop/DesktopApp.kt +++ /dev/null @@ -1,21 +0,0 @@ -package org.chiachat.app.desktop - -import app.cash.sqldelight.db.SqlDriver -import org.chiachat.app.SharedAppModules -import org.chiachat.app.compose.ComposeAppModules -import org.chiachat.app.compose.ComposeRoot -import org.koin.core.context.startKoin - -class DesktopApp(driver: SqlDriver) { - val composeRoot = ComposeRoot() - - init { - startKoin { - val desktopModules = DesktopModules() - val composeModules = ComposeAppModules() - val sharedModules = SharedAppModules(driver) - modules(desktopModules.all + composeModules.all + sharedModules.all) - allowOverride(false) - } - } -} diff --git a/desktopApp/src/jvmMain/kotlin/org/chiachat/app/desktop/DesktopModules.kt b/desktopApp/src/jvmMain/kotlin/org/chiachat/app/desktop/DesktopModules.kt deleted file mode 100644 index b956fded..00000000 --- a/desktopApp/src/jvmMain/kotlin/org/chiachat/app/desktop/DesktopModules.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.chiachat.app.desktop - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import org.koin.core.qualifier.named -import org.koin.dsl.module - -class DesktopModules { - val scopes = module { - factory(named("ioScope")) { CoroutineScope(Dispatchers.IO) } - factory(named("vmScope")) { CoroutineScope(Dispatchers.Default) } - } - - val all = scopes -} diff --git a/desktopApp/src/jvmMain/kotlin/org/chiachat/app/desktop/Main.kt b/desktopApp/src/jvmMain/kotlin/org/chiachat/app/desktop/Main.kt deleted file mode 100644 index c5308c4e..00000000 --- a/desktopApp/src/jvmMain/kotlin/org/chiachat/app/desktop/Main.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.chiachat.app.desktop - -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.window.Window -import androidx.compose.ui.window.application -import kotlinx.coroutines.runBlocking -import org.chiachat.app.db.PlatformDb - -fun main() { - val sqlDriver = runBlocking { PlatformDb().getDriver() } - val desktopApp = DesktopApp(sqlDriver) - application { - val icon = painterResource("icons/chiachat/chiachat-trans-256x256.png") - Window(onCloseRequest = ::exitApplication, icon = icon) { desktopApp.composeRoot.View() } - } -} diff --git a/desktopApp/src/jvmMain/kotlin/org/jetbrains/compose/demo/widgets/main.kt b/desktopApp/src/jvmMain/kotlin/org/jetbrains/compose/demo/widgets/main.kt new file mode 100644 index 00000000..640bf2bf --- /dev/null +++ b/desktopApp/src/jvmMain/kotlin/org/jetbrains/compose/demo/widgets/main.kt @@ -0,0 +1,14 @@ +package org.jetbrains.compose.demo.widgets + +import DesktopRoot +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.WindowState +import androidx.compose.ui.window.singleWindowApplication + +fun main() { + val desktopRoot = DesktopRoot() + singleWindowApplication(title = "ChiaChat", state = WindowState(size = DpSize(800.dp, 600.dp))) { + desktopRoot.View() + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 48c79097..d589487b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,18 +1,17 @@ -#Gradle -org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M" -#Kotlin kotlin.code.style=official -#Android +xcodeproj=./iosApp +kotlin.native.cocoapods.generate.wrapper=true android.useAndroidX=true -#MPP -kotlin.mpp.enableCInteropCommonization=true -kotlin.mpp.stability.nowarn=true -#https://github.com/JetBrains/compose-jb/issues/2046 +org.gradle.jvmargs=-Xmx3g +org.jetbrains.compose.experimental.jscanvas.enabled=true +org.jetbrains.compose.experimental.macos.enabled=true +org.jetbrains.compose.experimental.uikit.enabled=true kotlin.native.cacheKind=none kotlin.native.useEmbeddableCompilerJar=true +kotlin.native.enableDependencyPropagation=false +kotlin.mpp.enableGranularSourceSetsMetadata=true # Enable kotlin/native experimental memory model kotlin.native.binary.memoryModel=experimental -compose.desktop.verbose=true -org.jetbrains.compose.experimental.uikit.enabled=true -org.jetbrains.compose.experimental.jscanvas.enabled=true -kotlin.native.ignoreDisabledTargets=true \ No newline at end of file +kotlin.version=1.7.20 +agp.version=7.1.3 +compose.version=1.2.1 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927a..249e5832 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradlew b/gradlew index 1b6c7873..a69d9cb6 100755 --- a/gradlew +++ b/gradlew @@ -205,6 +205,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat old mode 100755 new mode 100644 index 107acd32..53a6b238 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,89 +1,91 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..82409539 --- /dev/null +++ b/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "chiachat-trans-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosApp/Assets.xcassets/AppIcon.appiconset/chiachat-trans-1024x1024.png b/iosApp/Assets.xcassets/AppIcon.appiconset/chiachat-trans-1024x1024.png new file mode 100644 index 00000000..27c8f188 Binary files /dev/null and b/iosApp/Assets.xcassets/AppIcon.appiconset/chiachat-trans-1024x1024.png differ diff --git a/iosApp/Assets.xcassets/Contents.json b/iosApp/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/iosApp/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iosApp/Assets.xcassets/light_mode.imageset/Contents.json b/iosApp/Assets.xcassets/light_mode.imageset/Contents.json new file mode 100644 index 00000000..8ecea54c --- /dev/null +++ b/iosApp/Assets.xcassets/light_mode.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "light_mode.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ui/src/commonMain/resources/icons/material/light_mode.png b/iosApp/Assets.xcassets/light_mode.imageset/light_mode.png similarity index 100% rename from ui/src/commonMain/resources/icons/material/light_mode.png rename to iosApp/Assets.xcassets/light_mode.imageset/light_mode.png diff --git a/iosApp/ChiaChat.xcodeproj/project.pbxproj b/iosApp/ChiaChat.xcodeproj/project.pbxproj new file mode 100644 index 00000000..2a93bc7f --- /dev/null +++ b/iosApp/ChiaChat.xcodeproj/project.pbxproj @@ -0,0 +1,384 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 2152FB042600AC8F00CF470E /* iosApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2152FB032600AC8F00CF470E /* iosApp.swift */; }; + C1FC908188C4E8695729CB06 /* Pods_ChiaChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DE96E47030356CE6AD9794A /* Pods_ChiaChat.framework */; }; + FDD7544929449AFE00D7B589 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = FDD7544829449AFE00D7B589 /* assets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1EB65E27D2C0F884D0A1A133 /* Pods-ChiaChat.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChiaChat.debug.xcconfig"; path = "Target Support Files/Pods-ChiaChat/Pods-ChiaChat.debug.xcconfig"; sourceTree = ""; }; + 2152FB032600AC8F00CF470E /* iosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosApp.swift; sourceTree = ""; }; + 3D7A606AB0AD7636269BD9D0 /* Pods-ChiaChat.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChiaChat.release.xcconfig"; path = "Target Support Files/Pods-ChiaChat/Pods-ChiaChat.release.xcconfig"; sourceTree = ""; }; + 7555FF7B242A565900829871 /* ChiaChat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChiaChat.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8DE96E47030356CE6AD9794A /* Pods_ChiaChat.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ChiaChat.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AB3632DC29227652001CCB65 /* TeamId.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = TeamId.xcconfig; sourceTree = ""; }; + FDD7544829449AFE00D7B589 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = assets; path = ../shared/src/commonMain/resources/assets; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 9964867F0862B4D9FB6ABFC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C1FC908188C4E8695729CB06 /* Pods_ChiaChat.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7555FF72242A565900829871 = { + isa = PBXGroup; + children = ( + FDD7544829449AFE00D7B589 /* assets */, + AB1DB47929225F7C00F7AF9C /* Configuration */, + 7555FF7D242A565900829871 /* iosApp */, + 7555FF7C242A565900829871 /* Products */, + E1DAFBE8E1CFC0878361EF0E /* Pods */, + B62309C7396AD7BF607A63B2 /* Frameworks */, + ); + sourceTree = ""; + }; + 7555FF7C242A565900829871 /* Products */ = { + isa = PBXGroup; + children = ( + 7555FF7B242A565900829871 /* ChiaChat.app */, + ); + name = Products; + sourceTree = ""; + }; + 7555FF7D242A565900829871 /* iosApp */ = { + isa = PBXGroup; + children = ( + 7555FF8C242A565B00829871 /* Info.plist */, + 2152FB032600AC8F00CF470E /* iosApp.swift */, + ); + path = iosApp; + sourceTree = ""; + }; + AB1DB47929225F7C00F7AF9C /* Configuration */ = { + isa = PBXGroup; + children = ( + AB3632DC29227652001CCB65 /* TeamId.xcconfig */, + ); + path = Configuration; + sourceTree = ""; + }; + B62309C7396AD7BF607A63B2 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8DE96E47030356CE6AD9794A /* Pods_ChiaChat.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + E1DAFBE8E1CFC0878361EF0E /* Pods */ = { + isa = PBXGroup; + children = ( + 1EB65E27D2C0F884D0A1A133 /* Pods-ChiaChat.debug.xcconfig */, + 3D7A606AB0AD7636269BD9D0 /* Pods-ChiaChat.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7555FF7A242A565900829871 /* ChiaChat */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "ChiaChat" */; + buildPhases = ( + E8D673591E7196AEA2EA10E2 /* [CP] Check Pods Manifest.lock */, + 7555FF77242A565900829871 /* Sources */, + 7555FF79242A565900829871 /* Resources */, + 9964867F0862B4D9FB6ABFC7 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ChiaChat; + productName = iosApp; + productReference = 7555FF7B242A565900829871 /* ChiaChat.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7555FF73242A565900829871 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = org.jetbrains; + TargetAttributes = { + 7555FF7A242A565900829871 = { + CreatedOnToolsVersion = 11.3.1; + }; + }; + }; + buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "ChiaChat" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7555FF72242A565900829871; + productRefGroup = 7555FF7C242A565900829871 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7555FF7A242A565900829871 /* ChiaChat */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7555FF79242A565900829871 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FDD7544929449AFE00D7B589 /* assets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + E8D673591E7196AEA2EA10E2 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ChiaChat-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7555FF77242A565900829871 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2152FB042600AC8F00CF470E /* iosApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 7555FFA3242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AB3632DC29227652001CCB65 /* TeamId.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7555FFA4242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AB3632DC29227652001CCB65 /* TeamId.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7555FFA6242A565B00829871 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1EB65E27D2C0F884D0A1A133 /* Pods-ChiaChat.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = ""; + DEVELOPMENT_TEAM = 78ZJNJ7ZJW; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = iosApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.chiachat.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 7555FFA7242A565B00829871 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3D7A606AB0AD7636269BD9D0 /* Pods-ChiaChat.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = ""; + DEVELOPMENT_TEAM = 78ZJNJ7ZJW; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = iosApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.chiachat.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7555FF76242A565900829871 /* Build configuration list for PBXProject "ChiaChat" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFA3242A565B00829871 /* Debug */, + 7555FFA4242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "ChiaChat" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7555FFA6242A565B00829871 /* Debug */, + 7555FFA7242A565B00829871 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7555FF73242A565900829871 /* Project object */; +} diff --git a/iosApp/ChiaChat.xcodeproj/xcshareddata/xcschemes/ChiaChat.xcscheme b/iosApp/ChiaChat.xcodeproj/xcshareddata/xcschemes/ChiaChat.xcscheme new file mode 100644 index 00000000..2e9f17ae --- /dev/null +++ b/iosApp/ChiaChat.xcodeproj/xcshareddata/xcschemes/ChiaChat.xcscheme @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + diff --git a/iosApp/ChiaChat.xcworkspace/contents.xcworkspacedata b/iosApp/ChiaChat.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..79fc8bd2 --- /dev/null +++ b/iosApp/ChiaChat.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/iosApp/ChiaChat.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iosApp/ChiaChat.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/iosApp/ChiaChat.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/iosApp/Configuration/TeamId.xcconfig b/iosApp/Configuration/TeamId.xcconfig new file mode 100644 index 00000000..bf06eb27 --- /dev/null +++ b/iosApp/Configuration/TeamId.xcconfig @@ -0,0 +1 @@ +TEAM_ID= diff --git a/iosApp/Podfile b/iosApp/Podfile new file mode 100644 index 00000000..6a00cbc2 --- /dev/null +++ b/iosApp/Podfile @@ -0,0 +1,5 @@ +target 'ChiaChat' do + use_frameworks! + platform :ios, '14.1' + pod 'shared', :path => '../shared' +end \ No newline at end of file diff --git a/iosApp/Podfile.lock b/iosApp/Podfile.lock new file mode 100644 index 00000000..a87aeb44 --- /dev/null +++ b/iosApp/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - shared (1.0-SNAPSHOT) + +DEPENDENCIES: + - shared (from `../shared`) + +EXTERNAL SOURCES: + shared: + :path: "../shared" + +SPEC CHECKSUMS: + shared: d9d94ec92543b22346402b01c0a18449cd889bfd + +PODFILE CHECKSUM: a9425edeb81ed1c960f25f2ddc683bc2ba0e29cd + +COCOAPODS: 1.11.3 diff --git a/iosApp/build.gradle.kts b/iosApp/build.gradle.kts deleted file mode 100644 index c069b89e..00000000 --- a/iosApp/build.gradle.kts +++ /dev/null @@ -1,99 +0,0 @@ -import org.jetbrains.compose.experimental.dsl.IOSDevices -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -plugins { - kotlin("multiplatform") - id("org.jetbrains.compose") version Versions.composeMultiplatform -} - -version = "1.0-SNAPSHOT" - -kotlin { - iosX64("uikitX64") { - binaries { - executable() { - entryPoint = "main" - freeCompilerArgs += - listOf( - "-linker-option", - "-framework", - "-linker-option", - "Metal", - "-linker-option", - "-framework", - "-linker-option", - "CoreText", - "-linker-option", - "-framework", - "-linker-option", - "CoreGraphics") - } - } - } - iosArm64("uikitArm64") { - binaries { - executable() { - entryPoint = "main" - freeCompilerArgs += - listOf( - "-linker-option", - "-framework", - "-linker-option", - "Metal", - "-linker-option", - "-framework", - "-linker-option", - "CoreText", - "-linker-option", - "-framework", - "-linker-option", - "CoreGraphics") - // TODO: the current compose binary surprises LLVM, so disable checks for now. - freeCompilerArgs += "-Xdisable-phases=VerifyBitcode" - } - } - } - - sourceSets { - val commonMain by getting { dependencies { implementation(project(":ui")) } } - - val nativeMain by creating { dependsOn(commonMain) } - val uikitMain by creating { dependsOn(nativeMain) } - val uikitX64Main by getting { dependsOn(uikitMain) } - val uikitArm64Main by getting { dependsOn(uikitMain) } - } -} - -compose.experimental { - web.application {} - uikit.application { - bundleIdPrefix = "org.chiachat.app" - projectName = "ChiaChat" - deployConfigurations { - simulator("IPhone13Pro") { - // Usage: ./gradlew iosDeployIPhone8Debug - device = IOSDevices.IPHONE_13_PRO - } - simulator("IPad") { - // Usage: ./gradlew iosDeployIPadDebug - device = IOSDevices.IPAD_MINI_6th_Gen - } - connectedDevice("Device") { - // Usage: ./gradlew iosDeployDeviceRelease - this.teamId = "***" - } - } - } -} - -tasks.withType { kotlinOptions.jvmTarget = "17" } - -kotlin { - targets.withType { - binaries.all { - // TODO: the current compose binary surprises LLVM, so disable checks for now. - freeCompilerArgs += "-Xdisable-phases=VerifyBitcode" - } - } -} diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist new file mode 100644 index 00000000..9a269f5e --- /dev/null +++ b/iosApp/iosApp/Info.plist @@ -0,0 +1,48 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UILaunchScreen + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/iosApp/iosApp/iosApp.swift b/iosApp/iosApp/iosApp.swift new file mode 100644 index 00000000..b42016a6 --- /dev/null +++ b/iosApp/iosApp/iosApp.swift @@ -0,0 +1,15 @@ +import UIKit +import shared + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + window = UIWindow(frame: UIScreen.main.bounds) + let mainViewController = Main_iosKt.MainViewController() + window?.rootViewController = mainViewController + window?.makeKeyAndVisible() + return true + } +} diff --git a/iosApp/src/uikitMain/kotlin/IosAppModules.kt b/iosApp/src/uikitMain/kotlin/IosAppModules.kt deleted file mode 100644 index afcedef6..00000000 --- a/iosApp/src/uikitMain/kotlin/IosAppModules.kt +++ /dev/null @@ -1,13 +0,0 @@ -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import org.koin.core.qualifier.named -import org.koin.dsl.module - -class IosAppModules { - val scopes = module { - factory(named("ioScope")) { CoroutineScope(Dispatchers.Default) } - factory(named("vmScope")) { CoroutineScope(Dispatchers.Default) } - } - - val all = scopes -} diff --git a/iosApp/src/uikitMain/kotlin/main.uikit.kt b/iosApp/src/uikitMain/kotlin/main.uikit.kt deleted file mode 100644 index ab1fb35b..00000000 --- a/iosApp/src/uikitMain/kotlin/main.uikit.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -// Use `xcodegen` first, then `open ./ComposeMinesweeper.xcodeproj` and then Run button in XCode. -import androidx.compose.foundation.layout.* -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Application -import kotlinx.cinterop.* -import kotlinx.coroutines.runBlocking -import org.chiachat.app.SharedAppModules -import org.chiachat.app.compose.ComposeAppModules -import org.chiachat.app.compose.ComposeRoot -import org.chiachat.app.db.PlatformDb -import org.koin.core.context.startKoin -import platform.Foundation.* -import platform.UIKit.* - -fun main() { - val args = emptyArray() - memScoped { - val argc = args.size + 1 - val argv = (arrayOf("skikoApp") + args).map { it.cstr.ptr }.toCValues() - autoreleasepool { UIApplicationMain(argc, argv, null, NSStringFromClass(SkikoAppDelegate)) } - } -} - -class SkikoAppDelegate : UIResponder, UIApplicationDelegateProtocol { - companion object : UIResponderMeta(), UIApplicationDelegateProtocolMeta - - @ObjCObjectBase.OverrideInit constructor() : super() - - private var _window: UIWindow? = null - override fun window() = _window - override fun setWindow(window: UIWindow?) { - _window = window - } - - override fun application( - application: UIApplication, - didFinishLaunchingWithOptions: Map? - ): Boolean { - runBlocking { - val iosModules = IosAppModules() - val composeModules = ComposeAppModules() - val sharedModules = SharedAppModules(PlatformDb().getDriver()) - - startKoin { - modules(iosModules.all + composeModules.all + sharedModules.all) - allowOverride(false) - } - } - window = UIWindow(frame = UIScreen.mainScreen.bounds) - val mainComponent = ComposeRoot() - window!!.rootViewController = - Application("chiachat") { - Column { - Spacer(modifier = Modifier.size(48.dp)) - mainComponent.View() - } - } - window!!.makeKeyAndVisible() - return true - } -} diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index 7e33332f..74ab099e 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -129,9 +129,11 @@ integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== "@types/cors@^2.8.12": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + version "2.8.13" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" + integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + dependencies: + "@types/node" "*" "@types/eslint-scope@^3.7.3": version "3.7.4" @@ -142,9 +144,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.4.8" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.8.tgz#720dd6a32b8219b9aba1a07b13e9d03b622695fd" - integrity sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w== + version "8.4.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" + integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -196,9 +198,9 @@ integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== "@types/node@*", "@types/node@>=10.0.0": - version "18.11.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.7.tgz#8ccef136f240770c1379d50100796a6952f01f94" - integrity sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ== + version "18.11.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.12.tgz#89e7f8aa8c88abf432f9bd594888144d7dba10aa" + integrity sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg== "@types/qs@*": version "6.9.7" @@ -427,6 +429,14 @@ acorn@^8.4.1, acorn@^8.5.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -457,9 +467,9 @@ ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.8.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.11.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" + integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -476,11 +486,21 @@ ansi-html-community@^0.0.8: resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== +ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -489,9 +509,9 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: color-convert "^2.0.1" anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -506,11 +526,23 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.2: +array-flatten@^2.1.0, array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +async@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -559,6 +591,18 @@ bonjour-service@^1.0.11: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -601,6 +645,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -611,7 +660,7 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.0: +call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -625,9 +674,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001400: - version "1.0.30001426" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001426.tgz#58da20446ccd0cb1dfebd11d2350c907ee7c2eaa" - integrity sha512-n7cosrHLl8AWt0wwZw/PJZgUg3lV0gk9LMI7ikGJwhyhgsd2Nb65vKvmSexCqq/J7rbH3mFG6yZZiPR5dLPW5A== + version "1.0.30001436" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz#22d7cbdbbbb60cdc4ca1030ccd6dea9f5de4848b" + integrity sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg== chalk@^4.1.0: version "4.1.2" @@ -657,6 +706,11 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -687,6 +741,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + colorette@^2.0.10, colorette@^2.0.14: version "2.0.19" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" @@ -803,25 +862,6 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-loader@6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.7" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.5" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" @@ -846,12 +886,31 @@ debug@4.3.4, debug@^4.1.0, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: dependencies: ms "2.1.2" +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + decamelize@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -default-gateway@^6.0.3: +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +default-gateway@^6.0.0, default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== @@ -863,6 +922,28 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-properties@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +del@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -905,6 +986,14 @@ dns-equal@^1.0.0: resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + dns-packet@^5.2.2: version "5.4.0" resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" @@ -912,6 +1001,13 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== + dependencies: + buffer-indexof "^1.0.0" + dom-serialize@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" @@ -955,10 +1051,10 @@ engine.io-parser@~5.0.3: resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== -engine.io@~6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" - integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== +engine.io@~6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.1.tgz#e3f7826ebc4140db9bbaa9021ad6b1efb175878f" + integrity sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -972,9 +1068,9 @@ engine.io@~6.2.0: ws "~8.2.3" enhanced-resolve@^5.9.3: - version "5.10.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -1069,7 +1165,7 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -express@^4.17.3: +express@^4.17.1, express@^4.17.3: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -1116,7 +1212,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11: +fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -1138,9 +1234,9 @@ fastest-levenshtein@^1.0.12: integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.14.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" + integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== dependencies: reusify "^1.0.4" @@ -1259,12 +1355,17 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== @@ -1321,6 +1422,18 @@ glob@^7.1.3, glob@^7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" +globby@^11.0.1: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + globby@^13.1.1: version "13.1.2" resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" @@ -1352,11 +1465,25 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.3: +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -1415,7 +1542,7 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== -http-proxy-middleware@^2.0.3: +http-proxy-middleware@^2.0.0, http-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -1454,15 +1581,10 @@ iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + version "5.2.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" + integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== import-local@^3.0.2: version "3.1.0" @@ -1472,6 +1594,11 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1490,12 +1617,32 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +internal-ip@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-6.2.0.tgz#d5541e79716e406b74ac6b07b856ef18dc1621c1" + integrity sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg== + dependencies: + default-gateway "^6.0.0" + ipaddr.js "^1.9.1" + is-ip "^3.1.0" + p-event "^4.2.0" + interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -ipaddr.js@1.9.1: +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip@^1.1.0: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + +ipaddr.js@1.9.1, ipaddr.js@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== @@ -1505,6 +1652,14 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -1519,6 +1674,13 @@ is-core-module@^2.9.0: dependencies: has "^1.0.3" +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -1541,11 +1703,28 @@ is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-obj@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" @@ -1563,6 +1742,14 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-regex@^1.0.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -1722,7 +1909,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash@^4.17.15, lodash@^4.17.21: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -1736,9 +1923,9 @@ log-symbols@4.1.0: is-unicode-supported "^0.1.0" log4js@^6.4.1: - version "6.7.0" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.7.0.tgz#fff671a74b2f6e956d135c3c756c79072809a23b" - integrity sha512-KA0W9ffgNBLDj6fZCq/lRbgR6ABAodRIDHrZnS48vOtfKa4PzWImb0Md1lmGCdO3n3sbCm/n1/WmrNlZ8kCI3Q== + version "6.7.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.7.1.tgz#06e12b1ac915dd1067146ffad8215f666f7d2c51" + integrity sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ== dependencies: date-format "^4.0.14" debug "^4.3.4" @@ -1746,22 +1933,15 @@ log4js@^6.4.1: rfdc "^1.3.0" streamroller "^3.1.3" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.4.3: - version "3.4.8" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.8.tgz#4204fbd4cb72e2bbcf5941d784c6b6ce2be3dd52" - integrity sha512-E8QAFfd4csESWOqKIpN+khILPFSAZwPR9S+DO/5UtJNcuanF1jLZz0oWUAPF7xd2c1r6dGjGx+jH1st+MFWufA== + version "3.4.12" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.12.tgz#d00f8ad8dab132dc277c659dc85bfd14b07d03bd" + integrity sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw== dependencies: fs-monkey "^1.0.3" @@ -1844,7 +2024,7 @@ minimist@^1.2.3, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -mkdirp@^0.5.5: +mkdirp@^0.5.5, mkdirp@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -1889,11 +2069,24 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" @@ -1907,11 +2100,6 @@ nanoid@3.3.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -1929,6 +2117,11 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -1961,6 +2154,19 @@ object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -2008,6 +2214,18 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" +p-event@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -2036,6 +2254,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-retry@^4.5.0: version "4.6.2" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" @@ -2044,6 +2269,13 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" +p-timeout@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -2101,55 +2333,14 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== +portfinder@^1.0.28: + version "1.0.32" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.7: - version "8.4.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2" - integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" + async "^2.6.4" + debug "^3.2.7" + mkdirp "^0.5.6" process-nextick-args@~2.0.0: version "2.0.1" @@ -2164,6 +2355,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -2181,6 +2377,11 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -2244,6 +2445,15 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" +regexp.prototype.flags@^1.2.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -2314,7 +2524,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2348,6 +2558,13 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== +selfsigned@^1.10.11: + version "1.10.14" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" + integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== + dependencies: + node-forge "^0.10.0" + selfsigned@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" @@ -2355,13 +2572,6 @@ selfsigned@^2.0.1: dependencies: node-forge "^1" -semver@^7.3.5: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -2454,6 +2664,11 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slash@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" @@ -2464,7 +2679,7 @@ socket.io-adapter@~2.4.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== -socket.io-parser@~4.2.0: +socket.io-parser@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.1.tgz#01c96efa11ded938dcb21cbe590c26af5eff65e5" integrity sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g== @@ -2473,18 +2688,18 @@ socket.io-parser@~4.2.0: debug "~4.3.1" socket.io@^4.4.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.3.tgz#44dffea48d7f5aa41df4a66377c386b953bc521c" - integrity sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg== + version "4.5.4" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.4.tgz#a4513f06e87451c17013b8d13fdfaf8da5a86a90" + integrity sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ== dependencies: accepts "~1.3.4" base64id "~2.0.0" debug "~4.3.2" - engine.io "~6.2.0" + engine.io "~6.2.1" socket.io-adapter "~2.4.0" - socket.io-parser "~4.2.0" + socket.io-parser "~4.2.1" -sockjs@^0.3.24: +sockjs@^0.3.21, sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== @@ -2597,6 +2812,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -2607,11 +2829,6 @@ strip-json-comments@3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== - supports-color@8.1.1, supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -2648,9 +2865,9 @@ terser-webpack-plugin@^5.1.3: terser "^5.14.1" terser@^5.14.1: - version "5.15.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" - integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== + version "5.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" + integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -2729,7 +2946,15 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -2792,7 +3017,7 @@ webpack-cli@4.10.0: rechoir "^0.7.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^5.3.1: +webpack-dev-middleware@^5.0.0, webpack-dev-middleware@^5.3.1: version "5.3.3" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== @@ -2803,6 +3028,37 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" +webpack-dev-server@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.0.0.tgz#fb4906e91182154bba54a66e6e06f84c1e3c0a80" + integrity sha512-ya5cjoBSf3LqrshZn2HMaRZQx8YRNBE+tx+CQNFGaLLHrvs4Y1aik0sl5SFhLz2cW1O9/NtyaZhthc+8UiuvkQ== + dependencies: + ansi-html "^0.0.7" + bonjour "^3.5.0" + chokidar "^3.5.1" + colorette "^1.2.2" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + del "^6.0.0" + express "^4.17.1" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + internal-ip "^6.2.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^3.1.0" + selfsigned "^1.10.11" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + strip-ansi "^7.0.0" + url "^0.11.0" + webpack-dev-middleware "^5.0.0" + ws "^8.1.0" + webpack-dev-server@4.9.2: version "4.9.2" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz#c188db28c7bff12f87deda2a5595679ebbc3c9bc" @@ -2953,10 +3209,10 @@ ws@8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== -ws@^8.4.2: - version "8.10.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.10.0.tgz#00a28c09dfb76eae4eb45c3b565f771d6951aa51" - integrity sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw== +ws@^8.1.0, ws@^8.4.2: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== ws@~8.2.3: version "8.2.3" @@ -2968,11 +3224,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" diff --git a/package.space.kts b/package.space.kts deleted file mode 100644 index 6ab5985c..00000000 --- a/package.space.kts +++ /dev/null @@ -1,5 +0,0 @@ -job("Check Pull Request") { - container(displayName = "Check Pull Request", image = "gradle:jdk17-jammy") { - sequential { kotlinScript { api -> api.gradle("build") } } - } -} diff --git a/run-configurations.png b/run-configurations.png new file mode 100644 index 00000000..0840602f Binary files /dev/null and b/run-configurations.png differ diff --git a/settings.gradle.kts b/settings.gradle.kts index 8051453e..79cb592a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,26 +1,28 @@ pluginManagement { - repositories { - mavenCentral() - google() - gradlePluginPortal() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") - maven("https://maven.hq.hydraulic.software") - } + repositories { + gradlePluginPortal() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + google() + } + + plugins { + val kotlinVersion = extra["kotlin.version"] as String + val agpVersion = extra["agp.version"] as String + val composeVersion = extra["compose.version"] as String + + kotlin("jvm").version(kotlinVersion) + kotlin("multiplatform").version(kotlinVersion) + kotlin("android").version(kotlinVersion) + id("com.android.base").version(agpVersion) + id("com.android.application").version(agpVersion) + id("com.android.library").version(agpVersion) + id("org.jetbrains.compose").version(composeVersion) + } } rootProject.name = "chiachat" -// include(":androidApp") - include(":androidApp") - -include(":iosApp") - +include(":shared") include(":desktopApp") - include(":webApp") - -include(":ui") - -include(":shared") - diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 3ec05104..535bd7a5 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -1,110 +1,92 @@ plugins { kotlin("multiplatform") - id("app.cash.sqldelight") version "2.0.0-alpha04" + kotlin("native.cocoapods") id("com.android.library") - id(Plugin.Id.kover) - // id("com.google.devtools.ksp") version "1.7.20-1.0.8" + id("org.jetbrains.compose") } -version = "1.0" +version = "1.0-SNAPSHOT" kotlin { - jvm() - js(IR) { browser {} } android() - iosArm64() - iosX64() + + jvm("desktop") + js(IR) { browser() } + + ios() iosSimulatorArm64() + cocoapods { + summary = "Shared code for the sample" + homepage = "https://github.com/JetBrains/compose-jb" + ios.deploymentTarget = "14.1" + podfile = project.file("../iosApp/Podfile") + framework { + baseName = "shared" + isStatic = true + } + } + sourceSets { val commonMain by getting { dependencies { + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material) +// implementation(Deps.Compose.circuit) api(Deps.Log.kermit) api(Deps.Kotlinx.coroutines) api(Deps.Koin.core) api(Deps.Kor.korio) - api(Deps.Matrix.Client) + + implementation(Deps.Matrix.Client) with(Deps.Utility) { api(mpsettings) api(mpsettingsNoArgs) + api(compose.ui) } } } - val commonTest by getting { + val androidMain by getting { dependencies { - implementation(kotlin("test")) - // implementation("io.mockative:mockative:1.2.3") - with(Deps.Test) { - implementation(koin) - implementation(coroutines) - } + implementation("androidx.appcompat:appcompat:1.5.1") + implementation("androidx.core:core-ktx:1.8.0") } } - val jvmMain by getting { dependencies { implementation(Deps.Sqldelight.sqliteJvmDriver) } } - val jvmTest by getting {} - val jsMain by getting { dependencies { implementation(Deps.Sqldelight.sqliteJsDriver) } } - val jsTest by getting - val androidMain by getting { - dependencies { implementation(Deps.Sqldelight.sqliteAndroidDriver) } - } - val androidTest by getting { dependencies { implementation("junit:junit:4.13.2") } } - val iosX64Main by getting - val iosArm64Main by getting - val iosSimulatorArm64Main by getting - val iosMain by creating { - dependsOn(commonMain) - iosX64Main.dependsOn(this) - iosArm64Main.dependsOn(this) - iosSimulatorArm64Main.dependsOn(this) - - dependencies { implementation(Deps.Sqldelight.sqliteNativeDriver) } + val iosMain by getting + val iosTest by getting + val iosSimulatorArm64Main by getting { + dependsOn(iosMain) } - val iosX64Test by getting - val iosArm64Test by getting - val iosSimulatorArm64Test by getting - val iosTest by creating { - dependsOn(commonTest) - iosX64Test.dependsOn(this) - iosArm64Test.dependsOn(this) - iosSimulatorArm64Test.dependsOn(this) + val iosSimulatorArm64Test by getting { + dependsOn(iosTest) } - } -} -dependencies { - configurations - .filter { it.name.startsWith("ksp") && it.name.contains("Test") } - .forEach { - add(it.name, "io.mockative:mockative-processor:1.2.3") + val desktopMain by getting { + dependencies { + implementation(compose.desktop.common) + } } -} - -sqldelight { - database("ChiaChatDb") { // This will be the name of the generated database class. - packageName = "org.chiachat.app" - dialect(Deps.Sqldelight.sqliteDialect) - deriveSchemaFromMigrations = true - verifyMigrations = true + val jsMain by getting { + dependencies { + npm("@matrix-org/olm", "3.2.13") + } + } + val jsTest by getting {} } } android { compileSdk = 33 + sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") + sourceSets["main"].res.srcDirs("src/androidMain/res") + sourceSets["main"].assets.srcDirs("src/commonMain/resources") defaultConfig { - minSdk = 26 + minSdk = 24 targetSdk = 33 - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - sourceSets { - named("main") { - manifest.srcFile("src/androidMain/AndroidManifest.xml") - res.srcDirs("src/androidMain/res") - } + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } - namespace = "org.chiachat.app.shared" } diff --git a/shared/shared.podspec b/shared/shared.podspec index dc7dcd0d..10ff481c 100644 --- a/shared/shared.podspec +++ b/shared/shared.podspec @@ -1,14 +1,14 @@ Pod::Spec.new do |spec| spec.name = 'shared' - spec.version = '1.0' - spec.homepage = 'Link to the shared Module homepage' + spec.version = '1.0-SNAPSHOT' + spec.homepage = 'https://github.com/JetBrains/compose-jb' spec.source = { :http=> ''} spec.authors = '' spec.license = '' - spec.summary = 'Some description for the shared Module' + spec.summary = 'Shared code for the sample' spec.vendored_frameworks = 'build/cocoapods/framework/shared.framework' spec.libraries = 'c++' - spec.ios.deployment_target = '14.0' + spec.ios.deployment_target = '14.1' spec.pod_target_xcconfig = { @@ -22,8 +22,8 @@ Pod::Spec.new do |spec| :execution_position => :before_compile, :shell_path => '/bin/sh', :script => <<-SCRIPT - if [ "YES" = "$COCOAPODS_SKIP_KOTLIN_BUILD" ]; then - echo "Skipping Gradle build task invocation due to COCOAPODS_SKIP_KOTLIN_BUILD environment variable set to \"YES\"" + if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then + echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"" exit 0 fi set -ev diff --git a/shared/src/androidMain/kotlin/org/chiachat/app/AndroidRoot.kt b/shared/src/androidMain/kotlin/org/chiachat/app/AndroidRoot.kt new file mode 100644 index 00000000..38b782b8 --- /dev/null +++ b/shared/src/androidMain/kotlin/org/chiachat/app/AndroidRoot.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. + * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. + */ + +import android.content.Context +import androidx.compose.runtime.Composable +import com.soywiz.korio.android.AndroidCoroutineContext +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import org.chiachat.app.SharedAppModules +import org.chiachat.app.ui.ComposeAppModules +import org.chiachat.app.ui.ComposeRoot +import org.koin.core.KoinApplication +import org.koin.core.context.startKoin +import org.koin.core.qualifier.named +import org.koin.dsl.module + + +class AndroidRoot(androidContext: Context) { + private val root = ComposeRoot() + private val androidModule = module { + factory(named("ioScope")) { + CoroutineScope(Dispatchers.IO + AndroidCoroutineContext(androidContext)) + } + factory(named("vmScope")) { + CoroutineScope(Dispatchers.Default + AndroidCoroutineContext(androidContext)) + } + } + + init { + startKoin { + val composeModules = ComposeAppModules() + val sharedModules = SharedAppModules() + modules(androidModule + composeModules.all + sharedModules.all) + allowOverride(false) + } + } + + @Composable + fun View() { + root.View() + } + +} \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/org/chiachat/app/db/PlatformDb.kt b/shared/src/androidMain/kotlin/org/chiachat/app/db/PlatformDb.kt index 2409592d..29cf4931 100644 --- a/shared/src/androidMain/kotlin/org/chiachat/app/db/PlatformDb.kt +++ b/shared/src/androidMain/kotlin/org/chiachat/app/db/PlatformDb.kt @@ -1,16 +1,16 @@ package org.chiachat.app.db import android.content.Context -import app.cash.sqldelight.db.SqlDriver -import app.cash.sqldelight.driver.android.AndroidSqliteDriver -import org.chiachat.app.ChiaChatDb +//import app.cash.sqldelight.db.SqlDriver +//import app.cash.sqldelight.driver.android.AndroidSqliteDriver +//import org.chiachat.app.ChiaChatDb import org.koin.core.component.KoinComponent import org.koin.core.component.inject -actual class PlatformDb : KoinComponent { - val context: Context by inject() - actual suspend fun getDriver(): SqlDriver { - val driver: SqlDriver = AndroidSqliteDriver(ChiaChatDb.Schema, context, "chiachat.db") - return driver - } -} +//actual class PlatformDb : KoinComponent { +// val context: Context by inject() +// actual suspend fun getDriver(): SqlDriver { +// val driver: SqlDriver = AndroidSqliteDriver(ChiaChatDb.Schema, context, "chiachat.db") +// return driver +// } +//} diff --git a/ui/src/androidMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt b/shared/src/androidMain/kotlin/org/chiachat/app/util/readImageBitmap.kt similarity index 89% rename from ui/src/androidMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt rename to shared/src/androidMain/kotlin/org/chiachat/app/util/readImageBitmap.kt index 8ac524b2..37380548 100644 --- a/ui/src/androidMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt +++ b/shared/src/androidMain/kotlin/org/chiachat/app/util/readImageBitmap.kt @@ -1,4 +1,4 @@ -package org.chiachat.app.compose.util +package org.chiachat.app.util import android.graphics.BitmapFactory import androidx.compose.ui.graphics.ImageBitmap diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/SharedAppModules.kt b/shared/src/commonMain/kotlin/org/chiachat/app/SharedAppModules.kt index 1c2bd7a4..1ec1d489 100644 --- a/shared/src/commonMain/kotlin/org/chiachat/app/SharedAppModules.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/SharedAppModules.kt @@ -1,24 +1,24 @@ package org.chiachat.app -import app.cash.sqldelight.db.SqlDriver +//import app.cash.sqldelight.db.SqlDriver import co.touchlab.kermit.Logger -import org.chiachat.app.db.DbService +//import org.chiachat.app.db.DbService import org.chiachat.app.toast.ToastService import org.chiachat.app.util.MpSettings import org.koin.core.module.dsl.singleOf import org.koin.core.qualifier.named import org.koin.dsl.module -class SharedAppModules(driver: SqlDriver) { - // val repositoriesModule = createInMemoryRepositoriesModule() - // val matrixClient = MatrixClient.fromStore( - // ) +class SharedAppModules() { +// val repositoriesModule = createInMemoryRepositoriesModule() +// val matrixClient = MatrixClient.fromStore( +// ) val services = module { - single { DbService(driver) } +// single { DbService(driver) } single { ToastService(ioScope = get(named("ioScope")), logger = Logger) } singleOf(::MpSettings) } val all = services -} +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/db/DbService.kt b/shared/src/commonMain/kotlin/org/chiachat/app/db/DbService.kt index c3685b16..ff733681 100644 --- a/shared/src/commonMain/kotlin/org/chiachat/app/db/DbService.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/db/DbService.kt @@ -1,9 +1,10 @@ package org.chiachat.app.db -import app.cash.sqldelight.db.SqlDriver -import co.touchlab.kermit.Logger -import org.chiachat.app.ChiaChatDb +//import app.cash.sqldelight.db.SqlDriver +//import co.touchlab.kermit.Logger +//import org.chiachat.app.ChiaChatDb +/* class DbService(val driver: SqlDriver) { var db: ChiaChatDb = ChiaChatDb.invoke(driver) @@ -57,3 +58,4 @@ class DbService(val driver: SqlDriver) { class FailedToSetDbVersionException : Exception() class MigrationException : Exception("Critical Error: Failed to run database migration") +*/ diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/db/PlatformDb.kt b/shared/src/commonMain/kotlin/org/chiachat/app/db/PlatformDb.kt index 598cac39..ce42eba6 100644 --- a/shared/src/commonMain/kotlin/org/chiachat/app/db/PlatformDb.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/db/PlatformDb.kt @@ -1,7 +1,7 @@ package org.chiachat.app.db -import app.cash.sqldelight.db.SqlDriver +//import app.cash.sqldelight.db.SqlDriver -expect class PlatformDb() { - suspend fun getDriver(): SqlDriver -} +//expect class PlatformDb() { +// suspend fun getDriver(): SqlDriver +//} diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/ComposeAppModules.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/ComposeAppModules.kt new file mode 100644 index 00000000..f626ec9f --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/ComposeAppModules.kt @@ -0,0 +1,25 @@ +package org.chiachat.app.ui + +import org.chiachat.app.ui.components.login.LoginComponent +import org.chiachat.app.ui.components.login.LoginViewModel +import org.chiachat.app.ui.services.NavigationService +import org.chiachat.app.ui.services.ResourceService +import org.chiachat.app.ui.services.ThemeService +import org.koin.core.module.dsl.singleOf +import org.koin.core.qualifier.named +import org.koin.dsl.module + +class ComposeAppModules { + val components = module { + singleOf(::LoginComponent) + singleOf(::LoginViewModel) + } + + val services = module { + single { NavigationService(get()) } + single { ResourceService(get(named("ioScope"))) } + singleOf(::ThemeService) + } + + val all = services + components +} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/ComposeRoot.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/ComposeRoot.kt similarity index 54% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/ComposeRoot.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/ComposeRoot.kt index 7d0367cb..4dadab9b 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/ComposeRoot.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/ComposeRoot.kt @@ -1,9 +1,10 @@ -package org.chiachat.app.compose +package org.chiachat.app.ui import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -12,26 +13,19 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch -import org.chiachat.app.compose.services.NavigationService -import org.chiachat.app.compose.services.ThemeService -import org.chiachat.app.compose.theme.AppTheme -import org.chiachat.app.compose.theme.ThemeResources +import org.chiachat.app.ui.services.NavigationService +import org.chiachat.app.ui.services.ThemeService +import org.chiachat.app.ui.theme.ChiaChatTheme.AppTheme +import org.chiachat.app.ui.theme.ThemeResources import org.koin.core.component.KoinComponent import org.koin.core.component.inject -fun loadResourcesDefault(resources: MutableStateFlow) { - CoroutineScope(Dispatchers.Default).launch { resources.value = ThemeResources() } -} - -class ComposeRoot : KoinComponent { +internal class ComposeRoot : KoinComponent { val navigationService: NavigationService by inject() - val themeService: ThemeService by inject() - @Composable fun View() { - val darkMode by themeService.darkMode.collectAsState() - AppTheme(darkMode) { - Box(modifier = Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)) { + AppTheme() { + Box(modifier = Modifier.fillMaxSize().background(MaterialTheme.colors.background)) { navigationService.currentView() } } diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/Component.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/Component.kt new file mode 100644 index 00000000..449bc050 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/Component.kt @@ -0,0 +1,9 @@ +package org.chiachat.app.ui.components + +import androidx.compose.runtime.Composable +import org.koin.core.component.KoinComponent + +internal interface Component: KoinComponent { + val vm: IViewModel + @Composable fun View() +} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/ViewModel.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/ViewModel.kt similarity index 90% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/components/ViewModel.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/components/ViewModel.kt index c7b0f80a..466c2a6b 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/ViewModel.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/ViewModel.kt @@ -1,4 +1,4 @@ -package org.chiachat.app.compose.components +package org.chiachat.app.ui.components import kotlinx.coroutines.CoroutineScope import org.koin.core.component.KoinComponent diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/homefeed/HomeFeed.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/homefeed/HomeFeed.kt new file mode 100644 index 00000000..27ab9ac3 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/homefeed/HomeFeed.kt @@ -0,0 +1,128 @@ +package org.chiachat.app.ui.components.homefeed + +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import org.chiachat.app.ui.composables.Graphics.GraphicButton +import org.chiachat.app.ui.theme.CchGraphics + +data class Post( + val user: User, + val text: String, + val timestamp: String, + val likes: Int, + val replies: Int, + val retweets: Int +) + +data class User( + val name: String, + val handle: String, +) + + +internal object HomeFeed { + @Composable + fun HomeFeedScreen(posts: List) { + TopNavBar(menuClick = {}, homeClick = {}, notificationsClick = {}) + LazyColumn { + posts.forEach { tweet -> + item { + TweetCard(tweet) + } + } + } + } + + @Composable + fun TopNavBar( + modifier: Modifier = Modifier, + menuClick: () -> Unit, + homeClick: () -> Unit, + notificationsClick: () -> Unit + ) { + Row( + modifier = modifier + .fillMaxWidth() + .height(64.dp) + .padding(16.dp), + horizontalArrangement = Arrangement.SpaceBetween + ) { + MenuButton(menuClick) + HomeButton(homeClick) + NotificationButton(notificationsClick) + } + } + + @Composable + fun MenuButton(onClick: () -> Unit) { + GraphicButton(graphic = CchGraphics.MENU, contentDescription = "menu", onClick = onClick) + } + + @Composable + fun HomeButton(onClick: () -> Unit) { + GraphicButton(graphic = CchGraphics.CHIACHAT_ICON, contentDescription = "home", onClick = onClick) + } + + @Composable + fun NotificationButton(onClick: () -> Unit) { + GraphicButton(graphic = CchGraphics.NOTIFICATION_BELL, contentDescription = "notifications", onClick = onClick) + } + + + // create a side drawer that pops open when you click the hamburger menu + @Composable + fun SideDrawer() { + Column { + // profile picture + // name + // handle + // bio + // location + // website + // join date + // number of tweets + // number of following + // number of followers + } + } + + @Composable + fun TweetCard(post: Post) { + Surface(modifier = Modifier.padding(16.dp)) { + Row(modifier = Modifier.padding(16.dp)) { + /* Avatar image */ + Column(modifier = Modifier.padding(start = 16.dp)) { + /* User name and handle */ + Row { + Text( + text = post.user.name, + style = TextStyle(fontWeight = FontWeight.Bold) + ) + Text( + text = post.user.handle, + style = TextStyle(color = Color.Gray) + ) + } + /* Tweet text */ + Text(text = post.text) + /* Tweet metadata (time, likes, replies, etc.) */ + Row { + Text( + text = post.timestamp, + style = TextStyle(color = Color.Gray) + ) + /* Other tweet metadata */ + } + } + } + } + } +} diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/AuthInputs.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/AuthInputs.kt new file mode 100644 index 00000000..a0c9d5f9 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/AuthInputs.kt @@ -0,0 +1,131 @@ +package org.chiachat.app.ui.components.login + +import androidx.compose.foundation.layout.* +import androidx.compose.material.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import org.chiachat.app.ui.composables.Graphics.Graphic +import org.chiachat.app.ui.theme.CchGraphics + + +internal object AuthInputs { + private val textFieldModifier = Modifier.height(60.dp).width(300.dp) + private fun isValidEmail(email: String): Boolean { + return email.contains("@") && email.contains(".") + } + + private fun isPasswordValid(password: String): Boolean { + return password.length > 8 + } + + + @Composable + fun Logo() { + Graphic(CchGraphics.CHIACHAT_LOGO, "ChiaChat Logo", modifier = Modifier.width(300.dp)) + } + + @Composable + fun TextFieldLabel(label: String) { + Text(label, color = MaterialTheme.colors.onBackground) + } + + + @Composable + fun Username(username: String, onUsernameChange: (String) -> Unit) { + OutlinedTextField( + label = { TextFieldLabel("Username") }, + value = username, + onValueChange = onUsernameChange, + modifier = textFieldModifier, + colors = TextFieldDefaults.outlinedTextFieldColors( + textColor = MaterialTheme.colors.primary, + ) + ) + } + + + @Composable + fun Email(email: String, onEmailChange: (String) -> Unit) { + val error = !isValidEmail(email) && email.isNotBlank() + + if (error) { + Text( + "Invalid email address", + color = MaterialTheme.colors.error + ) + Spacer(Modifier.size(5.dp)) + } + + OutlinedTextField( + label = { TextFieldLabel("Email") }, + value = email, + onValueChange = onEmailChange, + modifier = textFieldModifier, + colors = TextFieldDefaults.outlinedTextFieldColors( + textColor = MaterialTheme.colors.primary, + ), + isError = error + ) + + } + + @Composable + fun Password(password: String, onPasswordChange: (String) -> Unit) { + val error = !isPasswordValid(password) && password.isNotBlank() + if (error) { + Text( + "Password must be at least 8 characters", + color = MaterialTheme.colors.error + ) + Spacer(Modifier.size(5.dp)) + } + OutlinedTextField( + label = { TextFieldLabel("Password") }, + value = password, + onValueChange = onPasswordChange, + visualTransformation = PasswordVisualTransformation(), + modifier = textFieldModifier, + colors = TextFieldDefaults.outlinedTextFieldColors( + textColor = MaterialTheme.colors.primary, + ), + isError = error + ) + } + + @Composable + fun ConfirmPassword(password: String, confirmPassword: String, onConfirmPasswordChange: (String) -> Unit) { + val error = password.isNotBlank() && confirmPassword.isNotBlank() && password != confirmPassword + if (error) { + Text( + "Passwords do not match", + color = MaterialTheme.colors.error + ) + Spacer(modifier = Modifier.size(5.dp)) + } + OutlinedTextField( + label = { TextFieldLabel("Confirm Password") }, + value = confirmPassword, + onValueChange = onConfirmPasswordChange, + visualTransformation = PasswordVisualTransformation(), + isError = error, + modifier = textFieldModifier, + colors = TextFieldDefaults.outlinedTextFieldColors( + textColor = MaterialTheme.colors.primary, + ) + ) + } + + @Composable + fun ActionButton(text: String, onClick: () -> Unit) { + Button( + onClick = onClick, + modifier = Modifier.width(300.dp) + ) { + Text(text, fontWeight = FontWeight.W700, fontSize = 18.sp, color = MaterialTheme.colors.onPrimary) + } + } +} diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/LoginComponent.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/LoginComponent.kt new file mode 100644 index 00000000..f32f2559 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/LoginComponent.kt @@ -0,0 +1,144 @@ +package org.chiachat.app.ui.components.login + +import androidx.compose.runtime.* +import org.chiachat.app.ui.components.Component +import org.chiachat.app.ui.components.homefeed.Post +import org.chiachat.app.ui.components.homefeed.User +import org.chiachat.app.ui.components.register.RegistrationComposables +import org.chiachat.app.ui.services.ResourceService +import org.koin.core.component.inject + +internal class LoginComponent : Component { + + override val vm: ILoginViewModel = LoginViewModel() + + val resources: ResourceService by inject() + + val posts = listOf( + Post( + user = User( + name = "Jane Doe", + handle = "@janedoe" + ), + text = "Just learned about Jetpack Compose! It looks like a great way to build Android UIs.", + timestamp = "5m", + likes = 23, + replies = 4, + retweets = 12 + ), + Post( + user = User( + name = "John Doe", + handle = "@johndoe" + ), + text = "I've been using Jetpack Compose for a while now and it's really changed the way I approach Android development.", + timestamp = "23m", + likes = 45, + replies = 9, + retweets = 19 + ), + Post( + user = User( + name = "Jetpack Compose", + handle = "@jetpackcompose" + ), + text = "Jetpack Compose is a modern toolkit for building native Android UIs.", + timestamp = "1h", + likes = 103, + replies = 20, + retweets = 37 + ), + Post( + user = User( + name = "Jane Doe", + handle = "@janedoe" + ), + text = "Just learned about Jetpack Compose! It looks like a great way to build Android UIs.", + timestamp = "5m", + likes = 23, + replies = 4, + retweets = 12 + ), + Post( + user = User( + name = "John Doe", + handle = "@johndoe" + ), + text = "I've been using Jetpack Compose for a while now and it's really changed the way I approach Android development.", + timestamp = "23m", + likes = 45, + replies = 9, + retweets = 19 + ), + Post( + user = User( + name = "Jetpack Compose", + handle = "@jetpackcompose" + ), + text = "Jetpack Compose is a modern toolkit for building native Android UIs.", + timestamp = "1h", + likes = 103, + replies = 20, + retweets = 37 + ), + Post( + user = User( + name = "Jane Doe", + handle = "@janedoe" + ), + text = "Just learned about Jetpack Compose! It looks like a great way to build Android UIs.", + timestamp = "5m", + likes = 23, + replies = 4, + retweets = 12 + ), + Post( + user = User( + name = "John Doe", + handle = "@johndoe" + ), + text = "I've been using Jetpack Compose for a while now and it's really changed the way I approach Android development.", + timestamp = "23m", + likes = 45, + replies = 9, + retweets = 19 + ), + Post( + user = User( + name = "Jetpack Compose", + handle = "@jetpackcompose" + ), + text = "Jetpack Compose is a modern toolkit for building native Android UIs.", + timestamp = "1h", + likes = 103, + replies = 20, + retweets = 37 + ), + ) + + @Composable + override fun View() { +// Column { +// HomeFeed.HomeFeedScreen(posts) +// } + var register by remember { mutableStateOf(true) } + if (register) { + RegistrationComposables.RegistrationScreen(resources) { register = false } + } else { + LoginComposables.LoginScreen(resources) + } + /*Box(modifier = Modifier.padding(40.dp).fillMaxSize()) { + ToggleDarkModeButton(vm.themeService, vm.resourceService, Modifier.align(Alignment.TopEnd)) + Column( + verticalArrangement = Arrangement.spacedBy(15.dp), + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.align(Alignment.Center).padding(40.dp).width(320.dp) + ) { + CchTextField(vm.server, "server", "chiachat.org") + CchTextField(vm.username, "username", "@username") + CchTextField(vm.password, "password") + CchActionButton("Login", onClick = vm::onLogin) + } + }*/ + } +} diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/LoginComposables.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/LoginComposables.kt new file mode 100644 index 00000000..3f24b91c --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/LoginComposables.kt @@ -0,0 +1,36 @@ +package org.chiachat.app.ui.components.login + +import androidx.compose.foundation.layout.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import org.chiachat.app.ui.services.ResourceService + +internal object LoginComposables { + + @Composable + fun LoginScreen(resources: ResourceService) { + var username by remember { mutableStateOf("") } + var password by remember { mutableStateOf("") } + + Box( + modifier = Modifier.fillMaxSize() + ) { + Column( + modifier = Modifier.padding(16.dp).fillMaxWidth(0.75f).align(Alignment.Center), + horizontalAlignment = Alignment.CenterHorizontally + ) { + AuthInputs.Logo() + Spacer(Modifier.height(16.dp)) + AuthInputs.Username(username, onUsernameChange = { username = it }) + Spacer(Modifier.height(16.dp)) + AuthInputs.Password(password, onPasswordChange = { password = it }) + Spacer(Modifier.height(32.dp)) + AuthInputs.ActionButton("Login") {} + } + } + } + +} + diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LoginViewModel.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/LoginViewModel.kt similarity index 67% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LoginViewModel.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/LoginViewModel.kt index e373864a..d7753dc9 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LoginViewModel.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/login/LoginViewModel.kt @@ -1,12 +1,14 @@ -package org.chiachat.app.compose.components +package org.chiachat.app.ui.components.login import co.touchlab.kermit.Logger import kotlinx.coroutines.flow.MutableStateFlow -import org.chiachat.app.compose.services.ResourceService -import org.chiachat.app.compose.services.ThemeService +import org.chiachat.app.ui.components.IViewModel +import org.chiachat.app.ui.components.ViewModel +import org.chiachat.app.ui.services.ResourceService +import org.chiachat.app.ui.services.ThemeService import org.koin.core.component.inject -interface ILoginViewModel : IViewModel { +internal interface ILoginViewModel : IViewModel { val themeService: ThemeService val resourceService: ResourceService @@ -17,7 +19,7 @@ interface ILoginViewModel : IViewModel { fun onLogin() } -class LoginViewModel : ViewModel(), ILoginViewModel { +internal class LoginViewModel : ViewModel(), ILoginViewModel { override val themeService: ThemeService by inject() override val resourceService: ResourceService by inject() diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/register/RegistrationComposables.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/register/RegistrationComposables.kt new file mode 100644 index 00000000..69ebd8c2 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/components/register/RegistrationComposables.kt @@ -0,0 +1,44 @@ +package org.chiachat.app.ui.components.register + +import androidx.compose.foundation.layout.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import org.chiachat.app.ui.components.login.AuthInputs +import org.chiachat.app.ui.services.ResourceService + +internal object RegistrationComposables { + + @Composable + fun RegistrationScreen(resources: ResourceService, onRegister: () -> Unit) { + var username by remember { mutableStateOf("") } + var email by remember { mutableStateOf("") } + var password by remember { mutableStateOf("") } + var confirmPassword by remember { mutableStateOf("") } + + Box( + modifier = Modifier.fillMaxSize() + ) { + Column( + modifier = Modifier.padding(16.dp).fillMaxWidth(0.75f).align(Alignment.Center), + horizontalAlignment = Alignment.CenterHorizontally + ) { + AuthInputs.Logo() + Spacer(Modifier.height(16.dp)) + AuthInputs.Username(username, onUsernameChange = { username = it }) + Spacer(Modifier.height(16.dp)) + AuthInputs.Email(email, onEmailChange = { email = it }) + Spacer(Modifier.height(16.dp)) + AuthInputs.Password(password, onPasswordChange = { password = it }) + Spacer(Modifier.height(16.dp)) + AuthInputs.ConfirmPassword( + password, + confirmPassword, + onConfirmPasswordChange = { confirmPassword = it }) + Spacer(Modifier.height(32.dp)) + AuthInputs.ActionButton("Create Account", onRegister) + } + } + } +} diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/composables/Graphics.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/composables/Graphics.kt new file mode 100644 index 00000000..b04b5c81 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/composables/Graphics.kt @@ -0,0 +1,60 @@ +package org.chiachat.app.ui.composables + +import androidx.compose.foundation.layout.size +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.unit.dp +import org.chiachat.app.ui.services.ResourceService +import org.chiachat.app.ui.theme.CchGraphics +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + + +internal object Graphics : KoinComponent { + + val resources: ResourceService by inject() + + @Composable + fun Graphic( + graphic: CchGraphics, + contentDescription: String, + tint: Color = MaterialTheme.colors.primary, + modifier: Modifier = Modifier + ) { + + var graphicBitmap by remember { mutableStateOf(null) } + + LaunchedEffect(true) { + resources.loadGraphic(graphic) { + graphicBitmap = it + } + } + + graphicBitmap?.let { + Icon( + bitmap = it, + contentDescription = contentDescription, + tint = tint, + modifier = modifier + ) + } + } + + // wraps the above function inside of an IconButton and passes in the onclick + @Composable + fun GraphicButton( + graphic: CchGraphics, + tint: Color = MaterialTheme.colors.primary, + contentDescription: String, + onClick: () -> Unit + ) { + IconButton(onClick = onClick) { + Graphic(graphic, contentDescription, tint = tint, modifier = Modifier.size(64.dp)) + } + } +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/composables/Inputs.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/composables/Inputs.kt new file mode 100644 index 00000000..afa31c5d --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/composables/Inputs.kt @@ -0,0 +1,61 @@ +package org.chiachat.app.ui.composables + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material.* +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import kotlinx.coroutines.flow.MutableStateFlow +import org.chiachat.app.ui.composables.Graphics.Graphic +import org.chiachat.app.ui.services.ThemeService +import org.chiachat.app.ui.theme.CchGraphics +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject + +internal object Inputs : KoinComponent { + @Composable + fun CchTextField( + textProperty: MutableStateFlow, + label: String? = null, + placeholder: String? = label, + modifier: Modifier = Modifier + ) { + val text: String by textProperty.collectAsState() + OutlinedTextField( + value = text, + label = @Composable { label?.let { Text(it) } }, + placeholder = @Composable { placeholder?.let { Text(it) } }, + onValueChange = { newText: String -> textProperty.value = newText }, + modifier = Modifier.fillMaxWidth().then(modifier) + ) + } + + + @Composable + fun CchActionButton(text: String, onClick: () -> Unit, modifier: Modifier = Modifier) { + OutlinedButton( + onClick, + colors = + ButtonDefaults.outlinedButtonColors( + backgroundColor = MaterialTheme.colors.secondary, + contentColor = MaterialTheme.colors.onSecondary + ), + modifier = Modifier.fillMaxWidth().then(modifier) + ) { + Text(text) + } + } + + val themeService: ThemeService by inject() + + @Composable + fun ToggleDarkModeButton() { + val systemInDarkTheme = isSystemInDarkTheme() + IconButton(onClick = { themeService.toggleDarkTheme(systemInDarkTheme) }) { + if (themeService.isDarkMode()) + Graphic(CchGraphics.LIGHT_MODE, "Enable light mode") + else + Graphic(CchGraphics.DARK_MODE, "Enable Dark Mode") + } + } +} diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/composables/ProfileCard.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/composables/ProfileCard.kt new file mode 100644 index 00000000..1f1416bd --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/composables/ProfileCard.kt @@ -0,0 +1,46 @@ +package org.chiachat.app.ui.composables + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.painter.BitmapPainter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.dp + +@Composable +internal fun ProfileCard(item: ProfileCardItem) { + Card( + shape = RoundedCornerShape(8.dp), + backgroundColor = MaterialTheme.colors.secondary, + modifier = + Modifier.padding(horizontal = 40.dp) + .padding(vertical = 10.dp) + .fillMaxWidth(0.75f) + .fillMaxHeight(0.1f), + ) { + Row( + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + if (item.image != null) { + Image( + painter = BitmapPainter(item.image), + contentDescription = "Sample", + modifier = Modifier.size(36.dp), + contentScale = ContentScale.Fit + ) + } else { + Text("Loading Image") + } + Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { Text(item.name) } + } + } +} + +data class ProfileCardItem(val name: String, val image: ImageBitmap?) diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/services/NavigationService.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/services/NavigationService.kt similarity index 90% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/services/NavigationService.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/services/NavigationService.kt index 8fcc2e2f..e3d4b3e9 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/services/NavigationService.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/services/NavigationService.kt @@ -1,13 +1,13 @@ -package org.chiachat.app.compose.services +package org.chiachat.app.ui.services import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf -import org.chiachat.app.compose.components.Component +import org.chiachat.app.ui.components.Component import org.koin.core.component.KoinComponent -class NavigationService(initialScreen: Component, val maxScreens: Int = 10) : KoinComponent { +internal class NavigationService(initialScreen: Component, val maxScreens: Int = 10) : KoinComponent { private val screenTree: MutableList = mutableListOf() private val currentScreenIndex: MutableState = mutableStateOf(0) diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/services/NavigationState.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/services/NavigationState.kt similarity index 66% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/services/NavigationState.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/services/NavigationState.kt index 062a4d71..1cb26729 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/services/NavigationState.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/services/NavigationState.kt @@ -1,3 +1,3 @@ -package org.chiachat.app.compose.services +package org.chiachat.app.ui.services data class NavigationState(val title: String? = null, val showHud: Boolean = false) diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/services/ResourceService.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/services/ResourceService.kt similarity index 66% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/services/ResourceService.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/services/ResourceService.kt index 7fd4aecf..ffb5e5b8 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/services/ResourceService.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/services/ResourceService.kt @@ -1,17 +1,17 @@ -package org.chiachat.app.compose.services +package org.chiachat.app.ui.services import androidx.compose.ui.graphics.ImageBitmap import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch -import org.chiachat.app.compose.theme.CchIcons -import org.chiachat.app.compose.util.readImageBitmap +import org.chiachat.app.ui.theme.CchGraphics +import org.chiachat.app.util.readImageBitmap class ResourceService(private val ioScope: CoroutineScope) { - private val iconCache = MutableStateFlow>(emptyMap()) + private val iconCache = MutableStateFlow>(emptyMap()) - fun loadIcon(icon: CchIcons, onLoad: (ImageBitmap) -> Unit) { + fun loadGraphic(icon: CchGraphics, onLoad: (ImageBitmap) -> Unit) { val cachedIcon = iconCache.value[icon] if (cachedIcon != null) { onLoad(cachedIcon) diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/services/ThemeService.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/services/ThemeService.kt new file mode 100644 index 00000000..8c1c650c --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/services/ThemeService.kt @@ -0,0 +1,26 @@ +package org.chiachat.app.ui.services + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import kotlinx.coroutines.flow.MutableStateFlow +import org.chiachat.app.util.MpSettings + +internal class ThemeService(settings: MpSettings) { + private val darkMode = MutableStateFlow(settings.darkMode) + + fun toggleDarkTheme(isSystemInDarkTheme: Boolean) { + val darkModeSetting = darkMode.value + if (darkModeSetting == null) { + darkMode.value = !isSystemInDarkTheme + } else + darkMode.value = !darkModeSetting + } + + @Composable + fun isDarkMode(): Boolean { + val isDarkMode by darkMode.collectAsState() + return isDarkMode ?: isSystemInDarkTheme() + } +} diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/CchGraphics.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/CchGraphics.kt new file mode 100644 index 00000000..809ac883 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/CchGraphics.kt @@ -0,0 +1,13 @@ +package org.chiachat.app.ui.theme + +import com.soywiz.korio.file.VfsFile +import com.soywiz.korio.file.std.resourcesVfs + +enum class CchGraphics(val file: VfsFile) { + DARK_MODE(resourcesVfs["assets/icons/material/dark_mode.png"]), + LIGHT_MODE(resourcesVfs["assets/icons/material/light_mode.png"]), + CHIACHAT_LOGO(resourcesVfs["assets/icons/chiachat/chiachat-logo.png"]), + CHIACHAT_ICON(resourcesVfs["assets/icons/chiachat/chiachat-icon.png"]), + NOTIFICATION_BELL(resourcesVfs["assets/icons/material/notification_bell.png"]), + MENU(resourcesVfs["assets/icons/material/menu.png"]), +} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Theme.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/ChiaChatTheme.kt similarity index 60% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Theme.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/ChiaChatTheme.kt index b2daed62..fc796148 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Theme.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/ChiaChatTheme.kt @@ -1,12 +1,16 @@ -package org.chiachat.app.compose.theme +package org.chiachat.app.ui.theme import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.lightColorScheme +import androidx.compose.material.MaterialTheme +import androidx.compose.material.darkColors +import androidx.compose.material.lightColors import androidx.compose.runtime.Composable +import org.chiachat.app.ui.services.ThemeService +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject -private val LightColors = +/* +private val LightColorsMaterial3 = lightColorScheme( primary = md_theme_light_primary, onPrimary = md_theme_light_onPrimary, @@ -37,7 +41,7 @@ private val LightColors = surfaceTint = md_theme_light_surfaceTint, ) -private val DarkColors = +private val DarkColorsMaterial3 = darkColorScheme( primary = md_theme_dark_primary, onPrimary = md_theme_dark_onPrimary, @@ -66,16 +70,51 @@ private val DarkColors = inverseSurface = md_theme_dark_inverseSurface, inversePrimary = md_theme_dark_inversePrimary, surfaceTint = md_theme_dark_surfaceTint, + )*/ + +private val LightColors = + lightColors( + primary = md_theme_light_tertiary, + onPrimary = md_theme_light_onTertiary, + primaryVariant = md_theme_light_tertiaryContainer, + secondary = md_theme_light_primary, + onSecondary = md_theme_light_onPrimary, + secondaryVariant = md_theme_light_primaryContainer, + error = md_theme_light_error, + onError = md_theme_light_onError, + background = md_theme_light_background, + onBackground = md_theme_light_onBackground, + surface = md_theme_light_surface, + onSurface = md_theme_light_onSurface, + ) + +private val DarkColors = + darkColors( + primary = md_theme_dark_tertiary, + onPrimary = md_theme_dark_onTertiary, + primaryVariant = md_theme_dark_tertiaryContainer, + secondary = md_theme_dark_primary, + onSecondary = md_theme_dark_onPrimary, + secondaryVariant = md_theme_dark_primaryContainer, + error = md_theme_dark_error, + onError = md_theme_dark_onError, + background = md_theme_dark_background, + onBackground = md_theme_dark_onBackground, + surface = md_theme_dark_surface, + onSurface = md_theme_dark_onSurface, ) -@Composable -fun AppTheme(useDarkTheme: Boolean = isSystemInDarkTheme(), content: @Composable() () -> Unit) { - val colors = - if (!useDarkTheme) { - LightColors - } else { - DarkColors - } +internal object ChiaChatTheme: KoinComponent { + val themeService: ThemeService by inject() + @Composable + internal fun AppTheme(content: @Composable() () -> Unit) { + val colors = + if (themeService.isDarkMode()) { + DarkColors + } else { + LightColors + } - MaterialTheme(colorScheme = colors, content = content) + MaterialTheme(colors = colors, content = content) + } } diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Color.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/Color.kt similarity index 98% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Color.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/Color.kt index 90ea9052..60932868 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Color.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/Color.kt @@ -1,4 +1,4 @@ -package org.chiachat.app.compose.theme +package org.chiachat.app.ui.theme import androidx.compose.ui.graphics.Color diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Shape.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/Shape.kt similarity index 80% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Shape.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/Shape.kt index d6c44052..d5b36d3e 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Shape.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/Shape.kt @@ -1,8 +1,8 @@ -package org.chiachat.app.compose.theme +package org.chiachat.app.ui.theme import androidx.compose.foundation.shape.CutCornerShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Shapes +import androidx.compose.material.Shapes import androidx.compose.ui.unit.dp val ChiaChatShapes = diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/ThemeResources.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/ThemeResources.kt similarity index 76% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/ThemeResources.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/ThemeResources.kt index 6d8aaf10..3f702d4a 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/ThemeResources.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/ThemeResources.kt @@ -1,4 +1,4 @@ -package org.chiachat.app.compose.theme +package org.chiachat.app.ui.theme import androidx.compose.ui.text.font.FontFamily diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Typography.kt b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/Typography.kt similarity index 98% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Typography.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/Typography.kt index 4e18dc4d..6fa74685 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/Typography.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/ui/theme/Typography.kt @@ -1,4 +1,4 @@ -package org.chiachat.app.compose.theme +package org.chiachat.app.ui.theme import androidx.compose.ui.text.font.FontWeight diff --git a/shared/src/commonMain/kotlin/org/chiachat/app/util/MpSettings.kt b/shared/src/commonMain/kotlin/org/chiachat/app/util/MpSettings.kt index 4ee374f7..b795e8d2 100644 --- a/shared/src/commonMain/kotlin/org/chiachat/app/util/MpSettings.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/util/MpSettings.kt @@ -4,21 +4,26 @@ import com.russhwolf.settings.Settings import org.chiachat.app.util.SettingKeys.REFRESH_TOKEN class MpSettings { - val settings: Settings = Settings() + val settings: Settings = Settings() - // var homeDir: VfsFile - // get() = applicationDataVfs[settings.getStringOrNull(HOME_DIR.name) ?: "."] - // set(value) = settings.putString(HOME_DIR.name, value.absolutePath) - var refreshToken: String - get() = settings.getString(REFRESH_TOKEN.name, "") - set(value) = settings.putString(REFRESH_TOKEN.name, value) + // var homeDir: VfsFile + // get() = applicationDataVfs[settings.getStringOrNull(HOME_DIR.name) ?: "."] + // set(value) = settings.putString(HOME_DIR.name, value.absolutePath) + var refreshToken: String + get() = settings.getString(REFRESH_TOKEN.name, "") + set(value) = settings.putString(REFRESH_TOKEN.name, value) - var darkMode: Boolean - get() = settings.getBoolean(SettingKeys.DARK_MODE.name, true) - set(value) = settings.putBoolean(REFRESH_TOKEN.name, value) + var darkMode: Boolean? + get() = settings.getBooleanOrNull(SettingKeys.DARK_MODE.name) + set(value) { + if (value == null) + settings.remove(SettingKeys.DARK_MODE.name) + else + settings.putBoolean(SettingKeys.DARK_MODE.name, value) + } } enum class SettingKeys { - REFRESH_TOKEN, - DARK_MODE, + REFRESH_TOKEN, + DARK_MODE, } diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/util/ResourceUtils.kt b/shared/src/commonMain/kotlin/org/chiachat/app/util/ResourceUtils.kt similarity index 79% rename from ui/src/commonMain/kotlin/org/chiachat/app/compose/util/ResourceUtils.kt rename to shared/src/commonMain/kotlin/org/chiachat/app/util/ResourceUtils.kt index ca1f447c..3f6c29fe 100644 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/util/ResourceUtils.kt +++ b/shared/src/commonMain/kotlin/org/chiachat/app/util/ResourceUtils.kt @@ -1,4 +1,4 @@ -package org.chiachat.app.compose.util +package org.chiachat.app.util import androidx.compose.ui.graphics.ImageBitmap import com.soywiz.korio.file.VfsFile diff --git a/ui/src/commonMain/resources/fonts/Chewy-Regular.ttf b/shared/src/commonMain/resources/assets/fonts/Chewy-Regular.ttf similarity index 100% rename from ui/src/commonMain/resources/fonts/Chewy-Regular.ttf rename to shared/src/commonMain/resources/assets/fonts/Chewy-Regular.ttf diff --git a/ui/src/commonMain/resources/fonts/OFL.txt b/shared/src/commonMain/resources/assets/fonts/OFL.txt similarity index 100% rename from ui/src/commonMain/resources/fonts/OFL.txt rename to shared/src/commonMain/resources/assets/fonts/OFL.txt diff --git a/ui/src/commonMain/resources/fonts/Oxygen-Bold.ttf b/shared/src/commonMain/resources/assets/fonts/Oxygen-Bold.ttf similarity index 100% rename from ui/src/commonMain/resources/fonts/Oxygen-Bold.ttf rename to shared/src/commonMain/resources/assets/fonts/Oxygen-Bold.ttf diff --git a/ui/src/commonMain/resources/fonts/Oxygen-Light.ttf b/shared/src/commonMain/resources/assets/fonts/Oxygen-Light.ttf similarity index 100% rename from ui/src/commonMain/resources/fonts/Oxygen-Light.ttf rename to shared/src/commonMain/resources/assets/fonts/Oxygen-Light.ttf diff --git a/ui/src/commonMain/resources/fonts/Oxygen-Regular.ttf b/shared/src/commonMain/resources/assets/fonts/Oxygen-Regular.ttf similarity index 100% rename from ui/src/commonMain/resources/fonts/Oxygen-Regular.ttf rename to shared/src/commonMain/resources/assets/fonts/Oxygen-Regular.ttf diff --git a/ui/src/commonMain/resources/icons/chiachat/chiachat-trans-256x256.png b/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-icon.png similarity index 100% rename from ui/src/commonMain/resources/icons/chiachat/chiachat-trans-256x256.png rename to shared/src/commonMain/resources/assets/icons/chiachat/chiachat-icon.png diff --git a/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-logo.png b/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-logo.png new file mode 100644 index 00000000..3f4eef7d Binary files /dev/null and b/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-logo.png differ diff --git a/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-trans-1024x1024.png b/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-trans-1024x1024.png new file mode 100644 index 00000000..27c8f188 Binary files /dev/null and b/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-trans-1024x1024.png differ diff --git a/ui/src/commonMain/resources/icons/chiachat/chiachat-trans-2048x2048.png b/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-trans-2048x2048.png similarity index 100% rename from ui/src/commonMain/resources/icons/chiachat/chiachat-trans-2048x2048.png rename to shared/src/commonMain/resources/assets/icons/chiachat/chiachat-trans-2048x2048.png diff --git a/ui/src/commonMain/resources/icons/chiachat/chiachat-trans-256x256.icns b/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-trans-256x256.icns similarity index 100% rename from ui/src/commonMain/resources/icons/chiachat/chiachat-trans-256x256.icns rename to shared/src/commonMain/resources/assets/icons/chiachat/chiachat-trans-256x256.icns diff --git a/ui/src/commonMain/resources/icons/chiachat/chiachat-trans-256x256.ico b/shared/src/commonMain/resources/assets/icons/chiachat/chiachat-trans-256x256.ico similarity index 100% rename from ui/src/commonMain/resources/icons/chiachat/chiachat-trans-256x256.ico rename to shared/src/commonMain/resources/assets/icons/chiachat/chiachat-trans-256x256.ico diff --git a/ui/src/commonMain/resources/icons/material/dark_mode.png b/shared/src/commonMain/resources/assets/icons/material/dark_mode.png similarity index 100% rename from ui/src/commonMain/resources/icons/material/dark_mode.png rename to shared/src/commonMain/resources/assets/icons/material/dark_mode.png diff --git a/shared/src/commonMain/resources/assets/icons/material/light_mode.png b/shared/src/commonMain/resources/assets/icons/material/light_mode.png new file mode 100644 index 00000000..c5375b7e Binary files /dev/null and b/shared/src/commonMain/resources/assets/icons/material/light_mode.png differ diff --git a/shared/src/commonMain/resources/assets/icons/material/menu.png b/shared/src/commonMain/resources/assets/icons/material/menu.png new file mode 100644 index 00000000..bd07174e Binary files /dev/null and b/shared/src/commonMain/resources/assets/icons/material/menu.png differ diff --git a/shared/src/commonMain/resources/assets/icons/material/notification_bell.png b/shared/src/commonMain/resources/assets/icons/material/notification_bell.png new file mode 100644 index 00000000..67e053a2 Binary files /dev/null and b/shared/src/commonMain/resources/assets/icons/material/notification_bell.png differ diff --git a/ui/src/commonMain/resources/previews/dazaipfp.png b/shared/src/commonMain/resources/assets/previews/dazaipfp.png similarity index 100% rename from ui/src/commonMain/resources/previews/dazaipfp.png rename to shared/src/commonMain/resources/assets/previews/dazaipfp.png diff --git a/shared/src/desktopMain/kotlin/org/chiachat/app/DesktopRoot.kt b/shared/src/desktopMain/kotlin/org/chiachat/app/DesktopRoot.kt new file mode 100644 index 00000000..8f9a4e10 --- /dev/null +++ b/shared/src/desktopMain/kotlin/org/chiachat/app/DesktopRoot.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. + * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. + */ + +import androidx.compose.runtime.Composable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import org.chiachat.app.SharedAppModules +import org.chiachat.app.ui.ComposeAppModules +import org.chiachat.app.ui.ComposeRoot +import org.koin.core.context.startKoin +import org.koin.core.qualifier.named +import org.koin.dsl.module + + +class DesktopRoot() { + private val root = ComposeRoot() + private val desktopModule = module { + factory(named("ioScope")) { + CoroutineScope(Dispatchers.IO) + } + factory(named("vmScope")) { + CoroutineScope(Dispatchers.Default) + } + } + + init { + startKoin { + val composeModules = ComposeAppModules() + val sharedModules = SharedAppModules() + modules(desktopModule + composeModules.all + sharedModules.all) + allowOverride(false) + } + } + + @Composable + fun View() { + root.View() + } + +} \ No newline at end of file diff --git a/shared/src/jvmMain/kotlin/org/chiachat/app/db/PlatformDb.kt b/shared/src/desktopMain/kotlin/org/chiachat/app/db/PlatformDb.kt similarity index 56% rename from shared/src/jvmMain/kotlin/org/chiachat/app/db/PlatformDb.kt rename to shared/src/desktopMain/kotlin/org/chiachat/app/db/PlatformDb.kt index bd9a2747..cb830f84 100644 --- a/shared/src/jvmMain/kotlin/org/chiachat/app/db/PlatformDb.kt +++ b/shared/src/desktopMain/kotlin/org/chiachat/app/db/PlatformDb.kt @@ -1,13 +1,13 @@ package org.chiachat.app.db -import app.cash.sqldelight.db.SqlDriver -import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver -import com.soywiz.korio.file.std.userHomeVfs +//import app.cash.sqldelight.db.SqlDriver +//import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver +//import com.soywiz.korio.file.std.userHomeVfs -actual class PlatformDb { +/*actual class PlatformDb { private val sqlitePath = userHomeVfs[".chiachat/chiachat.db"] actual suspend fun getDriver(): SqlDriver { sqlitePath.parent.mkdirs() return JdbcSqliteDriver("jdbc:sqlite:${sqlitePath.absolutePath}") } -} +}*/ diff --git a/shared/src/jvmMain/kotlin/org/chiachat/app/util/Platform.kt b/shared/src/desktopMain/kotlin/org/chiachat/app/util/Platform.kt similarity index 100% rename from shared/src/jvmMain/kotlin/org/chiachat/app/util/Platform.kt rename to shared/src/desktopMain/kotlin/org/chiachat/app/util/Platform.kt diff --git a/ui/src/jvmMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt b/shared/src/desktopMain/kotlin/org/chiachat/app/util/readImageBitmap.kt similarity index 90% rename from ui/src/jvmMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt rename to shared/src/desktopMain/kotlin/org/chiachat/app/util/readImageBitmap.kt index 37b36f84..efc02557 100644 --- a/ui/src/jvmMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt +++ b/shared/src/desktopMain/kotlin/org/chiachat/app/util/readImageBitmap.kt @@ -1,4 +1,4 @@ -package org.chiachat.app.compose.util +package org.chiachat.app.util import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.toComposeImageBitmap diff --git a/shared/src/iosMain/kotlin/main.ios.kt b/shared/src/iosMain/kotlin/main.ios.kt new file mode 100644 index 00000000..04f39b98 --- /dev/null +++ b/shared/src/iosMain/kotlin/main.ios.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. + * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. + */ + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Application +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import org.chiachat.app.SharedAppModules +import org.chiachat.app.ui.ComposeAppModules +import org.chiachat.app.ui.ComposeRoot +import org.chiachat.app.ui.services.ThemeService +import org.chiachat.app.ui.theme.ChiaChatTheme +import org.koin.core.context.startKoin +import org.koin.core.qualifier.named +import org.koin.dsl.module +import platform.UIKit.UIViewController + +internal val root = ComposeRoot() + + +internal val iosModule = module { + factory(named("ioScope")) { + CoroutineScope(Dispatchers.Default) + } + factory(named("vmScope")) { + CoroutineScope(Dispatchers.Default) + } +} + +fun MainViewController(): UIViewController { + startKoin { + val composeModules = ComposeAppModules() + val sharedModules = SharedAppModules() + modules(iosModule + composeModules.all + sharedModules.all) + allowOverride(false) + } + val controller: UIViewController = Application("ChiaChat") { + ChiaChatTheme.AppTheme { + Column(modifier = Modifier.background(MaterialTheme.colors.background)) { + Spacer(Modifier.height(30.dp)) + // To skip upper part of screen. + root.View() + } + } + } + return controller +} + diff --git a/shared/src/iosMain/kotlin/org/chiachat/app/db/PlatformDb.kt b/shared/src/iosMain/kotlin/org/chiachat/app/db/PlatformDb.kt index 16ac4582..b28b82c3 100644 --- a/shared/src/iosMain/kotlin/org/chiachat/app/db/PlatformDb.kt +++ b/shared/src/iosMain/kotlin/org/chiachat/app/db/PlatformDb.kt @@ -1,12 +1,12 @@ package org.chiachat.app.db -import app.cash.sqldelight.db.SqlDriver -import app.cash.sqldelight.driver.native.NativeSqliteDriver -import org.chiachat.app.ChiaChatDb +//import app.cash.sqldelight.db.SqlDriver +//import app.cash.sqldelight.driver.native.NativeSqliteDriver +//import org.chiachat.app.ChiaChatDb -actual class PlatformDb { +/*actual class PlatformDb { actual suspend fun getDriver(): SqlDriver { val driver: SqlDriver = NativeSqliteDriver(ChiaChatDb.Schema, "chiachat.db") return driver } -} +}*/ diff --git a/ui/src/jsMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt b/shared/src/iosMain/kotlin/org/chiachat/app/util/readImageBitmap.kt similarity index 89% rename from ui/src/jsMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt rename to shared/src/iosMain/kotlin/org/chiachat/app/util/readImageBitmap.kt index 7f048f78..4b241d11 100644 --- a/ui/src/jsMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt +++ b/shared/src/iosMain/kotlin/org/chiachat/app/util/readImageBitmap.kt @@ -1,4 +1,4 @@ -package org.chiachat.app.compose.util +package org.chiachat.app.util import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.toComposeImageBitmap diff --git a/shared/src/jsMain/kotlin/org/chiachat/app/WebRoot.kt b/shared/src/jsMain/kotlin/org/chiachat/app/WebRoot.kt new file mode 100644 index 00000000..db42f43f --- /dev/null +++ b/shared/src/jsMain/kotlin/org/chiachat/app/WebRoot.kt @@ -0,0 +1,40 @@ +package org.chiachat.app/* + * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. + * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. + */ + +import androidx.compose.runtime.Composable +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import org.chiachat.app.ui.ComposeAppModules +import org.chiachat.app.ui.ComposeRoot +import org.koin.core.context.startKoin +import org.koin.core.qualifier.named +import org.koin.dsl.module + + +class WebRoot() { + private val root = ComposeRoot() + private val desktopModule = module { + factory(named("ioScope")) { + CoroutineScope(Dispatchers.Default) + } + factory(named("vmScope")) { + CoroutineScope(Dispatchers.Default) + } + } + + init { + startKoin { + val composeModules = ComposeAppModules() + val sharedModules = SharedAppModules() + modules(desktopModule + composeModules.all + sharedModules.all) + allowOverride(false) + } + } + + @Composable + fun View() { + root.View() + } +} \ No newline at end of file diff --git a/shared/src/jsMain/kotlin/org/chiachat/app/db/PlatformDb.kt b/shared/src/jsMain/kotlin/org/chiachat/app/db/PlatformDb.kt index e13333a2..b9c1c3d7 100644 --- a/shared/src/jsMain/kotlin/org/chiachat/app/db/PlatformDb.kt +++ b/shared/src/jsMain/kotlin/org/chiachat/app/db/PlatformDb.kt @@ -1,12 +1,12 @@ package org.chiachat.app.db -import app.cash.sqldelight.db.SqlDriver -import app.cash.sqldelight.driver.sqljs.initSqlDriver -import kotlinx.coroutines.await -import org.chiachat.app.ChiaChatDb +//import app.cash.sqldelight.db.SqlDriver +//import app.cash.sqldelight.driver.sqljs.initSqlDriver +//import kotlinx.coroutines.await +//import org.chiachat.app.ChiaChatDb -actual class PlatformDb { - actual suspend fun getDriver(): SqlDriver { - return initSqlDriver(ChiaChatDb.Schema).await() - } -} +//actual class PlatformDb { +// actual suspend fun getDriver(): SqlDriver { +// return initSqlDriver(ChiaChatDb.Schema).await() +// } +//} diff --git a/ui/src/iosMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt b/shared/src/jsMain/kotlin/org/chiachat/app/util/readImageBitmap.kt similarity index 89% rename from ui/src/iosMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt rename to shared/src/jsMain/kotlin/org/chiachat/app/util/readImageBitmap.kt index 7f048f78..4b241d11 100644 --- a/ui/src/iosMain/kotlin/org/chiachat/app/compose/util/readImageBitmap.kt +++ b/shared/src/jsMain/kotlin/org/chiachat/app/util/readImageBitmap.kt @@ -1,4 +1,4 @@ -package org.chiachat.app.compose.util +package org.chiachat.app.util import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.toComposeImageBitmap diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts deleted file mode 100644 index 3ab31133..00000000 --- a/ui/build.gradle.kts +++ /dev/null @@ -1,96 +0,0 @@ -plugins { - kotlin("multiplatform") - id("org.jetbrains.compose") version Versions.composeMultiplatform - id("com.android.library") - id(Plugin.Id.kover) -} - -version = "1.0" - -kotlin { - jvm() - js(IR) { browser { commonWebpackConfig { cssSupport.enabled = true } } } - android() - iosArm64() - iosX64() - iosSimulatorArm64() - - sourceSets { - val commonMain by getting { - dependencies { - api(project(":shared")) - api(compose.ui) - api(compose.foundation) - api(compose.runtime) - @OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class) api(compose.material3) - } - } - val commonTest by getting { - dependencies { - implementation(kotlin("test")) - with(Deps.Test) { - implementation(koin) - implementation(coroutines) - } - } - } - val jvmMain by getting { - dependsOn(commonMain) - dependencies { api(compose.preview) } - } - val jvmTest by getting { dependencies { api(project(":shared")) } } - val jsMain by getting { dependsOn(commonMain) } - val jsTest by getting - val androidMain by getting { - dependencies { - implementation("androidx.appcompat:appcompat:1.5.1") - implementation("androidx.core:core-ktx:1.9.0") - implementation("androidx.compose.ui:ui-graphics:1.4.0-alpha01") - dependencies { api(compose.preview) } - } - } - val androidTest by getting - val iosX64Main by getting - val iosArm64Main by getting - val iosSimulatorArm64Main by getting - val iosMain by creating { - dependsOn(commonMain) - iosX64Main.dependsOn(this) - iosArm64Main.dependsOn(this) - iosSimulatorArm64Main.dependsOn(this) - } - val iosX64Test by getting - val iosArm64Test by getting - val iosSimulatorArm64Test by getting - val iosTest by creating { - dependsOn(commonTest) - iosX64Test.dependsOn(this) - iosArm64Test.dependsOn(this) - iosSimulatorArm64Test.dependsOn(this) - } - } -} - -android { - compileSdk = 33 - - defaultConfig { - minSdk = 26 - targetSdk = 33 - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - sourceSets { - named("main") { - manifest.srcFile("src/androidMain/AndroidManifest.xml") - res.srcDirs("src/androidMain/res") - assets.srcDirs("src/commonMain/resources") - } - } - namespace = "org.chiachat.app.ui" -} diff --git a/ui/src/androidMain/AndroidManifest.xml b/ui/src/androidMain/AndroidManifest.xml deleted file mode 100644 index 295582e4..00000000 --- a/ui/src/androidMain/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/ComposeAppModules.kt b/ui/src/commonMain/kotlin/org/chiachat/app/compose/ComposeAppModules.kt deleted file mode 100644 index 0d7009f4..00000000 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/ComposeAppModules.kt +++ /dev/null @@ -1,29 +0,0 @@ -package org.chiachat.app.compose - -import org.chiachat.app.compose.components.LandingComponent -import org.chiachat.app.compose.components.LandingViewModel -import org.chiachat.app.compose.components.LoginComponent -import org.chiachat.app.compose.components.LoginViewModel -import org.chiachat.app.compose.services.NavigationService -import org.chiachat.app.compose.services.ResourceService -import org.chiachat.app.compose.services.ThemeService -import org.koin.core.module.dsl.singleOf -import org.koin.core.qualifier.named -import org.koin.dsl.module - -class ComposeAppModules { - val components = module { - singleOf(::LandingViewModel) - singleOf(::LandingComponent) - singleOf(::LoginComponent) - singleOf(::LoginViewModel) - } - - val services = module { - single { NavigationService(get()) } - single { ResourceService(get(named("ioScope"))) } - singleOf(::ThemeService) - } - - val all = services + components -} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/Component.kt b/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/Component.kt deleted file mode 100644 index 75c41998..00000000 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/Component.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.chiachat.app.compose.components - -import androidx.compose.runtime.Composable - -interface Component { - val vm: IViewModel - @Composable fun View() -} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LandingComponent.kt b/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LandingComponent.kt deleted file mode 100644 index 7ef65a35..00000000 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LandingComponent.kt +++ /dev/null @@ -1,45 +0,0 @@ -package org.chiachat.app.compose.components - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material3.Button -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextField -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import org.chiachat.app.compose.composables.ProfileCard - -interface ILandingComponent : Component { - override val vm: ILandingViewModel -} - -class LandingComponent(override val vm: LandingViewModel) : ILandingComponent { - @Composable - override fun View() { - val dbVersion by vm.dbVersion.collectAsState() - val text by vm.textField.collectAsState() - val users by vm.users.collectAsState() - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(10.dp)) { - Spacer(modifier = Modifier.weight(1f)) - dbVersion?.let { - Text(text = "Db Version: $it", color = MaterialTheme.colorScheme.onBackground) - } - TextField(text, onValueChange = { vm.textField.value = it }) - Button(onClick = vm::addProfile) { Text("Add Profile") } - LazyColumn { items(items = users) { ProfileCard(it) } } - Spacer(modifier = Modifier.weight(1f)) - } - } -} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LandingViewModel.kt b/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LandingViewModel.kt deleted file mode 100644 index 62c3325c..00000000 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LandingViewModel.kt +++ /dev/null @@ -1,59 +0,0 @@ -package org.chiachat.app.compose.components - -import com.soywiz.korio.file.std.resourcesVfs -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.launch -import org.chiachat.app.compose.composables.ProfileCardItem -import org.chiachat.app.compose.util.readImageBitmap -import org.chiachat.app.db.DbService -import org.chiachat.app.user.UserProfile - -const val defaultPath = "previews/dazaipfp.png" - -interface ILandingViewModel : IViewModel { - val dbVersion: MutableStateFlow - val users: MutableStateFlow> - val textField: MutableStateFlow - - fun addProfile() { - ioScope.launch { - val image = resourcesVfs[defaultPath] - val name = textField.value - users.value += ProfileCardItem(name, image.readImageBitmap()) - insertProfile(UserProfile(name, image)) - } - } - fun setDbVersion() - fun refreshProfiles() - fun insertProfile(profile: UserProfile) -} - -class LandingViewModel(val dbService: DbService) : ViewModel(), ILandingViewModel { - override val dbVersion = MutableStateFlow(null) - override val users = MutableStateFlow(emptyList()) - override val textField = MutableStateFlow("") - - init { - ioScope.launch { - setDbVersion() - refreshProfiles() - } - } - - override fun setDbVersion() { - dbVersion.value = dbService.getVersion() - } - - override fun refreshProfiles() { - dbService.db.profileTableQueries.getProfiles().executeAsList().forEach { user -> - ioScope.launch { - val image = resourcesVfs[user.profile_image ?: defaultPath].readImageBitmap() - users.value += ProfileCardItem(user.name, image) - } - } - } - - override fun insertProfile(profile: UserProfile) { - dbService.db.profileTableQueries.addProfile(profile.username, profile.profileImage.path) - } -} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LoginComponent.kt b/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LoginComponent.kt deleted file mode 100644 index bfe4fc00..00000000 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/components/LoginComponent.kt +++ /dev/null @@ -1,33 +0,0 @@ -package org.chiachat.app.compose.components - -import androidx.compose.foundation.layout.* -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import org.chiachat.app.compose.composables.CchActionButton -import org.chiachat.app.compose.composables.CchTextField -import org.chiachat.app.compose.composables.ToggleDarkModeButton - -class LoginComponent : Component { - - override val vm: ILoginViewModel = LoginViewModel() - - @Composable - override fun View() { - - Box(modifier = Modifier.padding(40.dp).fillMaxSize()) { - ToggleDarkModeButton(vm.themeService, vm.resourceService, Modifier.align(Alignment.TopEnd)) - Column( - verticalArrangement = Arrangement.spacedBy(15.dp), - horizontalAlignment = Alignment.CenterHorizontally, - modifier = Modifier.align(Alignment.Center).padding(40.dp).width(320.dp) - ) { - CchTextField(vm.server, "server", "chiachat.org") - CchTextField(vm.username, "username", "@username") - CchTextField(vm.password, "password") - CchActionButton("Login", onClick = vm::onLogin) - } - } - } -} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/composables/Inputs.kt b/ui/src/commonMain/kotlin/org/chiachat/app/compose/composables/Inputs.kt deleted file mode 100644 index b05eca19..00000000 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/composables/Inputs.kt +++ /dev/null @@ -1,72 +0,0 @@ -package org.chiachat.app.compose.composables - -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.width -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.unit.dp -import kotlinx.coroutines.flow.MutableStateFlow -import org.chiachat.app.compose.services.ResourceService -import org.chiachat.app.compose.services.ThemeService -import org.chiachat.app.compose.theme.CchIcons - -@Composable -fun CchTextField( - textProperty: MutableStateFlow, - label: String? = null, - placeholder: String? = label, - modifier: Modifier = Modifier -) { - val text: String by textProperty.collectAsState() - OutlinedTextField( - value = text, - label = @Composable { label?.let { Text(it) } }, - placeholder = @Composable { placeholder?.let { Text(it) } }, - onValueChange = { newText: String -> textProperty.value = newText }, - modifier = Modifier.fillMaxWidth().then(modifier) - ) -} - -@Composable -fun CchActionButton(text: String, onClick: () -> Unit, modifier: Modifier = Modifier) { - OutlinedButton( - onClick, - colors = - ButtonDefaults.outlinedButtonColors( - containerColor = MaterialTheme.colorScheme.tertiary, - contentColor = MaterialTheme.colorScheme.onTertiary - ), - modifier = Modifier.fillMaxWidth().then(modifier) - ) { - Text(text) - } -} - -@Composable -fun ToggleDarkModeButton( - themeService: ThemeService, - resourceService: ResourceService, - modifier: Modifier = Modifier -) { - var darkIcon by remember { mutableStateOf(null) } - var lightIcon by remember { mutableStateOf(null) } - val isDarkMode by themeService.darkMode.collectAsState() - - LaunchedEffect(true) { - resourceService.loadIcon(CchIcons.DARK_MODE) { - darkIcon = it - } - resourceService.loadIcon(CchIcons.LIGHT_MODE) { - lightIcon = it - } - } - - IconButton(onClick = themeService::toggleDarkTheme, modifier = modifier) { - val icon = if (isDarkMode) lightIcon else darkIcon - icon?.let { - Icon(bitmap = it, contentDescription = "Toggle Light/Dark Mode", tint = MaterialTheme.colorScheme.tertiary) - } - } -} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/composables/ProfileCard.kt b/ui/src/commonMain/kotlin/org/chiachat/app/compose/composables/ProfileCard.kt deleted file mode 100644 index 9ffb1148..00000000 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/composables/ProfileCard.kt +++ /dev/null @@ -1,48 +0,0 @@ -@file:OptIn(ExperimentalMaterial3Api::class) - -package org.chiachat.app.compose.composables - -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.graphics.painter.BitmapPainter -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.unit.dp - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun ProfileCard(item: ProfileCardItem) { - Card( - shape = RoundedCornerShape(8.dp), - colors = - CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.tertiaryContainer), - modifier = - Modifier.padding(horizontal = 40.dp) - .padding(vertical = 10.dp) - .fillMaxWidth(0.75f) - .fillMaxHeight(0.1f), - ) { - Row( - horizontalArrangement = Arrangement.Start, - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth()) { - if (item.image != null) { - Image( - painter = BitmapPainter(item.image), - contentDescription = "Sample", - modifier = Modifier.size(36.dp), - contentScale = ContentScale.Fit) - } else { - Text("Loading Image") - } - Column(verticalArrangement = Arrangement.spacedBy(10.dp)) { Text(item.name) } - } - } -} - -data class ProfileCardItem(val name: String, val image: ImageBitmap?) diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/services/ThemeService.kt b/ui/src/commonMain/kotlin/org/chiachat/app/compose/services/ThemeService.kt deleted file mode 100644 index 65c47b9d..00000000 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/services/ThemeService.kt +++ /dev/null @@ -1,12 +0,0 @@ -package org.chiachat.app.compose.services - -import kotlinx.coroutines.flow.MutableStateFlow -import org.chiachat.app.util.MpSettings - -class ThemeService(settings: MpSettings) { - val darkMode = MutableStateFlow(settings.darkMode) - - fun toggleDarkTheme() { - darkMode.value = !darkMode.value - } -} diff --git a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/CchIcons.kt b/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/CchIcons.kt deleted file mode 100644 index eead750b..00000000 --- a/ui/src/commonMain/kotlin/org/chiachat/app/compose/theme/CchIcons.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.chiachat.app.compose.theme - -import com.soywiz.korio.file.VfsFile -import com.soywiz.korio.file.std.resourcesVfs - -enum class CchIcons(val file: VfsFile) { - DARK_MODE(resourcesVfs["icons/material/dark_mode.png"]), - LIGHT_MODE(resourcesVfs["icons/material/light_mode.png"]) -} diff --git a/ui/src/commonMain/resources/icons/material/dark_mode.svg b/ui/src/commonMain/resources/icons/material/dark_mode.svg deleted file mode 100644 index 7495f4bf..00000000 --- a/ui/src/commonMain/resources/icons/material/dark_mode.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/commonMain/resources/icons/material/dark_mode.xml b/ui/src/commonMain/resources/icons/material/dark_mode.xml deleted file mode 100644 index 9d06526d..00000000 --- a/ui/src/commonMain/resources/icons/material/dark_mode.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/ui/src/commonMain/resources/icons/material/light_mode.svg b/ui/src/commonMain/resources/icons/material/light_mode.svg deleted file mode 100644 index c2b4ab33..00000000 --- a/ui/src/commonMain/resources/icons/material/light_mode.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/src/commonMain/resources/icons/material/light_mode.xml b/ui/src/commonMain/resources/icons/material/light_mode.xml deleted file mode 100644 index 78bfdd88..00000000 --- a/ui/src/commonMain/resources/icons/material/light_mode.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/webApp/build.gradle.kts b/webApp/build.gradle.kts index 9f4394be..7f0af7e1 100644 --- a/webApp/build.gradle.kts +++ b/webApp/build.gradle.kts @@ -1,35 +1,36 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - kotlin("multiplatform") - id("org.jetbrains.compose") version Versions.composeMultiplatform + kotlin("multiplatform") + id("org.jetbrains.compose") version Versions.composeMultiplatform } val resPath = "src/commonMain/resources" kotlin { - js(IR) { - browser() - binaries.executable() - } + js(IR) { + browser() + binaries.executable() + } - sourceSets { - val jsMain by getting { - dependencies { - implementation(project(":ui")) - implementation(compose.web.core) - implementation(kotlin("stdlib-js")) - implementation(devNpm("copy-webpack-plugin", "11.0.0")) - implementation(npm("sql.js", "1.6.2")) - } - this.resources.setSrcDirs( - listOf( - project(":shared").file(resPath), - project(":ui").file(resPath), - project.file("src/jsMain/resources"))) + sourceSets { + val jsMain by getting { + dependencies { + implementation(project(":shared")) + implementation(compose.web.core) + implementation(kotlin("stdlib-js")) + implementation(devNpm("copy-webpack-plugin", "11.0.0")) + implementation(npm("sql.js", "1.6.2")) + } + this.resources.setSrcDirs( + listOf( + project(":shared").file(resPath), + project.file("src/jsMain/resources") + ) + ) + } + val jsTest by getting } - val jsTest by getting - } } compose.experimental { web.application {} } @@ -37,15 +38,15 @@ compose.experimental { web.application {} } // a temporary workaround for a bug in jsRun invocation - see // https://youtrack.jetbrains.com/issue/KT-48273 afterEvaluate { - rootProject.extensions.configure< - org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension> { - versions.webpackDevServer.version = "4.0.0" - versions.webpackCli.version = "4.10.0" - nodeVersion = "16.0.0" - } + rootProject.extensions.configure< + org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension> { + versions.webpackDevServer.version = "4.0.0" + versions.webpackCli.version = "4.10.0" + nodeVersion = "16.0.0" + } } // TODO: remove when https://youtrack.jetbrains.com/issue/KT-50778 fixed project.tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile::class.java).configureEach { - kotlinOptions.freeCompilerArgs += listOf("-Xir-dce-runtime-diagnostic=log") + kotlinOptions.freeCompilerArgs += listOf("-Xir-dce-runtime-diagnostic=log") } diff --git a/webApp/src/jsMain/kotlin/org/chiachat/app/web/CanvasDebugApp.kt b/webApp/src/jsMain/kotlin/org/chiachat/app/web/CanvasDebugApp.kt index f7b8ac89..983e664c 100644 --- a/webApp/src/jsMain/kotlin/org/chiachat/app/web/CanvasDebugApp.kt +++ b/webApp/src/jsMain/kotlin/org/chiachat/app/web/CanvasDebugApp.kt @@ -2,7 +2,7 @@ package org.chiachat.app.web import androidx.compose.foundation.background import androidx.compose.foundation.layout.* -import androidx.compose.material3.Text +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue diff --git a/webApp/src/jsMain/kotlin/org/chiachat/app/web/WebApp.kt b/webApp/src/jsMain/kotlin/org/chiachat/app/web/WebApp.kt deleted file mode 100644 index 406615f6..00000000 --- a/webApp/src/jsMain/kotlin/org/chiachat/app/web/WebApp.kt +++ /dev/null @@ -1,37 +0,0 @@ -package org.chiachat.app.web - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import org.chiachat.app.SharedAppModules -import org.chiachat.app.compose.ComposeAppModules -import org.chiachat.app.compose.ComposeRoot -import org.chiachat.app.db.PlatformDb -import org.koin.core.context.startKoin - -class WebApp { - - val composeRoot = mutableStateOf(null) - - init { - CoroutineScope(Dispatchers.Default).launch { - val driver = PlatformDb().getDriver() - - val webModules = WebModules() - val composeModules = ComposeAppModules() - val sharedModules = SharedAppModules(driver) - - startKoin { - modules(webModules.all + composeModules.all + sharedModules.all) - allowOverride(false) - } - composeRoot.value = ComposeRoot() - } - } - @Composable - fun View() { - composeRoot.value?.View() - } -} diff --git a/webApp/src/jsMain/kotlin/org/chiachat/app/web/WebMain.kt b/webApp/src/jsMain/kotlin/org/chiachat/app/web/WebMain.kt index 944ee3b4..e23dc6a5 100644 --- a/webApp/src/jsMain/kotlin/org/chiachat/app/web/WebMain.kt +++ b/webApp/src/jsMain/kotlin/org/chiachat/app/web/WebMain.kt @@ -1,11 +1,13 @@ package org.chiachat.app.web import BrowserViewportWindow +import org.chiachat.app.WebRoot import org.jetbrains.skiko.wasm.onWasmReady + fun main() { onWasmReady { - val app = WebApp() + val app = WebRoot() BrowserViewportWindow("ChiaChat") { app.View() } } } diff --git a/webApp/webpack.config.d/fs.js b/webpack.config.d/fs.js similarity index 100% rename from webApp/webpack.config.d/fs.js rename to webpack.config.d/fs.js diff --git a/webApp/webpack.config.d/wasm.js b/webpack.config.d/plugins.js similarity index 100% rename from webApp/webpack.config.d/wasm.js rename to webpack.config.d/plugins.js