feat: theme manage and auth

This commit is contained in:
2026-06-12 15:42:09 +03:30
parent c3496e3de4
commit fdf15913a9
9 changed files with 407 additions and 40 deletions
@@ -5,24 +5,35 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AccountCircle
import androidx.compose.material.icons.filled.Menu
import androidx.compose.material3.DrawerValue
import androidx.compose.material3.ElevatedButton
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ModalNavigationDrawer
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.rememberDrawerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextAlign
import androidx.navigation.NavHostController
import com.approagency.pharmacy.data.local.AccountState
import com.approagency.pharmacy.data.local.SessionManager
import com.approagency.pharmacy.domain.repository.AuthRepository
import com.approagency.pharmacy.presentation.account.AccountDrawer
import com.approagency.pharmacy.presentation.account.AccountSheet
import com.approagency.pharmacy.presentation.account.AccountSheetController
import kotlinx.coroutines.launch
import org.koin.compose.koinInject
@OptIn(ExperimentalMaterial3Api::class)
@@ -33,21 +44,52 @@ fun MainContainer(
) {
val session: SessionManager = koinInject()
val sheetController: AccountSheetController = koinInject()
val authRepository: AuthRepository = koinInject()
val account by session.account.collectAsState()
val sheetVisible by sheetController.visible.collectAsState()
val themeMode by session.themeMode.collectAsState()
Scaffold(
topBar = {
AccountAppBar(
val drawerState = rememberDrawerState(DrawerValue.Closed)
val scope = rememberCoroutineScope()
val context = LocalContext.current
val appVersion = remember {
runCatching {
context.packageManager.getPackageInfo(context.packageName, 0).versionName
}.getOrNull().orEmpty()
}
ModalNavigationDrawer(
drawerState = drawerState,
drawerContent = {
AccountDrawer(
account = account,
onAccountClick = { sheetController.show() }
appVersion = appVersion,
themeMode = themeMode,
onThemeModeChange = { session.setThemeMode(it) },
onLogout = {
scope.launch {
authRepository.logout()
drawerState.close()
}
}
)
},
bottomBar = { BottomBar(navController) }
) { padding ->
Box(modifier = Modifier.padding(padding)) {
content()
}
) {
Scaffold(
topBar = {
AccountAppBar(
account = account,
onMenuClick = { scope.launch { drawerState.open() } },
onAccountClick = { sheetController.show() }
)
},
bottomBar = { BottomBar(navController) }
) { padding ->
Box(modifier = Modifier.padding(padding)) {
content()
}
}
}
@@ -60,9 +102,18 @@ fun MainContainer(
@Composable
private fun AccountAppBar(
account: AccountState,
onMenuClick: () -> Unit,
onAccountClick: () -> Unit
) {
TopAppBar(
navigationIcon = {
IconButton(onClick = onMenuClick) {
Icon(
imageVector = Icons.Filled.Menu,
contentDescription = "منو"
)
}
},
title = {
if (account.isLoggedIn) {
Column {
@@ -84,15 +135,7 @@ private fun AccountAppBar(
}
},
actions = {
if (account.isLoggedIn) {
IconButton(onClick = onAccountClick) {
Icon(
imageVector = Icons.Filled.AccountCircle,
contentDescription = "حساب کاربری",
tint = MaterialTheme.colorScheme.primary
)
}
} else {
if (!account.isLoggedIn) {
TextButton(onClick = onAccountClick) {
Text("ورود", textAlign = TextAlign.Center)
}