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,6 +3,7 @@ package com.umcspot.spot.study.datasource
import com.umcspot.spot.model.FeeRange
import com.umcspot.spot.model.RecruitingStatus
import com.umcspot.spot.model.RecruitingStudySort
import com.umcspot.spot.model.StudyTheme
import com.umcspot.spot.network.model.BaseResponse
import com.umcspot.spot.study.dto.request.StudyRequestDto
import com.umcspot.spot.study.dto.response.CreateStudyResponseDto
Expand All @@ -22,6 +23,16 @@ interface StudyDataSource {
regionCodes : List<String>?
): BaseResponse<StudyResponseDto>

suspend fun getPreferCategoryStudies(
category : StudyTheme?,
recruitingStatus : RecruitingStatus?,
feeCategory: FeeRange?,
isOnline : Boolean?,
sortType: RecruitingStudySort?,
cursor: Long?,
size: Int,
): BaseResponse<StudyResponseDto>

suspend fun createStudy(request: StudyRequestDto, imageFile: File?): BaseResponse<CreateStudyResponseDto>

suspend fun getCategoryStudies(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.umcspot.spot.study.datasourceimpl
import com.umcspot.spot.model.FeeRange
import com.umcspot.spot.model.RecruitingStatus
import com.umcspot.spot.model.RecruitingStudySort
import com.umcspot.spot.model.StudyTheme
import com.umcspot.spot.network.model.BaseResponse
import com.umcspot.spot.study.datasource.StudyDataSource
import com.umcspot.spot.study.dto.request.StudyRequestDto
Expand Down Expand Up @@ -45,6 +46,17 @@ class StudyDataSourceImpl @Inject constructor(
): BaseResponse<StudyResponseDto> =
studyService.getPreferLocationStudies(recruitingStatus, feeCategory, categories, null, sortType, cursor, size, regionCodes)

override suspend fun getPreferCategoryStudies(
category: StudyTheme?,
recruitingStatus: RecruitingStatus?,
feeCategory: FeeRange?,
isOnline : Boolean?,
sortType: RecruitingStudySort?,
cursor: Long?,
size: Int,
): BaseResponse<StudyResponseDto> =
studyService.getPreferCategoryStudies(category, recruitingStatus, feeCategory, isOnline, sortType, cursor, size)

override suspend fun createStudy(
request: StudyRequestDto,
imageFile: File?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,30 @@ class StudyRepositoryImpl @Inject constructor(
Log.e("StudyRepository", "getPreferLocationStudies failed", it)
}

override suspend fun getPreferCategoryStudies(
category: StudyTheme?,
recruitingStatus: RecruitingStatus?,
feeRange: FeeRange?,
isOnline : Boolean?,
sortBy: RecruitingStudySort?,
cursor: Long?,
size: Int,
): Result<StudyResultList> =
runCatching {
val response = studyDataSource.getPreferCategoryStudies(
category = category,
recruitingStatus = recruitingStatus,
feeCategory = feeRange,
isOnline = isOnline,
sortType = sortBy,
cursor = cursor,
size = size,
)
response.result.toDomainList()
}.onFailure {
Log.e("StudyRepository", "getPreferCategoryStudies failed", it)
}

override suspend fun getRecommendedStudies(): Result<StudyResultList> =
runCatching {
studyDataSource.getRecommendedStudies().result.toDomainList()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.umcspot.spot.study.service

import com.umcspot.spot.model.ActivityType
import com.umcspot.spot.model.FeeRange
import com.umcspot.spot.model.RecruitingStatus
import com.umcspot.spot.model.RecruitingStudySort
Expand Down Expand Up @@ -43,6 +42,17 @@ interface StudyService {
@Query("regionCodes") regionCodes: List<String>?
): BaseResponse<StudyResponseDto>

@GET("/api/studies/by-category")
suspend fun getPreferCategoryStudies(
@Query("category") category: StudyTheme?,
@Query("recruitingStatus") recruitingStatus: RecruitingStatus?,
@Query("feeCategory") feeCategory: FeeRange?,
@Query("isOnline") isOnline: Boolean?,
@Query("sortBy") sortBy: RecruitingStudySort?,
@Query("cursor") cursor: Long?,
@Query("size") size: Int,
): BaseResponse<StudyResponseDto>

@GET("/api/studies/categories")
suspend fun getCategoryStudies(
@Query("recruitingStatus") recruitingStatus: RecruitingStatus?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import kotlinx.serialization.Serializable

@Serializable
data class UserThemeRequestDto(
@SerialName("userThemes")
val userThemes: List<StudyTheme>
@SerialName("categories")
val categories: List<StudyTheme>
)

@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import com.umcspot.spot.user.model.UserPreferredCategoryResult
import com.umcspot.spot.user.model.UserPreferredRegionResult

fun List<StudyTheme>.toRequestDto(): UserThemeRequestDto =
UserThemeRequestDto(userThemes = this)
UserThemeRequestDto(categories = this)

fun String.toRequestDto(): UserNameRequestDto =
UserNameRequestDto(name = this)
Expand Down Expand Up @@ -53,6 +53,6 @@ fun MyPageResponseDto.toDomain(): MyPageResult =

fun UserPreferredCategoryResponseDto.toDomain(): UserPreferredCategoryResult =
UserPreferredCategoryResult(
categories = categories.map { StudyTheme.from(it)?.title },
categories = categories.map { StudyTheme.from(it) },
totalCount = totalCount
)
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,16 @@ interface StudyRepository {
regionCodes : List<String>?
): Result<StudyResultList>

suspend fun getPreferCategoryStudies(
category : StudyTheme?,
recruitingStatus : RecruitingStatus?,
feeRange: FeeRange?,
isOnline : Boolean?,
sortBy: RecruitingStudySort?,
cursor: Long?,
size: Int,
): Result<StudyResultList>

suspend fun createStudy(studyCreateModel: StudyCreateModel, imageFile: File?): Result<Long>

suspend fun getCategoryStudies(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.umcspot.spot.user.model

import com.umcspot.spot.model.StudyTheme

data class UserPreferredCategoryResult(
val categories : List<String?>,
val categories : List<StudyTheme?>,
val totalCount: Int
)
21 changes: 18 additions & 3 deletions feature/main/src/main/java/com/umcspot/spot/main/MainNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ import com.umcspot.spot.signup.navigation.signupGraph
import com.umcspot.spot.study.detail.navigation.navigateToStudyDetail
import com.umcspot.spot.study.detail.navigation.studyDetailGraph
import com.umcspot.spot.study.my.navigation.myStudyGraph
import com.umcspot.spot.study.preferCategory.navigation.navigateToPreferCategoryStudy
import com.umcspot.spot.study.preferCategory.navigation.navigateToPreferCategoryStudyFilter
import com.umcspot.spot.study.preferCategory.navigation.preferCategoryStudyFilterGraph
import com.umcspot.spot.study.preferCategory.navigation.preferCategoryStudyGraph
import com.umcspot.spot.study.preferLocation.navigation.preferLocationStudyFilterGraph
import com.umcspot.spot.study.preferLocation.navigation.preferLocationStudyGraph
import com.umcspot.spot.study.recruiting.navigation.recruitingStudyFilterGraph
Expand Down Expand Up @@ -78,9 +82,7 @@ fun MainNavHost(
when (type) {
QuickMenuType.BOARD -> navigator.navigateToBoard()
QuickMenuType.REGION -> navigator.navigateToPreferLocationStudy()
QuickMenuType.INTERESTS -> { /* TODO */
}

QuickMenuType.INTERESTS -> navigator.navController.navigateToPreferCategoryStudy()
QuickMenuType.RECRUITING -> navigator.navigateToRecruitingStudy()
}
},
Expand Down Expand Up @@ -168,6 +170,19 @@ fun MainNavHost(
onAcceptFilterClick = { navigator.popBackStack() }
)

preferCategoryStudyGraph(
contentPadding = contentPadding,
onRegisterScrollToTop = onRegisterScrollToTop,
onItemClick = { },
onFilterClick = { navigator.navController.navigateToPreferCategoryStudyFilter() },
)
Comment on lines +173 to +178
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

onItemClick 콜백이 빈 람다로 설정되어 있습니다.

onItemClick = { }가 비어 있어 스터디 아이템 클릭 시 상세 페이지로 이동하지 않습니다. jjimGraph(라인 113)처럼 navigator.navigateToStudyDetail(it)로 연결해야 할 것으로 보입니다.

🔧 수정 제안
 preferCategoryStudyGraph(
     contentPadding = contentPadding,
     onRegisterScrollToTop = onRegisterScrollToTop,
-    onItemClick = { },
+    onItemClick = { navigator.navController.navigateToStudyDetail(it) },
     onFilterClick = { navigator.navController.navigateToPreferCategoryStudyFilter() },
 )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
preferCategoryStudyGraph(
contentPadding = contentPadding,
onRegisterScrollToTop = onRegisterScrollToTop,
onItemClick = { },
onFilterClick = { navigator.navController.navigateToPreferCategoryStudyFilter() },
)
preferCategoryStudyGraph(
contentPadding = contentPadding,
onRegisterScrollToTop = onRegisterScrollToTop,
onItemClick = { navigator.navController.navigateToStudyDetail(it) },
onFilterClick = { navigator.navController.navigateToPreferCategoryStudyFilter() },
)
🤖 Prompt for AI Agents
In `@feature/main/src/main/java/com/umcspot/spot/main/MainNavHost.kt` around lines
173 - 178, The preferCategoryStudyGraph call sets onItemClick to an empty lambda
so clicks do nothing; update its onItemClick to forward the clicked study
id/item to the navigator like in jjimGraph by calling
navigator.navigateToStudyDetail(it) (or the appropriate parameter name) instead
of onItemClick = { } to enable navigation to the study detail screen.


preferCategoryStudyFilterGraph(
contentPadding = contentPadding,
navController = navigator.navController,
onAcceptFilterClick = { navigator.popBackStack() }
)

boardGraph(
contentPadding = contentPadding,
navController = navigator.navController,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ import com.umcspot.spot.signup.navigation.navigateToSaving
import com.umcspot.spot.signup.navigation.navigateToSignUp
import com.umcspot.spot.study.detail.navigation.navigateToStudyDetail
import com.umcspot.spot.study.my.navigation.navigateToMyStudy
import com.umcspot.spot.study.preferCategory.navigation.PreferCategory
import com.umcspot.spot.study.preferCategory.navigation.PreferCategoryFilter
import com.umcspot.spot.study.preferLocation.navigation.PreferLocation
import com.umcspot.spot.study.preferLocation.navigation.PreferLocationFilter
import com.umcspot.spot.study.preferLocation.navigation.navigateToPreferLocationStudy
Expand Down Expand Up @@ -99,14 +101,14 @@ class MainNavigator(
fun isInLanding(): Boolean = inAnyGraph(Landing::class, Saving::class)

@Composable
fun showBackTopBar(): Boolean = inAnyGraph(Alert::class, RecruitingFilter::class, PreferLocationFilter::class,
fun showBackTopBar(): Boolean = inAnyGraph(Alert::class, RecruitingFilter::class, PreferLocationFilter::class, PreferCategoryFilter::class,
SignUp::class, CheckList::class, Posting::class, BoardList::class, JJim::class, MyPage::class,
ParticipatingStudy::class, MyRecruitingStudy::class, WaitingStudy::class
) || inAnyGraphRoutes(POST_CONTENT_ROUTE)

@Composable
fun showToTopFab(): Boolean = inAnyGraph(Alert::class, Recruiting::class,
PreferLocation::class, BoardList::class, JJim::class, ParticipatingStudy::class, MyRecruitingStudy::class, WaitingStudy::class)
PreferLocation::class, PreferCategory::class, BoardList::class, JJim::class, ParticipatingStudy::class, MyRecruitingStudy::class, WaitingStudy::class)

@Composable
fun showMultipleFab(): Boolean = inAnyGraph(Home::class, BoardList::class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import com.umcspot.spot.mypage.waiting.navigation.WaitingStudy
import com.umcspot.spot.signup.navigation.CheckList
import com.umcspot.spot.signup.navigation.SignUp
import com.umcspot.spot.study.detail.navigation.StudyDetail
import com.umcspot.spot.study.preferCategory.navigation.PreferCategoryFilter
import com.umcspot.spot.study.preferLocation.navigation.PreferLocationFilter
import com.umcspot.spot.study.recruiting.navigation.RecruitingFilter
import com.umcspot.spot.study.register.navigation.RegisterStudy
Expand Down Expand Up @@ -70,6 +71,7 @@ fun MainScreen(
dest?.hasRoute(Alert::class) == true -> "알림"
dest?.hasRoute(RecruitingFilter::class) == true -> "모집중인 스터디"
dest?.hasRoute(PreferLocationFilter::class) == true -> "내 지역 스터디"
dest?.hasRoute(PreferCategoryFilter::class) == true -> "내 관심사 스터디"
dest?.hasRoute(SignUp::class) == true -> "회원가입"
dest?.hasRoute(CheckList::class) == true -> "체크리스트"
dest?.hasRoute(Posting::class) == true -> "글쓰기"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ class MyPageViewModel @Inject constructor(
viewModelScope.launch {
userRepository.getUserPreferredCategory()
.onSuccess { info ->
_uiState.update { it.copy(preferCategories = UiState.Success(info.categories)) }
val titles = info.categories.mapNotNull { it?.title }
_uiState.update { it.copy(preferCategories = UiState.Success(titles)) }
}
.onFailure { e ->
Log.e("HomeViewModel", "loadPreferCategories error", e)
Expand Down
Loading