diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt index db014a19b..a1d4dc107 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt @@ -7,9 +7,14 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringResource +import androidx.core.net.toUri import androidx.lifecycle.compose.collectAsStateWithLifecycle import io.legado.app.R +import io.legado.app.data.repository.ReadPreferences +import io.legado.app.data.repository.ReadSettingsRepository +import io.legado.app.help.config.ReadBookConfig import io.legado.app.ui.book.read.sheet.BgTextConfigSheet import io.legado.app.ui.book.read.sheet.ChangeChapterSourceSheet import io.legado.app.ui.book.read.sheet.CharsetConfigSheet @@ -18,7 +23,7 @@ import io.legado.app.ui.book.read.sheet.ContentEditSheet import io.legado.app.ui.book.read.sheet.DictSheet import io.legado.app.ui.book.read.sheet.DownloadSheet import io.legado.app.ui.book.read.sheet.EffectiveReplacesSheet -import io.legado.app.ui.book.read.sheet.FontSelectSheet +import io.legado.app.ui.widget.components.FontSelectSheet import io.legado.app.ui.book.read.sheet.HighlightRuleConfigSheet import io.legado.app.ui.book.read.sheet.HttpTtsEditSheet import io.legado.app.ui.book.read.sheet.MoreConfigSheet @@ -59,70 +64,60 @@ fun ReadBookScreen( } // Dialogs driven by activeDialog state - when (val dialog = state.activeDialog) { - is ReadBookDialog.ConfirmRestoreProgress -> { - AppAlertDialog( - show = true, - onDismissRequest = { onIntent(ReadBookIntent.DismissDialog) }, - title = stringResource(R.string.restore_progress), - text = stringResource(R.string.found_cloud_progress), - confirmText = stringResource(R.string.ok), - onConfirm = { - onIntent(ReadBookIntent.SureNewProgress(dialog.progress)) - onIntent(ReadBookIntent.DismissDialog) - }, - dismissText = stringResource(R.string.cancel), - onDismiss = { onIntent(ReadBookIntent.DismissDialog) }, - ) - } + val restoreDialog = state.activeDialog as? ReadBookDialog.ConfirmRestoreProgress + val syncDialog = state.activeDialog as? ReadBookDialog.SureSyncProgress + val skipDialog = state.activeDialog as? ReadBookDialog.ConfirmSkipToChapter + val payDialog = state.activeDialog as? ReadBookDialog.ConfirmChapterPay - is ReadBookDialog.SureSyncProgress -> { - AppAlertDialog( - show = true, - onDismissRequest = { onIntent(ReadBookIntent.DismissDialog) }, - title = stringResource(R.string.sync_progress), - text = stringResource(R.string.progress_exceeds_cloud), - confirmText = stringResource(R.string.ok), - onConfirm = { - onIntent(ReadBookIntent.SureSyncProgress(dialog.progress)) - onIntent(ReadBookIntent.DismissDialog) - }, - dismissText = stringResource(R.string.cancel), - onDismiss = { onIntent(ReadBookIntent.DismissDialog) }, - ) - } - - is ReadBookDialog.ConfirmSkipToChapter -> { - AppAlertDialog( - show = true, - onDismissRequest = { onIntent(ReadBookIntent.DismissDialog) }, - title = stringResource(R.string.chapter_list), - text = stringResource(R.string.confirm_skip_to_chapter), - confirmText = stringResource(R.string.ok), - onConfirm = { onIntent(ReadBookIntent.DismissDialog) }, - dismissText = stringResource(R.string.cancel), - onDismiss = { onIntent(ReadBookIntent.DismissDialog) }, - ) - } - - is ReadBookDialog.ConfirmChapterPay -> { - AppAlertDialog( - show = true, - onDismissRequest = { onIntent(ReadBookIntent.DismissDialog) }, - title = stringResource(R.string.chapter_pay), - text = dialog.chapterTitle, - confirmText = stringResource(R.string.ok), - onConfirm = { - onIntent(ReadBookIntent.DismissDialog) - onIntent(ReadBookIntent.ConfirmPayAction) - }, - dismissText = stringResource(R.string.cancel), - onDismiss = { onIntent(ReadBookIntent.DismissDialog) }, - ) - } - - null -> {} - } + AppAlertDialog( + show = restoreDialog != null, + onDismissRequest = { onIntent(ReadBookIntent.DismissDialog) }, + title = stringResource(R.string.restore_progress), + text = stringResource(R.string.found_cloud_progress), + confirmText = stringResource(R.string.ok), + onConfirm = { + restoreDialog?.let { onIntent(ReadBookIntent.SureNewProgress(it.progress)) } + onIntent(ReadBookIntent.DismissDialog) + }, + dismissText = stringResource(R.string.cancel), + onDismiss = { onIntent(ReadBookIntent.DismissDialog) }, + ) + AppAlertDialog( + show = syncDialog != null, + onDismissRequest = { onIntent(ReadBookIntent.DismissDialog) }, + title = stringResource(R.string.sync_progress), + text = stringResource(R.string.progress_exceeds_cloud), + confirmText = stringResource(R.string.ok), + onConfirm = { + syncDialog?.let { onIntent(ReadBookIntent.SureSyncProgress(it.progress)) } + onIntent(ReadBookIntent.DismissDialog) + }, + dismissText = stringResource(R.string.cancel), + onDismiss = { onIntent(ReadBookIntent.DismissDialog) }, + ) + AppAlertDialog( + show = skipDialog != null, + onDismissRequest = { onIntent(ReadBookIntent.DismissDialog) }, + title = stringResource(R.string.chapter_list), + text = stringResource(R.string.confirm_skip_to_chapter), + confirmText = stringResource(R.string.ok), + onConfirm = { onIntent(ReadBookIntent.DismissDialog) }, + dismissText = stringResource(R.string.cancel), + onDismiss = { onIntent(ReadBookIntent.DismissDialog) }, + ) + AppAlertDialog( + show = payDialog != null, + onDismissRequest = { onIntent(ReadBookIntent.DismissDialog) }, + title = stringResource(R.string.chapter_pay), + text = payDialog?.chapterTitle ?: "", + confirmText = stringResource(R.string.ok), + onConfirm = { + onIntent(ReadBookIntent.DismissDialog) + onIntent(ReadBookIntent.ConfirmPayAction) + }, + dismissText = stringResource(R.string.cancel), + onDismiss = { onIntent(ReadBookIntent.DismissDialog) }, + ) // AppModalBottomSheet-based sheets — always composed, controlled by show flag // for proper enter/exit animations @@ -146,12 +141,23 @@ fun ReadBookScreen( onDismissRequest = dismissSheet, onIntent = onIntent, ) + val fontSelectReadSettings: ReadSettingsRepository = org.koin.compose.koinInject() + val fontSelectPreferences by fontSelectReadSettings.preferences.collectAsStateWithLifecycle( + initialValue = ReadPreferences() + ) + val fontSelectFolderUri = fontSelectPreferences.fontFolder + .takeIf { it.isNotEmpty() }?.toUri() + val fontSelectSystemTypefaces = stringArrayResource(R.array.system_typefaces) FontSelectSheet( show = state.activeSheet is ReadBookSheet.FontSelect, + title = stringResource(R.string.select_font), + fontFolderUri = fontSelectFolderUri, + selectedFontPath = ReadBookConfig.textFont, onDismissRequest = dismissSheet, - onSelectFont = { onIntent(ReadBookIntent.SelectFont(it)) }, + onSelectFont = { onIntent(ReadBookIntent.SelectFont(it.uri.toString())) }, onSelectSystemTypeface = { onIntent(ReadBookIntent.SelectSystemTypeface(it)) }, onOpenFolderPicker = { onIntent(ReadBookIntent.OpenFontFolderPicker) }, + systemTypefaces = fontSelectSystemTypefaces, ) ToolButtonConfigSheet( show = state.activeSheet is ReadBookSheet.ToolButtonConfig, @@ -392,12 +398,17 @@ fun ReadBookScreen( } is ReadBookSheet.ChangeBookSource -> { - val sheet = state.activeSheet - val book = state.book - if (book != null) { + val changeSourceSheet = state.activeSheet as? ReadBookSheet.ChangeBookSource + val changeSourceBook = state.book + if (changeSourceSheet != null && changeSourceBook == null) { + LaunchedEffect(changeSourceSheet) { + onIntent(ReadBookIntent.DismissSheet) + } + } + if (changeSourceBook != null) { ChangeSourceSheet( - show = true, - oldBook = book, + show = changeSourceSheet != null, + oldBook = changeSourceBook, fromReadBookActivity = true, allowAddAsNew = false, dismissOnReplaceStart = true, @@ -414,10 +425,6 @@ fun ReadBookScreen( onIntent(ReadBookIntent.AddSourceAsNewBook(newBook, toc)) }, ) - } else { - LaunchedEffect(sheet) { - onIntent(ReadBookIntent.DismissSheet) - } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/FontSelectSheet.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/FontSelectSheet.kt deleted file mode 100644 index 25cd06ea2..000000000 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/FontSelectSheet.kt +++ /dev/null @@ -1,54 +0,0 @@ -package io.legado.app.ui.book.read.sheet - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource -import androidx.core.net.toUri -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import io.legado.app.R -import io.legado.app.data.repository.ReadPreferences -import io.legado.app.data.repository.ReadSettingsRepository -import io.legado.app.help.config.ReadBookConfig -import org.koin.compose.koinInject -import java.io.File -import java.net.URLDecoder -import io.legado.app.ui.widget.components.FontSelectSheet as SharedFontSelectSheet - -@Composable -fun FontSelectSheet( - show: Boolean, - onDismissRequest: () -> Unit, - onSelectFont: (String) -> Unit, - onSelectSystemTypeface: (Int) -> Unit, - onOpenFolderPicker: () -> Unit, -) { - val context = LocalContext.current - val readSettingsRepository: ReadSettingsRepository = koinInject() - val preferences by readSettingsRepository.preferences.collectAsStateWithLifecycle( - initialValue = ReadPreferences() - ) - val fontFolderUri = preferences.fontFolder.takeIf { it.isNotEmpty() }?.toUri() - val curFontPath = remember { ReadBookConfig.textFont } - val curName = remember { - runCatching { - URLDecoder.decode(curFontPath, "utf-8") - }.getOrNull()?.substringAfterLast(File.separator) - } - val systemTypefaces = remember { - context.resources.getStringArray(R.array.system_typefaces) - } - - SharedFontSelectSheet( - show = show, - title = stringResource(R.string.select_font), - fontFolderUri = fontFolderUri, - selectedFontName = curName, - onDismissRequest = onDismissRequest, - onSelectFont = { doc -> onSelectFont(doc.toString()) }, - onOpenFolderPicker = onOpenFolderPicker, - onSelectSystemTypeface = onSelectSystemTypeface, - systemTypefaces = systemTypefaces, - ) -} diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt index 48953c7df..c2140982a 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/sheet/HeaderFooterPage.kt @@ -28,11 +28,18 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.compose.ui.res.stringArrayResource +import androidx.core.net.toUri +import androidx.lifecycle.compose.collectAsStateWithLifecycle import io.legado.app.R +import io.legado.app.data.repository.ReadPreferences +import io.legado.app.data.repository.ReadSettingsRepository import io.legado.app.help.config.ReadBookConfig import io.legado.app.ui.book.read.ConfigUpdate import io.legado.app.ui.book.read.ReadBookIntent +import io.legado.app.ui.widget.components.FontSelectSheet import io.legado.app.ui.widget.components.dialog.ColorPickerSheet +import org.koin.compose.koinInject import io.legado.app.ui.widget.components.settingItem.TinyClickableSettingItem import io.legado.app.ui.widget.components.settingItem.TinyColorSettingItem import io.legado.app.ui.widget.components.settingItem.TinyDropdownSettingItem @@ -367,48 +374,55 @@ internal fun HeaderFooterPage( } // Color picker - if (showColorPicker) { - ColorPickerSheet( - show = true, - initialColor = colorPickerInitial, - onDismissRequest = { showColorPicker = false }, - onColorSelected = { color -> - when (colorPickerId) { - COLOR_HEADER -> { - onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipHeaderColor(color))) - } - - COLOR_FOOTER -> { - onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipFooterColor(color))) - } - - COLOR_DIVIDER -> { - onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipDividerColor(color))) - } + ColorPickerSheet( + show = showColorPicker, + initialColor = colorPickerInitial, + onDismissRequest = { showColorPicker = false }, + onColorSelected = { color -> + when (colorPickerId) { + COLOR_HEADER -> { + onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipHeaderColor(color))) } - showColorPicker = false - }, - ) - } + + COLOR_FOOTER -> { + onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipFooterColor(color))) + } + + COLOR_DIVIDER -> { + onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipDividerColor(color))) + } + } + showColorPicker = false + }, + ) // Font selector for header/footer - if (showFontSelect) { - FontSelectSheet( - show = true, - onDismissRequest = { showFontSelect = false }, - onSelectFont = { - onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderFont(it))) - onIntent(ReadBookIntent.SaveReadStyleConfig) - showFontSelect = false - }, - onSelectSystemTypeface = { - onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderFont(""))) - onIntent(ReadBookIntent.SaveReadStyleConfig) - showFontSelect = false - }, - onOpenFolderPicker = { /* handled by FontSelectSheet internally */ }, - ) - } + val readSettingsRepository: ReadSettingsRepository = koinInject() + val preferences by readSettingsRepository.preferences.collectAsStateWithLifecycle( + initialValue = ReadPreferences() + ) + val fontFolderUri = preferences.fontFolder.takeIf { it.isNotEmpty() }?.toUri() + val systemTypefaces = stringArrayResource(R.array.system_typefaces) + + FontSelectSheet( + show = showFontSelect, + title = stringResource(R.string.select_font), + fontFolderUri = fontFolderUri, + selectedFontPath = ReadBookConfig.headerFont, + onDismissRequest = { showFontSelect = false }, + onSelectFont = { + onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderFont(it.uri.toString()))) + onIntent(ReadBookIntent.SaveReadStyleConfig) + showFontSelect = false + }, + onSelectSystemTypeface = { + onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.HeaderFont(""))) + onIntent(ReadBookIntent.SaveReadStyleConfig) + showFontSelect = false + }, + onOpenFolderPicker = { /* handled by FontSelectSheet internally */ }, + systemTypefaces = systemTypefaces, + ) } @Composable diff --git a/app/src/main/java/io/legado/app/ui/book/read/sheet/HighlightRuleEditSheet.kt b/app/src/main/java/io/legado/app/ui/book/read/sheet/HighlightRuleEditSheet.kt index 5b7214c5c..0c8737207 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/sheet/HighlightRuleEditSheet.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/sheet/HighlightRuleEditSheet.kt @@ -38,13 +38,19 @@ import androidx.compose.ui.text.drawText import androidx.compose.ui.text.rememberTextMeasurer import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.compose.ui.res.stringArrayResource +import androidx.core.net.toUri +import androidx.lifecycle.compose.collectAsStateWithLifecycle import io.legado.app.R import io.legado.app.data.entities.HighlightRule +import io.legado.app.data.repository.ReadPreferences +import io.legado.app.data.repository.ReadSettingsRepository import io.legado.app.data.repository.configNames import io.legado.app.data.repository.toJsonArray import io.legado.app.help.config.ReadBookConfig import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.widget.components.AppTextField +import io.legado.app.ui.widget.components.FontSelectSheet import io.legado.app.ui.widget.components.SectionTitle import io.legado.app.ui.widget.components.card.NormalCard import io.legado.app.ui.widget.components.dialog.ColorPickerSheet @@ -463,65 +469,65 @@ fun HighlightRuleEditSheet( } // Color pickers - if (showTextColorPicker) { - ColorPickerSheet( - show = true, - initialColor = textColor, - onDismissRequest = { showTextColorPicker = false }, - onColorSelected = { color -> - textColor = color - showTextColorPicker = false - }, - ) - } - if (showBgColorPicker) { - ColorPickerSheet( - show = true, - initialColor = bgColor, - onDismissRequest = { showBgColorPicker = false }, - onColorSelected = { color -> - bgColor = color - showBgColorPicker = false - }, - ) - } - if (showUnderlineColorPicker) { - ColorPickerSheet( - show = true, - initialColor = underlineColor, - onDismissRequest = { showUnderlineColorPicker = false }, - onColorSelected = { color -> - underlineColor = color - showUnderlineColorPicker = false - }, - ) - } + ColorPickerSheet( + show = showTextColorPicker, + initialColor = textColor, + onDismissRequest = { showTextColorPicker = false }, + onColorSelected = { color -> + textColor = color + showTextColorPicker = false + }, + ) + ColorPickerSheet( + show = showBgColorPicker, + initialColor = bgColor, + onDismissRequest = { showBgColorPicker = false }, + onColorSelected = { color -> + bgColor = color + showBgColorPicker = false + }, + ) + ColorPickerSheet( + show = showUnderlineColorPicker, + initialColor = underlineColor, + onDismissRequest = { showUnderlineColorPicker = false }, + onColorSelected = { color -> + underlineColor = color + showUnderlineColorPicker = false + }, + ) // Font selector - if (showFontSelect) { - val readSettingsRepository: io.legado.app.data.repository.ReadSettingsRepository = - org.koin.compose.koinInject() - val scope = rememberCoroutineScope() - val fontFolderLauncher = rememberLauncherForActivityResult( - ActivityResultContracts.OpenDocumentTree() - ) { uri -> - uri?.let { - context.contentResolver.takePersistableUriPermission( - it, Intent.FLAG_GRANT_READ_URI_PERMISSION - ) - scope.launch { - readSettingsRepository.setFontFolder(it.toString()) - } + val readSettingsRepository: ReadSettingsRepository = org.koin.compose.koinInject() + val fontSelectScope = rememberCoroutineScope() + val fontSelectPreferences by readSettingsRepository.preferences.collectAsStateWithLifecycle( + initialValue = ReadPreferences() + ) + val fontFolderUri = fontSelectPreferences.fontFolder.takeIf { it.isNotEmpty() }?.toUri() + val systemTypefaces = stringArrayResource(R.array.system_typefaces) + val fontFolderLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.OpenDocumentTree() + ) { uri -> + uri?.let { + context.contentResolver.takePersistableUriPermission( + it, Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + fontSelectScope.launch { + readSettingsRepository.setFontFolder(it.toString()) } } - FontSelectSheet( - show = true, - onDismissRequest = { showFontSelect = false }, - onSelectFont = { fontPath = it; showFontSelect = false }, - onSelectSystemTypeface = { fontPath = ""; showFontSelect = false }, - onOpenFolderPicker = { fontFolderLauncher.launch(null) }, - ) } + FontSelectSheet( + show = showFontSelect, + title = stringResource(R.string.select_font), + fontFolderUri = fontFolderUri, + selectedFontPath = fontPath, + onDismissRequest = { showFontSelect = false }, + onSelectFont = { fontPath = it.uri.toString(); showFontSelect = false }, + onSelectSystemTypeface = { fontPath = ""; showFontSelect = false }, + onOpenFolderPicker = { fontFolderLauncher.launch(null) }, + systemTypefaces = systemTypefaces, + ) } @Composable diff --git a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt index a2f199f59..05741a912 100644 --- a/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt +++ b/app/src/main/java/io/legado/app/ui/config/themeConfig/ThemeConfigScreen.kt @@ -72,7 +72,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import androidx.core.net.toUri -import androidx.documentfile.provider.DocumentFile + import androidx.lifecycle.compose.collectAsStateWithLifecycle import io.legado.app.R import io.legado.app.base.AppContextWrapper @@ -868,19 +868,11 @@ fun ThemeConfigScreen( } ) - val curName = remember(ThemeConfig.appFontPath) { - ThemeConfig.appFontPath?.let { uri -> - runCatching { - DocumentFile.fromSingleUri(context, uri.toUri())?.name - }.getOrNull() - } - } - FontSelectSheet( show = showFontSheet, title = stringResource(R.string.font_setting), fontFolderUri = fontFolderUri, - selectedFontName = curName, + selectedFontPath = ThemeConfig.appFontPath, onDismissRequest = { showFontSheet = false }, onSelectFont = { doc -> ThemeConfig.appFontPath = doc.uri.toString() diff --git a/app/src/main/java/io/legado/app/ui/widget/components/FontSelectSheet.kt b/app/src/main/java/io/legado/app/ui/widget/components/FontSelectSheet.kt index 7f59b4f31..9a4fb80f7 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/FontSelectSheet.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/FontSelectSheet.kt @@ -13,6 +13,9 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.core.net.toUri +import androidx.documentfile.provider.DocumentFile import io.legado.app.ui.widget.components.button.series.SmallPlainButton import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet import io.legado.app.utils.FileDoc @@ -22,7 +25,7 @@ fun FontSelectSheet( show: Boolean = true, title: String, fontFolderUri: Uri?, - selectedFontName: String?, + selectedFontPath: String?, onDismissRequest: () -> Unit, onSelectFont: (FileDoc) -> Unit, onOpenFolderPicker: () -> Unit, @@ -33,6 +36,14 @@ fun FontSelectSheet( systemTypefaces: Array? = null, emptyText: String? = null, ) { + val context = LocalContext.current + val selectedFontName = remember(selectedFontPath) { + selectedFontPath?.let { + runCatching { + DocumentFile.fromSingleUri(context, it.toUri())?.name + }.getOrNull() + } + } var showTypefaceMenu by remember { mutableStateOf(false) } AppModalBottomSheet(