From 9a0e050e94f7695b7f157ed7622e3cb04c7a3224 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Mon, 24 Jul 2023 14:15:44 +0600 Subject: [PATCH 01/10] Some compose parameters for EmployeeScreen was optimized --- .../elevator/ui/employee/EmployeeScreen.kt | 85 ++++++++----------- .../resources/MR/base/strings_ru.xml | 1 + .../commonMain/resources/MR/en/strings_en.xml | 6 +- 3 files changed, 38 insertions(+), 54 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt index bf60493f..6562b6d1 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt @@ -5,7 +5,6 @@ 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 @@ -49,7 +48,7 @@ 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.store.EmployeeStore import dev.icerock.moko.resources.ImageResource @@ -101,17 +100,14 @@ fun EmployeeScreenContent( ) { Column { - Box( - modifier = Modifier - .background(theme_light_primary_color)///Themeeee! - - .fillMaxWidth() - ) { - Column { + Column (modifier = Modifier + .background(theme_light_onPrimary) + .padding(0.dp,0.dp,0.dp,15.dp) + .fillMaxWidth()){ Text( text = stringResource(MainRes.strings.employees), fontSize = 20.sp, - fontWeight = FontWeight(600), + fontWeight = FontWeight(600),//? color = theme_light_tertiary_color, modifier = Modifier.padding(20.dp, 55.dp, 15.dp, 25.dp) ) @@ -153,51 +149,42 @@ fun EmployeeScreenContent( 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) } - } } } @@ -231,12 +218,12 @@ 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)) { + Row(modifier = Modifier.padding(6.dp, 15.dp)) { Image( painter = painterResource(emp.logoUrl), contentDescription = "Employee logo", @@ -262,7 +249,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), diff --git a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml index 075a2704..dabbdb1c 100644 --- a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml +++ b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml @@ -3,6 +3,7 @@ Office Elevator Авторизация через 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 f28b78b4..70efb27d 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 Continue -- GitLab From c5e27cab03daac477a42fe861972802954183a49 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Tue, 25 Jul 2023 11:20:38 +0600 Subject: [PATCH 02/10] Default ImageLoader was integrated in EmployeeScreen to load employees logo by URL --- .../elevator/ui/employee/EmployeeScreen.kt | 54 +++++++++++++------ .../elevator/utils/generateImageLoader.kt | 7 +++ 2 files changed, 45 insertions(+), 16 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/generateImageLoader.kt diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt index 6562b6d1..0b806798 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults import androidx.compose.material.Icon @@ -25,6 +26,7 @@ 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 @@ -51,7 +53,10 @@ import band.effective.office.elevator.theme_light_onBackground import band.effective.office.elevator.theme_light_onPrimary import band.effective.office.elevator.theme_light_tertiary_color import band.effective.office.elevator.ui.employee.store.EmployeeStore -import dev.icerock.moko.resources.ImageResource +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.compose.painterResource import dev.icerock.moko.resources.compose.stringResource @@ -60,18 +65,19 @@ data class EmployeeCard( val name: String, val post: String, val state: String, - val logoUrl: ImageResource//TODO() Переделать в URL + val logoUrl: String ) @Composable fun EmployeeScreen(component: EmployeeComponent) { val employState by component.employState.collectAsState() - val employeesData = employState.changeShowedEmployeeCards//state + val employeesData = employState.changeShowedEmployeeCards val employeesCount = employeesData.count() val employeesInOfficeCount = employeesData.filter{it.state=="In office"}.count() val userMessageState = remember { mutableStateOf("") } + LaunchedEffect(component) { component.employLabel.collect { label -> @@ -146,6 +152,7 @@ fun EmployeeScreenContent( ) }, singleLine = true, + keyboardActions = KeyboardActions(onGo = {userMessageState.value ="Check"}), shape = RoundedCornerShape(32.dp) ) @@ -224,13 +231,27 @@ fun EveryEmployeeCard(emp: EmployeeCard, onCardClick: () -> Unit) { color = theme_light_onPrimary ) { Row(modifier = Modifier.padding(6.dp, 15.dp)) { - Image( - painter = painterResource(emp.logoUrl), - contentDescription = "Employee logo", - modifier = Modifier - .clip(CircleShape) - .size(56.dp) - ) + + CompositionLocalProvider( + LocalImageLoader provides remember {generateImageLoader()}, + ) { + emp.logoUrl.let { url -> + val request = remember(url) { + ImageRequest { + data(url) + } + } + val painter = rememberAsyncImagePainter(request) + Image( + painter = painter, + contentDescription = "Employee logo", + modifier = Modifier + .clip(CircleShape) + .size(56.dp) + ) + + } + } Column(modifier = Modifier.padding(15.dp, 0.dp)) { Text( text = emp.name, @@ -274,19 +295,19 @@ object EmployeesData { "Ivanov Ivan", "Android-developer", "In office", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-green.png" ), EmployeeCard( "Smirnov Andrey", "UI/UX Designer", "Will be today", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png" ), EmployeeCard( "Vasiliev Vasiliy", "HR", "No bookings", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png" ) ) val showedEmployeesCardData = listOf( @@ -294,19 +315,20 @@ object EmployeesData { "Смирнов Андрей", "UI/UX Designer", "Будет сегодня", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png" + //MainRes.images.logo_default ), EmployeeCard( "Васильев Василий", "HR", "Нет бронирований", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png" ), EmployeeCard( "Иванов Иван", "Android-developer", "В офисе", - MainRes.images.logo_default + "https://www.kasandbox.org/programming-images/avatars/leaf-green.png" ) ) } \ No newline at end of file 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 00000000..805b919b --- /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{ + return ImageLoader { } +} \ No newline at end of file -- GitLab From 57ed24c3ee21daf0d5c2854f77ec4d99ffadba6c Mon Sep 17 00:00:00 2001 From: Roman194 Date: Tue, 25 Jul 2023 14:32:54 +0600 Subject: [PATCH 03/10] ImageLoader in EmployeeScreen was modified a bit --- .../effective/office/elevator/ui/employee/EmployeeScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt index 0b806798..278d393b 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt @@ -295,7 +295,7 @@ object EmployeesData { "Ivanov Ivan", "Android-developer", "In office", - "https://www.kasandbox.org/programming-images/avatars/leaf-green.png" + "https://wampi.ru/image/R9C6OC7" ), EmployeeCard( "Smirnov Andrey", -- GitLab From a6935b093f8feade20013421f4667c02d3acd333 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Thu, 27 Jul 2023 11:27:47 +0600 Subject: [PATCH 04/10] Employee Domain layer was added --- .../elevator/domain/LocationController.kt | 4 ++ .../elevator/domain/models/EmployeeInfo.kt | 10 +++++ .../domain/repository/EmployeeRepository.kt | 11 +++++ .../elevator/domain/usecase/BookingUseCase.kt | 4 ++ .../domain/usecase/EmployeeUseCase.kt | 40 +++++++++++++++++++ .../ui/employee/allEmployee/EmployeeScreen.kt | 6 +-- 6 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/LocationController.kt create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/EmployeeInfo.kt create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/EmployeeRepository.kt create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/BookingUseCase.kt create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/EmployeeUseCase.kt 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 00000000..8465206f --- /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/models/EmployeeInfo.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/EmployeeInfo.kt new file mode 100644 index 00000000..4358ca3a --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/models/EmployeeInfo.kt @@ -0,0 +1,10 @@ +package band.effective.office.elevator.domain.models + +data class EmployeeInfo( + val name: String, + val post: 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 00000000..0f1696fc --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/EmployeeRepository.kt @@ -0,0 +1,11 @@ +package band.effective.office.elevator.domain.repository + +import band.effective.office.elevator.domain.models.EmployeeInfo +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job + +interface EmployeeRepository { + suspend fun getEmployeesInfo(employeeInfo: EmployeeInfo): List + + fun subscribeOnEmployeesInfoUpdates(scope: CoroutineScope, handler: (EmployeeInfo) -> Unit): Job +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/BookingUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/BookingUseCase.kt new file mode 100644 index 00000000..179425e2 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/BookingUseCase.kt @@ -0,0 +1,4 @@ +package band.effective.office.elevator.domain.usecase + +class BookingUseCase { +} \ No newline at end of file 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 00000000..79afd3a7 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/EmployeeUseCase.kt @@ -0,0 +1,40 @@ +package band.effective.office.elevator.domain.usecase + +import band.effective.office.elevator.domain.LocationController +import band.effective.office.elevator.domain.models.EmployeeInfo +import band.effective.office.elevator.domain.repository.EmployeeRepository +import band.effective.office.elevator.ui.employee.EmployeeCard +import band.effective.office.elevator.ui.employee.EmployeesData +import kotlinx.coroutines.CoroutineScope + +class EmployeeUseCase( + private val repository: EmployeeRepository, + private val bookingUseCase: BookingUseCase, + private val locationController: LocationController +) { + + suspend operator fun invoke(employeeInfo: EmployeeInfo)=repository.getEmployeesInfo(employeeInfo) + + suspend fun getUsersResearches()=bookingUseCase//() + + suspend fun getEmployeesLocations()=locationController//() + + fun subscribe(scope: CoroutineScope, handler: (EmployeeInfo) -> Unit) { + repository.subscribeOnEmployeesInfoUpdates(scope) { handler(it) } + } + + 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 + } + } +} \ No newline at end of file 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 c284f7d7..a3a76c46 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 @@ -5,7 +5,6 @@ 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 @@ -18,7 +17,6 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults import androidx.compose.material.Icon @@ -53,7 +51,8 @@ import band.effective.office.elevator.theme_light_background import band.effective.office.elevator.theme_light_onBackground import band.effective.office.elevator.theme_light_onPrimary import band.effective.office.elevator.theme_light_tertiary_color -import band.effective.office.elevator.ui.employee.store.EmployeeStore +import band.effective.office.elevator.ui.employee.allEmployee.EmployeeComponent +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 @@ -199,7 +198,6 @@ fun EmployeeScreenContent( } } } -} @Composable -- GitLab From c211f3893265fb0854823a2e91c5ef2444965022 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Thu, 27 Jul 2023 15:23:09 +0600 Subject: [PATCH 05/10] nameCompareFounder was added. EmployeeRepository and EmployeeUseCase was modified --- .../elevator/domain/models/EmployeeInfo.kt | 1 + .../domain/repository/EmployeeRepository.kt | 6 +- .../elevator/domain/usecase/BookingUseCase.kt | 4 - .../domain/usecase/EmployeeUseCase.kt | 34 +----- .../office/elevator/ui/employee/Employee.kt | 1 + .../ui/employee/allEmployee/EmployeeScreen.kt | 105 +++++++++--------- .../allEmployee/store/EmployeeStore.kt | 2 +- .../allEmployee/store/EmployeeStoreFactory.kt | 32 +++--- .../elevator/utils/nameCompareFounder.kt | 19 ++++ 9 files changed, 95 insertions(+), 109 deletions(-) delete mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/BookingUseCase.kt create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/nameCompareFounder.kt 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 index 4358ca3a..1d683b8f 100644 --- 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 @@ -3,6 +3,7 @@ package band.effective.office.elevator.domain.models data class EmployeeInfo( val name: String, val post: String, + val state: Boolean, val logoUrl: String, val phoneNum: String, val eMail: 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 index 0f1696fc..354c820b 100644 --- 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 @@ -1,11 +1,9 @@ package band.effective.office.elevator.domain.repository import band.effective.office.elevator.domain.models.EmployeeInfo -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.StateFlow interface EmployeeRepository { - suspend fun getEmployeesInfo(employeeInfo: EmployeeInfo): List + suspend fun getEmployeesInfo(): StateFlow> - fun subscribeOnEmployeesInfoUpdates(scope: CoroutineScope, handler: (EmployeeInfo) -> Unit): Job } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/BookingUseCase.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/BookingUseCase.kt deleted file mode 100644 index 179425e2..00000000 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/usecase/BookingUseCase.kt +++ /dev/null @@ -1,4 +0,0 @@ -package band.effective.office.elevator.domain.usecase - -class BookingUseCase { -} \ No newline at end of file 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 index 79afd3a7..bf7ef30f 100644 --- 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 @@ -1,40 +1,10 @@ package band.effective.office.elevator.domain.usecase -import band.effective.office.elevator.domain.LocationController -import band.effective.office.elevator.domain.models.EmployeeInfo import band.effective.office.elevator.domain.repository.EmployeeRepository -import band.effective.office.elevator.ui.employee.EmployeeCard -import band.effective.office.elevator.ui.employee.EmployeesData -import kotlinx.coroutines.CoroutineScope class EmployeeUseCase( - private val repository: EmployeeRepository, - private val bookingUseCase: BookingUseCase, - private val locationController: LocationController + private val repository: EmployeeRepository ) { + suspend operator fun invoke()=repository.getEmployeesInfo() - suspend operator fun invoke(employeeInfo: EmployeeInfo)=repository.getEmployeesInfo(employeeInfo) - - suspend fun getUsersResearches()=bookingUseCase//() - - suspend fun getEmployeesLocations()=locationController//() - - fun subscribe(scope: CoroutineScope, handler: (EmployeeInfo) -> Unit) { - repository.subscribeOnEmployeesInfoUpdates(scope) { handler(it) } - } - - 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 - } - } } \ No newline at end of file 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 9b2bf224..2c02cf75 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 a3a76c46..92f75223 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,4 +1,4 @@ -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 @@ -51,7 +51,6 @@ import band.effective.office.elevator.theme_light_background import band.effective.office.elevator.theme_light_onBackground 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.store.EmployeeStore import band.effective.office.elevator.utils.generateImageLoader import com.seiko.imageloader.LocalImageLoader @@ -106,64 +105,65 @@ fun EmployeeScreenContent( ) { Column { - Column (modifier = Modifier - .background(theme_light_onPrimary) - .padding(0.dp,0.dp,0.dp,15.dp) - .fillMaxWidth()){ - Text( - text = stringResource(MainRes.strings.employees), - fontSize = 20.sp, - fontWeight = FontWeight(600),//? + Column( + modifier = Modifier + .background(theme_light_onPrimary) + .padding(0.dp, 0.dp, 0.dp, 15.dp) + .fillMaxWidth() + ) { + 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.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, - 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 настроить! - } + //padding настроить! } Column( modifier = Modifier .background(theme_light_onBackground) .fillMaxSize() - .padding(20.dp,25.dp,20.dp,0.dp) + .padding(20.dp, 25.dp, 20.dp, 0.dp) ) { Row(modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 25.dp).fillMaxWidth()) { Text( @@ -189,7 +189,7 @@ fun EmployeeScreenContent( ) } - LazyColumn{ + LazyColumn { items(employeesData) { employee_Data -> EveryEmployeeCard(emp = employee_Data, onCardClick) @@ -198,6 +198,7 @@ fun EmployeeScreenContent( } } } +} @Composable 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 8747f475..6aff3dd3 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.EmployeeCard import com.arkivanov.mvikotlin.core.store.Store interface EmployeeStore: Store { 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 e7d454c4..3927c3d0 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,8 +1,8 @@ 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.ui.employee.allEmployee.EmployeesData +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 @@ -53,19 +53,19 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin ) } - 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 - } - } +// private fun changeEmployeeShowedList(query: String): List { +// return if(query.isEmpty()){ +// EmployeesData.employeesCardData +// }else { +// val compareString = query.filter { !it.isWhitespace() }.lowercase() +// val allEmployeesCards = EmployeesData.employeesCardData +// +// val 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 00000000..53282f93 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/nameCompareFounder.kt @@ -0,0 +1,19 @@ +package band.effective.office.elevator.utils + +import band.effective.office.elevator.ui.employee.allEmployee.EmployeeCard +import band.effective.office.elevator.ui.employee.allEmployee.EmployeesData + +fun changeEmployeeShowedList(query: String): List { + return if(query.isEmpty()){ + EmployeesData.employeesCardData + }else { + val compareString = query.filter { !it.isWhitespace() }.lowercase() + val allEmployeesCards = EmployeesData.employeesCardData + + val showedEmployeesCards = allEmployeesCards.filter { it.name.filter { !it.isWhitespace() } + .lowercase().contains(compareString) } + + + showedEmployeesCards + } +} \ No newline at end of file -- GitLab From 18873f5d4022afc786bb4f7618466933c51bf5c0 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Mon, 31 Jul 2023 10:55:01 +0600 Subject: [PATCH 06/10] DI for EmployeeUseCase, EmployeeRepository and EmployeeRepositoryImpl was added. Employee domain was modified. Bootstrapper in EmployeeStoreFactory was added. ConvertEmployeeInfoListToEmployeeCard function was added --- .../office/elevator/data/di/DataModuleDI.kt | 4 ++ .../elevator/domain/di/DomainModuleDI.kt | 2 + .../elevator/domain/models/EmployeeInfo.kt | 2 +- .../repository/impl/EmployeeRepositoryImpl.kt | 44 +++++++++++++ .../store/AuthorizationProfileStoreImpl.kt | 1 + .../ui/employee/allEmployee/EmployeeScreen.kt | 44 +++++++++---- .../allEmployee/store/EmployeeStoreFactory.kt | 62 +++++++++++++------ .../utils/EmployeesFormatConvertor.kt | 17 +++++ ...ompareFounder.kt => NameCompareFounder.kt} | 8 +-- .../elevator/utils/generateImageLoader.kt | 2 +- 10 files changed, 148 insertions(+), 38 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/impl/EmployeeRepositoryImpl.kt create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeesFormatConvertor.kt rename composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/{nameCompareFounder.kt => NameCompareFounder.kt} (63%) 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 e688f8b5..4e5faf7f 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/di/DomainModuleDI.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/di/DomainModuleDI.kt index 08c89243..f3a842e2 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 index 1d683b8f..d8f53080 100644 --- 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 @@ -3,7 +3,7 @@ package band.effective.office.elevator.domain.models data class EmployeeInfo( val name: String, val post: String, - val state: Boolean, + val state: String, val logoUrl: String, val phoneNum: String, val eMail: String, 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 00000000..9b203e22 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/domain/repository/impl/EmployeeRepositoryImpl.kt @@ -0,0 +1,44 @@ +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.MutableStateFlow + +class EmployeeRepositoryImpl: EmployeeRepository{//private val api:EmployeeRepository: EmployeeRepository + private val employList = MutableStateFlow(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", + "", + "", + "" + )) + ) + + override suspend fun getEmployeesInfo(): MutableStateFlow> { + //employList.update { api.getEmployeesInfo().collect(employList)} + return employList + } + + +} 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 79c945bd..196d63eb 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/allEmployee/EmployeeScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt index 92f75223..e566c7f3 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 @@ -45,6 +45,7 @@ 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 @@ -157,7 +158,6 @@ fun EmployeeScreenContent( ) - //padding настроить! } Column( modifier = Modifier @@ -294,44 +294,62 @@ fun EveryEmployeeCard(emp: EmployeeCard, onCardClick: () -> Unit) { object EmployeesData { val employeesCardData = listOf( - EmployeeCard( + EmployeeInfo( "Ivanov Ivan", "Android-developer", "In office", - "https://wampi.ru/image/R9C6OC7" + "https://wampi.ru/image/R9C6OC7", + "", + "", + "" ), - EmployeeCard( + EmployeeInfo( "Smirnov Andrey", "UI/UX Designer", "Will be today", - "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png" + "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png", + "", + "", + "" ), - EmployeeCard( + EmployeeInfo( "Vasiliev Vasiliy", "HR", "No bookings", - "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png" + "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png", + "", + "", + "" ) ) val showedEmployeesCardData = listOf( - EmployeeCard( + EmployeeInfo( "Смирнов Андрей", "UI/UX Designer", "Будет сегодня", - "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png" + "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png", //MainRes.images.logo_default + "", + "", + "" ), - EmployeeCard( + EmployeeInfo( "Васильев Василий", "HR", "Нет бронирований", - "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png" + "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png", + "", + "", + "" ), - EmployeeCard( + EmployeeInfo( "Иванов Иван", "Android-developer", "В офисе", - "https://www.kasandbox.org/programming-images/avatars/leaf-green.png" + "https://www.kasandbox.org/programming-images/avatars/leaf-green.png", + "", + "", + "" ) ) } \ No newline at end of file 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 3927c3d0..36089bc6 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,42 @@ package band.effective.office.elevator.ui.employee.allEmployee.store +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.utils.changeEmployeeShowedList +import band.effective.office.elevator.utils.convertEmployeeInfoListToEmployeeCard 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.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 = EmployeesData.employeesCardData//listOf() + var employeesNameFilter:String="" + @OptIn(ExperimentalMviKotlinApi::class) fun create(): EmployeeStore = object: EmployeeStore, Store by storeFactory.create( name="EmployeeStore", initialState = EmployeeStore.State( - changeShowedEmployeeCards = EmployeesData.employeesCardData + changeShowedEmployeeCards = convertEmployeeInfoListToEmployeeCard(employeesInfoList) ), + bootstrapper = coroutineBootstrapper { + launch(Dispatchers.IO) { + employeesInfo.invoke().collect{value->employeesInfoList} + } + launch { dispatch(EmployeeStoreFactory.Action.UpdateEmployeesInfo(employeesInfoList)) + }}, executorFactory = ::ExecutorImpl, reducer = ReducerIMPL @@ -24,15 +44,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{ + data class UpdateEmployeesInfo(val employeesInfo: List): Action + } + 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 +68,28 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin } } + override fun executeAction( + action: EmployeeStoreFactory.Action, + getState: () -> EmployeeStore.State + ) { + when(action){ + is EmployeeStoreFactory.Action.UpdateEmployeesInfo->{ + employeesInfoList=action.employeesInfo//??? + 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) + changeShowedEmployeeCards = changeEmployeeShowedList(msg.query,convertEmployeeInfoListToEmployeeCard(msg.employeesInfo)) + ) } -// private fun changeEmployeeShowedList(query: String): List { -// return if(query.isEmpty()){ -// EmployeesData.employeesCardData -// }else { -// val compareString = query.filter { !it.isWhitespace() }.lowercase() -// val allEmployeesCards = EmployeesData.employeesCardData -// -// val showedEmployeesCards = allEmployeesCards.filter { it.name.filter { !it.isWhitespace() } -// .lowercase().contains(compareString) } -// -// -// showedEmployeesCards -// } -// } } + } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeesFormatConvertor.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeesFormatConvertor.kt new file mode 100644 index 00000000..a77c3163 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeesFormatConvertor.kt @@ -0,0 +1,17 @@ +package band.effective.office.elevator.utils + +import band.effective.office.elevator.domain.models.EmployeeInfo +import band.effective.office.elevator.ui.employee.allEmployee.EmployeeCard + +fun convertEmployeeInfoListToEmployeeCard(employeeInfo: List):List{ + var employeeCard: List = listOf() + employeeInfo.forEach { employeeInfo -> + employeeCard += EmployeeCard( + employeeInfo.name, + employeeInfo.post, + employeeInfo.state, + employeeInfo.logoUrl + ) + } + return employeeCard +} \ No newline at end of file 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 similarity index 63% rename from composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/nameCompareFounder.kt rename to composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/NameCompareFounder.kt index 53282f93..38bd462c 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/nameCompareFounder.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/NameCompareFounder.kt @@ -1,14 +1,14 @@ package band.effective.office.elevator.utils import band.effective.office.elevator.ui.employee.allEmployee.EmployeeCard -import band.effective.office.elevator.ui.employee.allEmployee.EmployeesData -fun changeEmployeeShowedList(query: String): List { +fun changeEmployeeShowedList(query: String, allEmployeesCards: List): List { return if(query.isEmpty()){ - EmployeesData.employeesCardData + //EmployeesData.employeesCardData + allEmployeesCards }else { val compareString = query.filter { !it.isWhitespace() }.lowercase() - val allEmployeesCards = EmployeesData.employeesCardData + //val allEmployeesCards = EmployeesData.employeesCardData val showedEmployeesCards = allEmployeesCards.filter { it.name.filter { !it.isWhitespace() } .lowercase().contains(compareString) } 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 index 805b919b..00a2f476 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/generateImageLoader.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/generateImageLoader.kt @@ -2,6 +2,6 @@ package band.effective.office.elevator.utils import com.seiko.imageloader.ImageLoader -fun generateImageLoader(): ImageLoader{ +fun generateImageLoader(): ImageLoader{//expect actual return ImageLoader { } } \ No newline at end of file -- GitLab From ce0d695e7f006f82daa49376e843d7121960982f Mon Sep 17 00:00:00 2001 From: Roman194 Date: Mon, 31 Jul 2023 11:42:43 +0600 Subject: [PATCH 07/10] Some cosmetic changes with Employees --- ...EmployeesFormatConvertor.kt => EmployeeFormatConvertor.kt} | 0 .../effective/office/elevator/utils/NameCompareFounder.kt | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/{EmployeesFormatConvertor.kt => EmployeeFormatConvertor.kt} (100%) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeesFormatConvertor.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeeFormatConvertor.kt similarity index 100% rename from composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeesFormatConvertor.kt rename to composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeeFormatConvertor.kt 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 index 38bd462c..3b63781d 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/NameCompareFounder.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/NameCompareFounder.kt @@ -4,11 +4,11 @@ import band.effective.office.elevator.ui.employee.allEmployee.EmployeeCard fun changeEmployeeShowedList(query: String, allEmployeesCards: List): List { return if(query.isEmpty()){ - //EmployeesData.employeesCardData + //convertEmployeeInfoListToEmployeeCard( EmployeesData.employeesCardData) allEmployeesCards }else { val compareString = query.filter { !it.isWhitespace() }.lowercase() - //val allEmployeesCards = EmployeesData.employeesCardData + //val allEmployeesCards = convertEmployeeInfoListToEmployeeCard( EmployeesData.employeesCardData) val showedEmployeesCards = allEmployeesCards.filter { it.name.filter { !it.isWhitespace() } .lowercase().contains(compareString) } -- GitLab From cd121a14944f8a3934f5983f2a383cf73e1948c8 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Tue, 1 Aug 2023 15:49:22 +0600 Subject: [PATCH 08/10] Some recommendations by the mentor were added to provide data from the domain layer to UI and to make more properly and readable code --- .../domain/repository/EmployeeRepository.kt | 4 +- .../repository/impl/EmployeeRepositoryImpl.kt | 73 ++++++++++--------- .../ui/employee/allEmployee/EmployeeScreen.kt | 35 +++++---- .../models/mappers/EmployeeCard.kt | 7 ++ .../models/mappers/converterToEmployeeCard.kt | 8 ++ .../allEmployee/store/EmployeeStore.kt | 5 +- .../allEmployee/store/EmployeeStoreFactory.kt | 31 +++++--- .../elevator/utils/EmployeeFormatConvertor.kt | 17 ----- .../elevator/utils/NameCompareFounder.kt | 19 +---- 9 files changed, 102 insertions(+), 97 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/models/mappers/EmployeeCard.kt create mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/models/mappers/converterToEmployeeCard.kt delete mode 100644 composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeeFormatConvertor.kt 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 index 354c820b..56e1e5da 100644 --- 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 @@ -1,9 +1,9 @@ package band.effective.office.elevator.domain.repository import band.effective.office.elevator.domain.models.EmployeeInfo -import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.Flow interface EmployeeRepository { - suspend fun getEmployeesInfo(): StateFlow> + 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 index 9b203e22..5c20e745 100644 --- 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 @@ -2,43 +2,48 @@ 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.MutableStateFlow +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow + class EmployeeRepositoryImpl: EmployeeRepository{//private val api:EmployeeRepository: EmployeeRepository - private val employList = MutableStateFlow(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", - "", - "", - "" - )) - ) - override suspend fun getEmployeesInfo(): MutableStateFlow> { - //employList.update { api.getEmployeesInfo().collect(employList)} - return employList - } + 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/ui/employee/allEmployee/EmployeeScreen.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt index e566c7f3..f97de89b 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 @@ -27,7 +27,6 @@ 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 @@ -52,6 +51,7 @@ import band.effective.office.elevator.theme_light_background import band.effective.office.elevator.theme_light_onBackground 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.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 @@ -60,23 +60,14 @@ import com.seiko.imageloader.rememberAsyncImagePainter 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: String -) - @Composable fun EmployeeScreen(component: EmployeeComponent) { val employState by component.employState.collectAsState() val employeesData = employState.changeShowedEmployeeCards - val employeesCount = employeesData.count() - val employeesInOfficeCount = employeesData.filter{it.state=="In office"}.count() - val userMessageState = remember { mutableStateOf("") } - + val employeesCount = employState.countShowedEmployeeCards + val employeesInOfficeCount = employState.countInOfficeShowedEmployeeCards + val userMessageState = employState.query LaunchedEffect(component) { @@ -98,9 +89,9 @@ 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 ) { @@ -120,8 +111,7 @@ fun EmployeeScreenContent( modifier = Modifier.padding(20.dp, 55.dp, 15.dp, 25.dp) ) TextField( - value = userMessageState.value, onValueChange = { - userMessageState.value = it + value = userMessageState, onValueChange = { onTextFieldUpdate(it) }, modifier = Modifier .fillMaxWidth() @@ -352,4 +342,13 @@ object EmployeesData { "" ) ) + 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 00000000..e343e409 --- /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 00000000..2095c433 --- /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 6aff3dd3..b3b14671 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.allEmployee.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 36089bc6..f5db73f1 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 @@ -4,8 +4,8 @@ package band.effective.office.elevator.ui.employee.allEmployee.store 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 band.effective.office.elevator.utils.convertEmployeeInfoListToEmployeeCard import com.arkivanov.mvikotlin.core.store.Reducer import com.arkivanov.mvikotlin.core.store.Store import com.arkivanov.mvikotlin.core.store.StoreFactory @@ -14,6 +14,8 @@ 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 @@ -22,20 +24,26 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin private val employeesInfo:EmployeeUseCase by inject() - var employeesInfoList:List = EmployeesData.employeesCardData//listOf() + 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 = convertEmployeeInfoListToEmployeeCard(employeesInfoList) + 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{value->employeesInfoList} + employeesInfo.invoke().collect{newList->_employList.value=newList} } - launch { dispatch(EmployeeStoreFactory.Action.UpdateEmployeesInfo(employeesInfoList)) + launch { dispatch(EmployeeStoreFactory.Action.UpdateEmployeesInfo) }}, executorFactory = ::ExecutorImpl, reducer = ReducerIMPL @@ -47,7 +55,7 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin data class UpdateEmployees(val query: String, val employeesInfo:List): Msg } private sealed interface Action{ - data class UpdateEmployeesInfo(val employeesInfo: List): Action + object UpdateEmployeesInfo: Action//val employeesInfo: List } private inner class ExecutorImpl : @@ -74,7 +82,7 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin ) { when(action){ is EmployeeStoreFactory.Action.UpdateEmployeesInfo->{ - employeesInfoList=action.employeesInfo//??? + employeesInfoList=employList.value dispatch(Msg.UpdateEmployees(query = employeesNameFilter, employeesInfo = employeesInfoList))//i need intent.query there so i made special variable } } @@ -84,8 +92,13 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin private object ReducerIMPL: Reducer { override fun EmployeeStore.State.reduce(msg: Msg): EmployeeStore.State = when(msg){ - is Msg.UpdateEmployees -> copy( - changeShowedEmployeeCards = changeEmployeeShowedList(msg.query,convertEmployeeInfoListToEmployeeCard(msg.employeesInfo)) + 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 ) } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeeFormatConvertor.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeeFormatConvertor.kt deleted file mode 100644 index a77c3163..00000000 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/EmployeeFormatConvertor.kt +++ /dev/null @@ -1,17 +0,0 @@ -package band.effective.office.elevator.utils - -import band.effective.office.elevator.domain.models.EmployeeInfo -import band.effective.office.elevator.ui.employee.allEmployee.EmployeeCard - -fun convertEmployeeInfoListToEmployeeCard(employeeInfo: List):List{ - var employeeCard: List = listOf() - employeeInfo.forEach { employeeInfo -> - employeeCard += EmployeeCard( - employeeInfo.name, - employeeInfo.post, - employeeInfo.state, - employeeInfo.logoUrl - ) - } - return employeeCard -} \ No newline at end of file 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 index 3b63781d..e4cc85d1 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/NameCompareFounder.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/utils/NameCompareFounder.kt @@ -1,19 +1,6 @@ package band.effective.office.elevator.utils -import band.effective.office.elevator.ui.employee.allEmployee.EmployeeCard +import band.effective.office.elevator.ui.employee.allEmployee.models.mappers.EmployeeCard -fun changeEmployeeShowedList(query: String, allEmployeesCards: List): List { - return if(query.isEmpty()){ - //convertEmployeeInfoListToEmployeeCard( EmployeesData.employeesCardData) - allEmployeesCards - }else { - val compareString = query.filter { !it.isWhitespace() }.lowercase() - //val allEmployeesCards = convertEmployeeInfoListToEmployeeCard( EmployeesData.employeesCardData) - - val showedEmployeesCards = allEmployeesCards.filter { it.name.filter { !it.isWhitespace() } - .lowercase().contains(compareString) } - - - showedEmployeesCards - } -} \ No newline at end of file +fun changeEmployeeShowedList(query: String, allEmployeesCards: List): List = + allEmployeesCards.filter{ it.name.lowercase().contains(query.lowercase())} -- GitLab From cc8a57adf42afaa1a48fb32379f0a088c228bcff Mon Sep 17 00:00:00 2001 From: Roman194 Date: Tue, 1 Aug 2023 15:56:55 +0600 Subject: [PATCH 09/10] EmployeeScreen was cosmetically modified --- .../office/elevator/ui/employee/allEmployee/EmployeeScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 f97de89b..7fb1eee4 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 @@ -57,6 +57,7 @@ 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 @@ -236,7 +237,7 @@ fun EveryEmployeeCard(emp: EmployeeCard, onCardClick: () -> Unit) { } val painter = rememberAsyncImagePainter(request) Image( - painter = painter, + painter = painterResource(MainRes.images.logo_default), contentDescription = "Employee logo", modifier = Modifier .clip(CircleShape) -- GitLab From f8bb828e54119dd8b0b43b30a45cbd139b86dee0 Mon Sep 17 00:00:00 2001 From: Roman194 Date: Thu, 3 Aug 2023 18:49:25 +0600 Subject: [PATCH 10/10] Some cosmetic changes in AllEmployee after PR Review --- .../domain/repository/EmployeeRepository.kt | 2 +- .../repository/impl/EmployeeRepositoryImpl.kt | 16 +++- .../ui/employee/allEmployee/EmployeeScreen.kt | 86 ++----------------- .../allEmployee/store/EmployeeStoreFactory.kt | 18 ++-- 4 files changed, 28 insertions(+), 94 deletions(-) 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 index 56e1e5da..a5fb8f53 100644 --- 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 @@ -4,6 +4,6 @@ import band.effective.office.elevator.domain.models.EmployeeInfo import kotlinx.coroutines.flow.Flow interface EmployeeRepository { - suspend fun getEmployeesInfo(): Flow>//State + suspend fun getEmployeesInfo(): Flow> } \ 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 index 5c20e745..3ab9a5f6 100644 --- 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 @@ -6,9 +6,19 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow -class EmployeeRepositoryImpl: EmployeeRepository{//private val api:EmployeeRepository: EmployeeRepository - - override suspend fun getEmployeesInfo(): Flow> {//State +class EmployeeRepositoryImpl: EmployeeRepository{ + object EmployeesData { + val initial=listOf( + EmployeeInfo( + "", + "", + "", + "", + "", + "", + "")) + } + override suspend fun getEmployeesInfo(): Flow> { return flow> { emit( listOf( 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 7fb1eee4..0d6a506c 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 @@ -44,7 +44,6 @@ 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 @@ -57,7 +56,6 @@ 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 @@ -101,7 +99,7 @@ fun EmployeeScreenContent( Column( modifier = Modifier .background(theme_light_onPrimary) - .padding(0.dp, 0.dp, 0.dp, 15.dp) + .padding(bottom = 15.dp) .fillMaxWidth() ) { Text( @@ -109,7 +107,7 @@ fun EmployeeScreenContent( fontSize = 20.sp, fontWeight = FontWeight(600),//? color = theme_light_tertiary_color, - modifier = Modifier.padding(20.dp, 55.dp, 15.dp, 25.dp) + modifier = Modifier.padding(start = 20.dp, top = 55.dp, end = 15.dp, bottom = 25.dp) ) TextField( value = userMessageState, onValueChange = { @@ -117,7 +115,7 @@ fun EmployeeScreenContent( }, modifier = Modifier .fillMaxWidth() .height(70.dp) - .padding(20.dp, 10.dp, 20.dp, 5.dp), + .padding(start = 20.dp, top = 10.dp, end = 20.dp, bottom = 5.dp), textStyle = TextStyle( color = theme_light_tertiary_color, fontSize = 16.sp, @@ -154,9 +152,9 @@ fun EmployeeScreenContent( modifier = Modifier .background(theme_light_onBackground) .fillMaxSize() - .padding(20.dp, 25.dp, 20.dp, 0.dp) + .padding(start = 20.dp, top = 25.dp, end = 20.dp) ) { - Row(modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 25.dp).fillMaxWidth()) { + Row(modifier = Modifier.padding(bottom = 25.dp).fillMaxWidth()) { Text( text = stringResource(MainRes.strings.employees) + " ", fontSize = 16.sp, @@ -219,7 +217,7 @@ fun EveryEmployeeCard(emp: EmployeeCard, onCardClick: () -> Unit) { shape = RoundedCornerShape(12.dp), modifier = Modifier .fillMaxSize() - .padding(0.dp,0.dp,0.dp,15.dp) + .padding(bottom=15.dp) .animateContentSize() .clickable { isExpanded = !isExpanded }, color = theme_light_onPrimary @@ -281,75 +279,3 @@ fun EveryEmployeeCard(emp: EmployeeCard, onCardClick: () -> Unit) { } } } - - -object EmployeesData { - val employeesCardData = 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", - "", - "", - "" - ) - ) - val showedEmployeesCardData = listOf( - EmployeeInfo( - "Смирнов Андрей", - "UI/UX Designer", - "Будет сегодня", - "https://www.kasandbox.org/programming-images/avatars/leaf-grey.png", - //MainRes.images.logo_default - "", - "", - "" - ), - EmployeeInfo( - "Васильев Василий", - "HR", - "Нет бронирований", - "https://www.kasandbox.org/programming-images/avatars/leaf-blue.png", - "", - "", - "" - ), - EmployeeInfo( - "Иванов Иван", - "Android-developer", - "В офисе", - "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/store/EmployeeStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStoreFactory.kt index f5db73f1..bb3b10dc 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 @@ -2,8 +2,8 @@ package band.effective.office.elevator.ui.employee.allEmployee.store import band.effective.office.elevator.domain.models.EmployeeInfo +import band.effective.office.elevator.domain.repository.impl.EmployeeRepositoryImpl 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 @@ -24,8 +24,7 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin private val employeesInfo:EmployeeUseCase by inject() - var employeesInfoList:List = listOf() - private val _employList = MutableStateFlow(EmployeesData.initial) + private val _employList = MutableStateFlow(EmployeeRepositoryImpl.EmployeesData.initial) val employList=_employList.asStateFlow() var employeesNameFilter:String="" @OptIn(ExperimentalMviKotlinApi::class) @@ -33,9 +32,9 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin object: EmployeeStore, Store by storeFactory.create( name="EmployeeStore", initialState = EmployeeStore.State( - changeShowedEmployeeCards = employeesInfoList.map(EmployeeInfo::toUI), - countShowedEmployeeCards =employeesInfoList.count().toString(), - countInOfficeShowedEmployeeCards = employeesInfoList.filter {it.state=="In office"}.count().toString(), + changeShowedEmployeeCards = employList.value.map(EmployeeInfo::toUI), + countShowedEmployeeCards = employList.value.count().toString(), + countInOfficeShowedEmployeeCards = employList.value.filter {it.state=="In office"}.count().toString(), query=employeesNameFilter ), @@ -55,7 +54,7 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin data class UpdateEmployees(val query: String, val employeesInfo:List): Msg } private sealed interface Action{ - object UpdateEmployeesInfo: Action//val employeesInfo: List + object UpdateEmployeesInfo: Action } private inner class ExecutorImpl : @@ -65,7 +64,7 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin is EmployeeStore.Intent.OnTextFieldUpdate -> { scope.launch { employeesNameFilter=intent.query - dispatch(Msg.UpdateEmployees(query = employeesNameFilter, employeesInfo = employeesInfoList))//employeesInfoList + dispatch(Msg.UpdateEmployees(query = employeesNameFilter, employeesInfo = employList.value)) } } EmployeeStore.Intent.OnClickOnEmployee ->{ @@ -82,8 +81,7 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin ) { 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 + dispatch(Msg.UpdateEmployees(query = employeesNameFilter, employeesInfo = employList.value))//i need intent.query there so i made special variable } } } -- GitLab