Skip to content
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 @@ -3,8 +3,8 @@ package com.sampoom.android
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sampoom.android.core.util.GlobalMessageHandler
import com.sampoom.android.feature.auth.domain.model.User
import com.sampoom.android.feature.auth.domain.usecase.GetStoredUserUseCase
import com.sampoom.android.feature.user.domain.model.User
import com.sampoom.android.feature.user.domain.usecase.GetStoredUserUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
Expand Down
20 changes: 13 additions & 7 deletions app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.sampoom.android.app.navigation

import android.annotation.SuppressLint
import androidx.activity.ComponentActivity
import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.CircularProgressIndicator
Expand All @@ -25,11 +23,8 @@ 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.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.core.view.WindowInsetsControllerCompat
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavHostController
Expand All @@ -49,18 +44,19 @@ import com.sampoom.android.core.ui.theme.Main500
import com.sampoom.android.core.ui.theme.backgroundCardColor
import com.sampoom.android.core.ui.theme.backgroundColor
import com.sampoom.android.core.ui.theme.textColor
import com.sampoom.android.feature.auth.domain.model.User
import com.sampoom.android.feature.auth.ui.AuthViewModel
import com.sampoom.android.feature.auth.ui.LoginScreen
import com.sampoom.android.feature.auth.ui.SignUpScreen
import com.sampoom.android.feature.cart.ui.CartListScreen
import com.sampoom.android.feature.dashboard.ui.DashboardScreen
import com.sampoom.android.feature.dashboard.ui.SettingScreen
import com.sampoom.android.feature.order.ui.OrderDetailScreen
import com.sampoom.android.feature.order.ui.OrderListScreen
import com.sampoom.android.feature.outbound.ui.OutboundListScreen
import com.sampoom.android.feature.part.ui.PartListScreen
import com.sampoom.android.feature.part.ui.PartScreen
import com.sampoom.android.feature.setting.ui.SettingScreen
import com.sampoom.android.feature.user.domain.model.User
import com.sampoom.android.feature.user.ui.EmployeeListScreen
import kotlinx.coroutines.flow.filterNotNull

