Skip to content

Commit

Permalink
Merge pull request #43 from team-haribo/feature/42-write-the-logic-la…
Browse files Browse the repository at this point in the history
…te-list

🔀 :: (#42) - write the logic late list
  • Loading branch information
diejdkll authored Feb 8, 2024
2 parents 6ad4dc3 + 54739cc commit 792dd2c
Show file tree
Hide file tree
Showing 19 changed files with 205 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ fun GomsNavHost(
startDestination: String = loginRoute
) {
val navController = appState.navController
val viewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current)
val signUpViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current)
val mainViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current)
NavHost(
navController = navController,
startDestination = startDestination,
Expand All @@ -45,30 +46,31 @@ fun GomsNavHost(
onMainClick = { appState.navigateToTopLevelDestination(TopLevelDestination.MAIN) }
)
signUpScreen(
viewModelStoreOwner = viewModelStoreOwner,
viewModelStoreOwner = signUpViewModelStoreOwner,
onBackClick = navController::popBackStack,
onNumberClick = navController::navigateToNumber
)
numberScreen(
viewModelStoreOwner = viewModelStoreOwner,
viewModelStoreOwner = signUpViewModelStoreOwner,
onBackClick = navController::popBackStack,
onPasswordClick = navController::navigateToPassword
)
passwordScreen(
viewModelStoreOwner = viewModelStoreOwner,
viewModelStoreOwner = signUpViewModelStoreOwner,
onBackClick = navController::popBackStack,
onLoginClick = { appState.navigateToTopLevelDestination(TopLevelDestination.LOGIN) }
)
mainScreen(
viewModelStoreOwner = viewModelStoreOwner,
viewModelStoreOwner = mainViewModelStoreOwner,
onOutingStatusClick = navController::navigateToOutingStatus,
onLateListClick = navController::navigateToLateList
)
outingStatusScreen(
viewModelStoreOwner = viewModelStoreOwner,
viewModelStoreOwner = mainViewModelStoreOwner,
onBackClick = navController::popBackStack
)
lateListScreen(
viewModelStoreOwner = mainViewModelStoreOwner,
onBackClick = navController::popBackStack
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class AndroidFeatureConventionPlugin : Plugin<Project> {

add("implementation", libs.findLibrary("androidx.lifecycle.runtimeCompose").get())
add("implementation", libs.findLibrary("androidx.lifecycle.viewModelCompose").get())
add("implementation", libs.findLibrary("kotlinx.datetime").get())
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.goms.data.repository.council

import com.goms.model.response.council.LateResponse
import kotlinx.coroutines.flow.Flow
import kotlinx.datetime.LocalDate
import java.util.UUID

interface CouncilRepository {
suspend fun deleteOuting(accountIdx: UUID): Flow<Unit>

suspend fun getLateList(date: LocalDate): Flow<List<LateResponse>>
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.goms.data.repository.council

import com.goms.model.response.council.LateResponse
import com.goms.network.datasource.council.CouncilDataSource
import kotlinx.coroutines.flow.Flow
import kotlinx.datetime.LocalDate
import java.util.UUID
import javax.inject.Inject

Expand All @@ -11,4 +13,8 @@ class CouncilRepositoryImpl @Inject constructor(
override suspend fun deleteOuting(accountIdx: UUID): Flow<Unit> {
return remoteCouncilDataSource.deleteOuting(accountIdx = accountIdx)
}

override suspend fun getLateList(date: LocalDate): Flow<List<LateResponse>> {
return remoteCouncilDataSource.getLateList(date = date)
}
}
1 change: 1 addition & 0 deletions core/design-system/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ android {
dependencies {
implementation(libs.coil.kt.compose)
implementation(libs.gauth)
implementation(libs.kotlinx.datetime)
}

fun getApiKey(propertyKey: String): String {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
package com.goms.design_system.util

import kotlinx.datetime.*
import java.time.DayOfWeek
import java.time.Instant
import java.time.LocalDate
import java.time.ZoneId
import java.time.temporal.TemporalAdjusters

fun getDefaultWednesday(): Instant {
val currentDate = LocalDate.now()

return if (currentDate.dayOfWeek != DayOfWeek.WEDNESDAY) {
val lastWednesday = currentDate.with(TemporalAdjusters.previous(DayOfWeek.WEDNESDAY))
lastWednesday.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()
val currentDate = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).date
return if (currentDate.dayOfWeek == DayOfWeek.WEDNESDAY) {
currentDate.atStartOfDayIn(TimeZone.currentSystemDefault())
} else {
currentDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()
val lastWednesday = currentDate.minus((currentDate.dayOfWeek.ordinal - DayOfWeek.WEDNESDAY.ordinal).toLong(), DateTimeUnit.DAY)
lastWednesday.atStartOfDayIn(TimeZone.currentSystemDefault())
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.goms.domain.council

import com.goms.data.repository.council.CouncilRepository
import com.goms.model.response.council.LateResponse
import kotlinx.coroutines.flow.Flow
import kotlinx.datetime.LocalDate
import javax.inject.Inject

class GetLateListUseCase @Inject constructor(
private val councilRepository: CouncilRepository
) {
suspend operator fun invoke(date: LocalDate): Flow<List<LateResponse>> =
councilRepository.getLateList(date = date)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.goms.model.response.council

import com.goms.model.enum.Gender
import com.goms.model.enum.Major
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class LateResponse(
@Json(name = "accountIdx") val accountIdx: String,
@Json(name = "name") val name: String,
@Json(name = "grade") val grade: Int,
@Json(name = "major") val major: Major,
@Json(name = "gender") val gender: Gender,
@Json(name = "profileUrl") val profileUrl: String?
)
9 changes: 9 additions & 0 deletions core/network/src/main/java/com/goms/network/api/CouncilAPI.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
package com.goms.network.api

import com.goms.model.response.council.LateResponse
import kotlinx.datetime.LocalDate
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.Path
import retrofit2.http.Query
import java.util.UUID

interface CouncilAPI {
@DELETE("/api/v2/student-council/outing/{accountIdx}")
suspend fun deleteOuting(
@Path("accountIdx") accountIdx: UUID
)

@GET("/api/v2/student-council/late")
suspend fun getLateList(
@Query("date") date: LocalDate
): List<LateResponse>
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.goms.network.datasource.council

import com.goms.model.response.council.LateResponse
import kotlinx.coroutines.flow.Flow
import kotlinx.datetime.LocalDate
import java.util.UUID

interface CouncilDataSource {
suspend fun deleteOuting(accountIdx: UUID): Flow<Unit>

suspend fun getLateList(date: LocalDate): Flow<List<LateResponse>>
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.goms.network.datasource.council

import com.goms.model.response.council.LateResponse
import com.goms.network.api.CouncilAPI
import com.goms.network.util.GomsApiHandler
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.datetime.LocalDate
import java.util.UUID
import javax.inject.Inject

Expand All @@ -19,4 +21,12 @@ class CouncilDataSourceImpl @Inject constructor(
.sendRequest()
)
}.flowOn(Dispatchers.IO)

override suspend fun getLateList(date: LocalDate): Flow<List<LateResponse>> = flow {
emit(
GomsApiHandler<List<LateResponse>>()
.httpRequest { councilAPI.getLateList(date = date) }
.sendRequest()
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,12 @@ class AuthInterceptor @Inject constructor(
val method = request.method

if (path.contains(ignorePath) && (method == ignoreMethodPost || method == ignoreMethodGet)) {
return chain.proceed(request)
val response = chain.proceed(request)
return if (response.code == 204) {
response.newBuilder().code(200).build()
} else {
response
}
}

runBlocking {
Expand Down
42 changes: 29 additions & 13 deletions feature/main/src/main/java/com/goms/main/LateListScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@ import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.layout.Column
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.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.rememberDatePickerState
Expand All @@ -25,42 +23,59 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp
import androidx.lifecycle.ViewModelStoreOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.goms.design_system.component.bottomsheet.DatePickerBottomSheet
import com.goms.design_system.component.button.GomsBackButton
import com.goms.design_system.component.modifier.gomsClickable
import com.goms.design_system.component.textfield.GomsSearchTextField
import com.goms.design_system.theme.GomsTheme
import com.goms.design_system.util.getDefaultWednesday
import com.goms.design_system.util.keyboardAsState
import com.goms.main.component.LateList
import com.goms.main.component.LateListText
import java.time.Instant
import java.time.ZoneId
import com.goms.main.viewmodel.GetLateListUiState
import com.goms.main.viewmodel.MainViewModelProvider
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime

@Composable
fun LateListRoute(
viewModelStoreOwner: ViewModelStoreOwner,
onBackClick: () -> Unit
) {
LateListScreen(
onBackClick = onBackClick
)
MainViewModelProvider(viewModelStoreOwner = viewModelStoreOwner) { viewModel ->
val getLateListUiState by viewModel.getLateListUiState.collectAsStateWithLifecycle()

LateListScreen(
getLateListUiState = getLateListUiState,
lateListCallBack = { viewModel.getLateList(it) },
onBackClick = onBackClick
)
}
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LateListScreen(
getLateListUiState: GetLateListUiState,
lateListCallBack: (LocalDate) -> Unit,
onBackClick: () -> Unit,
) {
val scrollState = rememberScrollState()
val focusManager = LocalFocusManager.current
val isKeyboardOpen by keyboardAsState()
val datePickerState = rememberDatePickerState()
var onDatePickerBottomSheetOpenClick by remember { mutableStateOf(false) }
val selectedDate = Instant.ofEpochMilli(datePickerState.selectedDateMillis ?: getDefaultWednesday().toEpochMilli())
.atZone(ZoneId.systemDefault())
.toLocalDate()
val selectedDateMillis = datePickerState.selectedDateMillis ?: getDefaultWednesday().toEpochMilliseconds()
val selectedInstant = Instant.fromEpochMilliseconds(selectedDateMillis)
val selectedLocalDateTime = selectedInstant.toLocalDateTime(TimeZone.currentSystemDefault())
val selectedLocalDate = selectedLocalDateTime.date

LaunchedEffect(selectedLocalDate) {
lateListCallBack(selectedLocalDate)
}

LaunchedEffect(isKeyboardOpen) {
if (!isKeyboardOpen) {
Expand Down Expand Up @@ -93,6 +108,7 @@ fun LateListScreen(
LateListText(modifier = Modifier.align(Alignment.Start))
Spacer(modifier = Modifier.height(8.dp))
LateList(
getLateListUiState = getLateListUiState,
onBottomSheetOpenClick = { onDatePickerBottomSheetOpenClick = true }
)
}
Expand Down
Loading

0 comments on commit 792dd2c

Please sign in to comment.