diff --git a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/ui/UIPreview.kt b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/ui/UIPreview.kt index 331d929f94e30c180af7e9eb53630012e5547566..1517eaea89608d248a301492fdbba6df6b51e2d5 100644 --- a/composeApp/src/androidMain/kotlin/band/effective/office/elevator/ui/UIPreview.kt +++ b/composeApp/src/androidMain/kotlin/band/effective/office/elevator/ui/UIPreview.kt @@ -5,6 +5,6 @@ import androidx.compose.ui.tooling.preview.Preview @Preview @Composable -fun EmployeesScreenPreview(){ +fun EmployeesScreenPreview() { //EmployeeScreen() } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/EffectiveOutlinedButton.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/EffectiveOutlinedButton.kt new file mode 100644 index 0000000000000000000000000000000000000000..d3d2246f756642a98f49459228b992d7c76deb91 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/EffectiveOutlinedButton.kt @@ -0,0 +1,59 @@ +package band.effective.office.elevator.components + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedButton +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import band.effective.office.elevator.MainRes +import dev.icerock.moko.resources.ImageResource +import dev.icerock.moko.resources.StringResource +import dev.icerock.moko.resources.compose.painterResource +import dev.icerock.moko.resources.compose.stringResource + +@Composable +fun EffectiveOutlinedButton(icon : ImageResource?, text: StringResource?, onClick:()->Unit, modifier: Modifier){ + OutlinedButton( + onClick = onClick, + shape = RoundedCornerShape(size = 8.dp), + border = BorderStroke(1.dp, MaterialTheme.colors.secondary), + modifier = modifier + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + icon?.let{ + if(icon ==MainRes.images.spb_icon){ + Image( + painter = painterResource(icon), + contentDescription = null, + modifier = Modifier.size(24.dp) + ) + }else{ + Icon( + painter = painterResource(icon), + contentDescription = null, + tint = MaterialTheme.colors.secondary, + modifier = Modifier.size(24.dp) + ) + } + } + text?.let { + Text( + stringResource(text), + style = MaterialTheme.typography.body2, + color = MaterialTheme.colors.secondary, + modifier = Modifier.padding(start = 8.dp) + ) + } + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/InfoAboutUserUIComponent.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/InfoAboutUserUIComponent.kt new file mode 100644 index 0000000000000000000000000000000000000000..0b68b74bd7ad0d8fd95d69cb9442cbd031814bbf --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/InfoAboutUserUIComponent.kt @@ -0,0 +1,32 @@ +package band.effective.office.elevator.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp + +@Composable +fun InfoAboutUserUIComponent(userName:String?, post:String?){ + Column{ + userName?.let{ + Text( + text = it, + style = MaterialTheme.typography.subtitle1, + color = Color.Black + ) + } + Spacer(modifier = Modifier.height(8.dp)) + post?.let{ + Text( + text = it, + style = MaterialTheme.typography.subtitle1, + color = Color.Black + ) + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/SeatTitle.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/SeatTitle.kt new file mode 100644 index 0000000000000000000000000000000000000000..d6e6c22fe25a558dca43e4ddc9025cb86ef6ceae --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/components/SeatTitle.kt @@ -0,0 +1,49 @@ +package band.effective.office.elevator.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width +import androidx.compose.material.Divider +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import band.effective.office.elevator.ui.models.ReservedSeat + +@Composable +fun SeatTitle(seat: ReservedSeat) { + Column { + Text( + text = seat.seatName, + fontSize = 15.sp, + color = Color.Black + ) + Spacer(modifier = Modifier.height(12.dp)) + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = seat.bookingDay, + fontSize = 15.sp, + color = Color.Black + ) + Divider( + modifier = Modifier + .width(19.dp) + .rotate(90f), + thickness = 2.dp, + ) + Text( + text = seat.bookingTime, + fontSize = 15.sp, + color = Color.Black + ) + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/content/Content.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/content/Content.kt index b7cefee2f3b10571a749b251e70ed06d6aee15ed..927accf4e30e671ac57d9f8e74116b4246361766 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/content/Content.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/content/Content.kt @@ -15,10 +15,9 @@ import band.effective.office.elevator.navigation.EmployeesTab import band.effective.office.elevator.navigation.MainTab import band.effective.office.elevator.navigation.ProfileTab import band.effective.office.elevator.ui.booking.BookingScreen -import band.effective.office.elevator.ui.employee.EmployeeScreen +import band.effective.office.elevator.ui.employee.Employee import band.effective.office.elevator.ui.main.MainScreen import band.effective.office.elevator.ui.profile.Profile -import band.effective.office.elevator.ui.profile.mainProfile.ProfileScreen import com.arkivanov.decompose.extensions.compose.jetbrains.stack.Children import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.Direction import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.StackAnimation @@ -27,8 +26,6 @@ import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.isEn import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.slide import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.stackAnimation import com.arkivanov.decompose.extensions.compose.jetbrains.subscribeAsState -import com.arkivanov.decompose.router.children.children -import com.arkivanov.decompose.router.stack.childStack @Composable fun Content (component: ContentComponent) { @@ -47,7 +44,7 @@ fun Content (component: ContentComponent) { is ContentComponent.Child.Main -> MainScreen(child.component) is ContentComponent.Child.Profile -> Profile(child.component) is ContentComponent.Child.Booking -> BookingScreen(child.component) - is ContentComponent.Child.Employee -> EmployeeScreen(child.component) + is ContentComponent.Child.Employee -> Employee(child.component) } } } diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/content/ContentComponent.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/content/ContentComponent.kt index 8286002775123e0c4e79b4e26fa3bfddf0299424..d09eb551dd7b6bcf07232069442c8cc773d9b441 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/content/ContentComponent.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/content/ContentComponent.kt @@ -1,7 +1,8 @@ package band.effective.office.elevator.ui.content import band.effective.office.elevator.ui.booking.BookingComponent -import band.effective.office.elevator.ui.employee.EmployeeComponent +import band.effective.office.elevator.ui.employee.FullEmployeeComponent +import band.effective.office.elevator.ui.employee.allEmployee.EmployeeComponent import band.effective.office.elevator.ui.main.MainComponent import band.effective.office.elevator.ui.profile.ProfileComponent import com.arkivanov.decompose.ComponentContext @@ -39,7 +40,7 @@ class ContentComponent( ) ) is Config.Booking -> Child.Booking(BookingComponent(componentContext, storeFactory)) - is Config.Employee -> Child.Employee(EmployeeComponent(componentContext, storeFactory)) + is Config.Employee -> Child.Employee(FullEmployeeComponent(componentContext, storeFactory)) } fun onOutput(output: Output) { @@ -59,7 +60,7 @@ class ContentComponent( class Booking(val component: BookingComponent): Child() - class Employee(val component: EmployeeComponent): Child() + class Employee(val component: FullEmployeeComponent): Child() } private sealed interface Config : Parcelable { 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 new file mode 100644 index 0000000000000000000000000000000000000000..9b2bf224c10e90b474ebbbf4dc2b92678755db71 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/Employee.kt @@ -0,0 +1,22 @@ +package band.effective.office.elevator.ui.employee + +import androidx.compose.runtime.Composable +import band.effective.office.elevator.ui.employee.aboutEmployee.AboutEmployee +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 +import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.scale +import com.arkivanov.decompose.extensions.compose.jetbrains.stack.animation.stackAnimation + +@Composable +fun Employee (component: FullEmployeeComponent){ + Children( + stack = component.childStack, + animation = stackAnimation(fade() + scale()), + ){ + when(val child = it.instance){ + is FullEmployeeComponent.Child.AllEmployeeChild -> EmployeeScreen(child.component) + is FullEmployeeComponent.Child.AboutEmployeeChild -> AboutEmployee(child.component) + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/FullEmployeeComponent.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/FullEmployeeComponent.kt new file mode 100644 index 0000000000000000000000000000000000000000..5a650bf44e9676cb38a10e4f2f1d407ddf56f68b --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/FullEmployeeComponent.kt @@ -0,0 +1,77 @@ +package band.effective.office.elevator.ui.employee + +import band.effective.office.elevator.ui.employee.aboutEmployee.AboutEmployeeComponent +import band.effective.office.elevator.ui.employee.allEmployee.EmployeeComponent +import com.arkivanov.decompose.ComponentContext +import com.arkivanov.decompose.router.stack.ChildStack +import com.arkivanov.decompose.router.stack.StackNavigation +import com.arkivanov.decompose.router.stack.bringToFront +import com.arkivanov.decompose.router.stack.childStack +import com.arkivanov.decompose.router.stack.replaceAll +import com.arkivanov.decompose.value.Value +import com.arkivanov.essenty.parcelable.Parcelable +import com.arkivanov.essenty.parcelable.Parcelize +import com.arkivanov.mvikotlin.core.store.StoreFactory + +class FullEmployeeComponent ( + componentContext: ComponentContext, + private val storeFactory: StoreFactory) : + ComponentContext by componentContext { + + private val navigation = StackNavigation() + + private val stack = childStack( + source = navigation, + initialStack = { listOf(Config.AllEmployee) }, + childFactory = ::child, + handleBackButton = true + ) + + val childStack: Value> = stack + + private fun child(config: Config, componentContext: ComponentContext):Child = + when(config){ + is Config.AllEmployee -> Child.AllEmployeeChild( + EmployeeComponent( + componentContext, + storeFactory, + ::employeeOutput + ) + ) + + is Config.AboutEmployee -> Child.AboutEmployeeChild( + AboutEmployeeComponent( + componentContext, + storeFactory, + ::employeeOutput + ) + ) + } + + private fun employeeOutput(output: EmployeeComponent.Output) { + when(output){ + is EmployeeComponent.Output.OpenProfileScreen -> navigation.bringToFront(Config.AboutEmployee) + is EmployeeComponent.Output.OpenNewListOfEmployees -> TODO()//unused + } + } + + private fun employeeOutput(output: AboutEmployeeComponent.Output) { + when(output){ + is AboutEmployeeComponent.Output.OpenAllEmployee -> navigation.replaceAll(Config.AllEmployee) + is AboutEmployeeComponent.Output.OpenMap -> TODO() + } + } + + sealed class Child{ + class AllEmployeeChild(val component: EmployeeComponent) : Child() + class AboutEmployeeChild(val component: AboutEmployeeComponent): Child() + } + + sealed class Config: Parcelable { + @Parcelize + object AllEmployee: Config() + + @Parcelize + object AboutEmployee: Config() + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt new file mode 100644 index 0000000000000000000000000000000000000000..756c21669b6bb3000f0f2edc67ce33851200b737 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployee.kt @@ -0,0 +1,156 @@ +package band.effective.office.elevator.ui.employee.aboutEmployee + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.dp +import band.effective.office.elevator.MainRes +import band.effective.office.elevator.components.EffectiveOutlinedButton +import band.effective.office.elevator.components.InfoAboutUserUIComponent +import band.effective.office.elevator.components.TitlePage +import band.effective.office.elevator.ui.employee.aboutEmployee.components.BookingCardUser +import band.effective.office.elevator.ui.employee.aboutEmployee.components.ContactUserUIComponent +import band.effective.office.elevator.ui.employee.aboutEmployee.store.AboutEmployeeStore +import band.effective.office.elevator.ui.models.ReservedSeat +import dev.icerock.moko.resources.compose.painterResource +import dev.icerock.moko.resources.compose.stringResource + +@Composable +fun AboutEmployee (component: AboutEmployeeComponent){ + val state by component.state.collectAsState() + + AboutEmployeeContent( + imageUrl = state.user.imageUrl, + userName = state.user.userName, + post = state.user.post, + telegram = state.user.telegram, + email = state.user.email, + reservedSeats = state.reservedSeats, + onClickOpenMap = {component.onOutput(AboutEmployeeComponent.Output.OpenMap)}, + onClickOpenPhone = { component.onEvent(AboutEmployeeStore.Intent.TelephoneClicked) }, + onClickOpenTelegram = { component.onEvent(AboutEmployeeStore.Intent.TelegramClicked) }, + onClickOpenSpb = { component.onEvent(AboutEmployeeStore.Intent.TransferMoneyClicked) }, + onClickBack = {component.onOutput(AboutEmployeeComponent.Output.OpenAllEmployee)} + ) +} + +@Composable +private fun AboutEmployeeContent( + imageUrl: String?, + userName: String?, + post: String?, + telegram: String?, + email: String?, + reservedSeats: List, + onClickBack: () -> Unit, + onClickOpenMap: () ->Unit, + onClickOpenPhone: () ->Unit, + onClickOpenTelegram: () ->Unit, + onClickOpenSpb: () ->Unit +){ + Column(modifier = Modifier.fillMaxSize()){ + Column( + modifier = Modifier.background(Color.White).padding(top = 40.dp, bottom = 24.dp).padding(horizontal = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top + ){ + Row ( verticalAlignment = Alignment.CenterVertically,horizontalArrangement = Arrangement.Start, modifier = Modifier.fillMaxWidth()) { + IconButton(onClick = onClickBack){ + Icon( + painter = painterResource(MainRes.images.back_button), + contentDescription = null, + tint = Color.Black + ) + } + TitlePage( + title = stringResource(MainRes.strings.about_the_employee), + modifier = Modifier.align(Alignment.CenterVertically).padding(start = 16.dp) + ) + } + + Row(modifier = Modifier.padding(top = 24.dp)){ + Column { + InfoAboutUserUIComponent(userName,post) + ContactUserUIComponent(MainRes.images.icon_telegram, telegram, modifier = Modifier.padding(top = 18.dp)) + ContactUserUIComponent(MainRes.images.mail, email, modifier = Modifier.padding(top = 10.dp)) + } + Spacer(modifier = Modifier.weight(.1f)) + Surface( + modifier = Modifier.size(88.dp), + shape = CircleShape, + color = Color(0xFFEBE4FF) + ) { + Image( + modifier = Modifier.fillMaxSize(), + painter = painterResource(MainRes.images.job_icon), + contentScale = ContentScale.Inside, + contentDescription = null, + ) + } + } + + Row(modifier = Modifier.padding(top = 16.dp).fillMaxWidth(), horizontalArrangement = Arrangement.Start){ + EffectiveOutlinedButton( + MainRes.images.icon_call, + text = null, + onClick = onClickOpenPhone, + modifier = Modifier.padding(end = 8.dp) + ) + EffectiveOutlinedButton( + MainRes.images.icon_telegram, + text = null, + onClick = onClickOpenTelegram, + modifier = Modifier.padding(end = 8.dp) + ) + EffectiveOutlinedButton( + MainRes.images.spb_icon, + text = MainRes.strings.transfer, + onClick = onClickOpenSpb, + modifier = Modifier.padding(end = 8.dp) + ) + } + } + Column( + modifier = Modifier.background(MaterialTheme.colors.onBackground), + ) { + Text( + text = stringResource(MainRes.strings.upcoming_bookings), + style = MaterialTheme.typography.body1, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 24.dp) + ) + LazyColumn ( + modifier = Modifier.fillMaxSize().padding(horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(18.dp) + ) { + items(reservedSeats) { seat -> + BookingCardUser( + seat, + onClickOpenMap + ) + } + } + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployeeComponent.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployeeComponent.kt new file mode 100644 index 0000000000000000000000000000000000000000..0f6d51469f0d74826326e9068d294028c8e81a53 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/AboutEmployeeComponent.kt @@ -0,0 +1,41 @@ +package band.effective.office.elevator.ui.employee.aboutEmployee + +import band.effective.office.elevator.ui.employee.aboutEmployee.store.AboutEmployeeStore +import band.effective.office.elevator.ui.employee.aboutEmployee.store.AboutEmployeeStoreFactory +import band.effective.office.elevator.ui.employee.allEmployee.EmployeeComponent +import com.arkivanov.decompose.ComponentContext +import com.arkivanov.mvikotlin.core.instancekeeper.getStore +import com.arkivanov.mvikotlin.core.store.StoreFactory +import com.arkivanov.mvikotlin.extensions.coroutines.stateFlow +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.StateFlow + + +class AboutEmployeeComponent( + componentContext: ComponentContext, + storeFactory: StoreFactory, + private val output: (Output) -> Unit +) : + ComponentContext by componentContext { + + private val aboutEmployeeStore = instanceKeeper.getStore { + AboutEmployeeStoreFactory( + storeFactory = storeFactory + ).create() + } + + @OptIn(ExperimentalCoroutinesApi::class) + val state: StateFlow = aboutEmployeeStore.stateFlow + + fun onEvent(event: AboutEmployeeStore.Intent) { + aboutEmployeeStore.accept(event) + } + fun onOutput(output: Output){ + output(output) + } + sealed interface Output { + object OpenMap : Output + object OpenAllEmployee : Output + } + +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/components/BookingCardUser.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/components/BookingCardUser.kt new file mode 100644 index 0000000000000000000000000000000000000000..a91a70803cbbc81ccaf5b34b4487d35d95581447 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/components/BookingCardUser.kt @@ -0,0 +1,55 @@ +package band.effective.office.elevator.ui.employee.aboutEmployee.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import band.effective.office.elevator.MainRes +import band.effective.office.elevator.components.EffectiveOutlinedButton +import band.effective.office.elevator.components.SeatTitle +import band.effective.office.elevator.ui.main.components.SeatIcon +import band.effective.office.elevator.ui.models.ReservedSeat + +@Composable +fun BookingCardUser( + seat: ReservedSeat, + onClickShowMap: () -> Unit, +) { + Column( + modifier = Modifier + .clip(RoundedCornerShape(16.dp)) + .background(Color.White) + .padding(horizontal = 16.dp, vertical = 24.dp) + .fillMaxWidth() + ) { + Row { + SeatIcon() + Spacer(modifier = Modifier.width(12.dp)) + SeatTitle(seat) + } + Spacer(modifier = Modifier.height(24.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceAround + ) { + EffectiveOutlinedButton( + icon = null, + text = MainRes.strings.show_map, + onClickShowMap, + modifier = Modifier.fillMaxWidth() + ) + } + } +} + diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/components/ContactUserUIComponent.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/components/ContactUserUIComponent.kt new file mode 100644 index 0000000000000000000000000000000000000000..e26110f228f787f0d6f6a759152d05a3829daddd --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/components/ContactUserUIComponent.kt @@ -0,0 +1,34 @@ +package band.effective.office.elevator.ui.employee.aboutEmployee.components + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import band.effective.office.elevator.textInBorderPurple +import dev.icerock.moko.resources.ImageResource +import dev.icerock.moko.resources.compose.painterResource + +@Composable +fun ContactUserUIComponent(image:ImageResource, value: String?, modifier: Modifier){ + Row(modifier = modifier){ + Icon( + painter = painterResource(image), + contentDescription = null, + modifier = Modifier.size(16.dp), + tint = textInBorderPurple + ) + value?.let{ + Text( + text = it, + style = MaterialTheme.typography.caption, + color = textInBorderPurple, + modifier = Modifier.padding(start = 8.dp) + ) + } + } +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStore.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStore.kt new file mode 100644 index 0000000000000000000000000000000000000000..478ce0d3c8aa198a42cbe296d61f1c8da2198404 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStore.kt @@ -0,0 +1,22 @@ +package band.effective.office.elevator.ui.employee.aboutEmployee.store + +import band.effective.office.elevator.ui.employee.aboutEmployee.store.AboutEmployeeStore.* +import band.effective.office.elevator.ui.models.ReservedSeat +import band.effective.office.elevator.ui.models.User +import com.arkivanov.mvikotlin.core.store.Store + +interface AboutEmployeeStore : Store{ + + sealed interface Intent { + object TelephoneClicked : Intent + object TelegramClicked : Intent + object BackClicked : Intent + object TransferMoneyClicked: Intent + } + + data class State( + val user: User, + val reservedSeats: List + ) + +} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..b0a0a67764f6bddba013a78b767b795b980ac480 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/aboutEmployee/store/AboutEmployeeStoreFactory.kt @@ -0,0 +1,89 @@ +package band.effective.office.elevator.ui.employee.aboutEmployee.store + +import band.effective.office.elevator.ui.employee.aboutEmployee.store.AboutEmployeeStore.* +import band.effective.office.elevator.ui.models.ReservedSeat +import band.effective.office.elevator.ui.models.User +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.datetime.LocalDate +import kotlinx.datetime.Month +import org.koin.core.component.KoinComponent + +class AboutEmployeeStoreFactory(private val storeFactory: StoreFactory): KoinComponent { + + @OptIn(ExperimentalMviKotlinApi::class) + fun create(): AboutEmployeeStore = + object : AboutEmployeeStore, Store by storeFactory.create( + name = "AboutEmployeeStore", + initialState = State( + mokValueUser, + reservedSeats = mokValue + ), + bootstrapper = coroutineBootstrapper { + dispatch(Action.FetchUserInfo) + }, + executorFactory = ::ExecutorImpl, + reducer = ReducerImpl + ) {} + + private object ReducerImpl : Reducer { + override fun State.reduce(msg: Msg): State = + when (msg) { + is Msg.ProfileData -> copy(user = mokValueUser) + is Msg.UpdateSeatsReservation ->{ + val reservedSeats = mokValue + copy(reservedSeats = reservedSeats) + } + } + } + + private sealed interface Action { + object FetchUserInfo : Action + } + + private sealed interface Msg { + data class ProfileData(val user: User) : Msg + data class UpdateSeatsReservation(val reservedSeats: List) : Msg + } + + private inner class ExecutorImpl : + CoroutineExecutor(){ + override fun executeIntent(intent: Intent, getState: () ->State){ + when(intent){ + Intent.BackClicked -> TODO() + Intent.TelegramClicked -> TODO() + Intent.TelephoneClicked -> TODO() + Intent.TransferMoneyClicked -> TODO() + } + } + override fun executeAction(action: Action, getState: () -> State) { + when (action) { + Action.FetchUserInfo -> fetchUserInfo() + } + } + + private fun fetchUserInfo() { + + } + } +} + +private val mokValueUser = User("1","Ivanov Ivan", "Android-developer","67","@ivanov","employee@effective.com") +private val mokValue = listOf( + ReservedSeat( + seatName = "Рабочее масто А2", + bookingDay = "Пн, 1 июля", + bookingTime = "12:00 - 14:00", + bookingDate = LocalDate(month = Month.JULY, year = 2023, dayOfMonth = 16) + ), + ReservedSeat( + seatName = "Переговорная Sun", + bookingDay = "Вт, 2 июля", + bookingTime = "14:00 - 16:00", + bookingDate = LocalDate(month = Month.JULY, year = 2023, dayOfMonth = 17) + ), +) \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeComponent.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeComponent.kt similarity index 69% rename from composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeComponent.kt rename to composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeComponent.kt index 366df9945506d48d139236589f853712f23388a9..4209e8cf07001e78868a0b94a6fe513f339fcf2e 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeComponent.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeComponent.kt @@ -1,7 +1,7 @@ -package band.effective.office.elevator.ui.employee +package band.effective.office.elevator.ui.employee.allEmployee -import band.effective.office.elevator.ui.employee.store.EmployeeStore -import band.effective.office.elevator.ui.employee.store.EmployeeStoreFactory +import band.effective.office.elevator.ui.employee.allEmployee.store.EmployeeStore +import band.effective.office.elevator.ui.employee.allEmployee.store.EmployeeStoreFactory import com.arkivanov.decompose.ComponentContext import com.arkivanov.mvikotlin.core.instancekeeper.getStore import com.arkivanov.mvikotlin.core.store.StoreFactory @@ -13,7 +13,8 @@ import kotlinx.coroutines.flow.StateFlow class EmployeeComponent( componentContext: ComponentContext, - storeFactory: StoreFactory//private val + storeFactory: StoreFactory, + private val output: (Output) -> Unit ): ComponentContext by componentContext { private val employeeStore= instanceKeeper.getStore { @@ -26,15 +27,12 @@ class EmployeeComponent( val employState: StateFlow = employeeStore.stateFlow val employLabel: Flow = employeeStore.labels - fun onEvent(event:EmployeeStore.Intent){ + fun onEvent(event: EmployeeStore.Intent){ employeeStore.accept(event) } - fun onOutput(output:Output){ - when(output){ - is Output.OpenProfileScreen -> TODO() - is Output.OpenNewListOfEmployees -> TODO()//unused - } + fun onOutput(output: Output){ + output(output) } 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/allEmployee/EmployeeScreen.kt similarity index 98% rename from composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/EmployeeScreen.kt rename to composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/EmployeeScreen.kt index bf60493f25705f091038937483e1a9246fef1e70..a14f2b9fbc6aa4f6bbb1782ff5475b3b5df0325d 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/allEmployee/EmployeeScreen.kt @@ -51,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_primary_color 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 dev.icerock.moko.resources.ImageResource import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.stringResource diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/store/EmployeeStore.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStore.kt similarity index 70% rename from composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/store/EmployeeStore.kt rename to composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStore.kt index 334e847b81bd00fec24d53aa9a9d96c829c7997c..8747f475c9193879db07daf10643e943bb96235f 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/store/EmployeeStore.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStore.kt @@ -1,12 +1,12 @@ -package band.effective.office.elevator.ui.employee.store +package band.effective.office.elevator.ui.employee.allEmployee.store import band.effective.office.elevator.ui.employee.EmployeeCard import com.arkivanov.mvikotlin.core.store.Store interface EmployeeStore: Store { sealed interface Intent{ - data class OnTextFieldUpdate(val query: String):Intent - object OnClickOnEmployee:Intent + data class OnTextFieldUpdate(val query: String): Intent + object OnClickOnEmployee: Intent } data class State( diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/store/EmployeeStoreFactory.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStoreFactory.kt similarity index 92% rename from composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/store/EmployeeStoreFactory.kt rename to composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStoreFactory.kt index c11137ad1062a46af64eaed9a3aed7bc24d532ff..e7d454c4ac57c124a138ec137100444c0362a556 100644 --- a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/store/EmployeeStoreFactory.kt +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/employee/allEmployee/store/EmployeeStoreFactory.kt @@ -1,4 +1,5 @@ -package band.effective.office.elevator.ui.employee.store +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 @@ -10,11 +11,12 @@ import kotlinx.coroutines.launch import org.koin.core.component.KoinComponent internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):KoinComponent{ - fun create(): EmployeeStore= + fun create(): EmployeeStore = object: EmployeeStore, Store by storeFactory.create( name="EmployeeStore", initialState = EmployeeStore.State( - changeShowedEmployeeCards = EmployeesData.employeesCardData), + changeShowedEmployeeCards = EmployeesData.employeesCardData + ), executorFactory = ::ExecutorImpl, reducer = ReducerIMPL @@ -44,7 +46,7 @@ internal class EmployeeStoreFactory(private val storeFactory: StoreFactory):Koin } private object ReducerIMPL: Reducer { - override fun EmployeeStore.State.reduce(msg:Msg): EmployeeStore.State = + override fun EmployeeStore.State.reduce(msg: Msg): EmployeeStore.State = when(msg){ is Msg.UpdateEmployees -> copy( changeShowedEmployeeCards = changeEmployeeShowedList(msg.query) diff --git a/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/models/User.kt b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/models/User.kt new file mode 100644 index 0000000000000000000000000000000000000000..5b27765ca480ae807791cb5db9a62cdad0ca483c --- /dev/null +++ b/composeApp/src/commonMain/kotlin/band/effective/office/elevator/ui/models/User.kt @@ -0,0 +1,10 @@ +package band.effective.office.elevator.ui.models + +data class User( + val imageUrl: String?, + val userName: String?, + val post:String?, + val phoneNumber:String?, + val telegram: String?, + val email:String? +) diff --git a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml index 075a2704e2b3772bd2fad8f092aaf82c0b3dd23e..b52173119e565134f220e8405b51c8bc54439300 100644 --- a/composeApp/src/commonMain/resources/MR/base/strings_ru.xml +++ b/composeApp/src/commonMain/resources/MR/base/strings_ru.xml @@ -3,7 +3,7 @@ Office Elevator Авторизация через Google Что-то пошло не так. Пожалуйста попробуйте еще раз - + effective\noffice Поиск сотрудника В офисе @@ -25,6 +25,7 @@ +7 @ + Лифт Поднять @@ -74,4 +75,9 @@ Должность Номер телефона Сохранить + + + О сотруднике + Ближайшие бронирования + Перевод diff --git a/composeApp/src/commonMain/resources/MR/en/strings_en.xml b/composeApp/src/commonMain/resources/MR/en/strings_en.xml index f28b78b415ea5ab7a418ea7134583fb793c59285..a70e56b4bee47e695535c12dc7cf7a35ae3dcc0d 100644 --- a/composeApp/src/commonMain/resources/MR/en/strings_en.xml +++ b/composeApp/src/commonMain/resources/MR/en/strings_en.xml @@ -74,4 +74,9 @@ Post Telephone number Save + + + About the employee + Upcoming bookings + Transfer diff --git a/composeApp/src/commonMain/resources/MR/images/icon_call.svg b/composeApp/src/commonMain/resources/MR/images/icon_call.svg index 537fadf45fbf8809681dbc87d7c08ad1a9bd5ff9..16f928381e6fb5be42e308aaf19687343560169a 100644 --- a/composeApp/src/commonMain/resources/MR/images/icon_call.svg +++ b/composeApp/src/commonMain/resources/MR/images/icon_call.svg @@ -1,5 +1,5 @@ - + diff --git a/composeApp/src/commonMain/resources/MR/images/icon_telegram.svg b/composeApp/src/commonMain/resources/MR/images/icon_telegram.svg index b37ba759a15b85f36822e5f8be563b93ffd7e705..081aa0e496ef49debd770d828c9446b2c26a52f3 100644 --- a/composeApp/src/commonMain/resources/MR/images/icon_telegram.svg +++ b/composeApp/src/commonMain/resources/MR/images/icon_telegram.svg @@ -1,5 +1,5 @@ - + diff --git a/composeApp/src/commonMain/resources/MR/images/mail.svg b/composeApp/src/commonMain/resources/MR/images/mail.svg new file mode 100644 index 0000000000000000000000000000000000000000..dcdc586936eb925905a3e1cc12a6a8dfe4c35729 --- /dev/null +++ b/composeApp/src/commonMain/resources/MR/images/mail.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/composeApp/src/commonMain/resources/MR/images/spb_icon.svg b/composeApp/src/commonMain/resources/MR/images/spb_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..9e5ec7761967c28a3a764840b596881fed177d9c --- /dev/null +++ b/composeApp/src/commonMain/resources/MR/images/spb_icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + +