hyochan / react-native-iap

In App Purchase module for React Native!
https://react-native-iap.hyo.dev
MIT License
2.83k stars 643 forks source link

Even though I added iOS items, the products appear blank. #2808

Open zelalsu opened 2 months ago

zelalsu commented 2 months ago

import React, {useState, useEffect} from 'react'; import { StyleSheet, Text, View, SafeAreaView, ImageBackground, Platform, } from 'react-native'; import {useDispatch} from 'react-redux'; import {SwiperFlatList} from 'react-native-swiper-flatlist'; import { requestSubscription, getSubscriptions, initConnection, endConnection, purchaseUpdatedListener, purchaseErrorListener, finishTransaction, } from 'react-native-iap'; import OptionCard from '../Components/Options/OptionCard'; import COLORS from '../constants/colors'; import {setPackages} from '../store/slices/package'; import {useGetByPackageQuery} from '../store/api/package'; import startApplePayTransaction from '../utils/paymentHelper'; import saveToDatabaseAndNavigate from '../utils/saveDataBaseAndNavigate'; import {ITUNES_SHARED_SECRET} from '@env';

const itemSkus = Platform.select({ android: ['global_package', 'national_package'], ios: ['global_package_ios', 'national_package_ios'], });

const PackageChosenScreen = ({navigation}) => { const [selectedValue, setSelectedValue] = useState(null); const [subscriptions, setSubscriptions] = useState([]); const dispatch = useDispatch(); const {data: responsePackage} = useGetByPackageQuery();

useEffect(() => { async function initIAP() { try { console.log('Initializing IAP connection...'); await initConnection(); console.log('IAP connection initialized');

    const products = await getSubscriptions({skus: itemSkus});
    console.log('Fetched products:', products);
    if (responsePackage) {
      const playConsolePackages = responsePackage?.data || [];

      const combinedPackages = playConsolePackages.map(playPackage => {
        const iapProduct = products.find(
          product => product.productId === playPackage.productId_PlayStore,
        );
        return iapProduct ? {...playPackage, ...iapProduct} : playPackage;
      });

      setSubscriptions(combinedPackages);
      dispatch(setPackages(combinedPackages));
      console.log('Combined packages:', combinedPackages);
    } else {
      console.log('No responsePackage data available');
    }
  } catch (error) {
    console.error('Error initializing IAP: ', error);
  }
}

const purchaseUpdateSubscription = purchaseUpdatedListener(
  async purchase => {
    const receipt = purchase.transactionReceipt;
    if (receipt) {
      try {
        if (Platform.OS === 'ios') {
          const isTestEnvironment = __DEV__;

          const appleReceiptResponse = await validateReceiptIos(
            {
              'receipt-data': receipt,
              password: ITUNES_SHARED_SECRET,
            },
            isTestEnvironment,
          );

          if (appleReceiptResponse && appleReceiptResponse.status === 0) {
            await finishTransaction({purchase, isConsumable: false});
          }
        } else {
          await finishTransaction({purchase, isConsumable: false});
        }
      } catch (error) {
        console.error(
          'An error occurred while completing transaction',
          error,
        );
      }
    }
  },
);

const purchaseErrorSubscription = purchaseErrorListener(error =>
  console.error('Purchase error', error.message),
);

initIAP();
return () => {
  endConnection();
  purchaseUpdateSubscription.remove();
  purchaseErrorSubscription.remove();
};

}, [responsePackage, ITUNES_SHARED_SECRET]);

async function saveOptionToDB(value) { try { if (value.productId === 'free_package') { console.log('Ücretsiz paket seçildi. Firebase kaydediliyor...'); await saveToDatabaseAndNavigate(dispatch, navigation, value); return; }

  if (Platform.OS === 'ios') {
    console.log('Apple Pay ile ödeme işlemi başlatılıyor...');
    await startApplePayTransaction(dispatch, navigation, value);
  } else {
    const offerToken = value.subscriptionOfferDetails[0]?.offerToken;
    const sku = value.productId;
    const subscriptionOffers = [{sku, offerToken}];

    if (!offerToken || !sku) {
      console.log(
        'Geçersiz offerToken veya sku değeri. offerToken:',
        offerToken,
        'sku:',
        sku,
      );
      return;
    }

    console.log('Satın alma işlemi başlatılıyor...');
    const purchase = await requestSubscription({subscriptionOffers});
    console.log('Satın alma işlemi başarılı:', purchase);

    await saveToDatabaseAndNavigate(dispatch, navigation, value);
  }
} catch (error) {
  console.error('Hata oluştu:', error);
}

}

function renderData({item}) { return ( <OptionCard navigation={navigation} selectedValue={selectedValue} name={item.title} item={item} id={item.productId} onPress={() => { setSelectedValue(item); saveOptionToDB(item); }} /> ); }

return (

{selectedValue ? ( Paket {selectedValue.title.toUpperCase()} seçildi ) : ( Henüz bir paket seçilmedi )}

); };

const styles = StyleSheet.create({ safeArea: { flex: 1, backgroundColor: '#fff', }, containerStyle: { flex: 1, justifyContent: 'center', }, container: { flex: 1, }, chosenPackageStyle: { color: COLORS.PRIMARY_GRAY, fontSize: 25, alignSelf: 'center', fontWeight: 'bold', }, chosenStyle: { marginTop: 20, }, });

export default PackageChosenScreen;

Jeyoung-Park commented 1 month ago

did you add information about subscription items in app store connect?