feat: Refactor RecentSearchesManager to support multiple accounts and improve user management
This commit is contained in:
@@ -11,23 +11,38 @@ import org.json.JSONObject
|
||||
|
||||
/**
|
||||
* Менеджер для хранения недавно открытых пользователей (до 15 записей)
|
||||
* Привязан к аккаунту пользователя
|
||||
*/
|
||||
object RecentSearchesManager {
|
||||
private const val PREFS_NAME = "recent_searches"
|
||||
private const val KEY_USERS = "recent_users"
|
||||
private const val KEY_USERS_PREFIX = "recent_users_" // + accountPublicKey
|
||||
private const val MAX_USERS = 15
|
||||
|
||||
private lateinit var prefs: SharedPreferences
|
||||
private var currentAccount: String = ""
|
||||
private val _recentUsers = MutableStateFlow<List<SearchUser>>(emptyList())
|
||||
val recentUsers: StateFlow<List<SearchUser>> = _recentUsers.asStateFlow()
|
||||
|
||||
fun init(context: Context) {
|
||||
prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
||||
}
|
||||
|
||||
/**
|
||||
* Установить текущий аккаунт и загрузить его историю
|
||||
*/
|
||||
fun setAccount(accountPublicKey: String) {
|
||||
currentAccount = accountPublicKey
|
||||
loadUsers()
|
||||
}
|
||||
|
||||
private fun getUsersKey(): String = KEY_USERS_PREFIX + currentAccount
|
||||
|
||||
private fun loadUsers() {
|
||||
val usersJson = prefs.getString(KEY_USERS, "[]") ?: "[]"
|
||||
if (currentAccount.isEmpty()) {
|
||||
_recentUsers.value = emptyList()
|
||||
return
|
||||
}
|
||||
val usersJson = prefs.getString(getUsersKey(), "[]") ?: "[]"
|
||||
try {
|
||||
val jsonArray = JSONArray(usersJson)
|
||||
val users = mutableListOf<SearchUser>()
|
||||
@@ -53,6 +68,8 @@ object RecentSearchesManager {
|
||||
* Добавить пользователя в историю
|
||||
*/
|
||||
fun addUser(user: SearchUser) {
|
||||
if (currentAccount.isEmpty()) return
|
||||
|
||||
val currentUsers = _recentUsers.value.toMutableList()
|
||||
|
||||
// Удаляем если уже есть (чтобы переместить наверх)
|
||||
@@ -73,6 +90,8 @@ object RecentSearchesManager {
|
||||
* Удалить пользователя из истории
|
||||
*/
|
||||
fun removeUser(publicKey: String) {
|
||||
if (currentAccount.isEmpty()) return
|
||||
|
||||
val currentUsers = _recentUsers.value.toMutableList()
|
||||
currentUsers.removeAll { it.publicKey == publicKey }
|
||||
_recentUsers.value = currentUsers
|
||||
@@ -80,14 +99,18 @@ object RecentSearchesManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Очистить всю историю
|
||||
* Очистить всю историю текущего аккаунта
|
||||
*/
|
||||
fun clearAll() {
|
||||
_recentUsers.value = emptyList()
|
||||
prefs.edit().remove(KEY_USERS).apply()
|
||||
if (currentAccount.isNotEmpty()) {
|
||||
prefs.edit().remove(getUsersKey()).apply()
|
||||
}
|
||||
}
|
||||
|
||||
private fun saveUsers(users: List<SearchUser>) {
|
||||
if (currentAccount.isEmpty()) return
|
||||
|
||||
val jsonArray = JSONArray()
|
||||
users.forEach { user ->
|
||||
val obj = JSONObject().apply {
|
||||
@@ -99,6 +122,6 @@ object RecentSearchesManager {
|
||||
}
|
||||
jsonArray.put(obj)
|
||||
}
|
||||
prefs.edit().putString(KEY_USERS, jsonArray.toString()).apply()
|
||||
prefs.edit().putString(getUsersKey(), jsonArray.toString()).apply()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user