Просмотр исходного кода

refactor: 统一FontSelectSheet组件

HapeLee 5 месяцев назад
Родитель
Сommit
5ff9f3145a

+ 81 - 74
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)
-                }
             }
         }
 

+ 0 - 54
app/src/main/java/io/legado/app/ui/book/read/sheet/FontSelectSheet.kt

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

+ 51 - 37
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)))
-                    }
+    ColorPickerSheet(
+        show = showColorPicker,
+        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_FOOTER -> {
+                    onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipFooterColor(color)))
+                }
 
-                    COLOR_DIVIDER -> {
-                        onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipDividerColor(color)))
-                    }
+                COLOR_DIVIDER -> {
+                    onIntent(ReadBookIntent.UpdateConfig(ConfigUpdate.TipDividerColor(color)))
                 }
-                showColorPicker = false
-            },
-        )
-    }
+            }
+            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

+ 60 - 54
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

+ 2 - 10
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()

+ 12 - 1
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<String>? = 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(