feat(crash-report): add crash report module

This commit is contained in:
Diego Beraldin 2023-09-06 08:21:38 +02:00
parent 39a80161e1
commit 62ba4f1967
29 changed files with 594 additions and 17 deletions

6
.gitignore vendored
View File

@ -7,4 +7,8 @@ captures
.externalNativeBuild
.cxx
local.properties
xcuserdata
xcuserdata
google-services.json
GoogleService-Info.plist

View File

@ -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)
}

View File

@ -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()
}
}
}

View File

@ -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) {

View File

@ -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
}
}

View File

@ -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)
}
)
}
}
}
}
}

View File

@ -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))
}
}
}
}

View 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
}
}

View 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

View 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

View File

@ -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)
}
}

View File

@ -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)
}
}

View File

@ -0,0 +1,7 @@
package com.github.diegoberaldin.raccoonforlemmy.core.crashreport
interface CrashReportManager {
fun setup()
fun log(message: String)
fun recordException(exc: Throwable)
}

View File

@ -0,0 +1,5 @@
package com.github.diegoberaldin.raccoonforlemmy.core.crashreport.di
import org.koin.core.module.Module
expect val crashReportModule: Module

View File

@ -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
}
}

View File

@ -0,0 +1,5 @@
package com.github.diegoberaldin.raccoonforlemmy.core.crashreport.di
import org.koin.dsl.module
actual val crashReportModule = module { }

View File

@ -0,0 +1,5 @@
package com.github.diegoberaldin.racconforlemmy.core.utils
object AppInfo {
var versionCode = ""
}

View File

@ -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,10 +58,12 @@ 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" }
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" }
moko_resources = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko.resources" }
gms = { id = "com.google.gms.google-services", version.ref = "gms.gradle" }

View File

@ -4,4 +4,7 @@ target 'iosApp' do
use_frameworks!
platform :ios, '14.1'
pod 'shared', :path => '../shared'
pod 'FirebaseAuth'
pod 'FirebaseFirestore'
end

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -21,21 +21,22 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
rootProject.name = "Raccoon_for_Lemmy"
include(":androidApp")
include(":shared")
include(":feature-home")
include(":feature-inbox")
include(":feature-search")
include(":feature-profile")
include(":feature-settings")
include(":resources")
include(":core-utils")
include(":core-appearance")
include(":core-preferences")
include(":resources")
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(":core-md")
include(":core-commonui")
include(":core-notifications")
include(":feature-home")
include(":feature-inbox")
include(":feature-search")
include(":feature-profile")
include(":feature-settings")

View File

@ -60,6 +60,7 @@ kotlin {
implementation(projects.corePreferences)
implementation(projects.coreApi)
implementation(projects.coreNotifications)
implementation(projects.coreCrashreport)
implementation(projects.domainIdentity)
api(projects.resources)

View File

@ -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,

View File

@ -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,