import React, { useState, useEffect } from "react";
import { View, Button, Modal, Text, StyleSheet, Linking, ModalProps } from "react-native";
import { ComponentStory, ComponentMeta } from "@storybook/react";
import { useEthers, QueryParams } from "@usedapp/core";
import { noop, isEmpty, isUndefined } from "lodash";
import { PoolDetails } from "../../sdk";
import { W3Wrapper } from "../W3Wrapper";
import { useFVLink, useGetMemberUBIPools, useClaim, useMultiClaim } from "../../sdk/claim/react";
export interface PageProps {
address?: string;
firstName: string;
}
export const FVModal = (params: ModalProps & { firstName: string }) => {
const fvlink = useFVLink();
const method = "popup";
return (
To verify your identity you need to sign once with your wallet.
Sign your self sovereign anonymized identifier, so no link is kept between your identity record and your
address.
);
};
const styles = StyleSheet.create({
container: {
alignItems: "center",
flex: 1,
justifyContent: "center"
},
containeralt: {
alignItems: "center",
backgroundColor: "white",
borderColor: "#eee",
borderRadius: 10,
borderWidth: 1,
justifyContent: "center",
height: 300,
margin: "auto",
padding: 30,
width: 600
},
gap: {
height: 10
}
});
export const getUnclaimedPools = (pools: PoolDetails[] | undefined) =>
pools?.filter(pool => {
const claimsRemaining = Object.values(pool)[0] as any;
return !claimsRemaining.hasClaimed;
});
const MultiClaim = () => {
const { account } = useEthers();
const [refreshRate, setRefreshRate] = useState(4);
const claimDetails = useClaim(refreshRate);
const { poolsDetails, loading, fetchPools } = useGetMemberUBIPools();
const [preClaimPools, setPreClaimPools] = useState(undefined);
const { startClaiming, poolContracts, claimFlowStatus } = useMultiClaim(preClaimPools);
//Handle navigation to pre-claim screen
useEffect(() => {
if (!isEmpty(poolContracts) && poolsDetails === undefined) return;
const unclaimedPools = getUnclaimedPools(poolsDetails);
if (
account &&
preClaimPools === undefined &&
!loading &&
!isUndefined(claimDetails.hasClaimed) &&
(claimDetails.hasClaimed === false || !isEmpty(unclaimedPools))
) {
let details: any[] = !claimDetails.hasClaimed ? [{ GoodDollar: claimDetails }] : [];
if (!isEmpty(unclaimedPools) && unclaimedPools) {
details.push(...unclaimedPools);
}
// the claimReceipts are more reliable because of immediate availibilty,
// opposed to fetching latest data from chain
if (claimFlowStatus.claimReceipts) {
const alreadyClaimed = claimFlowStatus.claimReceipts.filter(Boolean).map(receipt => receipt.to);
details = details.filter(pool => !alreadyClaimed.includes(Object.values(pool as PoolDetails)[0].address));
}
setPreClaimPools(details);
}
}, [account, claimDetails, claimFlowStatus.claimReceipts, preClaimPools, poolContracts, poolsDetails]);
useEffect(() => {
if (claimFlowStatus.remainingClaims === 0 && claimFlowStatus.error) {
setRefreshRate("everyBlock");
void fetchPools();
setTimeout(() => {
setPreClaimPools(undefined);
}, 1000);
} else if (claimFlowStatus.isClaimingDone) {
alert("All claims done!, a post-claim screen should be shown");
}
}, [claimFlowStatus.isClaimingDone, claimFlowStatus.remainingClaims]);
return (
{preClaimPools ? (
{preClaimPools.map((pool, i) =>
Object.values(pool as PoolDetails).map(details => (
PoolName: {details.contractName}
HasClaimed: {details.hasClaimed.toString()}
Address: {details.address}
))
)}
) : (
Loading....
)}
{claimFlowStatus ? (
Is Claiming: {claimFlowStatus.isClaiming.toString()}
Is Claiming Done: {claimFlowStatus.isClaimingDone.toString()}
Remaining Claims: {claimFlowStatus.remainingClaims?.toString()}
Error: {claimFlowStatus.error.toString()}
) : null}
);
};
export const UseMultiClaim = () => (
);
const ClaimPools = () => {
const { poolsDetails, loading } = useGetMemberUBIPools();
if (loading || !poolsDetails?.length) {
return No active pools;
}
return Object.values(poolsDetails[0]["RedTent"]).map(({ isRegistered, claimTime, claimAmount }) => (
Registered: {`${isRegistered}`}
Next claim time: {claimTime.toString()}
Claim amount: {claimAmount.toString()}
));
};
export const UbiClaimPools = (params: PageProps) => {
console.log({ params });
return (
);
};
const Page = (params: PageProps) => {
console.log({ params });
return (
<>>
);
};
export default {
title: "Claim Flow Example - Hooks",
component: Page
} as ComponentMeta;
const Template: ComponentStory = (args: any) => {
console.log("args", args);
return (
<>>
);
};
export const ClaimFlowExample = Template.bind({});
ClaimFlowExample.args = {
address: "",
firstName: "John"
};