package com.sw.inbound.viewmodel import androidx.lifecycle.viewModelScope import com.sw.inbound.GlobalData import com.sw.inbound.GlobalKey import com.sw.inbound.model.request.LoginParam import com.sw.inbound.model.response.CollectedFoodInfo import com.sw.inbound.model.response.User import com.sw.inbound.objbox.ObjectBox import com.sw.inbound.repository.RemoteRepository import com.sw.inbound.utils.GsonUtils import com.sw.inbound.utils.SPUtil import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject import kotlin.collections.remove @HiltViewModel class UserViewModel @Inject constructor( private val repo: RemoteRepository ) : BaseViewModel(repo) { // private var isFirstLaunch by mutableStateOf(true) private val _user = MutableStateFlow(null) val user = _user.asStateFlow() fun getInitInfo() { // Timber.d("getInitInfo isFirstLaunch = $isFirstLaunch") //if (isFirstLaunch) { // getUserInfo() getDictType() // isFirstLaunch = false //} } // fun login(userName: String, password: String) = launchWithLoading { // val loginParam = LoginParam(userName = userName, password = password) // val response = repo.login(loginParam) // if (parseResponse(response)) { // SPUtil.getInstance().put(GlobalKey.KEY_USER_NAME, userName) // _user.value = response.result // saveToken(response.result) // response.result?.token // } // } fun getUserInfo() { val userInfo = SPUtil.getInstance().get(GlobalKey.KEY_USER_INFO, "") if (userInfo != null) { _user.value = GsonUtils.fromJson(userInfo, User::class.java) } } private fun saveToken(user: User?) { user?.let { SPUtil.getInstance().put(GlobalKey.KEY_USER_INFO, GsonUtils.toJson(it)) SPUtil.getInstance().put(GlobalKey.KEY_TOKEN, it.token) GlobalData.appToken = it.token?:"" } } fun logout() { SPUtil.getInstance().remove(GlobalKey.KEY_USER_INFO) SPUtil.getInstance().remove(GlobalKey.KEY_TOKEN) } /** * 已采集食材列表 UI 状态流 * 元素为按名称分组后的(名称,数量)数据 */ private val _collectedFoodListState = MutableStateFlow>(emptyList()) val collectedFoodListState: StateFlow> = _collectedFoodListState.asStateFlow() /** * 加载已采集食材列表,按名称分组统计数量 * 使用属性查询只读 name 字段,不加载 foodVector,节省内存 * @param nameFilter 名称过滤关键词,为空时加载全部 */ fun loadCollectedFoodList(nameFilter: String? = null) { viewModelScope.launch { val result = ObjectBox.queryFoodNameCounts(nameFilter) _collectedFoodListState.value = result.map { (name, count) -> CollectedFoodInfo(foodName = name, foodNum = count) } } } /** * 删除指定名称的所有采集记录,删除完成后刷新列表 * @param foodName 食材名称 * @param nameFilter 当前搜索关键词,用于删除后刷新列表 */ fun removeCollectedFood(foodName: String, nameFilter: String? = null) { viewModelScope.launch { ObjectBox.remove(foodName) loadCollectedFoodList(nameFilter) } } override fun handleSensorScale(weight: Double) { } }