mirror of
https://github.com/LiveFastEatTrashRaccoon/RaccoonForLemmy.git
synced 2025-02-03 00:47:36 +01:00
feat(crash-report): add crash report module
This commit is contained in:
parent
39a80161e1
commit
62ba4f1967
4
.gitignore
vendored
4
.gitignore
vendored
@ -8,3 +8,7 @@ captures
|
||||
.cxx
|
||||
local.properties
|
||||
xcuserdata
|
||||
|
||||
google-services.json
|
||||
GoogleService-Info.plist
|
||||
|
||||
|
@ -2,6 +2,8 @@ plugins {
|
||||
alias(libs.plugins.android.application)
|
||||
alias(libs.plugins.kotlin.android)
|
||||
alias(libs.plugins.compose)
|
||||
alias(libs.plugins.gms)
|
||||
alias(libs.plugins.crashlytics)
|
||||
}
|
||||
|
||||
android {
|
||||
@ -48,4 +50,5 @@ dependencies {
|
||||
implementation(libs.koin.android)
|
||||
|
||||
implementation(projects.shared)
|
||||
implementation(projects.coreCrashreport)
|
||||
}
|
||||
|
@ -1,7 +1,9 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.android
|
||||
|
||||
import android.app.Application
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.crashreport.CrashReportManager
|
||||
import com.github.diegoberaldin.raccoonforlemmy.sharedHelperModule
|
||||
import org.koin.android.ext.android.inject
|
||||
import org.koin.android.ext.koin.androidContext
|
||||
import org.koin.android.ext.koin.androidLogger
|
||||
import org.koin.core.context.startKoin
|
||||
@ -16,6 +18,9 @@ class MainApplication : Application() {
|
||||
modules(
|
||||
sharedHelperModule,
|
||||
)
|
||||
|
||||
val crashManager: CrashReportManager by inject()
|
||||
crashManager.setup()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,8 @@ plugins {
|
||||
alias(libs.plugins.ksp).apply(false)
|
||||
alias(libs.plugins.ktorfit).apply(false)
|
||||
alias(libs.plugins.kotlinx.serialization).apply(false)
|
||||
alias(libs.plugins.crashlytics).apply(false)
|
||||
alias(libs.plugins.gms).apply(false)
|
||||
}
|
||||
|
||||
tasks.register("clean", Delete::class) {
|
||||
|
@ -0,0 +1,25 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.core.commonui.createpost
|
||||
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel
|
||||
|
||||
interface CreatePostMviModel :
|
||||
MviModel<CreatePostMviModel.Intent, CreatePostMviModel.UiState, CreatePostMviModel.Effect> {
|
||||
|
||||
sealed interface Intent {
|
||||
data class SetTitle(val value: String) : Intent
|
||||
data class SetText(val value: String) : Intent
|
||||
|
||||
object Send : Intent
|
||||
}
|
||||
|
||||
data class UiState(
|
||||
val title: String = "",
|
||||
val body: String = "",
|
||||
)
|
||||
|
||||
sealed interface Effect {
|
||||
object Success : Effect
|
||||
|
||||
data class Failure(val message: String?) : Effect
|
||||
}
|
||||
}
|
@ -0,0 +1,168 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.core.commonui.createpost
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.heightIn
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.foundation.text.KeyboardActions
|
||||
import androidx.compose.foundation.text.KeyboardOptions
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Send
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.SnackbarHost
|
||||
import androidx.compose.material3.SnackbarHostState
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TextField
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.focus.FocusRequester
|
||||
import androidx.compose.ui.focus.focusRequester
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.compose.ui.text.input.KeyboardType
|
||||
import androidx.compose.ui.unit.dp
|
||||
import cafe.adriel.voyager.core.model.rememberScreenModel
|
||||
import cafe.adriel.voyager.core.screen.Screen
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.bindToLifecycle
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getCreatePostViewModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
|
||||
import dev.icerock.moko.resources.compose.stringResource
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
|
||||
class CreatePostScreen(
|
||||
private val communityId: Int,
|
||||
private val onPostCreated: () -> Unit = {},
|
||||
) : Screen {
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
override fun Content() {
|
||||
val model = rememberScreenModel { getCreatePostViewModel(communityId) }
|
||||
model.bindToLifecycle(key)
|
||||
val uiState by model.uiState.collectAsState()
|
||||
val snackbarHostState = remember { SnackbarHostState() }
|
||||
val genericError = stringResource(MR.strings.message_generic_error)
|
||||
|
||||
LaunchedEffect(model) {
|
||||
model.effects.onEach {
|
||||
when (it) {
|
||||
is CreatePostMviModel.Effect.Failure -> {
|
||||
snackbarHostState.showSnackbar(it.message ?: genericError)
|
||||
}
|
||||
|
||||
CreatePostMviModel.Effect.Success -> onPostCreated()
|
||||
}
|
||||
}.launchIn(this)
|
||||
}
|
||||
|
||||
Scaffold(
|
||||
topBar = {
|
||||
Column(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
verticalArrangement = Arrangement.spacedBy(Spacing.s),
|
||||
horizontalAlignment = Alignment.CenterHorizontally
|
||||
) {
|
||||
Box(
|
||||
modifier = Modifier.width(60.dp)
|
||||
.height(1.dp)
|
||||
.background(
|
||||
color = MaterialTheme.colorScheme.onSurface,
|
||||
shape = RoundedCornerShape(1.dp),
|
||||
),
|
||||
)
|
||||
Text(
|
||||
text = stringResource(MR.strings.create_post_title),
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
color = MaterialTheme.colorScheme.onBackground,
|
||||
)
|
||||
}
|
||||
},
|
||||
snackbarHost = {
|
||||
SnackbarHost(snackbarHostState)
|
||||
}
|
||||
) { padding ->
|
||||
Column(
|
||||
modifier = Modifier.padding(padding)
|
||||
) {
|
||||
val bodyFocusRequester = remember { FocusRequester() }
|
||||
TextField(
|
||||
modifier = Modifier.fillMaxWidth().heightIn(max = 300.dp),
|
||||
label = {
|
||||
Text(text = stringResource(MR.strings.create_post_name))
|
||||
},
|
||||
textStyle = MaterialTheme.typography.titleMedium,
|
||||
value = uiState.title,
|
||||
keyboardOptions = KeyboardOptions(
|
||||
keyboardType = KeyboardType.Ascii,
|
||||
autoCorrect = false,
|
||||
imeAction = ImeAction.Next,
|
||||
),
|
||||
keyboardActions = KeyboardActions(
|
||||
onNext = {
|
||||
bodyFocusRequester.requestFocus()
|
||||
}
|
||||
),
|
||||
onValueChange = { value ->
|
||||
model.reduce(CreatePostMviModel.Intent.SetTitle(value))
|
||||
},
|
||||
)
|
||||
|
||||
TextField(
|
||||
modifier = Modifier.height(500.dp)
|
||||
.fillMaxWidth()
|
||||
.focusRequester(bodyFocusRequester),
|
||||
label = {
|
||||
Text(text = stringResource(MR.strings.create_post_body))
|
||||
},
|
||||
textStyle = MaterialTheme.typography.bodyMedium,
|
||||
value = uiState.body,
|
||||
keyboardOptions = KeyboardOptions(
|
||||
keyboardType = KeyboardType.Ascii,
|
||||
autoCorrect = false,
|
||||
imeAction = ImeAction.Send,
|
||||
),
|
||||
keyboardActions = KeyboardActions(
|
||||
onSend = {
|
||||
model.reduce(CreatePostMviModel.Intent.Send)
|
||||
}
|
||||
),
|
||||
onValueChange = { value ->
|
||||
model.reduce(CreatePostMviModel.Intent.SetText(value))
|
||||
},
|
||||
)
|
||||
|
||||
Row {
|
||||
Spacer(modifier = Modifier.weight(1f))
|
||||
IconButton(
|
||||
content = {
|
||||
Icon(
|
||||
imageVector = Icons.Default.Send,
|
||||
contentDescription = null,
|
||||
)
|
||||
},
|
||||
onClick = {
|
||||
model.reduce(CreatePostMviModel.Intent.Send)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.core.commonui.createpost
|
||||
|
||||
import cafe.adriel.voyager.core.model.ScreenModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.DefaultMviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PostsRepository
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.IO
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class CreatePostViewModel(
|
||||
private val communityId: Int,
|
||||
private val mvi: DefaultMviModel<CreatePostMviModel.Intent, CreatePostMviModel.UiState, CreatePostMviModel.Effect> = DefaultMviModel(
|
||||
CreatePostMviModel.UiState()
|
||||
),
|
||||
private val identityRepository: IdentityRepository,
|
||||
private val postsRepository: PostsRepository,
|
||||
) : ScreenModel,
|
||||
MviModel<CreatePostMviModel.Intent, CreatePostMviModel.UiState, CreatePostMviModel.Effect> by mvi {
|
||||
|
||||
override fun reduce(intent: CreatePostMviModel.Intent) {
|
||||
when (intent) {
|
||||
is CreatePostMviModel.Intent.SetTitle -> {
|
||||
mvi.updateState {
|
||||
it.copy(title = intent.value)
|
||||
}
|
||||
}
|
||||
|
||||
is CreatePostMviModel.Intent.SetText -> {
|
||||
mvi.updateState {
|
||||
it.copy(body = intent.value)
|
||||
}
|
||||
}
|
||||
|
||||
CreatePostMviModel.Intent.Send -> submit()
|
||||
}
|
||||
}
|
||||
|
||||
private fun submit() {
|
||||
mvi.scope.launch(Dispatchers.IO) {
|
||||
try {
|
||||
val auth = identityRepository.authToken.value.orEmpty()
|
||||
val title = uiState.value.title
|
||||
val body = uiState.value.body
|
||||
postsRepository.create(
|
||||
communityId = communityId,
|
||||
title = title,
|
||||
body = body,
|
||||
auth = auth,
|
||||
)
|
||||
mvi.emitEffect(CreatePostMviModel.Effect.Success)
|
||||
} catch (e: Throwable) {
|
||||
val message = e.message
|
||||
mvi.emitEffect(CreatePostMviModel.Effect.Failure(message))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
57
core-crashreport/build.gradle.kts
Normal file
57
core-crashreport/build.gradle.kts
Normal file
@ -0,0 +1,57 @@
|
||||
plugins {
|
||||
alias(libs.plugins.kotlin.multiplatform)
|
||||
alias(libs.plugins.android.library)
|
||||
alias(libs.plugins.native.cocoapods)
|
||||
}
|
||||
|
||||
@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class)
|
||||
kotlin {
|
||||
targetHierarchy.default()
|
||||
|
||||
android {
|
||||
compilations.all {
|
||||
kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
}
|
||||
}
|
||||
iosX64()
|
||||
iosArm64()
|
||||
iosSimulatorArm64()
|
||||
|
||||
cocoapods {
|
||||
summary = "Some description for the Shared Module"
|
||||
homepage = "Link to the Shared Module homepage"
|
||||
version = "1.0"
|
||||
ios.deploymentTarget = "14.1"
|
||||
framework {
|
||||
baseName = "core-crashreport"
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
val androidMain by getting {
|
||||
dependencies {
|
||||
implementation(libs.firebase.crashlytics)
|
||||
}
|
||||
}
|
||||
val commonMain by getting {
|
||||
dependencies {
|
||||
implementation(libs.koin.core)
|
||||
}
|
||||
}
|
||||
val commonTest by getting {
|
||||
dependencies {
|
||||
implementation(kotlin("test"))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.github.diegoberaldin.raccoonforlemmy.core.crashreport"
|
||||
compileSdk = 33
|
||||
defaultConfig {
|
||||
minSdk = 26
|
||||
}
|
||||
}
|
42
core-crashreport/core-crashreport.podspec
Normal file
42
core-crashreport/core-crashreport.podspec
Normal file
@ -0,0 +1,42 @@
|
||||
Pod::Spec.new do |spec|
|
||||
spec.name = 'core-crashreport'
|
||||
spec.version = '1.0'
|
||||
spec.homepage = 'Link to the Shared Module homepage'
|
||||
spec.source = { :git => "Not Published", :tag => "Cocoapods/#{spec.name}/#{spec.version}" }
|
||||
spec.authors = ''
|
||||
spec.license = ''
|
||||
spec.summary = 'Some description for the Shared Module'
|
||||
|
||||
spec.vendored_frameworks = "build/cocoapods/framework/core-crashreport.framework"
|
||||
spec.libraries = "c++"
|
||||
spec.module_name = "#{spec.name}_umbrella"
|
||||
|
||||
spec.ios.deployment_target = '14.1'
|
||||
|
||||
|
||||
|
||||
spec.pod_target_xcconfig = {
|
||||
'KOTLIN_PROJECT_PATH' => ':core-crashreport',
|
||||
'PRODUCT_MODULE_NAME' => 'core-crashreport',
|
||||
}
|
||||
|
||||
spec.script_phases = [
|
||||
{
|
||||
:name => 'Build core-crashreport',
|
||||
: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\""
|
||||
exit 0
|
||||
fi
|
||||
set -ev
|
||||
REPO_ROOT="$PODS_TARGET_SRCROOT"
|
||||
"$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \
|
||||
-Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \
|
||||
-Pkotlin.native.cocoapods.archs="$ARCHS" \
|
||||
-Pkotlin.native.cocoapods.configuration=$CONFIGURATION
|
||||
SCRIPT
|
||||
}
|
||||
]
|
||||
end
|
39
core-crashreport/core_crashreport.podspec
Normal file
39
core-crashreport/core_crashreport.podspec
Normal file
@ -0,0 +1,39 @@
|
||||
Pod::Spec.new do |spec|
|
||||
spec.name = 'core_crashreport'
|
||||
spec.version = '1.0'
|
||||
spec.homepage = 'Link to the Shared Module homepage'
|
||||
spec.source = { :http=> ''}
|
||||
spec.authors = ''
|
||||
spec.license = ''
|
||||
spec.summary = 'Some description for the Shared Module'
|
||||
spec.vendored_frameworks = 'build/cocoapods/framework/core-crashreport.framework'
|
||||
spec.libraries = 'c++'
|
||||
spec.ios.deployment_target = '14.1'
|
||||
|
||||
|
||||
spec.pod_target_xcconfig = {
|
||||
'KOTLIN_PROJECT_PATH' => ':core-crashreport',
|
||||
'PRODUCT_MODULE_NAME' => 'core-crashreport',
|
||||
}
|
||||
|
||||
spec.script_phases = [
|
||||
{
|
||||
:name => 'Build core_crashreport',
|
||||
:execution_position => :before_compile,
|
||||
:shell_path => '/bin/sh',
|
||||
:script => <<-SCRIPT
|
||||
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
|
||||
REPO_ROOT="$PODS_TARGET_SRCROOT"
|
||||
"$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \
|
||||
-Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \
|
||||
-Pkotlin.native.cocoapods.archs="$ARCHS" \
|
||||
-Pkotlin.native.cocoapods.configuration="$CONFIGURATION"
|
||||
SCRIPT
|
||||
}
|
||||
]
|
||||
|
||||
end
|
@ -0,0 +1,21 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.core.crashreport
|
||||
|
||||
import android.content.Context
|
||||
import com.google.firebase.FirebaseApp
|
||||
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
||||
|
||||
class DefaultCrashReportManager(
|
||||
private val context: Context,
|
||||
) : CrashReportManager {
|
||||
override fun setup() {
|
||||
FirebaseApp.initializeApp(context)
|
||||
}
|
||||
|
||||
override fun log(message: String) {
|
||||
FirebaseCrashlytics.getInstance().log(message)
|
||||
}
|
||||
|
||||
override fun recordException(exc: Throwable) {
|
||||
FirebaseCrashlytics.getInstance().recordException(exc)
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.core.crashreport.di
|
||||
|
||||
import android.content.Context
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.crashreport.CrashReportManager
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.crashreport.DefaultCrashReportManager
|
||||
import org.koin.dsl.module
|
||||
|
||||
actual val crashReportModule = module {
|
||||
single<CrashReportManager> {
|
||||
val context: Context by inject()
|
||||
DefaultCrashReportManager(context)
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.core.crashreport
|
||||
|
||||
interface CrashReportManager {
|
||||
fun setup()
|
||||
fun log(message: String)
|
||||
fun recordException(exc: Throwable)
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.core.crashreport.di
|
||||
|
||||
import org.koin.core.module.Module
|
||||
|
||||
expect val crashReportModule: Module
|
@ -0,0 +1,15 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.core.crashreport
|
||||
|
||||
actual class DefaultCrashReportManager : CrashReportManager {
|
||||
override fun setup() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
override fun log(message: String) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
override fun recordException(exc: Throwable) {
|
||||
// TODO
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.github.diegoberaldin.raccoonforlemmy.core.crashreport.di
|
||||
|
||||
import org.koin.dsl.module
|
||||
|
||||
actual val crashReportModule = module { }
|
@ -0,0 +1,5 @@
|
||||
package com.github.diegoberaldin.racconforlemmy.core.utils
|
||||
|
||||
object AppInfo {
|
||||
var versionCode = ""
|
||||
}
|
@ -3,6 +3,9 @@ androidx_activity_compose = "1.7.2"
|
||||
androidx_crypto = "1.0.0"
|
||||
android_gradle = "7.4.2"
|
||||
compose = "1.4.3"
|
||||
crashlytics = "18.4.1"
|
||||
crashlytics_gradle = "2.9.9"
|
||||
gms_gradle = "4.3.15"
|
||||
kamel = "0.7.1"
|
||||
koin = "3.2.0"
|
||||
kotlin = "1.8.20"
|
||||
@ -20,6 +23,8 @@ voyager = "1.0.0-rc05"
|
||||
androidx_activity_compose = { module = "androidx.activity:activity-compose", version.ref = "androidx.activity.compose" }
|
||||
androidx_security_crypto = { module = "androidx.security:security-crypto", version.ref = "androidx.crypto" }
|
||||
|
||||
firebase_crashlytics = { module = "com.google.firebase:firebase-crashlytics", version.ref = "crashlytics" }
|
||||
|
||||
kamel = { module = "media.kamel:kamel-image", version.ref = "kamel" }
|
||||
markdown = { module = "org.jetbrains:markdown", version.ref = "markdown" }
|
||||
multiplatform_settings = { module = "com.russhwolf:multiplatform-settings", version.ref = "multiplatform.settings" }
|
||||
@ -53,6 +58,7 @@ voyager_androidx = { module = "cafe.adriel.voyager:voyager-koin", version.ref =
|
||||
android_application = { id = "com.android.application", version.ref = "android.gradle" }
|
||||
android_library = { id = "com.android.library", version.ref = "android.gradle" }
|
||||
compose = { id = "org.jetbrains.compose", version = "1.4.1" }
|
||||
crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "crashlytics.gradle" }
|
||||
kotlin_android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
|
||||
kotlin_multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
|
||||
kotlinx_serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
|
||||
@ -60,3 +66,4 @@ ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
|
||||
ktorfit = { id = "de.jensklingenberg.ktorfit", version.ref = "ktorfit.gradle" }
|
||||
native_cocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" }
|
||||
moko_resources = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko.resources" }
|
||||
gms = { id = "com.google.gms.google-services", version.ref = "gms.gradle" }
|
@ -4,4 +4,7 @@ target 'iosApp' do
|
||||
use_frameworks!
|
||||
platform :ios, '14.1'
|
||||
pod 'shared', :path => '../shared'
|
||||
|
||||
pod 'FirebaseAuth'
|
||||
pod 'FirebaseFirestore'
|
||||
end
|
@ -1,2 +1,16 @@
|
||||
${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh
|
||||
${PODS_ROOT}/../../shared/build/cocoapods/framework/shared.framework
|
||||
${BUILT_PRODUCTS_DIR}/BoringSSL-GRPC/openssl_grpc.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseAppCheckInterop/FirebaseAppCheckInterop.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseFirestore/FirebaseFirestore.framework
|
||||
${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework
|
||||
${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
|
||||
${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
|
||||
${BUILT_PRODUCTS_DIR}/RecaptchaInterop/RecaptchaInterop.framework
|
||||
${BUILT_PRODUCTS_DIR}/abseil/absl.framework
|
||||
${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework
|
||||
${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework
|
||||
${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework
|
||||
${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
|
@ -1 +1,15 @@
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl_grpc.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAppCheckInterop.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseFirestore.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RecaptchaInterop.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/absl.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
|
@ -1,2 +1,16 @@
|
||||
${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh
|
||||
${PODS_ROOT}/../../shared/build/cocoapods/framework/shared.framework
|
||||
${BUILT_PRODUCTS_DIR}/BoringSSL-GRPC/openssl_grpc.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseAppCheckInterop/FirebaseAppCheckInterop.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework
|
||||
${BUILT_PRODUCTS_DIR}/FirebaseFirestore/FirebaseFirestore.framework
|
||||
${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework
|
||||
${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework
|
||||
${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework
|
||||
${BUILT_PRODUCTS_DIR}/RecaptchaInterop/RecaptchaInterop.framework
|
||||
${BUILT_PRODUCTS_DIR}/abseil/absl.framework
|
||||
${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework
|
||||
${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework
|
||||
${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework
|
||||
${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework
|
@ -1 +1,15 @@
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl_grpc.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAppCheckInterop.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreInternal.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseFirestore.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RecaptchaInterop.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/absl.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework
|
||||
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework
|
@ -176,10 +176,38 @@ code_sign_if_enabled() {
|
||||
}
|
||||
|
||||
if [[ "$CONFIGURATION" == "Debug" ]]; then
|
||||
install_framework "${PODS_ROOT}/../../shared/build/cocoapods/framework/shared.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/BoringSSL-GRPC/openssl_grpc.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseAppCheckInterop/FirebaseAppCheckInterop.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseFirestore/FirebaseFirestore.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/RecaptchaInterop/RecaptchaInterop.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/abseil/absl.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
|
||||
fi
|
||||
if [[ "$CONFIGURATION" == "Release" ]]; then
|
||||
install_framework "${PODS_ROOT}/../../shared/build/cocoapods/framework/shared.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/BoringSSL-GRPC/openssl_grpc.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseAppCheckInterop/FirebaseAppCheckInterop.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseCoreInternal/FirebaseCoreInternal.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/FirebaseFirestore/FirebaseFirestore.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/RecaptchaInterop/RecaptchaInterop.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/abseil/absl.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework"
|
||||
install_framework "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework"
|
||||
fi
|
||||
if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
|
||||
wait
|
||||
|
@ -1,4 +1,5 @@
|
||||
import SwiftUI
|
||||
import Firebase
|
||||
|
||||
@main
|
||||
struct iOSApp: App {
|
||||
@ -6,6 +7,7 @@ struct iOSApp: App {
|
||||
init() {
|
||||
// DiHelperKt.initKoin()
|
||||
DiHelperKt.doInitKoin()
|
||||
FirebaseApp.configure()
|
||||
}
|
||||
|
||||
var body: some Scene {
|
||||
|
@ -21,21 +21,22 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
||||
rootProject.name = "Raccoon_for_Lemmy"
|
||||
include(":androidApp")
|
||||
include(":shared")
|
||||
include(":resources")
|
||||
include(":core-utils")
|
||||
include(":core-appearance")
|
||||
include(":core-preferences")
|
||||
include(":core-architecture")
|
||||
include(":core-api")
|
||||
include(":core-md")
|
||||
include(":core-commonui")
|
||||
include(":core-notifications")
|
||||
include(":core-crashreport")
|
||||
include(":domain-lemmy")
|
||||
include(":domain-lemmy:repository")
|
||||
include(":domain-lemmy:data")
|
||||
include(":domain-identity")
|
||||
include(":feature-home")
|
||||
include(":feature-inbox")
|
||||
include(":feature-search")
|
||||
include(":feature-profile")
|
||||
include(":feature-settings")
|
||||
include(":core-utils")
|
||||
include(":core-appearance")
|
||||
include(":core-preferences")
|
||||
include(":resources")
|
||||
include(":core-architecture")
|
||||
include(":core-api")
|
||||
include(":domain-lemmy")
|
||||
include(":domain-lemmy:repository")
|
||||
include(":domain-lemmy:data")
|
||||
include(":domain-identity")
|
||||
include(":core-md")
|
||||
include(":core-commonui")
|
||||
include(":core-notifications")
|
||||
|
@ -60,6 +60,7 @@ kotlin {
|
||||
implementation(projects.corePreferences)
|
||||
implementation(projects.coreApi)
|
||||
implementation(projects.coreNotifications)
|
||||
implementation(projects.coreCrashreport)
|
||||
implementation(projects.domainIdentity)
|
||||
|
||||
api(projects.resources)
|
||||
|
@ -3,6 +3,7 @@ package com.github.diegoberaldin.raccoonforlemmy
|
||||
import com.github.diegoberaldin.racconforlemmy.core.utils.hapticFeedbackModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.api.di.coreApiModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.di.coreAppearanceModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.crashreport.di.crashReportModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.coreNotificationModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.preferences.di.corePreferencesModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.di.coreIdentityModule
|
||||
@ -21,6 +22,7 @@ val sharedHelperModule = module {
|
||||
coreApiModule,
|
||||
coreIdentityModule,
|
||||
coreNotificationModule,
|
||||
crashReportModule,
|
||||
hapticFeedbackModule,
|
||||
localizationModule,
|
||||
homeTabModule,
|
||||
|
@ -3,6 +3,7 @@ package com.github.diegoberaldin.raccoonforlemmy
|
||||
import com.github.diegoberaldin.racconforlemmy.core.utils.hapticFeedbackModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.api.di.coreApiModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.di.coreAppearanceModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.crashreport.di.crashReportModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.coreNotificationModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.core.preferences.di.corePreferencesModule
|
||||
import com.github.diegoberaldin.raccoonforlemmy.domain.identity.di.coreIdentityModule
|
||||
@ -22,6 +23,7 @@ fun initKoin() {
|
||||
coreApiModule,
|
||||
coreIdentityModule,
|
||||
coreNotificationModule,
|
||||
crashReportModule,
|
||||
hapticFeedbackModule,
|
||||
localizationModule,
|
||||
homeTabModule,
|
||||
|
Loading…
x
Reference in New Issue
Block a user