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
128 changes: 127 additions & 1 deletion app/src/main/java/com/paw/key/core/util/PreferenceDataStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ private val TOTAL_DISTANCE_KEY = floatPreferencesKey("total_distance")
private val TOTAL_TIME_KEY = longPreferencesKey("total_time")
private val TOTAL_STEPS_KEY = intPreferencesKey("total_steps")

private val LOGIN_EMAIL_KEY = stringPreferencesKey("login_email")
private val LOGIN_PASSWORD_KEY = stringPreferencesKey("login_password")
private val USER_ID_KEY = intPreferencesKey("user_id")
private val USER_NAME_KEY = stringPreferencesKey("user_name")
private val PET_ID_KEY = intPreferencesKey("pet_id")
private val PET_NAME_KEY = stringPreferencesKey("pet_name")

private fun List<LatLng>.toPreferenceString(): String =
joinToString(";") { "${it.latitude},${it.longitude}" }

Expand Down Expand Up @@ -72,7 +79,126 @@ object PreferenceDataStore {

suspend fun clearWalkSummary(context: Context) {
context.summaryStore.edit { preferences ->
preferences.clear() // 모든 데이터 삭제
preferences.remove(POINTS_KEY)
preferences.remove(TOTAL_DISTANCE_KEY)
preferences.remove(TOTAL_TIME_KEY)
preferences.remove(TOTAL_STEPS_KEY)
}
}

suspend fun saveLoginInfo(
context: Context,
email: String,
password: String
) {
context.summaryStore.edit { preferences ->
preferences[LOGIN_EMAIL_KEY] = email
preferences[LOGIN_PASSWORD_KEY] = password
}
}

fun getLoginEmail(context: Context): Flow<String> {
return context.summaryStore.data.map { preferences ->
preferences[LOGIN_EMAIL_KEY] ?: ""
}
}

fun getLoginPassword(context: Context): Flow<String> {
return context.summaryStore.data.map { preferences ->
preferences[LOGIN_PASSWORD_KEY] ?: ""
}
}

data class LoginInfo(
val email: String,
val password: String
)

fun getLoginInfo(context: Context): Flow<LoginInfo> {
return context.summaryStore.data.map { preferences ->
LoginInfo(
email = preferences[LOGIN_EMAIL_KEY] ?: "",
password = preferences[LOGIN_PASSWORD_KEY] ?: ""
)
}
}

suspend fun clearLoginInfo(context: Context) {
context.summaryStore.edit { preferences ->
preferences.remove(LOGIN_EMAIL_KEY)
preferences.remove(LOGIN_PASSWORD_KEY)
}
}

suspend fun saveUserInfo(
context: Context,
userId: Int,
userName: String,
petId: Int,
petName: String
) {
context.summaryStore.edit { preferences ->
preferences[USER_ID_KEY] = userId
preferences[USER_NAME_KEY] = userName
preferences[PET_ID_KEY] = petId
preferences[PET_NAME_KEY] = petName
}
}

fun getUserId(context: Context): Flow<Int> {
return context.summaryStore.data.map { preferences ->
preferences[USER_ID_KEY] ?: 0
}
}

fun getUserName(context: Context): Flow<String> {
return context.summaryStore.data.map { preferences ->
preferences[USER_NAME_KEY] ?: ""
}
}

fun getPetId(context: Context): Flow<Int> {
return context.summaryStore.data.map { preferences ->
preferences[PET_ID_KEY] ?: 0
}
}

fun getPetName(context: Context): Flow<String> {
return context.summaryStore.data.map { preferences ->
preferences[PET_NAME_KEY] ?: ""
}
}

data class UserInfo(
val userId: Int,
val userName: String,
val petId: Int,
val petName: String
)

fun getUserInfo(context: Context): Flow<UserInfo> {
return context.summaryStore.data.map { preferences ->
UserInfo(
userId = preferences[USER_ID_KEY] ?: 0,
userName = preferences[USER_NAME_KEY] ?: "",
petId = preferences[PET_ID_KEY] ?: 0,
petName = preferences[PET_NAME_KEY] ?: ""
)
}
}

suspend fun clearUserInfo(context: Context) {
context.summaryStore.edit { preferences ->
preferences.remove(USER_ID_KEY)
preferences.remove(USER_NAME_KEY)
preferences.remove(PET_ID_KEY)
preferences.remove(PET_NAME_KEY)
}
}

suspend fun clearAllData(context: Context) {
context.summaryStore.edit { preferences ->
preferences.clear()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,25 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class OnboardingInfoResponse (
@SerialName("code")
val code: String,
@SerialName("message")
val message: String,
@SerialName("data")
val data: OnboardingInfoDataDto
)

@Serializable
data class OnboardingInfoDataDto (
data class OnboardingInfoResponse(
@SerialName("userId")
val userId: Int,
@SerialName("token")
val token: String
@SerialName("userName")
val userName: String,
@SerialName("loginId")
val loginId: String,
@SerialName("petId")
val petId: Int,
@SerialName("petName")
val petName: String
)


fun OnboardingInfoResponse.toDomain(): OnboardingInfo {
return OnboardingInfo(
userId = this.data.userId,
token = this.data.token
userId = this.userId,
userName = this.userName,
loginId = this.loginId,
petId = this.petId,
petName = this.petName
)
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
package com.paw.key.data.remote.datasource

import com.paw.key.data.dto.request.onboarding.OnboardingInfoRequest
import com.paw.key.data.dto.response.BaseResponse
import com.paw.key.data.dto.response.onboarding.OnboardingInfoResponse
import com.paw.key.data.service.onboarding.OnboardingInfoService
import com.google.gson.Gson
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MultipartBody
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import javax.inject.Inject

class OnboardingInfoDataSource @Inject constructor(
private val service: OnboardingInfoService
) {
suspend fun postOnboardingInfo(
userId: Int,
dataPart: RequestBody,
imagePart: MultipartBody.Part
): OnboardingInfoResponse =
service.postInfo(
userId = userId,
data = dataPart,
petProfile = imagePart
)
file: MultipartBody.Part,
onboardingInfoRequest: OnboardingInfoRequest
): BaseResponse<OnboardingInfoResponse> {
val gson = Gson()
val jsonString = gson.toJson(onboardingInfoRequest)
val requestBody = jsonString.toRequestBody("application/json".toMediaType())

return service.postInfo(userId, requestBody, file)
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package com.paw.key.data.repositoryimpl.onboarding

import com.paw.key.data.dto.request.onboarding.OnboardingInfoRequest
import com.paw.key.data.dto.response.BaseResponse
import com.paw.key.data.dto.response.onboarding.OnboardingInfoResponse
import com.paw.key.data.remote.datasource.OnboardingInfoDataSource
import com.paw.key.domain.repository.onboarding.OnboardingInfoRepository
import okhttp3.MultipartBody
import okhttp3.RequestBody
import javax.inject.Inject

class OnboardingInfoRepositoryImpl @Inject constructor(
Expand All @@ -13,14 +14,14 @@ class OnboardingInfoRepositoryImpl @Inject constructor(

override suspend fun postOnboardingInfo(
userId: Int,
requestBody: RequestBody,
petImage: MultipartBody.Part
): Result<OnboardingInfoResponse> = runCatching {
val response = dataSource.postOnboardingInfo(userId, requestBody, petImage)
image: MultipartBody.Part,
onboardingInfoRequest: OnboardingInfoRequest
): Result<BaseResponse<OnboardingInfoResponse>> = runCatching {
val response = dataSource.postOnboardingInfo(userId, image, onboardingInfoRequest)
if (response.code == "S000") {
response
} else {
throw Exception(response.message)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.paw.key.data.service.onboarding

import com.paw.key.data.dto.response.BaseResponse
import com.paw.key.data.dto.response.onboarding.OnboardingInfoResponse
import okhttp3.MultipartBody
import okhttp3.RequestBody
Expand All @@ -15,5 +16,5 @@ interface OnboardingInfoService {
@Header("X-USER-ID") userId: Int,
@Part("data") data: RequestBody,
@Part petProfile: MultipartBody.Part
): OnboardingInfoResponse
): BaseResponse<OnboardingInfoResponse>
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.paw.key.domain.model.entity.onboarding

// 온보딩에서 사용하는 사용자 및 반려견 정보
data class OnboardingInfo(
val userId: Int,
val token: String
val userName: String,
val loginId: String,
val petId: Int,
val petName: String
)

// 반려견 성향 정보
data class OnboardingPets(
val petTraitCategoryList: List<PetTraitCategory>
)
Expand All @@ -22,7 +23,6 @@ data class PetTraitCategoryOption(
val petTraitCategoryOptionText: String
)

// 지역 정보 (구, 동 포함)
data class OnboardingRegion(
val districtList: List<District>
)
Expand All @@ -42,8 +42,7 @@ data class Dong(
val name: String
)

data class DistrictResponse(
val code: String,
val message: String,
val data: OnboardingRegion
data class PetTraitDto(
val traitCategoryId: Int,
val traitOptionId: List<Int>
)
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.paw.key.domain.repository.onboarding

import com.paw.key.data.dto.request.onboarding.OnboardingInfoRequest
import com.paw.key.data.dto.response.BaseResponse
import com.paw.key.data.dto.response.onboarding.OnboardingInfoResponse
import okhttp3.MultipartBody
import okhttp3.RequestBody

interface OnboardingInfoRepository {
suspend fun postOnboardingInfo(
userId: Int,
requestBody: RequestBody,
petImage: MultipartBody.Part
): Result<OnboardingInfoResponse>
}
image: MultipartBody.Part,
onboardingInfoRequest: OnboardingInfoRequest
): Result<BaseResponse<OnboardingInfoResponse>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,8 @@ fun HomeLocationSettingScreen(
val selectedGu = state.selectedGu
val selectedDong = state.selectedDong

// 구 옵션들 (서버에서 받아온 구 리스트)
val guOptions = regionList.map { it.gu.name }

// 선택된 구에 해당하는 동 옵션들
val dongOptions = if (selectedGu.isNotEmpty()) {
regionList.find { it.gu.name == selectedGu }?.dongs?.map {
LocationItem(id = it.id, name = it.name)
Expand All @@ -102,7 +100,6 @@ fun HomeLocationSettingScreen(
.padding(paddingValues)
.padding(horizontal = 16.dp)
) {
// 헤더
Row(
modifier = Modifier
.fillMaxWidth()
Expand All @@ -129,7 +126,6 @@ fun HomeLocationSettingScreen(

Spacer(modifier = Modifier.height(27.dp))

// 지역구 섹션 - 처음부터 모든 구 칩들을 보여줌
FormField(
label = stringResource(id = R.string.ic_onboarding_signup_main_location),
content = {
Expand All @@ -148,7 +144,6 @@ fun HomeLocationSettingScreen(

Spacer(modifier = Modifier.height(46.dp))

// 동 선택 섹션 (구가 선택되었을 때만 표시)
if (selectedGu.isNotEmpty()) {
FormField(
label = stringResource(id = R.string.ic_onboarding_signup_sub_location),
Expand All @@ -166,7 +161,6 @@ fun HomeLocationSettingScreen(

Spacer(modifier = Modifier.weight(1f))

// 완료 버튼
val isFormValid = selectedGu.isNotEmpty() && selectedDong.isNotEmpty()

PawkeyButton(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ class HomeContract {
val selectedDongId: Int = 0,
val selectedGu: String = "",
val selectedDong: String = "",

)
}
Loading