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

Feature/onboarding invitation UI #18

Merged
merged 6 commits into from
Aug 6, 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
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ 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.ColumnScope
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
Expand Down Expand Up @@ -38,7 +39,7 @@ import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography
fun MissionMateDialog(
@StringRes titleId: Int,
onDismissRequest: () -> Unit,
onClickOk : () -> Unit,
onClickOk: () -> Unit,
modifier: Modifier = Modifier,
@StringRes descriptionId: Int? = null,
@StringRes okTextId: Int? = null,
Expand Down Expand Up @@ -97,7 +98,8 @@ fun MissionMateDialog(

if (cancelTextId != null) {
Text(
modifier = Modifier.padding(top = 20.dp)
modifier = Modifier
.padding(top = 20.dp)
.clickable(
interactionSource = null,
indication = null,
Expand All @@ -117,6 +119,7 @@ fun MissionMateDialog(
@Composable
fun MissionMateDialog(
onDismissRequest: () -> Unit,
onClickOk: () -> Unit,
modifier: Modifier = Modifier,
@StringRes okTextId: Int? = null,
@StringRes cancelTextId: Int? = null,
Expand All @@ -129,7 +132,7 @@ fun MissionMateDialog(
start = 24.dp,
end = 24.dp
),
content: @Composable () -> Unit
content: @Composable ColumnScope.() -> Unit
) {
Dialog(
properties = DialogProperties(
Expand All @@ -146,25 +149,37 @@ fun MissionMateDialog(
horizontalAlignment = Alignment.CenterHorizontally
) {
content()
if (okTextId != null) {
MissionMateTextButton(
modifier = Modifier
.fillMaxWidth(),
textId = okTextId,
textStyle = okTextStyle,
onClick = {}
)
}

if (cancelTextId != null) {
Text(
modifier = Modifier.padding(top = 20.dp),
text = stringResource(id = cancelTextId),
style = cancelTextStyle,
textAlign = TextAlign.Center,
color = ColorGray3_FF727484
)
Column(
horizontalAlignment = Alignment.CenterHorizontally
) {
if (okTextId != null) {
MissionMateTextButton(
modifier = Modifier
.fillMaxWidth(),
textId = okTextId,
textStyle = okTextStyle,
onClick = onClickOk
)
}

if (cancelTextId != null) {
Text(
modifier = Modifier
.padding(top = 20.dp)
.clickable(
interactionSource = null,
indication = null,
onClick = onDismissRequest
),
text = stringResource(id = cancelTextId),
style = cancelTextStyle,
textAlign = TextAlign.Center,
color = ColorGray3_FF727484
)
}
}

}
}
}
Expand Down Expand Up @@ -199,7 +214,8 @@ fun PreviewMissionMateContentDialog() {
modifier = Modifier.fillMaxWidth(),
okTextId = R.string.app_name,
cancelTextId = R.string.app_name,
onDismissRequest = {}
onDismissRequest = {},
onClickOk = {}
) {
Spacer(
modifier = Modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ internal fun MainNavHost(

}
)
invitationCodeNavGraph()
invitationCodeNavGraph(
onBackClick = {
navigator.popBackStack()
}
)
profileNavGraph(
onSaveSuccess = { navigator.navigationToOnboarding() }
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.goalpanzi.mission_mate.core.navigation.RouteModel
import com.goalpanzi.mission_mate.feature.onboarding.screen.OnboardingRoute
import com.goalpanzi.mission_mate.feature.onboarding.screen.boardsetup.BoardSetupRoute
import com.goalpanzi.mission_mate.feature.onboarding.screen.boardsetup.BoardSetupSuccessScreen
import com.goalpanzi.mission_mate.feature.onboarding.screen.invitation.InvitationCodeRoute

fun NavController.navigateToOnboarding() {
this.navigate(RouteModel.Onboarding)
Expand Down Expand Up @@ -61,7 +62,12 @@ fun NavGraphBuilder.boardSetupSuccessNavGraph(
}
}

fun NavGraphBuilder.invitationCodeNavGraph() {
fun NavGraphBuilder.invitationCodeNavGraph(
onBackClick: () -> Unit
) {
composable<OnboardingRouteModel.InvitationCode> {
InvitationCodeRoute(
onBackClick = onBackClick
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ fun BoardSetupNavigationBar(
)
}
Row(
modifier = Modifier.padding(16.dp),
modifier = Modifier.padding(start = 16.dp,bottom = 16.dp, end = 24.dp),
verticalAlignment = Alignment.CenterVertically
) {
Text(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package com.goalpanzi.mission_mate.feature.onboarding.component

import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.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.draw.clip
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray1_FF404249
import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray3_FF727484
import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray4_FFE5E5E5
import com.goalpanzi.mission_mate.core.designsystem.theme.ColorGray5_80F5F6F9
import com.goalpanzi.mission_mate.core.designsystem.theme.ColorRed_FFFF5858
import com.goalpanzi.mission_mate.core.designsystem.theme.ColorWhite_FFFFFFFF
import com.goalpanzi.mission_mate.core.designsystem.theme.MissionMateTypography

@Composable
fun InvitationCodeTextField(
text: String,
onValueChange: (String) -> Unit,
modifier: Modifier = Modifier,
hint: String? = null,
isError: Boolean = false,
textStyle: TextStyle = MissionMateTypography.heading_md_bold,
hintStyle: TextStyle = MissionMateTypography.heading_md_bold,
textColor: Color = ColorGray1_FF404249,
hintColor: Color = ColorGray3_FF727484,
containerColor: Color = ColorWhite_FFFFFFFF,
unfocusedHintColor: Color = ColorGray5_80F5F6F9,
borderStroke: BorderStroke = BorderStroke(1.dp, ColorGray5_80F5F6F9),
focusedBorderStroke: BorderStroke = BorderStroke(1.dp, ColorGray4_FFE5E5E5),
errorBorderStroke: BorderStroke = BorderStroke(2.dp, ColorRed_FFFF5858),
shape: Shape = RoundedCornerShape(12.dp),
isSingleLine: Boolean = true,
visualTransformation: VisualTransformation = VisualTransformation.None,
textAlign: Alignment = Alignment.Center,
contentPadding: PaddingValues = PaddingValues(),
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
keyboardActions: KeyboardActions = KeyboardActions.Default,
) {
var isFocused by remember { mutableStateOf(false) }
BasicTextField(
modifier = modifier
.onFocusChanged {
isFocused = it.isFocused
},
value = text,
singleLine = isSingleLine,
textStyle = textStyle.copy(
color = textColor,
textAlign = TextAlign.Center,
lineHeight = 40.sp
),
visualTransformation = visualTransformation,
keyboardOptions = keyboardOptions,
keyboardActions = keyboardActions,
onValueChange = onValueChange,
decorationBox = { innerTextField ->
Box(
modifier = Modifier
.clip(shape)
.border(
border = if (isError) errorBorderStroke
else if (isFocused || text.isNotEmpty()) focusedBorderStroke
else borderStroke,
shape = shape
)
.background(
if (!isFocused && text.isEmpty()) unfocusedHintColor
else containerColor
)
.padding(contentPadding),
contentAlignment = textAlign
) {
if (text.isBlank() && !isFocused) {
Text(
modifier = Modifier.fillMaxWidth(),
text = hint ?: "0",
style = hintStyle,
color = hintColor,
textAlign = TextAlign.Center
)
}
innerTextField()
}

}
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.goalpanzi.mission_mate.feature.onboarding.model

sealed class CodeResultEvent {
data class Success(val mission : MissionUiModel) : CodeResultEvent()
data object Error : CodeResultEvent()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.goalpanzi.mission_mate.feature.onboarding.model

data class MissionUiModel(
val missionTitle : String,
val missionPeriod : String,
val missionDays : String,
val missionTime : String
)
Loading
Loading