Skip to content

Commit 4721259

Browse files
authored
Merge pull request #3463 from brave/brave-rewards-ui
Brave rewards ui
2 parents 2ee5782 + cb6abd6 commit 4721259

File tree

325 files changed

+30417
-94
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

325 files changed

+30417
-94
lines changed

.storybook/locale.ts

+89-11
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,31 @@ const locale: Record<string, string> = {
99
activityNote: 'To protect your privacy, this Brave Rewards statement is not saved, recorded or logged anywhere other than on your device (this computer). It cannot be retrieved from Brave in the event of data loss on your device.',
1010
addFunds: 'add funds',
1111
addFundsFAQ: 'the FAQ',
12-
addFundsNote: 'Reminder: The Brave Wallet is unidirectional and BAT flows to publisher sites. For more information about Brave Payments, please visit',
12+
addFundsNote: 'Reminder: The Brave Wallet is unidirectional and BAT flows to creators sites. For more information about Brave Rewards, please visit',
1313
addFundsQR: 'Show QR Code',
1414
addFundsText: 'Be sure to use the address below that matches the type of cryto you own. It will be converted automatically to BAT by Uphold and appear as an increased balance in your Brave Rewards wallet. Please allow up to one hour for your wallet balance to update.',
1515
addFundsTitle: 'Send cryptocurrency from your external account to your Brave Rewards wallet.',
16+
ads: 'Ads',
17+
adsCurrentlyViewing: 'Your setting: maximum ads per hour: ',
18+
adsEarnings: 'earned from ads',
19+
adsHistoryFilterAll: 'All',
20+
adsHistoryFilterSaved: 'Saved',
21+
adsHistorySubTitle: 'Ads you\'ve received in the past {{totalDays}} days',
22+
adsHistoryTitle: 'Ads History',
23+
adsNotSupported: 'Sorry! Ads are not yet available in your region.',
24+
all: 'All',
1625
allowTip: 'Allow tips on',
1726
amount: 'Amount',
27+
and: 'and',
1828
autoTipText: 'You are automatically sending a tip to:',
1929
backup: 'Backup',
2030
backupNow: 'Backup Now',
2131
backupWalletTitle: 'Backup Wallet',
32+
balanceUnavailable: 'Unavailable',
2233
bat: 'BAT',
2334
braveAdsDesc: 'No action required. Just collect tokens. Your data is safe with our Shields.',
2435
braveAdsTitle: 'Brave Ads',
36+
braveAdsLaunchTitle: 'Brave Ads has arrived!',
2537
braveContributeDesc: 'Set budget and browse normally. Your favorite sites get paid automatically.',
2638
braveContributeTitle: 'Auto-Contribute',
2739
braveRewards: 'Brave Rewards',
@@ -30,19 +42,22 @@ const locale: Record<string, string> = {
3042
braveRewardsSubTitle: 'Get Rewarded for Browsing!',
3143
braveRewardsTeaser: 'How it works...',
3244
braveRewardsTitle: 'Brave Rewards',
33-
braveVerified: 'Brave Verified Publishers',
45+
braveVerified: 'Verified Creators',
3446
cancel: 'Cancel',
3547
captchaDrag: 'Drag the BAT Icon on to the',
36-
captchaLuckyDay: 'It’s your lucky day!',
3748
captchaOnTheWay: 'Your token grant is on its way.',
3849
captchaProveHuman: 'Prove that you are human!',
3950
captchaTarget: 'target.',
4051
captchaMissedTarget: 'Hmm… Not Quite. Try Again.',
52+
category: 'Category',
4153
claim: 'Claim',
54+
click: 'Clicked',
4255
closeBalance: 'Closing Balance',
56+
connectedText: 'This creator has not yet signed up to receive contributions from Brave users. Any tips you send will remain in your wallet until they verify.',
4357
contribute: 'Contribute',
4458
contributeAllocation: 'Auto-Contribute Allocation',
4559
contributeTooltip: 'Auto-Contribute Settings',
60+
contributionTips: 'Contributions & Tips',
4661
copy: 'Copy',
4762
currentDonation: 'You’re currently donating {{currentDonation}} BAT to this site every month.',
4863
braveRewardsCreatingText: 'Creating wallet',
@@ -54,7 +69,9 @@ const locale: Record<string, string> = {
5469
disabledPanelSettings: 'Settings.',
5570
disabledPanelPrivateText: 'Brave Rewards is not available while in a Private Window.',
5671
disabledPanelText: 'You are not currently accruing any Rewards benefits while browsing. Turn Rewards back on in',
72+
disabledPanelTextTwo: 'Earn by viewing privacy-respecting ads, and pay it forward to support content creators you love.',
5773
disabledPanelTitle: 'Brave Rewards is',
74+
dismiss: 'Closed',
5875
dndCaptchaText1: 'Drag and drop the token logo onto the',
5976
dndCaptchaText2: 'target',
6077
donation: 'Donation',
@@ -72,8 +89,10 @@ const locale: Record<string, string> = {
7289
earningsClaimDefault: 'Your Ads earnings are available.',
7390
earningsClaimOne: 'Your Ads earnings,',
7491
earningsClaimTwo: 'are available.',
92+
enableRewards: 'Enable Brave Rewards',
7593
enableTips: 'Enable Tips',
7694
excludeSite: 'Exclude this site',
95+
excludedSites: 'Excluded Sites',
7796
excludedSitesText: 'Sites excluded from Auto-Contributions:',
7897
expiresOn: 'expires on',
7998
firstTipDateText: 'Your first monthly tip will be sent on:',
@@ -83,9 +102,12 @@ const locale: Record<string, string> = {
83102
grantExpire: 'Grant Expiration Date',
84103
import: 'import',
85104
includeInAuto: 'Include in Auto-Contribute',
105+
landed: 'Clicked',
86106
learnMore: 'Learn More',
87107
makeMonthly: 'Make this monthly',
88108
manageWallet: 'Manage Your Wallet',
109+
markAsInappropriate: 'Mark As Inappropriate',
110+
markAsInappropriateChecked: 'Mark As Inappropriate ✓',
89111
monthApr: 'Apr',
90112
monthAug: 'August',
91113
monthDec: 'December',
@@ -101,8 +123,8 @@ const locale: Record<string, string> = {
101123
monthlyText: 'Monthly',
102124
monthlyTips: 'Monthly Tips!',
103125
newGrant: 'A free token grant is available.',
104-
newTokenGrant: 'New Token Grant',
105126
noActivity: 'No activities yet…',
127+
noAdsHistory: 'There is currently no Brave Ads history',
106128
noGrants: 'Currently no token grant is available.',
107129
notEnoughTokens: 'Not enough tokens. Please',
108130
noThankYou: 'No, thank you',
@@ -111,11 +133,19 @@ const locale: Record<string, string> = {
111133
on: 'on',
112134
oneTime: 'One time',
113135
oneTimeDonation: 'One-time Tips',
136+
openAdsHistory: 'Show Ads History',
114137
openBalance: 'Opening Balance',
115138
payment: 'Payment',
116139
paymentMonthly: 'Payment made every {{day}}th day in each month.',
117140
paymentNotMade: 'Payment not made.',
118141
paymentWarning: 'When your balance is not enough to cover the combined total of Auto-Contribute and the recurring donations, these payments are skipped for the period.',
142+
pendingContributions: 'Pending Contributions',
143+
pendingContributionEmpty: 'No pending contributions…',
144+
pendingContributionRemoveAll: 'Remove All',
145+
pendingTypeac: 'Auto-Contribute',
146+
pendingTyperecurring: 'Recurring tip',
147+
pendingTypetip: 'One-time tip',
148+
pendingUntil: 'Pending until',
119149
pinnedSitesHeader: 'Pinned sites are now',
120150
pinnedSitesMsg: 'Here\'s how monthly tips work:',
121151
pinnedSitesOne: 'Monthly tips do not come out of your Auto-Contribute payment. They\'re separate.',
@@ -124,18 +154,25 @@ const locale: Record<string, string> = {
124154
pinnedSitesFour: 'You can remove any site receiving monthly tips from inside of the Tips panel.',
125155
pleaseNote: 'Please note:',
126156
print: 'Print',
157+
privacyPolicy: 'Privacy Policy',
158+
processingRequest: 'You will be redirected shorty to verify your wallet.',
159+
processingRequestButton: 'Try again',
127160
readyToTakePart: 'Ready to get started?',
128161
readyToTakePartOptInText: 'Yes I\'m Ready!',
129162
readyToTakePartStart: 'You can start with the',
163+
reconnectWallet: 'Reconnect wallet',
130164
recoveryKeys: 'Recovery Key',
131165
recurring: 'Recurring',
132166
recurringDonation: 'Recurring Donation',
133167
recurringDonations: 'Monthly Tips',
134168
remove: 'remove',
169+
reservedAllLink: 'Show all pending contributions',
170+
removeAdFromSaved: 'Remove From Saved',
135171
reservedAmountText: 'You’ve designated {{reservedAmount}} BAT for creators who haven’t yet signed up to receive contributions. We’ll keep trying to contribute until they verify, or until 90 days have passed.',
136172
reservedMoreLink: 'Learn more.',
137173
restore: 'Restore',
138174
restoreAll: 'Restore All',
175+
restoreSite: 'Restore this site',
139176
reviewSitesMsg: 'Your pinned sites have been moved to',
140177
rewardsBackupText1: 'Backup your Wallet',
141178
rewardsBackupText2: 'Keep this recovery key safe.',
@@ -146,38 +183,55 @@ const locale: Record<string, string> = {
146183
rewardsContributeAttention: 'Attention',
147184
rewardsContributeAttentionScore: 'Attention',
148185
rewardsContributeText1: 'You’re currently supporting',
186+
rewardsExcludedText1: 'You\'ve excluded',
187+
rewardsExcludedText2: 'sites from Auto-Contribute.',
149188
rewardsOffText1: 'Do you know that you’ve been paying for the web content with your data for the digital ads? You didn’t have a voice in it and worse, you’re exposed to privacy and security risks.',
150189
rewardsOffText2: 'Brave Rewards allows you to take control back.',
151-
rewardsOffText3: 'How does it work?',
152-
rewardsOffText4: 'Your attention is valuable. Get paid for the ads. And pay directly the favorite content creators at your will. That way, they can grow and continue delivering the content that delights you.',
190+
rewardsOffText3: 'Today, Brave welcomes you to the new internet.',
191+
rewardsOffText4: 'One where your time is valued, your personal data is kept private, and you actually get paid for your attention.',
192+
rewardsOffText5: 'With your old browser, you paid to browse the web by viewing ads with your valuable attention. You spent your valuable time downloading invasive ad technology that transmitted your valuable private data to advertisers — without your consent.',
153193
rewardsPanelEmptyText1: 'Sadly, no tokens yet.',
154194
rewardsPanelEmptyText2: '3 ways to fill your wallet:',
155195
rewardsPanelEmptyText3: 'You can add funds.',
156196
rewardsPanelEmptyText4: 'You can earn tokens from Brave Ads.',
157-
rewardsPanelEmptyText5: 'Occasionally, you will also received token grants from Brave. So keep an eye out for the alert!',
197+
rewardsPanelEmptyText5: 'Occasionally, you\'ll be offered free token grants from Brave. Be sure to keep an eye out for the alert!',
158198
rewardsPanelOffText1: 'Get Rewarded for Browsing!',
159199
rewardsPanelOffText2: 'Earn tokens for your attention to ads and pay it forward to support content creators you value!',
160200
rewardsPanelText1: 'Add, withdraw and manage funds at',
161-
rewardsPanelText2: 'Brave wallet is managed by',
201+
rewardsPanelText2: 'Your Brave wallet is powered by',
162202
rewardsPanelText3: 'Brave Rewards is built on the Basic Attention Token. Learn more about BAT',
163203
rewardsPanelText4: 'here',
204+
rewardsPanelTextVerify: 'verify',
164205
rewardsRestoreText1: 'Restore your Wallet',
165206
rewardsRestoreText2: 'Use your recovery key to restore your wallet.',
166207
rewardsRestoreText3: 'Restoring with a recovery key will replace your current wallet. So make sure you empty or back up your current wallet before restoring.',
167208
rewardsRestoreText4: 'Enter your recovery key or',
168209
rewardsSummary: 'Rewards Summary',
169210
rewardsWhy: 'Why Brave Rewards…',
211+
saveAd: 'Save',
170212
saveAsFile: 'Save',
213+
saved: 'Saved',
171214
seeAllItems: 'See all {{numItems}} items',
172215
seeAllSites: 'See all {{numSites}} sites',
173216
sendDonation: 'Send my donation',
174217
sendTip: 'Send my Tip',
218+
serviceText: 'By clicking \'Enable Brave Rewards\', you indicate that you have read and agree to the',
219+
serviceTextToggle: 'By turning on Brave Rewards, you indicate that you have read and agree to the',
220+
serviceTextPanelWelcome: 'By clicking ‘Join Rewards’, you indicate that you have read and agree to the',
221+
serviceTextWelcome: 'By clicking ‘Yes, I\'m in!’, you indicate that you have read and agree to the',
222+
serviceTextReady: 'By clicking ‘Yes, I\'m Ready!’, you indicate that you have read and agree to the',
175223
settings: 'Settings',
224+
showAll: 'Show All',
176225
site: 'site',
177226
siteBannerNoticeNote: 'NOTE:',
178-
siteBannerNoticeText: 'This creator has not yet verified their site. As soon as they verify with Brave, they will receive your tip.',
227+
siteBannerNoticeText: 'This Creator has not yet verified their site. As soon as they verify with Brave, they will receive your tip.',
228+
siteBannerConnectedText: 'This creator has not yet signed up to receive contributions from Brave users. Your browser will keep trying to contribute until they verify, or until 90 days have passed.',
179229
sites: 'sites',
230+
tellOthers: 'Tell others about your tip.',
231+
supportedSites: 'Supported Sites',
180232
thankYou: 'Thank You!',
233+
termsOfService: 'Terms of Service',
234+
optOutTooltip: 'You will no longer receive\nads from this category',
181235
tipOnLike: 'Tip on like',
182236
tipText: 'You\'ve just sent a tip to:',
183237
titleBAT: 'Basic Attention token (BAT)',
@@ -189,23 +243,46 @@ const locale: Record<string, string> = {
189243
tokens: 'tokens',
190244
total: 'Total',
191245
transactions: 'Transactions',
246+
turnOnAds: 'Turn on Ads',
192247
turnOnRewardsDesc: 'This enables both Brave Ads and Auto-Contribute. You can always opt out each any time.',
193248
turnOnRewardsTitle: 'Turn on Rewards',
249+
tweetNow: 'Tweet',
194250
type: 'Type',
195251
uhOh: 'Uh oh…',
196-
unVerifiedPublisher: 'Not yet verified',
252+
unVerifiedCheck: 'Refresh status',
253+
unVerifiedPublisher: 'Unverified',
197254
unVerifiedText: 'This creator has not yet signed up to receive contributions from Brave users.',
198255
unVerifiedTextMore: 'Learn more.',
199-
verifiedPublisher: 'Brave Verified Publisher',
256+
verifiedPublisher: 'Verified Creator',
257+
verifyWalletTitle: 'Verify your wallet',
200258
viewDetails: 'View Details',
259+
view: 'Viewed',
201260
viewMonthly: 'View Monthly Statement for Details',
202261
walletActivity: 'Wallet Activity',
203262
walletAddress: 'Wallet Address',
204263
walletBalance: 'wallet balance',
264+
walletButtonDisconnected: 'Disconnected',
265+
walletButtonUnverified: 'Verify Wallet',
266+
walletButtonVerified: 'Verified',
205267
walletFailedButton: 'Re-try',
206268
walletFailedTitle: 'Wallet creation failed',
207269
walletFailedText: 'Please check your internet connection.',
270+
walletGoToVerifyPage: 'Complete wallet verification',
271+
walletGoToUphold: 'Go to my Uphold account',
272+
walletDisconnect: 'Disconnect from Brave Rewards',
273+
walletVerificationButton: 'Verify wallet',
274+
walletVerificationFooter: 'Our wallet service is provided by',
275+
walletVerificationList1: 'Withdraw BAT that you earn from viewing privacy-respecting ads',
276+
walletVerificationList2: 'Purchase additional BAT with credit cards and other sources',
277+
walletVerificationList3: 'Withdraw BAT that you may have previously added to your Brave Rewards wallet',
278+
walletVerificationListHeader: 'Benefits of verifying',
279+
walletVerificationNote1: 'Uphold may require you to verify your identity based on services requested.',
280+
walletVerificationNote2: 'Brave Software Inc. does not process, store, or access any of the personal information that you provide to Uphold when you establish an account with them.',
281+
walletVerificationTitle1: 'Ready to verify your wallet?',
282+
walletVerificationTitle2: 'Verification is not necessary to earn rewards for creator contributions',
283+
walletVerified: 'Verified',
208284
welcome: 'Welcome!',
285+
welcomeBack: 'Welcome Back!',
209286
welcomeButtonTextOne: 'Start Earning Now!',
210287
welcomeButtonTextTwo: 'Join Rewards',
211288
welcomeDescOne: 'You can now earn tokens for watching privacy focused Brave Ads. Your contribution stays the same.',
@@ -217,6 +294,7 @@ const locale: Record<string, string> = {
217294
whyBraveRewards: 'Why Brave Rewards?',
218295
whyBraveRewardsDesc1: 'With conventional browsers, you pay to browse the web by viewing ads with your valuable attention, spending your valuable time downloading invasive ad technology, that transmits your valuable private data to advertisers — without your consent.',
219296
whyBraveRewardsDesc2: 'Well, you\'ve come to the right place. Brave welcomes you to the new internet. One where your time is valued, your personal data is kept private, and you actually get paid for your attention.',
297+
whyHow: 'Why & How',
220298
yourWallet: 'Your wallet'
221299
}
222300

components/brave_rewards/resources/extension/brave_rewards/components/app.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import {
99
PanelWelcome,
1010
WalletPanelDisabled,
1111
WalletWrapper
12-
} from 'brave-ui/features/rewards'
12+
} from '../../../ui/components'
1313
import { BatColorIcon, WalletAddIcon } from 'brave-ui/components/icons'
14-
import { WalletState } from 'brave-ui/features/rewards/walletWrapper'
14+
import { WalletState } from '../../../ui/components/walletWrapper'
1515

1616
// Components
1717
import Panel from './panel'

components/brave_rewards/resources/extension/brave_rewards/components/panel.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import * as React from 'react'
66
import { bindActionCreators, Dispatch } from 'redux'
77
import { connect } from 'react-redux'
88
import { WalletAddIcon, BatColorIcon } from 'brave-ui/components/icons'
9-
import { WalletWrapper, WalletSummary, WalletSummarySlider, WalletPanel } from 'brave-ui/features/rewards'
10-
import { Provider } from 'brave-ui/features/rewards/profile'
11-
import { NotificationType, WalletState } from 'brave-ui/features/rewards/walletWrapper'
9+
import { WalletWrapper, WalletSummary, WalletSummarySlider, WalletPanel } from '../../../ui/components'
10+
import { Provider } from '../../../ui/components/profile'
11+
import { NotificationType, WalletState } from '../../../ui/components/walletWrapper'
1212
import { RewardsNotificationType } from '../constants/rewards_panel_types'
13-
import { Type as AlertType } from 'brave-ui/features/rewards/alert'
13+
import { Type as AlertType } from '../../../ui/components/alert'
1414

1515
// Utils
1616
import * as rewardsPanelActions from '../actions/rewards_panel_actions'

components/brave_rewards/resources/extension/brave_rewards/utils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import BigNumber from 'bignumber.js'
66
import { getMessage } from './background/api/locale_api'
7-
import { WalletState } from 'brave-ui/features/rewards/walletWrapper'
7+
import { WalletState } from '../../ui/components/walletWrapper'
88

99
export const convertBalance = (tokens: string, rates: Record<string, number> | undefined, currency: string = 'USD'): string => {
1010
const tokensNum = parseFloat(tokens)

components/brave_rewards/resources/page/components/adsBox.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
ModalShowAdsHistory,
1717
ShowAdsHistory,
1818
Tokens
19-
} from 'brave-ui/features/rewards'
19+
} from '../../ui/components'
2020
import { Grid, Column, Select, ControlWrapper } from 'brave-ui/components'
2121

2222
// Utils

components/brave_rewards/resources/page/components/app.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import SettingsPage from './settingsPage'
1111

1212
// Utils
1313
import * as rewardsActions from '../actions/rewards_actions'
14-
import { WelcomePage } from 'brave-ui/features/rewards'
14+
import { WelcomePage } from '../../ui/components'
1515

1616
interface Props extends Rewards.ComponentProps {
1717
}

components/brave_rewards/resources/page/components/contributeBox.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { connect } from 'react-redux'
88

99
// Components
1010
import { Checkbox, Grid, Column, Select, ControlWrapper } from 'brave-ui/components'
11-
import { Box, TableContribute, DisabledContent, List, ModalContribute, Tokens, NextContribution } from 'brave-ui/features/rewards'
12-
import { Provider } from 'brave-ui/features/rewards/profile'
11+
import { Box, TableContribute, DisabledContent, List, ModalContribute, Tokens, NextContribution } from '../../ui/components'
12+
import { Provider } from '../../ui/components/profile'
1313

1414
// Utils
1515
import { getLocale } from '../../../../common/locale'

components/brave_rewards/resources/page/components/grant.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ import {
1111
GrantWrapper,
1212
GrantCaptcha,
1313
GrantComplete
14-
} from 'brave-ui/features/rewards'
15-
import GrantClaim, { Type } from 'brave-ui/features/rewards/grantClaim'
14+
} from '../../ui/components'
15+
import GrantClaim, { Type } from '../../ui/components/grantClaim'
1616

1717
// Utils
1818
import * as rewardsActions from '../actions/rewards_actions'
1919
import { getLocale } from '../../../../common/locale'
2020
import { convertProbiToFixed } from '../utils'
21-
import GrantError from 'brave-ui/features/rewards/grantError'
21+
import GrantError from '../../ui/components/grantError'
2222

2323
interface State {
2424
grantShow: boolean

components/brave_rewards/resources/page/components/pageWallet.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@ import {
1414
WalletEmpty,
1515
WalletSummary,
1616
WalletWrapper
17-
} from 'brave-ui/features/rewards'
17+
} from '../../ui/components'
1818
import { WalletAddIcon, WalletWithdrawIcon } from 'brave-ui/components/icons'
19-
import { AlertWallet, WalletState } from 'brave-ui/features/rewards/walletWrapper'
20-
import { Provider } from 'brave-ui/features/rewards/profile'
21-
import { DetailRow as PendingDetailRow, PendingType } from 'brave-ui/features/rewards/tablePending'
19+
import { AlertWallet, WalletState } from '../../ui/components/walletWrapper'
20+
import { Provider } from '../../ui/components/profile'
21+
import { DetailRow as PendingDetailRow, PendingType } from '../../ui/components/tablePending'
2222
// Utils
2323
import { getLocale } from '../../../../common/locale'
2424
import * as rewardsActions from '../actions/rewards_actions'
2525
import * as utils from '../utils'
26-
import WalletOff from 'brave-ui/features/rewards/walletOff'
26+
import WalletOff from '../../ui/components/walletOff'
2727

2828
const clipboardCopy = require('clipboard-copy')
2929

components/brave_rewards/resources/page/components/settingsPage.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { connect } from 'react-redux'
88

99
// Components
1010
import { Column, Grid } from 'brave-ui/components'
11-
import { DisabledBox, MainToggle, SettingsPage as Page, ModalRedirect } from 'brave-ui/features/rewards'
11+
import { DisabledBox, MainToggle, SettingsPage as Page, ModalRedirect } from '../../ui/components'
1212
import PageWallet from './pageWallet'
1313
import AdsBox from './adsBox'
1414
import ContributeBox from './contributeBox'

0 commit comments

Comments
 (0)