完成登出

This commit is contained in:
2024-09-20 21:40:57 +08:00
parent 054dd68b89
commit fc7d9336cd
18 changed files with 118 additions and 32 deletions

View File

@@ -37,6 +37,10 @@
<option name="composableFile" value="true" /> <option name="composableFile" value="true" />
<option name="previewFile" value="true" /> <option name="previewFile" value="true" />
</inspection_tool> </inspection_tool>
<inspection_tool class="PreviewDeviceShouldUseNewSpec" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="composableFile" value="true" />
<option name="previewFile" value="true" />
</inspection_tool>
<inspection_tool class="PreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true"> <inspection_tool class="PreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true">
<option name="composableFile" value="true" /> <option name="composableFile" value="true" />
<option name="previewFile" value="true" /> <option name="previewFile" value="true" />

View File

@@ -1,5 +1,43 @@
package com.aiosman.riderpro package com.aiosman.riderpro
import com.aiosman.riderpro.ui.favourite.FavouriteListViewModel
import com.aiosman.riderpro.ui.favourite.FavouriteNoticeViewModel
import com.aiosman.riderpro.ui.follower.FollowerNoticeViewModel
import com.aiosman.riderpro.ui.follower.FollowingListViewModel
import com.aiosman.riderpro.ui.index.IndexViewModel
import com.aiosman.riderpro.ui.index.tabs.message.MessageListViewModel
import com.aiosman.riderpro.ui.index.tabs.moment.MomentViewModel
import com.aiosman.riderpro.ui.index.tabs.profile.MyProfileViewModel
import com.aiosman.riderpro.ui.index.tabs.search.DiscoverViewModel
import com.aiosman.riderpro.ui.index.tabs.search.SearchViewModel
import com.aiosman.riderpro.ui.like.LikeNoticeViewModel
object AppState { object AppState {
var UserId: Int? = null var UserId: Int? = null
fun ReloadAppState() {
// 重置动态列表页面
MomentViewModel.ResetModel()
// 重置我的页面
MyProfileViewModel.ResetModel()
// 重置发现页面
DiscoverViewModel.ResetModel()
// 重置搜索页面
SearchViewModel.ResetModel()
// 重置消息页面
MessageListViewModel.ResetModel()
// 重置点赞通知页面
LikeNoticeViewModel.ResetModel()
// 重置收藏页面
FavouriteListViewModel.ResetModel()
// 重置收藏通知页面
FavouriteNoticeViewModel.ResetModel()
// 重置粉丝通知页面
FollowerNoticeViewModel.ResetModel()
// 重置关注列表页面
FollowingListViewModel.ResetModel()
// 重置关注通知页面
IndexViewModel.ResetModel()
UserId = null
}
} }

View File

