killapp/Assets/Scripts/UI/Components/SelectCountry.cs

193 lines
5.5 KiB
C#
Raw Normal View History

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Kill.Managers;
using Kill.Network;
public class SelectCountry : MonoBehaviour
{
public GameObject countryPrefab;
public Transform countryParent;
public Button submitButton;
public InputField searchInput;
LanguageManager.Country selectCountry;
private bool _hasSelection;
/// <summary>
/// 未选中 选中
/// </summary>
public Color[] textColors;
private List<SelectCountryItem> _items = new List<SelectCountryItem>();
public System.Action<string> onConfirm;
// private void Start()
// {
// Init("");
// }
public void Init(string code)
{
countryPrefab.SetActive(false);
// 清理旧 item
foreach (var item in _items)
Destroy(item.gameObject);
_items.Clear();
_hasSelection = false;
if (LanguageManager.Instance == null || LanguageManager.Instance.countryList == null)
return;
foreach (var country in LanguageManager.Instance.countryList)
{
var go = Instantiate(countryPrefab, countryParent);
var item = go.AddComponent<SelectCountryItem>();
item.Init(this, country);
_items.Add(item);
item.gameObject.SetActive(true);
}
// 绑定搜索
if (searchInput != null)
{
searchInput.onValueChanged.RemoveAllListeners();
searchInput.onValueChanged.AddListener(OnSearchChanged);
}
// 设置默认选中code 为空时不选中)
if (!string.IsNullOrEmpty(code))
SelectCountryByCode(code);
UpdateSubmitButton();
}
private void OnSearchChanged(string keyword)
{
foreach (var item in _items)
{
item.gameObject.SetActive(item.MatchKeyword(keyword));
}
}
public void SelectCountryByCode(string code)
{
_hasSelection = !string.IsNullOrEmpty(code);
foreach (var item in _items)
{
bool isSelected = _hasSelection && item.Country.code == code;
item.SetSelected(isSelected);
if (isSelected)
selectCountry = item.Country;
}
UpdateSubmitButton();
}
public string GetSelectedCode()
{
return _hasSelection ? selectCountry.code : null;
}
private void UpdateSubmitButton()
{
if (submitButton != null)
{
submitButton.gameObject.SetActive(_hasSelection);
submitButton.onClick.RemoveAllListeners();
submitButton.onClick.AddListener(OnSubmit);
}
}
private async void OnSubmit()
{
if (!_hasSelection) return;
await UpdateCountryCodeAsync(selectCountry.code);
}
/// <summary>
/// 更新用户国家代码
/// </summary>
private async System.Threading.Tasks.Task UpdateCountryCodeAsync(string code)
{
try
{
var requestData = new CountryCodeRequest
{
country_code = code
};
var response = await NetworkCtrl.Instance.Post<NoDataResponse>("/api/v1/user/country", requestData);
ResponseCodeHandler.HandleResponse(response,
onSuccess: (data) =>
{
if (DataManager.Instance.userInfo != null)
DataManager.Instance.userInfo.country_code = code;
onConfirm?.Invoke(code);
},
onError: null
);
}
catch (Exception ex)
{
Debug.LogError($"更新国家代码失败: {ex.Message}");
}
}
}
internal class SelectCountryItem : MonoBehaviour
{
public LanguageManager.Country Country { get; private set; }
private SelectCountry _parent;
private Text _nameText;
private GameObject _selectGo;
private Color _selectedColor;
private Color _unselectedColor;
public void Init(SelectCountry parent, LanguageManager.Country country)
{
_parent = parent;
Country = country;
_nameText = transform.Find("name")?.GetComponent<Text>();
_selectGo = transform.Find("选中")?.gameObject;
_selectedColor = parent.textColors.Length > 0 ? parent.textColors[0] : Color.white;
_unselectedColor = parent.textColors.Length > 1 ? parent.textColors[1] : Color.gray;
// 显示国家名称(根据当前语言)
bool isChinese = LanguageManager.Instance != null && LanguageManager.Instance.languageType == LanguageManager.LanguageType.Chinese;
if (_nameText != null)
_nameText.text = isChinese ? country.name_zh : country.name_en;
// 点击事件
var btn = GetComponent<Button>();
if (btn == null)
btn = gameObject.AddComponent<Button>();
btn.onClick.AddListener(OnClick);
}
public void SetSelected(bool selected)
{
if (_nameText != null)
_nameText.color = selected ? _selectedColor : _unselectedColor;
if (_selectGo != null)
_selectGo.SetActive(selected);
}
public bool MatchKeyword(string keyword)
{
if (string.IsNullOrEmpty(keyword))
return true;
var k = keyword.ToLower();
return Country.name_zh.ToLower().Contains(k)
|| Country.name_en.ToLower().Contains(k)
|| Country.code.ToLower().Contains(k);
}
private void OnClick()
{
_parent.SelectCountryByCode(Country.code);
}
}