Skip to content

Commit

Permalink
Merge pull request #59 from YAPP-Github/feature/tgyuu/PC-550
Browse files Browse the repository at this point in the history
  • Loading branch information
tgyuuAn authored Feb 10, 2025
2 parents 7c6028c + 068c00c commit b6a5eaa
Show file tree
Hide file tree
Showing 12 changed files with 243 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ class MatchingRepositoryImpl @Inject constructor(
matchingDataSource.reportUser(userId = userId, reason = reason)

override suspend fun blockUser(userId: Int): Result<Unit> = matchingDataSource.blockUser(userId)
override suspend fun blockContacts(phoneNumbers: List<String>): Result<Unit> =
matchingDataSource.blockContacts(phoneNumbers)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="80dp"
android:height="80dp"
android:viewportWidth="80"
android:viewportHeight="80">
<path
android:pathData="M40,10L40,10A30,30 0,0 1,70 40L70,40A30,30 0,0 1,40 70L40,70A30,30 0,0 1,10 40L10,40A30,30 0,0 1,40 10z"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#ffffff"/>
<path
android:pathData="M27.2,38.934L36.343,49.6L52.8,30.4"
android:strokeLineJoin="round"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#ffffff"
android:strokeLineCap="round"/>
</vector>
1 change: 1 addition & 0 deletions core/designsystem/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<string name="avoid_acquaintances">아는 사람 차단하기</string>
<string name="generate_profile">프로필 생성하기</string>
<string name="avoid_acquaintances_description">연락처에 등록된 번호로 가입한 사용자는\n매칭 대상에서 제외되어, 개인정보가 보호됩니다.</string>
<string name="avoid_acquaintances_complete">지인 차단 완료</string>
<string name="permission_gallery">사진 [필수]</string>
<string name="permission_gallery_description">프로필 생성 시 사진 첨부를 위해 필요해요.</string>
<string name="permission_notification">알림 [선택]</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ package com.puzzle.domain.repository
interface MatchingRepository {
suspend fun reportUser(userId: Int, reason: String): Result<Unit>
suspend fun blockUser(userId: Int): Result<Unit>
suspend fun blockContacts(phoneNumbers: List<String>): Result<Unit>
}
4 changes: 4 additions & 0 deletions core/network/src/main/java/com/puzzle/network/api/PieceApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.puzzle.network.model.auth.LoginOauthResponse
import com.puzzle.network.model.auth.RequestAuthCodeRequest
import com.puzzle.network.model.auth.VerifyAuthCodeRequest
import com.puzzle.network.model.auth.VerifyAuthCodeResponse
import com.puzzle.network.model.matching.BlockContactsRequest
import com.puzzle.network.model.matching.LoadValuePicksResponse
import com.puzzle.network.model.matching.LoadValueTalksResponse
import com.puzzle.network.model.matching.ReportUserRequest
Expand Down Expand Up @@ -65,4 +66,7 @@ interface PieceApi {

@POST("/api/matches/blocks/users/{userId}")
suspend fun blockUser(@Path("userId") userId: Int): Result<ApiResponse<Unit>>

@POST("/api/blockContacts")
suspend fun blockContacts(@Body blockContactsRequest: BlockContactsRequest): Result<ApiResponse<Unit>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.puzzle.network.model.matching

import kotlinx.serialization.Serializable

@Serializable
data class BlockContactsRequest(
val phoneNumbers: List<String>,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.puzzle.network.source.matching

import com.puzzle.network.api.PieceApi
import com.puzzle.network.model.matching.BlockContactsRequest
import com.puzzle.network.model.matching.ReportUserRequest
import com.puzzle.network.model.unwrapData
import javax.inject.Inject
Expand All @@ -14,4 +15,7 @@ class MatchingDataSource @Inject constructor(
pieceApi.reportUser(ReportUserRequest(userId = userId, reason = reason)).unwrapData()

suspend fun blockUser(userId: Int): Result<Unit> = pieceApi.blockUser(userId).unwrapData()

suspend fun blockContacts(phoneNumbers: List<String>): Result<Unit> =
pieceApi.blockContacts(BlockContactsRequest(phoneNumbers)).unwrapData()
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.puzzle.auth.graph.signup

import android.content.Context
import android.provider.ContactsContract
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
Expand All @@ -14,6 +16,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.LocalLifecycleOwner
import com.airbnb.mvrx.compose.collectAsState
Expand All @@ -38,6 +41,7 @@ internal fun SignUpRoute(
viewModel: SignUpViewModel = mavericksViewModel()
) {
val state by viewModel.collectAsState()
val context = LocalContext.current
val lifecycleOwner = LocalLifecycleOwner.current

LaunchedEffect(viewModel) {
Expand Down Expand Up @@ -66,6 +70,10 @@ internal fun SignUpRoute(
onBackClick = { viewModel.onIntent(SignUpIntent.OnBackClick) },
onNextClick = { viewModel.onIntent(SignUpIntent.OnNextClick) },
onDisEnabledButtonClick = { viewModel.onIntent(SignUpIntent.OnDisEnabledButtonClick) },
onAvoidAcquaintancesClick = {
val phoneNumbers = readContactPhoneNumbers(context)
viewModel.onIntent(SignUpIntent.OnAvoidAcquaintancesClick(phoneNumbers))
},
navigate = { event -> viewModel.onIntent(SignUpIntent.Navigate(event)) }
)
}
Expand All @@ -80,6 +88,7 @@ private fun SignUpScreen(
onBackClick: () -> Unit,
onNextClick: () -> Unit,
onDisEnabledButtonClick: () -> Unit,
onAvoidAcquaintancesClick: () -> Unit,
navigate: (NavigationEvent) -> Unit,
) {
val (selectedTermIdx, setSelectedTermIdx) = rememberSaveable { mutableStateOf<Int?>(null) }
Expand Down Expand Up @@ -122,9 +131,10 @@ private fun SignUpScreen(
)

SignUpState.SignUpPage.AvoidAcquaintancesPage -> AvoidAcquaintancesPage(
isBlockContactsDone = state.isBlockContactsDone,
onBackClick = onBackClick,
onTryNextClick = onNextClick,
onAvoidAcquaintancesClick = onNextClick,
goNextStep = onNextClick,
onAvoidAcquaintancesClick = onAvoidAcquaintancesClick,
)

SignUpState.SignUpPage.SignUpCompleted -> SignUpCompletedPage(
Expand All @@ -134,3 +144,24 @@ private fun SignUpScreen(
}
}
}

private fun readContactPhoneNumbers(context: Context): List<String> {
val phoneNumbers = mutableListOf<String>()

val contentResolver = context.contentResolver
val uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
val projection = arrayOf(ContactsContract.CommonDataKinds.Phone.NUMBER)

contentResolver.query(uri, projection, null, null, null)?.use { cursor ->
val numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
while (cursor.moveToNext()) {
val phoneNumber = cursor.getString(numberIndex)
.replace(Regex("[^0-9]"), "")
if (phoneNumber.isNotBlank()) {
phoneNumbers.add(phoneNumber)
}
}
}

return phoneNumbers.distinct()
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@ import com.puzzle.auth.graph.signup.contract.SignUpSideEffect.Navigate
import com.puzzle.auth.graph.signup.contract.SignUpState
import com.puzzle.common.event.EventHelper
import com.puzzle.domain.model.error.ErrorHelper
import com.puzzle.domain.repository.MatchingRepository
import com.puzzle.domain.repository.TermsRepository
import com.puzzle.navigation.NavigationHelper
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.Channel.Factory.BUFFERED
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.receiveAsFlow
Expand All @@ -25,6 +27,7 @@ import kotlinx.coroutines.launch
class SignUpViewModel @AssistedInject constructor(
@Assisted initialState: SignUpState,
private val termsRepository: TermsRepository,
private val matchingRepository: MatchingRepository,
internal val navigationHelper: NavigationHelper,
private val errorHelper: ErrorHelper,
internal val eventHelper: EventHelper,
Expand Down Expand Up @@ -58,6 +61,7 @@ class SignUpViewModel @AssistedInject constructor(
SignUpSideEffect.ShowSnackBar("필수 권한을 허용해주세요")
)

is SignUpIntent.OnAvoidAcquaintancesClick -> blockContacts(intent.phoneNumbers)
is SignUpIntent.Navigate -> _sideEffects.send(Navigate(intent.navigationEvent))
}
}
Expand Down Expand Up @@ -130,6 +134,16 @@ class SignUpViewModel @AssistedInject constructor(
}
}

private fun blockContacts(phoneNumbers: List<String>) = viewModelScope.launch {
matchingRepository.blockContacts(phoneNumbers)
.onSuccess {
setState { copy(isBlockContactsDone = true) }
delay(3100L)
onNextClick()
}
.onFailure { errorHelper.sendError(it) }
}

@AssistedFactory
interface Factory : AssistedViewModelFactory<SignUpViewModel, SignUpState> {
override fun create(state: SignUpState): SignUpViewModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ sealed class SignUpIntent {
data object OnBackClick : SignUpIntent()
data object OnNextClick : SignUpIntent()
data object OnDisEnabledButtonClick : SignUpIntent()
data class OnAvoidAcquaintancesClick(val phoneNumbers: List<String>) : SignUpIntent()
data class Navigate(val navigationEvent: NavigationEvent) : SignUpIntent()
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ data class SignUpState(
val terms: List<Term> = emptyList(),
val termsCheckedInfo: Map<Int, Boolean> = emptyMap(),
val signUpPage: SignUpPage = SignUpPage.TermPage,
val isBlockContactsDone: Boolean = false,
) : MavericksState {
val areAllRequiredTermsAgreed = terms.filter { it.required }
.all { termsCheckedInfo.getOrDefault(it.id, false) }
Expand Down
Loading

0 comments on commit b6a5eaa

Please sign in to comment.