这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -1094,10 +1094,10 @@ MonoBehaviour:
- {fileID: 5833498877037384762}
secondaryTextObjects:
- {fileID: 1649941262688614450}
- {fileID: 1649941262688614450}
- {fileID: 1677968316374065117}
displayLineObjects:
- {fileID: 1686292479457944369}
- {fileID: 1686292479457944369}
- {fileID: 5990508210497694103}
borderButtonObjects: []
test: 1
--- !u!1 &3905764076522623970
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,10 @@ PrefabInstance:
propertyPath: m_Name
value: MarketplaceLoginGUI
objectReference: {fileID: 0}
- target: {fileID: 5223788654180130285, guid: 9632a7d8952d45449843f4e8c3be0acc, type: 3}
propertyPath: test
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5223788654180130285, guid: 9632a7d8952d45449843f4e8c3be0acc, type: 3}
propertyPath: menuBackgroundColour.a
value: 1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,48 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using ChainSafe.Gaming.Ipfs;
using ChainSafe.Gaming.Web3;
using Newtonsoft.Json;
using Scripts.EVM.Token;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using EvmMarketplace = Scripts.EVM.Marketplace.Marketplace;
using ChainSafe.Gaming.Marketplace.Models;

/// <summary>
/// Manages the marketplace browse GUI.
/// </summary>
namespace ChainSafe.Gaming.Marketplace
{
/// <summary>
/// Manages the marketplace browse GUI.
/// </summary>
public class BrowseMarketplaceManager : MonoBehaviour
{
#region Fields

[SerializeField] private GameObject marketplaceItemPrefab;
[SerializeField] private GameObject marketplacePanel;
[SerializeField] private GameObject selectMarketplaceMenu;
[SerializeField] private GameObject browseMarketplaceMenu;
[SerializeField] private GameObject marketplaceItemPrefab;
[SerializeField] private Button openSelectMarketplaceOptionButton;
[SerializeField] private TMP_Dropdown marketplaceDropDown;
[SerializeField] private ScrollRect marketplaceScrollRect;
private List<ApiResponse.Project> projects;
private GameObject[] marketplaceItemPrefabs;
private int marketplaceObjectNumber = 1;
private int marketplaceItemDisplayCount = 100;

#endregion


#region Properties

private string BearerToken { get; set; }
private TMP_FontAsset DisplayFont { get; set; }
private Color SecondaryTextColour { get; set; }

#endregion

#region Methods
Expand All @@ -25,6 +53,163 @@ public class BrowseMarketplaceManager : MonoBehaviour
private void Awake()
{
openSelectMarketplaceOptionButton.onClick.AddListener(OpenSelectMarketplaceOptionMenu);
marketplaceItemPrefabs = new GameObject[marketplaceItemDisplayCount];
}

/// <summary>
/// Populates the marketplace drop down options.
/// </summary>
private async void GetMarketplaceOptions()
{
UnityWebRequest request = UnityWebRequest.Get("https://api.gaming.chainsafe.io/project/getByAccountID");
request.SetRequestHeader("Authorization", $"Bearer {BearerToken}");
await request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Debug.LogError($"Error: {request.error}");
}
else
{
ApiResponse apiResponse = JsonConvert.DeserializeObject<ApiResponse>(request.downloadHandler.text);
projects = apiResponse.response.projects;
List<string> options = new List<string>();
foreach (var project in projects)
{
options.Add(project.name);
}

marketplaceDropDown.ClearOptions();
marketplaceDropDown.AddOptions(options);
marketplaceDropDown.onValueChanged.AddListener(OnDropdownValueChanged);
}

if (marketplaceDropDown.options != null)
{
PopulateMarketplaceItems(0);
}
}

/// <summary>
/// Populates items to be added to the marketplace display.
/// </summary>
/// <param name="index">The index of the project to populate from.</param>
private async void PopulateMarketplaceItems(int index)
{
var projectResponse = await EvmMarketplace.GetProjectItems();
var response = await EvmMarketplace.GetMarketplaceItems(projectResponse.items[index].marketplace_id);
foreach (var item in response.items)
{
AddMarketplaceItemToDisplay(item.id, item.token.token_type, item.price, item.token.uri);
}
}

/// <summary>
/// Adds items to the marketplace display.
/// </summary>
/// <param name="nftId">Nft id.</param>
/// <param name="nftType">Nft name.</param>
/// <param name="nftPrice">Nft price.</param>
/// <param name="nftUri">Nft Uri.</param>
private void AddMarketplaceItemToDisplay(string nftId, string nftType, string nftPrice, string nftUri)
{
if (marketplaceObjectNumber >= marketplaceItemDisplayCount)
{
Destroy(marketplaceItemPrefabs[0]);
for (int i = 1; i < marketplaceItemPrefabs.Length; i++)
{
marketplaceItemPrefabs[i - 1] = marketplaceItemPrefabs[i];
}
marketplaceItemPrefabs[marketplaceItemPrefabs.Length - 1] = Instantiate(marketplaceItemPrefab, marketplacePanel.transform);
UpdateMarketplaceDisplay(marketplaceObjectNumber, nftId, nftType, nftPrice, nftUri);
}
else
{
marketplaceItemPrefabs[marketplaceObjectNumber] = Instantiate(marketplaceItemPrefab, marketplacePanel.transform);
UpdateMarketplaceDisplay(marketplaceObjectNumber, nftId, nftType, nftPrice, nftUri);
}
marketplaceObjectNumber++;
marketplaceScrollRect.horizontalNormalizedPosition = 0;
}

/// <summary>
/// Imports texture (can probably be removed later for helper class)
/// </summary>
/// <param name="uri">Nft uri</param>
private async Task<Texture2D> ImportTexture(string uri)
{
var metaRequest = UnityWebRequest.Get(uri);
await metaRequest.SendWebRequest();

if (metaRequest.result != UnityWebRequest.Result.Success)
{
throw new Web3Exception($"Metadata request failure: {metaRequest.error}");
}
var metadata = JsonConvert.DeserializeObject<Erc1155Metadata>(Encoding.UTF8.GetString(metaRequest.downloadHandler.data));
var textureUri = IpfsHelper.RollupIpfsUri(metadata.image);
var textureRequest = UnityWebRequestTexture.GetTexture(textureUri);
await textureRequest.SendWebRequest();

if (textureRequest.result != UnityWebRequest.Result.Success)
{
throw new Web3Exception($"Texture request failure: {metaRequest.error}");
}

var texture = ((DownloadHandlerTexture)textureRequest.downloadHandler).texture;

return texture;
}

/// <summary>
/// Updates the marketplace display.
/// </summary>
/// <param name="marketplaceObjectIndex"></param>
/// <param name="nftId">Nft id.</param>
/// <param name="nftType">Nft name.</param>
/// <param name="nftPrice">Nft price.</param>
/// <param name="nftUri">Nft Uri.</param>
private async void UpdateMarketplaceDisplay(int marketplaceObjectIndex, string nftId, string nftType, string nftPrice, string nftUri)
{
string[] textObjectNames = { "IdText", "TypeText", "PriceText" };
string[] textValues = { nftId, nftType, nftPrice };
for (int i = 0; i < textObjectNames.Length; i++)
{
var textObj = marketplaceItemPrefabs[marketplaceObjectIndex].transform.Find(textObjectNames[i]);
var textMeshPro = textObj.GetComponent<TextMeshProUGUI>();
textMeshPro.text = textValues[i];
textMeshPro.font = DisplayFont;
textMeshPro.color = SecondaryTextColour;
var image = await ImportTexture(nftUri);
var imageObj = marketplaceItemPrefabs[marketplaceObjectIndex].transform.Find("Image").GetComponent<Image>();
imageObj.material.mainTexture = image;
}
}

/// <summary>
/// Called when the dropdown value is changed.
/// </summary>
/// <param name="index">The index of the selected option.</param>
private void OnDropdownValueChanged(int index)
{
ResetMarketplacePrefabDisplay(index);
}

/// <summary>
/// Resets marketplace display by destroying item prefabs.
/// </summary>
/// <param name="index">The index to populate.</param>
private void ResetMarketplacePrefabDisplay(int? index = null)
{
foreach (var prefab in marketplaceItemPrefabs)
{
if (prefab != null)
{
Destroy(prefab);
}
}
Array.Clear(marketplaceItemPrefabs, 0, marketplaceItemPrefabs.Length);
marketplaceObjectNumber = 0;
if (!index.HasValue) return;
PopulateMarketplaceItems(index.Value);
}

/// <summary>
Expand All @@ -35,7 +220,37 @@ private void OpenSelectMarketplaceOptionMenu()
browseMarketplaceMenu.SetActive(false);
selectMarketplaceMenu.SetActive(true);
}

