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 @@ -11,7 +11,7 @@ import com.hyunjung.aiku.core.navigation.navigateSingleTop
import com.hyunjung.aiku.core.ui.component.common.TermsDetailScreen
import com.hyunjung.aiku.feature.auth.navigation.authSection
import com.hyunjung.aiku.feature.auth.navigation.navigateToSignUpSingleTop
import com.hyunjung.aiku.feature.home.navigation.homeSection
import com.hyunjung.aiku.feature.home.navigation.homeScreen
import com.hyunjung.aiku.feature.home.navigation.navigateToHomeClearBackStack
import com.hyunjung.aiku.feature.splash.navigation.splashScreen
import com.hyunjung.aiku.ui.AikuAppState
Expand Down Expand Up @@ -40,7 +40,7 @@ fun AikuNavHost(
},
)

homeSection(
homeScreen(
// todo : navigate
onScheduleClick = { groupId, scheduleId -> },
onGroupSummaryClick = { groupId -> },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import com.hyunjung.aiku.core.data.auth.token.DefaultTokenManager
import com.hyunjung.aiku.core.data.repository.DefaultAuthRepository
import com.hyunjung.aiku.core.data.repository.DefaultGroupRepository
import com.hyunjung.aiku.core.data.repository.DefaultScheduleRepository
import com.hyunjung.aiku.core.data.repository.OfflineFirstUserDataRepository
import com.hyunjung.aiku.core.domain.repository.AuthRepository
import com.hyunjung.aiku.core.domain.repository.GroupRepository
import com.hyunjung.aiku.core.domain.repository.ScheduleRepository
import com.hyunjung.aiku.core.domain.repository.UserDataRepository
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -36,4 +38,9 @@ abstract class DataModule {
internal abstract fun bindsTokenManager(
tokenManager: DefaultTokenManager
): TokenManager

@Binds
internal abstract fun bindsUserDataRepository(
userDataRepository: OfflineFirstUserDataRepository
): UserDataRepository
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class DefaultAuthRepository @Inject constructor(
authRemoteDataSource.signUp(signUpForm)
userDataStore.setEmail(signUpForm.email)
userDataStore.setNickname(signUpForm.nickname)
userDataStore.setProfile(signUpForm.userProfileImage)
userDataStore.setProfileImage(signUpForm.userProfileImage)
emit(Unit)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.hyunjung.aiku.core.data.repository

import com.hyunjung.aiku.core.datastore.UserDataStore
import com.hyunjung.aiku.core.domain.repository.UserDataRepository
import com.hyunjung.aiku.core.model.UserData
import com.hyunjung.aiku.core.model.profile.UserProfileImage
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

class OfflineFirstUserDataRepository @Inject constructor(
private val userDataStore: UserDataStore,
) : UserDataRepository {

override val userData: Flow<UserData> = userDataStore.userData

override suspend fun setEmail(email: String) {
userDataStore.setEmail(email)
}

override suspend fun setNickname(nickname: String) {
userDataStore.setNickname(nickname)
}

override suspend fun setProfileImage(profileImage: UserProfileImage) {
userDataStore.setProfileImage(profileImage)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class UserDataStore @Inject constructor(
userdataProto.updateData { it.copy { this.nickname = nickname } }
}

suspend fun setProfile(profileImage: UserProfileImage) {
suspend fun setProfileImage(profileImage: UserProfileImage) {
userdataProto.updateData {
it.copy {
when (profileImage) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.hyunjung.aiku.core.domain.repository

import com.hyunjung.aiku.core.model.UserData
import com.hyunjung.aiku.core.model.profile.UserProfileImage
import kotlinx.coroutines.flow.Flow

interface UserDataRepository {

val userData: Flow<UserData>

suspend fun setEmail(email: String)

suspend fun setNickname(nickname: String)

suspend fun setProfileImage(profileImage: UserProfileImage)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,23 @@ import androidx.paging.PagingData
import androidx.paging.cachedIn
import com.hyunjung.aiku.core.domain.repository.GroupRepository
import com.hyunjung.aiku.core.domain.repository.ScheduleRepository
import com.hyunjung.aiku.core.domain.repository.UserDataRepository
import com.hyunjung.aiku.core.model.group.GroupSummary
import com.hyunjung.aiku.core.model.schedule.Schedule
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class HomeViewModel @Inject constructor(
userDataRepository: UserDataRepository,
scheduleRepository: ScheduleRepository,
private val groupRepository: GroupRepository,
private val groupRepository: GroupRepository
) : ViewModel() {

val groupSummaryPagingData: Flow<PagingData<GroupSummary>> =
Expand All @@ -29,8 +33,9 @@ class HomeViewModel @Inject constructor(
scheduleRepository.getSchedulePagingData()
.cachedIn(viewModelScope)

// todo : replace with actual user nickname fetching logic
val userNickName: StateFlow<String> = MutableStateFlow("Nickname")
val userNickName: StateFlow<String> = userDataRepository.userData
.map { it.nickname }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), "")

fun createGroup(name: String) {
viewModelScope.launch { groupRepository.createGroup(name) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,20 @@ package com.hyunjung.aiku.feature.home.navigation
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.navigation
import com.hyunjung.aiku.core.navigation.AikuRoute
import com.hyunjung.aiku.core.navigation.navigateAndClearBackStack
import com.hyunjung.aiku.feature.home.HomeScreen

fun NavController.navigateToHomeClearBackStack() = navigateAndClearBackStack(AikuRoute.HomeRoute)

fun NavGraphBuilder.homeSection(
fun NavGraphBuilder.homeScreen(
onScheduleClick: (groupId: Long, scheduleId: Long) -> Unit,
onGroupSummaryClick: (Long) -> Unit,
) {
navigation<AikuRoute.HomeRoute>(startDestination = AikuRoute.HomeRoute) {
composable<AikuRoute.HomeRoute> {
HomeScreen(
onScheduleClick = onScheduleClick,
onGroupSummaryClick = onGroupSummaryClick,
)
}
composable<AikuRoute.HomeRoute> {
HomeScreen(
onScheduleClick = onScheduleClick,
onGroupSummaryClick = onGroupSummaryClick,
)
}
}