diff --git a/build.gradle b/build.gradle index 60811603f..8299261ab 100644 --- a/build.gradle +++ b/build.gradle @@ -12,8 +12,8 @@ buildscript { compileSdkVersion = 34 minSdkVersion = 21 targetSdkVersion = 34 - versionName = "3.4.2" - minVersionCode = 30402 + versionName = "3.4.3" + minVersionCode = 30403 } dependencies { diff --git a/business/build.gradle.kts b/business/build.gradle.kts index cd09af40d..7f52ac123 100644 --- a/business/build.gradle.kts +++ b/business/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { implementation(libs.coil) implementation(libs.coil.compose) implementation(libs.androidx.security.crypto) + implementation(libs.compose.numberPicker) implementation(project(mapOf("path" to ":domain"))) implementation(project(mapOf("path" to ":data"))) implementation(project(mapOf("path" to ":core"))) diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreen.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreen.kt index 6f4a7293f..44bda4267 100644 --- a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreen.kt +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreen.kt @@ -1,44 +1,398 @@ package `in`.koreatech.business.feature.insertstore.insertdetailinfo + +import androidx.compose.foundation.Image +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.PaddingValues +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.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel -import `in`.koreatech.koin.domain.model.owner.insertstore.StoreBasicInfo +import `in`.koreatech.business.feature.insertstore.insertdetailinfo.operatingTime.OperatingTimeState +import `in`.koreatech.business.feature.insertstore.selectcategory.InsertStoreProgressBar +import `in`.koreatech.business.ui.theme.ColorActiveButton +import `in`.koreatech.business.ui.theme.ColorDisabledButton +import `in`.koreatech.business.ui.theme.ColorMinor +import `in`.koreatech.business.ui.theme.ColorPrimary +import `in`.koreatech.business.ui.theme.ColorSecondary +import `in`.koreatech.koin.core.R +import `in`.koreatech.koin.core.toast.ToastUtil import org.orbitmvi.orbit.compose.collectAsState +import org.orbitmvi.orbit.compose.collectSideEffect @Composable fun InsertDetailInfoScreen( modifier: Modifier = Modifier, - onBackPress: () -> Unit, - stroeBasicInfo: StoreBasicInfo = StoreBasicInfo(), + onBackPressed: () -> Unit, + navigateToCheckScreen: (InsertDetailInfoScreenState) -> Unit, + reviseButtonClicked: (viewModel: InsertDetailInfoScreenViewModel) -> Unit, viewModel: InsertDetailInfoScreenViewModel = hiltViewModel() ) { val state = viewModel.collectAsState().value InsertDetailInfoScreenImpl( - storeNumber = state.storeAddress + storePhoneNumber = state.storePhoneNumber, + storeDeliveryFee = state.storeDeliveryFee, + storeOtherInfo = state.storeOtherInfo, + isDeliveryOk = state.isDeliveryOk, + isCardOk = state.isCardOk, + isBankOk = state.isBankOk, + isDetailInfoValid = state.isDetailInfoValid, + storeOperatingTime = state.operatingTimeList, + onStorePhoneNumberChange = { + viewModel.onChangePhoneNumber(it) + }, + onStoreDeliveryFeeChange = { + viewModel.onChangeDeliveryFee(it) + }, + onStoreOtherInfoChange = { + viewModel.onChangeOtherInfo(it) + }, + onIsDeliveryOkChange = { + viewModel.changeIsDeliveryOk() + }, + onIsCardOkChange = { + viewModel.changeIsCardOk() + }, + onIsBankOkChange = { + viewModel.changeIsBankOk() + }, + reviseButtonClicked = { + reviseButtonClicked(viewModel) + }, + nextButtonClicked = { + viewModel.onNextButtonClick() + }, + onBackPressed = onBackPressed ) + + HandleSideEffects(viewModel, navigateToCheckScreen) } @Composable fun InsertDetailInfoScreenImpl( modifier: Modifier = Modifier, - storeNumber: String = "" + storePhoneNumber: String = "", + storeDeliveryFee: String = "", + storeOperatingTime: List = emptyList(), + storeOtherInfo: String = "", + isDeliveryOk: Boolean = false, + isCardOk: Boolean = false, + isBankOk: Boolean = false, + isDetailInfoValid: Boolean = false, + onStorePhoneNumberChange: (String) -> Unit = {}, + onStoreDeliveryFeeChange: (String) -> Unit = {}, + onStoreOtherInfoChange: (String) -> Unit = {}, + onIsDeliveryOkChange: () -> Unit = {}, + onIsCardOkChange: () -> Unit = {}, + onIsBankOkChange: () -> Unit = {}, + reviseButtonClicked: () -> Unit = {}, + nextButtonClicked: () -> Unit = {}, + onBackPressed: () -> Unit = {}, ) { - Column( + LazyColumn( modifier = modifier + .fillMaxSize() + ) { + item { + Box( + modifier = Modifier + .padding(top = 56.dp, start = 10.dp, bottom = 18.dp) + .size(40.dp) + .clickable { + onBackPressed() + } + ) { + Image( + painter = painterResource(R.drawable.ic_arrow_left), + contentDescription = "backArrow", + modifier = modifier + .size(40.dp) + ) + } + } + + item { + Text( + modifier = Modifier.padding(top = 35.dp, start = 40.dp), + text = stringResource(id = R.string.insert_store), + fontSize = 24.sp, + fontWeight = FontWeight.Bold + ) + } + + item { + Text( + modifier = Modifier.padding(top = 34.dp, start = 40.dp), + text = stringResource(id = R.string.insert_store_main_info), + fontSize = 18.sp, + fontWeight = FontWeight.Bold + ) + } + + item { + InsertStoreProgressBar(modifier, 0.75f, R.string.insert_store_detail_info, R.string.page_three) + } + + item { + NameTextField(stringResource(id = R.string.phone_number), storePhoneNumber, onStorePhoneNumberChange, 32.dp) + } + + item { + NameTextField(stringResource(id = R.string.delivery_fee), storeDeliveryFee, onStoreDeliveryFeeChange, 24.dp) + } + + item { + Row( + modifier = Modifier + .padding(top = 24.dp) + .padding(horizontal = 32.dp) + .fillMaxWidth() + ) { + Text( + text = stringResource(id = R.string.operating_time), + fontSize = 14.sp, + color = ColorActiveButton, + fontWeight = FontWeight.Bold + ) + + Column( + modifier = Modifier + .padding(start = 30.dp) + ) { + storeOperatingTime.forEach { item -> + Text( + text = if (item.closed) stringResource(id = R.string.insert_store_closed_day, item.dayOfWeek) + else stringResource(id = R.string.insert_store_operating_time, item.dayOfWeek, item.openTime, item.closeTime) + ) + } + } + + Spacer(modifier = Modifier.weight(1f)) + + Button( + onClick = reviseButtonClicked, + colors = ButtonDefaults.buttonColors(ColorPrimary), + shape = RectangleShape, + modifier = Modifier + .height(29.dp) + .width(58.dp) + , + contentPadding = PaddingValues(vertical = 4.dp, horizontal = 13.dp) + ) { + Text( + modifier = Modifier + .fillMaxSize() + .wrapContentSize(align = Alignment.Center), + text = stringResource(id = R.string.revise), + fontSize = 14.sp, + fontWeight = FontWeight.Bold, + color = Color.White + ) + } + } + } + + item { + NameTextField(stringResource(id = R.string.other_info), storeOtherInfo, onStoreOtherInfoChange, 24.dp) + } + + item { + Row( + modifier = Modifier + .padding(top = 40.dp) + .padding(horizontal = 32.dp) + ){ + CreateOptionCheckBox( + stringResource(id = R.string.delivery_available), + isDeliveryOk, + onIsDeliveryOkChange + ) + + Spacer(modifier = Modifier.weight(1f)) + + CreateOptionCheckBox( + stringResource(id = R.string.card_available), + isCardOk, + onIsCardOkChange + ) + + Spacer(modifier = Modifier.weight(1f)) + + CreateOptionCheckBox( + stringResource(id = R.string.account_transfer_avilable), + isBankOk, + onIsBankOkChange + ) + } + } + + item { + Button( + onClick = nextButtonClicked, + colors = if(isDetailInfoValid)ButtonDefaults.buttonColors(ColorPrimary) else ButtonDefaults.buttonColors(ColorDisabledButton), + shape = RectangleShape, + modifier = Modifier + .padding(top = 57.dp, start = 240.dp, end = 16.dp, bottom = 20.dp) + .height(38.dp) + .width(105.dp) + ) { + Text( + text = stringResource(id = R.string.next), + fontSize = 15.sp, + fontWeight = FontWeight.Bold, + color = Color.White + ) + } + } + } +} + +@Composable +fun NameTextField( + textString: String = "", + inputString: String = "", + onStringChange: (String) -> Unit = {}, + paddingTopValue: Dp = 10.dp +){ + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 32.dp) + .padding(top = paddingTopValue), + verticalAlignment = CenterVertically + ){ + Text( + text = textString, + fontSize = 14.sp, + color = ColorActiveButton, + fontWeight = FontWeight.Bold + ) + + BorderTextField(inputString, onStringChange) + } +} + +@Composable +private fun HandleSideEffects(viewModel: InsertDetailInfoScreenViewModel, navigateToCheckScreen: (InsertDetailInfoScreenState) -> Unit) { + val context = LocalContext.current + + viewModel.collectSideEffect { sideEffect -> + when (sideEffect) { + is InsertDetailInfoScreenSideEffect.NavigateToCheckScreen -> navigateToCheckScreen(sideEffect.storeDetailInfo) + is InsertDetailInfoScreenSideEffect.ShowMessage -> { + val message = when (sideEffect.type) { + DetailInfoErrorType.NullStorePhoneNumber -> context.getString(R.string.insert_store_null_store_phone_number) + DetailInfoErrorType.NullStoreDeliveryFee -> context.getString(R.string.insert_store_null_store_delivery_fee) + DetailInfoErrorType.NullStoreOtherInfo -> context.getString(R.string.insert_store_null_store_other_info) + } + ToastUtil.getInstance().makeShort(message) + } + } + } +} + +@Composable +fun BorderTextField( + inputString: String = "", + onStringChange: (String) -> Unit = {}, +){ + Box( + modifier = Modifier + .padding(start = 30.dp) + .border(width = 1.dp, color = ColorMinor) + .height(37.dp), + contentAlignment = Alignment.CenterStart ) { + BasicTextField( + value = inputString, + onValueChange = onStringChange, + textStyle = TextStyle( + color = Color.Black, + fontSize = 14.sp + ), + modifier = Modifier + .fillMaxWidth() + .padding(start = 12.dp) + ) + } +} + +@Composable +fun CreateOptionCheckBox( + checkString: String = "", + checkValue: Boolean = true, + onCheckValueChange: () -> Unit = {} +){ + Row( + modifier = Modifier.clickable { + onCheckValueChange() + }, + verticalAlignment = CenterVertically + ) { + Image( + painter = if(checkValue) painterResource(R.drawable.ic_insert_store_checked_box) + else painterResource(id = R.drawable.ic_insert_store_unchecked_box), + contentDescription = "checkBox") + Text( - text = storeNumber + modifier = Modifier.padding(start = 8.dp), + text = checkString, + color = if(checkValue) ColorSecondary else ColorMinor, + fontSize = 14.sp ) } } +@Preview +@Composable +fun PreviewCreateCheckBox(){ + CreateOptionCheckBox() +} + @Preview @Composable fun PreviewInsertDetailInfoScreen(){ - InsertDetailInfoScreenImpl() -} \ No newline at end of file + InsertDetailInfoScreenImpl( + storeOperatingTime = operatingTime + ) +} + +val operatingTime: List = listOf( + OperatingTimeState("00:00", false, "월", "00:00"), + OperatingTimeState("00:00", false, "화", "00:00"), + OperatingTimeState("00:00", false, "수", "00:00"), + OperatingTimeState("00:00", true, "목", "00:00"), + OperatingTimeState("00:00", true, "금", "00:00"), + OperatingTimeState("00:00", false, "토", "00:00"), + OperatingTimeState("00:00", false, "일", "00:00"), +) \ No newline at end of file diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenSideEffect.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenSideEffect.kt index 326af0dc9..1ead4918f 100644 --- a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenSideEffect.kt +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenSideEffect.kt @@ -1,16 +1,14 @@ package `in`.koreatech.business.feature.insertstore.insertdetailinfo -import `in`.koreatech.business.feature.insertstore.insertmaininfo.InsertBasicInfoScreenSideEffect - sealed class InsertDetailInfoScreenSideEffect { data class ShowMessage(val type: DetailInfoErrorType): InsertDetailInfoScreenSideEffect() - data class NavigateToInsertDetailInfoScreen(val storeBasicInfo: InsertDetailInfoScreenSideEffect) : InsertDetailInfoScreenSideEffect() + data class NavigateToCheckScreen(val storeDetailInfo: InsertDetailInfoScreenState) : InsertDetailInfoScreenSideEffect() } enum class DetailInfoErrorType { - NullStoreName, - NullStoreAddress, - NullStoreImage + NullStorePhoneNumber, + NullStoreDeliveryFee, + NullStoreOtherInfo, } \ No newline at end of file diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenState.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenState.kt index 8c87bfb75..7ac64d2f5 100644 --- a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenState.kt +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenState.kt @@ -2,6 +2,7 @@ package `in`.koreatech.business.feature.insertstore.insertdetailinfo import android.net.Uri import android.os.Parcelable +import `in`.koreatech.business.feature.insertstore.insertdetailinfo.operatingTime.OperatingTimeState import kotlinx.parcelize.Parcelize @Parcelize @@ -9,5 +10,24 @@ data class InsertDetailInfoScreenState ( val storeCategory: Int = -1, val storeName: String = "", val storeAddress: String = "", - val storeImage: Uri = Uri.EMPTY + val storeImage: Uri = Uri.EMPTY, + val storePhoneNumber: String = "", + val storeDeliveryFee: String ="", + val storeOtherInfo: String = "", + val isDeliveryOk: Boolean = false, + val isCardOk: Boolean = false, + val isBankOk: Boolean = false, + val operatingTimeList: List = listOf( + OperatingTimeState("00:00", false, "월", "00:00"), + OperatingTimeState("00:00", false, "화", "00:00"), + OperatingTimeState("00:00", false, "수", "00:00"), + OperatingTimeState("00:00", false, "목", "00:00"), + OperatingTimeState("00:00", false, "금", "00:00"), + OperatingTimeState("00:00", false, "토", "00:00"), + OperatingTimeState("00:00", false, "일", "00:00"), + ), + val isDetailInfoValid: Boolean = false, + val showDialog: Boolean = false, + val isOpenTimeSetting:Boolean = false, + val dayOfWeekIndex: Int = -1 ): Parcelable \ No newline at end of file diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenViewmodel.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenViewmodel.kt index 37cb372ea..df94610a1 100644 --- a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenViewmodel.kt +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/InsertDetailInfoScreenViewmodel.kt @@ -1,17 +1,15 @@ package `in`.koreatech.business.feature.insertstore.insertdetailinfo -import android.net.Uri import android.util.Log import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel -import com.google.gson.Gson +import com.chargemap.compose.numberpicker.Hours import dagger.hilt.android.lifecycle.HiltViewModel import `in`.koreatech.business.feature.insertstore.insertmaininfo.InsertBasicInfoScreenState -import `in`.koreatech.koin.domain.model.owner.insertstore.StoreBasicInfo -import kotlinx.android.parcel.Parcelize import org.orbitmvi.orbit.Container import org.orbitmvi.orbit.ContainerHost import org.orbitmvi.orbit.syntax.simple.intent +import org.orbitmvi.orbit.syntax.simple.postSideEffect import org.orbitmvi.orbit.syntax.simple.reduce import org.orbitmvi.orbit.viewmodel.container import javax.inject.Inject @@ -24,21 +22,177 @@ class InsertDetailInfoScreenViewModel @Inject constructor( container(InsertDetailInfoScreenState(), savedStateHandle = savedStateHandle) { val storeBasicInfoJson: InsertBasicInfoScreenState? = savedStateHandle.get("storeBasicInfo") - checkNotNull(storeBasicInfoJson) - getStoreBasicInfo(storeBasicInfoJson) + if(storeBasicInfoJson != null) getStoreBasicInfo(storeBasicInfoJson) } + fun getStoreBasicInfo(storeBasicInfo: InsertBasicInfoScreenState?){ + intent{ + if (storeBasicInfo != null) { + reduce { + state.copy( + storeCategory = storeBasicInfo.storeCategory, + storeName = storeBasicInfo.storeName, + storeAddress = storeBasicInfo.storeAddress, + storeImage = storeBasicInfo.storeImage + ) + } + } + } + } + + private fun isDetailInfoValid() = intent{ + reduce { + state.copy( + isDetailInfoValid = state.storePhoneNumber.isNotEmpty() && state.storeDeliveryFee.isNotEmpty() && state.storeOtherInfo.isNotEmpty() + ) + } + } + + private fun isOpenTimeSetting(isOpenTimeSetting: Boolean) = intent{ + reduce{ + state.copy(isOpenTimeSetting = isOpenTimeSetting) + } + } + + private fun dayOfIndex(index: Int) = intent{ + reduce{ + state.copy(dayOfWeekIndex = index) + } + } + + fun onChangePhoneNumber(phoneNumber: String) = intent{ + reduce { + state.copy(storePhoneNumber = phoneNumber) + } + isDetailInfoValid() + } + + fun onChangeDeliveryFee(deliveryFee: String) = intent{ + reduce { + state.copy(storeDeliveryFee = deliveryFee) + } + isDetailInfoValid() + } + + fun onChangeOtherInfo(otherInfo: String) = intent{ + reduce { + state.copy(storeOtherInfo = otherInfo) + } + isDetailInfoValid() + } + + fun changeIsDeliveryOk() = intent{ + reduce{ + state.copy(isDeliveryOk = !state.isDeliveryOk) + } + } + + fun changeIsCardOk() = intent{ + reduce{ + state.copy(isCardOk = !state.isCardOk) + } + } + + fun changeIsBankOk() = intent{ + reduce{ + state.copy(isBankOk = !state.isBankOk) + } + } + + fun showOpenTimeDialog(index: Int) = intent{ + reduce { + state.copy(showDialog = true) + } + isOpenTimeSetting(true) + dayOfIndex(index) + } + + fun showCloseTimeDialog(index: Int) = intent{ + reduce { + state.copy(showDialog = true) + } + isOpenTimeSetting(false) + dayOfIndex(index) + } + + fun closeDialog() = intent{ + reduce{ + state.copy(showDialog = false) + } + } + + fun settingStoreOpenTime(time: Hours, index: Int) { + intent { + if (index >= 0 && index < state.operatingTimeList.size) { + val newList = state.operatingTimeList.toMutableList() + val currentItem = newList[index] + newList[index] = currentItem.copy(openTime = time.toTimeString()) + + reduce { + state.copy(operatingTimeList = newList) + } + + closeDialog() + } + } + } + + fun settingStoreCloseTime(time: Hours, index: Int) { + intent { + if (index >= 0 && index < state.operatingTimeList.size) { + val newList = state.operatingTimeList.toMutableList() + val currentItem = newList[index] + newList[index] = currentItem.copy(closeTime = time.toTimeString()) + + reduce { + state.copy(operatingTimeList = newList) + } - private fun getStoreBasicInfo(storeBasicInfo: InsertBasicInfoScreenState){ + closeDialog() + } + } + } + + fun isClosedDay(index: Int) { + intent { + if (index >= 0 && index <= state.operatingTimeList.size){ + val newList = state.operatingTimeList.toMutableList() + val currentItem = newList[index] + newList[index] = currentItem.copy(closed = !currentItem.closed) + reduce{ + state.copy(operatingTimeList = newList) + } + } + } + } + + fun onNextButtonClick(){ intent{ - reduce { - state.copy( - storeCategory = storeBasicInfo.storeCategory, - storeName = storeBasicInfo.storeName, - storeAddress = storeBasicInfo.storeAddress, - storeImage = storeBasicInfo.storeImage - ) + if(state.isDetailInfoValid){ + val storeDetailInfo = state + + postSideEffect(InsertDetailInfoScreenSideEffect.NavigateToCheckScreen(storeDetailInfo)) + Log.e("로그", storeDetailInfo.toString()) + return@intent + } + + when { + state.storePhoneNumber.isEmpty() -> postSideEffect(InsertDetailInfoScreenSideEffect.ShowMessage(DetailInfoErrorType.NullStorePhoneNumber)) + state.storeDeliveryFee.isEmpty() -> postSideEffect(InsertDetailInfoScreenSideEffect.ShowMessage(DetailInfoErrorType.NullStoreDeliveryFee)) + state.storeOtherInfo.isEmpty() -> postSideEffect(InsertDetailInfoScreenSideEffect.ShowMessage(DetailInfoErrorType.NullStoreOtherInfo)) } } } + +} + +private fun Hours.toTimeString(): String { + + val hoursString: String = + if (this.hours < 10) "0" + this.hours.toString() else this.hours.toString() + + val minutesString: String = + if (this.minutes < 10) "0" + this.minutes.toString() else this.minutes.toString() + + return "$hoursString:$minutesString" } \ No newline at end of file diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/dialog/OperatingTimeDialog.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/dialog/OperatingTimeDialog.kt new file mode 100644 index 000000000..2290e74af --- /dev/null +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/dialog/OperatingTimeDialog.kt @@ -0,0 +1,10 @@ +package `in`.koreatech.business.feature.insertstore.insertdetailinfo.dialog + +import com.chargemap.compose.numberpicker.Hours + +data class OperatingTimeDialog( + val showDialog: Boolean = true, + val closeDialog: () -> Unit = {}, + val dayOfWeekIndex: Int = 0, + val onSettingStoreTime: (Pair) -> Unit = {} +) \ No newline at end of file diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/operatingTime/OperatingTimeSettingScreen.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/operatingTime/OperatingTimeSettingScreen.kt new file mode 100644 index 000000000..05534f841 --- /dev/null +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/operatingTime/OperatingTimeSettingScreen.kt @@ -0,0 +1,419 @@ +package `in`.koreatech.business.feature.insertstore.insertdetailinfo.operatingTime + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +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 +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material.AlertDialog +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import com.chargemap.compose.numberpicker.FullHours +import com.chargemap.compose.numberpicker.Hours +import com.chargemap.compose.numberpicker.HoursNumberPicker +import `in`.koreatech.business.ui.theme.ColorSecondaryText +import `in`.koreatech.business.ui.theme.ColorTextBackgrond +import `in`.koreatech.koin.core.R +import org.orbitmvi.orbit.compose.collectAsState +import `in`.koreatech.business.feature.insertstore.insertdetailinfo.InsertDetailInfoScreenViewModel +import `in`.koreatech.business.feature.insertstore.insertdetailinfo.dialog.OperatingTimeDialog +import `in`.koreatech.business.ui.theme.ColorPrimary + +@Composable +fun OperatingTimeSettingScreen( + onBackPressed: () -> Unit = {}, + viewModel: InsertDetailInfoScreenViewModel = hiltViewModel() +) { + val state = viewModel.collectAsState().value + OperatingTimeSettingScreenImpl( + showDialog = state.showDialog, + isOpenTimeSetting = state.isOpenTimeSetting, + dayOfWeekIndex = state.dayOfWeekIndex, + onShowOpenTimeDialog = { + viewModel.showOpenTimeDialog(it) + }, + onShowCloseTimeDialog = { + viewModel.showCloseTimeDialog(it) + }, + onCloseDialog = { + viewModel.closeDialog() + }, + onCheckBoxClicked = { + viewModel.isClosedDay(it) + }, + onBackPressed = onBackPressed, + onSettingStoreOpenTime = { + viewModel.settingStoreOpenTime(it.first, it.second) + }, + onSettingStoreCloseTime = { + viewModel.settingStoreCloseTime(it.first, it.second) + }, + nextButtonClicked = onBackPressed, + operatingTimeList = state.operatingTimeList + ) + +} + + +@Composable +fun OperatingTimeSettingScreenImpl( + showDialog: Boolean = false, + isOpenTimeSetting: Boolean = false, + dayOfWeekIndex: Int = 0, + onShowOpenTimeDialog: (Int) -> Unit = {}, + onShowCloseTimeDialog: (Int) -> Unit = {}, + onCloseDialog: () -> Unit = {}, + onCheckBoxClicked: (Int) -> Unit = {}, + onBackPressed: () -> Unit = {}, + onSettingStoreOpenTime: (Pair) -> Unit = {}, + onSettingStoreCloseTime: (Pair) -> Unit = {}, + nextButtonClicked: () -> Unit = {}, + operatingTimeList: List = emptyList() +) { + Column( + modifier = Modifier.fillMaxSize() + ) { + Box( + modifier = Modifier + .padding(top = 56.dp, start = 10.dp, bottom = 18.dp) + .size(40.dp) + .clickable { + onBackPressed() + } + ) { + Image( + painter = painterResource(R.drawable.ic_arrow_left), + contentDescription = "backArrow", + modifier = Modifier + .size(40.dp) + ) + } + + Text( + modifier = Modifier.padding(top = 35.dp, start = 40.dp), + text = stringResource(id = R.string.insert_store), + fontSize = 24.sp + ) + + Text( + modifier = Modifier.padding(top = 34.dp, start = 40.dp), + text = stringResource(id = R.string.insert_store_time_setting), + fontSize = 18.sp + ) + + Box( + modifier = Modifier + .fillMaxWidth() + .padding(top = 24.dp) + .height(35.dp) + .background(ColorTextBackgrond), + contentAlignment = Alignment.CenterStart + ){ + Text( + modifier = Modifier + .padding(start = 16.dp), + text = stringResource(id = R.string.insert_store_open_time_setting), + color = ColorSecondaryText + ) + } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 24.dp) + .padding(horizontal = 24.dp) + ){ + Text( + text = stringResource(id = R.string.day_of_week), + fontSize = 18.sp + ) + Spacer(modifier = Modifier.weight(1f)) + Text( + text = stringResource(id = R.string.open_time), + fontSize = 18.sp + ) + Spacer(modifier = Modifier.weight(1f)) + Text( + text = stringResource(id = R.string.day_off), + fontSize = 18.sp + ) + } + Box { + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .padding(top = 25.dp) + ) { + itemsIndexed(operatingTimeList) { index, item -> + DayOperatingTimeSetting(item, onShowOpenTimeDialog, onShowCloseTimeDialog, index, onCheckBoxClicked) + + } + } + when(isOpenTimeSetting){ + true -> ShowOpenTimeDialog( + operatingTimeDialog = OperatingTimeDialog( + showDialog, + onCloseDialog, + dayOfWeekIndex, + onSettingStoreOpenTime + ) + ) + false -> ShowCloseTimeDialog( + operatingTimeDialog = OperatingTimeDialog( + showDialog, + onCloseDialog, + dayOfWeekIndex, + onSettingStoreCloseTime + ) + ) + } + } + + Button( + onClick = { + nextButtonClicked() + }, + colors = ButtonDefaults.buttonColors(ColorPrimary), + shape = RectangleShape, + modifier = Modifier + .padding(top = 57.dp, start = 240.dp, end = 16.dp) + .height(38.dp) + .width(105.dp) + ) { + Text( + text = stringResource(id = R.string.next), + fontSize = 15.sp, + fontWeight = FontWeight.Bold, + color = Color.White + ) + } + } +} + +@Composable +fun DayOperatingTimeSetting( + operatingTime: OperatingTimeState = OperatingTimeState(), + onShowOpenTimeDialog: (Int) -> Unit = {}, + onShowCloseTimeDialog: (Int) -> Unit = {}, + index: Int = 0, + onCheckBoxClicked: (Int) -> Unit = {} +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + .padding(bottom = 18.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = operatingTime.dayOfWeek, + fontSize = 15.sp + ) + + Spacer(modifier = Modifier.weight(1f)) + + Text( + modifier = Modifier.clickable { + if(!operatingTime.closed) onShowOpenTimeDialog(index) + }, + text = operatingTime.openTime, + fontSize = 15.sp + ) + + Text( + modifier = Modifier.padding(horizontal = 15.dp), + text = " ~ ", + fontSize = 15.sp + ) + + Text( + modifier = Modifier.clickable { + if(!operatingTime.closed) onShowCloseTimeDialog(index) + }, + text = operatingTime.closeTime, + fontSize = 15.sp + ) + + Spacer(modifier = Modifier.weight(1f)) + + Image( + modifier = Modifier.clickable { + onCheckBoxClicked(index) + }, + painter = if(operatingTime.closed) painterResource(R.drawable.ic_insert_store_time_setting_checked) + else painterResource(id = R.drawable.ic_insert_store_time_setting_unchecked), + contentDescription = "checkBox") + } +} + +@Composable +fun ShowOpenTimeDialog( + operatingTimeDialog: OperatingTimeDialog = OperatingTimeDialog() +) { + var openTimeValue by remember { mutableStateOf(FullHours(0, 0)) } + if (operatingTimeDialog.showDialog) { + AlertDialog( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight() + , + onDismissRequest = { operatingTimeDialog.closeDialog() }, + title = { + Text( + modifier = Modifier.padding(bottom = 30.dp), + text = stringResource(id = R.string.store_open_time) + ) + }, + text = { + HoursNumberPicker( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + dividersColor = MaterialTheme.colors.primary, + leadingZero = false, + value = openTimeValue, + onValueChange = { + openTimeValue = it + }, + minutesRange = (0..59 step 5), + hoursDivider = { + Text( + modifier = Modifier.size(24.dp), + textAlign = TextAlign.Center, + text = ":" + ) + } + ) + }, + confirmButton = { + Button( + onClick = { + operatingTimeDialog.onSettingStoreTime(Pair(openTimeValue, operatingTimeDialog.dayOfWeekIndex)) + }) { + Text(stringResource(id = R.string.positive)) + } + }, + dismissButton = { + Button( + onClick = { + operatingTimeDialog.closeDialog() + }) { + Text(stringResource(id = R.string.neutral)) + } + } + ) + } +} + +@Composable +fun ShowCloseTimeDialog( + operatingTimeDialog: OperatingTimeDialog = OperatingTimeDialog() +) { + var closeTimeValue by remember { mutableStateOf(FullHours(0, 0)) } + if (operatingTimeDialog.showDialog) { + AlertDialog( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight() + , + onDismissRequest = { operatingTimeDialog.closeDialog() }, + title = { + Text( + modifier = Modifier.padding(bottom = 30.dp), + text = stringResource(id = R.string.store_close_time) + ) + }, + text = { + HoursNumberPicker( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + dividersColor = MaterialTheme.colors.primary, + leadingZero = false, + value = closeTimeValue, + onValueChange = { + closeTimeValue = it + }, + minutesRange = (0..59 step 5), + hoursDivider = { + Text( + modifier = Modifier.size(24.dp), + textAlign = TextAlign.Center, + text = ":" + ) + } + ) + }, + confirmButton = { + Button( + onClick = { + operatingTimeDialog.onSettingStoreTime(Pair(closeTimeValue, operatingTimeDialog.dayOfWeekIndex)) + }) { + Text(stringResource(id = R.string.positive)) + } + }, + dismissButton = { + Button( + onClick = { + operatingTimeDialog.closeDialog() + }) { + Text(stringResource(id = R.string.neutral)) + } + } + ) + } +} + +@Preview +@Composable +fun PreviewDayOperatingTImeSetting() { + DayOperatingTimeSetting() +} + +@Preview +@Composable +fun PreviewOperatingTimeSettingScreenImpl() { + OperatingTimeSettingScreenImpl( + operatingTimeList = operatingTimeList + ) +} + +val operatingTimeList: List = listOf( + OperatingTimeState("00:00", false, "월", "00:00"), + OperatingTimeState("00:00", false, "화", "00:00"), + OperatingTimeState("00:00", false, "수", "00:00"), + OperatingTimeState("00:00", false, "목", "00:00"), + OperatingTimeState("00:00", false, "금", "00:00"), + OperatingTimeState("00:00", false, "토", "00:00"), + OperatingTimeState("00:00", false, "일", "00:00"), +) diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/operatingTime/OperationgTimeState.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/operatingTime/OperationgTimeState.kt new file mode 100644 index 000000000..8157277e8 --- /dev/null +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/insertdetailinfo/operatingTime/OperationgTimeState.kt @@ -0,0 +1,12 @@ +package `in`.koreatech.business.feature.insertstore.insertdetailinfo.operatingTime + +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize + +@Parcelize +data class OperatingTimeState( + val closeTime: String = "", + val closed: Boolean = false, + val dayOfWeek: String = "", + val openTime: String = "" +): Parcelable \ No newline at end of file diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/insertmaininfo/InsertBasicInfoScreen.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/insertmaininfo/InsertBasicInfoScreen.kt index b22aa4170..262ab6fea 100644 --- a/business/src/main/java/in/koreatech/business/feature/insertstore/insertmaininfo/InsertBasicInfoScreen.kt +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/insertmaininfo/InsertBasicInfoScreen.kt @@ -131,13 +131,15 @@ fun InsertBasicInfoScreenImpl( Text( modifier = modifier.padding(top = 35.dp, start = 40.dp), text = stringResource(id = R.string.insert_store), - fontSize = 24.sp + fontSize = 24.sp, + fontWeight = FontWeight.Bold ) Text( - modifier = modifier.padding(top = 34.dp, start = 32.dp), + modifier = modifier.padding(top = 34.dp, start = 40.dp), text = stringResource(id = R.string.insert_store_main_info), - fontSize = 18.sp + fontSize = 18.sp, + fontWeight = FontWeight.Bold ) InsertStoreProgressBar(modifier, 0.50f, R.string.insert_store_basic_info, R.string.page_two) diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/navigator/InsertStoreRoute.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/navigator/InsertStoreRoute.kt index 09b17b8b3..a178aaf06 100644 --- a/business/src/main/java/in/koreatech/business/feature/insertstore/navigator/InsertStoreRoute.kt +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/navigator/InsertStoreRoute.kt @@ -4,5 +4,6 @@ enum class InsertStoreRoute(){ START, SELECT_CATEGORY, BASIC_INFO, - DETAIL_INFO + DETAIL_INFO, + OPERATING_TIME } \ No newline at end of file diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/navigator/InsertStoreRouteNavigator.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/navigator/InsertStoreRouteNavigator.kt index 60a8962dc..c67ab3337 100644 --- a/business/src/main/java/in/koreatech/business/feature/insertstore/navigator/InsertStoreRouteNavigator.kt +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/navigator/InsertStoreRouteNavigator.kt @@ -1,10 +1,10 @@ package `in`.koreatech.business.feature.insertstore.navigator -import android.net.Uri +import android.os.Build import android.os.Bundle -import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import androidx.navigation.NavHostController import androidx.navigation.NavOptions @@ -14,8 +14,9 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument -import com.google.gson.Gson import `in`.koreatech.business.feature.insertstore.insertdetailinfo.InsertDetailInfoScreen +import `in`.koreatech.business.feature.insertstore.insertdetailinfo.InsertDetailInfoScreenViewModel +import `in`.koreatech.business.feature.insertstore.insertdetailinfo.operatingTime.OperatingTimeSettingScreen import `in`.koreatech.business.feature.insertstore.insertmaininfo.InsertBasicInfoScreen import `in`.koreatech.business.feature.insertstore.insertmaininfo.InsertBasicInfoScreenState import `in`.koreatech.business.feature.insertstore.selectcategory.SelectCategoryScreen @@ -25,7 +26,8 @@ import `in`.koreatech.koin.domain.model.owner.insertstore.StoreBasicInfo @Composable fun InsertStoreNavigator( modifier: Modifier = Modifier, - navController: NavHostController = rememberNavController() + navController: NavHostController = rememberNavController(), + detailInfoScreenViewModel: InsertDetailInfoScreenViewModel = hiltViewModel() ) { NavHost( navController = navController, @@ -81,12 +83,43 @@ fun InsertStoreNavigator( composable( route = InsertStoreRoute.DETAIL_INFO.name ){ + val bundle = it.arguments + + val basicInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + bundle?.getParcelable("storeBasicInfo", InsertBasicInfoScreenState::class.java) + } else { + bundle?.getParcelable("storeBasicInfo") as? InsertBasicInfoScreenState + } + + detailInfoScreenViewModel.getStoreBasicInfo(basicInfo) + InsertDetailInfoScreen( - onBackPress = { + reviseButtonClicked = { + navController.navigate(InsertStoreRoute.OPERATING_TIME.name) + }, + onBackPressed = { navController.navigateUp() + }, + + viewModel = detailInfoScreenViewModel, + + navigateToCheckScreen = { + } ) } + + composable( + route = InsertStoreRoute.OPERATING_TIME.name + + ){ + OperatingTimeSettingScreen( + onBackPressed = { + navController.navigateUp() + }, + viewModel = detailInfoScreenViewModel + ) + } } } @@ -97,6 +130,7 @@ private fun navigateToMainInfo( navController.navigate("${InsertStoreRoute.BASIC_INFO}/${categoryId}") } + private fun navigateToDetailInfo( navController: NavController, storeBasicInfo: InsertBasicInfoScreenState @@ -105,8 +139,6 @@ private fun navigateToDetailInfo( bundle.putParcelable("storeBasicInfo", storeBasicInfo) navController.navigate(InsertStoreRoute.DETAIL_INFO.name, args = bundle) } - - fun NavController.navigate( route: String, args: Bundle, diff --git a/business/src/main/java/in/koreatech/business/feature/insertstore/selectcategory/SelectCategoryScreen.kt b/business/src/main/java/in/koreatech/business/feature/insertstore/selectcategory/SelectCategoryScreen.kt index f25c25152..6050d5870 100644 --- a/business/src/main/java/in/koreatech/business/feature/insertstore/selectcategory/SelectCategoryScreen.kt +++ b/business/src/main/java/in/koreatech/business/feature/insertstore/selectcategory/SelectCategoryScreen.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box 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.height @@ -109,13 +110,15 @@ fun SelectCategoryScreenImpl( Text( modifier = Modifier.padding(top = 35.dp, start = 40.dp), text = stringResource(id = R.string.insert_store), - fontSize = 24.sp + fontSize = 24.sp, + fontWeight = FontWeight.Bold ) Text( - modifier = Modifier.padding(top = 34.dp, start = 32.dp), + modifier = Modifier.padding(top = 34.dp, start = 40.dp), text = stringResource(id = R.string.insert_store_main_info), - fontSize = 18.sp + fontSize = 18.sp, + fontWeight = FontWeight.Bold ) InsertStoreProgressBar(Modifier, 0.25f, R.string.insert_store_category_setting, R.string.page_one) @@ -179,16 +182,16 @@ fun InsertStoreProgressBar( Row( modifier = modifier .padding(top = 24.dp) - .padding(horizontal = 32.dp) + .padding(horizontal = 32.dp), + horizontalArrangement = Arrangement.SpaceBetween ) { Text( text = stringResource(id = resourceId), fontSize = 15.sp, color = ColorSecondary ) - + Spacer(modifier = Modifier.weight(1f)) Text( - modifier = Modifier.padding(start = 160.dp), text = stringResource(id = pageId), fontSize = 15.sp, color = ColorSecondary diff --git a/business/src/main/java/in/koreatech/business/ui/theme/Color.kt b/business/src/main/java/in/koreatech/business/ui/theme/Color.kt index d452ad0ee..44823a9f4 100644 --- a/business/src/main/java/in/koreatech/business/ui/theme/Color.kt +++ b/business/src/main/java/in/koreatech/business/ui/theme/Color.kt @@ -29,7 +29,7 @@ val ColorHelper = Color(0xFFD2DAE2) val Blue1 = Color(0xFFD2DAE2) val ColorPrimary = Color(0xFF175c8e) - +val ColorTextBackgrond = Color(0xFFF6F8F9) val ColorActiveButton = Color(0xFF175c8e) val ColorDisabledButton = Color(0xFFC4C4C4) val ColorSecondary = Color(0xFFF7941E) diff --git a/core/src/main/res/drawable/ic_insert_store_checked_box.xml b/core/src/main/res/drawable/ic_insert_store_checked_box.xml new file mode 100644 index 000000000..399d82343 --- /dev/null +++ b/core/src/main/res/drawable/ic_insert_store_checked_box.xml @@ -0,0 +1,14 @@ + + + + diff --git a/core/src/main/res/drawable/ic_insert_store_time_setting_checked.xml b/core/src/main/res/drawable/ic_insert_store_time_setting_checked.xml new file mode 100644 index 000000000..ac970ad53 --- /dev/null +++ b/core/src/main/res/drawable/ic_insert_store_time_setting_checked.xml @@ -0,0 +1,11 @@ + + + diff --git a/core/src/main/res/drawable/ic_insert_store_time_setting_unchecked.xml b/core/src/main/res/drawable/ic_insert_store_time_setting_unchecked.xml new file mode 100644 index 000000000..cdfa9d4d9 --- /dev/null +++ b/core/src/main/res/drawable/ic_insert_store_time_setting_unchecked.xml @@ -0,0 +1,11 @@ + + + diff --git a/core/src/main/res/drawable/ic_insert_store_unchecked_box.xml b/core/src/main/res/drawable/ic_insert_store_unchecked_box.xml new file mode 100644 index 000000000..7a31e7bc3 --- /dev/null +++ b/core/src/main/res/drawable/ic_insert_store_unchecked_box.xml @@ -0,0 +1,11 @@ + + + diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 6dc084360..aaa203e49 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -15,6 +15,19 @@ 2 / 4 3 / 4 4 / 4 + 전화번호 + 배달금액 + 운영시간 + 기타정보 + 배달가능 + 카드가능 + 계좌이체가능 + 수정 + 요일 + 시간 + 휴일 + 개점시간 + 폐점시간 @@ -95,7 +108,16 @@ 2. 기본 정보 입력 가게이름 주소정보 - 가게이름을 입력해주세요. - 주소정보를 입력해주세요. - 가게사진을 등록해주세요. + 가게 이름을 입력해 주세요. + 주소 정보를 입력해 주세요. + 가게 사진을 등록해 주세요. + + 3. 세부 정보 입력 + 시간설정 + 평일/주말 운영시간 + %1$s: %2$s ~ %3$s + 매주 %1$s 정기 휴무 + 가게 전화번호를 입력해 주세요. + 가게 배달비를 입력해 주세요. + 가게 기타 정보를 입력해 주세요. diff --git a/domain/src/main/java/in/koreatech/koin/domain/model/owner/insertstore/OperatingTime.kt b/domain/src/main/java/in/koreatech/koin/domain/model/owner/insertstore/OperatingTime.kt new file mode 100644 index 000000000..103c292b7 --- /dev/null +++ b/domain/src/main/java/in/koreatech/koin/domain/model/owner/insertstore/OperatingTime.kt @@ -0,0 +1,8 @@ +package `in`.koreatech.koin.domain.model.owner.insertstore + +data class OperatingTime( + val closeTime: String = "", + val closed: Boolean = false, + val dayOfWeek: String = "", + val openTime: String = "" +) \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 387923eb6..9c204a1cc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -53,6 +53,7 @@ coilVersion = "2.6.0" napier = "2.6.1" powerSpinner = "1.2.7" firebaseCrashlyticsBuildtoolsVersion = "2.9.9" +composeNumberPickerVersion = "1.0.3" [libraries] androidx-activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activityKtxVersion" } @@ -144,7 +145,7 @@ coil-compose = {module = "io.coil-kt:coil-compose", version.ref = "coilVersion"} coil-svg = {module = "io.coil-kt:coil-svg", version.ref ="coilVersion"} powerSpinner = {module = "com.github.skydoves:powerspinner", version.ref = "powerSpinner"} - +compose-numberPicker = {module = "com.chargemap.compose:numberpicker", version.ref = "composeNumberPickerVersion"} [plugins] android-application = { id = "com.android.application", version.ref = "androidGradleVersion" }