@@ -1,5 +1,6 @@
package com.aiosman.riderpro.data package com.aiosman.riderpro.data
import com.aiosman.riderpro.AppState
import com.aiosman.riderpro.data.api.ApiClient import com.aiosman.riderpro.data.api.ApiClient
import com.aiosman.riderpro.data.api.ChangePasswordRequestBody import com.aiosman.riderpro.data.api.ChangePasswordRequestBody
import com.aiosman.riderpro.data.api.GoogleRegisterRequestBody import com.aiosman.riderpro.data.api.GoogleRegisterRequestBody
@@ -366,6 +367,7 @@ class AccountServiceImpl : AccountService {
override suspend fun getMyAccount(): UserAuth { override suspend fun getMyAccount(): UserAuth {
val resp = ApiClient.api.checkToken() val resp = ApiClient.api.checkToken()
val body = resp.body() ?: throw ServiceException("Failed to get account") val body = resp.body() ?: throw ServiceException("Failed to get account")
AppState.UserId = body.id
return UserAuth(body.id) return UserAuth(body.id)
} }

View File

@@ -15,6 +15,7 @@ import androidx.compose.material.pullrefresh.PullRefreshIndicator
import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@@ -28,6 +29,7 @@ import com.aiosman.riderpro.ui.NavigationRoute
import com.aiosman.riderpro.ui.comment.NoticeScreenHeader import com.aiosman.riderpro.ui.comment.NoticeScreenHeader
import com.aiosman.riderpro.ui.composables.CustomAsyncImage import com.aiosman.riderpro.ui.composables.CustomAsyncImage
import com.aiosman.riderpro.ui.composables.StatusBarSpacer import com.aiosman.riderpro.ui.composables.StatusBarSpacer
import com.aiosman.riderpro.ui.favourite.FavouriteListViewModel.refreshPager
import com.aiosman.riderpro.ui.modifiers.noRippleClickable import com.aiosman.riderpro.ui.modifiers.noRippleClickable
@OptIn(ExperimentalMaterialApi::class) @OptIn(ExperimentalMaterialApi::class)
@@ -41,6 +43,9 @@ fun FavouriteListPage() {
val state = rememberPullRefreshState(FavouriteListViewModel.isLoading, onRefresh = { val state = rememberPullRefreshState(FavouriteListViewModel.isLoading, onRefresh = {
model.refreshPager(force = true) model.refreshPager(force = true)
}) })
LaunchedEffect(Unit) {
refreshPager()
}
Column( Column(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {

View File

@@ -15,7 +15,6 @@ import com.aiosman.riderpro.entity.MomentEntity
import com.aiosman.riderpro.entity.MomentPagingSource import com.aiosman.riderpro.entity.MomentPagingSource
import com.aiosman.riderpro.entity.MomentRemoteDataSource import com.aiosman.riderpro.entity.MomentRemoteDataSource
import com.aiosman.riderpro.entity.MomentServiceImpl import com.aiosman.riderpro.entity.MomentServiceImpl
import com.aiosman.riderpro.ui.index.tabs.moment.MomentViewModel.accountService
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
@@ -27,9 +26,6 @@ object FavouriteListViewModel:ViewModel() {
MutableStateFlow<PagingData<MomentEntity>>(PagingData.empty()) MutableStateFlow<PagingData<MomentEntity>>(PagingData.empty())
val favouriteMomentsFlow = _favouriteMomentsFlow.asStateFlow() val favouriteMomentsFlow = _favouriteMomentsFlow.asStateFlow()
var isLoading by mutableStateOf(false) var isLoading by mutableStateOf(false)
init {
refreshPager()
}
fun refreshPager(force:Boolean = false) { fun refreshPager(force:Boolean = false) {
viewModelScope.launch { viewModelScope.launch {
if (force) { if (force) {
@@ -50,4 +46,7 @@ object FavouriteListViewModel:ViewModel() {
} }
} }
fun ResetModel() {
isLoading = false
}
} }

View File

@@ -55,4 +55,8 @@ object FavouriteNoticeViewModel : ViewModel() {
) )
) )
} }
fun ResetModel() {
isFirstLoad = true
}
} }

View File

@@ -75,4 +75,7 @@ object FollowerNoticeViewModel : ViewModel() {
) )
) )
} }
fun ResetModel() {
isFirstLoad = true
}
} }

View File

@@ -62,4 +62,8 @@ object FollowingListViewModel : ViewModel() {
updateIsFollow(userId, false) updateIsFollow(userId, false)
} }
fun ResetModel(){
userId = null
}
} }

View File

@@ -7,4 +7,9 @@ import androidx.lifecycle.ViewModel
object IndexViewModel:ViewModel() { object IndexViewModel:ViewModel() {
var tabIndex by mutableStateOf(0) var tabIndex by mutableStateOf(0)
fun ResetModel(){
tabIndex = 0
}
} }

View File

