Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Liquidity Rewards notifications #2272

Merged
merged 33 commits into from
Feb 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
70ce016
Add LP Tokens transfer notification
michalsmiarowski Jan 7, 2021
0632d9a
Merge branch 'master' into liquidity-rewards-notifications
michalsmiarowski Jan 11, 2021
d67848d
Add Liquidity Reward Earned notification
michalsmiarowski Jan 14, 2021
33642b6
Set a diamond icon for reward notification
michalsmiarowski Jan 14, 2021
eb51b93
Notification interval redux fix
michalsmiarowski Jan 14, 2021
1d19d30
Add link to liquidity reward earned notification
michalsmiarowski Jan 14, 2021
0a07cd8
Save reward amount before initializing the interval
michalsmiarowski Jan 14, 2021
a573115
Rename showMessage parameter for interval fnc
michalsmiarowski Jan 14, 2021
9fb1c23
Merge branch 'master' into liquidity-rewards-notifications
michalsmiarowski Jan 26, 2021
fd124b3
Move notification timeout to redux saga
michalsmiarowski Jan 27, 2021
aaf71f3
Assign UI Component based on message type
michalsmiarowski Jan 27, 2021
7870d1a
Check if user is logged in when fetching LRewards
michalsmiarowski Jan 27, 2021
38bc15f
Update reward amount after showing the notification
michalsmiarowski Jan 27, 2021
75e50b4
Update wrappedTokenBalance after wrapped token mint
michalsmiarowski Jan 27, 2021
ad56fc0
Fix js lint errors
michalsmiarowski Jan 27, 2021
7aa74d8
Remove saga context
michalsmiarowski Jan 27, 2021
5a1ead6
Remove forceDeffered property from Deferred function
michalsmiarowski Jan 27, 2021
4383d51
Set displayMessage initial value to false
michalsmiarowski Jan 27, 2021
20861ad
Remove unused useEffect
michalsmiarowski Jan 27, 2021
b653f75
Change the hardcoded number to moment's miliseconds
michalsmiarowski Feb 11, 2021
f15634c
Refactor processLiquidityRewardEarnedNotification
michalsmiarowski Feb 11, 2021
91ef0a9
Simplify if statement
michalsmiarowski Feb 11, 2021
c9bd6b2
Refactor notifications
michalsmiarowski Feb 12, 2021
553686c
Merge branch 'master' into liquidity-rewards-notifications
michalsmiarowski Feb 12, 2021
17a1ac4
Remove lp token notification from keep-only pool
michalsmiarowski Feb 15, 2021
85d3f94
JS lint errors fix
michalsmiarowski Feb 15, 2021
b2c50cd
Fix bug with fetching wrappedTokenBalance
michalsmiarowski Feb 15, 2021
9e953de
Add messageId to useEffect's dependencies
michalsmiarowski Feb 15, 2021
bd388ca
Change event that is checked during lp toknes transfer
michalsmiarowski Feb 15, 2021
c059cb3
Remove console logs
michalsmiarowski Feb 15, 2021
eef111f
Fix lp token notification not displaying bug
michalsmiarowski Feb 16, 2021
5787afa
Fix observableWrappedTokenMinAndBurnTx subsribtion
michalsmiarowski Feb 16, 2021
a29a70b
Change hierarchy of Router in App.js
michalsmiarowski Feb 16, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions solidity/dashboard/src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ import Footer from "./components/Footer"

const App = () => (
<Provider store={store}>
<Messages>
<Web3ContextProvider>
<ModalContextProvider>
<Router>
<Router>
<Messages>
<Web3ContextProvider>
<ModalContextProvider>
<AppLayout />
</Router>
</ModalContextProvider>
</Web3ContextProvider>
</Messages>
</ModalContextProvider>
</Web3ContextProvider>
</Messages>
</Router>
</Provider>
)

Expand Down
1 change: 1 addition & 0 deletions solidity/dashboard/src/actions/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export class Message {
content
type
sticky
classes
}

