Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

release v1.0.6 #200

Merged
merged 15 commits into from
May 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
Google Recommend Architecture based on [Now in Android](https://github.com/android/nowinandroid)

## Module
<img width="1309" alt="image" src="https://github.com/Project-Unifest/unifest-android/assets/51016231/c195f537-bc3f-42ba-98ca-d0ffaacb01ae">
<img width="1189" alt="image" src="https://github.com/Project-Unifest/unifest-android/assets/51016231/9b9cd9c8-cda1-46ce-b848-210114ff1d7d">

## Package Structure
```
Expand All @@ -94,6 +94,7 @@ Google Recommend Architecture based on [Now in Android](https://github.com/andro
│   └── ui
├── feature
│   ├── booth
│   ├── festival
│   ├── home
│   ├── intro
│   ├── liked-booth
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.shape.CircleShape
Expand Down Expand Up @@ -56,8 +57,8 @@ fun LikedFestivalsGrid(
LazyVerticalGrid(
columns = GridCells.Fixed(3),
modifier = Modifier
.padding(8.dp)
.height(if (selectedFestivals.isEmpty()) 0.dp else ((selectedFestivals.size / 4 + 1) * 140).dp),
.wrapContentHeight()
.padding(8.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.unifest.android.feature.booth

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
Expand Down Expand Up @@ -33,6 +34,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.LastBaseline
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
Expand Down Expand Up @@ -174,6 +176,13 @@ fun BoothDetailScreen(
},
)

if (uiState.isMenuImageDialogVisible && uiState.selectedMenu != null) {
MenuImageDialog(
onDismissRequest = { onAction(BoothUiAction.OnMenuImageDialogDismiss) },
menu = uiState.selectedMenu,
)
}

if (uiState.isLoading) {
LoadingWheel(modifier = Modifier.fillMaxSize())
}
Expand Down Expand Up @@ -237,7 +246,12 @@ fun BoothDetailContent(
items(
items = uiState.boothDetailInfo.menus,
key = { it.id },
) { menu -> MenuItem(menu) }
) { menu ->
MenuItem(
menu = menu,
onAction = onAction,
)
}
}
}
}
Expand Down Expand Up @@ -324,24 +338,25 @@ fun BoothDescription(
location: String,
onAction: (BoothUiAction) -> Unit,
) {
val configuration = LocalConfiguration.current
val maxWidth = remember(configuration) {
val screenWidth = configuration.screenWidthDp.dp - 40.dp
screenWidth * (2 / 3f)
}

Column(modifier = Modifier.padding(horizontal = 20.dp)) {
val configuration = LocalConfiguration.current
val maxWidth = remember(configuration) {
val screenWidth = configuration.screenWidthDp.dp - 40.dp
screenWidth * (2 / 3f)
}
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
text = name,
modifier = Modifier
.widthIn(max = maxWidth)
.alignByBaseline(),
.alignBy(LastBaseline),
style = BoothTitle1,
)
Spacer(modifier = Modifier.width(5.dp))
Text(
text = warning,
modifier = Modifier.alignByBaseline(),
modifier = Modifier.alignBy(LastBaseline),
style = BoothCaution,
color = MainColor,
)
Expand Down Expand Up @@ -392,7 +407,10 @@ fun MenuText() {
}

@Composable
fun MenuItem(menu: MenuModel) {
fun MenuItem(
menu: MenuModel,
onAction: (BoothUiAction) -> Unit,
) {
Row(
modifier = Modifier.padding(horizontal = 20.dp, vertical = 8.dp),
) {
Expand All @@ -402,7 +420,14 @@ fun MenuItem(menu: MenuModel) {
placeholder = painterResource(id = R.drawable.ic_item_placeholder),
modifier = Modifier
.size(86.dp)
.clip(RoundedCornerShape(16.dp)),
.clip(RoundedCornerShape(16.dp))
.clickable(
onClick = {
if (menu.imgUrl.isNotEmpty()) {
onAction(BoothUiAction.OnMenuImageClick(menu))
}
},
),
)
Spacer(modifier = Modifier.width(13.dp))
Column(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.unifest.android.feature.booth

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.BasicAlertDialog
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.min
import androidx.compose.ui.window.DialogProperties
import com.unifest.android.core.common.utils.formatAsCurrency
import com.unifest.android.core.designsystem.component.NetworkImage
import com.unifest.android.core.designsystem.theme.Content1
import com.unifest.android.core.designsystem.theme.Title2
import com.unifest.android.core.model.MenuModel

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MenuImageDialog(
onDismissRequest: () -> Unit,
menu: MenuModel,
modifier: Modifier = Modifier,
) {
val configuration = LocalConfiguration.current
val dialogSize = remember(configuration) {
val screenWidth = configuration.screenWidthDp.dp
val screenHeight = configuration.screenHeightDp.dp
min(screenWidth, screenHeight) - 36.dp
}

BasicAlertDialog(
onDismissRequest = onDismissRequest,
modifier = modifier
.width(dialogSize)
.height(dialogSize + 96.dp)
.clip(RoundedCornerShape(16.dp))
.background(Color.Transparent),
properties = DialogProperties(
usePlatformDefaultWidth = false,
),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
) {
NetworkImage(
imgUrl = menu.imgUrl,
contentDescription = null,
modifier = Modifier
.size(dialogSize)
.clip(RoundedCornerShape(16.dp)),
)
Spacer(modifier = Modifier.height(16.dp))
Text(
text = menu.name,
color = Color.White,
textAlign = TextAlign.Center,
style = Title2,
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = menu.price.formatAsCurrency(),
color = Color.White,
textAlign = TextAlign.Center,
style = Content1,
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package com.unifest.android.feature.booth.viewmodel

import com.unifest.android.core.model.MenuModel

sealed interface BoothUiAction {
data object OnBackClick : BoothUiAction
data object OnCheckLocationClick : BoothUiAction
data object OnToggleBookmark : BoothUiAction
data class OnRetryClick(val error: ErrorType) : BoothUiAction
data class OnMenuImageClick(val menu: MenuModel) : BoothUiAction
data object OnMenuImageDialogDismiss : BoothUiAction
}

enum class ErrorType {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.unifest.android.feature.booth.viewmodel
import com.naver.maps.geometry.LatLng
import com.unifest.android.core.model.BoothDetailModel
import com.unifest.android.core.model.LikedBoothModel
import com.unifest.android.core.model.MenuModel
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf

Expand All @@ -13,6 +14,8 @@ data class BoothUiState(
val isLiked: Boolean = false,
val isServerErrorDialogVisible: Boolean = false,
val isNetworkErrorDialogVisible: Boolean = false,
val isMenuImageDialogVisible: Boolean = false,
val selectedMenu: MenuModel? = null,
val outerCords: ImmutableList<LatLng> = persistentListOf(
LatLng(50.0, 150.0),
LatLng(50.0, 100.0),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.unifest.android.core.common.handleException
import com.unifest.android.core.data.repository.BoothRepository
import com.unifest.android.core.data.repository.LikedBoothRepository
import com.unifest.android.core.designsystem.R
import com.unifest.android.core.model.MenuModel
import com.unifest.android.feature.booth.navigation.BOOTH_ID
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.toImmutableList
Expand Down Expand Up @@ -47,6 +48,8 @@ class BoothViewModel @Inject constructor(
is BoothUiAction.OnCheckLocationClick -> navigateToBoothLocation()
is BoothUiAction.OnToggleBookmark -> toggleBookmark()
is BoothUiAction.OnRetryClick -> refresh(action.error)
is BoothUiAction.OnMenuImageClick -> showMenuImageDialog(action.menu)
is BoothUiAction.OnMenuImageDialogDismiss -> hideMenuImageDialog()
}
}

Expand Down Expand Up @@ -163,6 +166,24 @@ class BoothViewModel @Inject constructor(
}
}

private fun showMenuImageDialog(menu: MenuModel) {
_uiState.update {
it.copy(
isMenuImageDialogVisible = true,
selectedMenu = menu,
)
}
}

private fun hideMenuImageDialog() {
_uiState.update {
it.copy(
isMenuImageDialogVisible = false,
selectedMenu = null,
)
}
}

override fun setServerErrorDialogVisible(flag: Boolean) {
_uiState.update {
it.copy(isServerErrorDialogVisible = flag)
Expand Down
1 change: 1 addition & 0 deletions feature/festival/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
19 changes: 19 additions & 0 deletions feature/festival/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
@file:Suppress("INLINE_FROM_HIGHER_PLATFORM")

plugins {
alias(libs.plugins.unifest.android.feature)
// alias(libs.plugins.compose.investigator)
}

android {
namespace = "com.unifest.android.feature.festival"
}

dependencies {
implementations(
projects.core.data,

libs.kotlinx.collections.immutable,
libs.timber,
)
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.unifest.android.core.ui.component
package com.unifest.android.feature.festival

import androidx.annotation.StringRes
import androidx.compose.foundation.background
Expand Down Expand Up @@ -28,17 +28,18 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import com.unifest.android.core.common.ButtonType
import com.unifest.android.core.common.FestivalUiAction
import com.unifest.android.core.designsystem.ComponentPreview
import com.unifest.android.core.designsystem.R
import com.unifest.android.core.designsystem.component.FestivalSearchTextField
import com.unifest.android.core.designsystem.component.LikedFestivalDeleteDialog
import com.unifest.android.core.designsystem.component.UnifestHorizontalDivider
import com.unifest.android.core.designsystem.theme.Content3
import com.unifest.android.core.designsystem.theme.Title3
import com.unifest.android.core.designsystem.theme.UnifestTheme
import com.unifest.android.core.model.FestivalModel
import com.unifest.android.core.ui.component.LikedFestivalsGrid
import com.unifest.android.feature.festival.viewmodel.ButtonType
import com.unifest.android.feature.festival.viewmodel.FestivalUiAction
import com.unifest.android.core.designsystem.R
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf

Expand Down Expand Up @@ -161,10 +162,14 @@ fun FestivalSearchBottomSheet(
if (isLikedFestivalDeleteDialogVisible) {
LikedFestivalDeleteDialog(
onCancelClick = {
onFestivalUiAction(FestivalUiAction.OnDeleteDialogButtonClick(ButtonType.CANCEL))
onFestivalUiAction(
FestivalUiAction.OnDeleteDialogButtonClick(ButtonType.CANCEL),
)
},
onConfirmClick = {
onFestivalUiAction(FestivalUiAction.OnDeleteDialogButtonClick(ButtonType.CONFIRM))
onFestivalUiAction(
FestivalUiAction.OnDeleteDialogButtonClick(ButtonType.CONFIRM),
)
},
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.unifest.android.core.ui.component
package com.unifest.android.feature.festival

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
Expand Down Expand Up @@ -26,19 +26,19 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import com.unifest.android.core.common.FestivalUiAction
import com.unifest.android.core.common.extension.noRippleClickable
import com.unifest.android.core.common.utils.formatToString
import com.unifest.android.core.common.utils.toLocalDate
import com.unifest.android.core.designsystem.ComponentPreview
import com.unifest.android.core.designsystem.R
import com.unifest.android.core.designsystem.component.NetworkImage
import com.unifest.android.core.designsystem.component.UnifestOutlinedButton
import com.unifest.android.core.designsystem.theme.Content2
import com.unifest.android.core.designsystem.theme.Content3
import com.unifest.android.core.designsystem.theme.Content4
import com.unifest.android.core.designsystem.theme.Content6
import com.unifest.android.core.model.FestivalModel
import com.unifest.android.feature.festival.viewmodel.FestivalUiAction
import com.unifest.android.core.designsystem.R
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf

Expand Down
Loading
Loading