@@ -104,4 +104,10 @@ object MessageListViewModel : ViewModel() {
noticeInfo = it.copy(commentCount = it.commentCount + delta) noticeInfo = it.copy(commentCount = it.commentCount + delta)
} }
} }
fun ResetModel(){
_commentItemsFlow.value = PagingData.empty()
noticeInfo = null
isLoading = false
isFirstLoad = true
}
} }

View File

@@ -98,6 +98,9 @@ fun MomentsList() {
val navigationBarPaddings = val navigationBarPaddings =
WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + 48.dp WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + 48.dp
val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues() val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues()
LaunchedEffect(Unit) {
model.refreshPager()
}
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()

View File

@@ -29,20 +29,21 @@ object MomentViewModel : ViewModel() {
private val momentService: MomentService = MomentServiceImpl() private val momentService: MomentService = MomentServiceImpl()
private val _momentsFlow = MutableStateFlow<PagingData<MomentEntity>>(PagingData.empty()) private val _momentsFlow = MutableStateFlow<PagingData<MomentEntity>>(PagingData.empty())
val momentsFlow = _momentsFlow.asStateFlow() val momentsFlow = _momentsFlow.asStateFlow()
val accountService: AccountService = AccountServiceImpl()
var existsMoment = mutableStateOf(false) var existsMoment = mutableStateOf(false)
var refreshing by mutableStateOf(false) var refreshing by mutableStateOf(false)
init { var isFirstLoad = true
refreshPager()
}
fun refreshPager(pullRefresh: Boolean = false) { fun refreshPager(pullRefresh: Boolean = false) {
if (!isFirstLoad) {
return
}
isFirstLoad = false
viewModelScope.launch { viewModelScope.launch {
if (pullRefresh) { if (pullRefresh) {
refreshing = true refreshing = true
} }
// 检查是否有动态 // 检查是否有动态
val existMoments = momentService.getMoments(timelineId = AppState.UserId, pageNumber = 1) val existMoments =
momentService.getMoments(timelineId = AppState.UserId, pageNumber = 1)
if (existMoments.list.isEmpty()) { if (existMoments.list.isEmpty()) {
existsMoment.value = true existsMoment.value = true
} }
@@ -173,4 +174,9 @@ object MomentViewModel : ViewModel() {
} }
_momentsFlow.value = updatedPagingData _momentsFlow.value = updatedPagingData
} }
fun ResetModel() {
_momentsFlow.value = PagingData.empty()
isFirstLoad = true
}
} }

View File

@@ -13,6 +13,7 @@ import androidx.paging.Pager
import androidx.paging.PagingConfig import androidx.paging.PagingConfig
import androidx.paging.PagingData import androidx.paging.PagingData
import androidx.paging.cachedIn import androidx.paging.cachedIn
import com.aiosman.riderpro.AppState
import com.aiosman.riderpro.AppStore import com.aiosman.riderpro.AppStore
import com.aiosman.riderpro.data.AccountService import com.aiosman.riderpro.data.AccountService
import com.aiosman.riderpro.data.AccountServiceImpl import com.aiosman.riderpro.data.AccountServiceImpl
@@ -75,7 +76,9 @@ object MyProfileViewModel : ViewModel() {
token = null token = null
rememberMe = false rememberMe = false
saveData() saveData()
} }
AppState.ReloadAppState()
} }
fun updateUserProfileBanner(bannerImageUrl: Uri?, context: Context) { fun updateUserProfileBanner(bannerImageUrl: Uri?, context: Context) {
@@ -106,11 +109,14 @@ object MyProfileViewModel : ViewModel() {
} }
} }
val followerCount get() = profile?.followerCount ?: 0
val followingCount get() = profile?.followingCount ?: 0
val bio get() = profile?.bio ?: "" val bio get() = profile?.bio ?: ""
val nickName get() = profile?.nickName ?: "" val nickName get() = profile?.nickName ?: ""
val avatar get() = profile?.avatar val avatar get() = profile?.avatar
fun ResetModel() {
profile = null
_momentsFlow.value = PagingData.empty()
firstLoad = true
}
} }

