package com.rosetta.messenger.data import android.content.Context import android.content.SharedPreferences import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow /** * πŸ“ ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΎΠ² сообщСний (ΠΊΠ°ΠΊ Π² Telegram) * Π₯Ρ€Π°Π½ΠΈΡ‚ тСкст ΠΈΠ· ΠΈΠ½ΠΏΡƒΡ‚Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³Π°. * ΠŸΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ Π² список Ρ‡Π°Ρ‚ΠΎΠ² ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ "Draft: тСкст" красным Ρ†Π²Π΅Ρ‚ΠΎΠΌ. * * Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ SharedPreferences для пСрсистСнтности ΠΌΠ΅ΠΆΠ΄Ρƒ пСрСзапусками. * ΠšΠ»ΡŽΡ‡: "draft_{account}_{opponentKey}" -> тСкст Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠ° */ object DraftManager { private const val PREFS_NAME = "rosetta_drafts" private const val KEY_PREFIX = "draft_" private var prefs: SharedPreferences? = null // πŸ”₯ Π Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Map: opponentKey -> draftText // ΠžΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠ° для ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ³ΠΎ обновлСния UI списка Ρ‡Π°Ρ‚ΠΎΠ² private val _drafts = MutableStateFlow>(emptyMap()) val drafts: StateFlow> = _drafts.asStateFlow() private var currentAccount: String = "" /** Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ с контСкстом прилоТСния */ fun init(context: Context) { if (prefs == null) { prefs = context.applicationContext.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) } } /** Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΈ */ fun setAccount(account: String) { if (currentAccount == account) return currentAccount = account loadDraftsFromPrefs() } /** Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ для Π΄ΠΈΠ°Π»ΠΎΠ³Π° */ fun saveDraft(opponentKey: String, text: String) { if (currentAccount.isEmpty()) return val trimmed = text.trim() val currentDrafts = _drafts.value.toMutableMap() if (trimmed.isEmpty()) { // УдаляСм Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ Ссли тСкст пустой currentDrafts.remove(opponentKey) prefs?.edit()?.remove(prefKey(opponentKey))?.apply() } else { currentDrafts[opponentKey] = trimmed prefs?.edit()?.putString(prefKey(opponentKey), trimmed)?.apply() } _drafts.value = currentDrafts } /** ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ для Π΄ΠΈΠ°Π»ΠΎΠ³Π° */ fun getDraft(opponentKey: String): String? { return _drafts.value[opponentKey] } /** ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ для Π΄ΠΈΠ°Π»ΠΎΠ³Π° (послС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния) */ fun clearDraft(opponentKey: String) { if (currentAccount.isEmpty()) return val currentDrafts = _drafts.value.toMutableMap() currentDrafts.remove(opponentKey) _drafts.value = currentDrafts prefs?.edit()?.remove(prefKey(opponentKey))?.apply() } /** ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ всС Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΈ (ΠΏΡ€ΠΈ смСнС Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° / Π»ΠΎΠ³Π°ΡƒΡ‚Π΅) */ fun clearAll() { _drafts.value = emptyMap() } /** Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΈΠ· SharedPreferences */ private fun loadDraftsFromPrefs() { val allPrefs = prefs?.all ?: return val prefix = "${KEY_PREFIX}${currentAccount}_" val loaded = mutableMapOf() allPrefs.forEach { (key, value) -> if (key.startsWith(prefix) && value is String && value.isNotEmpty()) { val opponentKey = key.removePrefix(prefix) loaded[opponentKey] = value } } _drafts.value = loaded } private fun prefKey(opponentKey: String): String { return "${KEY_PREFIX}${currentAccount}_${opponentKey}" } }