product function

Future<Product> product(
  1. String sku
)

Implementation

Future<Product> product(String sku) async {
  if (state.init == false) {
    throw Exception("R2U — Not initialized");
  }
  if (state.products[sku] != null) {
    return state.products[sku] as Product;
  }

  final query = {
    'product.sku': sku,
    'asset.types': ['GLB', 'USDZ'].join(','),
    'product_review.status': 'RUNNING',
  };

  final response = await http.get(Uri.https(
      'api.r2u.io', '/customers/${state.customerId}/products/assets/', query));

  if (response.statusCode == 200) {
    List<dynamic> json = jsonDecode(response.body);
    print(json);
    final customerProduct = json[0];
    final assets = customerProduct['assets'] ?? [];
    final productReviews = customerProduct['product_reviews'] ?? [];
    final glbAsset = assets.firstWhere((asset) => asset['type'] == 'GLB');
    final usdzAsset = assets.firstWhere((asset) => asset['type'] == 'USDZ');

    final product = Product(
      glb: glbAsset != null ? glbAsset['url'] : '',
      usdz: usdzAsset != null ? usdzAsset['url'] : '',
      isActive: productReviews.length > 0,
      name: customerProduct['name'],
      placement: customerProduct['placement'] ?? 'floor',
      resize: customerProduct['resize'] ?? false,
      pdpUrl: customerProduct['pdpUrl'] ?? '',
      sound: customerProduct['soundUrl'] ?? '',
      modelId: customerProduct['modelId'],
      manufacturerId: customerProduct['manufacturerId'],
    );

    state.products[sku] = product;
    return product;
  } else {
    throw Exception('R2U — Failed to load product');
  }
}