feat: clean text
This commit is contained in:
@@ -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) }
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user