using TMPro; using UnityEngine; namespace UI { /// /// Управляет только TextMeshPro текстом с контактами администрации. /// Подписывается на изменения настроек и обновляет текст, беря номер из PlayerPrefs по ключу `telephone_number`. /// public class AdminContactsController : MonoBehaviour { [Tooltip("TextMeshPro текст, куда выводятся контакты администрации.")] [SerializeField] private TMP_Text contactsText; [Tooltip("TextMeshPro текст для отображения ошибок выдачи приза.")] [SerializeField] private TMP_Text errorText; [Tooltip("TextMeshPro текст для отображения суперприза.")] [SerializeField] private TMP_Text prizeText; [Tooltip("TextMeshPro текст для отображения цены игры с ботом.")] [SerializeField] private TMP_Text priceBotText; [Tooltip("TextMeshPro текст для отображения цены игры с другом.")] [SerializeField] private TMP_Text pricePlayerText; [Tooltip("Ключ PlayerPrefs, откуда берётся номер телефона (по умолчанию 'telephone_number').")] [SerializeField] private string telephonePrefKey = "telephone_number"; [Tooltip("Ключ PlayerPrefs, откуда берётся приз (по умолчанию 'SpecialPrize').")] [SerializeField] private string prizePrefKey = "SpecialPrize"; [Tooltip("Если true — объект текста будет скрываться, когда опция выключена; иначе текст будет очищаться.")] [SerializeField] private bool hideTextWhenOff = true; private const string SettingName = "Показывать контакты администрации"; private const string ErrorSettingName = "Вывод ошибки выдачи в меню"; private const string PrizeSettingName = "Вывод информации о суперпризе в меню"; private const string PriceSettingName = "Показывать цену игры"; private void OnEnable() { if (SettingsManager.instance != null) SettingsManager.instance.OnSettingsChanged.AddListener(UpdateState); TextInput.OnTextChanged += UpdateState; } private void Start() { if (contactsText == null) contactsText = GetComponent(); // Если errorText не назначен в инспекторе, пытаемся найти его среди дочерних TMP-текств if (errorText == null) { var tmps = GetComponentsInChildren(true); foreach (var t in tmps) { if (t == contactsText) continue; errorText = t; break; } } // Подстраховка: подпишемся также в Start, если instance появился позже if (SettingsManager.instance != null) { SettingsManager.instance.OnSettingsChanged.RemoveListener(UpdateState); SettingsManager.instance.OnSettingsChanged.AddListener(UpdateState); } UpdateState(); } private void OnDisable() { if (SettingsManager.instance != null) SettingsManager.instance.OnSettingsChanged.RemoveListener(UpdateState); // Отписываемся от изменения текста (если подписывались в OnEnable) TextInput.OnTextChanged -= UpdateState; } private void UpdateState() { // Обновляем contactsText независимо от errorText bool contactsShouldShow = GetSettingFlag(SettingName); if (contactsText != null) { if (contactsShouldShow) { contactsText.gameObject.SetActive(true); string phone = PlayerPrefs.GetString(telephonePrefKey, string.Empty); contactsText.text = string.IsNullOrEmpty(phone) ? "Телефон не задан" : $"Телефон: {phone}"; } else { if (hideTextWhenOff) contactsText.gameObject.SetActive(false); else contactsText.text = string.Empty; } } // Обновляем errorText независимо от contactsText bool showError = GetSettingFlag(ErrorSettingName); if (errorText != null) { if (showError) { errorText.gameObject.SetActive(true); string err = PlayerPrefs.GetString(KeyVault.PRIZING_ERROR_REGISTRED, string.Empty); if (string.IsNullOrEmpty(err)) { errorText.text = ""; errorText.color = Color.green; // нет ошибок — зелёный } else { errorText.text = $"Ошибка выдачи {err}"; errorText.color = Color.red; // есть ошибка — красный } } else { if (hideTextWhenOff) errorText.gameObject.SetActive(false); else errorText.text = string.Empty; } } bool showPrize = GetSettingFlag(PrizeSettingName); if (prizeText != null) { if (showPrize) { prizeText.gameObject.SetActive(true); string prizeInfo = PlayerPrefs.GetString(prizePrefKey, string.Empty); prizeText.text = string.IsNullOrEmpty(prizeInfo) ? "Суперприз не задан" : $"Суперприз: {prizeInfo}"; } else { if (hideTextWhenOff) prizeText.gameObject.SetActive(false); else prizeText.text = string.Empty; } } bool showPrice = GetSettingFlag(PriceSettingName); if (priceBotText != null) { if (showPrice) { priceBotText.gameObject.SetActive(true); string price = PlayerPrefs.GetString("PriceBotGame", string.Empty); priceBotText.text = string.IsNullOrEmpty(price) ? "Цена игры с ботом не задана" : $"{price} р"; } else { if (hideTextWhenOff) priceBotText.gameObject.SetActive(false); else priceBotText.text = string.Empty; } } if (pricePlayerText != null) { if (showPrice) { pricePlayerText.gameObject.SetActive(true); string price = PlayerPrefs.GetString("PricePlayerGame", string.Empty); pricePlayerText.text = string.IsNullOrEmpty(price) ? "Цена игры с другом не задана" : $"{price} р"; } else { if (hideTextWhenOff) pricePlayerText.gameObject.SetActive(false); else pricePlayerText.text = string.Empty; } } } // Универсальная проверка булевых настроек (учитывает разные представления true) private bool GetSettingFlag(string key) { if (SettingsManager.instance == null) return false; string val; try { val = SettingsManager.instance.GetSettingValue(key); } catch (System.Exception ex) { Debug.LogWarning($"AdminContactsController: ошибка при чтении настройки '{key}': {ex.Message}"); return false; } if (string.IsNullOrEmpty(val)) return false; val = val.Trim().ToLowerInvariant(); string[] trueValues = new string[] { "вкл", "включено", "да", "true", "on", "enabled", "вкл." }; foreach (var t in trueValues) if (val.Contains(t)) return true; return false; } } }