export const showMessage = (options) => {
Expand Down
79 changes: 52 additions & 27 deletions solidity/dashboard/src/components/Message.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,25 @@ import Banner from "./Banner"
import { showMessage, closeMessage } from "../actions/messages"
import { connect } from "react-redux"
import { ViewInBlockExplorer } from "./ViewInBlockExplorer"
import * as Icons from "./Icons"
import LiquidityRewardsEarnedMessage from "./messages/LiquidityRewardsEarnedMessage"
import LPTokensInWalletMessage from "./messages/LPTokensInWalletMessage"
import WalletMessage from "./messages/WalletMessage"
import PendingActionMessage from "./messages/PendingActionMessage"
import SuccessMessage from "./messages/SuccessMessage"
import ErrorMessage from "./messages/ErrorMessage"
import DelegationAlreadyCopiedMessage from "./messages/DelegationAlreadyCopiedMessage"

export const MessagesContext = React.createContext({})

export const messageType = {
SUCCESS: { icon: Icons.Success, iconClassName: "success-icon green" },
ERROR: { icon: Icons.Warning },
PENDING_ACTION: { icon: Icons.Time },
INFO: { icon: Icons.Question },
WALLET: { icon: Icons.Wallet, iconClassName: "wallet-icon grey-50" },
SUCCESS: SuccessMessage,
ERROR: ErrorMessage,
PENDING_ACTION: PendingActionMessage,
INFO: LiquidityRewardsEarnedMessage,
WALLET: WalletMessage,
NEW_LP_TOKENS_IN_WALLET: LPTokensInWalletMessage,
LIQUIDITY_REWARDS_EARNED: LiquidityRewardsEarnedMessage,
DELEGATION_ALREADY_COPIED: DelegationAlreadyCopiedMessage,
}

const messageTransitionTimeoutInMs = 500
Expand All @@ -23,8 +32,19 @@ class MessagesComponent extends React.Component {
this.props.showMessage(options)
}

onMessageClose = (message) => {
this.props.closeMessage(message.id)
onMessageClose = (messageId) => {
this.props.closeMessage(messageId)
}

renderSpecificMessageType = (message) => {
const SpecificComponent = message.messageType
return (
<SpecificComponent
{...message.messageProps}
messageId={message.id}
onMessageClose={this.onMessageClose}
/>
)
}

render() {
Expand All @@ -43,11 +63,7 @@ class MessagesComponent extends React.Component {
key={message.id}
classNames="banner"
>
<Message
key={message.id}
message={message}
onMessageClose={this.onMessageClose}
/>
{this.renderSpecificMessageType(message)}
</CSSTransition>
))}
</TransitionGroup>
Expand All @@ -74,40 +90,49 @@ export const Messages = connect(

const closeMessageTimeoutInMs = 3250

const Message = ({ message, onMessageClose }) => {
export const Message = ({
icon,
sticky,
title,
content,
classes,
withTransactionHash,
txHash,
messageId,
onMessageClose,
}) => {
useEffect(() => {
if (!message.sticky) {
if (!sticky) {
const timeout = setTimeout(
() => onMessageClose(message),
() => onMessageClose(messageId),
closeMessageTimeoutInMs
)
return () => clearTimeout(timeout)
}
}, [message, onMessageClose])
}, [sticky, messageId, onMessageClose])

return (
<Banner>
<div className="flex row">
<Banner.Icon
icon={message.type.icon}
className={`${message.type.iconClassName} mr-1`}
/>
<Banner.Icon icon={icon} className={`${classes?.iconClassName} mr-1`} />
<div style={styles.messageContentWrapper}>
<Banner.Title>{message.title}</Banner.Title>
{message.content && (
<Banner.Description>{message.content}</Banner.Description>
<Banner.Title>{title}</Banner.Title>
{content && (
<Banner.Description className={classes?.bannerDescription}>
{content}
</Banner.Description>
)}
{message.withTransactionHash && (
{withTransactionHash && (
<Banner.Action>
<ViewInBlockExplorer
type="tx"
className="arrow-link"
id={message.txHash}
id={txHash}
/>
</Banner.Action>
)}
</div>
<Banner.CloseIcon onClick={() => onMessageClose(message)} />
<Banner.CloseIcon onClick={() => onMessageClose(messageId)} />
</div>
</Banner>
)
Expand Down
16 changes: 12 additions & 4 deletions solidity/dashboard/src/components/SelectedWalletModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,11 @@ const SelectedWalletModal = ({
handleError(error)
}
showMessage({
type: messageType.ERROR,
title: error.message,
sticky: true,
messageType: messageType.ERROR,
messageProps: {
content: error.message,
sticky: true,
},
})
})
}
Expand Down Expand Up @@ -106,7 +108,13 @@ const SelectedWalletModal = ({
closeModal()
} catch (error) {
handleError(error)
showMessage({ type: messageType.ERROR, title: error.message })
showMessage({
messageType: messageType.ERROR,
messageProps: {
content: error.message,
sticky: true,
},
})
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import * as Icons from "../Icons"
import { Message } from "../Message"
import React from "react"

const DelegationAlreadyCopiedMessage = ({
sticky,
withTransactionHash,
txHash,
messageId,
onMessageClose,
}) => {
const icon = Icons.Success
const title = `Delegation already copied`
const classes = {
iconClassName: "success-icon green",
}

return (
<Message
sticky={sticky}
icon={icon}
title={title}
classes={classes}
withTransactionHash={withTransactionHash}
txHash={txHash}
messageId={messageId}
onMessageClose={onMessageClose}
/>
)
}

export default React.memo(DelegationAlreadyCopiedMessage)
21 changes: 21 additions & 0 deletions solidity/dashboard/src/components/messages/ErrorMessage.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import * as Icons from "../Icons"
import { Message } from "../Message"
import React from "react"

const ErrorMessage = ({ sticky, content, messageId, onMessageClose }) => {
const icon = Icons.Warning
const title = `Error`

return (
<Message
sticky={sticky}
icon={icon}
title={title}
content={content}
messageId={messageId}
onMessageClose={onMessageClose}
/>
)
}

export default React.memo(ErrorMessage)
22 changes: 22 additions & 0 deletions solidity/dashboard/src/components/messages/InfoMessage.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import * as Icons from "../Icons"
import { Message } from "../Message"
import React from "react"

// TODO: use info message somewhere or delete this component completely
const InfoMessage = ({ sticky, content, messageId, onMessageClose }) => {
const icon = Icons.MoreInfo
const title = `Info`

return (
<Message
sticky={sticky}
icon={icon}
title={title}
content={content}
messageId={messageId}
onMessageClose={onMessageClose}
/>
)
}

export default React.memo(InfoMessage)
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import React from "react"
import * as Icons from "../Icons"
import { Message } from "../Message"
import { Link } from "react-router-dom"

const LPTokensInWalletMessage = ({
liquidityRewardPairName,
sticky,
messageId,
onMessageClose,
}) => {
const icon = Icons.Wallet
const title = `[${liquidityRewardPairName}] Your wallet has LP Tokens!`
const content = <Link to={"/liquidity"}>Deposit them and earn rewards</Link>
const classes = {
bannerDescription: "m-0",
iconClassName: "wallet-icon grey-50",
}

return (
<Message
sticky={sticky}
icon={icon}
title={title}
content={content}
classes={classes}
messageId={messageId}
onMessageClose={onMessageClose}
/>
)
}

export default React.memo(LPTokensInWalletMessage)
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import React from "react"
import { Message } from "../Message"
import * as Icons from "../Icons"
import { Link } from "react-router-dom"

const LiquidityRewardsEarnedMessage = ({
liquidityRewardPairName,
sticky,
messageId,
onMessageClose,
}) => {
const icon = Icons.Rewards
const title = `[${liquidityRewardPairName}] You've earned rewards!`
const content = <Link to={"/liquidity"}>View your balance</Link>
const classes = {
bannerDescription: "m-0",
iconClassName: "reward-icon brand-violet",
}

return (
<Message
sticky={sticky}
icon={icon}
title={title}
content={content}
classes={classes}
messageId={messageId}
onMessageClose={onMessageClose}
/>
)
}

export default React.memo(LiquidityRewardsEarnedMessage)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import * as Icons from "../Icons"
import { Message } from "../Message"
import React from "react"

const PendingActionMessage = ({
sticky,
withTransactionHash,
txHash,
messageId,
onMessageClose,
}) => {
const icon = Icons.Time
const title = `Pending transaction`

return (
<Message
sticky={sticky}
icon={icon}
title={title}
withTransactionHash={withTransactionHash}
txHash={txHash}
messageId={messageId}
onMessageClose={onMessageClose}
/>
)
}

export default React.memo(PendingActionMessage)
Loading