import React, {useState, useEffect, useCallback} from 'react'; import * as Sentry from '@sentry/react-native'; import {Severity} from '@sentry/types'; import {Image, RefreshControl, LogBox} from 'react-native'; import moment from 'moment'; import {useFocusEffect} from '@react-navigation/native'; import DeleteCredentialModal from '@components/DeleteCredentialModal'; import {usePost, useGet} from '@hooks/api'; import {CLAIM_ALL, CLAIMABLE} from '@constants/api'; import useUser from '@contexts/user'; import {IClaimableCredentialProps} from '@components/Credential/types'; import DocumentIcon from '@assets/svg/DocumentIcon'; import { StyledNotification, NotificationHeader, NotificationTitle, NotificationTime, DocumentIconWrapper, NotificationFooter, DeleteButton, AddToWalletButton, DeleteLabelStyles, NotificationsNotFound, Wrapper, } from '@styles/screens/notifications'; import {NotificationWrapperStyle} from '@styles/screens/home'; const Notification = () => { const [deleteModalVisibility, setDeleteModalVisibility] = useState(false); const [deleteCredentialData, setDeleteCredentialData] = useState< IClaimableCredentialProps | undefined >(undefined); const {getPhoneNumber, sdk, setCredentials, user, setUser} = useUser(); const [claimableCredentials, setClaimableCredentials] = useState< IClaimableCredentialProps[] >([]); const [phoneNumber, setPhoneNumber] = useState(undefined); const {refetch} = useGet(CLAIMABLE, `${CLAIMABLE}?userId=${phoneNumber}`, { enabled: false, }); const {mutateAsync} = usePost(); useEffect(() => { (async () => { const value = await getPhoneNumber(); if (value) { setPhoneNumber(value); } })(); }, [getPhoneNumber]); useEffect(() => { LogBox.ignoreLogs(['Animated: `useNativeDriver`']); }, []); const getNotifications = async () => { if (!claimableCredentials?.length && phoneNumber) { try { const response = await refetch(); if (response?.data?.data?.length) { setClaimableCredentials(response?.data?.data); } else { setUser({...user, hasNewNotifications: false}); } } catch (error: any) { Sentry.captureMessage( `Error while fetching the claimable credentials, Mobile Number : ${phoneNumber}, Error : ${error?.message}`, Severity.Error, ); console.error(error); } } }; useEffect(() => { (async () => { await getNotifications(); })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [phoneNumber, claimableCredentials]); const onRefresh = useCallback(async () => { await getNotifications(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [phoneNumber]); useFocusEffect( useCallback(() => { setClaimableCredentials([]); }, []), ); return ( }> {claimableCredentials?.length === 0 && ( )} {claimableCredentials?.map((c: IClaimableCredentialProps, i: number) => { const diff = moment().diff(c?.CreatedAt, 'days'); const {Status} = c; return ( {c?.VCName} {diff > 0 && {diff}d} { if (Status === 'PROCESSING') { return; } try { if (c?.CredentialOfferRequestToken) { const offerResponseToken = await sdk?.createCredentialOfferResponseToken( c?.CredentialOfferRequestToken, ); const payload = { offerResponseToken, userId: phoneNumber, draftVCId: c?.DraftVCId, issuerId: c?.IssuerId, }; await mutateAsync({url: CLAIM_ALL, data: [payload]}); await setCredentials(undefined); setClaimableCredentials([]); } } catch (e: any) { Sentry.captureMessage( `Error while fetching the claiming the credential, Mobile Number : ${phoneNumber}, Error : ${e?.message}`, Severity.Error, ); } }} testID="addNtfWlt" /> { if (Status === 'PROCESSING') { return; } setDeleteCredentialData(c); setDeleteModalVisibility(true); }} testID="dltNtf" /> ); })} {deleteModalVisibility && deleteCredentialData && ( { setDeleteModalVisibility(false); setDeleteCredentialData(undefined); }} onDelete={() => { setDeleteModalVisibility(false); setDeleteCredentialData(undefined); setClaimableCredentials([]); }} /> )} ); }; export default Notification;