View File

@@ -60,12 +60,10 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController
fun DiscoverScreen() { fun DiscoverScreen() {
val model = DiscoverViewModel val model = DiscoverViewModel
val navController = LocalNavController.current val navController = LocalNavController.current
val systemUiController = rememberSystemUiController()
val statusBarPaddingValues = WindowInsets.systemBars.asPaddingValues()
val navigationBarPaddings = val navigationBarPaddings =
WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + 48.dp WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + 48.dp
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
systemUiController.setStatusBarColor(Color.Transparent, darkIcons = true) DiscoverViewModel.refreshPager()
} }
var refreshing by remember { mutableStateOf(false) } var refreshing by remember { mutableStateOf(false) }
val state = rememberPullRefreshState(refreshing, onRefresh = { val state = rememberPullRefreshState(refreshing, onRefresh = {

View File

@@ -11,7 +11,6 @@ import com.aiosman.riderpro.entity.MomentEntity
import com.aiosman.riderpro.entity.MomentPagingSource import com.aiosman.riderpro.entity.MomentPagingSource
import com.aiosman.riderpro.entity.MomentRemoteDataSource import com.aiosman.riderpro.entity.MomentRemoteDataSource
import com.aiosman.riderpro.entity.MomentServiceImpl import com.aiosman.riderpro.entity.MomentServiceImpl
import com.aiosman.riderpro.ui.index.tabs.moment.MomentViewModel.accountService
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
@@ -22,22 +21,12 @@ object DiscoverViewModel:ViewModel() {
private val _discoverMomentsFlow = private val _discoverMomentsFlow =
MutableStateFlow<PagingData<MomentEntity>>(PagingData.empty()) MutableStateFlow<PagingData<MomentEntity>>(PagingData.empty())
val discoverMomentsFlow = _discoverMomentsFlow.asStateFlow() val discoverMomentsFlow = _discoverMomentsFlow.asStateFlow()
init { var firstLoad = true
viewModelScope.launch {
Pager(
config = PagingConfig(pageSize = 5, enablePlaceholders = false),
pagingSourceFactory = {
MomentPagingSource(
MomentRemoteDataSource(momentService),
trend = true
)
}
).flow.cachedIn(viewModelScope).collectLatest {
_discoverMomentsFlow.value = it
}
}
}
fun refreshPager() { fun refreshPager() {
if (!firstLoad) {
return
}
firstLoad = false
viewModelScope.launch { viewModelScope.launch {
Pager( Pager(
config = PagingConfig(pageSize = 5, enablePlaceholders = false), config = PagingConfig(pageSize = 5, enablePlaceholders = false),
@@ -52,4 +41,7 @@ object DiscoverViewModel:ViewModel() {
} }
} }
} }
fun ResetModel(){
firstLoad = true
}
} }

View File

@@ -61,4 +61,10 @@ object SearchViewModel : ViewModel() {
} }
showResult = true showResult = true
} }
fun ResetModel(){
_momentsFlow.value = PagingData.empty()
_usersFlow.value = PagingData.empty()
showResult = false
}
} }

View File

@@ -51,4 +51,8 @@ object LikeNoticeViewModel : ViewModel() {
) )
) )
} }
fun ResetModel() {
isFirstLoad = true
}
} }

View File

@@ -80,6 +80,7 @@ fun UserAuthScreen() {
this.rememberMe = rememberMe this.rememberMe = rememberMe
saveData() saveData()
} }
accountService.getMyAccount()
Messaging.RegistDevice(scope, context) Messaging.RegistDevice(scope, context)
navController.navigate(NavigationRoute.Index.route) { navController.navigate(NavigationRoute.Index.route) {
popUpTo(NavigationRoute.Login.route) { inclusive = true } popUpTo(NavigationRoute.Login.route) { inclusive = true }