feat: clean text

This commit is contained in:
2026-05-27 20:42:39 +03:30
parent e65c699bcb
commit dd5cbaa3bc
@@ -25,12 +25,14 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.SecondaryTabRow
import androidx.compose.material3.Tab import androidx.compose.material3.Tab
import androidx.compose.material3.TabRow import androidx.compose.material3.TabRow
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
@@ -39,8 +41,10 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -70,145 +74,154 @@ fun DrugDetailScreen(
viewModel.loadDrugDetail(detailUrl) viewModel.loadDrugDetail(detailUrl)
} }
Scaffold( CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Rtl) {
topBar = { Scaffold(
TopAppBar( topBar = {
title = { TopAppBar(
when (val state = detailState) { title = {
is DrugDetailYabState.Success -> { when (val state = detailState) {
Column { is DrugDetailYabState.Success -> {
Text( Column {
text = state.drugDetail.persianName.take(25),
fontSize = 16.sp,
fontWeight = FontWeight.Medium,
maxLines = 1
)
if (state.drugDetail.englishName.isNotEmpty()) {
Text( Text(
text = state.drugDetail.englishName.take(30), text = state.drugDetail.persianName.take(25),
fontSize = 11.sp, fontSize = 16.sp,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f), fontWeight = FontWeight.Medium,
maxLines = 1 maxLines = 1
) )
} if (state.drugDetail.englishName.isNotEmpty()) {
}
}
else -> {
Text("جزئیات دارو", fontSize = 16.sp)
}
}
},
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = "بازگشت"
)
}
},
colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.surface
)
)
}
) { paddingValues ->
Box(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
when (val state = detailState) {
DrugDetailYabState.Idle -> {}
DrugDetailYabState.Loading -> {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(48.dp)
)
Spacer(modifier = Modifier.height(dime.md))
Text(
text = "در حال دریافت اطلاعات دارو...",
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.7f)
)
}
}
}
is DrugDetailYabState.Success -> {
val drugDetail = state.drugDetail
Column(modifier = Modifier.fillMaxSize()) {
// Manufacturer Info Card (برای صفحات برند)
if (!drugDetail.isGeneric && drugDetail.manufacturer != null) {
ManufacturerInfoCard(
manufacturer = drugDetail.manufacturer!!,
genericInfo = drugDetail.genericInfo,
modifier = Modifier.padding(horizontal = dime.md, vertical = dime.sm)
)
}
// Tab Row
TabRow(
selectedTabIndex = selectedTab,
containerColor = MaterialTheme.colorScheme.surface,
contentColor = MaterialTheme.colorScheme.primary
) {
tabs.forEachIndexed { index, title ->
Tab(
selected = selectedTab == index,
onClick = { selectedTab = index },
text = {
Text( Text(
text = title, text = state.drugDetail.englishName.take(30),
fontSize = 13.sp, fontSize = 11.sp,
fontWeight = if (selectedTab == index) FontWeight.Bold else FontWeight.Normal, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f),
maxLines = 1 maxLines = 1
) )
} }
}
}
else -> {
Text("جزئیات دارو", fontSize = 16.sp)
}
}
},
navigationIcon = {
IconButton(onClick = { navController.popBackStack() }) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = "بازگشت"
)
}
},
colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.surface
)
)
}
) { paddingValues ->
Box(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
when (val state = detailState) {
DrugDetailYabState.Idle -> {}
DrugDetailYabState.Loading -> {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(48.dp)
)
Spacer(modifier = Modifier.height(dime.md))
Text(
text = "در حال دریافت اطلاعات دارو...",
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.7f)
) )
} }
} }
}
// Tab Content is DrugDetailYabState.Success -> {
LazyColumn( val drugDetail = state.drugDetail
modifier = Modifier
.fillMaxSize() Column(modifier = Modifier.fillMaxSize()) {
.padding(horizontal = dime.md) // Manufacturer Info Card (برای صفحات برند)
.padding(top = dime.md), if (!drugDetail.isGeneric && drugDetail.manufacturer != null) {
verticalArrangement = Arrangement.spacedBy(dime.md) ManufacturerInfoCard(
) { manufacturer = drugDetail.manufacturer!!,
when (selectedTab) { genericInfo = drugDetail.genericInfo,
0 -> { modifier = Modifier.padding(
item { GeneralInfoTabContent(drugDetail) } horizontal = dime.md,
vertical = dime.sm
)
)
}
// Tab Row
TabRow(
selectedTabIndex = selectedTab,
containerColor = MaterialTheme.colorScheme.surface,
contentColor = MaterialTheme.colorScheme.primary
) {
tabs.forEachIndexed { index, title ->
Tab(
selected = selectedTab == index,
onClick = { selectedTab = index },
text = {
Text(
text = title,
fontSize = 13.sp,
fontWeight = if (selectedTab == index) FontWeight.Bold else FontWeight.Normal,
maxLines = 1
)
}
)
} }
1 -> { }
item { SpecializedInfoTabContent(drugDetail) }
} // Tab Content
2 -> { LazyColumn(
item { DosageFormsTabContent(drugDetail) } modifier = Modifier
} .fillMaxSize()
3 -> { .padding(horizontal = dime.md)
item { BrandNamesTabContent(drugDetail) } .padding(top = dime.md),
verticalArrangement = Arrangement.spacedBy(dime.md)
) {
when (selectedTab) {
0 -> {
item { GeneralInfoTabContent(drugDetail) }
}
1 -> {
item { SpecializedInfoTabContent(drugDetail) }
}
2 -> {
item { DosageFormsTabContent(drugDetail) }
}
3 -> {
item { BrandNamesTabContent(drugDetail) }
}
} }
} }
} }
} }
}
is DrugDetailYabState.Error -> { is DrugDetailYabState.Error -> {
Box( Box(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
ErrorState( ErrorState(
message = state.message, message = state.message,
onRetry = { viewModel.loadDrugDetail(detailUrl) } onRetry = { viewModel.loadDrugDetail(detailUrl) }
) )
}
} }
} }
} }