Commit f292564c authored by Max Alekseenko's avatar Max Alekseenko

hide ref code for registered users

parent bb551494
...@@ -29,6 +29,7 @@ type TRewardsContext = { ...@@ -29,6 +29,7 @@ type TRewardsContext = {
dailyRewardQuery: UseQueryResult<RewardsUserDailyCheckResponse, ResourceError<unknown>>; dailyRewardQuery: UseQueryResult<RewardsUserDailyCheckResponse, ResourceError<unknown>>;
referralsQuery: UseQueryResult<RewardsUserReferralsResponse, ResourceError<unknown>>; referralsQuery: UseQueryResult<RewardsUserReferralsResponse, ResourceError<unknown>>;
rewardsConfigQuery: UseQueryResult<RewardsConfigResponse, ResourceError<unknown>>; rewardsConfigQuery: UseQueryResult<RewardsConfigResponse, ResourceError<unknown>>;
checkUserQuery: UseQueryResult<RewardsCheckUserResponse, ResourceError<unknown>>;
apiToken: string | undefined; apiToken: string | undefined;
isInitialized: boolean; isInitialized: boolean;
isLoginModalOpen: boolean; isLoginModalOpen: boolean;
...@@ -46,6 +47,7 @@ const RewardsContext = createContext<TRewardsContext>({ ...@@ -46,6 +47,7 @@ const RewardsContext = createContext<TRewardsContext>({
dailyRewardQuery: createDefaultQueryResult<RewardsUserDailyCheckResponse, ResourceError<unknown>>(), dailyRewardQuery: createDefaultQueryResult<RewardsUserDailyCheckResponse, ResourceError<unknown>>(),
referralsQuery: createDefaultQueryResult<RewardsUserReferralsResponse, ResourceError<unknown>>(), referralsQuery: createDefaultQueryResult<RewardsUserReferralsResponse, ResourceError<unknown>>(),
rewardsConfigQuery: createDefaultQueryResult<RewardsConfigResponse, ResourceError<unknown>>(), rewardsConfigQuery: createDefaultQueryResult<RewardsConfigResponse, ResourceError<unknown>>(),
checkUserQuery: createDefaultQueryResult<RewardsCheckUserResponse, ResourceError<unknown>>(),
apiToken: undefined, apiToken: undefined,
isInitialized: false, isInitialized: false,
isLoginModalOpen: false, isLoginModalOpen: false,
...@@ -82,6 +84,8 @@ function getRegisteredAddress(token: string) { ...@@ -82,6 +84,8 @@ function getRegisteredAddress(token: string) {
return decodedToken?.payload.sub; return decodedToken?.payload.sub;
} }
const isEnabled = config.features.rewards.isEnabled;
type Props = { type Props = {
children: React.ReactNode; children: React.ReactNode;
} }
...@@ -118,18 +122,15 @@ export function RewardsContextProvider({ children }: Props) { ...@@ -118,18 +122,15 @@ export function RewardsContextProvider({ children }: Props) {
}, []); }, []);
const [ queryOptions, fetchParams ] = useMemo(() => [ const [ queryOptions, fetchParams ] = useMemo(() => [
{ enabled: Boolean(apiToken) && config.features.rewards.isEnabled }, { enabled: Boolean(apiToken) && isEnabled },
{ headers: { Authorization: `Bearer ${ apiToken }` } }, { headers: { Authorization: `Bearer ${ apiToken }` } },
], [ apiToken ]); ], [ apiToken ]);
const balancesQuery = useApiQuery('rewards_user_balances', { queryOptions, fetchParams }); const balancesQuery = useApiQuery('rewards_user_balances', { queryOptions, fetchParams });
const dailyRewardQuery = useApiQuery('rewards_user_daily_check', { queryOptions, fetchParams }); const dailyRewardQuery = useApiQuery('rewards_user_daily_check', { queryOptions, fetchParams });
const referralsQuery = useApiQuery('rewards_user_referrals', { queryOptions, fetchParams }); const referralsQuery = useApiQuery('rewards_user_referrals', { queryOptions, fetchParams });
const rewardsConfigQuery = useApiQuery('rewards_config', { const rewardsConfigQuery = useApiQuery('rewards_config', { queryOptions: { enabled: isEnabled } });
queryOptions: { const checkUserQuery = useApiQuery('rewards_check_user', { queryOptions: { enabled: isEnabled }, pathParams: { address } });
enabled: config.features.rewards.isEnabled,
},
});
// Reset queries when the API token is removed // Reset queries when the API token is removed
useEffect(() => { useEffect(() => {
...@@ -181,20 +182,19 @@ export function RewardsContextProvider({ children }: Props) { ...@@ -181,20 +182,19 @@ export function RewardsContextProvider({ children }: Props) {
// Login to the rewards program // Login to the rewards program
const login = useCallback(async(refCode: string) => { const login = useCallback(async(refCode: string) => {
try { try {
const [ nonceResponse, userResponse, checkCodeResponse ] = await Promise.all([ const [ nonceResponse, checkCodeResponse ] = await Promise.all([
apiFetch('rewards_nonce') as Promise<RewardsNonceResponse>, apiFetch('rewards_nonce') as Promise<RewardsNonceResponse>,
apiFetch('rewards_check_user', { pathParams: { address } }) as Promise<RewardsCheckUserResponse>,
refCode ? refCode ?
apiFetch('rewards_check_ref_code', { pathParams: { code: refCode } }) as Promise<RewardsCheckRefCodeResponse> : apiFetch('rewards_check_ref_code', { pathParams: { code: refCode } }) as Promise<RewardsCheckRefCodeResponse> :
Promise.resolve({ valid: true }), Promise.resolve({ valid: true }),
]); ]);
if (!address || !('nonce' in nonceResponse) || !('exists' in userResponse) || !('valid' in checkCodeResponse)) { if (!address || !('nonce' in nonceResponse) || !('valid' in checkCodeResponse)) {
throw new Error(); throw new Error();
} }
if (!checkCodeResponse.valid) { if (!checkCodeResponse.valid) {
return { invalidRefCodeError: true }; return { invalidRefCodeError: true };
} }
const message = getMessageToSign(address, nonceResponse.nonce, userResponse.exists, refCode); const message = getMessageToSign(address, nonceResponse.nonce, checkUserQuery.data?.exists, refCode);
const signature = await signMessageAsync({ message }); const signature = await signMessageAsync({ message });
const loginResponse = await apiFetch('rewards_login', { const loginResponse = await apiFetch('rewards_login', {
fetchParams: { fetchParams: {
...@@ -215,7 +215,7 @@ export function RewardsContextProvider({ children }: Props) { ...@@ -215,7 +215,7 @@ export function RewardsContextProvider({ children }: Props) {
errorToast(_error as ResourceError<{ message: string }>); errorToast(_error as ResourceError<{ message: string }>);
throw _error; throw _error;
} }
}, [ apiFetch, address, signMessageAsync, errorToast, saveApiToken ]); }, [ apiFetch, address, signMessageAsync, errorToast, saveApiToken, checkUserQuery ]);
// Claim daily reward // Claim daily reward
const claim = useCallback(async() => { const claim = useCallback(async() => {
...@@ -240,6 +240,7 @@ export function RewardsContextProvider({ children }: Props) { ...@@ -240,6 +240,7 @@ export function RewardsContextProvider({ children }: Props) {
dailyRewardQuery, dailyRewardQuery,
referralsQuery, referralsQuery,
rewardsConfigQuery, rewardsConfigQuery,
checkUserQuery,
apiToken, apiToken,
isInitialized, isInitialized,
isLoginModalOpen, isLoginModalOpen,
...@@ -248,7 +249,7 @@ export function RewardsContextProvider({ children }: Props) { ...@@ -248,7 +249,7 @@ export function RewardsContextProvider({ children }: Props) {
login, login,
claim, claim,
}), [ }), [
isLoginModalOpen, setIsLoginModalOpen, balancesQuery, dailyRewardQuery, isLoginModalOpen, setIsLoginModalOpen, balancesQuery, dailyRewardQuery, checkUserQuery,
apiToken, login, claim, referralsQuery, rewardsConfigQuery, isInitialized, apiToken, login, claim, referralsQuery, rewardsConfigQuery, isInitialized,
]); ]);
......
...@@ -26,7 +26,7 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => { ...@@ -26,7 +26,7 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => {
const [ refCode, setRefCode ] = useState(savedRefCode || ''); const [ refCode, setRefCode ] = useState(savedRefCode || '');
const [ refCodeError, setRefCodeError ] = useBoolean(false); const [ refCodeError, setRefCodeError ] = useBoolean(false);
const dividerColor = useColorModeValue('blackAlpha.200', 'whiteAlpha.200'); const dividerColor = useColorModeValue('blackAlpha.200', 'whiteAlpha.200');
const { login } = useRewardsContext(); const { login, checkUserQuery } = useRewardsContext();
const profileQuery = useProfileQuery(); const profileQuery = useProfileQuery();
const handleRefCodeChange = React.useCallback((event: ChangeEvent<HTMLInputElement>) => { const handleRefCodeChange = React.useCallback((event: ChangeEvent<HTMLInputElement>) => {
...@@ -71,7 +71,10 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => { ...@@ -71,7 +71,10 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => {
loginToRewardsProgram(); loginToRewardsProgram();
}, [ loginToAccount, loginToRewardsProgram, profileQuery, setIsLoading ]); }, [ loginToAccount, loginToRewardsProgram, profileQuery, setIsLoading ]);
const isAddressMismatch = Boolean(address) && Boolean(profileQuery.data?.address_hash) && profileQuery.data?.address_hash !== address; const isAddressMismatch =
Boolean(address) &&
Boolean(profileQuery.data?.address_hash) &&
profileQuery.data?.address_hash !== address;
return ( return (
<> <>
...@@ -87,8 +90,8 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => { ...@@ -87,8 +90,8 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => {
More about Blockscout Merits More about Blockscout Merits
</LinkExternal> </LinkExternal>
</Box> </Box>
{ isConnected && ( { (isConnected && !isAddressMismatch && !checkUserQuery.isFetching && !checkUserQuery.data?.exists) && (
<> <Box mb={ 6 }>
<Box w="full" mb={ 6 } borderTop="1px solid" borderColor={ dividerColor }/> <Box w="full" mb={ 6 } borderTop="1px solid" borderColor={ dividerColor }/>
<Flex w="full" alignItems="center" justifyContent="space-between"> <Flex w="full" alignItems="center" justifyContent="space-between">
I have a referral code I have a referral code
...@@ -112,7 +115,7 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => { ...@@ -112,7 +115,7 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => {
<InputPlaceholder text="Code"/> <InputPlaceholder text="Code"/>
</FormControl> </FormControl>
) } ) }
</> </Box>
) } ) }
{ isAddressMismatch && ( { isAddressMismatch && (
<Alert status="warning" mt={ 4 }> <Alert status="warning" mt={ 4 }>
...@@ -124,10 +127,9 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => { ...@@ -124,10 +127,9 @@ const LoginStepContent = ({ goNext, closeModal }: Props) => {
colorScheme="blue" colorScheme="blue"
w="full" w="full"
whiteSpace="normal" whiteSpace="normal"
mt={ isConnected ? 6 : 0 }
mb={ 4 } mb={ 4 }
onClick={ isConnected ? handleLogin : connect } onClick={ isConnected ? handleLogin : connect }
isLoading={ isLoading || profileQuery.isLoading } isLoading={ isLoading || profileQuery.isLoading || checkUserQuery.isFetching }
loadingText={ isLoading ? 'Sign message in your wallet' : undefined } loadingText={ isLoading ? 'Sign message in your wallet' : undefined }
isDisabled={ isAddressMismatch } isDisabled={ isAddressMismatch }
> >
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment