diff --git a/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageMviModel.kt b/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageMviModel.kt index 9f6c023f6..aef7452e9 100644 --- a/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageMviModel.kt +++ b/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageMviModel.kt @@ -14,5 +14,7 @@ interface ZoomableImageMviModel : val autoLoadImages: Boolean = true, ) - sealed interface Effect + sealed interface Effect { + data object ShareSuccess : Effect + } } \ No newline at end of file diff --git a/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageScreen.kt b/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageScreen.kt index 7a933d4bc..8a6daf086 100644 --- a/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageScreen.kt +++ b/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageScreen.kt @@ -14,8 +14,11 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.TopAppBar 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 @@ -31,6 +34,10 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.Zoomabl import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getNavigationCoordinator import com.github.diegoberaldin.raccoonforlemmy.core.commonui.di.getZoomableImageViewModel import com.github.diegoberaldin.raccoonforlemmy.core.utils.onClick +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 ZoomableImageScreen( private val url: String, @@ -42,7 +49,18 @@ class ZoomableImageScreen( val model = rememberScreenModel { getZoomableImageViewModel() } model.bindToLifecycle(key) val uiState by model.uiState.collectAsState() + val snackbarHostState = remember { SnackbarHostState() } + val successMessage = stringResource(MR.strings.message_operation_successful) val navigator = remember { getNavigationCoordinator().getRootNavigator() } + LaunchedEffect(model) { + model.effects.onEach { + when (it) { + ZoomableImageMviModel.Effect.ShareSuccess -> { + snackbarHostState.showSnackbar(successMessage) + } + } + }.launchIn(this) + } Scaffold( topBar = { @@ -79,6 +97,9 @@ class ZoomableImageScreen( } ) }, + snackbarHost = { + SnackbarHost(snackbarHostState) + }, content = { paddingValues -> Box( modifier = Modifier diff --git a/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageViewModel.kt b/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageViewModel.kt index 00b664a46..7d2a7b057 100644 --- a/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageViewModel.kt +++ b/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/image/ZoomableImageViewModel.kt @@ -34,7 +34,9 @@ class ZoomableImageViewModel( override fun reduce(intent: ZoomableImageMviModel.Intent) { when (intent) { is ZoomableImageMviModel.Intent.Share -> { - shareHelper.share(intent.url, "image/*") + runCatching { + shareHelper.share(intent.url, "image/*") + } } is ZoomableImageMviModel.Intent.SaveToGallery -> downloadAndSave(intent.url) @@ -51,6 +53,7 @@ class ZoomableImageViewModel( s.substring(idx).takeIf { it.isNotEmpty() } ?: ".jpeg" } galleryHelper.saveToGallery(bytes, "${DateTime.epochMillis()}.$extension") + mvi.emitEffect(ZoomableImageMviModel.Effect.ShareSuccess) } catch (e: Throwable) { e.printStackTrace() } finally {