diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/di/DataModuleDI.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/di/DataModuleDI.kt index e688f8b50830b24252ec26000ed5e8cc3537298c..4e5faf7f01270c8ab61357b9730f7b4b749b647c 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/di/DataModuleDI.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/data/di/DataModuleDI.kt @@ -4,6 +4,8 @@ import band.effective.office.elevator.Database import band.effective.office.elevator.data.NetworkClient import band.effective.office.elevator.data.database.DBSource import band.effective.office.elevator.data.database.DBSourceImpl +import band.effective.office.elevator.domain.repository.EmployeeRepository +import band.effective.office.elevator.domain.repository.impl.EmployeeRepositoryImpl import org.koin.dsl.module internal val dataModuleDI = module { @@ -12,4 +14,6 @@ internal val dataModuleDI = module { factory { Database(get()) } // SQL Driver injected by native platforms(see: androidMain or iosMain) single{DBSourceImpl(get())} + + single{ EmployeeRepositoryImpl() } } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/LocationController.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/LocationController.kt new file mode 100644 index 0000000000000000000000000000000000000000..8465206f6e0dba7c142acbeae23a3eeb8598942d --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/LocationController.kt @@ -0,0 +1,4 @@ +package band.effective.office.elevator.domain + +class LocationController { +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/di/DomainModuleDI.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/di/DomainModuleDI.kt index 08c89243f5b8ecbf78a5b31ae208fb5c3399b5b0..f3a842e2006e7c9b910939d67f7d750be3566065 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/di/DomainModuleDI.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/di/DomainModuleDI.kt @@ -2,8 +2,10 @@ package band.effective.office.elevator.domain.di import band.effective.office.elevator.data.OfficeElevatorRepositoryImpl import band.effective.office.elevator.domain.OfficeElevatorRepository +import band.effective.office.elevator.domain.usecase.EmployeeUseCase import org.koin.dsl.module internal val domainModuleDI = module { single { OfficeElevatorRepositoryImpl(get(), get()) } + factory { EmployeeUseCase(repository = get()) } } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/EmployeeInfo.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/EmployeeInfo.kt new file mode 100644 index 0000000000000000000000000000000000000000..d8f5308088e662f74ba99023325b3cef4a3ad883 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/EmployeeInfo.kt @@ -0,0 +1,11 @@ +package band.effective.office.elevator.domain.models + +data class EmployeeInfo( + val name: String, + val post: String, + val state: String, + val logoUrl: String, + val phoneNum: String, + val eMail: String, + val telegramProfile: String +) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/EmployeeRepository.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/EmployeeRepository.kt new file mode 100644 index 0000000000000000000000000000000000000000..56e1e5dadc2cfbb3dc5603029f4f7adc226568fa --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/EmployeeRepository.kt @@ -0,0 +1,9 @@ +package band.effective.office.elevator.domain.repository + +import band.effective.office.elevator.domain.models.EmployeeInfo +import kotlinx.coroutines.flow.Flow + +interface EmployeeRepository { + suspend fun getEmployeesInfo(): Flow>//State + +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/impl/EmployeeRepositoryImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/impl/EmployeeRepositoryImpl.kt new file mode 100644 index 0000000000000000000000000000000000000000..5c20e745e32e116684dbc49da0a4a6d260d6740f --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/impl/EmployeeRepositoryImpl.kt @@ -0,0 +1,49 @@ +package band.effective.office.elevator.domain.repository.impl + +import band.effective.office.elevator.domain.models.EmployeeInfo +import band.effective.office.elevator.domain.repository.EmployeeRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow + + +class EmployeeRepositoryImpl: EmployeeRepository{//private val api:EmployeeRepository: EmployeeRepository + + override suspend fun getEmployeesInfo(): Flow> {//State + return flow> { + emit( + listOf( + EmployeeInfo( + "Ivanov Ivan", + "Android-developer", + "In office", + "https://wampi.ru/image/R9C6OC7", + "", + "", + "" + ), + EmployeeInfo( + "Smirnov Andrey", + "UI/UX Designer", + "Will be today", + "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png", + "", + "", + "" + ), + EmployeeInfo( + "Vasiliev Vasiliy", + "HR", + "No bookings", + "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png", + "", + "", + "" + ) + ) + ) + + } + + } + +} diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/EmployeeUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/EmployeeUseCase.kt new file mode 100644 index 0000000000000000000000000000000000000000..bf7ef30f4ca7a455cd3d739a800f4e75537d6e12 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/EmployeeUseCase.kt @@ -0,0 +1,10 @@ +package band.effective.office.elevator.domain.usecase + +import band.effective.office.elevator.domain.repository.EmployeeRepository + +class EmployeeUseCase( + private val repository: EmployeeRepository +) { + suspend operator fun invoke()=repository.getEmployeesInfo() + +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/authorization/authorization_profile/store/AuthorizationProfileStoreImpl.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/authorization/authorization_profile/store/AuthorizationProfileStoreImpl.kt index 79c945bda78614144c51ccc2bcea376583c4702b..196d63ebd8cc893aad1d40f541485ce71a4a599d 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/authorization/authorization_profile/store/AuthorizationProfileStoreImpl.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/authorization/authorization_profile/store/AuthorizationProfileStoreImpl.kt @@ -85,6 +85,7 @@ class AuthorizationProfileStoreFactory( ) } + private fun checkUserdata(name: String, post: String) { if (!validator.checkName(name) && !validator.checkPost(post)) { publish(AuthorizationProfileStore.Label.AuthorizationProfileSuccess) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/Employee.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/Employee.kt index 9b2bf224c10e90b474ebbbf4dc2b92678755db71..2c02cf751d67325060cddda96e1febf84f0a16fb 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/Employee.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/Employee.kt @@ -2,6 +2,7 @@ package band.effective.office.elevator.ui.employee import androidx.compose.runtime.Composable import band.effective.office.elevator.ui.employee.aboutEmployee.AboutEmployee +import band.effective.office.elevator.ui.employee.allEmployee.EmployeeScreen import com.arkivanov.decompose.extensions.compose.jetbrains.stack.Children import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.fade import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.plus diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt index a14f2b9fbc6aa4f6bbb1782ff5475b3b5df0325d..7fb1eee4c8b756f9c285b28872fc0daef0c1b376 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt @@ -1,11 +1,10 @@ -package band.effective.office.elevator.ui.employee +package band.effective.office.elevator.ui.employee.allEmployee import androidx.compose.animation.animateContentSize import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -26,8 +25,8 @@ import androidx.compose.material.Text import androidx.compose.material.TextField import androidx.compose.material.TextFieldDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.MutableState import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -45,34 +44,31 @@ import band.effective.office.elevator.MainRes import band.effective.office.elevator.borderGray import band.effective.office.elevator.borderGreen import band.effective.office.elevator.borderPurple +import band.effective.office.elevator.domain.models.EmployeeInfo import band.effective.office.elevator.textInBorderGray import band.effective.office.elevator.textInBorderPurple import band.effective.office.elevator.theme_light_background import band.effective.office.elevator.theme_light_onBackground -import band.effective.office.elevator.theme_light_primary_color +import band.effective.office.elevator.theme_light_onPrimary import band.effective.office.elevator.theme_light_tertiary_color -import band.effective.office.elevator.ui.employee.allEmployee.EmployeeComponent +import band.effective.office.elevator.ui.employee.allEmployee.models.mappers.EmployeeCard import band.effective.office.elevator.ui.employee.allEmployee.store.EmployeeStore +import band.effective.office.elevator.utils.generateImageLoader +import com.seiko.imageloader.LocalImageLoader +import com.seiko.imageloader.model.ImageRequest +import com.seiko.imageloader.rememberAsyncImagePainter import dev.icerock.moko.resources.ImageResource import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.stringResource - -data class EmployeeCard( - val name: String, - val post: String, - val state: String, - val logoUrl: ImageResource//TODO() Переделать в URL -) - @Composable fun EmployeeScreen(component: EmployeeComponent) { val employState by component.employState.collectAsState() - val employeesData = employState.changeShowedEmployeeCards//state - val employeesCount = employeesData.count() - val employeesInOfficeCount = employeesData.filter{it.state=="In office"}.count() - val userMessageState = remember { mutableStateOf("") } + val employeesData = employState.changeShowedEmployeeCards + val employeesCount = employState.countShowedEmployeeCards + val employeesInOfficeCount = employState.countInOfficeShowedEmployeeCards + val userMessageState = employState.query LaunchedEffect(component) { @@ -94,106 +90,97 @@ fun EmployeeScreen(component: EmployeeComponent) { @Composable fun EmployeeScreenContent( employeesData: List, - employeesCount: Int, - employeesInOfficeCount: Int, - userMessageState: MutableState, + employeesCount: String, + employeesInOfficeCount: String, + userMessageState: String, onCardClick: () -> Unit, onTextFieldUpdate: (String) -> Unit ) { Column { - Box( + Column( modifier = Modifier - .background(theme_light_primary_color)///Themeeee! - + .background(theme_light_onPrimary) + .padding(0.dp, 0.dp, 0.dp, 15.dp) .fillMaxWidth() ) { - Column { - Text( - text = stringResource(MainRes.strings.employees), - fontSize = 20.sp, - fontWeight = FontWeight(600), + Text( + text = stringResource(MainRes.strings.employees), + fontSize = 20.sp, + fontWeight = FontWeight(600),//? + color = theme_light_tertiary_color, + modifier = Modifier.padding(20.dp, 55.dp, 15.dp, 25.dp) + ) + TextField( + value = userMessageState, onValueChange = { + onTextFieldUpdate(it) + }, modifier = Modifier + .fillMaxWidth() + .height(70.dp) + .padding(20.dp, 10.dp, 20.dp, 5.dp), + textStyle = TextStyle( color = theme_light_tertiary_color, - modifier = Modifier.padding(20.dp, 55.dp, 15.dp, 25.dp) - ) - TextField( - value = userMessageState.value, onValueChange = { - userMessageState.value = it - onTextFieldUpdate(it) - }, modifier = Modifier - .fillMaxWidth() - .height(70.dp) - .padding(20.dp, 10.dp, 20.dp, 5.dp), - textStyle = TextStyle( - color = theme_light_tertiary_color, + fontSize = 16.sp, + fontWeight = FontWeight(500) + ), + colors = TextFieldDefaults.textFieldColors( + focusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + backgroundColor = theme_light_background + ), + placeholder = { + Text( + text = stringResource(MainRes.strings.search_employee), fontSize = 16.sp, - fontWeight = FontWeight(500) - ), - colors = TextFieldDefaults.textFieldColors( - focusedIndicatorColor = Color.Transparent, - disabledIndicatorColor = Color.Transparent, - unfocusedIndicatorColor = Color.Transparent, - backgroundColor = theme_light_background - ), - placeholder = { - Text( - text = stringResource(MainRes.strings.search_employee), - fontSize = 16.sp, - fontWeight = FontWeight(500),//Style. maththeme - color = textInBorderGray - ) - }, - leadingIcon = { - Icon( - painter = painterResource(MainRes.images.baseline_search_24), - contentDescription = "SearchField", - tint = textInBorderGray - ) - }, - singleLine = true, - shape = RoundedCornerShape(32.dp) + fontWeight = FontWeight(500),//Style. maththeme + color = textInBorderGray + ) + }, + leadingIcon = { + Icon( + painter = painterResource(MainRes.images.baseline_search_24), + contentDescription = "SearchField", + tint = textInBorderGray + ) + }, + singleLine = true, + shape = RoundedCornerShape(32.dp) - ) + ) - //padding настроить! - } } - Box( + Column( modifier = Modifier .background(theme_light_onBackground) .fillMaxSize() - .padding(horizontal = 20.dp, vertical = 25.dp) + .padding(20.dp, 25.dp, 20.dp, 0.dp) ) { - LazyColumn( - //TODO() Зюзин: надо доработать вёрстку экрана (оптимизировать компоненты) + Row(modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 25.dp).fillMaxWidth()) { + Text( + text = stringResource(MainRes.strings.employees) + " ", + fontSize = 16.sp, + fontWeight = FontWeight(500), + color = theme_light_tertiary_color//??? + ) + Text( + text = "($employeesCount)", + fontSize = 16.sp, + fontWeight = FontWeight(400), + color = textInBorderPurple + ) + Text( + text = stringResource(MainRes.strings.employee_in_office) + + ": $employeesInOfficeCount", + fontSize = 16.sp, + fontWeight = FontWeight(400), + color = textInBorderPurple, + textAlign = TextAlign.End, + modifier = Modifier.fillMaxWidth() + ) + } - modifier = Modifier.fillMaxSize() - ) { - item { - Row(modifier = Modifier.padding(5.dp, 0.dp, 0.dp, 15.dp).fillMaxWidth()) { - Text( - text = stringResource(MainRes.strings.employees) + " ", - fontSize = 16.sp, - fontWeight = FontWeight(500), - color = theme_light_tertiary_color - ) - Text( - text = "($employeesCount)", - fontSize = 16.sp, - fontWeight = FontWeight(400), - color = textInBorderPurple - ) - Text( - text = stringResource(MainRes.strings.employee_in_office) - + ": $employeesInOfficeCount", - fontSize = 16.sp, - fontWeight = FontWeight(400), - color = textInBorderPurple, - textAlign = TextAlign.End, - modifier = Modifier.fillMaxWidth() - ) - } - } + LazyColumn { items(employeesData) { employee_Data -> EveryEmployeeCard(emp = employee_Data, onCardClick) @@ -232,19 +219,33 @@ fun EveryEmployeeCard(emp: EmployeeCard, onCardClick: () -> Unit) { shape = RoundedCornerShape(12.dp), modifier = Modifier .fillMaxSize() - .padding(5.dp) + .padding(0.dp,0.dp,0.dp,15.dp) .animateContentSize() .clickable { isExpanded = !isExpanded }, - color = theme_light_primary_color + color = theme_light_onPrimary ) { - Row(modifier = Modifier.padding(6.dp, 10.dp)) { - Image( - painter = painterResource(emp.logoUrl), - contentDescription = "Employee logo", - modifier = Modifier - .clip(CircleShape) - .size(56.dp) - ) + Row(modifier = Modifier.padding(6.dp, 15.dp)) { + + CompositionLocalProvider( + LocalImageLoader provides remember {generateImageLoader()}, + ) { + emp.logoUrl.let { url -> + val request = remember(url) { + ImageRequest { + data(url) + } + } + val painter = rememberAsyncImagePainter(request) + Image( + painter = painterResource(MainRes.images.logo_default), + contentDescription = "Employee logo", + modifier = Modifier + .clip(CircleShape) + .size(56.dp) + ) + + } + } Column(modifier = Modifier.padding(15.dp, 0.dp)) { Text( text = emp.name, @@ -263,7 +264,7 @@ fun EveryEmployeeCard(emp: EmployeeCard, onCardClick: () -> Unit) { Spacer(modifier = Modifier.padding(0.dp, 8.dp)) Button( onClick = { isExpanded = !isExpanded }, - colors = ButtonDefaults.buttonColors(theme_light_primary_color), + colors = ButtonDefaults.buttonColors(theme_light_onPrimary), modifier = Modifier .border(1.dp, stateColorBorder, RoundedCornerShape(12.dp)), shape = RoundedCornerShape(12.dp), @@ -284,43 +285,71 @@ fun EveryEmployeeCard(emp: EmployeeCard, onCardClick: () -> Unit) { object EmployeesData { val employeesCardData = listOf( - EmployeeCard( + EmployeeInfo( "Ivanov Ivan", "Android-developer", "In office", - MainRes.images.logo_default + "https://wampi.ru/image/R9C6OC7", + "", + "", + "" ), - EmployeeCard( + EmployeeInfo( "Smirnov Andrey", "UI/UX Designer", "Will be today", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png", + "", + "", + "" ), - EmployeeCard( + EmployeeInfo( "Vasiliev Vasiliy", "HR", "No bookings", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png", + "", + "", + "" ) ) val showedEmployeesCardData = listOf( - EmployeeCard( + EmployeeInfo( "Смирнов Андрей", "UI/UX Designer", "Будет сегодня", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png", + //MainRes.images.logo_default + "", + "", + "" ), - EmployeeCard( + EmployeeInfo( "Васильев Василий", "HR", "Нет бронирований", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png", + "", + "", + "" ), - EmployeeCard( + EmployeeInfo( "Иванов Иван", "Android-developer", "В офисе", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-green.png", + "", + "", + "" ) ) + val initial=listOf( + EmployeeInfo( + "", + "", + "", + "", + "", + "", + "")) } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/models/mappers/EmployeeCard.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/models/mappers/EmployeeCard.kt new file mode 100644 index 0000000000000000000000000000000000000000..e343e4092103895a7f7ad946ff56c34e49db805a --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/models/mappers/EmployeeCard.kt @@ -0,0 +1,7 @@ +package band.effective.office.elevator.ui.employee.allEmployee.models.mappers + +data class EmployeeCard( + val name: String, + val post: String, + val state: String, + val logoUrl: String) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/models/mappers/converterToEmployeeCard.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/models/mappers/converterToEmployeeCard.kt new file mode 100644 index 0000000000000000000000000000000000000000..2095c43323f3c734c9bceae167b1b3ff9926e926 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/models/mappers/converterToEmployeeCard.kt @@ -0,0 +1,8 @@ +package band.effective.office.elevator.ui.employee.allEmployee.models.mappers + +import band.effective.office.elevator.domain.models.EmployeeInfo + +fun EmployeeInfo.toUI(): EmployeeCard { + + return EmployeeCard(name = name, post = post, state = state, logoUrl = logoUrl) +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStore.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStore.kt index 8747f475c9193879db07daf10643e943bb96235f..b3b14671e53fdaabb2178ebb0e94700f45409984 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStore.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStore.kt @@ -1,6 +1,6 @@ package band.effective.office.elevator.ui.employee.allEmployee.store -import band.effective.office.elevator.ui.employee.EmployeeCard +import band.effective.office.elevator.ui.employee.allEmployee.models.mappers.EmployeeCard import com.arkivanov.mvikotlin.core.store.Store interface EmployeeStore: Store { @@ -11,6 +11,9 @@ interface EmployeeStore: Store, + val countShowedEmployeeCards:String, + val countInOfficeShowedEmployeeCards:String, + val query:String ) sealed interface Label{ diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStoreFactory.kt index e7d454c4ac57c124a138ec137100444c0362a556..f5db73f12e60ac33503956665c2dc11a34c80b84 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStoreFactory.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStoreFactory.kt @@ -1,22 +1,50 @@ package band.effective.office.elevator.ui.employee.allEmployee.store -import band.effective.office.elevator.ui.employee.EmployeeCard -import band.effective.office.elevator.ui.employee.EmployeesData +import band.effective.office.elevator.domain.models.EmployeeInfo +import band.effective.office.elevator.domain.usecase.EmployeeUseCase +import band.effective.office.elevator.ui.employee.allEmployee.EmployeesData +import band.effective.office.elevator.ui.employee.allEmployee.models.mappers.toUI +import band.effective.office.elevator.utils.changeEmployeeShowedList import com.arkivanov.mvikotlin.core.store.Reducer import com.arkivanov.mvikotlin.core.store.Store import com.arkivanov.mvikotlin.core.store.StoreFactory +import com.arkivanov.mvikotlin.core.utils.ExperimentalMviKotlinApi import com.arkivanov.mvikotlin.extensions.coroutines.CoroutineExecutor +import com.arkivanov.mvikotlin.extensions.coroutines.coroutineBootstrapper +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.koin.core.component.KoinComponent +import org.koin.core.component.inject internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):KoinComponent{ + + private val employeesInfo:EmployeeUseCase by inject() + + var employeesInfoList:List = listOf() + private val _employList = MutableStateFlow(EmployeesData.initial) + val employList=_employList.asStateFlow() + var employeesNameFilter:String="" + @OptIn(ExperimentalMviKotlinApi::class) fun create(): EmployeeStore = object: EmployeeStore, Store by storeFactory.create( name="EmployeeStore", initialState = EmployeeStore.State( - changeShowedEmployeeCards = EmployeesData.employeesCardData + changeShowedEmployeeCards = employeesInfoList.map(EmployeeInfo::toUI), + countShowedEmployeeCards =employeesInfoList.count().toString(), + countInOfficeShowedEmployeeCards = employeesInfoList.filter {it.state=="In office"}.count().toString(), + query=employeesNameFilter + ), + bootstrapper = coroutineBootstrapper { + launch(Dispatchers.IO) { + employeesInfo.invoke().collect{newList->_employList.value=newList} + } + launch { dispatch(EmployeeStoreFactory.Action.UpdateEmployeesInfo) + }}, executorFactory = ::ExecutorImpl, reducer = ReducerIMPL @@ -24,15 +52,20 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin } private sealed interface Msg{ - data class UpdateEmployees(val query: String): Msg + data class UpdateEmployees(val query: String, val employeesInfo:List): Msg } + private sealed interface Action{ + object UpdateEmployeesInfo: Action//val employeesInfo: List + } + private inner class ExecutorImpl : - CoroutineExecutor() { + CoroutineExecutor() { override fun executeIntent(intent: EmployeeStore.Intent, getState: () -> EmployeeStore.State) { when (intent) { is EmployeeStore.Intent.OnTextFieldUpdate -> { scope.launch { - dispatch(Msg.UpdateEmployees(query = intent.query)) + employeesNameFilter=intent.query + dispatch(Msg.UpdateEmployees(query = employeesNameFilter, employeesInfo = employeesInfoList))//employeesInfoList } } EmployeeStore.Intent.OnClickOnEmployee ->{ @@ -43,29 +76,33 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin } } + override fun executeAction( + action: EmployeeStoreFactory.Action, + getState: () -> EmployeeStore.State + ) { + when(action){ + is EmployeeStoreFactory.Action.UpdateEmployeesInfo->{ + employeesInfoList=employList.value + dispatch(Msg.UpdateEmployees(query = employeesNameFilter, employeesInfo = employeesInfoList))//i need intent.query there so i made special variable + } + } + } } private object ReducerIMPL: Reducer { override fun EmployeeStore.State.reduce(msg: Msg): EmployeeStore.State = when(msg){ - is Msg.UpdateEmployees -> copy( - changeShowedEmployeeCards = changeEmployeeShowedList(msg.query) + is Msg.UpdateEmployees -> + copy( + changeShowedEmployeeCards = changeEmployeeShowedList(msg.query, msg.employeesInfo.map(EmployeeInfo::toUI)), + countShowedEmployeeCards=changeEmployeeShowedList(msg.query, msg.employeesInfo.map(EmployeeInfo::toUI)).count().toString(), + countInOfficeShowedEmployeeCards=changeEmployeeShowedList(msg.query, msg.employeesInfo.map(EmployeeInfo::toUI)) + .filter {it.state=="In office"}.count().toString(), + query = msg.query + ) } - private fun changeEmployeeShowedList(query: String): List { - return if(query.isEmpty()){ - EmployeesData.employeesCardData - }else { - var compareString = query.filter { !it.isWhitespace() }.lowercase() - val allEmployeesCards = EmployeesData.employeesCardData - - var showedEmployeesCards = allEmployeesCards.filter { it.name.filter { !it.isWhitespace() } - .lowercase().contains(compareString) } - - - showedEmployeesCards - } - } } + } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/NameCompareFounder.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/NameCompareFounder.kt new file mode 100644 index 0000000000000000000000000000000000000000..e4cc85d1b659bc44422c92c96178a989a804823b --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/NameCompareFounder.kt @@ -0,0 +1,6 @@ +package band.effective.office.elevator.utils + +import band.effective.office.elevator.ui.employee.allEmployee.models.mappers.EmployeeCard + +fun changeEmployeeShowedList(query: String, allEmployeesCards: List): List = + allEmployeesCards.filter{ it.name.lowercase().contains(query.lowercase())} diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/generateImageLoader.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/generateImageLoader.kt new file mode 100644 index 0000000000000000000000000000000000000000..00a2f4761a98141d329093e4e29e103ebaad6331 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/generateImageLoader.kt @@ -0,0 +1,7 @@ +package band.effective.office.elevator.utils + +import com.seiko.imageloader.ImageLoader + +fun generateImageLoader(): ImageLoader{//expect actual + return ImageLoader { } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml index c865df817d50b8b707f1311344dc6859f272d129..6c13b6e745cf775de56cf178c5419fb267cd0da9 100644 --- a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml +++ b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml @@ -4,6 +4,7 @@ Авторизация через Google Что-то пошло не так. Пожалуйста попробуйте еще раз effective\noffice + Поиск сотрудника В офисе diff --git a/composeApp/src/commonMain/resources/MR/en/strings_en.xml b/composeApp/src/commonMain/resources/MR/en/strings_en.xml index 4ce63388c66658e4580d5a59db17567c04dfe211..8003b10ab99c1c1314210ae369bba52ac71a5523 100644 --- a/composeApp/src/commonMain/resources/MR/en/strings_en.xml +++ b/composeApp/src/commonMain/resources/MR/en/strings_en.xml @@ -4,13 +4,9 @@ Sign in to Effective email Something went wrong. Please try again effective\noffice - Ivanov Ivan - Smirnov Andrey - Vasilyev Vasiliy + Search employee In office - Will be today - No reservations Effective