fix: size and dime

This commit is contained in:
2026-06-07 22:29:08 +03:30
parent 292b77f29b
commit b46cd5b40c
14 changed files with 113 additions and 132 deletions
@@ -143,7 +143,7 @@ fun CustomTextFilled(
},
modifier = Modifier
.weight(1f)
.padding(horizontal = if (showClearButton && localValue.isNotEmpty()) 4.dp else 0.dp),
.padding(horizontal = if (showClearButton && localValue.isNotEmpty()) MaterialTheme.dime.xs else 0.dp),
enabled = enabled,
readOnly = readOnly,
singleLine = singleLine,
@@ -1,37 +1,26 @@
package com.approagency.pharmacy.presentation.common
import androidx.compose.ui.unit.sp
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vada.caller.ui.theme.LocalDime
import com.vada.caller.ui.theme.dime
@Composable
fun LoadingMoreIndicator(
modifier: Modifier = Modifier
) {
val dime = LocalDime.current
Box(
modifier = modifier
.fillMaxWidth()
.padding(dime.lg),
.padding(MaterialTheme.dime.lg),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator(
modifier = Modifier.size(32.dp),
color = MaterialTheme.colorScheme.primary
)
Loading()
}
}
@@ -39,18 +28,16 @@ fun LoadingMoreIndicator(
fun EndOfListIndicator(
modifier: Modifier = Modifier
) {
val dime = LocalDime.current
Box(
modifier = modifier
.fillMaxWidth()
.padding(dime.xl),
.padding(MaterialTheme.dime.xl),
contentAlignment = Alignment.Center
) {
Text(
text = "پایان نتایج",
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f),
fontSize = 12.sp
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f)
)
}
}
@@ -1,20 +1,67 @@
package com.approagency.pharmacy.presentation.common
import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.vada.caller.ui.theme.dime
/**
* تنها کامپوزبل لودینگ برنامه — همه‌جا از همین استفاده می‌شود.
*
* - بدون [message] فقط یک اسپینر برمی‌گرداند (برای دکمه‌ها، ردیف‌ها و غیره):
* Loading() // اسپینر ساده
* Loading(size = 24.dp) // اسپینر کوچک‌تر
* Loading(color = MaterialTheme.colorScheme.onPrimary) // روی دکمه‌ی primary
*
* - با [message] یک حالت لودینگ وسط‌چین همراه متن می‌سازد (تمام‌صفحه/ناحیه‌ای):
* Loading(modifier = Modifier.fillMaxSize(), message = "در حال جستجو...")
*
* رنگ پیش‌فرض primary است تا روی پس‌زمینه‌ی معمول دیده شود.
*/
@Composable
fun Loading(
color: Color = MaterialTheme.colorScheme.onPrimary,
modifier: Modifier = Modifier
modifier: Modifier = Modifier,
message: String? = null,
size: Dp = 40.dp,
color: Color = MaterialTheme.colorScheme.primary,
strokeWidth: Dp = 3.dp
) {
CircularProgressIndicator(
color = color,
modifier = modifier,
strokeWidth = 2.dp
)
if (message.isNullOrBlank()) {
CircularProgressIndicator(
modifier = modifier.size(size),
color = color,
strokeWidth = strokeWidth
)
} else {
Box(
modifier = modifier.fillMaxWidth(),
contentAlignment = Alignment.Center
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator(
modifier = Modifier.size(size),
color = color,
strokeWidth = strokeWidth
)
Spacer(modifier = Modifier.height(MaterialTheme.dime.md))
Text(
text = message,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.7f)
)
}
}
}
}
@@ -8,7 +8,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
@Composable
@@ -24,13 +23,17 @@ fun PrimaryButton(
contentColor = MaterialTheme.colorScheme.onPrimary
),
shape = MaterialTheme.shapes.medium,
modifier = Modifier.fillMaxWidth().height(height?.dp ?: 50.dp),
onClick = {
onClick()
},
enabled = isLoading != true,
modifier = Modifier
.fillMaxWidth()
.height(height?.dp ?: 50.dp),
onClick = onClick,
) {
if (isLoading == true) {
Text("... در حال جستجو" , textAlign = TextAlign.Right)
Loading(
size = 22.dp,
color = MaterialTheme.colorScheme.onPrimary
)
} else {
Text(text)
}
@@ -11,6 +11,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.ArrowForward
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
@@ -19,6 +20,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.vada.caller.ui.theme.dime
@Composable
fun PaginationControls(
@@ -32,7 +34,7 @@ fun PaginationControls(
if (totalPages <= 1) return
Row(
modifier = modifier.padding(vertical = 16.dp),
modifier = modifier.padding(vertical = MaterialTheme.dime.lg),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
@@ -49,7 +51,7 @@ fun PaginationControls(
if (pageRange.first > 1) {
PageNumberButton(page = 1, isSelected = false, onClick = onPageSelected)
if (pageRange.first > 2) {
Text("...", modifier = Modifier.padding(horizontal = 4.dp))
Text("...", modifier = Modifier.padding(horizontal = MaterialTheme.dime.xs))
}
}
@@ -63,7 +65,7 @@ fun PaginationControls(
if (pageRange.last < totalPages) {
if (pageRange.last < totalPages - 1) {
Text("...", modifier = Modifier.padding(horizontal = 4.dp))
Text("...", modifier = Modifier.padding(horizontal = MaterialTheme.dime.xs))
}
PageNumberButton(page = totalPages, isSelected = false, onClick = onPageSelected)
}
@@ -89,11 +91,11 @@ private fun PageNumberButton(
Text(
text = page.toString(),
modifier = Modifier
.padding(horizontal = 4.dp)
.padding(horizontal = MaterialTheme.dime.xs)
.clip(RoundedCornerShape(4.dp))
.background(backgroundColor)
.clickable { onClick(page) }
.padding(horizontal = 12.dp, vertical = 8.dp),
.padding(horizontal = MaterialTheme.dime.md, vertical = MaterialTheme.dime.sm),
color = textColor,
fontSize = 14.sp
)
@@ -115,7 +117,7 @@ private fun PaginationButton(
.size(36.dp)
.clip(RoundedCornerShape(4.dp))
.then(if (enabled) Modifier.clickable(onClick = onClick) else Modifier)
.padding(8.dp),
.padding(MaterialTheme.dime.sm),
tint = color
)
}
@@ -114,23 +114,13 @@ fun PharmacyBottomSheet(
when (val state = pharmacyState) {
PharmacyState.Loading -> {
item {
Box(
Loading(
modifier = Modifier
.fillMaxWidth()
.height(400.dp),
contentAlignment = Alignment.Center
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Loading()
Spacer(modifier = Modifier.height(MaterialTheme.dime.xl))
Text(
text = "در حال جستجو...",
fontSize = MaterialTheme.typography.bodySmall.fontSize
)
}
}
message = "در حال جستجو..."
)
}
}
is PharmacyState.Success -> {
@@ -191,7 +181,7 @@ fun PharmacyBottomSheet(
color = MaterialTheme.colorScheme.error,
fontSize = MaterialTheme.typography.bodyMedium.fontSize
)
Spacer(modifier = Modifier.height(8.dp))
Spacer(modifier = Modifier.height(MaterialTheme.dime.sm))
TextButton(
onClick = { viewModel.retry() }) {
Text("تلاش مجدد")
@@ -243,7 +233,7 @@ fun PharmacyResultItem(
modifier = Modifier
.fillMaxWidth()
.padding(dime.md),
verticalArrangement = Arrangement.spacedBy(4.dp)
verticalArrangement = Arrangement.spacedBy(dime.xs)
) {
// نام برند
Text(
@@ -288,19 +278,19 @@ fun PharmacyResultItem(
horizontalArrangement = Arrangement.Center,
modifier = Modifier.fillMaxWidth()
) {
CircularProgressIndicator(modifier = Modifier.size(24.dp))
Loading(size = 24.dp)
}
}
is PharmacyDetailState.Success -> {
Column(
verticalArrangement = Arrangement.spacedBy(8.dp)
verticalArrangement = Arrangement.spacedBy(dime.sm)
) {
HorizontalDivider(modifier = Modifier.padding(vertical = MaterialTheme.dime.xs))
// آدرس
Row(
verticalAlignment = Alignment.Top,
horizontalArrangement = Arrangement.spacedBy(8.dp)
horizontalArrangement = Arrangement.spacedBy(dime.sm)
) {
Icon(
imageVector = Icons.Default.LocationOn,
@@ -319,7 +309,7 @@ fun PharmacyResultItem(
if (detailState.detail.phone.isNotBlank()) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp)
horizontalArrangement = Arrangement.spacedBy(dime.sm)
) {
Icon(
imageVector = Icons.Default.Phone,
@@ -28,7 +28,7 @@ fun RetryContent(modifier: Modifier = Modifier , error:String ,onClick:()-> Unit
Text(
text = error,
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(vertical = 8.dp)
modifier = Modifier.padding(vertical = MaterialTheme.dime.sm)
)
PrimaryButton(
text = "تلاش مجدد",
@@ -67,7 +67,7 @@ fun SearchResultsContent(
Text(
text = error,
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(vertical = 8.dp)
modifier = Modifier.padding(vertical = MaterialTheme.dime.sm)
)
}
}
@@ -12,7 +12,6 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Divider
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
@@ -35,6 +34,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.approagency.pharmacy.domain.model.DrugDetail
import com.approagency.pharmacy.presentation.common.CustomModalBottomSheet
import com.approagency.pharmacy.presentation.common.ErrorState
import com.approagency.pharmacy.presentation.common.Loading
import com.approagency.pharmacy.presentation.viewModel.DrugDetailViewModel
import com.approagency.pharmacy.presentation.viewModel.DrugDetailYabState
import com.vada.caller.ui.theme.LocalDime
@@ -80,24 +80,13 @@ fun DrugDetailBottomSheet(
}
DrugDetailYabState.Loading -> {
Box(
Loading(
modifier = Modifier
.fillMaxWidth()
.height(400.dp)
.padding(dime.xl),
contentAlignment = Alignment.Center
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.primary
)
Spacer(modifier = Modifier.height(dime.md))
Text(
text = "در حال دریافت اطلاعات دارو...",
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.7f)
)
}
}
message = "در حال دریافت اطلاعات دارو..."
)
}
is DrugDetailYabState.Success -> {
@@ -197,7 +186,7 @@ fun DrugDetailContent(
}
}
drugDetail.therapeuticClass?.let {
Spacer(modifier = Modifier.height(4.dp))
Spacer(modifier = Modifier.height(dime.xs))
Row {
Text(
text = "طبقه درمانی: ",
@@ -17,7 +17,6 @@ import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.Info
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Divider
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
@@ -49,6 +48,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.approagency.pharmacy.domain.model.DrugDetail
import com.approagency.pharmacy.presentation.common.ErrorState
import com.approagency.pharmacy.presentation.common.Loading
import com.approagency.pharmacy.presentation.viewModel.DrugDetailViewModel
import com.approagency.pharmacy.presentation.viewModel.DrugDetailYabState
import com.vada.caller.ui.theme.LocalDime
@@ -122,22 +122,10 @@ fun DrugDetailScreen(
DrugDetailYabState.Idle -> {}
DrugDetailYabState.Loading -> {
Box(
Loading(
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)
)
}
}
message = "در حال دریافت اطلاعات دارو..."
)
}
is DrugDetailYabState.Success -> {
@@ -629,7 +617,7 @@ fun DosageFormsTabContent(drugDetail: DrugDetail) {
text = "پرخطر",
fontSize = 10.sp,
color = Color(0xFFC62828),
modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp)
modifier = Modifier.padding(horizontal = 6.dp, vertical = dime.xxs)
)
}
}
@@ -642,7 +630,7 @@ fun DosageFormsTabContent(drugDetail: DrugDetail) {
text = "حیاتی",
fontSize = 10.sp,
color = Color(0xFF2E7D32),
modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp)
modifier = Modifier.padding(horizontal = 6.dp, vertical = dime.xxs)
)
}
}
@@ -41,6 +41,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import com.vada.caller.ui.theme.dime
@SuppressLint("ConfigurationScreenWidthHeight")
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@@ -72,7 +73,7 @@ fun RootScreen(navHostController: NavHostController, modifier: Modifier){
containerColor = MaterialTheme.colorScheme.surface,
modifier = Modifier
.fillMaxWidth()
.height(110.dp).padding(bottom = 2.dp).clip(MaterialTheme.shapes.extraLarge),
.height(110.dp).padding(bottom = MaterialTheme.dime.xxs).clip(MaterialTheme.shapes.extraLarge),
tonalElevation = 8.dp, // subtle shadow
windowInsets = WindowInsets.navigationBars
.only(WindowInsetsSides.Bottom)
@@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -30,6 +29,7 @@ import com.approagency.pharmacy.presentation.common.CustomTextFilled
import com.approagency.pharmacy.presentation.common.EmptySearchState
import com.approagency.pharmacy.presentation.common.EndOfListIndicator
import com.approagency.pharmacy.presentation.common.ErrorState
import com.approagency.pharmacy.presentation.common.Loading
import com.approagency.pharmacy.presentation.common.LoadingMoreIndicator
import com.approagency.pharmacy.presentation.common.PrimaryButton
import com.approagency.pharmacy.presentation.components.DaroYabSearchResult
@@ -151,18 +151,10 @@ fun SearchScreen(
// Results area
when (val currentState = state) {
is SearchState.Loading -> {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator(
color = MaterialTheme.colorScheme.primary
)
Text(
text = "در حال جستجو...",
modifier = Modifier.padding(top = dime.md),
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.7f)
)
}
}
Loading(
modifier = Modifier.fillMaxSize(),
message = "در حال جستجو..."
)
}
is SearchState.LoadingMore -> {
@@ -1,11 +1,3 @@
package com.approagency.pharmacy.ui.theme
import androidx.compose.ui.graphics.Color
val Purple80 = Color(0xFFD0BCFF)
val PurpleGrey80 = Color(0xFFCCC2DC)
val Pink80 = Color(0xFFEFB8C8)
val Purple40 = Color(0xFF6650a4)
val PurpleGrey40 = Color(0xFF625b71)
val Pink40 = Color(0xFF7D5260)
// رنگ‌های برنامه در MaterialThemeExt.kt (MedicalColors و ColorScheme ها) تعریف شده‌اند.
@@ -12,17 +12,7 @@ val Dana = FontFamily(
Font(R.font.dana_medium, weight = FontWeight.Medium),
Font(R.font.dana_bold, weight = FontWeight.Bold),
)
// Set of Material typography styles to start with
val Typography = Typography(
bodyLarge = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
lineHeight = 24.sp,
letterSpacing = 0.5.sp
)
)
// تایپوگرافی برنامه — در DrugTheme استفاده می‌شود
val AppTypography = Typography(
displayLarge = TextStyle(
fontFamily = Dana,