diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ab41458..4f767c1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,18 +11,12 @@ plugins { } -//val properties = Properties().apply { -// load(project.rootProject.file("local.properties").inputStream()) -//} - - val properties = Properties().apply { val localPropertiesFile = project.rootProject.file("local.properties") if (localPropertiesFile.exists()) { load(localPropertiesFile.inputStream()) } } - android { namespace = "com.hsLink.hslink" compileSdk = libs.versions.compileSdk.get().toInt() @@ -35,12 +29,9 @@ android { versionName = libs.versions.versionName.get() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - buildConfigField( - "String", - "BASE_URL", - "\"${properties.getProperty("base.url", "https://default-url.com")}\"" - ) - //buildConfigField("String", "BASE_URL", properties["base.url"].toString()) + + buildConfigField("String", "BASE_URL", "\"${properties["base.url"]}\"") + } buildTypes { @@ -50,6 +41,7 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) + buildConfigField("String", "BASE_URL", "\"${properties["base.url"]}\"") } } compileOptions { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d853266..6533a3d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ ( - @SerialName("success") - val success: Boolean, - @SerialName("error") - val error: ErrorResponse? = null, - @SerialName("data") - val data: T? = null -) { - @Serializable - data class ErrorResponse( - @SerialName("message") - val message: String - ) -} \ No newline at end of file + @SerialName("isSuccess") + val isSuccess: Boolean, + @SerialName("code") + val code: String, + @SerialName("message") + val message: String, + @SerialName("result") + val result: T, +) \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/data/di/DataSourceModule.kt b/app/src/main/java/com/hsLink/hslink/data/di/DataSourceModule.kt new file mode 100644 index 0000000..f62552f --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/data/di/DataSourceModule.kt @@ -0,0 +1,17 @@ +package com.hsLink.hslink.data.di + +import com.hsLink.hslink.data.remote.datasource.PostDataSource +import com.hsLink.hslink.data.remote.datasourceimpl.PostDataSourceImpl +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +@Module +@InstallIn(SingletonComponent::class) +interface DataSourceModule { + @Binds + abstract fun bindePostRemoteDataSource( + postDataSourceImpl: PostDataSourceImpl, + ): PostDataSource +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/data/di/NetworkModule.kt b/app/src/main/java/com/hsLink/hslink/data/di/NetworkModule.kt index 8481151..2ce4ae5 100644 --- a/app/src/main/java/com/hsLink/hslink/data/di/NetworkModule.kt +++ b/app/src/main/java/com/hsLink/hslink/data/di/NetworkModule.kt @@ -1,6 +1,7 @@ package com.hsLink.hslink.data.di import com.hsLink.hslink.BuildConfig +import com.hsLink.hslink.data.service.home.PostService import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import dagger.Module import dagger.Provides @@ -12,6 +13,7 @@ import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Converter import retrofit2.Retrofit +import timber.log.Timber import java.util.concurrent.TimeUnit import javax.inject.Singleton @@ -49,9 +51,16 @@ object NetworkModule { fun providesRetrofit( client: OkHttpClient, converterFactory: Converter.Factory, - ): Retrofit = Retrofit.Builder() - .baseUrl(BuildConfig.BASE_URL) - .addConverterFactory(converterFactory) - .client(client) - .build() + ): Retrofit { + return Retrofit.Builder() + .baseUrl(BuildConfig.BASE_URL) + .addConverterFactory(converterFactory) + .client(client) + .build() + } + + @Provides + @Singleton + fun providePostService(retrofit: Retrofit): PostService = + retrofit.create(PostService::class.java) } \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/data/di/RepositoryModule.kt b/app/src/main/java/com/hsLink/hslink/data/di/RepositoryModule.kt index e4a0c18..1f898fc 100644 --- a/app/src/main/java/com/hsLink/hslink/data/di/RepositoryModule.kt +++ b/app/src/main/java/com/hsLink/hslink/data/di/RepositoryModule.kt @@ -1,7 +1,9 @@ package com.hsLink.hslink.data.di import com.hsLink.hslink.data.repositoryimpl.DummyRepositoryImpl +import com.hsLink.hslink.data.repositoryimpl.PostRepositoryImpl import com.hsLink.hslink.domain.DummyRepository +import com.hsLink.hslink.domain.repository.PostRepository import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -13,7 +15,12 @@ interface RepositoryModule { @Binds fun bindsDummyRepository( - dummyRepositoryImpl: DummyRepositoryImpl + dummyRepositoryImpl: DummyRepositoryImpl, ): DummyRepository + @Binds + fun bindsPostRepository( + postRepositoryImpl: PostRepositoryImpl, + ): PostRepository + } \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/data/dto/request/PostRequestDto.kt b/app/src/main/java/com/hsLink/hslink/data/dto/request/PostRequestDto.kt new file mode 100644 index 0000000..a37b0a9 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/data/dto/request/PostRequestDto.kt @@ -0,0 +1,4 @@ +package com.hsLink.hslink.data.dto.request + +class PostRequestDto { +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/data/dto/response/PostResponseDto.kt b/app/src/main/java/com/hsLink/hslink/data/dto/response/PostResponseDto.kt new file mode 100644 index 0000000..81574ba --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/data/dto/response/PostResponseDto.kt @@ -0,0 +1,62 @@ +package com.hsLink.hslink.data.dto.response + +import com.hsLink.hslink.domain.model.PostPopularEntity +import com.hsLink.hslink.domain.model.PostPromotionEntity +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class PostResponseDto( + @SerialName("posts") + val posts: List, +) + +@Serializable +data class PostPopular( + @SerialName("id") + val id: Int, + @SerialName("title") + val title: String, +) + +@Serializable +data class PostPromotionDto( + @SerialName("posts") + val posts: List, +) + +@Serializable +data class PostPromotion( + @SerialName("id") + val id: Int, + @SerialName("title") + val title: String, + @SerialName("summary") + val summary: String, + @SerialName("author") + val author: String, + @SerialName("studentId") + val studentId: String, + @SerialName("authorStatus") + val authorStatus: String, + + ) + + +fun PostPopular.toEntity(): PostPopularEntity { + return PostPopularEntity( + id = this.id, + title = this.title, + ) +} + +fun PostPromotion.toEntity(): PostPromotionEntity { + return PostPromotionEntity( + id = this.id, + title = this.title, + summary = this.summary, + author = this.author, + studentId = this.studentId, + authorStatus = this.authorStatus, + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/data/remote/datasource/PostDataSource.kt b/app/src/main/java/com/hsLink/hslink/data/remote/datasource/PostDataSource.kt new file mode 100644 index 0000000..02d2dbd --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/data/remote/datasource/PostDataSource.kt @@ -0,0 +1,11 @@ +package com.hsLink.hslink.data.remote.datasource + +import com.hsLink.hslink.core.network.BaseResponse +import com.hsLink.hslink.data.dto.response.PostPromotionDto +import com.hsLink.hslink.data.dto.response.PostResponseDto + +interface PostDataSource { + suspend fun getPopularPost() : BaseResponse + + suspend fun getPromotionPost() : BaseResponse +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/data/remote/datasourceimpl/PostDataSourceImpl.kt b/app/src/main/java/com/hsLink/hslink/data/remote/datasourceimpl/PostDataSourceImpl.kt new file mode 100644 index 0000000..45835c4 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/data/remote/datasourceimpl/PostDataSourceImpl.kt @@ -0,0 +1,20 @@ +package com.hsLink.hslink.data.remote.datasourceimpl + +import com.hsLink.hslink.core.network.BaseResponse +import com.hsLink.hslink.data.dto.response.PostPromotionDto +import com.hsLink.hslink.data.dto.response.PostResponseDto +import com.hsLink.hslink.data.remote.datasource.PostDataSource +import com.hsLink.hslink.data.service.home.PostService +import javax.inject.Inject + +class PostDataSourceImpl @Inject constructor( + private val postService: PostService +): PostDataSource{ + override suspend fun getPopularPost() : BaseResponse{ + return postService.getPopularPost() + } + + override suspend fun getPromotionPost(): BaseResponse { + return postService.getPromotionPost() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/data/repositoryimpl/PostRepositoryImpl.kt b/app/src/main/java/com/hsLink/hslink/data/repositoryimpl/PostRepositoryImpl.kt new file mode 100644 index 0000000..4191f99 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/data/repositoryimpl/PostRepositoryImpl.kt @@ -0,0 +1,32 @@ +package com.hsLink.hslink.data.repositoryimpl + +import com.hsLink.hslink.data.dto.response.toEntity +import com.hsLink.hslink.data.remote.datasourceimpl.PostDataSourceImpl +import com.hsLink.hslink.domain.model.PostPopularEntity +import com.hsLink.hslink.domain.model.PostPromotionEntity +import com.hsLink.hslink.domain.repository.PostRepository +import javax.inject.Inject + +class PostRepositoryImpl @Inject constructor( + private val postDataSourceImpl: PostDataSourceImpl, +) : PostRepository { + override suspend fun getPopularPost(): Result> = + runCatching { + val response = postDataSourceImpl.getPopularPost() + if (response.isSuccess) { + response.result.posts.map { it.toEntity() } + } else { + throw Exception(response.message) + } + } + + override suspend fun getPromotionPost(): Result> = + runCatching { + val respone = postDataSourceImpl.getPromotionPost() + if (respone.isSuccess) { + respone.result.posts.map { it.toEntity() } + } else { + throw Exception(respone.message) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/data/service/home/PostService.kt b/app/src/main/java/com/hsLink/hslink/data/service/home/PostService.kt new file mode 100644 index 0000000..86681f0 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/data/service/home/PostService.kt @@ -0,0 +1,15 @@ +package com.hsLink.hslink.data.service.home + +import com.hsLink.hslink.core.network.BaseResponse +import com.hsLink.hslink.data.dto.response.PostPromotionDto +import com.hsLink.hslink.data.dto.response.PostResponseDto +import retrofit2.http.GET + + +interface PostService { + @GET("posts/popular") + suspend fun getPopularPost(): BaseResponse + + @GET("posts/promotion") + suspend fun getPromotionPost(): BaseResponse +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/domain/model/PostResponseEntity.kt b/app/src/main/java/com/hsLink/hslink/domain/model/PostResponseEntity.kt new file mode 100644 index 0000000..adcf498 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/domain/model/PostResponseEntity.kt @@ -0,0 +1,17 @@ +package com.hsLink.hslink.domain.model + +import kotlinx.serialization.SerialName + +data class PostPopularEntity ( + val id: Int, + val title: String, +) + +data class PostPromotionEntity( + val id: Int, + val title: String, + val summary: String, + val author: String, + val studentId: String, + val authorStatus: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/domain/repository/PostRepository.kt b/app/src/main/java/com/hsLink/hslink/domain/repository/PostRepository.kt new file mode 100644 index 0000000..00a9f02 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/domain/repository/PostRepository.kt @@ -0,0 +1,9 @@ +package com.hsLink.hslink.domain.repository + +import com.hsLink.hslink.domain.model.PostPopularEntity +import com.hsLink.hslink.domain.model.PostPromotionEntity + +interface PostRepository { + suspend fun getPopularPost(): Result> + suspend fun getPromotionPost(): Result> +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCardItem.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCardItem.kt index 6a4cdee..c71570c 100644 --- a/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCardItem.kt +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomeCardItem.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector @@ -28,17 +29,29 @@ private fun PreviewHomeCardItem() { HomeCardItem( userName = "John Doe", userMajor = "Computer Science", + userId = "20학번", userInfo = "Senior at XYZ University", + routeId = 1, modifier = Modifier ) } } +@Immutable +data class HomePromotionPost( + val id: Int, + val title: String, + val summary: String, + val author: String, + val studentId: String, +) @Composable fun HomeCardItem( userName: String, userMajor: String, userInfo: String, + userId: String, + routeId: Int, modifier: Modifier = Modifier, ) { Row( @@ -72,12 +85,25 @@ fun HomeCardItem( overflow = TextOverflow.Ellipsis ) - Text( - text = userInfo, - color = HsLinkTheme.colors.Grey400, - style = HsLinkTheme.typography.caption_12Normal, maxLines = 1, - overflow = TextOverflow.Ellipsis - ) + Row ( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically + ){ + Text( + text = userId, + color = HsLinkTheme.colors.Grey400, + style = HsLinkTheme.typography.caption_12Normal, maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + + Text( + text = userInfo, + color = HsLinkTheme.colors.Grey400, + style = HsLinkTheme.typography.caption_12Normal, maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } } Spacer(modifier = Modifier.weight(1f)) diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomePostContainer.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomePostContainer.kt index 9ccb464..261cac0 100644 --- a/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomePostContainer.kt +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/component/HomePostContainer.kt @@ -11,6 +11,7 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector @@ -28,18 +29,17 @@ private fun HomePostContainerPreview() { HsLinkTheme { HomePostContainer( posts = listOf( - HomePost(id = "1", title = "2026 카카오 신입 공채", route = "route1"), - HomePost(id = "2", title = "선배가 알려주는 이력서 꿀팁", route = "route2") + HomePost(id = "1", title = "2026 카카오 신입 공채"), + HomePost(id = "2", title = "선배가 알려주는 이력서 꿀팁") ), onPostClick = {} ) } } - +@Immutable data class HomePost( val id: String, val title: String, - val route: String, ) @Composable diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/navigation/HomeNavigation.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/navigation/HomeNavigation.kt index 0329381..637888f 100644 --- a/app/src/main/java/com/hsLink/hslink/presentation/home/navigation/HomeNavigation.kt +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/navigation/HomeNavigation.kt @@ -6,7 +6,7 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable import com.hsLink.hslink.core.navigation.MainTabRoute -import com.hsLink.hslink.presentation.home.HomeRoute +import com.hsLink.hslink.presentation.home.screen.HomeRoute import kotlinx.serialization.Serializable fun NavController.navigateToHome(navOptions: NavOptions? = null) { diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/HomeScreen.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/screen/HomeScreen.kt similarity index 63% rename from app/src/main/java/com/hsLink/hslink/presentation/home/HomeScreen.kt rename to app/src/main/java/com/hsLink/hslink/presentation/home/screen/HomeScreen.kt index 20e1431..c45c1e7 100644 --- a/app/src/main/java/com/hsLink/hslink/presentation/home/HomeScreen.kt +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/screen/HomeScreen.kt @@ -1,7 +1,8 @@ -package com.hsLink.hslink.presentation.home +package com.hsLink.hslink.presentation.home.screen import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -9,13 +10,18 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.hsLink.hslink.R import com.hsLink.hslink.core.designsystem.component.HsLinkTopBar import com.hsLink.hslink.core.designsystem.theme.HsLinkTheme @@ -25,27 +31,66 @@ import com.hsLink.hslink.presentation.home.component.HomeCarousel import com.hsLink.hslink.presentation.home.component.HomeContentField import com.hsLink.hslink.presentation.home.component.HomePost import com.hsLink.hslink.presentation.home.component.HomePostContainer +import com.hsLink.hslink.presentation.home.component.HomePromotionPost +import com.hsLink.hslink.presentation.home.viewmodel.HomeViewModel @Preview(showBackground = true) @Composable private fun HomeScreenPreview() { HsLinkTheme { - HomeScreen(paddingValues = PaddingValues()) + HomeScreen( + paddingValues = PaddingValues(), + popularPosts = listOf(), + promotionPosts = listOf(), + onPopularClick = { }, + onPromotionClick = { } + ) } } @Composable fun HomeRoute( paddingValues: PaddingValues, + homeViewModel: HomeViewModel = hiltViewModel(), ) { + val state by homeViewModel.state.collectAsStateWithLifecycle() + + val popularPosts = state.postPopular.map { post -> + HomePost( + id = post.id.toString(), + title = post.title + ) + } + + val promotionPosts = state.postPromotion.map { post -> + HomePromotionPost( + id = post.id, + title = post.title, + summary = post.summary, + author = post.author, + studentId = post.studentId + ) + } + + HsLinkTheme { - HomeScreen(paddingValues) + HomeScreen( + paddingValues = paddingValues, + popularPosts = popularPosts, + promotionPosts = promotionPosts, + onPopularClick = { }, + onPromotionClick = { }, + ) } } @Composable fun HomeScreen( paddingValues: PaddingValues, + popularPosts: List, + promotionPosts: List, + onPopularClick: (Int) -> Unit, + onPromotionClick: (HomePromotionPost) -> Unit, modifier: Modifier = Modifier, ) { LazyColumn( @@ -98,7 +143,9 @@ fun HomeScreen( HomeCardItem( userName = "송효재", userMajor = "회계재무경영", + userId = "20", userInfo = "구직중,졸업", + routeId = 0, modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) ) } @@ -114,38 +161,11 @@ fun HomeScreen( item { Spacer(modifier = Modifier.height(16.dp)) - HomePostContainer( - posts = listOf( - HomePost( - id = "1", - title = "2026 카카오 신입 공채", - route = "route1" - ), - HomePost( - id = "2", - title = "선배가 알려주는 이력서 꿀팁", - route = "route2" - ), - HomePost( - id = "3", - title = "선배가 알려주는 이력서 꿀팁", - route = "route3" - ), - HomePost( - id = "4", - title = "선배가 알려주는 이력서 꿀팁", - route = "route4" - ), - HomePost( - id = "5", - title = "선배가 알려주는 이력서 꿀팁", - route = "route5" - ) - - ), - onPostClick = {}, - modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) + posts = popularPosts, + onPostClick = { post -> + onPopularClick(post.id.toInt()) + } ) } @@ -154,17 +174,28 @@ fun HomeScreen( HomeContentField( mainText = "최신 홍보 게시글", - subText = "실시간 홍보 게시물을\n확인해보세요!", + subText = "실시간 홍보 게시글을\n확인해보세요!", ) } item { - HomeCardItem( - userName = "한성대학생이 카카오에 취직하는 가장 확실한 방법을 알려드립니다.", - userMajor = "한성대학교에 다니는 후배들이 취업고민이 많을 것 같은디,테스트용입니다", - userInfo = "08학번 성규현", - modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp) - ) + Spacer(modifier = Modifier.height(40.dp)) + + LazyRow( + modifier = Modifier.padding(start = 16.dp, end = 16.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + items(promotionPosts) { post -> + HomeCardItem( + userName = post.title, + userMajor = post.summary, + userInfo = post.author, + userId = post.studentId, + routeId = post.id, + modifier = Modifier.width(250.dp) + ) + } + } } item { diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/state/HomeContract.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/state/HomeContract.kt new file mode 100644 index 0000000..249f312 --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/state/HomeContract.kt @@ -0,0 +1,15 @@ +package com.hsLink.hslink.presentation.home.state + +import androidx.compose.runtime.Immutable +import com.hsLink.hslink.domain.model.PostPopularEntity +import com.hsLink.hslink.domain.model.PostPromotionEntity + +@Immutable +data class HomeContract ( + val isLoading: Boolean = false, + val error: String? = null, + val postPopular : List = emptyList(), + val postPromotion : List = emptyList() +){ + +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/presentation/home/viewmodel/HomeViewModel.kt b/app/src/main/java/com/hsLink/hslink/presentation/home/viewmodel/HomeViewModel.kt new file mode 100644 index 0000000..aea83fa --- /dev/null +++ b/app/src/main/java/com/hsLink/hslink/presentation/home/viewmodel/HomeViewModel.kt @@ -0,0 +1,74 @@ +package com.hsLink.hslink.presentation.home.viewmodel + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.hsLink.hslink.domain.repository.PostRepository +import com.hsLink.hslink.presentation.home.state.HomeContract +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class HomeViewModel @Inject constructor( + private val postRepository: PostRepository, +) : ViewModel() { + private val _state = MutableStateFlow(HomeContract()) + val state: StateFlow = _state.asStateFlow() + + init { + fetchPopularPosts() + fetchPromotionPosts() + } + + fun fetchPopularPosts() { + viewModelScope.launch { + postRepository.getPopularPost() + .onSuccess { posts -> + _state.update { state -> + state.copy( + postPopular = posts, + isLoading = false, + error = null + ) + } + } + .onFailure { e -> + _state.update { state -> + state.copy( + error = e.message, + isLoading = false + ) + } + } + } + } + + fun fetchPromotionPosts() { + viewModelScope.launch { + postRepository.getPromotionPost() + .onSuccess { posts -> + _state.update { state -> + state.copy( + postPromotion = posts, + isLoading = false, + error = null + ) + } + } + .onFailure { e -> + _state.update { state -> + state.copy( + error = e.message, + isLoading = false + ) + } + } + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavigator.kt b/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavigator.kt index f2cab03..778bb86 100644 --- a/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavigator.kt +++ b/app/src/main/java/com/hsLink/hslink/presentation/main/MainNavigator.kt @@ -9,12 +9,12 @@ import androidx.navigation.NavOptions import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions -import com.hsLink.hslink.presentation.home.navigation.Home import com.hsLink.hslink.presentation.community.navigation.main.navigateToCommunity import com.hsLink.hslink.presentation.community.navigation.post.navigateToCommunityPost +import com.hsLink.hslink.presentation.community.navigation.write.navigateToWriteCommunity +import com.hsLink.hslink.presentation.home.navigation.Home import com.hsLink.hslink.presentation.home.navigation.navigateToHome import com.hsLink.hslink.presentation.home.navigation.navigateToSearch -import com.hsLink.hslink.presentation.community.navigation.write.navigateToWriteCommunity import com.hsLink.hslink.presentation.mypage.navigation.main.navigateToMypage class MainNavigator( @@ -69,6 +69,10 @@ class MainNavigator( navController.navigateToCommunityPost(postId, navOptions) } + fun navigateToHome(navOptions: NavOptions? = null) { + navController.navigateToHome(navOptions) + } + @Composable fun showBottomNavigator() = MainTab.contains { currentDestination?.hasRoute(it::class) == true