feat: 引入共享会话状态与未登录占位组件

This commit is contained in:
AndyChen1024
2026-09-09 22:15:46 +08:00
parent c80fb31eb1
commit c41c04ff23
4 changed files with 72 additions and 0 deletions

View File

@@ -4,10 +4,12 @@ import com.mingyuan.android_client.core.data.repository.FakeCheckinRepository
import com.mingyuan.android_client.core.data.repository.FakeHomeRepository
import com.mingyuan.android_client.core.data.repository.FakePlanRepository
import com.mingyuan.android_client.core.data.repository.FakeProfileRepository
import com.mingyuan.android_client.core.data.repository.FakeSessionRepository
import com.mingyuan.android_client.core.domain.repository.CheckinRepository
import com.mingyuan.android_client.core.domain.repository.HomeRepository
import com.mingyuan.android_client.core.domain.repository.PlanRepository
import com.mingyuan.android_client.core.domain.repository.ProfileRepository
import com.mingyuan.android_client.core.domain.repository.SessionRepository
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
@@ -33,4 +35,8 @@ abstract class DataModule {
@Binds
@Singleton
abstract fun bindProfileRepository(impl: FakeProfileRepository): ProfileRepository
@Binds
@Singleton
abstract fun bindSessionRepository(impl: FakeSessionRepository): SessionRepository
}

View File

@@ -0,0 +1,25 @@
package com.mingyuan.android_client.core.data.repository
import com.mingyuan.android_client.core.domain.repository.SessionRepository
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class FakeSessionRepository @Inject constructor() : SessionRepository {
private val _isLoggedIn = MutableStateFlow(true)
override val isLoggedIn: Flow<Boolean> = _isLoggedIn
override suspend fun login() {
delay(300)
_isLoggedIn.value = true
}
override suspend fun logout() {
delay(300)
_isLoggedIn.value = false
}
}

View File

@@ -1,9 +1,11 @@
package com.mingyuan.android_client.core.designsystem.component
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
@@ -21,6 +23,7 @@ import com.mingyuan.android_client.core.designsystem.theme.ErrorBackground
import com.mingyuan.android_client.core.designsystem.theme.FaintText
import com.mingyuan.android_client.core.designsystem.theme.MutedText
import com.mingyuan.android_client.core.designsystem.theme.NeutralChip
import com.mingyuan.android_client.core.designsystem.theme.PrimaryText
@Composable
fun EmptyState(
@@ -65,3 +68,30 @@ fun ErrorState(
MingyuanButton(text = "重新加载", onClick = onRetry)
}
}
@Composable
fun LoggedOutState(
onLogin: (() -> Unit)? = null,
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
) {
Box(
modifier = Modifier.size(72.dp).background(NeutralChip, CircleShape),
contentAlignment = Alignment.Center,
) {
Text("🔒", fontSize = 32.sp)
}
Spacer(Modifier.height(12.dp))
Text("未登录", color = PrimaryText, fontSize = 15.sp, fontWeight = FontWeight.SemiBold)
Spacer(Modifier.height(4.dp))
Text("登录后即可查看", color = FaintText, fontSize = 13.sp)
if (onLogin != null) {
Spacer(Modifier.height(16.dp))
MingyuanButton(text = "登录", onClick = onLogin)
}
}
}

View File

@@ -0,0 +1,11 @@
package com.mingyuan.android_client.core.domain.repository
import kotlinx.coroutines.flow.Flow
interface SessionRepository {
val isLoggedIn: Flow<Boolean>
suspend fun login()
suspend fun logout()
}