/// <summary>
/// Subscribes to events.
/// </summary>
private void OnEnable()
{
EventManagerMarketplace.ConfigureMarketplaceBrowserManager += OnConfigureMarketPlaceBrowseManager;
GetMarketplaceOptions();
}

/// <summary>
/// Unsubscribes from events.
/// </summary>
private void OnDisable()
{
EventManagerMarketplace.ConfigureMarketplaceBrowserManager -= OnConfigureMarketPlaceBrowseManager;
ResetMarketplacePrefabDisplay();
}

/// <summary>
/// Configures class properties.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void OnConfigureMarketPlaceBrowseManager(object sender, EventManagerMarketplace.MarketplaceBrowserConfigEventArgs args)
{
DisplayFont = args.DisplayFont;
SecondaryTextColour = args.SecondaryTextColour;
BearerToken = args.BearerToken;
}

#endregion
}
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// Manages the marketplace creation GUI.
/// </summary>

namespace ChainSafe.Gaming.Marketplace
{
/// <summary>
/// Manages the marketplace creation GUI.
/// </summary>
public class CreateMarketplaceManager : MonoBehaviour
{
#region Fields

[SerializeField] private GameObject selectMarketplaceMenu;
[SerializeField] private Button openSelectMarketplaceOptionButton;
[SerializeField] private GameObject createMarketplaceMenu;
[SerializeField] private Button openSelectMarketplaceOptionButton;

#endregion

Expand Down
Loading