// Auth Screen
Expand Down Expand Up @@ -216,6 +212,13 @@ fun AppNavHost(
}
)
}
composable(ROUTE_EMPLOYEE) {
EmployeeListScreen(
onNavigateBack = {
navController.navigateUp()
}
)
}
}
TopSnackBarHost(hostState = snackBarHostState, isError = currentMessage?.isError ?: false)
}
Expand All @@ -238,6 +241,9 @@ fun MainScreen(
composable(ROUTE_DASHBOARD) {
DashboardScreen(
paddingValues = innerPadding,
onEmployeeClick = {
parentNavController.navigate(ROUTE_EMPLOYEE)
},
onSettingClick = {
parentNavController.navigate(ROUTE_SETTINGS)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package com.sampoom.android.core.di
import com.google.gson.FieldNamingPolicy
import com.google.gson.GsonBuilder
import com.sampoom.android.BuildConfig
import com.sampoom.android.core.preferences.AuthPreferences
import com.sampoom.android.core.network.TokenAuthenticator
import com.sampoom.android.core.network.TokenInterceptor
import com.sampoom.android.core.network.TokenRefreshService
import com.sampoom.android.core.preferences.AuthPreferences
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sampoom.android.core.model

enum class EmployeeStatus {
ACTIVE, // 재직
LEAVE, // 휴직
RETIRED // 퇴직
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.sampoom.android.core.network
import com.sampoom.android.core.preferences.AuthPreferences
import com.sampoom.android.feature.auth.data.remote.api.AuthApi
import com.sampoom.android.feature.auth.data.remote.dto.RefreshRequestDto
import com.sampoom.android.feature.auth.domain.model.User
import com.sampoom.android.feature.user.domain.model.User
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import androidx.datastore.preferences.core.longPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import com.sampoom.android.core.model.UserPosition
import com.sampoom.android.feature.auth.domain.model.User
import com.sampoom.android.feature.user.domain.model.User
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.first
import javax.inject.Inject
import javax.inject.Singleton
import kotlinx.coroutines.flow.first

// Per official guidance, DataStore instance should be single and at top-level.
private val Context.authDataStore by preferencesDataStore(name = "auth_prefs")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.height
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
Expand All @@ -18,6 +17,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.sampoom.android.core.ui.theme.FailRed
import com.sampoom.android.core.ui.theme.Main300
import com.sampoom.android.core.ui.theme.Main500
import com.sampoom.android.core.ui.theme.White
import com.sampoom.android.core.ui.theme.disableColor
Expand Down Expand Up @@ -79,17 +79,17 @@ fun CommonButton(
}
}

// Light/secondary (tonal) filled button
// Light/secondary outlined button with semi-transparent background
ButtonVariant.Secondary -> {
FilledTonalButton(
OutlinedButton(
onClick = onClick,
enabled = enabled,
shape = shape,
modifier = modifier.height(height),
colors = ButtonDefaults.filledTonalButtonColors(
containerColor = Main500,
contentColor = White,
disabledContainerColor = disableColor(),
border = BorderStroke(1.dp, Main500),
colors = ButtonDefaults.outlinedButtonColors(
containerColor = Main300.copy(alpha = 0.3f),
contentColor = Main500,
disabledContentColor = textSecondaryColor()
)
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,21 @@ import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.material3.darkColorScheme
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.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.input.ImeAction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import androidx.compose.material3.Typography
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.sampoom.android.R

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sampoom.android.feature.auth.domain
package com.sampoom.android.core.util

import com.sampoom.android.R

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sampoom.android.core.util

import com.sampoom.android.core.model.EmployeeStatus

fun employeeStatusToKorean(status: EmployeeStatus?): String = when (status) {
EmployeeStatus.ACTIVE -> "재직"
EmployeeStatus.LEAVE -> "휴직"
EmployeeStatus.RETIRED -> "퇴직"
else -> "-"
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.sampoom.android.feature.auth.data.mapper

import com.sampoom.android.core.model.UserPosition
import com.sampoom.android.feature.auth.data.remote.dto.GetProfileResponseDto
import com.sampoom.android.feature.auth.data.remote.dto.GetVendorsResponseDto
import com.sampoom.android.feature.auth.data.remote.dto.LoginResponseDto
import com.sampoom.android.feature.auth.domain.model.User
import com.sampoom.android.feature.auth.domain.model.Vendor
import com.sampoom.android.feature.user.domain.model.User

fun LoginResponseDto.toModel(): User = User(
userId = userId,
Expand All @@ -23,28 +22,6 @@ fun LoginResponseDto.toModel(): User = User(
endedAt = null
)

fun GetProfileResponseDto.toModel(): User = User(
userId = userId,
userName = userName,
email = email,
role = role,
accessToken = "",
refreshToken = "",
expiresIn = 0L,
position = position.toUserPosition(),
workspace = workspace,
branch = branch,
agencyId = organizationId,
startedAt = startedAt,
endedAt = endedAt
)

private fun String.toUserPosition(): UserPosition = try {
UserPosition.valueOf(this.uppercase())
} catch (_: IllegalArgumentException) {
UserPosition.STAFF
}

fun GetVendorsResponseDto.toModel(): Vendor = Vendor(
id = id,
vendorCode = vendorCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,17 @@ package com.sampoom.android.feature.auth.data.remote.api

import com.sampoom.android.core.model.ApiResponse
import com.sampoom.android.core.model.ApiSuccessResponse
import com.sampoom.android.feature.auth.data.remote.dto.GetVendorsResponseDto
import com.sampoom.android.feature.auth.data.remote.dto.LoginRequestDto
import com.sampoom.android.feature.auth.data.remote.dto.SignUpRequestDto
import com.sampoom.android.feature.auth.data.remote.dto.SignUpResponseDto
import com.sampoom.android.feature.auth.data.remote.dto.LoginResponseDto
import com.sampoom.android.feature.auth.data.remote.dto.RefreshRequestDto
import com.sampoom.android.feature.auth.data.remote.dto.RefreshResponseDto
import com.sampoom.android.feature.auth.data.remote.dto.UpdateProfileRequestDto
import com.sampoom.android.feature.auth.data.remote.dto.UpdateProfileResponseDto
import com.sampoom.android.feature.auth.data.remote.dto.GetProfileResponseDto
import com.sampoom.android.feature.auth.data.remote.dto.GetVendorsResponseDto
import com.sampoom.android.feature.auth.data.remote.dto.SignUpRequestDto
import com.sampoom.android.feature.auth.data.remote.dto.SignUpResponseDto
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.PATCH
import retrofit2.http.POST
import retrofit2.http.Query

interface AuthApi {
@POST("auth/signup")
Expand All @@ -34,12 +29,6 @@ interface AuthApi {
@Headers("X-No-Auth: true")
suspend fun login(@Body body: LoginRequestDto): ApiResponse<LoginResponseDto>

@GET("user/profile")
suspend fun getProfile(@Query("workspace") workspace: String): ApiResponse<GetProfileResponseDto>

@PATCH("user/profile")
suspend fun updateProfile(@Body body: UpdateProfileRequestDto): ApiResponse<UpdateProfileResponseDto>

@GET("site/vendors")
suspend fun getVendors(): ApiResponse<List<GetVendorsResponseDto>>
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@ import com.sampoom.android.feature.auth.data.remote.api.AuthApi
import com.sampoom.android.feature.auth.data.remote.dto.LoginRequestDto
import com.sampoom.android.feature.auth.data.remote.dto.RefreshRequestDto
import com.sampoom.android.feature.auth.data.remote.dto.SignUpRequestDto
import com.sampoom.android.feature.auth.domain.model.User
import com.sampoom.android.feature.auth.domain.model.VendorList
import com.sampoom.android.feature.auth.domain.repository.AuthRepository
import com.sampoom.android.feature.outbound.data.mapper.toModel
import com.sampoom.android.feature.user.domain.model.User
import kotlinx.coroutines.delay
import javax.inject.Inject

Expand Down Expand Up @@ -63,29 +62,7 @@ class AuthRepositoryImpl @Inject constructor(
val loginUser = loginDto.data.toModel()

preferences.saveUser(loginUser)

val profileUser = retry(times = 5, initialDelay = 300) {
getProfile("AGENCY").getOrThrow()
}

val user = User(
userId = loginUser.userId,
userName = profileUser.userName,
email = profileUser.email,
role = profileUser.role,
accessToken = loginUser.accessToken,
refreshToken = loginUser.refreshToken,
expiresIn = loginUser.expiresIn,
position = profileUser.position,
workspace = profileUser.workspace,
branch = profileUser.branch,
agencyId = profileUser.agencyId,
startedAt = profileUser.startedAt,
endedAt = profileUser.endedAt
)

preferences.saveUser(user)
user
loginUser
}
}

Expand Down Expand Up @@ -126,14 +103,6 @@ class AuthRepositoryImpl @Inject constructor(

override suspend fun isSignedIn(): Boolean = preferences.hasToken()

override suspend fun getProfile(workspace: String): Result<User> {
return runCatching {
val dto = api.getProfile(workspace)
if (!dto.success) throw Exception(dto.message)
dto.data.toModel()
}
}

override suspend fun getVendorList(): Result<VendorList> {
return runCatching {
val dto = api.getVendors()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.sampoom.android.feature.auth.domain.repository

import com.sampoom.android.feature.auth.domain.model.User
import com.sampoom.android.feature.auth.domain.model.VendorList
import com.sampoom.android.feature.user.domain.model.User

interface AuthRepository {
suspend fun signUp(
Expand All @@ -18,6 +18,5 @@ interface AuthRepository {
suspend fun refreshToken(): Result<User>
suspend fun clearTokens(): Result<Unit>
suspend fun isSignedIn(): Boolean
suspend fun getProfile(workspace: String): Result<User>
suspend fun getVendorList(): Result<VendorList>
}
Loading