-
Notifications
You must be signed in to change notification settings - Fork 2
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
Feature/#48 프로필 화면 구현 #139
The head ref may contain hidden characters: "Feature/#48-\uD504\uB85C\uD544_\uD654\uBA74_\uAD6C\uD604"
Changes from all commits
c87bc17
16e263e
9d88772
a64be8f
3534dd9
e2c2c6f
fe77950
de86666
a50e817
5a3192f
4577a10
e66ba27
b1e5ded
81d00ed
a214fd6
8caac36
8b6ae13
5b5e0c5
94cb706
c44439b
bacd0ee
933d0bd
aace342
0319245
696f2ac
b27e3a5
11582ed
8470ca7
0828bc2
b7544c9
006b04a
e69b430
a218c2c
d3948ce
d4781c6
e4dba6d
6a94947
f9f90d2
ef7d87a
3913d17
bd24a29
aeb2b30
f87e92e
5a91bca
127a874
f35a5de
bf98e2b
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,7 @@ | ||
package com.emmsale.data.activity | ||
|
||
data class Activity1( | ||
val id: Long, | ||
val activityType: ActivityType, | ||
val name: String, | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package com.emmsale.data.activity | ||
|
||
enum class ActivityType { | ||
EDUCATION, CLUB, EVENT, JOB | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package com.emmsale.data.member | ||
|
||
import com.emmsale.data.activity.Activity1 | ||
import com.emmsale.data.activity.ActivityType | ||
|
||
data class Member1( | ||
val id: Long, | ||
val name: String, | ||
val description: String, | ||
val imageUrl: String, | ||
val activities: List<Activity1>, | ||
) { | ||
fun getActivities(activityType: ActivityType): List<Activity1> = | ||
activities.filter { it.activityType == activityType } | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,22 @@ | ||
package com.emmsale.data.member | ||
|
||
import com.emmsale.data.member.dto.ActivitiesAssociatedByActivityTypeApiModel | ||
import com.emmsale.data.member.dto.MemberApiModel | ||
import com.emmsale.data.member.dto.MemberWithoutActivitiesApiModel | ||
import retrofit2.Response | ||
import retrofit2.http.Body | ||
import retrofit2.http.GET | ||
import retrofit2.http.POST | ||
import retrofit2.http.Path | ||
|
||
interface MemberService { | ||
|
||
@GET("members/{memberId}") | ||
suspend fun getMember(@Path("memberId") memberId: Long): Response<MemberWithoutActivitiesApiModel> | ||
|
||
@GET("members/{memberId}/activities") | ||
suspend fun getActivities(@Path("memberId") memberId: Long): Response<List<ActivitiesAssociatedByActivityTypeApiModel>> | ||
|
||
@POST("/members") | ||
suspend fun updateMember(@Body member: MemberApiModel): Response<Unit> | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package com.emmsale.data.member.dto | ||
|
||
import kotlinx.serialization.SerialName | ||
import kotlinx.serialization.Serializable | ||
|
||
@Serializable | ||
data class ActivitiesAssociatedByActivityTypeApiModel( | ||
@SerialName("activityType") | ||
val activityType: String, | ||
@SerialName("memberActivityResponses") | ||
val memberActivityResponses: List<ActivityApiModel>, | ||
) | ||
|
||
@Serializable | ||
data class ActivityApiModel( | ||
val id: Long, | ||
val name: String, | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package com.emmsale.data.member.dto | ||
|
||
import kotlinx.serialization.SerialName | ||
import kotlinx.serialization.Serializable | ||
|
||
@Serializable | ||
data class MemberWithoutActivitiesApiModel( | ||
@SerialName("id") | ||
val id: Long, | ||
@SerialName("name") | ||
val name: String = "", | ||
@SerialName("description") | ||
val description: String = "", | ||
@SerialName("imageUrl") | ||
val imageUrl: String, | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package com.emmsale.data.member.mapper | ||
|
||
import com.emmsale.data.activity.Activity1 | ||
import com.emmsale.data.activity.ActivityType | ||
import com.emmsale.data.member.Member1 | ||
import com.emmsale.data.member.dto.ActivitiesAssociatedByActivityTypeApiModel | ||
import com.emmsale.data.member.dto.MemberWithoutActivitiesApiModel | ||
|
||
fun MemberWithoutActivitiesApiModel.toData(activities: List<ActivitiesAssociatedByActivityTypeApiModel>): Member1 = | ||
Member1( | ||
id = this.id, | ||
name = this.name, | ||
description = this.description, | ||
imageUrl = this.imageUrl, | ||
activities = activities.toData() | ||
) | ||
|
||
private fun List<ActivitiesAssociatedByActivityTypeApiModel>.toData(): List<Activity1> = | ||
this.flatMap { it.toData() } | ||
|
||
private fun ActivitiesAssociatedByActivityTypeApiModel.toData(): List<Activity1> = | ||
memberActivityResponses.map { | ||
Activity1( | ||
id = it.id, | ||
activityType = activityType.toData(), | ||
name = it.name | ||
) | ||
} | ||
|
||
private fun String.toData(): ActivityType = | ||
when (this) { | ||
"동아리" -> ActivityType.CLUB | ||
"컨퍼런스" -> ActivityType.EVENT | ||
"교육" -> ActivityType.EDUCATION | ||
"직무" -> ActivityType.JOB | ||
else -> throw IllegalStateException("회원의 활동 Json 데이터를 도메인 모델로 매핑하는 데 실패했습니다. 서버와 Api 스펙을 다시 상의해보세요.") | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,65 @@ | ||
package com.emmsale.presentation.ui.main | ||
|
||
import android.os.Bundle | ||
import android.content.Context | ||
import android.content.Intent | ||
import androidx.appcompat.app.AppCompatActivity | ||
import android.os.Bundle | ||
import androidx.fragment.app.commit | ||
import androidx.fragment.app.commitNow | ||
import com.emmsale.R | ||
import com.emmsale.databinding.ActivityMainBinding | ||
import com.emmsale.presentation.ui.main.events.EventsFragment | ||
import com.emmsale.presentation.ui.main.myProfile.MyProfileFragment | ||
|
||
class MainActivity : AppCompatActivity() { | ||
|
||
private val binding: ActivityMainBinding by lazy { | ||
ActivityMainBinding.inflate(layoutInflater) | ||
} | ||
|
||
override fun onCreate(savedInstanceState: Bundle?) { | ||
super.onCreate(savedInstanceState) | ||
setContentView(R.layout.activity_main) | ||
setContentView(binding.root) | ||
|
||
initBottomNavigationView() | ||
} | ||
|
||
private fun initBottomNavigationView() { | ||
val mainBottomNavigationView = binding.bnvMain | ||
|
||
addAllFragments() | ||
|
||
mainBottomNavigationView.setOnItemSelectedListener { | ||
when (it.itemId) { | ||
R.id.mi_main_profile -> showFragment(MyProfileFragment.TAG) | ||
R.id.mi_main_home -> showFragment(EventsFragment.TAG) | ||
} | ||
return@setOnItemSelectedListener true | ||
} | ||
|
||
mainBottomNavigationView.selectedItemId = R.id.mi_main_home | ||
} | ||
|
||
private fun addAllFragments() { | ||
supportFragmentManager.commitNow { | ||
add(R.id.fcv_main, MyProfileFragment(), MyProfileFragment.TAG) | ||
add(R.id.fcv_main, EventsFragment(), EventsFragment.TAG) | ||
} | ||
} | ||
|
||
private fun showFragment(tag: String) { | ||
supportFragmentManager.commit { | ||
val fragment = supportFragmentManager.findFragmentByTag(tag) | ||
?: throw IllegalStateException("태그 ${tag}로 프래그먼트를 찾을 수 없습니다. 프래그먼트 초기화 로직을 다시 살펴보세요.") | ||
supportFragmentManager.fragments.forEach { hide(it) } | ||
show(fragment) | ||
} | ||
} | ||
|
||
companion object { | ||
fun startActivity(context: Context) { | ||
val intent = Intent(context, MainActivity::class.java) | ||
context.startActivity(intent) | ||
} | ||
Comment on lines
+60
to
+63
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. 아래와 같이 한 줄에 작성해도 좋을 것 같아요~! fun startActivity(context: Context) {
startActivity(Intent(context, MainActivity::class.java))
} 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. 인텐트를 생성하고 액티비티를 시작하는 두 작업을 한 줄에 작성하는 게 더 보기 좋을까요? ❓ 궁금하네요ㅠㅠ |
||
} | ||
} |
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.
지금은 DataModel 을 이렇게 Activity1 과 Acitivty 이런 방식으로 두지만, 추후에 시간이 여유롭다면 Acitivity1 하나만 있는게 좋을 것 같습니다. 나중에Onboarding 을 Activity1 의 데이터 모델을 이용하여 해결했으면 좋겠네요.
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.
커디 프로젝트,,, 빠른 리팩토링이 시급합니다..