diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 87c7b7a..ca8558b 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -1,8 +1,8 @@ object Dependencies { object Kotlin { - const val version = "1.4.10" + const val version = "1.4.20" const val core = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${version}" - const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9" + const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9-native-mt" const val coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9" } @@ -33,7 +33,7 @@ object Dependencies { } object Ktor { - private const val version = "1.4.1" + private const val version = "1.4.2" const val ktorCore = "io.ktor:ktor-client-core:$version" const val ktorOkhttp = "io.ktor:ktor-client-okhttp:$version" const val ktorIos = "io.ktor:ktor-client-ios:$version" diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 80fc278..f8b41f6 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -2,12 +2,15 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget plugins { kotlin("multiplatform") + kotlin("native.cocoapods") kotlin("plugin.serialization") id("com.android.library") id("kotlin-android-extensions") id("com.squareup.sqldelight") } +version = "1.0" + repositories { gradlePluginPortal() google() @@ -24,27 +27,28 @@ kotlin { val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator" if (sdkName.startsWith("iphoneos")) { - iosArm64("ios") { - binaries { - framework { - baseName = "Shared" - } - } - } + iosArm64("ios") } else { - iosX64("ios") { - binaries { - framework { - baseName = "Shared" - } - } - } + iosX64("ios") + } + + cocoapods { + summary = "Shared module for Circolapp" + homepage = "Link to a Kotlin/Native module homepage" + + frameworkName = "Shared" + + pod ("HTMLKit", "~> 3.1.0") } sourceSets { val commonMain by getting { dependencies { - implementation(Dependencies.Kotlin.coroutinesCore) + implementation(Dependencies.Kotlin.coroutinesCore) { + version { + strictly("1.3.9-native-mt") + } + } // Ktor implementation(Dependencies.Ktor.ktorCore) diff --git a/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/CircularDao.kt b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/CircularDao.kt index 4ab6fa7..97c6450 100644 --- a/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/CircularDao.kt +++ b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/CircularDao.kt @@ -8,6 +8,7 @@ import net.underdesk.circolapp.shared.utils.SqlUtils.joinToString import net.underdesk.circolapp.shared.utils.SqlUtils.toBoolean import net.underdesk.circolapp.shared.utils.SqlUtils.toList import net.underdesk.circolapp.shared.utils.SqlUtils.toLong +import net.underdesk.circolapp.shared.utils.wrap class CircularDao( database: AppDatabase @@ -66,22 +67,28 @@ class CircularDao( fun getFlowCirculars(school: Int) = appDatabaseQueries.getCirculars(school.toLong(), circularMapper).asFlow().mapToList() + fun getCFlowCirculars(school: Int) = getFlowCirculars(school).wrap() fun searchCirculars(query: String, school: Int) = appDatabaseQueries.searchCirculars(school.toLong(), query, circularMapper).asFlow() .mapToList() + fun searchCircularsC(query: String, school: Int) = searchCirculars(query, school).wrap() fun getFavourites(school: Int) = appDatabaseQueries.getFavourites(school.toLong(), circularMapper).asFlow().mapToList() + fun getFavouritesC(school: Int) = getFavourites(school).wrap() fun searchFavourites(query: String, school: Int) = appDatabaseQueries.searchFavourites(school.toLong(), query, circularMapper).asFlow() .mapToList() + fun searchFavouritesC(query: String, school: Int) = searchFavourites(query, school).wrap() fun getReminders(school: Int) = appDatabaseQueries.getReminders(school.toLong(), circularMapper).asFlow().mapToList() + fun getRemindersC(school: Int) = getReminders(school).wrap() fun searchReminders(query: String, school: Int) = appDatabaseQueries.searchReminders(school.toLong(), query, circularMapper).asFlow() .mapToList() + fun searchRemindersC(query: String, school: Int) = searchReminders(query, school).wrap() } diff --git a/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/DatabaseFactory.kt b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/DatabaseFactory.kt new file mode 100644 index 0000000..fa1be62 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/DatabaseFactory.kt @@ -0,0 +1,7 @@ +package net.underdesk.circolapp.shared.data + +import com.squareup.sqldelight.db.SqlDriver + +object DatabaseFactory { + fun createDatabase(sqlDriver: SqlDriver) = AppDatabase(sqlDriver) +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/utils/FlowUtils.kt b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/utils/FlowUtils.kt new file mode 100644 index 0000000..1b2e83c --- /dev/null +++ b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/utils/FlowUtils.kt @@ -0,0 +1,27 @@ +package net.underdesk.circolapp.shared.utils + +import io.ktor.utils.io.core.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach + +fun Flow.wrap(): CFlow = CFlow(this) + +class CFlow(private val origin: Flow) : Flow by origin { + fun watch(block: (T) -> Unit): Closeable { + val job = Job() + + onEach { + block(it) + }.launchIn(CoroutineScope(Dispatchers.Main + job)) + + return object : Closeable { + override fun close() { + job.cancel() + } + } + } +} \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/net/underdesk/circolapp/shared/server/curie/SpecificCurieServer.kt b/shared/src/iosMain/kotlin/net/underdesk/circolapp/shared/server/curie/SpecificCurieServer.kt index abd2175..6d95a96 100644 --- a/shared/src/iosMain/kotlin/net/underdesk/circolapp/shared/server/curie/SpecificCurieServer.kt +++ b/shared/src/iosMain/kotlin/net/underdesk/circolapp/shared/server/curie/SpecificCurieServer.kt @@ -1,9 +1,25 @@ package net.underdesk.circolapp.shared.server.curie +import cocoapods.HTMLKit.HTMLElement +import cocoapods.HTMLKit.HTMLParser import net.underdesk.circolapp.shared.data.Circular -actual class SpecificCurieServer actual constructor(val curieServer: CurieServer) { +actual class SpecificCurieServer actual constructor(private val curieServer: CurieServer) { actual fun parseHtml(string: String): List { - TODO("Not yet implemented") + val document = HTMLParser(string).parseDocument() + val htmlList = document.querySelector("ul")?.querySelectorAll("a") as List? + + val list = ArrayList() + + htmlList?.forEach { element -> + if (element.parentElement?.parentElement?.parentElement?.tagName == "li") { + list.last().attachmentsNames.add(element.textContent) + list.last().attachmentsUrls.add(element.attributes.objectForKey("href").toString()) + } else { + list.add(curieServer.generateFromString(element.textContent, element.attributes.objectForKey("href").toString())) + } + } + + return list } } diff --git a/shared/src/iosMain/kotlin/net/underdesk/circolapp/shared/server/porporato/SpecificPorporatoServer.kt b/shared/src/iosMain/kotlin/net/underdesk/circolapp/shared/server/porporato/SpecificPorporatoServer.kt index 3a0d198..7347f10 100644 --- a/shared/src/iosMain/kotlin/net/underdesk/circolapp/shared/server/porporato/SpecificPorporatoServer.kt +++ b/shared/src/iosMain/kotlin/net/underdesk/circolapp/shared/server/porporato/SpecificPorporatoServer.kt @@ -1,9 +1,31 @@ package net.underdesk.circolapp.shared.server.porporato +import cocoapods.HTMLKit.HTMLElement +import cocoapods.HTMLKit.HTMLParser import net.underdesk.circolapp.shared.data.Circular -actual class SpecificPorporatoServer actual constructor(porporatoServer: PorporatoServer) { +actual class SpecificPorporatoServer actual constructor(private val porporatoServer: PorporatoServer) { actual fun parseHtml(string: String): List { - TODO("Not yet implemented") + val document = HTMLParser(string).parseDocument() + val table = document.querySelectorAll("table") as List? + val td = table?.get(2)?.querySelectorAll("td") as List? + val htmlList = td?.get(2)?.querySelectorAll("a") as List? + + val list = ArrayList() + + if (htmlList == null) + return list + + for (i in htmlList.indices) { + list.add( + porporatoServer.generateFromString( + htmlList[i].textContent, + htmlList[i].attributes.objectForKey("href").toString(), + i.toLong() + ) + ) + } + + return list } }