using System;
using Convai.Scripts.Utils;
using Service;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Logger = Convai.Scripts.Utils.Logger;
public class ConvaiFeedbackHandler : MonoBehaviour
{
[SerializeField] private Button _thumbsUPButton;
[SerializeField] private Button _thumbsDownButton;
[SerializeField] private GameObject _thumbsUPFill;
[SerializeField] private GameObject _thumbsDownFill;
private string _interactionID;
private TextMeshProUGUI _feedbackText;
private string _feedbackTextString;
///
/// Awake is called when the script instance is being loaded.
///
private void Awake()
{
_feedbackText = GetComponentInParent();
}
///
/// Called when the object becomes enabled and active.
///
private void OnEnable()
{
ConvaiGRPCAPI.Instance.OnResultReceived += ConvaiGRPCAPI_OnResultReceived;
_thumbsUPButton.onClick.AddListener((() => OnFeedbackButtonClicked(_thumbsUPButton)));
_thumbsDownButton.onClick.AddListener((() => OnFeedbackButtonClicked(_thumbsDownButton)));
}
///
/// Called when the object is disabled.
///
private void OnDisable()
{
ConvaiGRPCAPI.Instance.OnResultReceived -= ConvaiGRPCAPI_OnResultReceived;
_thumbsUPButton.onClick.RemoveAllListeners();
_thumbsDownButton.onClick.RemoveAllListeners();
_thumbsUPFill.SetActive(false);
_thumbsDownFill.SetActive(false);
}
///
/// Handles the event when a result is received from ConvaiGRPCAPI.
///
/// The result received.
private void ConvaiGRPCAPI_OnResultReceived(GetResponseResponse result)
{
// Check if InteractionId is not null or empty.
if (result.InteractionId.Length > 0)
{
_interactionID = result.InteractionId;
ConvaiGRPCAPI.Instance.OnResultReceived -= ConvaiGRPCAPI_OnResultReceived;
}
}
///
/// Handles the event when the feedback button is clicked.
///
private void OnFeedbackButtonClicked(Button button)
{
if (button == _thumbsUPButton)
{
SendFeedback(true);
}
else if (button == _thumbsDownButton)
{
SendFeedback(false);
}
}
///
/// Sends feedback to ConvaiGRPCAPI asynchronously.
///
/// Indicates whether the feedback is a thumbs up or thumbs down.
private async void SendFeedback(bool thumbsUP)
{
if (string.IsNullOrEmpty(_interactionID))
{
Logger.Error("InteractionId is null or empty", Logger.LogCategory.Character);
return;
}
// Set the fill visuals for thumbs up and thumbs down buttons.
HandleThumbsFill(thumbsUP);
// Extract feedback text after the colon character.
string feedbackText = RemoveBeforeColon(_feedbackText.text);
// Send feedback to ConvaiGRPCAPI.
await ConvaiGRPCAPI.Instance.SendFeedback(thumbsUP, _interactionID, feedbackText);
}
///
/// Removes the text before the colon character in the given string.
///
/// The input text.
/// The modified text after removing the portion before the colon.
private string RemoveBeforeColon(string text)
{
int colonIndex = text.IndexOf(':', StringComparison.Ordinal);
if (colonIndex != -1)
{
return text.Substring(colonIndex + 2);
}
return text;
}
///
/// Sets the fill state of the Thumbs Up and Thumbs Down buttons.
///
/// Indicates whether the feedback is a thumbs up or thumbs down.
private void HandleThumbsFill(bool thumbsUP)
{
_thumbsUPFill.SetActive(thumbsUP);
_thumbsDownFill.SetActive(!thumbsUP);
}
}