-
Notifications
You must be signed in to change notification settings - Fork 8
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
[AN/USER] feat: 학생 인증 화면 구현 (#370) #429
Changes from 14 commits
c6dedda
f64f815
90ca80f
306b1dc
fa3831d
a36f8e1
b3a81da
9b84313
5b42940
024c3d2
1600176
ee4175b
cb765d4
5b853fc
4c50f49
12faf1a
e8bd130
3b896e4
9165d3b
981fdfe
56056f4
b4eface
56d7ca2
3743d5b
4dcf7c3
da5a951
2c09605
738f96e
e522752
917d18a
c25372f
f135fcd
c2615df
84e963e
6e6ce87
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package com.festago.festago.data.dto | ||
|
||
import kotlinx.serialization.Serializable | ||
|
||
@Serializable | ||
data class SendVerificationRequest( | ||
val userName: String, | ||
val schoolId: Int, | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.festago.festago.data.repository | ||
|
||
import com.festago.festago.repository.SchoolRepository | ||
|
||
class SchoolDefaultRepository() : SchoolRepository { | ||
|
||
override suspend fun loadSchoolEmail(schoolId: Long): Result<String> { | ||
// TODO: API 연동 작업 필요 | ||
return Result.success("festago.com") | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package com.festago.festago.data.repository | ||
|
||
import com.festago.festago.data.service.StudentsVerificationRetrofitService | ||
import com.festago.festago.model.StudentVerificationCode | ||
import com.festago.festago.repository.StudentsVerificationRepository | ||
|
||
class StudentsVerificationDefaultRepository( | ||
private val studentsVerificationRetrofitService: StudentsVerificationRetrofitService, | ||
) : StudentsVerificationRepository { | ||
|
||
override suspend fun sendVerificationCode(userName: String, schoolId: Long): Result<Unit> { | ||
// TODO: API 연동 작업 필요 | ||
return Result.success(Unit) | ||
|
||
// studentsVerificationRetrofitService.sendVerificationCode( | ||
// SendVerificationRequest(userName = userName, schoolId = schoolId), | ||
// ).runCatchingWithErrorHandler() | ||
// .getOrElse { error -> return Result.failure(error) } | ||
// .let { return Result.success(Unit) } | ||
} | ||
|
||
override suspend fun requestVerificationCodeConfirm(code: StudentVerificationCode): Result<Unit> { | ||
// TODO: API 연동 작업 필요 | ||
return Result.success(Unit) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.festago.festago.data.service | ||
|
||
import com.festago.festago.data.dto.SendVerificationRequest | ||
import retrofit2.Response | ||
import retrofit2.http.Body | ||
import retrofit2.http.POST | ||
|
||
interface StudentsVerificationRetrofitService { | ||
@POST("/students/send-verification") | ||
suspend fun sendVerificationCode( | ||
@Body sendVerificationRequest: SendVerificationRequest, | ||
): Response<Unit> | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,85 @@ | ||||||||||||||||||||||||||||||||||||||
package com.festago.festago.presentation.ui.studentsverification | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
import android.content.Context | ||||||||||||||||||||||||||||||||||||||
import android.content.Intent | ||||||||||||||||||||||||||||||||||||||
import android.os.Bundle | ||||||||||||||||||||||||||||||||||||||
import androidx.activity.viewModels | ||||||||||||||||||||||||||||||||||||||
import androidx.appcompat.app.AppCompatActivity | ||||||||||||||||||||||||||||||||||||||
import androidx.lifecycle.Lifecycle | ||||||||||||||||||||||||||||||||||||||
import androidx.lifecycle.lifecycleScope | ||||||||||||||||||||||||||||||||||||||
import androidx.lifecycle.repeatOnLifecycle | ||||||||||||||||||||||||||||||||||||||
import com.festago.festago.R | ||||||||||||||||||||||||||||||||||||||
import com.festago.festago.databinding.ActivityStudentVerificationBinding | ||||||||||||||||||||||||||||||||||||||
import com.festago.festago.presentation.ui.FestagoViewModelFactory | ||||||||||||||||||||||||||||||||||||||
import kotlinx.coroutines.launch | ||||||||||||||||||||||||||||||||||||||
import java.time.LocalTime | ||||||||||||||||||||||||||||||||||||||
import java.time.format.DateTimeFormatter | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
class StudentVerificationActivity : AppCompatActivity() { | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private lateinit var binding: ActivityStudentVerificationBinding | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
바인딩 같은 경우는 변경될 일이 없기 때문에 다음과 같이 선언하는 건 어떤가요? |
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private val vm: StudentsVerificationViewModel by viewModels { FestagoViewModelFactory } | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
override fun onCreate(savedInstanceState: Bundle?) { | ||||||||||||||||||||||||||||||||||||||
super.onCreate(savedInstanceState) | ||||||||||||||||||||||||||||||||||||||
initBinding() | ||||||||||||||||||||||||||||||||||||||
initObserving() | ||||||||||||||||||||||||||||||||||||||
initView() | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. private fun 호출 순서에 맞추면 가독성이 더 좋을 것같습니다! |
||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private fun initBinding() { | ||||||||||||||||||||||||||||||||||||||
binding = ActivityStudentVerificationBinding.inflate(layoutInflater) | ||||||||||||||||||||||||||||||||||||||
setContentView(binding.root) | ||||||||||||||||||||||||||||||||||||||
binding.lifecycleOwner = this | ||||||||||||||||||||||||||||||||||||||
binding.vm = vm | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private fun initView() { | ||||||||||||||||||||||||||||||||||||||
val schoolId = intent.getLongExtra(KEY_SCHOOL_ID, -1L) | ||||||||||||||||||||||||||||||||||||||
vm.loadSchoolEmail(schoolId) | ||||||||||||||||||||||||||||||||||||||
initRequestVerificationCodeBtn(schoolId) | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private fun initRequestVerificationCodeBtn(schoolId: Long) { | ||||||||||||||||||||||||||||||||||||||
binding.btnRequestVerificationCode.setOnClickListener { | ||||||||||||||||||||||||||||||||||||||
vm.sendVerificationCode(binding.tieVerificationCode.text.toString(), schoolId) | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private fun initObserving() { | ||||||||||||||||||||||||||||||||||||||
lifecycleScope.launch { | ||||||||||||||||||||||||||||||||||||||
repeatOnLifecycle(Lifecycle.State.STARTED) { | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 관용적으로 사용되는 |
||||||||||||||||||||||||||||||||||||||
vm.uiState.collect { uiState -> | ||||||||||||||||||||||||||||||||||||||
binding.uiState = uiState | ||||||||||||||||||||||||||||||||||||||
when (uiState) { | ||||||||||||||||||||||||||||||||||||||
is StudentVerificationUiState.Success -> handleSuccess(uiState) | ||||||||||||||||||||||||||||||||||||||
is StudentVerificationUiState.Loading, StudentVerificationUiState.Error -> {} | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private fun handleSuccess(uiState: StudentVerificationUiState.Success) { | ||||||||||||||||||||||||||||||||||||||
binding.tvSchoolEmail.text = | ||||||||||||||||||||||||||||||||||||||
getString(R.string.student_verification_tv_email_format, uiState.schoolEmail) | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
val format = | ||||||||||||||||||||||||||||||||||||||
DateTimeFormatter.ofPattern(getString(R.string.student_verification_tv_timer_format)) | ||||||||||||||||||||||||||||||||||||||
binding.tvTimerVerificationCode.text = LocalTime.ofSecondOfDay(uiState.remainTime.toLong()) | ||||||||||||||||||||||||||||||||||||||
.format(format) | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
binding.btnVerificationConfirm.isEnabled = uiState.isValidateCode | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
companion object { | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
private const val KEY_SCHOOL_ID = "KEY_SCHOOL_ID" | ||||||||||||||||||||||||||||||||||||||
fun getIntent(context: Context, schoolId: Long): Intent { | ||||||||||||||||||||||||||||||||||||||
return Intent(context, StudentVerificationActivity::class.java).apply { | ||||||||||||||||||||||||||||||||||||||
putExtra(KEY_SCHOOL_ID, schoolId) | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
함수하고 변수는 떨어져 있는게 더 가독성있는거 같습니다! |
||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package com.festago.festago.presentation.ui.studentsverification | ||
|
||
sealed interface StudentVerificationUiState { | ||
object Loading : StudentVerificationUiState | ||
|
||
data class Success( | ||
val schoolEmail: String, | ||
val remainTime: Int, | ||
val isValidateCode: Boolean = false, | ||
) : StudentVerificationUiState | ||
|
||
object Error : StudentVerificationUiState | ||
|
||
val shouldShowSuccess get() = this is Success | ||
val shouldShowLoading get() = this is Loading | ||
val shouldShowError get() = this is Error | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 주석은 나중에 추가할 내용 같은데 삭제하는것이 어떤가요??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
PR 과 관련없는 내용이네요. 삭제하겠습니다!