-
Notifications
You must be signed in to change notification settings - Fork 58
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(#1368): add Expeditions Task Cards
- Loading branch information
Showing
12 changed files
with
252 additions
and
91 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
25 changes: 25 additions & 0 deletions
25
src/modules/expeditions/components/ExpeditionsCard/ExpeditionsCard.styled.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
import { ExternalLink } from 'react-feather' | ||
import { Box } from 'rebass' | ||
import styled from 'styled-components' | ||
|
||
export const Wrapper = styled.div` | ||
border-radius: 12px; | ||
background-color: ${({ theme }) => theme.bg1And2}; | ||
` | ||
|
||
export const Card = styled(Box)` | ||
display: flex; | ||
flex-flow: column nowrap; | ||
padding: 24px; | ||
gap: 16px; | ||
` | ||
|
||
export const StyledExternalLink = styled(ExternalLink)` | ||
font-size: 13px; | ||
font-style: italic; | ||
text-decoration: underline; | ||
&:hover { | ||
color: white; | ||
} | ||
` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export * from './ExpeditionsCard' |
58 changes: 58 additions & 0 deletions
58
src/modules/expeditions/components/ExpeditionsModal/ExpeditionsModal.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
import { ReactNode } from 'react' | ||
import styled from 'styled-components' | ||
|
||
import SwprLogo from '../../../../assets/images/swpr-logo.png' | ||
import { AutoColumn } from '../../../../components/Column' | ||
import Modal from '../../../../components/Modal' | ||
import Row from '../../../../components/Row' | ||
import { useShowExpeditionsPopup } from '../../../../state/application/hooks' | ||
import { TYPE } from '../../../../theme' | ||
import { LiquidityProvisionTaskCard } from './partials/LiquidityProvisionTaskCard/LiquidityProvisionTaskCard' | ||
import { LiquidityStakingTaskCard } from './partials/LiquidityStakingTaskCard' | ||
|
||
const ContentWrapper = styled(AutoColumn)` | ||
width: 100%; | ||
background-color: ${({ theme }) => theme.dark1}; | ||
padding: 32px; | ||
overflow-y: auto; | ||
` | ||
|
||
const Text = ({ children }: { children: ReactNode }) => ( | ||
<TYPE.White fontSize="16px" lineHeight="150%"> | ||
{children} | ||
</TYPE.White> | ||
) | ||
|
||
export interface ExpeditionsModalProps { | ||
onDismiss: () => void | ||
} | ||
|
||
export function ExpeditionsModal({ onDismiss }: ExpeditionsModalProps) { | ||
const open = useShowExpeditionsPopup() | ||
|
||
return ( | ||
<Modal maxWidth={630} onDismiss={onDismiss} isOpen={open}> | ||
<ContentWrapper gap="lg"> | ||
<AutoColumn gap={'32px'}> | ||
<Row justifyContent={'center'} gap={'8px'}> | ||
<img src={SwprLogo} alt="SwprLogo" style={{ height: '40px' }} /> | ||
<TYPE.LargeHeader>Swapr Expeditions</TYPE.LargeHeader> | ||
</Row> | ||
<Row> | ||
<Text> | ||
Expeditions are missions you can complete on Swapr to earn “Star Fragments”. These can be redeemed for | ||
special NFT's and various other rewards. | ||
</Text> | ||
</Row> | ||
<Row> | ||
<Text>Learn More</Text> | ||
</Row> | ||
</AutoColumn> | ||
<AutoColumn justify={'center'} gap="32px"> | ||
<LiquidityProvisionTaskCard /> | ||
<LiquidityStakingTaskCard /> | ||
</AutoColumn> | ||
</ContentWrapper> | ||
</Modal> | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export * from './ExpeditionsModal' |
64 changes: 64 additions & 0 deletions
64
...nents/ExpeditionsModal/partials/LiquidityProvisionTaskCard/LiquidityProvisionTaskCard.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
import { useContext, useState } from 'react' | ||
|
||
import { claimUserWeeklyFragments } from '../../../../api' | ||
import { WeeklyFragmentType } from '../../../../constants' | ||
import { ExpeditionsContext } from '../../../../contexts/ExpeditionsContext' | ||
import { computeFragmentState } from '../../../../utils' | ||
import { TaskCard as TaskCardBase, TaskCardProps } from '../../../ExpeditionsCard' | ||
|
||
const TaskCard = (props: Omit<TaskCardProps, 'description' | 'duration' | 'title'>) => ( | ||
<TaskCardBase | ||
description="Get some fragments each week for providing at least $50 of liquidity on Swapr!" | ||
duration="Weekly" | ||
title="Provide Liquidity" | ||
{...props} | ||
/> | ||
) | ||
|
||
export function LiquidityProvisionTaskCard() { | ||
const [isClaiming, setIsClaiming] = useState(false) | ||
const { rewards, isLoading, provider } = useContext(ExpeditionsContext) | ||
|
||
if (isLoading) { | ||
return <TaskCard buttonText={'Loading...'} status={'upcoming'} /> | ||
} | ||
|
||
const { liquidityProvision } = rewards | ||
const { isAvailableToClaim, isClaimed, isIncomplete } = computeFragmentState(liquidityProvision) | ||
|
||
const claimFrgments = async () => { | ||
if (!isClaimed && !isAvailableToClaim && !isClaiming) { | ||
return | ||
} | ||
|
||
setIsClaiming(true) | ||
try { | ||
const address = await provider.getSigner().getAddress() | ||
const signature = await provider.getSigner().signMessage('Claim Swapr weekly liquidity provision fragments') | ||
await claimUserWeeklyFragments({ address, signature, type: WeeklyFragmentType.LIQUIDITY_PROVISION }) | ||
} catch (error) { | ||
console.error(error) | ||
} finally { | ||
setIsClaiming(true) | ||
} | ||
} | ||
|
||
let buttonText: string = '' | ||
|
||
if (isClaimed) { | ||
buttonText = 'Claimed' | ||
} else if (isAvailableToClaim) { | ||
buttonText = `Claim ${liquidityProvision.claimableFragments} Fragments` | ||
} else if (isIncomplete) { | ||
buttonText = 'TASK NOT YET COMPLETED' | ||
} | ||
|
||
return ( | ||
<TaskCard | ||
buttonText={buttonText} | ||
status={rewards.liquidityStaking.claimableFragments > 0 ? 'active' : 'upcoming'} | ||
butttonDisabled={isIncomplete} | ||
onClick={claimFrgments} | ||
/> | ||
) | ||
} |
1 change: 1 addition & 0 deletions
1
...ules/expeditions/components/ExpeditionsModal/partials/LiquidityProvisionTaskCard/index.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export * from './LiquidityProvisionTaskCard' |
67 changes: 67 additions & 0 deletions
67
...omponents/ExpeditionsModal/partials/LiquidityStakingTaskCard/LiquidityStakingTaskCard.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
import { useContext, useState } from 'react' | ||
|
||
import { claimUserWeeklyFragments } from '../../../../api' | ||
import { WeeklyFragmentType } from '../../../../constants' | ||
import { ExpeditionsContext } from '../../../../contexts/ExpeditionsContext' | ||
import { computeFragmentState } from '../../../../utils' | ||
import { TaskCard as TaskCardBase, TaskCardProps } from '../../../ExpeditionsCard' | ||
|
||
const TaskCard = (props: Omit<TaskCardProps, 'description' | 'duration' | 'title'>) => ( | ||
<TaskCardBase | ||
description="Get some fragments each week for staking at least $50 of liquidity on Swapr!" | ||
duration="Weekly" | ||
title="Stake Liquidity" | ||
{...props} | ||
/> | ||
) | ||
|
||
export function LiquidityStakingTaskCard() { | ||
const [isClaiming, setIsClaiming] = useState(false) | ||
const { rewards, isLoading, provider } = useContext(ExpeditionsContext) | ||
|
||
if (isLoading) { | ||
return <TaskCard buttonText={'Loading...'} status={'upcoming'} /> | ||
} | ||
|
||
const { liquidityStaking } = rewards | ||
const { isAvailableToClaim, isClaimed, isIncomplete } = computeFragmentState(liquidityStaking) | ||
|
||
const claimFrgments = async () => { | ||
if (!isClaimed && !isAvailableToClaim && !isClaiming) { | ||
return | ||
} | ||
|
||
setIsClaiming(true) | ||
try { | ||
const address = await provider.getSigner().getAddress() | ||
const signature = await provider.getSigner().signMessage('Claim Swapr weekly liquidity staking fragments') | ||
await claimUserWeeklyFragments({ address, signature, type: WeeklyFragmentType.LIQUIDITY_STAKING }) | ||
// Update local state | ||
} catch (error) { | ||
console.error(error) | ||
} finally { | ||
setIsClaiming(true) | ||
} | ||
} | ||
|
||
let buttonText: string = '' | ||
|
||
if (isClaiming) { | ||
buttonText = 'Claiming...' | ||
} else if (isClaimed) { | ||
buttonText = 'Claimed' | ||
} else if (isAvailableToClaim) { | ||
buttonText = `Claim ${liquidityStaking.claimableFragments} Fragments` | ||
} else if (isIncomplete) { | ||
buttonText = 'TASK NOT YET COMPLETED' | ||
} | ||
|
||
return ( | ||
<TaskCard | ||
buttonText={buttonText} | ||
status={rewards.liquidityStaking.claimableFragments > 0 ? 'active' : 'upcoming'} | ||
butttonDisabled={isIncomplete} | ||
onClick={claimFrgments} | ||
/> | ||
) | ||
} |
1 change: 1 addition & 0 deletions
1
...odules/expeditions/components/ExpeditionsModal/partials/LiquidityStakingTaskCard/index.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export * from './LiquidityStakingTaskCard' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
export {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
import { WeeklyFragmentRewards } from '../api' | ||
|
||
export function computeFragmentState(rewards: WeeklyFragmentRewards) { | ||
const isClaimed = rewards.claimedFragments > 0 | ||
const isAvailableToClaim = rewards.claimableFragments > 0 | ||
const isIncomplete = !isClaimed && !isAvailableToClaim | ||
|
||
return { | ||
isClaimed, | ||
isAvailableToClaim, | ||
isIncomplete, | ||
} | ||
} |