refactor: Integrate user auth for post interactions and enable post creation

This commit enhances the post detail and creation flows by integrating user authentication and activating the post creation functionality.

**Key Changes:**

*   **refactor(PostDetailViewModel):**
    *   The `loadPostDetail` function no longer requires `userId` as a parameter. It now retrieves the current user's ID directly from the JWT using `TokenManager`.
    *   When creating a new comment (`CreateCommentDto`), the current `commentDateTime` (using `java.util.Date`) is now included.

*   **feat(PostViewModel):**
    *   The previously stubbed `createPost` function has been fully implemented.
    *   It now makes sequential repository calls: first to `createPostMetadata` to get a new `postId`, and then to `createPostBody` with that ID.
    *   The UI state is updated to reflect success or failure throughout the creation process.
This commit is contained in:
grtsinry43 2025-10-08 00:33:29 +08:00
parent 4325757404
commit c5ec5b1a0b
Signed by: grtsinry43
GPG Key ID: F3305FB3A978C934
2 changed files with 28 additions and 10 deletions

View File

@ -7,6 +7,7 @@ import com.qingshuige.tangyuan.model.CommentCard
import com.qingshuige.tangyuan.model.CreateCommentDto import com.qingshuige.tangyuan.model.CreateCommentDto
import com.qingshuige.tangyuan.model.PostCard import com.qingshuige.tangyuan.model.PostCard
import com.qingshuige.tangyuan.model.PostDetailState import com.qingshuige.tangyuan.model.PostDetailState
import com.qingshuige.tangyuan.network.TokenManager
import com.qingshuige.tangyuan.repository.PostDetailRepository import com.qingshuige.tangyuan.repository.PostDetailRepository
import com.qingshuige.tangyuan.utils.ImageSaveUtils import com.qingshuige.tangyuan.utils.ImageSaveUtils
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@ -16,6 +17,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.Date
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
@ -24,6 +26,8 @@ class PostDetailViewModel @Inject constructor(
@ApplicationContext private val context: Context @ApplicationContext private val context: Context
) : ViewModel() { ) : ViewModel() {
private val tokenManager = TokenManager()
private val _state = MutableStateFlow(PostDetailState()) private val _state = MutableStateFlow(PostDetailState())
val state: StateFlow<PostDetailState> = _state.asStateFlow() val state: StateFlow<PostDetailState> = _state.asStateFlow()
@ -33,9 +37,9 @@ class PostDetailViewModel @Inject constructor(
/** /**
* 加载帖子详情和评论 - 分离加载先加载帖子再加载评论 * 加载帖子详情和评论 - 分离加载先加载帖子再加载评论
*/ */
fun loadPostDetail(postId: Int, userId: Int = 0) { fun loadPostDetail(postId: Int) {
currentPostId = postId currentPostId = postId
currentUserId = userId currentUserId = tokenManager.getUserIdFromToken() ?: 0
viewModelScope.launch { viewModelScope.launch {
_state.value = _state.value.copy(isLoading = true, error = null) _state.value = _state.value.copy(isLoading = true, error = null)
@ -57,7 +61,7 @@ class PostDetailViewModel @Inject constructor(
) )
// 然后异步加载评论 // 然后异步加载评论
loadComments(postId, userId) loadComments(postId, currentUserId)
} }
} catch (e: Exception) { } catch (e: Exception) {
_state.value = _state.value.copy( _state.value = _state.value.copy(
@ -133,6 +137,7 @@ class PostDetailViewModel @Inject constructor(
val createCommentDto = CreateCommentDto( val createCommentDto = CreateCommentDto(
postId = currentPostId.toLong(), postId = currentPostId.toLong(),
commentDateTime = Date(),
content = content, content = content,
parentCommentId = if (parentCommentId == 0) null else parentCommentId.toLong(), parentCommentId = if (parentCommentId == 0) null else parentCommentId.toLong(),
userId = currentUserId.toLong() userId = currentUserId.toLong()

View File

@ -161,13 +161,26 @@ class PostViewModel @Inject constructor(
viewModelScope.launch { viewModelScope.launch {
_postUiState.value = _postUiState.value.copy(isCreating = true, error = null) _postUiState.value = _postUiState.value.copy(isCreating = true, error = null)
try { try {
// TODO: Call repository createPost method var postId: Int? = null
// val postId = postRepository.createPostMetadata(metadata)
// postRepository.createPostBody(body.copy(postId = postId)) postRepository.createPostMetadata(metadata)
// _postUiState.value = _postUiState.value.copy( .catch { e -> throw e }
// isCreating = false, .collect { id ->
// createSuccess = true postId = id
// )
postRepository.createPostBody(body.copy(postId = id))
.catch { e -> throw e }
.collect { success ->
if (success) {
_postUiState.value = _postUiState.value.copy(
isCreating = false,
createSuccess = true
)
} else {
throw Exception("Failed to create post body")
}
}
}
} catch (e: Exception) { } catch (e: Exception) {
_postUiState.value = _postUiState.value.copy( _postUiState.value = _postUiState.value.copy(
isCreating = false, isCreating = false,