@@ -4,10 +4,12 @@ import androidx.compose.foundation.layout.Box
44import androidx.compose.foundation.layout.Column
55import androidx.compose.foundation.layout.fillMaxSize
66import androidx.compose.runtime.Composable
7+ import androidx.compose.runtime.LaunchedEffect
78import androidx.compose.runtime.collectAsState
89import androidx.compose.runtime.getValue
910import androidx.compose.ui.Alignment
1011import androidx.compose.ui.Modifier
12+ import com.composegears.tiamat.compose.TiamatPreview
1113import com.composegears.tiamat.compose.back
1214import com.composegears.tiamat.compose.navArgs
1315import com.composegears.tiamat.compose.navController
@@ -18,30 +20,34 @@ import io.github.composegears.valkyrie.jewel.BackAction
1820import io.github.composegears.valkyrie.jewel.SettingsAction
1921import io.github.composegears.valkyrie.jewel.Title
2022import io.github.composegears.valkyrie.jewel.Toolbar
23+ import io.github.composegears.valkyrie.jewel.banner.BannerMessage.ErrorBanner
2124import io.github.composegears.valkyrie.jewel.banner.BannerMessage.SuccessBanner
2225import io.github.composegears.valkyrie.jewel.banner.rememberBannerManager
2326import io.github.composegears.valkyrie.jewel.editor.SyntaxLanguage
2427import io.github.composegears.valkyrie.jewel.platform.copyInClipboard
28+ import io.github.composegears.valkyrie.jewel.platform.picker.SaveResult
29+ import io.github.composegears.valkyrie.jewel.platform.picker.rememberFileSaver
2530import io.github.composegears.valkyrie.jewel.tooling.ProjectPreviewTheme
2631import io.github.composegears.valkyrie.jewel.ui.placeholder.ErrorPlaceholder
2732import io.github.composegears.valkyrie.jewel.ui.placeholder.LoadingPlaceholder
2833import io.github.composegears.valkyrie.sdk.compose.foundation.layout.WeightSpacer
2934import io.github.composegears.valkyrie.ui.domain.model.PreviewType
3035import io.github.composegears.valkyrie.ui.foundation.conversion.GenericConversionScreen
31- import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.model.IconContent
32- import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.model.IconSource
3336import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.model.SimpleConversionAction
3437import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.model.SimpleConversionAction.OnCopyInClipboard
38+ import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.model.SimpleConversionAction.OnExport
3539import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.model.SimpleConversionAction.OnIconNameChange
40+ import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.model.SimpleConversionEvent
3641import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.model.SimpleConversionState
3742import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.model.SimpleConversionState.ConversionState
3843import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.ui.action.EditActionContent
3944import io.github.composegears.valkyrie.ui.screen.mode.simple.conversion.ui.action.PreviewActionContent
4045import io.github.composegears.valkyrie.ui.screen.settings.SettingsScreen
41- import io.github.composegears.valkyrie.util.IR_STUB
4246import io.github.composegears.valkyrie.util.ValkyrieBundle.message
4347import io.github.composegears.valkyrie.util.stringResource
4448import java.nio.file.Path
49+ import kotlinx.coroutines.flow.launchIn
50+ import kotlinx.coroutines.flow.onEach
4551import org.jetbrains.compose.ui.tooling.preview.Preview
4652
4753sealed interface SimpleConversionParamsSource {
@@ -60,9 +66,39 @@ val SimpleConversionScreen by navDestination<SimpleConversionParamsSource> {
6066 params = params,
6167 )
6268 }
69+
70+ val fileSaver = rememberFileSaver(
71+ title = stringResource(" simple.export.dialog.title" ),
72+ description = stringResource(" simple.export.dialog.description" ),
73+ )
74+
6375 val state by viewModel.state.collectAsState()
6476 val settings by viewModel.inMemorySettings.settings.collectAsState()
6577
78+ LaunchedEffect (Unit ) {
79+ viewModel.events
80+ .onEach {
81+ when (it) {
82+ is SimpleConversionEvent .ExportKtFile -> {
83+ when (val result = fileSaver.save(it.fileName, it.content)) {
84+ is SaveResult .Success -> bannerManager.show(
85+ message = SuccessBanner (text = message(" general.export.success" )),
86+ )
87+ is SaveResult .Error -> bannerManager.show(
88+ message = ErrorBanner (text = message(" general.export.error" , result.message)),
89+ )
90+ is SaveResult .Cancelled -> Unit
91+ }
92+ }
93+ is SimpleConversionEvent .CopyInClipboard -> {
94+ copyInClipboard(it.text)
95+ bannerManager.show(message = SuccessBanner (text = message(" general.action.text.copy.clipboard" )))
96+ }
97+ }
98+ }
99+ .launchIn(this )
100+ }
101+
66102 when (val state = state) {
67103 is ConversionState -> {
68104 SimpleConversionContent (
@@ -72,15 +108,7 @@ val SimpleConversionScreen by navDestination<SimpleConversionParamsSource> {
72108 openSettings = {
73109 navController.navigate(SettingsScreen )
74110 },
75- onAction = {
76- when (it) {
77- is OnCopyInClipboard -> {
78- copyInClipboard(it.text)
79- bannerManager.show(message = SuccessBanner (text = message(" general.action.text.copy.clipboard" )))
80- }
81- is OnIconNameChange -> viewModel.changeIconName(it.name)
82- }
83- },
111+ onAction = viewModel::onAction,
84112 )
85113 }
86114 is SimpleConversionState .Error -> {
@@ -131,6 +159,7 @@ private fun SimpleConversionContent(
131159 language = SyntaxLanguage .KOTLIN ,
132160 onBack = onBack,
133161 onIconNameChange = { onAction(OnIconNameChange (it)) },
162+ onExport = { onAction(OnExport (it)) },
134163 onCopyCode = { onAction(OnCopyInClipboard (it)) },
135164 onOpenSettings = openSettings,
136165 editPanel = { name, onNameChange ->
@@ -151,41 +180,18 @@ private fun SimpleConversionContent(
151180@Preview
152181@Composable
153182private fun SimpleConversionPreviewUiPreview () = ProjectPreviewTheme {
154- SimpleConversionContent (
155- state = ConversionState (
156- iconSource = IconSource .StringBasedIcon (" " ),
157- iconContent = IconContent (
158- name = " IconName" ,
159- irImageVector = IR_STUB ,
160- code = """
161- import androidx.compose.ui.graphics.vector.ImageVector
162- import androidx.compose.ui.unit.dp
163-
164- val WithoutPath: ImageVector
165- get() {
166- if (_WithoutPath != null) {
167- return _WithoutPath!!
168- }
169- _WithoutPath = ImageVector.Builder(
170- name = "WithoutPath",
171- defaultWidth = 24.dp,
172- defaultHeight = 24.dp,
173- viewportWidth = 18f,
174- viewportHeight = 18f
175- ).build()
176-
177- return _WithoutPath!!
178- }
179-
180- @Suppress("ObjectPropertyName")
181- private var _WithoutPath: ImageVector? = null
182-
183- """ .trimIndent(),
184- ),
183+ TiamatPreview (
184+ destination = SimpleConversionScreen ,
185+ navArgs = SimpleConversionParamsSource .TextSource (
186+ name = " IconName" ,
187+ text = """
188+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
189+ android:width="24dp"
190+ android:height="24dp"
191+ android:viewportWidth="18"
192+ android:viewportHeight="18">
193+ </vector>
194+ """ .trimIndent(),
185195 ),
186- previewType = PreviewType .Auto ,
187- onBack = {},
188- openSettings = {},
189- onAction = {},
190196 )
191197}
0 commit comments