├── public ├── _redirects ├── favicon.ico ├── apple-icon.png ├── robots.txt ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon-96x96.png ├── ms-icon-70x70.png ├── ms-icon-144x144.png ├── ms-icon-150x150.png ├── ms-icon-310x310.png ├── android-icon-36x36.png ├── android-icon-48x48.png ├── android-icon-72x72.png ├── android-icon-96x96.png ├── apple-icon-114x114.png ├── apple-icon-120x120.png ├── apple-icon-144x144.png ├── apple-icon-152x152.png ├── apple-icon-180x180.png ├── apple-icon-57x57.png ├── apple-icon-60x60.png ├── apple-icon-72x72.png ├── apple-icon-76x76.png ├── apple-touch-icon.png ├── android-icon-144x144.png ├── android-icon-192x192.png ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-icon-precomposed.png ├── site.webmanifest ├── browserconfig.xml ├── about.txt ├── manifest.json └── index.html ├── src ├── assets │ ├── logo │ │ ├── icon.png │ │ ├── IMG_5555.PNG │ │ ├── beerus.jpeg │ │ ├── kakashi.jpeg │ │ ├── sakuna.jpeg │ │ ├── sakunaRed.JPG │ │ ├── shelby.jpeg │ │ ├── moneyMouth.png │ │ ├── appl-1f680-160.png │ │ ├── appl-2705-160.png │ │ ├── appl-274c-160.png │ │ ├── unamusedEmoji.png │ │ ├── icon-tx.svg │ │ ├── icon.svg │ │ └── coinsSVG.svg │ ├── favicon │ │ ├── favicon.ico │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── apple-touch-icon.png │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ └── 5ec25798735c690a4d6c0e4d53399529.ico │ │ │ ├── favicon.ico │ │ │ ├── apple-icon.png │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon-96x96.png │ │ │ ├── ms-icon-70x70.png │ │ │ ├── apple-icon-57x57.png │ │ │ ├── apple-icon-60x60.png │ │ │ ├── apple-icon-72x72.png │ │ │ ├── apple-icon-76x76.png │ │ │ ├── ms-icon-144x144.png │ │ │ ├── ms-icon-150x150.png │ │ │ ├── ms-icon-310x310.png │ │ │ ├── android-icon-36x36.png │ │ │ ├── android-icon-48x48.png │ │ │ ├── android-icon-72x72.png │ │ │ ├── android-icon-96x96.png │ │ │ ├── apple-icon-114x114.png │ │ │ ├── apple-icon-120x120.png │ │ │ ├── apple-icon-144x144.png │ │ │ ├── apple-icon-152x152.png │ │ │ ├── apple-icon-180x180.png │ │ │ ├── android-icon-144x144.png │ │ │ ├── android-icon-192x192.png │ │ │ ├── apple-icon-precomposed.png │ │ │ ├── browserconfig.xml │ │ │ └── manifest.json │ ├── landingLogos │ │ ├── one.png │ │ ├── two.png │ │ ├── xrp.png │ │ ├── dash.png │ │ ├── fire.png │ │ ├── tether.png │ │ ├── three.png │ │ ├── tron.png │ │ ├── bitcoin.png │ │ ├── cardano.png │ │ ├── dogecoin.png │ │ ├── ethereum.png │ │ ├── litecoin.png │ │ ├── sparkle.png │ │ ├── uniswap.png │ │ ├── usd-coin.png │ │ ├── newspaper.png │ │ ├── binance-coin.png │ │ ├── bitcoin-cash.png │ │ ├── high-voltage.png │ │ ├── polkadot-new.png │ │ └── ethereum-classic.png │ └── debit-cards │ │ ├── complete-card.png │ │ ├── complete-card2.png │ │ ├── complete-card3.png │ │ ├── complete-card4.png │ │ ├── complete-card.svg │ │ ├── complete-card2.svg │ │ └── complete-card4.svg ├── App.css ├── utils │ ├── useTitle.js │ └── supportedCoins.js ├── index.js ├── App.js ├── index.css ├── pages │ ├── LandingPage │ │ ├── LandingPage.jsx │ │ ├── SectionFive │ │ │ └── SectionFive.jsx │ │ ├── SectionSix │ │ │ ├── SectionSix.jsx │ │ │ └── SectionSix.scss │ │ ├── SectionFour │ │ │ ├── SectionFour.scss │ │ │ └── SectionFour.jsx │ │ ├── SectionTwo │ │ │ ├── SectionTwo.jsx │ │ │ └── SectionTwo.scss │ │ ├── SectionThree │ │ │ ├── SectionThree.jsx │ │ │ └── SectionThree.scss │ │ ├── AboutUs │ │ │ ├── AboutUs.scss │ │ │ └── AboutUs.jsx │ │ └── SectionOne │ │ │ └── SectionOne.jsx │ ├── Portfolio │ │ ├── Wallet │ │ │ ├── CompleteWallet │ │ │ │ ├── CardDesign.scss │ │ │ │ └── CardDesign.jsx │ │ │ ├── Transactions │ │ │ │ ├── TransactionModal.jsx │ │ │ │ ├── TransactionModal.scss │ │ │ │ └── Transactions.scss │ │ │ └── Wallet.jsx │ │ ├── Account │ │ │ ├── LearningModal │ │ │ │ ├── Learn.scss │ │ │ │ └── Learn.jsx │ │ │ ├── source │ │ │ │ ├── source.scss │ │ │ │ └── source.jsx │ │ │ ├── StatusModal │ │ │ │ ├── Modal.scss │ │ │ │ └── Modal.jsx │ │ │ ├── NameModal │ │ │ │ ├── NameModal.scss │ │ │ │ └── NameModal.jsx │ │ │ └── PasswordModal │ │ │ │ ├── PasswordModal.scss │ │ │ │ └── PasswordModal.jsx │ │ └── Dashboard │ │ │ ├── Dashboard.jsx │ │ │ ├── Messages │ │ │ ├── Messages.jsx │ │ │ └── Messages.scss │ │ │ └── CompleteDashboard │ │ │ └── CompleteDashboard.jsx │ ├── Verification │ │ ├── Verify.jsx │ │ └── Verify.scss │ ├── ForgotPassword │ │ └── ForgotPassword.jsx │ ├── Login │ │ ├── Login.jsx │ │ └── Login.scss │ ├── ResetPassword │ │ └── Reset.jsx │ └── SignUp │ │ └── SignUp.jsx └── components │ ├── Auth │ └── AuthContext.js │ ├── TopNav │ ├── Nav.jsx │ └── Nav.scss │ ├── Coin │ ├── TradeTab │ │ ├── TradeTab.jsx │ │ └── TradeTab.scss │ └── Graph │ │ └── Graph.jsx │ ├── BottomNav │ ├── BottomNav.jsx │ └── BottomNav.scss │ └── TradeModal │ ├── SendxReceive │ ├── Receive.scss │ └── Receive.jsx │ └── BuyCoins │ └── BuyCoins.scss ├── .vscode └── settings.json ├── README.md ├── .gitignore └── package.json /public/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/favicon-96x96.png -------------------------------------------------------------------------------- /public/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/ms-icon-70x70.png -------------------------------------------------------------------------------- /src/assets/logo/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/icon.png -------------------------------------------------------------------------------- /public/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/ms-icon-144x144.png -------------------------------------------------------------------------------- /public/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/ms-icon-150x150.png -------------------------------------------------------------------------------- /public/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/ms-icon-310x310.png -------------------------------------------------------------------------------- /public/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/android-icon-36x36.png -------------------------------------------------------------------------------- /public/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/android-icon-48x48.png -------------------------------------------------------------------------------- /public/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/android-icon-72x72.png -------------------------------------------------------------------------------- /public/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/android-icon-96x96.png -------------------------------------------------------------------------------- /public/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-114x114.png -------------------------------------------------------------------------------- /public/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-120x120.png -------------------------------------------------------------------------------- /public/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-144x144.png -------------------------------------------------------------------------------- /public/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-152x152.png -------------------------------------------------------------------------------- /public/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-180x180.png -------------------------------------------------------------------------------- /public/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-57x57.png -------------------------------------------------------------------------------- /public/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-60x60.png -------------------------------------------------------------------------------- /public/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-72x72.png -------------------------------------------------------------------------------- /public/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-76x76.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-touch-icon.png -------------------------------------------------------------------------------- /src/assets/logo/IMG_5555.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/IMG_5555.PNG -------------------------------------------------------------------------------- /src/assets/logo/beerus.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/beerus.jpeg -------------------------------------------------------------------------------- /src/assets/logo/kakashi.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/kakashi.jpeg -------------------------------------------------------------------------------- /src/assets/logo/sakuna.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/sakuna.jpeg -------------------------------------------------------------------------------- /src/assets/logo/sakunaRed.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/sakunaRed.JPG -------------------------------------------------------------------------------- /src/assets/logo/shelby.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/shelby.jpeg -------------------------------------------------------------------------------- /public/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/android-icon-144x144.png -------------------------------------------------------------------------------- /public/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/android-icon-192x192.png -------------------------------------------------------------------------------- /src/assets/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/favicon.ico -------------------------------------------------------------------------------- /src/assets/landingLogos/one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/one.png -------------------------------------------------------------------------------- /src/assets/landingLogos/two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/two.png -------------------------------------------------------------------------------- /src/assets/landingLogos/xrp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/xrp.png -------------------------------------------------------------------------------- /src/assets/logo/moneyMouth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/moneyMouth.png -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/public/apple-icon-precomposed.png -------------------------------------------------------------------------------- /src/assets/landingLogos/dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/dash.png -------------------------------------------------------------------------------- /src/assets/landingLogos/fire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/fire.png -------------------------------------------------------------------------------- /src/assets/landingLogos/tether.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/tether.png -------------------------------------------------------------------------------- /src/assets/landingLogos/three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/three.png -------------------------------------------------------------------------------- /src/assets/landingLogos/tron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/tron.png -------------------------------------------------------------------------------- /src/assets/logo/appl-1f680-160.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/appl-1f680-160.png -------------------------------------------------------------------------------- /src/assets/logo/appl-2705-160.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/appl-2705-160.png -------------------------------------------------------------------------------- /src/assets/logo/appl-274c-160.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/appl-274c-160.png -------------------------------------------------------------------------------- /src/assets/logo/unamusedEmoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/logo/unamusedEmoji.png -------------------------------------------------------------------------------- /src/assets/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /src/assets/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /src/assets/landingLogos/bitcoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/bitcoin.png -------------------------------------------------------------------------------- /src/assets/landingLogos/cardano.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/cardano.png -------------------------------------------------------------------------------- /src/assets/landingLogos/dogecoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/dogecoin.png -------------------------------------------------------------------------------- /src/assets/landingLogos/ethereum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/ethereum.png -------------------------------------------------------------------------------- /src/assets/landingLogos/litecoin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/litecoin.png -------------------------------------------------------------------------------- /src/assets/landingLogos/sparkle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/sparkle.png -------------------------------------------------------------------------------- /src/assets/landingLogos/uniswap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/uniswap.png -------------------------------------------------------------------------------- /src/assets/landingLogos/usd-coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/usd-coin.png -------------------------------------------------------------------------------- /src/assets/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /src/assets/landingLogos/newspaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/newspaper.png -------------------------------------------------------------------------------- /src/assets/debit-cards/complete-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/debit-cards/complete-card.png -------------------------------------------------------------------------------- /src/assets/debit-cards/complete-card2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/debit-cards/complete-card2.png -------------------------------------------------------------------------------- /src/assets/debit-cards/complete-card3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/debit-cards/complete-card3.png -------------------------------------------------------------------------------- /src/assets/debit-cards/complete-card4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/debit-cards/complete-card4.png -------------------------------------------------------------------------------- /src/assets/landingLogos/binance-coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/binance-coin.png -------------------------------------------------------------------------------- /src/assets/landingLogos/bitcoin-cash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/bitcoin-cash.png -------------------------------------------------------------------------------- /src/assets/landingLogos/high-voltage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/high-voltage.png -------------------------------------------------------------------------------- /src/assets/landingLogos/polkadot-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/polkadot-new.png -------------------------------------------------------------------------------- /src/assets/landingLogos/ethereum-classic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/landingLogos/ethereum-classic.png -------------------------------------------------------------------------------- /src/assets/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/assets/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins&display=swap'); 2 | 3 | .App { 4 | font-family: 'Poppins', sans-serif; 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/favicon.ico -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/favicon-16x16.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/favicon-32x32.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/favicon-96x96.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/ms-icon-70x70.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-57x57.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-60x60.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-72x72.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-76x76.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/ms-icon-144x144.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/ms-icon-150x150.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/ms-icon-310x310.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-36x36.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-48x48.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-72x72.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-96x96.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-114x114.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-120x120.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-144x144.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-152x152.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-180x180.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-144x144.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/android-icon-192x192.png -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kayode0x/Apexwallet/HEAD/src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/apple-icon-precomposed.png -------------------------------------------------------------------------------- /src/utils/useTitle.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | 3 | const useTitle = (title) => { 4 | useEffect(() => { 5 | document.title = title; 6 | }, [title]); 7 | }; 8 | 9 | export default useTitle; 10 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.ignoreWords": [ 3 | "imageurl", 4 | "johndoe", 5 | "toastify", 6 | "webfonts", 7 | "xchange" 8 | ], 9 | "cSpell.words": [ 10 | "bolu", 11 | "plotly" 12 | ] 13 | } -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | 6 | 7 | ReactDOM.render( 8 | 9 | 10 | , 11 | document.getElementById('root') 12 | ); 13 | -------------------------------------------------------------------------------- /public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Apexwallet 🚀 2 | 3 | Get real time market information on your favorite crypto currencies, watch them to keep track and also trade virtually, risk free. 4 | Backend code is on https://github.com/kayode0x/Apexwallet-Backend. 5 | 6 | ✨ (c) 2021 Decover, Inc. All materials licensed under [Apache v2.0](https://www.apache.org/licenses/LICENSE-2.0.html). 7 | -------------------------------------------------------------------------------- /public/about.txt: -------------------------------------------------------------------------------- 1 | This favicon was generated using the following font: 2 | 3 | - Font Title: Krona One 4 | - Font Author: Copyright (c) 2011, Sorkin Type Co (www.sorkintype.com) with Reserved Font Name "Krona". 5 | - Font Source: http://fonts.gstatic.com/s/kronaone/v9/jAnEgHdjHcjgfIb1ZcUCMY-h3cWkWg.ttf 6 | - Font License: SIL Open Font License, 1.1 (http://scripts.sil.org/OFL) 7 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { AuthContextProvider } from './components/Auth/AuthContext'; 3 | import Routes from './Routes'; 4 | import './App.css'; 5 | axios.defaults.withCredentials = true; 6 | 7 | 8 | 9 | function App() { 10 | 11 | return ( 12 | 13 |
14 | 15 |
16 |
17 | ); 18 | } 19 | 20 | export default App; 21 | -------------------------------------------------------------------------------- /src/utils/supportedCoins.js: -------------------------------------------------------------------------------- 1 | const supportedCoins = [ 2 | 'bitcoin', 3 | 'ethereum', 4 | 'ethereum-classic', 5 | 'litecoin', 6 | 'dogecoin', 7 | 'ripple', 8 | 'tether', 9 | 'binancecoin', 10 | 'cardano', 11 | 'usd-coin', 12 | 'tron', 13 | 'bitcoin-cash', 14 | 'polkadot', 15 | 'uniswap', 16 | 'dash', 17 | 'decentraland', 18 | 'shiba-inu', 19 | 'stellar', 20 | 'chainlink', 21 | 'solana', 22 | ]; 23 | 24 | module.exports = supportedCoins; -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | background: #f1f2f4; 4 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 5 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 6 | sans-serif; 7 | -webkit-font-smoothing: antialiased; 8 | -moz-osx-font-smoothing: grayscale; 9 | } 10 | 11 | code { 12 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 13 | monospace; 14 | } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | .env 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | # Local Netlify folder 27 | .netlify -------------------------------------------------------------------------------- /src/pages/LandingPage/LandingPage.jsx: -------------------------------------------------------------------------------- 1 | import SectionOne from './SectionOne/SectionOne'; 2 | import SectionThree from './SectionThree/SectionThree'; 3 | import SectionTwo from './SectionTwo/SectionTwo'; 4 | import SectionFive from './SectionFive/SectionFive'; 5 | import SectionFour from './SectionFour/SectionFour'; 6 | import SectionSix from './SectionSix/SectionSix'; 7 | import useTitle from '../../utils/useTitle'; 8 | 9 | const LandingPage = () => { 10 | useTitle('Apexwallet'); 11 | return ( 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | ); 21 | }; 22 | 23 | export default LandingPage; 24 | -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionFive/SectionFive.jsx: -------------------------------------------------------------------------------- 1 | import "./SectionFive.scss"; 2 | import { Link } from "react-router-dom"; 3 | import HomeSVG from "../../../assets/mockups/Home.svg"; 4 | 5 | const SectionFive = () => { 6 | return ( 7 |
8 |
9 |
10 |

11 | Before splashing cash into cryptocurrencies, know the basics. Play 12 | safe, start simulating today! 13 |

14 |
15 | 16 | Get Started 17 | 18 |
19 |
20 | coin 21 |
22 |
23 | ); 24 | }; 25 | 26 | export default SectionFive; 27 | -------------------------------------------------------------------------------- /src/components/Auth/AuthContext.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect, createContext } from 'react'; 2 | import axios from 'axios'; 3 | 4 | const AuthContext = createContext(); 5 | 6 | function AuthContextProvider({ children }) { 7 | const [loggedIn, setLoggedIn] = useState(undefined); 8 | const apiURL = 'https://api.apexwallet.app/v1/auth/loggedin'; 9 | 10 | async function getLoggedIn() { 11 | const loggedInResponse = await axios.get(apiURL, { 12 | headers: { 13 | 'content-type': 'application/json', 14 | } 15 | }, { withCredentials: true }); 16 | setLoggedIn(loggedInResponse.data); 17 | } 18 | 19 | useEffect(() => { 20 | getLoggedIn(); 21 | }, []); 22 | 23 | return {children}; 24 | } 25 | 26 | export default AuthContext; 27 | export { AuthContextProvider }; 28 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "\/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /src/assets/favicon/5ec25798735c690a4d6c0e4d53399529.ico/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "\/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image\/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "\/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image\/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "\/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image\/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "\/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image\/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "\/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image\/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "\/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image\/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionSix/SectionSix.jsx: -------------------------------------------------------------------------------- 1 | import { FaGithub } from "react-icons/fa"; 2 | import { SiGmail } from "react-icons/si"; 3 | import "./SectionSix.scss"; 4 | 5 | const SectionSix = () => { 6 | //function to get current year 7 | const getYear = () => { 8 | const date = new Date(); 9 | return date.getFullYear(); 10 | }; 11 | return ( 12 |
13 |
14 |
15 |

16 | For feedbacks, support or general enquiries, please feel free to 17 | contact us at support@apexwallet.app. 18 |

19 |
20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 |
29 |
30 | 31 | 38 |
39 |
40 | ); 41 | }; 42 | 43 | export default SectionSix; 44 | -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionFour/SectionFour.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | 11 | .sectionFour { 12 | min-height: 55vh; 13 | width: 100%; 14 | display: flex; 15 | align-items: center; 16 | justify-content: center; 17 | background: rgba(#96d0ff, 0.2); 18 | 19 | .container { 20 | padding: 1rem; 21 | display: flex; 22 | align-items: center; 23 | max-width: 1200px; 24 | width: 100%; 25 | justify-content: space-around; 26 | flex-direction: column; 27 | 28 | .header { 29 | text-align: center; 30 | width: 100%; 31 | font-size: 2.25rem; 32 | margin-bottom: 3rem; 33 | font-weight: bold; 34 | color: $textColor; 35 | @media (max-width: 768px) { 36 | font-size: 1.75rem; 37 | } 38 | } 39 | 40 | .coinLogo { 41 | margin-bottom: 1rem; 42 | } 43 | 44 | .logos { 45 | display: flex; 46 | flex-wrap: wrap; 47 | width: min-width; 48 | width: 100%; 49 | align-items: center; 50 | justify-content: center; 51 | 52 | img { 53 | margin-right: 1rem; 54 | position: relative; 55 | height: 4rem; 56 | @media (max-width: 768px) { 57 | height: 2.5rem; 58 | } 59 | transition: all 0.5s ease; 60 | } 61 | } 62 | .moreCoins { 63 | text-align: center; 64 | } 65 | } 66 | } 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Wallet/CompleteWallet/CardDesign.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | .cardDesignModalContainer { 11 | position: absolute; 12 | top: 50%; 13 | left: 50%; 14 | transform: translate(-50%, -50%); 15 | width: 100%; 16 | max-width: 25rem; 17 | outline: none; 18 | border: none; 19 | overflow: auto; 20 | 21 | @media (max-width: 480px) { 22 | top: 50%; 23 | transform: translate(-50%, -50%); 24 | max-width: 20rem; 25 | } 26 | 27 | .loading { 28 | position: absolute; 29 | top: 40%; 30 | left: 50%; 31 | transform: translate(-50%, -50%); 32 | } 33 | 34 | .cardDesignModalSubContainer { 35 | background: rgba($mainColor, 1); 36 | flex-direction: column; 37 | // height: 40rem; 38 | height: fit-content; 39 | border-radius: 5px; 40 | padding: 1rem; 41 | display: flex; 42 | justify-content: center; 43 | align-items: center; 44 | position: relative; 45 | 46 | p { 47 | font-size: 1.15rem; 48 | } 49 | 50 | img { 51 | @media (max-width: 768px){ 52 | width: 14rem; 53 | } 54 | @media (max-width: 812px) and (orientation: landscape) { 55 | width: 5rem; 56 | } 57 | width: 23rem; 58 | height: auto; 59 | margin-bottom: .5rem; 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionTwo/SectionTwo.jsx: -------------------------------------------------------------------------------- 1 | import Lightening from '../../../assets/landingLogos/high-voltage.png'; 2 | import News from '../../../assets/landingLogos/newspaper.png'; 3 | import Fire from '../../../assets/landingLogos/fire.png'; 4 | import './SectionTwo.scss' 5 | 6 | const SectionTwo = () => { 7 | return ( 8 |
9 |
10 |

Learn the basics

11 |

Apexwallet helps you learn how things work, from the basics to when you should buy/sell.

12 |
13 |
14 |
15 |
16 | Lightening 17 |

Trading

18 |
19 | 20 | You get to simulate buying and selling with real time data. You can also send and receive. 21 | 22 |
23 |
24 |
25 | Fire 26 |

Multiple Coins

27 |
28 | Starting with 15 cryptocurrencies, more would be added based on popularity and demand. 29 |
30 |
31 |
32 | news 33 |

Live News

34 |
35 | 36 | Get to see the latest happenings to keep yourself informed, and also tips on how to trade, hold 37 | etc. 38 | 39 |
40 |
41 |
42 | ); 43 | }; 44 | 45 | export default SectionTwo; 46 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/LearningModal/Learn.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(158, 158, 158); 10 | 11 | .learnModalContainer { 12 | position: absolute; 13 | top: 50%; 14 | left: 50%; 15 | transform: translate(-45%, -50%); 16 | width: 100%; 17 | max-width: 20rem; 18 | outline: none; 19 | border: none; 20 | 21 | @media (max-width: 480px) { 22 | top: 50%; 23 | transform: translate(-50%, -50%); 24 | } 25 | 26 | .learnModalSubContainer { 27 | background: $mainColor; 28 | flex-direction: column; 29 | height: 13rem; 30 | border-radius: 10px; 31 | padding: 1rem; 32 | display: flex; 33 | justify-content: center; 34 | align-items: center; 35 | position: relative; 36 | 37 | .body { 38 | display: flex; 39 | flex-direction: column; 40 | align-items: center; 41 | margin-top: -0.75rem; 42 | 43 | .intro { 44 | text-align: center; 45 | opacity: 0.7; 46 | font-size: 1.15rem; 47 | line-height: 1.35; 48 | margin-bottom: 1.5rem; 49 | } 50 | 51 | a { 52 | color: $mainColor; 53 | font-size: 1.15rem; 54 | text-decoration: none; 55 | padding: 0.5rem; 56 | border-radius: 7px; 57 | background: $blue; 58 | border: 1px solid $blue; 59 | transition: all 0.2s ease-in; 60 | } 61 | 62 | a:hover { 63 | color: $blue; 64 | background: $mainColor; 65 | } 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Dashboard/Dashboard.jsx: -------------------------------------------------------------------------------- 1 | import './Dashboard.scss'; 2 | import { useState, useEffect } from 'react'; 3 | import { useHistory } from 'react-router-dom'; 4 | import { ToastContainer } from 'react-toastify'; 5 | import 'react-toastify/dist/ReactToastify.css'; 6 | import BottomNav from '../../../components/BottomNav/BottomNav'; 7 | import useTitle from '../../../utils/useTitle' 8 | import CompleteDashboard from './CompleteDashboard/CompleteDashboard'; 9 | 10 | const Dashboard = ({user, wallet, prices, news, loggedIn}) => { 11 | const history = useHistory(); 12 | const [watchList, setWatchList] = useState(null); 13 | useTitle('Home | Apexwallet'); 14 | 15 | useEffect(() => { 16 | if (loggedIn === false) { 17 | history.push('/login'); 18 | } 19 | }, [loggedIn, history]); 20 | 21 | //min the user's watch list with the coingecko API 22 | useEffect(() => { 23 | if (user !== null && prices !== null) { 24 | let arr = []; 25 | 26 | if (user.watchList !== undefined) { 27 | user.watchList.forEach((watchedCoin) => { 28 | const oldList = watchedCoin; 29 | prices.forEach((price) => { 30 | if (price.id === oldList.coinId) { 31 | let newCoinData = { 32 | name: price.name, 33 | symbol: price.symbol, 34 | id: price.id, 35 | price: price.current_price, 36 | percentChange: price.price_change_percentage_24h, 37 | image: price.image, 38 | }; 39 | arr.push(newCoinData); 40 | } 41 | }); 42 | }); 43 | } 44 | 45 | setWatchList(arr); 46 | } 47 | }, [prices, user]); 48 | 49 | return ( 50 | <> 51 |
52 | 53 |
54 |

Home

55 | {CompleteDashboard(user, wallet, watchList, news)} 56 |
57 | 58 |
59 | 60 | ); 61 | }; 62 | 63 | export default Dashboard; 64 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/LearningModal/Learn.jsx: -------------------------------------------------------------------------------- 1 | import './Learn.scss'; 2 | import { useState } from 'react'; 3 | import Backdrop from '@material-ui/core/Backdrop'; 4 | import Modal from '@material-ui/core/Modal'; 5 | import Fade from '@material-ui/core/Fade'; 6 | import { GiWhiteBook } from 'react-icons/gi'; 7 | import { FiChevronRight } from 'react-icons/fi'; 8 | import 'react-toastify/dist/ReactToastify.css'; 9 | 10 | export default function Learn() { 11 | const [openModal, setOpenModal] = useState(false); 12 | const handleOpenModal = () => setOpenModal(true); 13 | const handleCloseModal = () => setOpenModal(false); 14 | 15 | return ( 16 |
17 |
18 |
19 | 20 |
21 |

Learn

22 |
23 | 24 |
25 |
26 | 35 | 36 |
37 |
38 |
39 |

40 | Here are some crypto oriented lexicons to help you learn more 41 | about the crypto world. 42 |

43 | 48 | Take me there 49 | 50 |
51 |
52 |
53 |
54 |
55 |
56 | ); 57 | } 58 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "converter", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@emotion/react": "^11.4.0", 7 | "@emotion/styled": "^11.3.0", 8 | "@material-ui/core": "^5.0.0-alpha.33", 9 | "@testing-library/jest-dom": "^5.11.4", 10 | "@testing-library/react": "^11.1.0", 11 | "@testing-library/user-event": "^12.1.10", 12 | "axios": "^0.21.4", 13 | "bootstrap": "^4.6.0", 14 | "browserslist": "^4.16.7", 15 | "coingecko-api": "^1.0.10", 16 | "color-string": "^1.5.5", 17 | "dns-packet": "^1.3.4", 18 | "dotenv": "^8.2.0", 19 | "glob-parent": "^5.1.2", 20 | "hamburger-react": "^2.4.1", 21 | "hosted-git-info": "^2.8.9", 22 | "immer": "^9.0.6", 23 | "is-svg": "^4.3.1", 24 | "node-sass": "^6.0.1", 25 | "postcss": "^8.3.6", 26 | "qrcode.react": "^1.0.1", 27 | "react": "^17.0.2", 28 | "react-axios": "^2.0.5", 29 | "react-dom": "^17.0.2", 30 | "react-helmet-async": "^1.0.9", 31 | "react-icons": "^4.2.0", 32 | "react-moment": "^1.1.1", 33 | "react-qr-reader": "^2.2.1", 34 | "react-router-dom": "^5.2.0", 35 | "react-scripts": "^4.0.3", 36 | "react-scroll-motion": "^0.2.1", 37 | "react-spinners-kit": "^1.9.1", 38 | "react-toastify": "^7.0.4", 39 | "reactjs-media": "^1.5.1", 40 | "recharts": "^2.0.9", 41 | "set-value": "^4.0.1", 42 | "ssri": "^6.0.2", 43 | "tar": "^6.1.6", 44 | "trim-newlines": "^3.0.1", 45 | "web-vitals": "^1.0.1", 46 | "ws": "^7.5.3" 47 | }, 48 | "scripts": { 49 | "start": "react-scripts start", 50 | "build": "react-scripts build", 51 | "test": "react-scripts test", 52 | "eject": "react-scripts eject" 53 | }, 54 | "eslintConfig": { 55 | "extends": [ 56 | "react-app", 57 | "react-app/jest" 58 | ] 59 | }, 60 | "browserslist": { 61 | "production": [ 62 | ">0.2%", 63 | "not dead", 64 | "not op_mini all" 65 | ], 66 | "development": [ 67 | "last 1 chrome version", 68 | "last 1 firefox version", 69 | "last 1 safari version" 70 | ] 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/source/source.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(158, 158, 158); 10 | 11 | .sourceModalContainer { 12 | position: absolute; 13 | top: 50%; 14 | left: 50%; 15 | transform: translate(-45%, -50%); 16 | width: 100%; 17 | max-width: 20rem; 18 | outline: none; 19 | border: none; 20 | 21 | @media (max-width: 480px) { 22 | top: 50%; 23 | transform: translate(-50%, -50%); 24 | } 25 | 26 | .sourceModalSubContainer { 27 | background: $mainColor; 28 | flex-direction: column; 29 | height: 13rem; 30 | border-radius: 10px; 31 | padding: 1rem; 32 | display: flex; 33 | justify-content: center; 34 | align-items: center; 35 | position: relative; 36 | 37 | .body { 38 | display: flex; 39 | flex-direction: column; 40 | align-items: center; 41 | margin-top: -0.75rem; 42 | 43 | .intro { 44 | text-align: center; 45 | opacity: 0.7; 46 | font-size: 1.15rem; 47 | line-height: 1.35; 48 | margin-bottom: 1.5rem; 49 | } 50 | 51 | button { 52 | color: $mainColor; 53 | font-size: 1.15rem; 54 | text-decoration: none; 55 | padding: 0.5rem; 56 | width: 40%; 57 | display: flex; 58 | align-items: center; 59 | justify-content: center; 60 | border-radius: 7px; 61 | background: $blue; 62 | border: 1px solid $blue; 63 | transition: all 0.2s ease-in; 64 | } 65 | 66 | button:hover { 67 | color: $blue; 68 | background: $mainColor; 69 | } 70 | 71 | a { 72 | color: $mainColor; 73 | font-size: 1.15rem; 74 | text-decoration: none; 75 | padding: 0.5rem; 76 | width: 40%; 77 | display: flex; 78 | align-items: center; 79 | justify-content: center; 80 | border-radius: 7px; 81 | background: $blue; 82 | border: 1px solid $blue; 83 | transition: all 0.2s ease-in; 84 | } 85 | 86 | a:hover { 87 | color: $blue; 88 | background: $mainColor; 89 | } 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/assets/logo/icon-tx.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/logo/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionThree/SectionThree.jsx: -------------------------------------------------------------------------------- 1 | import WalletSVG from '../../../assets/mockups/Wallet.svg'; 2 | import One from '../../../assets/landingLogos/one.png'; 3 | import Two from '../../../assets/landingLogos/two.png'; 4 | import Three from '../../../assets/landingLogos/three.png'; 5 | import './SectionThree.scss'; 6 | 7 | const SectionThree = () => { 8 | return ( 9 |
10 |
11 |
12 | PricesIMG 13 |
14 |
15 |

Get Started in 3 steps

16 |
    17 |
  • 18 |
    19 | index finger 20 |
    21 |
    22 |

    Create An Account

    23 | 24 | Sign up with your email address, you 25 | will receive a verification link, click on it to verify your 26 | account. 27 | 28 |
    29 |
  • 30 |
  • 31 |
    32 | peace finger 33 |
    34 |
    35 |

    Create A Wallet

    36 | 37 | Once you log back in, got to the wallet tab and hit "create 38 | wallet". 39 | 40 |
    41 |
  • 42 |
  • 43 |
    44 | idek finger 45 |
    46 |
    47 |

    Voila!

    48 | 49 | At this point, you have full access to everything on apex. 50 | Don't hesitate to inform us if you run into any issue. 51 | 52 |
    53 |
  • 54 |
55 |
56 |
57 |
58 | ); 59 | }; 60 | 61 | export default SectionThree; 62 | -------------------------------------------------------------------------------- /src/pages/Verification/Verify.jsx: -------------------------------------------------------------------------------- 1 | import './Verify.scss'; 2 | // import astronaut from '../../assets/logo/astronaut-ingravity.svg'; 3 | import { useState, useEffect } from 'react'; 4 | import { RotateSpinner } from 'react-spinners-kit'; 5 | import { useHistory } from 'react-router-dom'; 6 | import axios from 'axios'; 7 | import useTitle from '../../utils/useTitle'; 8 | import 'react-toastify/dist/ReactToastify.css'; 9 | import { ToastContainer, toast } from 'react-toastify'; 10 | 11 | const Verify = () => { 12 | const history = useHistory(); 13 | const [verifying, setVerifying] = useState(false); 14 | useTitle('Verify | Apexwallet'); 15 | 16 | useEffect(() => { 17 | async function verifyUser() { 18 | setVerifying(true); 19 | const queryString = window.location.search; 20 | const urlParams = new URLSearchParams(queryString); 21 | const token = urlParams.get('token'); 22 | if (token === null) { 23 | history.push('/login'); 24 | } 25 | const user = { token }; 26 | const apiURL = 'https://api.apexwallet.app/v1'; 27 | 28 | try { 29 | await axios 30 | .post(`${apiURL}/auth/verify`, user, { withCredentials: true }) 31 | .then(async (res) => { 32 | if (res.status === 200) { 33 | await toast.success(`${res.data}`, {}); 34 | 35 | setTimeout(() => { 36 | history.push('/dashboard'); 37 | }, 3000); 38 | 39 | setVerifying(false); 40 | } 41 | }) 42 | .catch(async (err) => { 43 | //if error, display the custom error message from the server with toastify. 44 | await toast.error(`${err.response.data}`, {}); 45 | setTimeout(() => { 46 | history.push('/login'); 47 | }, 3000); 48 | }); 49 | } catch (error) { 50 | console.log(error); 51 | } 52 | 53 | setVerifying(false); 54 | } 55 | 56 | verifyUser(); 57 | }, [history]); 58 | 59 | return ( 60 | <> 61 |
62 |
63 | {/*
64 | astronaut 65 |
66 |
*/} 67 |
{verifying && }
68 |
69 |
70 | 71 | 72 | 73 | ); 74 | }; 75 | 76 | export default Verify; 77 | -------------------------------------------------------------------------------- /src/components/TopNav/Nav.jsx: -------------------------------------------------------------------------------- 1 | import { Cross as Hamburger } from 'hamburger-react'; 2 | import { Link, useLocation } from 'react-router-dom'; 3 | import { useState } from 'react'; 4 | import './Nav.scss'; 5 | 6 | const Nav = () => { 7 | const location = useLocation(); 8 | const { pathname } = location; 9 | const splitLocation = pathname.split('/')[1]; 10 | 11 | const [navOpen, setNavOpen] = useState(false); 12 | const [activeNav, setActiveNav] = useState(splitLocation); 13 | 14 | //prevent scrolling when the navbar is open 15 | switch (navOpen) { 16 | case true: 17 | var bodyOpen = document.getElementsByTagName('BODY')[0]; 18 | bodyOpen.style.overflow = 'hidden'; 19 | break; 20 | case false: 21 | var bodyClose = document.getElementsByTagName('BODY')[0]; 22 | bodyClose.style.overflow = 'auto'; 23 | break; 24 | default: 25 | // 26 | } 27 | return ( 28 | <> 29 | 57 | {navOpen && ( 58 |
59 | 64 | Learn 65 | 66 | About Us 67 | Sign In 68 | 69 | Get Started 70 | 71 |
72 | )} 73 | 74 | ); 75 | }; 76 | 77 | export default Nav; 78 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/StatusModal/Modal.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | .statusModalContainer { 11 | position: absolute; 12 | top: 50%; 13 | left: 50%; 14 | transform: translate(-45%, -50%); 15 | width: 100%; 16 | max-width: 20rem; 17 | outline: none; 18 | border: none; 19 | 20 | @media (max-width: 480px) { 21 | top: 50%; 22 | transform: translate(-50%, -50%); 23 | } 24 | 25 | .statusModalSubContainer { 26 | background-color: #4158d0; 27 | background-image: linear-gradient(43deg, #4158d0 0%, #c850c0 46%, #ffcc70 100%); 28 | flex-direction: column; 29 | height: 28rem; 30 | border-radius: 10px; 31 | padding: 1rem; 32 | display: flex; 33 | justify-content: center; 34 | align-items: center; 35 | 36 | .iconContainer { 37 | font-size: 5rem; 38 | color: #fff; 39 | margin-bottom: 1rem; 40 | margin-top: 1rem; 41 | } 42 | .privilegesContainer { 43 | display: flex; 44 | flex-direction: column; 45 | 46 | div { 47 | display: flex; 48 | align-items: center; 49 | flex-direction: row; 50 | margin-top: -1rem; 51 | } 52 | 53 | img { 54 | height: 1.25rem; 55 | margin-right: .75rem; 56 | } 57 | p { 58 | color: $mainColor; 59 | font-weight: bold; 60 | } 61 | 62 | div:nth-child(6){ 63 | margin-bottom: 1.5rem; 64 | } 65 | } 66 | .privilegesNote { 67 | display: flex; 68 | background: rgba($color: #000000, $alpha: .4); 69 | text-align: center; 70 | align-items: center; 71 | justify-content: center; 72 | transition: all .5s ease; 73 | img { 74 | margin-bottom: -.21rem; 75 | margin-right: 0; 76 | margin-left: .25rem; 77 | } 78 | padding: 0 1rem; 79 | border-radius: 10px; 80 | margin-bottom: 1rem; 81 | } 82 | .privilegesNote:hover { 83 | cursor: pointer; 84 | background: rgba($color: #000000, $alpha: .7); 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionSix/SectionSix.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | .footer { 11 | min-height: 30vh; 12 | display: flex; 13 | align-items: center; 14 | justify-content: center; 15 | background: #000; 16 | @media (min-width: 468px) { 17 | width: 100vw; 18 | } 19 | 20 | .container { 21 | display: flex; 22 | align-items: center; 23 | flex-direction: column; 24 | max-width: 900px; 25 | width: 100%; 26 | 27 | .subContainer { 28 | width: 100%; 29 | display: flex; 30 | @media (max-width: 768px){ 31 | flex-direction: column; 32 | } 33 | align-items: center; 34 | justify-content: space-between; 35 | 36 | .support { 37 | padding: 1rem; 38 | max-width: 30rem; 39 | font-size: 1.5rem; 40 | @media (max-width: 768px) { 41 | font-size: 1.25rem; 42 | text-align: center; 43 | } 44 | color: $mainColor; 45 | span { 46 | font-weight: bold; 47 | color: $mainColor; 48 | } 49 | } 50 | 51 | .contact { 52 | font-size: 1rem; 53 | color: $mainColor; 54 | display: flex; 55 | flex-direction: column; 56 | padding: 1rem; 57 | @media (max-width: 768px) { 58 | align-items: center; 59 | } 60 | 61 | .icons { 62 | font-size: 2rem; 63 | display: flex; 64 | align-items: center; 65 | justify-content: flex-start; 66 | } 67 | 68 | .github, 69 | .gmail { 70 | text-decoration: none; 71 | color: $mainColor; 72 | transition: all 0.3s ease; 73 | } 74 | 75 | .github:hover, .gmail:hover { 76 | cursor: pointer; 77 | color: $lightBlue; 78 | } 79 | 80 | .gmail { 81 | margin-left: 1rem; 82 | } 83 | } 84 | } 85 | } 86 | 87 | footer { 88 | padding: 1rem; 89 | margin-top: 1rem; 90 | margin-bottom: 1rem; 91 | color: $mainColor; 92 | 93 | a { 94 | text-decoration: none; 95 | color: $mainColor; 96 | font-weight: bold; 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Wallet/Transactions/TransactionModal.jsx: -------------------------------------------------------------------------------- 1 | import './TransactionModal.scss'; 2 | import moment from 'moment'; 3 | import { IoIosCheckmark } from 'react-icons/io'; 4 | 5 | const TransactionModal = ({ singleTransaction, transactionModal }) => { 6 | const transactionsFunc = (coin, type, amount, symbol) => { 7 | if (singleTransaction !== null) { 8 | if (coin !== 'Dollars' && coin !== 'USD' && type === 'Sent') { 9 | return ( 10 | 11 | -{amount} {symbol && symbol} 12 | 13 | ); 14 | } else if (coin !== 'Dollars' && coin !== 'USD' && type === 'Received') { 15 | return ( 16 | 17 | {amount} {symbol && symbol} 18 | 19 | ); 20 | } else if (coin !== 'Dollars' && coin !== 'USD' && type === 'Converted') { 21 | return ( 22 | 23 | -{amount} {symbol && symbol} 24 | 25 | ); 26 | } else { 27 | return ( 28 | 29 | {type === 'Free' || type === 'Sold' || type === 'Received' ? '' : '-'}$ 30 | {parseFloat(amount).toFixed(2)} 31 | 32 | ); 33 | } 34 | } 35 | }; 36 | const singleTransactionFunc = () => { 37 | if (singleTransaction !== null) { 38 | return ( 39 | <> 40 |
41 |

42 | {transactionsFunc( 43 | singleTransaction.coin, 44 | singleTransaction.type, 45 | singleTransaction.amount, 46 | singleTransaction.symbol 47 | )} 48 |

49 |

{singleTransaction.memo && singleTransaction.memo}

50 |
51 | 52 |
53 |
54 |

Info

55 |

{singleTransaction.name}

56 |
57 | 58 |
59 |

Date

60 |

{moment(singleTransaction.date).format('LLL')}

61 |
62 | 63 |
64 |

Status

65 |
66 |
67 | 68 |
69 |

Completed

70 |
71 |
72 | 73 | ); 74 | } 75 | }; 76 | return
{singleTransactionFunc()}
; 77 | }; 78 | 79 | export default TransactionModal; 80 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Wallet/Wallet.jsx: -------------------------------------------------------------------------------- 1 | import './Wallet.scss'; 2 | import { useEffect, useState } from 'react'; 3 | import { ToastContainer } from 'react-toastify'; 4 | import 'react-toastify/dist/ReactToastify.css'; 5 | import { useHistory } from 'react-router-dom'; 6 | import useMediaQuery from '@material-ui/core/useMediaQuery'; 7 | import BottomNav from '../../../components/BottomNav/BottomNav'; 8 | import CompleteWallet from './CompleteWallet/CompleteWallet'; 9 | import useTitle from '../../../utils/useTitle'; 10 | 11 | const Wallet = ({ user, wallet, prices, loggedIn }) => { 12 | const history = useHistory(); 13 | const [asset, setAsset] = useState(null); 14 | //breakpoint set at mobile only 15 | const matches = useMediaQuery('(max-width:767px)'); 16 | useTitle('Wallet | Apexwallet'); 17 | 18 | useEffect(() => { 19 | if (loggedIn === false) { 20 | history.push('/login'); 21 | } 22 | }, [loggedIn, history]); 23 | 24 | useEffect(() => { 25 | if (prices !== null && wallet !== null && user !== null) { 26 | let arr = []; 27 | 28 | if (wallet.coins !== undefined) { 29 | wallet.coins.forEach((coin) => { 30 | const newCoin = coin; 31 | //produce external data for the user's assets 32 | prices.forEach((price) => { 33 | if (price.id === newCoin.coin) { 34 | let newCoinData = { 35 | name: price.name, 36 | symbol: price.symbol, 37 | id: price.id, 38 | usdValue: price.current_price * newCoin.balance, 39 | price: price.current_price, 40 | image: price.image, 41 | balance: newCoin.balance, 42 | }; 43 | arr.push(newCoinData); 44 | } 45 | }); 46 | }); 47 | } 48 | 49 | function compare(a, b) { 50 | if (a.usdValue < b.usdValue) { 51 | return 1; 52 | } 53 | if (a.usdValue > b.usdValue) { 54 | return -1; 55 | } 56 | return 0; 57 | } 58 | 59 | arr.sort(compare); 60 | setAsset(arr); 61 | } 62 | }, [prices, wallet, user]); 63 | 64 | return ( 65 | <> 66 |
67 | 68 |
69 |

Wallet

70 | 71 | {/* Moved the complete user to a separate function */} 72 | 78 |
79 | 80 |
81 | 82 | ); 83 | }; 84 | 85 | export default Wallet; 86 | -------------------------------------------------------------------------------- /src/pages/LandingPage/AboutUs/AboutUs.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | .aboutUs { 11 | width: 100%; 12 | display: flex; 13 | flex-direction: column; 14 | align-items: center; 15 | justify-content: center; 16 | 17 | .container { 18 | margin-top: 3rem; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: space-between; 23 | 24 | .header { 25 | display: flex; 26 | padding: 1rem; 27 | margin-top: 5rem; 28 | align-items: center; 29 | flex-direction: column; 30 | @media (min-width: 768px) { 31 | max-width: 1200px; 32 | } 33 | text-align: center; 34 | p:nth-child(1) { 35 | font-size: 1.75rem; 36 | font-weight: bold; 37 | margin-bottom: 0.5rem; 38 | } 39 | 40 | p:nth-child(2) { 41 | font-size: 1.15rem; 42 | color: $subColor; 43 | max-width: 50rem; 44 | margin-bottom: 5rem; 45 | @media (max-width: 768px) { 46 | margin-bottom: 1rem; 47 | } 48 | } 49 | } 50 | 51 | .body { 52 | width: 90%; 53 | max-width: 1200px; 54 | display: flex; 55 | flex-direction: column; 56 | align-items: center; 57 | 58 | .header { 59 | font-size: 1.75rem; 60 | font-weight: bold; 61 | @media (max-width: 768px) { 62 | margin-bottom: 0.5rem; 63 | } 64 | } 65 | 66 | .theTeam { 67 | display: flex; 68 | width: 100%; 69 | align-items: center; 70 | justify-content: space-around; 71 | flex-wrap: wrap; 72 | 73 | a { 74 | display: flex; 75 | flex-direction: column; 76 | align-items: center; 77 | margin: 2rem; 78 | text-decoration: none; 79 | color: $textColor; 80 | 81 | img { 82 | height: 8rem; 83 | width: 8rem; 84 | border-radius: 100%; 85 | margin-bottom: -0.5rem; 86 | } 87 | 88 | p:nth-child(2) { 89 | font-size: 1.25rem; 90 | font-weight: bold; 91 | text-decoration: underline; 92 | } 93 | 94 | p:nth-child(3) { 95 | font-size: 1.05rem; 96 | margin-top: -1.25rem; 97 | opacity: 0.6; 98 | } 99 | } 100 | } 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /src/pages/LandingPage/AboutUs/AboutUs.jsx: -------------------------------------------------------------------------------- 1 | import "./AboutUs.scss"; 2 | import sakuna from "../../../assets/logo/sakunaRed.JPG"; 3 | import shelby from "../../../assets/logo/shelby.jpeg"; 4 | import kakashi from "../../../assets/logo/kakashi.jpeg"; 5 | import beerus from "../../../assets/logo/beerus.jpeg"; 6 | import useTitle from "../../../utils/useTitle"; 7 | import Nav from "../../../components/TopNav/Nav"; 8 | import SectionFive from "../SectionFive/SectionFive"; 9 | import SectionSix from "../SectionSix/SectionSix"; 10 | 11 | const AboutUs = () => { 12 | 13 | useTitle("About Us | Apexwallet"); 14 | 15 | return ( 16 |
17 |
79 | ); 80 | }; 81 | 82 | export default AboutUs; 83 | -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionTwo/SectionTwo.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | .sectionTwo { 11 | width: 100%; 12 | display: flex; 13 | flex-direction: column; 14 | align-items: center; 15 | justify-content: center; 16 | background: rgba(#96d0ff, 0.2); 17 | 18 | .featuresHeader { 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | 24 | p:nth-child(1) { 25 | font-size: 2.25rem; 26 | @media (max-width: 768px) { 27 | font-size: 1.75rem; 28 | } 29 | font-weight: bold; 30 | color: $textColor; 31 | } 32 | 33 | p:nth-child(2) { 34 | color: $subColor; 35 | font-size: 1rem; 36 | margin-top: -1.5rem; 37 | @media (max-width: 768px){ 38 | margin-top: -1rem; 39 | } 40 | max-width: 30rem; 41 | text-align: center; 42 | } 43 | } 44 | 45 | .container { 46 | display: flex; 47 | align-items: center; 48 | max-width: 1200px; 49 | padding: 1rem; 50 | justify-content: space-around; 51 | @media (max-width: 1024px) { 52 | // flex-direction: column; 53 | flex-wrap: wrap; 54 | align-items: flex-end; 55 | } 56 | 57 | .feature { 58 | max-width: 20rem; 59 | padding: 1rem; 60 | border: 1px solid $mainColor; 61 | background: $mainColor; 62 | border-radius: 7px; 63 | display: flex; 64 | flex-direction: column; 65 | justify-content: center; 66 | transition: all 0.5s ease; 67 | margin-bottom: 5rem; 68 | transform: all 0.5s ease; 69 | 70 | .heading { 71 | display: flex; 72 | align-items: center; 73 | flex-direction: row; 74 | margin-top: -1rem; 75 | 76 | p { 77 | color: $textColor; 78 | font-size: 1.35rem; 79 | font-weight: bold; 80 | } 81 | 82 | img { 83 | height: 2rem; 84 | width: 2rem; 85 | margin-right: 0.5rem; 86 | } 87 | } 88 | 89 | span { 90 | font-size: 1.15rem; 91 | color: $subColor; 92 | margin-bottom: 0.5rem; 93 | } 94 | } 95 | 96 | .feature:hover { 97 | background: $mainColor; 98 | box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px; 99 | .heading { 100 | display: flex; 101 | align-items: center; 102 | flex-direction: row; 103 | margin-top: -1rem; 104 | 105 | p { 106 | color: $textColor; 107 | font-size: 1.35rem; 108 | font-weight: bold; 109 | } 110 | 111 | img { 112 | height: 2rem; 113 | width: 2rem; 114 | } 115 | } 116 | 117 | span { 118 | font-size: 1.15rem; 119 | color: $subColor; 120 | } 121 | } 122 | 123 | .feature.one, 124 | .feature.two { 125 | margin-right: 1rem; 126 | @media (max-width: 1024px) { 127 | margin-right: 0rem; 128 | margin-bottom: 2rem; 129 | } 130 | } 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /src/pages/Verification/Verify.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | .verify { 11 | display: flex; 12 | align-items: center; 13 | justify-content: center; 14 | margin-bottom: 3rem; 15 | @media (max-width: 768px) and (orientation: landscape) { 16 | margin-bottom: 5rem; 17 | } 18 | 19 | @media (min-width: 768px) { 20 | height: 95vh; 21 | display: flex; 22 | align-items: center; 23 | justify-content: center; 24 | } 25 | 26 | .container { 27 | display: flex; 28 | flex-direction: column; 29 | align-items: center; 30 | max-width: 30rem; 31 | width: 100%; 32 | margin-top: 8rem; 33 | @media (min-width: 768px) { 34 | margin-top: -10rem; 35 | } 36 | 37 | .assets { 38 | position: absolute; 39 | z-index: -2; 40 | top: -10%; 41 | left: -10%; 42 | @media (max-width: 481px) { 43 | top: 0%; 44 | left: 0%; 45 | } 46 | @media (min-width: 768px) and (max-width: 1024px) { 47 | top: 0%; 48 | left: 0%; 49 | } 50 | 51 | img { 52 | position: absolute; 53 | height: 4rem; 54 | top: 50%; 55 | left: 100%; 56 | transform: rotate(-20deg) scaleX(-1); 57 | color: $textColor; 58 | animation: astronautAnim 5s ease-in-out infinite forwards; 59 | @media (max-width: 481px) { 60 | height: 3rem; 61 | } 62 | @media (max-width: 768px) and (orientation: landscape) { 63 | top: 30%; 64 | } 65 | 66 | @keyframes astronautAnim { 67 | 0% { 68 | transform: translateY(0%) rotate(-20deg) scaleX(-1); 69 | } 70 | 71 | 25% { 72 | transform: translateY(10%) rotate(-20deg) scaleX(-1); 73 | } 74 | 75 | 50% { 76 | transform: translateY(-10%) rotate(-20deg) scaleX(-1); 77 | } 78 | 79 | 75% { 80 | transform: translateY(10%) rotate(-20deg) scaleX(-1); 81 | } 82 | 83 | 100% { 84 | transform: translateY(0%) rotate(-20deg) scaleX(-1); 85 | } 86 | } 87 | } 88 | 89 | .circle { 90 | height: 30rem; 91 | width: 30rem; 92 | opacity: 1; 93 | border-radius: 100%; 94 | background: linear-gradient(to left, $blue, #b8c4f4); 95 | animation: circleAnim 5s ease-in-out infinite forwards; 96 | @keyframes circleAnim { 97 | from { 98 | transform: rotate(0deg); 99 | } 100 | to { 101 | transform: rotate(360deg); 102 | } 103 | } 104 | @media (max-width: 768px) { 105 | height: 20rem; 106 | width: 20rem; 107 | } 108 | @media (max-width: 481px) { 109 | height: 16rem; 110 | width: 16rem; 111 | } 112 | } 113 | } 114 | 115 | .verifying { 116 | position: absolute; 117 | top: 45%; 118 | left: 50%; 119 | transform: translate(-50%, -50%); 120 | } 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/pages/ForgotPassword/ForgotPassword.jsx: -------------------------------------------------------------------------------- 1 | import './ForgotPassword.scss'; 2 | // import astronaut from '../../assets/logo/astronaut-ingravity.svg'; 3 | import { useState } from 'react'; 4 | import { RotateSpinner } from 'react-spinners-kit'; 5 | import { Link } from 'react-router-dom'; 6 | import { IoChevronBack } from 'react-icons/io5'; 7 | import axios from 'axios'; 8 | import { ToastContainer, toast } from 'react-toastify'; 9 | import 'react-toastify/dist/ReactToastify.css'; 10 | import useTitle from '../../utils/useTitle' 11 | 12 | const ForgotPassword = () => { 13 | const [email, setEmail] = useState(''); 14 | const [resetting, setResetting] = useState(false); 15 | const [emailSent, setEmailSent] = useState(false); 16 | const apiURL = 'https://api.apexwallet.app/v1'; 17 | useTitle('Forgot Password | Apexwallet'); 18 | 19 | const handleLogin = async (e) => { 20 | e.preventDefault(); 21 | setResetting(true); 22 | const user = { email }; 23 | 24 | try { 25 | await axios 26 | .post(`${apiURL}/auth/forgot-password`, user, { withCredentials: true }) 27 | .then(async (res) => { 28 | if (res.status === 200) { 29 | setEmailSent(true); 30 | await toast.success(`${res.data}`, {}); 31 | } 32 | }) 33 | .catch(async (err) => { 34 | //if error, display the custom error message from the server with toastify. 35 | await toast.error(`${err.response.data}`, {}); 36 | }); 37 | } catch (error) { 38 | await toast.error(`${error}`, {}); 39 | } 40 | setResetting(false); 41 | }; 42 | 43 | return ( 44 | <> 45 |
46 |
47 |
48 |

{emailSent ? 'Email Sent!' : 'Reset Password'}

49 | {emailSent ? '' : 'Please provide your email address'} 50 |
51 | 52 | {/*
53 | astronaut 54 |
55 |
*/} 56 | 57 | {emailSent ? ( 58 |
Please check your email for further instructions.
59 | ) : ( 60 |
61 |
62 | 63 | setEmail(e.target.value)} 71 | /> 72 |
73 | 74 | 77 |
78 | )} 79 | 80 | 81 | Back to Login 82 | 83 |
84 |
85 | 86 | 87 | 88 | ); 89 | }; 90 | 91 | export default ForgotPassword; 92 | -------------------------------------------------------------------------------- /src/components/Coin/TradeTab/TradeTab.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect, useRef } from 'react'; 2 | import 'react-toastify/dist/ReactToastify.css'; 3 | import './TradeTab.scss'; 4 | import BuyCoins from './BuyTab/Buy'; 5 | import SellCoins from './SellTab/Sell'; 6 | 7 | const TradeTab = ({ coinInfo, user, wallet }) => { 8 | const [balance, setBalance] = useState(null); 9 | const [coin, setCoin] = useState(coinInfo.id); 10 | const [newCoinInfo, setNewCoinInfo] = useState(coinInfo); 11 | const [activeNav, setActiveNav] = useState('buy'); 12 | let isRendered = useRef(false); 13 | 14 | const coingeckoDataApi = `https://api.coingecko.com/api/v3/coins/${coin}?localization=false&tickers=false&market_data=true&community_data=false&developer_data=true&sparkline=true`; 15 | 16 | useEffect(() => { 17 | isRendered.current = true; 18 | async function load() { 19 | try { 20 | await fetch(coingeckoDataApi, { 21 | method: 'GET', 22 | headers: { 23 | 'content-type': 'application/json', 24 | }, 25 | }) 26 | .then((response) => response.json()) 27 | .then((data) => { 28 | if (isRendered.current === true) { 29 | setNewCoinInfo(data); 30 | } else { 31 | return null; 32 | } 33 | }); 34 | } catch (error) { 35 | console.log('ERROR: ' + error); 36 | } 37 | } 38 | 39 | load(); 40 | 41 | return () => { 42 | isRendered.current = false; 43 | }; 44 | }, [coingeckoDataApi, coin]); 45 | 46 | //get the balance 47 | useEffect(() => { 48 | async function callPrice() { 49 | let newCoinBalance; 50 | newCoinBalance = wallet.coins.filter((coin) => coin.coin === newCoinInfo.id); 51 | if (newCoinBalance[0] === undefined) { 52 | setBalance(0); 53 | } else { 54 | setBalance(newCoinBalance[0].balance); 55 | } 56 | } 57 | if (user !== null && user.isActive === true && wallet !== null && newCoinInfo !== null) { 58 | callPrice(); //only call this function if the user is active and has a wallet 59 | } 60 | }, [newCoinInfo, user, wallet]); 61 | 62 | return ( 63 |
64 |
65 |
setActiveNav('buy')} className={activeNav === 'buy' ? 'active' : ''}> 66 | Buy 67 |
68 |
setActiveNav('sell')} className={activeNav === 'sell' ? 'active' : ''}> 69 | Sell 70 |
71 |
72 | {user.isActive !== false ? ( 73 |
74 | {activeNav === 'buy' && ( 75 | 76 | )} 77 | {activeNav === 'sell' && ( 78 | 86 | )} 87 |
88 | ) : ( 89 |

Please create a wallet to trade {coinInfo.name}

90 | )} 91 |
92 | ); 93 | }; 94 | 95 | export default TradeTab; 96 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/NameModal/NameModal.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(158, 158, 158); 10 | 11 | .nameModalContainer { 12 | position: absolute; 13 | top: 50%; 14 | left: 50%; 15 | transform: translate(-45%, -50%); 16 | width: 100%; 17 | max-width: 20rem; 18 | outline: none; 19 | border: none; 20 | 21 | @media (max-width: 480px) { 22 | top: 50%; 23 | transform: translate(-50%, -50%); 24 | } 25 | 26 | .nameModalSubContainer { 27 | background: rgba($mainColor, 1); 28 | flex-direction: column; 29 | height: 15rem; 30 | border-radius: 10px; 31 | padding: 1rem; 32 | display: flex; 33 | justify-content: center; 34 | align-items: center; 35 | position: relative; 36 | 37 | p { 38 | font-size: 1.15rem; 39 | // font-weight: bold; 40 | color: $textColor; 41 | } 42 | 43 | .closeNameModal { 44 | position: absolute; 45 | top: 1%; 46 | right: 3%; 47 | border-radius: 5px; 48 | color: $textColor; 49 | border: none; 50 | outline: none; 51 | background: none; 52 | padding: 0.5rem 0; 53 | width: 2rem; 54 | font-weight: 900; 55 | font-size: 2rem; 56 | transition: all 0.2s ease-in-out; 57 | } 58 | .closeNameModal:hover { 59 | cursor: pointer; 60 | transform: scale(1.2); 61 | } 62 | 63 | form { 64 | display: flex; 65 | flex-direction: column; 66 | align-items: flex-start; 67 | width: 100%; 68 | 69 | .displayNameInput { 70 | display: flex; 71 | flex-direction: column; 72 | width: 100%; 73 | 74 | input { 75 | font-size: 1.15rem; 76 | outline: none; 77 | border-radius: 5px; 78 | border: 1px solid $borderColor; 79 | padding: 0.75rem; 80 | background: transparent; 81 | color: $textColor; 82 | transition: all 0.2s ease-in; 83 | height: 1rem; 84 | margin-bottom: 1.5rem; 85 | } 86 | 87 | input::placeholder { 88 | color: $subColor; 89 | font-size: 1rem; 90 | } 91 | 92 | input:focus { 93 | border-radius: 5px; 94 | outline: none; 95 | border: 1px solid $lightBlue; 96 | } 97 | 98 | input:hover { 99 | border: 1px solid $lightBlue; 100 | } 101 | } 102 | 103 | .submitBtn { 104 | border: none; 105 | outline: none; 106 | font-size: 1.15rem; 107 | width: 100%; 108 | height: 2.75rem; 109 | border-radius: 5px; 110 | background: $lightBlue; 111 | font-weight: bold; 112 | transition: 0.5s; 113 | color: $mainColor; 114 | display: flex; 115 | align-items: center; 116 | justify-content: center; 117 | } 118 | 119 | .submitBtn:hover { 120 | color: #fff; 121 | background: $blue; 122 | text-decoration: none; 123 | } 124 | } 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /src/components/BottomNav/BottomNav.jsx: -------------------------------------------------------------------------------- 1 | import './BottomNav.scss'; 2 | import { HiOutlineHome } from 'react-icons/hi'; 3 | import { IoWalletOutline } from 'react-icons/io5'; 4 | import { RiUser3Line, RiBarChartLine } from 'react-icons/ri'; 5 | import { BsArrowUpDown } from 'react-icons/bs'; 6 | import { useLocation, Link } from 'react-router-dom'; 7 | import useMediaQuery from '@material-ui/core/useMediaQuery'; 8 | import { useState } from 'react'; 9 | import TradeModal from '../TradeModal/TradeModal'; 10 | import icon from "../../assets/logo/icon-tx.svg"; 11 | 12 | const BottomNav = () => { 13 | const matches = useMediaQuery('(max-width:767px)'); 14 | 15 | const location = useLocation(); 16 | 17 | const { pathname } = location; 18 | 19 | const splitLocation = pathname.split('/'); 20 | 21 | const [tradeModal, setTradeModal] = useState(false); 22 | 23 | return ( 24 |
25 | {matches ? null : ( 26 | 27 | Apexwallet-logo 28 | 29 | )} 30 | 39 | {matches ? :

Home

} 40 | 41 | 50 | {matches ? :

Prices

} 51 | 52 | { 55 | setTradeModal(!tradeModal); 56 | }} 57 | className="tradeIcon" 58 | > 59 | {matches ? null :

Trade

} 60 | {matches && } 61 | 62 | 71 | {matches ? :

Wallet

} 72 | 73 | 82 | {matches ? :

Account

} 83 | 84 | 85 | 86 |
setTradeModal(!tradeModal)} 89 | /> 90 |
91 | ); 92 | }; 93 | 94 | export default BottomNav; 95 | -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionThree/SectionThree.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | .sectionThree { 11 | min-height: 100vh; 12 | margin: 3rem 3rem; 13 | width: 100%; 14 | display: flex; 15 | align-items: center; 16 | justify-content: center; 17 | 18 | .container { 19 | padding: 1rem; 20 | display: flex; 21 | align-items: center; 22 | max-width: 1200px; 23 | width: 100%; 24 | justify-content: space-around; 25 | @media (max-width: 768px) { 26 | flex-direction: column; 27 | } 28 | 29 | .listAndGetStarted { 30 | display: flex; 31 | flex-direction: column; 32 | align-items: flex-start; 33 | justify-content: center; 34 | width: 80%; 35 | // background: #000; 36 | @media (max-width: 768px) { 37 | align-items: center; 38 | justify-content: center; 39 | width: 100%; 40 | } 41 | 42 | .header { 43 | font-size: 2.25rem; 44 | font-weight: bold; 45 | color: $textColor; 46 | @media (max-width: 768px) { 47 | font-size: 1.75rem; 48 | } 49 | } 50 | 51 | ul { 52 | list-style-type: none; 53 | margin: 0; 54 | padding: 0; 55 | margin-top: -2rem; 56 | @media (max-width: 768px) { 57 | margin-top: -1rem; 58 | margin-left: 1rem; 59 | } 60 | 61 | li { 62 | display: flex; 63 | align-items: flex-start; 64 | 65 | .header { 66 | display: flex; 67 | flex-direction: column; 68 | justify-content: flex-start; 69 | width: 100%; 70 | @media (max-width: 768px) { 71 | justify-content: center; 72 | } 73 | 74 | p { 75 | font-size: 1.25rem; 76 | @media (max-width: 768px) { 77 | font-size: 1.35rem; 78 | } 79 | text-align: left; 80 | font-weight: bold; 81 | color: $textColor; 82 | margin-bottom: .5rem; 83 | } 84 | 85 | span { 86 | font-size: 1.15rem; 87 | @media (max-width: 768px) { 88 | font-size: 1.15rem; 89 | } 90 | color: $subColor; 91 | font-weight: normal; 92 | } 93 | } 94 | 95 | .imgDiv { 96 | // width: 30%; 97 | display: flex; 98 | } 99 | 100 | img { 101 | height: 2rem; 102 | width: 2rem; 103 | margin-left: auto; 104 | margin-right: 1rem; 105 | margin-top: 1rem; 106 | } 107 | 108 | a { 109 | color: $blue; 110 | text-decoration: none; 111 | font-weight: bold; 112 | } 113 | } 114 | } 115 | } 116 | 117 | img { 118 | position: relative; 119 | height: 40rem; 120 | @media (max-width: 768px) { 121 | height: 30rem; 122 | } 123 | transition: all 0.5s ease; 124 | } 125 | 126 | .images { 127 | display: flex; 128 | align-items: center; 129 | justify-content: center; 130 | position: relative; 131 | width: 50%; 132 | z-index: 4; 133 | } 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/PasswordModal/PasswordModal.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(158, 158, 158); 10 | 11 | .passwordModalContainer { 12 | position: absolute; 13 | top: 50%; 14 | left: 50%; 15 | transform: translate(-45%, -50%); 16 | width: 100%; 17 | max-width: 20rem; 18 | outline: none; 19 | border: none; 20 | 21 | @media (max-width: 480px) { 22 | top: 50%; 23 | transform: translate(-50%, -50%); 24 | } 25 | 26 | .passwordModalSubContainer { 27 | background: rgba($mainColor, 1); 28 | flex-direction: column; 29 | height: 20rem; 30 | border-radius: 10px; 31 | padding: 1rem; 32 | display: flex; 33 | justify-content: center; 34 | align-items: center; 35 | position: relative; 36 | 37 | p { 38 | font-size: 1.15rem; 39 | // font-weight: bold; 40 | color: $textColor; 41 | } 42 | 43 | .closePasswordModal { 44 | position: absolute; 45 | top: 1%; 46 | right: 3%; 47 | border-radius: 5px; 48 | color: $textColor; 49 | border: none; 50 | outline: none; 51 | background: none; 52 | padding: 0.5rem 0; 53 | width: 2rem; 54 | font-weight: 900; 55 | font-size: 2rem; 56 | transition: all 0.2s ease-in-out; 57 | } 58 | .closePasswordModal:hover { 59 | cursor: pointer; 60 | transform: scale(1.2); 61 | } 62 | 63 | form { 64 | display: flex; 65 | flex-direction: column; 66 | align-items: flex-start; 67 | width: 100%; 68 | 69 | .currentPasswordInput, 70 | .confirmCurrentPasswordInput, 71 | .newPasswordInput { 72 | display: flex; 73 | flex-direction: column; 74 | width: 100%; 75 | 76 | input { 77 | font-size: 1.15rem; 78 | outline: none; 79 | border-radius: 5px; 80 | border: 1px solid $borderColor; 81 | padding: 0.75rem; 82 | background: transparent; 83 | color: $textColor; 84 | transition: all 0.2s ease-in; 85 | height: 1rem; 86 | margin-bottom: 1.5rem; 87 | } 88 | 89 | input::placeholder { 90 | color: $subColor; 91 | font-size: 1rem; 92 | } 93 | 94 | input:focus { 95 | border-radius: 5px; 96 | outline: none; 97 | border: 1px solid $lightBlue; 98 | } 99 | 100 | input:hover { 101 | border: 1px solid $lightBlue; 102 | } 103 | } 104 | 105 | .submitBtn { 106 | border: none; 107 | outline: none; 108 | font-size: 1.15rem; 109 | width: 100%; 110 | height: 2.75rem; 111 | border-radius: 5px; 112 | background: $lightBlue; 113 | font-weight: bold; 114 | transition: 0.5s; 115 | color: $mainColor; 116 | display: flex; 117 | align-items: center; 118 | justify-content: center; 119 | } 120 | 121 | .submitBtn:hover { 122 | color: #fff; 123 | background: $blue; 124 | text-decoration: none; 125 | } 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionFour/SectionFour.jsx: -------------------------------------------------------------------------------- 1 | import bitcoin from '../../../assets/landingLogos/bitcoin.png'; 2 | import ethereum from '../../../assets/landingLogos/ethereum.png'; 3 | import tether from '../../../assets/landingLogos/tether.png'; 4 | import dogecoin from '../../../assets/landingLogos/dogecoin.png'; 5 | import binanceCoin from '../../../assets/landingLogos/binance-coin.png'; 6 | import cardano from '../../../assets/landingLogos/cardano.png'; 7 | import usdCoin from '../../../assets/landingLogos/usd-coin.png'; 8 | import uniswap from '../../../assets/landingLogos/uniswap.png'; 9 | import bitcoinCash from '../../../assets/landingLogos/bitcoin-cash.png'; 10 | import xrp from '../../../assets/landingLogos/xrp.png'; 11 | import tron from '../../../assets/landingLogos/tron.png'; 12 | import ethereumClassic from '../../../assets/landingLogos/ethereum-classic.png'; 13 | import litecoin from '../../../assets/landingLogos/litecoin.png'; 14 | import dash from '../../../assets/landingLogos/dash.png'; 15 | import polkadot from '../../../assets/landingLogos/polkadot-new.png'; 16 | import './SectionFour.scss' 17 | 18 | const SectionFour = () => { 19 | return ( 20 |
21 |
22 |

Starting with 15 cryptocurrencies

23 | {/* All the logos go here */} 24 |
25 |
26 | bitcoin 27 |
28 |
29 | ethereum 30 |
31 |
32 | tether 33 |
34 |
35 | dogecoin 36 |
37 |
38 | binanceCoin 39 |
40 |
41 | polkadot 42 |
43 |
44 | usdCoin 45 |
46 |
47 | uniswap 48 |
49 |
50 | bitcoinCash 51 |
52 |
53 | xrp 54 |
55 |
56 | cardano 57 |
58 |
59 | tron 60 |
61 |
62 | ethereumClassic 63 |
64 |
65 | litecoin 66 |
67 |
68 | dash 69 |
70 |
71 |

More would be added based on popularity and demand.

72 |
73 |
74 | ); 75 | }; 76 | 77 | export default SectionFour; 78 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Wallet/Transactions/TransactionModal.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(170, 170, 170); 10 | 11 | .transactionModal { 12 | position: fixed; 13 | bottom: -150vh; 14 | background-color: $mainColor; 15 | width: 100%; 16 | box-shadow: 0 0 4px 0px rgba(0, 0, 0, 0.15); 17 | left: 0; 18 | padding: 1rem 0; 19 | z-index: 10; 20 | display: none; 21 | font-size: 1.15rem; 22 | animation: transactionModalAnim 0.3s ease-in-out forwards; 23 | border-top-left-radius: 20px; 24 | border-top-right-radius: 20px; 25 | height: 45%; 26 | @media (min-width: 768px) { 27 | display: none; 28 | width: 25rem; 29 | height: 20rem; 30 | border-top-left-radius: 20px; 31 | border-top-right-radius: 20px; 32 | border-bottom-left-radius: 20px; 33 | border-bottom-right-radius: 20px; 34 | } 35 | @media (max-width: 1024px) and (orientation: landscape) { 36 | height: 70%; 37 | } 38 | } 39 | 40 | @keyframes transactionModalAnim { 41 | from { 42 | bottom: -150vh; 43 | } 44 | 45 | to { 46 | bottom: 0; 47 | } 48 | } 49 | 50 | .transactionModal.Show { 51 | bottom: 0; 52 | display: flex; 53 | align-items: center; 54 | flex-direction: column; 55 | justify-content: space-around; 56 | transition: all 0.8s ease-in; 57 | @media (min-width: 768px) { 58 | display: flex; 59 | top: 50%; 60 | left: 50%; 61 | transform: translate(-50%, -50%); 62 | } 63 | 64 | .amountAndDate { 65 | display: flex; 66 | flex-direction: column; 67 | align-items: center; 68 | justify-content: center; 69 | width: 80%; 70 | 71 | .amount { 72 | font-size: 2.5rem; 73 | text-align: center; 74 | } 75 | 76 | .memo { 77 | margin-top: -2.25rem; 78 | margin-bottom: .5rem; 79 | font-size: 1rem; 80 | color: $subColor; 81 | text-align: center; 82 | } 83 | } 84 | 85 | hr { 86 | border-top: 2px dashed #000; 87 | width: 75%; 88 | } 89 | 90 | .status { 91 | margin-bottom: 2rem; 92 | .completeCheck { 93 | display: flex; 94 | align-items: center; 95 | justify-content: center; 96 | 97 | .icon { 98 | height: 1.25rem; 99 | width: 1.25rem; 100 | display: flex; 101 | align-items: center; 102 | border-radius: 100%; 103 | font-size: 5rem; 104 | margin-right: .25rem; 105 | background: #C2FEDB; 106 | color: #12A550; 107 | } 108 | } 109 | } 110 | 111 | .date, 112 | .name { 113 | margin-bottom: -1rem; 114 | } 115 | 116 | .date, 117 | .name, 118 | .status { 119 | display: flex; 120 | width: 80%; 121 | align-items: center; 122 | justify-content: space-around; 123 | 124 | p:nth-child(1) { 125 | margin-right: auto; 126 | text-align: left; 127 | } 128 | 129 | p:nth-child(2) { 130 | font-size: 0.95rem; 131 | text-align: right; 132 | color: $subColor; 133 | text-transform: capitalize; 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/source/source.jsx: -------------------------------------------------------------------------------- 1 | import './source.scss'; 2 | import { useState } from 'react'; 3 | import Backdrop from '@material-ui/core/Backdrop'; 4 | import Modal from '@material-ui/core/Modal'; 5 | import Fade from '@material-ui/core/Fade'; 6 | import { RiFileCodeFill } from "react-icons/ri"; 7 | import { FiChevronRight } from 'react-icons/fi'; 8 | import 'react-toastify/dist/ReactToastify.css'; 9 | 10 | export default function Source() { 11 | const [openModal, setOpenModal] = useState(false); 12 | const handleOpenModal = () => setOpenModal(true); 13 | const handleCloseModal = () => { 14 | setOpenModal(false); 15 | setCount(0); 16 | }; 17 | const [ count, setCount ] = useState(0); 18 | 19 | const increaseCount = () => { 20 | setCount(count + 1); 21 | } 22 | 23 | return ( 24 |
25 |
26 |
27 | 28 |
29 |

Source Codes

30 |
31 | 32 |
33 |
34 | 43 | 44 |
45 |
46 |
47 |

51 | This project was created out of curiosity and as a way to 52 | learn more about React and Node.js as a beginner. 53 |

54 | 55 |

59 | Tech stack is React, Node.js with Express, MongoDB, AWS (S3) 60 | and hosted on Netlify (frontend), Digital Ocean (backend). 61 |

62 | 63 |

70 | Lastly, I won't put more efforts on this project, but I'm open 71 | to reviews and suggestions, thanks. 72 | Kayode. 73 |

74 | 75 | {count < 2 ? ( 76 | 77 | ) : ( 78 | 83 | GitHub 84 | 85 | )} 86 |
87 |
88 |
89 |
90 |
91 |
92 | ); 93 | } 94 | -------------------------------------------------------------------------------- /src/components/TopNav/Nav.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | nav { 11 | position: absolute; 12 | top: 0%; 13 | height: 8vh; 14 | z-index: 10; 15 | @media (max-width: 768px) and (orientation: landscape) { 16 | height: 15vh; 17 | } 18 | @media (max-width: 812px) and (orientation: landscape) { 19 | height: 20vh; 20 | } 21 | display: flex; 22 | align-items: center; 23 | width: 95%; 24 | justify-content: space-between; 25 | 26 | .logo { 27 | font-size: 21px; 28 | font-weight: bold; 29 | text-decoration: none; 30 | color: $textColor; 31 | } 32 | 33 | .desktop { 34 | width: 50%; 35 | max-width: 30rem; 36 | display: flex; 37 | align-items: center; 38 | justify-content: space-between; 39 | 40 | a { 41 | text-decoration: none; 42 | color: $textColor; 43 | font-size: 17px; 44 | transition: all 0.3s ease-in-out; 45 | border-bottom: 2px solid transparent; 46 | } 47 | 48 | a.active { 49 | color: $blue; 50 | border-bottom: 2px solid $blue; 51 | } 52 | 53 | a:hover { 54 | color: $blue; 55 | border-bottom: 2px solid $blue; 56 | } 57 | 58 | .signupBtn { 59 | height: 3rem; 60 | width: 8rem; 61 | background: $blue; 62 | display: flex; 63 | align-items: center; 64 | justify-content: center; 65 | text-decoration: none; 66 | color: $mainColor; 67 | font-weight: bold; 68 | border-radius: 5px; 69 | font-size: 1.05rem; 70 | transition: all 0.2s ease; 71 | border: 1px solid $blue; 72 | } 73 | 74 | .signupBtn:hover { 75 | background: $mainColor; 76 | color: $blue; 77 | border: 1px solid $blue; 78 | } 79 | 80 | @media (max-width: 767px) { 81 | display: none; 82 | } 83 | } 84 | 85 | .mobile { 86 | margin-right: -0.5rem; 87 | @media (min-width: 768px) { 88 | display: none; 89 | } 90 | } 91 | } 92 | 93 | .mobileNav { 94 | @media (min-width: 768px) { 95 | display: none; 96 | } 97 | position: absolute; 98 | display: flex; 99 | flex-direction: column; 100 | align-items: center; 101 | transition: all 0.3s ease-in; 102 | background: $mainColor; 103 | height: 92vh; 104 | @media (max-width: 812px) and (orientation: landscape) { 105 | height: 85vh; 106 | } 107 | width: 100vw; 108 | bottom: 0; 109 | left: 0; 110 | opacity: 0; 111 | z-index: 4; 112 | animation: navIn 0.3s ease-in forwards; 113 | 114 | a { 115 | text-decoration: none; 116 | color: $textColor; 117 | font-size: 1.15rem; 118 | margin-top: 5rem; 119 | @media (max-width: 823px) and (orientation: landscape) { 120 | margin-top: 2rem; 121 | } 122 | } 123 | 124 | .signupBtn { 125 | height: 3rem; 126 | width: 8rem; 127 | background: $blue; 128 | display: flex; 129 | align-items: center; 130 | justify-content: center; 131 | text-decoration: none; 132 | color: $mainColor; 133 | font-weight: bold; 134 | border-radius: 5px; 135 | font-size: 1.05rem; 136 | transition: all 0.2s ease; 137 | border: 1px solid $blue; 138 | } 139 | } 140 | @keyframes navIn { 141 | from { 142 | left: 20vh; 143 | opacity: 0; 144 | } 145 | 146 | to { 147 | opacity: 1; 148 | left: 0; 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /src/assets/debit-cards/complete-card.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 4756 19 | 9018 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/assets/logo/coinsSVG.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 37 | 38 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /src/components/Coin/Graph/Graph.jsx: -------------------------------------------------------------------------------- 1 | import { AreaChart, Tooltip, Area, ResponsiveContainer } from 'recharts'; 2 | import moment from 'moment'; 3 | 4 | const Graph = ({ graphData, days, coinInfoId }) => { 5 | 6 | const pickColor = (coinInfoId) => { 7 | switch (coinInfoId) { 8 | case 'bitcoin': 9 | return '#fb8c00'; 10 | case 'ethereum': 11 | return '#424242'; 12 | case 'litecoin': 13 | return '#3c3c3d'; 14 | case 'dash': 15 | return '#42a5f5'; 16 | case 'tron': 17 | return '#b71c1c'; 18 | case 'ethereum-classic': 19 | return '#1b5e20'; 20 | case 'uniswap': 21 | return '#d81b60'; 22 | case 'bitcoin-cash': 23 | return '#00897b'; 24 | case 'tether': 25 | return '#00897b'; 26 | case 'usd-coin': 27 | return '#0277bd'; 28 | case 'polkadot': 29 | return '#3c3c3d'; 30 | case 'ripple': 31 | return '#3c3c3d'; 32 | case 'dogecoin': 33 | return '#fbc02d'; 34 | case 'cardano': 35 | return '#1976d2'; 36 | case 'binancecoin': 37 | return '#ffc107'; 38 | case 'decentraland': 39 | return '#e64a19'; 40 | case 'shia-inu': 41 | return '#f90201'; 42 | case 'solana': 43 | return '#7b1fa2'; 44 | case 'stellar': 45 | return '#212121'; 46 | case 'chainlink': 47 | return '#315acb'; 48 | default: 49 | return '#424242'; 50 | } 51 | }; 52 | 53 | const pickSubColor = (coinInfoId) => { 54 | switch (coinInfoId) { 55 | case 'bitcoin': 56 | return '#FEF4D8'; 57 | case 'ethereum': 58 | return '#e0e0e0'; 59 | case 'litecoin': 60 | return '#d3d3d3'; 61 | case 'dash': 62 | return '#bbdefb'; 63 | case 'tron': 64 | return '#ffcdd2'; 65 | case 'ethereum-classic': 66 | return '#c8e6c9'; 67 | case 'uniswap': 68 | return '#f8bbd0'; 69 | case 'bitcoin-cash': 70 | return '#b2dfdb'; 71 | case 'tether': 72 | return '#b2dfdb'; 73 | case 'usd-coin': 74 | return '#b3e5fc'; 75 | case 'polkadot': 76 | return '#d3d3d3'; 77 | case 'ripple': 78 | return '#d3d3d3'; 79 | case 'dogecoin': 80 | return '#fff9c4'; 81 | case 'cardano': 82 | return '#bbdefb'; 83 | case 'binancecoin': 84 | return '#ffecb3'; 85 | case 'decentraland': 86 | return '#ffccbc'; 87 | case 'shia-inu': 88 | return '#fca501'; 89 | case 'solana': 90 | return '#e1bee7'; 91 | case 'stellar': 92 | return '#bdbdbd'; 93 | case 'chainlink': 94 | return '#bbdefb'; 95 | default: 96 | return '#e0e0e0'; 97 | } 98 | }; 99 | 100 | const CustomTooltip = ({ active, payload }) => { 101 | if (active && payload && payload.length) { 102 | return ( 103 |
104 | {days === 1 ? ( 105 |

{moment(payload[0].payload.date).format('ddd, hA')}

106 | ) : ( 107 |

{moment(payload[0].payload.date).format('MMMM Do, YYYY')}

108 | )} 109 |

{`$ ${payload[0].value}`}

110 |
111 | ); 112 | } 113 | 114 | return null; 115 | }; 116 | 117 | return ( 118 | 119 | 129 | } /> 130 | 138 | 139 | 140 | ); 141 | }; 142 | 143 | export default Graph; 144 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Wallet/CompleteWallet/CardDesign.jsx: -------------------------------------------------------------------------------- 1 | import './CardDesign.scss'; 2 | import { useState } from 'react'; 3 | import Backdrop from '@material-ui/core/Backdrop'; 4 | import Modal from '@material-ui/core/Modal'; 5 | import Fade from '@material-ui/core/Fade'; 6 | import axios from 'axios'; 7 | import { RotateSpinner } from 'react-spinners-kit'; 8 | import { ToastContainer, toast } from 'react-toastify'; 9 | import 'react-toastify/dist/ReactToastify.css'; 10 | import type1 from '../../../../assets/debit-cards/complete-card.png'; 11 | import type2 from '../../../../assets/debit-cards/complete-card2.png'; 12 | import type3 from '../../../../assets/debit-cards/complete-card3.png'; 13 | import type4 from '../../../../assets/debit-cards/complete-card4.png'; 14 | 15 | export default function CardDesign({ user, BsThreeDotsVertical }) { 16 | const [openModal, setOpenModal] = useState(false); 17 | const handleOpenModal = () => setOpenModal(true); 18 | const handleCloseModal = () => { 19 | setOpenModal(false); 20 | }; 21 | const [changing, setChanging] = useState(false); 22 | 23 | const cardDesignEndpoint = 'https://api.apexwallet.app/v1/user/card-design'; 24 | 25 | //change the user's password 26 | const handleCardDesignChange = async (cardDesign) => { 27 | setChanging(true); 28 | 29 | const newCardDesign = { cardDesign }; 30 | 31 | try { 32 | await axios 33 | .put(cardDesignEndpoint, newCardDesign) 34 | .then(async (res) => { 35 | await toast.success(res.data, {}); 36 | setChanging(false); 37 | setOpenModal(false); 38 | }) 39 | .catch(async (err) => { 40 | await toast.error(err.response.data, {}); 41 | setChanging(false); 42 | }); 43 | } catch (err) { 44 | console.log('ERROR: ', err); 45 | setChanging(false); 46 | } 47 | }; 48 | 49 | return ( 50 |
51 |
52 | 53 |
54 | 63 | 64 |
65 |
69 | {changing ? ( 70 |
71 | 72 |
73 | ) : ( 74 | <> 75 |

Select A New Card Design

76 |
{ 78 | handleCardDesignChange('type-1'); 79 | }} 80 | className="alienSVG" 81 | > 82 | type1 83 |
84 |
{ 86 | handleCardDesignChange('type-2'); 87 | }} 88 | className="astronautSVG" 89 | > 90 | astronaut 91 |
92 |
{ 94 | handleCardDesignChange('type-3'); 95 | }} 96 | className="saturnSVG" 97 | > 98 | saturn 99 |
100 |
{ 102 | handleCardDesignChange('type-4'); 103 | }} 104 | className="sunSVG" 105 | > 106 | sun 107 |
108 | 109 | )} 110 |
111 |
112 |
113 |
114 | 115 |
116 | ); 117 | } 118 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/NameModal/NameModal.jsx: -------------------------------------------------------------------------------- 1 | import './NameModal.scss'; 2 | import { useState } from 'react'; 3 | import Backdrop from '@material-ui/core/Backdrop'; 4 | import Modal from '@material-ui/core/Modal'; 5 | import Fade from '@material-ui/core/Fade'; 6 | import axios from 'axios'; 7 | import { RotateSpinner } from 'react-spinners-kit'; 8 | import { ToastContainer, toast } from 'react-toastify'; 9 | import 'react-toastify/dist/ReactToastify.css'; 10 | import { IoClose } from 'react-icons/io5'; 11 | import { FiChevronRight } from 'react-icons/fi'; 12 | 13 | export default function NameModal({ user }) { 14 | const [openModal, setOpenModal] = useState(false); 15 | const handleOpenModal = () => setOpenModal(true); 16 | const handleCloseModal = () => { 17 | setOpenModal(false); 18 | setName(''); 19 | }; 20 | const [name, setName] = useState(''); 21 | const [changingName, setChangingName] = useState(false); 22 | 23 | const nameChangeEndpoint = 'https://api.apexwallet.app/v1/user/change-name'; 24 | 25 | //change the user's password 26 | const handleNameChange = async (e) => { 27 | e.preventDefault(); 28 | setChangingName(true); 29 | const displayName = { name }; 30 | try { 31 | if (name === '' || name.length === 0 || name.trim().length === 0) { 32 | toast.error('Name can not be blank', {}); 33 | setChangingName(false); 34 | } else if (name.length > 20) { 35 | toast.error('Name can not be more than 20 characters', {}); 36 | setChangingName(false); 37 | } else { 38 | name.trim(); 39 | await axios 40 | .put(nameChangeEndpoint, displayName) 41 | .then((res) => { 42 | if (res.status === 200) { 43 | toast.success(`${res.data}`, {}); 44 | handleCloseModal(); 45 | setChangingName(false); 46 | } 47 | }) 48 | .catch(async (err) => { 49 | toast.error(`${err.response.data}`, {}); 50 | setChangingName(false); 51 | }); 52 | } 53 | } catch (error) { 54 | console.log('Error: ' + error); 55 | setChangingName(false); 56 | } 57 | }; 58 | 59 | return ( 60 |
61 |
62 |
63 |

Display Name

64 |

{user.name ? user.name : 'No name yet'}

65 |
66 |
67 | 68 |
69 |
70 | 78 | 79 |
80 |
81 | 88 |

Edit Display Name

89 |
90 |
91 | setName(e.target.value)} 100 | /> 101 |
102 | 103 | 106 |
107 |
108 |
109 |
110 |
111 | 112 |
113 | ); 114 | } 115 | -------------------------------------------------------------------------------- /src/components/TradeModal/SendxReceive/Receive.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(170, 170, 170); 10 | 11 | .receive { 12 | height: 100%; 13 | position: fixed; 14 | top: 150vh; 15 | background: $mainColor; 16 | width: 100%; 17 | @media (min-width: 768px) { 18 | max-width: 30rem; 19 | display: none; 20 | } 21 | } 22 | 23 | .receive.Show { 24 | top: 0; 25 | left: 0; 26 | display: flex; 27 | flex-direction: column; 28 | align-items: center; 29 | transition: all 0.7s ease-in; 30 | 31 | @media (min-width: 768px) { 32 | top: 50%; 33 | left: 50%; 34 | transform: translate(-50%, -50%); 35 | border-radius: 10px; 36 | } 37 | 38 | .closeIcon { 39 | font-size: 1.5rem; 40 | top: 2%; 41 | right: 3%; 42 | position: absolute; 43 | z-index: 4; 44 | cursor: pointer; 45 | } 46 | .receiveDiv { 47 | width: 100%; 48 | display: flex; 49 | flex-direction: column; 50 | align-items: center; 51 | height: 100%; 52 | overflow: auto; 53 | position: relative; 54 | 55 | .header { 56 | @media (min-width: 768px) { 57 | margin-top: 1rem; 58 | } 59 | @media (max-width: 1024px) and (orientation: landscape) { 60 | margin-bottom: 10%; 61 | } 62 | } 63 | 64 | .selectBalanceAndBTN { 65 | width: 90%; 66 | display: flex; 67 | flex-direction: column; 68 | @media (max-width: 767px) and (orientation: portrait) { 69 | position: absolute; 70 | bottom: 5%; 71 | } 72 | 73 | @media (min-width: 768px) { 74 | margin-top: 2rem; 75 | } 76 | 77 | .selectCoin { 78 | height: 4rem; 79 | width: 100%; 80 | display: flex; 81 | align-items: center; 82 | font-size: 1.15rem; 83 | } 84 | 85 | .usernameAndAddress { 86 | width: 100%; 87 | display: flex; 88 | align-items: center; 89 | flex-direction: column; 90 | justify-content: center; 91 | margin-bottom: 1rem; 92 | 93 | .qrContainer { 94 | padding: 1rem; 95 | width: 90%; 96 | display: flex; 97 | flex-direction: column; 98 | align-items: center; 99 | margin-top: 0rem; 100 | justify-content: center; 101 | border: 1px solid $borderColor; 102 | border-radius: 5px; 103 | 104 | .qrCode { 105 | padding: 1rem 3rem; 106 | } 107 | } 108 | 109 | .iconAndName { 110 | display: flex; 111 | align-self: flex-start; 112 | 113 | .icon { 114 | transition: all 0.2s ease-in; 115 | } 116 | 117 | .icon:hover { 118 | cursor: pointer; 119 | color: $lightBlue; 120 | } 121 | } 122 | 123 | p { 124 | display: flex; 125 | align-self: flex-start; 126 | font-size: 0.95rem; 127 | color: $subColor; 128 | margin-bottom: 0rem; 129 | } 130 | 131 | span { 132 | font-size: 1.15rem; 133 | margin-right: 0.5rem; 134 | } 135 | } 136 | 137 | button { 138 | display: flex; 139 | align-items: center; 140 | justify-content: center; 141 | height: 4rem; 142 | width: 100%; 143 | font-size: 1.15rem; 144 | padding: 1rem; 145 | border-radius: 5px; 146 | outline: none; 147 | border: none; 148 | color: $mainColor; 149 | font-weight: bold; 150 | background: $blue; 151 | transition: 0.5s; 152 | margin-top: 1rem; 153 | @media (min-width: 768px){ 154 | margin-bottom: 1.5rem; 155 | } 156 | } 157 | 158 | button:hover { 159 | cursor: pointer; 160 | background: $lightBlue; 161 | } 162 | 163 | button[disabled] { 164 | background: $borderColor; 165 | } 166 | 167 | button[disabled]:hover { 168 | cursor: not-allowed; 169 | } 170 | } 171 | } 172 | } 173 | 174 | .loading { 175 | position: absolute; 176 | top: 45%; 177 | left: 50%; 178 | transform: translate(-50%, -50%); 179 | } 180 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 20 | 24 | 25 | 30 | 35 | 36 | 40 | 41 | 42 | 43 | 44 | 45 | 50 | 55 | 60 | 65 | 70 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | Apexwallet 85 | 86 | 87 | 91 | 100 | 101 | 102 | 103 |
104 | 105 | 106 | -------------------------------------------------------------------------------- /src/assets/debit-cards/complete-card2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 4756 25 | 9018 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/components/BottomNav/BottomNav.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(170, 170, 170); 10 | 11 | .navbar { 12 | position: fixed; 13 | bottom: 0; 14 | height: 4rem; 15 | width: 100%; 16 | display: flex; 17 | align-items: center; 18 | justify-content: space-around; 19 | font-size: 1.35rem; 20 | background: $mainColor; 21 | z-index: 5; 22 | 23 | @media (min-width: 768px) { 24 | position: sticky; 25 | width: 100%; 26 | max-width: 1000px; 27 | display: flex; 28 | align-items: center; 29 | justify-content: center; 30 | } 31 | 32 | a { 33 | text-decoration: none; 34 | color: $textColor; 35 | opacity: 0.5; 36 | } 37 | 38 | a.active { 39 | color: $textColor; 40 | opacity: 1; 41 | } 42 | 43 | .tradeIcon { 44 | display: flex; 45 | align-items: center; 46 | justify-content: center; 47 | 48 | @media (max-width: 767px) { 49 | height: 3.5rem; 50 | border-radius: 50%; 51 | font-size: 1.5rem; 52 | font-weight: bold; 53 | color: $mainColor; 54 | opacity: 1; 55 | background: $textColor; 56 | width: 3.5rem; 57 | margin-top: -2rem; 58 | transform: rotate(45deg); 59 | } 60 | } 61 | 62 | @media (max-width: 767px) { 63 | @keyframes navIconAnim { 64 | 0% { 65 | transform: scale(1); 66 | } 67 | 68 | 50% { 69 | transform: scale(1.3); 70 | } 71 | 72 | 100% { 73 | transform: scale(1); 74 | } 75 | } 76 | } 77 | 78 | .tradeModal { 79 | position: fixed; 80 | bottom: -150vh; 81 | background-color: $mainColor; 82 | width: 100%; 83 | box-shadow: 0 0 4px 0px rgba(0, 0, 0, 0.15); 84 | left: 0; 85 | padding: 1rem 0; 86 | z-index: 10; 87 | display: none; 88 | font-size: 1.15rem; 89 | border-top-left-radius: 10px; 90 | border-top-right-radius: 10px; 91 | height: 40%; 92 | @media (min-width: 768px) { 93 | display: none; 94 | width: 30rem; 95 | height: 28rem; 96 | border-bottom-left-radius: 10px; 97 | border-bottom-right-radius: 10px; 98 | } 99 | @media (max-width: 812px) and (orientation: landscape) { 100 | height: 90%; 101 | } 102 | } 103 | 104 | .tradeModal.Show { 105 | bottom: 0; 106 | display: flex; 107 | flex-direction: column; 108 | justify-content: space-around; 109 | transition: all 0.8s ease-in; 110 | @media (min-width: 768px) { 111 | display: flex; 112 | top: 50%; 113 | left: 50%; 114 | transform: translate(-50%, -50%); 115 | } 116 | 117 | .noWallet { 118 | display: flex; 119 | align-self: center; 120 | } 121 | 122 | .tradeModalIcon { 123 | font-size: 1.5rem; 124 | margin-right: 1rem; 125 | } 126 | 127 | .sendCrypto, 128 | .receiveCrypto, 129 | .convertCrypto, 130 | .buyCrypto, 131 | .sellCrypto { 132 | cursor: pointer; 133 | display: flex; 134 | margin-left: 1rem; 135 | width: 90%; 136 | } 137 | } 138 | 139 | .Overlay { 140 | background-color: rgba(0, 0, 0, 0.55); 141 | top: 0; 142 | bottom: 0; 143 | left: 0; 144 | right: 0; 145 | position: fixed; 146 | display: none; 147 | z-index: 5; 148 | } 149 | 150 | .Overlay.Show { 151 | display: block; 152 | } 153 | 154 | .homeIcon, 155 | .pricesIcon, 156 | .walletIcon, 157 | .accountIcon, 158 | .tradeIcon, 159 | .logoApex { 160 | display: flex; 161 | flex-direction: column; 162 | align-items: center; 163 | font-size: 1.35rem; 164 | font-weight: bold; 165 | 166 | @media (min-width: 768px) { 167 | flex-direction: row; 168 | font-size: 1.35rem; 169 | font-weight: normal; 170 | align-items: center; 171 | justify-content: center; 172 | margin-left: 2rem; 173 | margin-top: .5rem; 174 | } 175 | 176 | p { 177 | font-size: 0.9rem; 178 | margin-top: -0.05rem; 179 | margin-bottom: -0.05rem; 180 | 181 | @media (min-width: 768px) { 182 | font-size: 1.15rem; 183 | margin-top: 0; 184 | margin-bottom: -0.25rem; 185 | } 186 | } 187 | } 188 | 189 | .logoApex { 190 | height: 3.5rem; 191 | margin-right: -.75rem; 192 | opacity: 1; 193 | 194 | img { 195 | max-height: 100%; 196 | } 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /src/assets/debit-cards/complete-card4.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 4756 19 | 9018 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Dashboard/Messages/Messages.jsx: -------------------------------------------------------------------------------- 1 | import { IoClose } from 'react-icons/io5'; 2 | import { BsArrowLeft } from 'react-icons/bs' 3 | import './Messages.scss'; 4 | import moment from 'moment'; 5 | import axios from 'axios'; 6 | import { toast } from 'react-toastify'; 7 | import 'react-toastify/dist/ReactToastify.css'; 8 | import { useHistory } from 'react-router-dom'; 9 | import { useState } from 'react'; 10 | 11 | const Messages = ({ user, modalUpMessages, setModalUpMessages, messageModal, setMessageModal }) => { 12 | const history = useHistory(); 13 | const [singleMessageModal, setSingleMessage] = useState(''); 14 | 15 | const handleRedirect = (message) => { 16 | if (message.redirect) history.push(message.redirect); 17 | if (message.hasModal === true) { 18 | setMessageModal(true); 19 | setSingleMessage(message); 20 | } 21 | }; 22 | 23 | const openMessageModal = (message) => { 24 | return ( 25 |
26 |
27 |
setMessageModal(false)}> 28 | 29 |
30 |

{message.title}

31 | {message.image && {message.title}} 32 |
33 | {message.from && ( 34 |

35 | {message.from} 36 | 37 |

38 | )} 39 |

{moment(message.date).startOf('hour').fromNow()}

40 |
41 |

{message.text}

42 |
43 |
44 | ); 45 | }; 46 | 47 | //set the message to unread after opening it. 48 | const handleOpenMessage = async (messageId) => { 49 | const apiURL = 'https://api.apexwallet.app/v1'; 50 | const message = { messageId }; 51 | try { 52 | await axios.put(`${apiURL}/message/open-message`, message, { withCredentials: true }).catch(async (err) => { 53 | await toast.error(err.response.data, {}); 54 | }); 55 | } catch (error) { 56 | console.log('ERROR: ', error); 57 | } 58 | }; 59 | 60 | return ( 61 | <> 62 |
63 |
{ 66 | setModalUpMessages(false); 67 | setMessageModal(false); 68 | }} 69 | > 70 | 71 |
72 |
{ 75 | setModalUpMessages(false); 76 | setMessageModal(false); 77 | }} 78 | > 79 | 80 |
81 |
Notifications
82 | 83 | {/* sort each message by date */} 84 | {user.messages.length > 0 ? ( 85 | user.messages 86 | .sort(function (a, b) { 87 | if (a.date < b.date) { 88 | return 1; 89 | } 90 | if (a.date > b.date) { 91 | return -1; 92 | } 93 | return 0; 94 | }) 95 | .map((message) => ( 96 |
{ 99 | handleOpenMessage(message._id); 100 | handleRedirect(message); 101 | }} 102 | className="messagesDiv" 103 | > 104 |

111 | {message.title} 112 |

113 |

{message.text}

114 |
115 |

{moment(message.date).startOf('hour').fromNow()}

116 | {message.from && ( 117 |

118 | 119 | {message.from} 120 |

121 | )} 122 |
123 |
124 | )) 125 | ) : ( 126 |

Nothing to see here yet

127 | )} 128 |
129 | {messageModal && openMessageModal(singleMessageModal)} 130 | 131 | ); 132 | }; 133 | 134 | export default Messages; 135 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Dashboard/Messages/Messages.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(170, 170, 170); 10 | 11 | .messages, 12 | .messageModal { 13 | height: 100%; 14 | position: fixed; 15 | top: 0; 16 | left: 150vw; 17 | background: $mainColor; 18 | width: 100%; 19 | @media (min-width: 768px) { 20 | max-width: 30rem; 21 | height: 50%; 22 | } 23 | } 24 | 25 | .messages.Show, 26 | .messageModal.Show { 27 | top: 0; 28 | left: 0; 29 | display: flex; 30 | flex-direction: column; 31 | align-items: center; 32 | overflow: scroll; 33 | @media (max-width: 767px) { 34 | transition: all 0.7s ease-in; 35 | } 36 | z-index: 6; 37 | 38 | @media (min-width: 768px) { 39 | top: 50%; 40 | left: 50%; 41 | transform: translate(-50%, -50%); 42 | border-radius: 10px; 43 | } 44 | 45 | .closeIcon { 46 | font-size: 1.5rem; 47 | top: 2%; 48 | right: 3%; 49 | position: absolute; 50 | @media (max-width: 767px) { 51 | display: none; 52 | } 53 | } 54 | .closeIconMobile { 55 | font-size: 2rem; 56 | top: 5%; 57 | @media (max-width: 767px) { 58 | top: 2%; 59 | } 60 | left: 4%; 61 | position: absolute; 62 | @media (min-width: 768px) { 63 | display: none; 64 | } 65 | } 66 | .messagesHeader { 67 | font-size: 1.35rem; 68 | margin-top: 1rem; 69 | margin-bottom: 1rem; 70 | @media (min-width: 768px) { 71 | margin-top: 2rem; 72 | font-size: 1.75rem; 73 | } 74 | color: $textColor; 75 | } 76 | 77 | .noMessages { 78 | font-size: 1rem; 79 | margin-top: -0.5rem; 80 | color: $subColor; 81 | } 82 | 83 | .messagesDiv { 84 | width: 90%; 85 | height: fit-content; 86 | padding: 1rem; 87 | 88 | .messageTitle { 89 | font-size: 1.05rem; 90 | margin-top: -1rem; 91 | } 92 | 93 | .messageText { 94 | font-size: 1rem; 95 | margin-top: -0.75rem; 96 | color: $subColor; 97 | overflow: hidden; 98 | text-overflow: ellipsis; 99 | display: -webkit-box; 100 | -webkit-line-clamp: 3; /* number of lines to show */ 101 | -webkit-box-orient: vertical; 102 | } 103 | 104 | .fromAndDate { 105 | display: flex; 106 | align-items: center; 107 | font-size: 0.9rem; 108 | color: $subColor; 109 | margin-top: -1.45rem; 110 | 111 | .messageFrom { 112 | // background: #000; 113 | margin-left: 0.25rem; 114 | 115 | .fromSpan { 116 | height: 1rem; 117 | width: 1rem; 118 | font-size: 1rem; 119 | margin-right: 0.25rem; 120 | } 121 | } 122 | } 123 | } 124 | } 125 | 126 | .messageModal.Show { 127 | .closeIcon { 128 | font-size: 2rem; 129 | top: 5%; 130 | @media (max-width: 767px) { 131 | top: 2%; 132 | } 133 | left: 4%; 134 | position: absolute; 135 | display: block; 136 | } 137 | @media (max-width: 767px) { 138 | animation: messageSlideIn 0.7s ease-in forwards; 139 | } 140 | 141 | .container { 142 | width: 90%; 143 | height: fit-content; 144 | padding: 1rem; 145 | display: flex; 146 | align-items: center; 147 | } 148 | 149 | .messageTitle { 150 | display: flex; 151 | font-size: 1.35rem; 152 | @media (max-width: 767px) { 153 | margin-top: 3rem; 154 | align-self: flex-start; 155 | } 156 | } 157 | 158 | img { 159 | height: 50%; 160 | width: 100%; 161 | border-radius: 10px; 162 | margin-bottom: 1.5rem; 163 | margin-top: -.5rem; 164 | } 165 | 166 | .messageText { 167 | font-size: 1.15rem; 168 | color: $subColor; 169 | margin-top: -0.5rem; 170 | line-height: 1.95; 171 | } 172 | 173 | .fromAndDate { 174 | align-self: flex-start; 175 | display: flex; 176 | align-items: center; 177 | font-size: 0.9rem; 178 | color: $subColor; 179 | margin-top: -1.75rem; 180 | 181 | .messageFrom { 182 | font-weight: bold; 183 | 184 | .fromSpan { 185 | height: 1rem; 186 | width: 1rem; 187 | font-size: 1rem; 188 | margin-left: 0.25rem; 189 | 190 | margin-right: 0.25rem; 191 | } 192 | } 193 | } 194 | } 195 | 196 | @keyframes messageSlideIn { 197 | from { 198 | left: 150vw; 199 | } 200 | 201 | to { 202 | left: 0; 203 | } 204 | } 205 | 206 | .loading { 207 | position: absolute; 208 | top: 45%; 209 | left: 50%; 210 | transform: translate(-50%, -50%); 211 | } 212 | -------------------------------------------------------------------------------- /src/pages/Login/Login.jsx: -------------------------------------------------------------------------------- 1 | import './Login.scss'; 2 | // import astronaut from '../../assets/logo/astronaut-ingravity.svg'; 3 | import { useState, useContext } from 'react'; 4 | import { useHistory } from 'react-router-dom'; 5 | import { RotateSpinner } from 'react-spinners-kit'; 6 | import { BsEyeFill, BsEyeSlashFill } from 'react-icons/bs'; 7 | import { Link } from 'react-router-dom'; 8 | import useTitle from '../../utils/useTitle'; 9 | import AuthContext from '../../components/Auth/AuthContext'; 10 | import axios from 'axios'; 11 | import { ToastContainer, toast } from 'react-toastify'; 12 | import 'react-toastify/dist/ReactToastify.css'; 13 | 14 | const Login = () => { 15 | const history = useHistory(); 16 | const { getLoggedIn } = useContext(AuthContext); 17 | const [username, setUsername] = useState(''); 18 | const [password, setPassword] = useState(''); 19 | const [passwordVisible, setPasswordVisible] = useState(false); 20 | const [loggingIn, setLoggingIn] = useState(false); 21 | const apiURL = 'https://api.apexwallet.app/v1'; 22 | 23 | useTitle('Login | Apexwallet'); 24 | 25 | //handle the form submit 26 | const handleLogin = async (e) => { 27 | e.preventDefault(); 28 | 29 | //start animating the button 30 | setLoggingIn(true); 31 | 32 | //use try catch to prevent open hole 33 | try { 34 | const user = { username, password }; 35 | await axios 36 | .post(`${apiURL}/auth/login`, user, { withCredentials: true }) 37 | .then((res) => { 38 | async function getStatus() { 39 | //wait to see if the status exists 40 | await res.status; 41 | //if the status is 201 (created), then refresh the getLoggedIn() 42 | //so the loggedIn value can change from false to true in the AuthContext 43 | if (res.status === 200) { 44 | await getLoggedIn(); 45 | await history.push('/dashboard'); 46 | } 47 | } 48 | //call the function. 49 | getStatus(); 50 | }) 51 | .catch(async (err) => { 52 | //if error, display the custom error message from the server with toastify. 53 | await toast.error(`${err.response.data}`, {}); 54 | }); 55 | 56 | //after the try operation, stop the button animation 57 | setLoggingIn(false); 58 | } catch (error) { 59 | console.log('ERROR' + error); 60 | setLoggingIn(false); 61 | } 62 | }; 63 | 64 | //toggle the password visibility 65 | const togglePassword = () => { 66 | setPasswordVisible(!passwordVisible); 67 | }; 68 | 69 | return ( 70 | <> 71 |
72 |
73 |
74 |

Welcome Back!

75 | Sign in to continue 76 |
77 | 78 | {/*
79 | astronaut 80 |
81 |
*/} 82 | 83 |
84 |
85 | 86 | setUsername(e.target.value)} 94 | /> 95 |
96 | 97 |
98 | 99 | setPassword(e.target.value)} 107 | /> 108 |
109 | {passwordVisible ? ( 110 | 111 | ) : ( 112 | 113 | )} 114 |
115 | 116 | 117 | Forgot Password? 118 | 119 |
120 | 121 | 124 |
125 | 126 | Don't have an account? - Sign Up 127 | 128 |
129 |
130 | 131 | 132 | 133 | ); 134 | }; 135 | 136 | export default Login; 137 | -------------------------------------------------------------------------------- /src/pages/LandingPage/SectionOne/SectionOne.jsx: -------------------------------------------------------------------------------- 1 | import "./SectionOne.scss"; 2 | import { Link } from "react-router-dom"; 3 | import BitcoinSVG from "../../../assets/mockups/Bitcoin.svg"; 4 | import bitcoin from "../../../assets/landingLogos/bitcoin.png"; 5 | import ethereum from "../../../assets/landingLogos/ethereum.png"; 6 | import tether from "../../../assets/landingLogos/tether.png"; 7 | import dogecoin from "../../../assets/landingLogos/dogecoin.png"; 8 | import binanceCoin from "../../../assets/landingLogos/binance-coin.png"; 9 | import cardano from "../../../assets/landingLogos/cardano.png"; 10 | import usdCoin from "../../../assets/landingLogos/usd-coin.png"; 11 | import uniswap from "../../../assets/landingLogos/uniswap.png"; 12 | import bitcoinCash from "../../../assets/landingLogos/bitcoin-cash.png"; 13 | import xrp from "../../../assets/landingLogos/xrp.png"; 14 | import tron from "../../../assets/landingLogos/tron.png"; 15 | import ethereumClassic from "../../../assets/landingLogos/ethereum-classic.png"; 16 | import litecoin from "../../../assets/landingLogos/litecoin.png"; 17 | import dash from "../../../assets/landingLogos/dash.png"; 18 | import polkadot from "../../../assets/landingLogos/polkadot-new.png"; 19 | import Nav from "../../../components/TopNav/Nav"; 20 | 21 | const SectionOne = () => { 22 | return ( 23 |
24 |
98 | ); 99 | }; 100 | 101 | export default SectionOne; 102 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Wallet/Transactions/Transactions.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $borderColor: rgb(158, 158, 158); 8 | $orange: #ef5116; 9 | $navyBlue: #262946; 10 | 11 | .transactionsComponent { 12 | display: flex; 13 | justify-content: center; 14 | min-height: 100vh; 15 | @media (max-width: 768px) { 16 | margin-bottom: 10rem; 17 | } 18 | 19 | @media (min-width: 768px) { 20 | height: 95vh; 21 | width: 100%; 22 | display: flex; 23 | align-items: center; 24 | justify-content: flex-start; 25 | flex-direction: column; 26 | position: relative; 27 | } 28 | 29 | .container { 30 | display: flex; 31 | width: 100%; 32 | flex-direction: column; 33 | align-items: center; 34 | padding: 0 1rem; 35 | 36 | @media (min-width: 768px) { 37 | max-width: 900px; 38 | width: 100%; 39 | padding: 2rem; 40 | align-items: center; 41 | @media (min-width: 1024px) { 42 | align-items: flex-start; 43 | } 44 | justify-content: center; 45 | } 46 | 47 | .loading { 48 | position: absolute; 49 | top: 45%; 50 | left: 50%; 51 | transform: translate(-50%, -50%); 52 | } 53 | 54 | .header { 55 | color: $textColor; 56 | display: flex; 57 | text-align: left; 58 | align-items: center; 59 | justify-content: space-between; 60 | font-size: 1.25rem; 61 | width: 100%; 62 | @media (min-width: 768px) and (max-width: 1023px) { 63 | width: 90%; 64 | } 65 | margin-bottom: -1rem; 66 | 67 | .backEmoji { 68 | display: flex; 69 | align-items: center; 70 | justify-content: center; 71 | margin-right: 1rem; 72 | } 73 | 74 | p { 75 | display: flex; 76 | align-self: center; 77 | justify-content: center; 78 | justify-self: center; 79 | width: 100%; 80 | margin-left: -1rem; 81 | } 82 | } 83 | 84 | .transactionsContainer { 85 | width: 100%; 86 | @media (min-width: 768px) and (max-width: 1023px) { 87 | width: 90%; 88 | } 89 | padding: 1rem; 90 | } 91 | 92 | .noWalletTransaction { 93 | display: flex; 94 | align-self: center; 95 | text-align: center; 96 | justify-content: center; 97 | } 98 | 99 | .transactionsHeader { 100 | color: $textColor; 101 | display: flex; 102 | align-self: flex-start; 103 | @media (min-width: 481px) { 104 | align-self: center; 105 | } 106 | margin-top: 2rem; 107 | font-size: 1.15rem; 108 | margin-bottom: 0.5rem; 109 | } 110 | 111 | .walletTransaction { 112 | display: flex; 113 | align-items: center; 114 | justify-content: space-between; 115 | width: 100%; 116 | margin-top: -0.5rem; 117 | transition: all 0.2s ease-in; 118 | 119 | .transactionIcon { 120 | padding: 0.55rem; 121 | border-radius: 5px; 122 | font-weight: bold; 123 | font-size: 1rem; 124 | display: flex; 125 | align-items: center; 126 | justify-content: center; 127 | } 128 | 129 | .memoAndDate { 130 | margin-left: 1rem; 131 | display: flex; 132 | flex-direction: column; 133 | text-transform: capitalize; 134 | margin-right: auto; 135 | 136 | p:nth-child(1) { 137 | font-size: 1rem; 138 | color: $textColor; 139 | } 140 | 141 | p:nth-child(2) { 142 | font-size: 0.9rem; 143 | @media (min-width: 768px) { 144 | font-size: 0.95rem; 145 | } 146 | margin-top: -0.75rem; 147 | color: $subColor; 148 | width: 150px; 149 | white-space: nowrap; 150 | overflow: hidden; 151 | text-overflow: ellipsis; 152 | } 153 | } 154 | 155 | .value { 156 | min-width: 4rem; 157 | color: $textColor; 158 | font-size: 1rem; 159 | margin-left: auto; 160 | text-align: right; 161 | } 162 | } 163 | 164 | .walletTransaction:hover { 165 | cursor: pointer; 166 | transform: translateY(-5%); 167 | } 168 | 169 | .sortTransactions { 170 | display: flex; 171 | width: 100%; 172 | align-items: center; 173 | justify-content: center; 174 | margin-bottom: 1rem; 175 | 176 | .allTransactions, 177 | .incomeTransactions, 178 | .allTransactionsAmount { 179 | margin-right: 0.5rem; 180 | border-radius: 5px; 181 | padding: 0 0.5rem; 182 | color: $subColor; 183 | } 184 | 185 | .expenseTransactions { 186 | border-radius: 5px; 187 | padding: 0 0.5rem; 188 | color: $subColor; 189 | } 190 | 191 | .active { 192 | color: $textColor; 193 | font-weight: bold; 194 | } 195 | } 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /src/pages/ResetPassword/Reset.jsx: -------------------------------------------------------------------------------- 1 | import './Reset.scss'; 2 | // import astronaut from '../../assets/logo/astronaut-ingravity.svg'; 3 | import { useState } from 'react'; 4 | import { RotateSpinner } from 'react-spinners-kit'; 5 | import { BsEyeFill, BsEyeSlashFill } from 'react-icons/bs'; 6 | import { useHistory } from 'react-router-dom'; 7 | import useTitle from '../../utils/useTitle' 8 | import axios from 'axios'; 9 | import { ToastContainer, toast } from 'react-toastify'; 10 | import 'react-toastify/dist/ReactToastify.css'; 11 | 12 | const Reset = () => { 13 | const history = useHistory(); 14 | const [password, setPassword] = useState(''); 15 | const [confirmPassword, setConfirmPassword] = useState(''); 16 | const [passwordVisible, setPasswordVisible] = useState(false); 17 | const [passwordConfirmVisible, setPasswordConfirmVisible] = useState(false); 18 | const [resetting, setResetting] = useState(false); 19 | const apiURL = 'https://api.apexwallet.app/v1'; 20 | const queryString = window.location.search; 21 | const urlParams = new URLSearchParams(queryString); 22 | const token = urlParams.get('token'); 23 | 24 | if (token === null) { 25 | history.push('/forgot-password'); 26 | } 27 | 28 | useTitle('Reset Password | Apexwallet'); 29 | 30 | const handleReset = async (e) => { 31 | e.preventDefault(); 32 | 33 | if (password !== confirmPassword) { 34 | toast.error('Passwords do not match', {}); 35 | } else { 36 | setResetting(true); 37 | const user = { password, confirmPassword, token }; 38 | 39 | try { 40 | await axios 41 | .put(`${apiURL}/auth/reset-password/`, user, { withCredentials: true }) 42 | .then(async (res) => { 43 | if (res.status === 200) { 44 | await toast.success(`${res.data}`, {}); 45 | history.push('/login'); 46 | } 47 | }) 48 | .catch(async (err) => { 49 | //if error, display the custom error message from the server with toastify. 50 | await toast.error(`${err.response.data}`, {}); 51 | }); 52 | 53 | setResetting(false); 54 | } catch (error) { 55 | await toast.error(`${error}`, {}); 56 | 57 | setResetting(false); 58 | } 59 | } 60 | }; 61 | 62 | const togglePassword = () => { 63 | setPasswordVisible(!passwordVisible); 64 | }; 65 | 66 | const togglePasswordConfirm = () => { 67 | setPasswordConfirmVisible(!passwordConfirmVisible); 68 | }; 69 | 70 | return ( 71 | <> 72 |
73 |
74 |
75 |

Reset Password

76 | 77 | Please enter your new password 78 | 79 |
80 | 81 | {/*
82 | astronaut 83 |
84 |
*/} 85 | 86 |
87 |
88 | 89 | setPassword(e.target.value)} 98 | /> 99 |
100 | {passwordVisible ? ( 101 | 102 | ) : ( 103 | 104 | )} 105 |
106 |
107 | 108 |
109 | 110 | setConfirmPassword(e.target.value)} 119 | /> 120 |
121 | {passwordConfirmVisible ? ( 122 | 123 | ) : ( 124 | 125 | )} 126 |
127 |
128 | 129 | 132 |
133 |
134 |
135 | 136 | 137 | 138 | ); 139 | }; 140 | 141 | export default Reset; 142 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/StatusModal/Modal.jsx: -------------------------------------------------------------------------------- 1 | import './Modal.scss'; 2 | import { useState } from 'react'; 3 | import Backdrop from '@material-ui/core/Backdrop'; 4 | import Modal from '@material-ui/core/Modal'; 5 | import Fade from '@material-ui/core/Fade'; 6 | import { GoUnverified, GoVerified } from 'react-icons/go'; 7 | import notAllowedIcon from '../../../../assets/logo/appl-274c-160.png'; 8 | import allowedIcon from '../../../../assets/logo/appl-2705-160.png'; 9 | import moneyMouth from '../../../../assets/logo/moneyMouth.png'; 10 | import { FiChevronRight } from 'react-icons/fi'; 11 | import axios from 'axios'; 12 | import { toast } from 'react-toastify'; 13 | import 'react-toastify/dist/ReactToastify.css'; 14 | 15 | export default function StatusModal({ user }) { 16 | const [openModal, setOpenModal] = useState(false); 17 | const handleOpenModal = () => setOpenModal(true); 18 | const handleCloseModal = () => setOpenModal(false); 19 | const [sending, setSending] = useState(false); 20 | const apiURL = 'https://api.apexwallet.app/v1'; 21 | 22 | const handleNewVerification = async () => { 23 | setSending(true); 24 | try { 25 | await axios 26 | .post(`${apiURL}/auth/resend-verification-link`) 27 | .then((res) => { 28 | if (res.status === 200) { 29 | toast.success(`${res.data}`, { 30 | hideProgressBar: true, 31 | }); 32 | handleCloseModal(); 33 | setSending(false); 34 | } 35 | }) 36 | .catch(async (err) => { 37 | await toast.error(`${err.response.data}`, {}); 38 | setSending(false); 39 | }); 40 | } catch (error) { 41 | console.log('Error: ' + error); 42 | setSending(false); 43 | } 44 | }; 45 | 46 | return ( 47 |
48 |
49 |
{user.isActive === true ? : }
50 |

Status

51 | 52 | {user.isActive === true ? 'Verified' : 'Unverified'} 53 | 54 |
55 | 56 |
57 |
58 | 67 | 68 |
69 |
70 |
71 | {user.isActive === true ? : } 72 |
73 |
74 |
75 | not allowed 79 |

Open a wallet

80 |
81 |
82 | not allowed 86 |

Buy and Sell crypto

87 |
88 |
89 | not allowed 93 |

Send and Receive crypto

94 |
95 |
96 | not allowed 100 |

Coin Conversion

101 |
102 |
103 | not allowed 104 |

Track assets

105 |
106 |
107 | not allowed 111 |

Coin Locking (TBA)

112 |
113 | 114 |
user.isActive === false && handleNewVerification()} 116 | className="privilegesNote" 117 | > 118 | {user.isActive === true ? ( 119 | <> 120 |

121 | Account verified! You can do as much as you like 122 | money mouth 123 |

124 | 125 | ) : ( 126 | <> 127 |

128 | {sending 129 | ? 'Sending...' 130 | : 'Account unverified! Click here to resend a verification email'} 131 |

132 | 133 | )} 134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 | ); 142 | } 143 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Account/PasswordModal/PasswordModal.jsx: -------------------------------------------------------------------------------- 1 | import './PasswordModal.scss'; 2 | import { useState } from 'react'; 3 | import Backdrop from '@material-ui/core/Backdrop'; 4 | import Modal from '@material-ui/core/Modal'; 5 | import Fade from '@material-ui/core/Fade'; 6 | import axios from 'axios'; 7 | import { RotateSpinner } from 'react-spinners-kit'; 8 | import { ToastContainer, toast } from 'react-toastify'; 9 | import 'react-toastify/dist/ReactToastify.css'; 10 | import { IoClose } from 'react-icons/io5'; 11 | import { FiChevronRight } from 'react-icons/fi'; 12 | 13 | export default function PasswordModal({ user }) { 14 | const [openModal, setOpenModal] = useState(false); 15 | const handleOpenModal = () => setOpenModal(true); 16 | const handleCloseModal = () => { 17 | setOpenModal(false); 18 | setCurrentPassword(''); 19 | setConfirmCurrentPassword(''); 20 | setNewPassword(''); 21 | }; 22 | const [currentPassword, setCurrentPassword] = useState(''); 23 | const [confirmCurrentPassword, setConfirmCurrentPassword] = useState(''); 24 | const [newPassword, setNewPassword] = useState(''); 25 | const [changingPassword, setChangingPassword] = useState(false); 26 | 27 | const passwordChangeEndpoint = 'https://api.apexwallet.app/v1/user/change-password'; 28 | 29 | //change the user's password 30 | const handlePasswordChange = async (e) => { 31 | e.preventDefault(); 32 | setChangingPassword(true); 33 | const userPassword = { currentPassword, confirmCurrentPassword, newPassword }; 34 | try { 35 | if (currentPassword !== confirmCurrentPassword) { 36 | toast.error('Passwords do not match', { 37 | 38 | }); 39 | setChangingPassword(false); 40 | } else { 41 | await axios 42 | .put(passwordChangeEndpoint, userPassword) 43 | .then((res) => { 44 | if (res.status === 200) { 45 | toast.success(`${res.data}`, { 46 | 47 | }); 48 | handleCloseModal(); 49 | setChangingPassword(false); 50 | } 51 | }) 52 | .catch(async (err) => { 53 | toast.error(`${err.response.data}`, { 54 | 55 | }); 56 | setChangingPassword(false); 57 | }); 58 | } 59 | } catch (error) { 60 | console.log('Error: ' + error); 61 | setChangingPassword(false); 62 | } 63 | }; 64 | 65 | return ( 66 |
67 |
68 |
69 |

Password

70 |

**********

71 |
72 |
73 | 74 |
75 |
76 | 84 | 85 |
86 |
87 | 94 |

Change Password

95 |
96 |
97 | setCurrentPassword(e.target.value)} 106 | /> 107 |
108 | 109 |
110 | setConfirmCurrentPassword(e.target.value)} 119 | /> 120 |
121 | 122 |
123 | setNewPassword(e.target.value)} 132 | /> 133 |
134 | 135 | 138 |
139 |
140 |
141 |
142 |
143 | 144 |
145 | ); 146 | } 147 | -------------------------------------------------------------------------------- /src/pages/SignUp/SignUp.jsx: -------------------------------------------------------------------------------- 1 | import './SignUp.scss'; 2 | // import astronaut from '../../assets/logo/astronaut-ingravity.svg'; 3 | import { useState, useContext } from 'react'; 4 | import { RotateSpinner } from 'react-spinners-kit'; 5 | import { BsEyeFill, BsEyeSlashFill } from 'react-icons/bs'; 6 | import { Link } from 'react-router-dom'; 7 | import { useHistory } from 'react-router-dom'; 8 | import useTitle from '../../utils/useTitle'; 9 | import AuthContext from '../../components/Auth/AuthContext'; 10 | import axios from 'axios'; 11 | import { ToastContainer, toast } from 'react-toastify'; 12 | import 'react-toastify/dist/ReactToastify.css'; 13 | 14 | const SignUp = () => { 15 | const history = useHistory(); 16 | const { getLoggedIn } = useContext(AuthContext); 17 | const [email, setEmail] = useState(''); 18 | const [username, seUserName] = useState(''); 19 | const [password, setPassword] = useState(''); 20 | const [passwordVisible, setPasswordVisible] = useState(false); 21 | const [signingIn, setSigningIn] = useState(false); 22 | const apiURL = 'https://api.apexwallet.app/v1'; 23 | useTitle('SignUp | Apexwallet'); 24 | 25 | //handle the signup request from the form 26 | const handleSignUp = async (e) => { 27 | e.preventDefault(); 28 | 29 | //animate the button with this state 30 | setSigningIn(true); 31 | 32 | //send a post request to the server 33 | try { 34 | const user = { username, email, password }; 35 | 36 | //honestly, axios makes life easier. 37 | await axios 38 | .post(`${apiURL}/auth/signup`, user, { withCredentials: true }) 39 | // OKAY THIS SH*T WORKS 🚀 40 | .then( 41 | //Using axios, check the res response and look for the status 42 | (res) => { 43 | async function getStatus() { 44 | //wait to see if the status exists 45 | await res.status; 46 | //if the status is 201 (created), then refresh the getLoggedIn() 47 | //so the loggedIn value can change from false to true in the AuthContext 48 | if (res.status === 201) { 49 | await getLoggedIn(); 50 | await history.push('/dashboard'); 51 | } 52 | } 53 | //call the function. 54 | getStatus(); 55 | } 56 | ) 57 | //if there is an error from the server, display it 58 | .catch(async (err) => { 59 | //toastify ROCKS!! 60 | await toast.error(`${err.response.data}`, {}); 61 | }); 62 | setSigningIn(false); 63 | } catch (error) { 64 | console.log('ERROR: ' + error.response); 65 | setSigningIn(false); 66 | } 67 | }; 68 | 69 | //toggle the password visibility 70 | const togglePassword = () => { 71 | setPasswordVisible(!passwordVisible); 72 | }; 73 | 74 | return ( 75 | <> 76 |
77 |
78 |
79 |

Welcome

80 | Sign up to start simulating! 81 |
82 | 83 | {/*
84 | astronaut 85 |
86 |
*/} 87 | 88 |
89 |
90 | 91 | seUserName(e.target.value)} 100 | /> 101 |
102 | 103 |
104 | 105 | setEmail(e.target.value)} 113 | /> 114 |
115 | 116 |
117 | 118 | setPassword(e.target.value)} 127 | /> 128 |
129 | {passwordVisible ? ( 130 | 131 | ) : ( 132 | 133 | )} 134 |
135 |
136 | 137 | 140 |
141 | 142 | Already have an account? - Sign In 143 | 144 |
145 |
146 | 147 | 148 | 149 | ); 150 | }; 151 | 152 | export default SignUp; 153 | -------------------------------------------------------------------------------- /src/components/TradeModal/SendxReceive/Receive.jsx: -------------------------------------------------------------------------------- 1 | import { IoClose } from 'react-icons/io5'; 2 | import './Receive.scss'; 3 | import { RotateSpinner } from 'react-spinners-kit'; 4 | import { toast } from 'react-toastify'; 5 | import 'react-toastify/dist/ReactToastify.css'; 6 | import MenuItem from '@material-ui/core/MenuItem'; 7 | import Select from '@material-ui/core/Select'; 8 | import { MdContentCopy } from 'react-icons/md'; 9 | import QRCode from 'qrcode.react'; 10 | import { useState, useEffect } from 'react'; 11 | 12 | const ReceiveCoins = ({ modalUpReceive, setModalUpReceive, coin, setCoin, coinInfo, user, wallet, address }) => { 13 | const handleChange = (event) => { 14 | setCoin(event.target.value); 15 | }; 16 | 17 | const [userCoins, setUserCoins] = useState(null); 18 | 19 | useEffect(() => { 20 | if (wallet !== null) { 21 | let coinArr = []; 22 | 23 | wallet.coins.forEach((wallet) => { 24 | coinArr.push(wallet.coin); 25 | }); 26 | 27 | setUserCoins(coinArr); 28 | } 29 | }, [wallet]); 30 | 31 | const receiveFunction = () => { 32 | if (coinInfo !== null && user !== null && wallet !== null && address !== null) { 33 | return ( 34 | <> 35 |

36 | Receive{' '} 37 | {coinInfo.name ? coinInfo.name : coin} 38 |

39 |
40 |
41 |
42 | {userCoins.includes(coinInfo.id) ? ( 43 | 51 | ) : null} 52 | 53 | {userCoins.includes(coinInfo.id) &&

{coinInfo.symbol.toUpperCase()} Address

} 54 |
55 | 56 | {userCoins.includes(coinInfo.id) 57 | ? address 58 | : `You don't have ${coinInfo.name} yet.`} 59 | 60 |
{ 62 | navigator.clipboard.writeText(address); 63 | toast.success(`Copied ${coinInfo.symbol.toUpperCase()} Address`, { 64 | hideProgressBar: true, 65 | }); 66 | }} 67 | className="icon" 68 | > 69 | {userCoins.includes(coinInfo.id) && } 70 |
71 |
72 |
73 |
74 | 96 | 121 |
122 | 123 | ); 124 | } else { 125 | return ( 126 |
127 | 128 |
129 | ); 130 | } 131 | }; 132 | 133 | return ( 134 |
135 |
setModalUpReceive(!modalUpReceive)}> 136 | 137 |
138 | 139 | {/* Receive Functions */} 140 |
{receiveFunction()}
141 |
142 | ); 143 | }; 144 | 145 | export default ReceiveCoins; 146 | -------------------------------------------------------------------------------- /src/pages/Login/Login.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | 10 | .login { 11 | display: flex; 12 | align-items: center; 13 | justify-content: center; 14 | margin-bottom: 3rem; 15 | @media (max-width: 768px) and (orientation: landscape) { 16 | margin-bottom: 5rem; 17 | } 18 | 19 | @media (min-width: 768px) { 20 | height: 95vh; 21 | display: flex; 22 | align-items: center; 23 | justify-content: center; 24 | } 25 | 26 | .assets { 27 | position: absolute; 28 | z-index: -2; 29 | top: -10%; 30 | left: -15%; 31 | @media (max-width: 481px) { 32 | top: -20%; 33 | left: -20%; 34 | } 35 | @media (min-width: 768px) and (max-width: 1024px) { 36 | top: -10%; 37 | left: -20%; 38 | } 39 | 40 | img { 41 | position: absolute; 42 | height: 4rem; 43 | top: 50%; 44 | left: 100%; 45 | transform: rotate(-20deg) scaleX(-1); 46 | color: $textColor; 47 | animation: astronautAnim 5s ease-in-out infinite forwards; 48 | @media (max-width: 481px) { 49 | height: 3rem; 50 | } 51 | @media (max-width: 768px) and (orientation: landscape) { 52 | top: 30%; 53 | } 54 | 55 | @keyframes astronautAnim { 56 | 0% { 57 | transform: translateY(0%) rotate(-20deg) scaleX(-1); 58 | } 59 | 60 | 25% { 61 | transform: translateY(10%) rotate(-20deg) scaleX(-1); 62 | } 63 | 64 | 50% { 65 | transform: translateY(-10%) rotate(-20deg) scaleX(-1); 66 | } 67 | 68 | 75% { 69 | transform: translateY(10%) rotate(-20deg) scaleX(-1); 70 | } 71 | 72 | 100% { 73 | transform: translateY(0%) rotate(-20deg) scaleX(-1); 74 | } 75 | } 76 | } 77 | 78 | .circle { 79 | height: 30rem; 80 | width: 30rem; 81 | opacity: 1; 82 | border-radius: 100%; 83 | background: linear-gradient(to left, $blue, #b8c4f4); 84 | animation: circleAnim 5s ease-in-out infinite forwards; 85 | @keyframes circleAnim { 86 | from { 87 | transform: rotate(0deg); 88 | } 89 | to { 90 | transform: rotate(360deg); 91 | } 92 | } 93 | @media (max-width: 768px) { 94 | height: 20rem; 95 | width: 20rem; 96 | } 97 | @media (max-width: 481px) { 98 | height: 16rem; 99 | width: 16rem; 100 | } 101 | } 102 | } 103 | 104 | .container { 105 | display: flex; 106 | flex-direction: column; 107 | align-items: center; 108 | max-width: 30rem; 109 | width: 100%; 110 | margin-top: 2rem; 111 | @media (min-width: 768px){ 112 | margin-top: -2rem; 113 | } 114 | 115 | .header { 116 | color: $textColor; 117 | display: flex; 118 | flex-direction: column; 119 | 120 | p { 121 | text-align: center; 122 | font-size: 1.75rem; 123 | font-weight: bold; 124 | } 125 | 126 | span { 127 | text-align: center; 128 | opacity: 0.8; 129 | margin-top: -1rem; 130 | } 131 | } 132 | 133 | form { 134 | width: 100%; 135 | display: flex; 136 | flex-direction: column; 137 | align-items: center; 138 | 139 | .username, 140 | .password { 141 | display: flex; 142 | flex-direction: column; 143 | color: $textColor; 144 | width: 90%; 145 | max-width: 20rem; 146 | position: relative; 147 | 148 | label { 149 | margin-top: 1.5rem; 150 | margin-bottom: 0.5rem; 151 | color: $textColor; 152 | } 153 | 154 | input { 155 | font-size: 1.15rem; 156 | outline: none; 157 | border-radius: 5px; 158 | border: 1px solid $subColor; 159 | padding: 0.75rem; 160 | background: transparent; 161 | color: $textColor; 162 | transition: all 0.2s ease-in; 163 | } 164 | @media (min-width: 768px) { 165 | input:hover { 166 | border: 1px solid $blue; 167 | } 168 | } 169 | input:focus { 170 | border: 1px solid $lightBlue; 171 | } 172 | 173 | .eyeIcons { 174 | position: absolute; 175 | top: 52%; 176 | right: 5%; 177 | cursor: pointer; 178 | font-size: 1.15rem; 179 | } 180 | } 181 | 182 | button { 183 | margin-top: 1.5rem; 184 | width: 85%; 185 | max-width: 20rem; 186 | height: 3rem; 187 | border: none; 188 | border-radius: 5px; 189 | background: $blue; 190 | font-size: 1.15rem; 191 | font-weight: bold; 192 | color: $mainColor; 193 | transition: all 0.2s ease-in; 194 | display: flex; 195 | align-items: center; 196 | justify-content: center; 197 | } 198 | button:hover { 199 | cursor: pointer; 200 | transform: translateY(-10%); 201 | } 202 | } 203 | .forgotPass { 204 | text-decoration: none; 205 | color: $subColor; 206 | margin-top: 0.5rem; 207 | font-size: 0.95rem; 208 | margin-left: auto; 209 | transition: all 0.3s ease-in; 210 | } 211 | 212 | .forgotPass:hover { 213 | text-decoration: underline; 214 | color: $textColor; 215 | } 216 | 217 | .newUser { 218 | text-decoration: none; 219 | color: $subColor; 220 | margin-top: 1.5rem; 221 | font-size: 1.05rem; 222 | 223 | span { 224 | transition: all 0.3s ease-in; 225 | font-weight: bold; 226 | } 227 | span:hover { 228 | text-decoration: underline; 229 | color: $textColor; 230 | } 231 | } 232 | } 233 | } 234 | -------------------------------------------------------------------------------- /src/components/Coin/TradeTab/TradeTab.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(170, 170, 170); 10 | 11 | .tradeTab { 12 | top: 0; 13 | left: 0; 14 | display: flex; 15 | flex-direction: column; 16 | align-items: center; 17 | transition: all 0.7s ease-in; 18 | 19 | .nav { 20 | display: flex; 21 | width: 100%; 22 | justify-content: space-evenly; 23 | font-size: 1.25rem; 24 | 25 | div { 26 | border: 1px solid $borderColor; 27 | padding: 1rem; 28 | width: 100%; 29 | display: flex; 30 | align-items: center; 31 | justify-content: center; 32 | background: rgb(230, 230, 230); 33 | font-weight: bold; 34 | } 35 | 36 | div.active { 37 | color: $blue; 38 | border-bottom: none; 39 | background: $mainColor; 40 | } 41 | } 42 | 43 | .form { 44 | width: 100%; 45 | display: flex; 46 | flex-direction: column; 47 | align-items: center; 48 | height: 100%; 49 | overflow: auto; 50 | position: relative; 51 | 52 | .input { 53 | width: 90%; 54 | display: flex; 55 | align-items: center; 56 | justify-content: center; 57 | color: $textColor; 58 | height: 3rem; 59 | position: relative; 60 | top: 10%; 61 | @media (max-width: 767px) and (orientation: portrait) { 62 | top: 25%; 63 | } 64 | 65 | @media (max-width: 812px) and (orientation: landscape) { 66 | top: -5%; 67 | } 68 | 69 | @keyframes vibrateInput { 70 | 0% { 71 | transform: translateX(-10%); 72 | } 73 | 20% { 74 | transform: translateX(10%); 75 | } 76 | 40% { 77 | transform: translateX(-10%); 78 | } 79 | 60% { 80 | transform: translateX(10%); 81 | } 82 | 80% { 83 | transform: translateX(-10%); 84 | } 85 | 100% { 86 | transform: translateX(0%); 87 | } 88 | } 89 | 90 | input { 91 | height: 2rem; 92 | background: none; 93 | border: none; 94 | outline: none; 95 | font-size: 3rem; 96 | color: $textColor; 97 | background: transparent; 98 | width: 100%; 99 | padding: 1rem; 100 | text-align: center; 101 | transition: 0.5s; 102 | } 103 | input::-webkit-outer-spin-button, 104 | input::-webkit-inner-spin-button { 105 | /* display: none; <- Crashes Chrome on hover */ 106 | -webkit-appearance: none; 107 | margin: 0; /* <-- Apparently some margin are still there even though it's hidden */ 108 | } 109 | 110 | input[type='number'] { 111 | -moz-appearance: textfield; /* Firefox */ 112 | } 113 | span { 114 | position: absolute; 115 | left: 0; 116 | font-size: 1.35rem; 117 | color: $subColor; 118 | background: $mainColor; 119 | } 120 | 121 | div { 122 | font-size: 1.75rem; 123 | color: $textColor; 124 | cursor: pointer; 125 | margin-left: 1rem; 126 | position: absolute; 127 | right: 0; 128 | } 129 | } 130 | 131 | .amountYouGet { 132 | position: absolute; 133 | font-size: 1rem; 134 | bottom: 63%; 135 | } 136 | 137 | @keyframes slideUp { 138 | from { 139 | opacity: 0; 140 | transform: translateY(20%); 141 | } 142 | 143 | to { 144 | opacity: 1; 145 | transform: translateY(0); 146 | } 147 | } 148 | 149 | .selectBalanceAndBTN { 150 | width: 90%; 151 | display: flex; 152 | flex-direction: column; 153 | position: absolute; 154 | bottom: 5%; 155 | @media (max-width: 812px) and (orientation: landscape) { 156 | bottom: -12%; 157 | } 158 | 159 | .selectCoin { 160 | height: 4rem; 161 | width: 100%; 162 | display: flex; 163 | align-items: center; 164 | font-size: 1.33rem; 165 | margin-bottom: 1rem; 166 | } 167 | 168 | .coinAndWalletTab { 169 | width: 100%; 170 | display: flex; 171 | align-items: center; 172 | flex-direction: column; 173 | 174 | div:nth-child(1) { 175 | border: 1px solid $borderColor; 176 | border-radius: 5px; 177 | width: 100%; 178 | display: flex; 179 | justify-content: space-between; 180 | align-items: center; 181 | 182 | p { 183 | margin-left: 1rem; 184 | font-size: 1.25rem; 185 | } 186 | 187 | span:nth-child(2) { 188 | margin-right: 1rem; 189 | font-size: 1.33rem; 190 | } 191 | } 192 | 193 | button { 194 | display: flex; 195 | align-items: center; 196 | justify-content: center; 197 | height: 4rem; 198 | width: 100%; 199 | font-size: 1.35rem; 200 | padding: 1rem; 201 | border-radius: 5px; 202 | outline: none; 203 | border: none; 204 | color: $mainColor; 205 | font-weight: bold; 206 | background: $blue; 207 | transition: 0.5s; 208 | margin-top: 1rem; 209 | } 210 | 211 | button:hover { 212 | cursor: pointer; 213 | background: $lightBlue; 214 | } 215 | 216 | button[disabled] { 217 | background: $borderColor; 218 | } 219 | 220 | button[disabled]:hover { 221 | cursor: not-allowed; 222 | } 223 | 224 | div:nth-child(3) { 225 | margin-top: 1rem; 226 | width: 90%; 227 | transition: 0.5s; 228 | padding: 1rem; 229 | color: $textColor; 230 | height: 1.35rem; 231 | border-radius: 5px; 232 | margin-bottom: 1rem; 233 | display: flex; 234 | align-items: center; 235 | justify-content: space-between; 236 | font-size: 1rem; 237 | } 238 | } 239 | } 240 | } 241 | } 242 | 243 | .loading { 244 | position: absolute; 245 | top: 45%; 246 | left: 50%; 247 | transform: translate(-50%, -50%); 248 | } 249 | -------------------------------------------------------------------------------- /src/pages/Portfolio/Dashboard/CompleteDashboard/CompleteDashboard.jsx: -------------------------------------------------------------------------------- 1 | import { RotateSpinner } from 'react-spinners-kit'; 2 | import { RiNotification4Fill } from 'react-icons/ri'; 3 | import coinsSVG from '../../../../assets/logo/coinsSVG.svg'; 4 | import { Link } from 'react-router-dom'; 5 | import moment from 'moment'; 6 | import { useState, useEffect } from 'react'; 7 | import Messages from '../Messages/Messages'; 8 | 9 | const CompleteDashboard = (user, wallet, watchList, news) => { 10 | const [hasNotifications, setHasNotifications] = useState(undefined); 11 | const [modalUpMessages, setModalUpMessages] = useState(false); 12 | const [messageModal, setMessageModal] = useState(false); 13 | 14 | useEffect(() => { 15 | const checkNotifications = () => { 16 | if (user !== null) { 17 | const hasMessagesCheck = user.messages.filter((message) => message.isRead === false); 18 | if (hasMessagesCheck.length > 0) { 19 | setHasNotifications(true); 20 | } else setHasNotifications(false); 21 | } 22 | }; 23 | 24 | checkNotifications(); 25 | }, [user]); 26 | 27 | const watchListFunction = () => { 28 | let length = watchList.length; 29 | if (length === 0) { 30 | return ( 31 |
32 |
33 | coins 34 |

Find an assortment of highlights and get a touch of each crypto to go for yourself.

35 | 36 |

See all assets

37 |
38 |
39 |
40 | ); 41 | } else if (length > 0) { 42 | return ( 43 |
44 | {watchList.map((watchList, index) => ( 45 | 46 | {watchList.name} 47 |
48 |

{watchList.name}

49 |

{watchList.symbol.toUpperCase()}

50 |
51 |
52 |

${watchList.price}

53 |

58 | {watchList.percentChange < 0 ? '' : '+'} 59 | {Math.round((watchList.percentChange + Number.EPSILON) * 100) / 100}% 60 |

61 |
62 | 63 | ))} 64 |
65 | ); 66 | } 67 | }; 68 | 69 | const newsFunction = () => { 70 | let newsLength = 10; 71 | return news.slice(0, newsLength).map((news) => ( 72 | 73 |
74 |

{news.title}

75 |

76 | {news.source_info.name} {' '} 77 | {moment.unix(news.published_on).startOf('hour').fromNow()} 78 |

79 |
80 | {news.source} 81 |
82 | )); 83 | }; 84 | 85 | if (news !== null && watchList !== null && user !== null && user.isActive === false) { 86 | return ( 87 | <> 88 |
89 |
90 |

Welcome to Apex!

91 |

92 | Hey {user.name ? user.name : user.username} 🙌 , 93 | thanks for signing up! We're glad you made it here. 94 |

95 |
96 | 97 |
98 |

Get started!

99 |

100 | Right now you can only check live prices and watch you favorite coins. To get full access, 101 | please verify your account with the email we sent you. 102 |

103 |
104 |
105 | 106 |

Watchlist

107 | {watchListFunction()} 108 |

News

109 | {newsFunction()} 110 | 111 | ); 112 | } else if ( 113 | news !== null && 114 | watchList !== null && 115 | user !== null && 116 | wallet !== null && 117 | user.isActive === true 118 | ) { 119 | return ( 120 | <> 121 |
122 |
123 |

Available Balance

124 |

125 | ${parseFloat(wallet.balance).toFixed(2)} 126 |

127 |
128 | 129 |
130 | {hasNotifications && } 131 | setModalUpMessages(true)} /> 132 | 139 |
140 |
{ 143 | setModalUpMessages(false); 144 | setMessageModal(false); 145 | }} 146 | /> 147 |
148 | 149 |

Watchlist

150 | {watchListFunction()} 151 |

News

152 | {newsFunction()} 153 | 154 | ); 155 | } else { 156 | return ( 157 |
158 | 159 |
160 | ); 161 | } 162 | }; 163 | 164 | export default CompleteDashboard; 165 | -------------------------------------------------------------------------------- /src/components/TradeModal/BuyCoins/BuyCoins.scss: -------------------------------------------------------------------------------- 1 | $mainColor: #f1f2f4; 2 | $subColor: #5d5c5f; 3 | $textColor: #080809; 4 | $subTextColor: #cbbaba; 5 | $blue: #0066ff; 6 | $lightBlue: #64b5f6; 7 | $orange: #ef5116; 8 | $navyBlue: #262946; 9 | $borderColor: rgb(170, 170, 170); 10 | 11 | .buyCoins { 12 | height: 100%; 13 | position: fixed; 14 | top: 150vh; 15 | background: $mainColor; 16 | width: 100%; 17 | @media (min-width: 768px) { 18 | max-width: 30rem; 19 | display: none; 20 | } 21 | } 22 | 23 | .buyCoins.Show { 24 | top: 0; 25 | left: 0; 26 | display: flex; 27 | flex-direction: column; 28 | align-items: center; 29 | transition: all 0.7s ease-in; 30 | 31 | @media (min-width: 768px) { 32 | top: 50%; 33 | left: 50%; 34 | transform: translate(-50%, -50%); 35 | border-radius: 10px; 36 | } 37 | 38 | .closeIcon { 39 | font-size: 1.5rem; 40 | top: 2%; 41 | right: 3%; 42 | position: absolute; 43 | z-index: 4; 44 | cursor: pointer; 45 | } 46 | .buyCoinsForm { 47 | width: 100%; 48 | display: flex; 49 | flex-direction: column; 50 | align-items: center; 51 | height: 100%; 52 | overflow: auto; 53 | position: relative; 54 | 55 | .header { 56 | @media (min-width: 768px) { 57 | margin-top: 1rem; 58 | } 59 | @media (max-width: 1024px) and (orientation: landscape) { 60 | margin-bottom: 10%; 61 | } 62 | } 63 | 64 | .input { 65 | width: 90%; 66 | display: flex; 67 | align-items: center; 68 | justify-content: center; 69 | color: $textColor; 70 | height: 3rem; 71 | position: relative; 72 | top: 10%; 73 | @media (max-width: 767px) and (orientation: portrait) { 74 | top: 25%; 75 | } 76 | 77 | @media (max-width: 812px) and (orientation: landscape) { 78 | top: -5%; 79 | } 80 | 81 | @keyframes vibrateInput { 82 | 0% { 83 | transform: translateX(-10%); 84 | } 85 | 20% { 86 | transform: translateX(10%); 87 | } 88 | 40% { 89 | transform: translateX(-10%); 90 | } 91 | 60% { 92 | transform: translateX(10%); 93 | } 94 | 80% { 95 | transform: translateX(-10%); 96 | } 97 | 100% { 98 | transform: translateX(0%); 99 | } 100 | } 101 | 102 | input { 103 | height: 2rem; 104 | background: none; 105 | border: none; 106 | outline: none; 107 | font-size: 3rem; 108 | color: $textColor; 109 | background: transparent; 110 | width: 100%; 111 | padding: 1rem; 112 | text-align: center; 113 | transition: 0.5s; 114 | } 115 | input::-webkit-outer-spin-button, 116 | input::-webkit-inner-spin-button { 117 | /* display: none; <- Crashes Chrome on hover */ 118 | -webkit-appearance: none; 119 | margin: 0; /* <-- Apparently some margin are still there even though it's hidden */ 120 | } 121 | 122 | input[type='number'] { 123 | -moz-appearance: textfield; /* Firefox */ 124 | } 125 | span { 126 | position: absolute; 127 | left: 0; 128 | font-size: 1.25rem; 129 | color: $subColor; 130 | background: $mainColor; 131 | } 132 | 133 | div { 134 | font-size: 1.75rem; 135 | color: $textColor; 136 | cursor: pointer; 137 | margin-left: 1rem; 138 | position: absolute; 139 | right: 0; 140 | } 141 | } 142 | 143 | .amountYouGet { 144 | position: absolute; 145 | font-size: 1rem; 146 | bottom: 55%; 147 | @media (max-width: 812px) and (orientation: landscape) { 148 | bottom: 50%; 149 | } 150 | @media (max-width: 767px) and (orientation: portrait) { 151 | bottom: 52%; 152 | } 153 | } 154 | 155 | .selectBalanceAndBTN { 156 | width: 90%; 157 | display: flex; 158 | flex-direction: column; 159 | position: absolute; 160 | bottom: 5%; 161 | @media (max-width: 812px) and (orientation: landscape) { 162 | bottom: -12%; 163 | } 164 | 165 | .selectCoin { 166 | height: 4rem; 167 | width: 100%; 168 | display: flex; 169 | align-items: center; 170 | font-size: 1.15rem; 171 | margin-bottom: 1rem; 172 | } 173 | 174 | .coinAndWalletTab { 175 | width: 100%; 176 | display: flex; 177 | align-items: center; 178 | flex-direction: column; 179 | 180 | div:nth-child(1) { 181 | border: 1px solid $borderColor; 182 | border-radius: 5px; 183 | width: 100%; 184 | display: flex; 185 | justify-content: space-between; 186 | align-items: center; 187 | 188 | p { 189 | margin-left: 1rem; 190 | } 191 | 192 | span:nth-child(2) { 193 | margin-right: 1rem; 194 | } 195 | } 196 | 197 | button { 198 | display: flex; 199 | align-items: center; 200 | justify-content: center; 201 | height: 4rem; 202 | width: 100%; 203 | font-size: 1.15rem; 204 | padding: 1rem; 205 | border-radius: 5px; 206 | outline: none; 207 | border: none; 208 | color: $mainColor; 209 | font-weight: bold; 210 | background: $blue; 211 | transition: 0.5s; 212 | margin-top: 1rem; 213 | } 214 | 215 | button:hover { 216 | cursor: pointer; 217 | background: $lightBlue; 218 | } 219 | 220 | button[disabled] { 221 | background: $borderColor; 222 | } 223 | 224 | button[disabled]:hover { 225 | cursor: not-allowed; 226 | } 227 | 228 | div:nth-child(3) { 229 | margin-top: 1rem; 230 | width: 90%; 231 | transition: 0.5s; 232 | padding: 1rem; 233 | color: $textColor; 234 | height: 1.35rem; 235 | border-radius: 5px; 236 | margin-bottom: 1rem; 237 | display: flex; 238 | align-items: center; 239 | justify-content: space-between; 240 | font-size: 1rem; 241 | } 242 | } 243 | } 244 | } 245 | } 246 | 247 | .loading { 248 | position: absolute; 249 | top: 45%; 250 | left: 50%; 251 | transform: translate(-50%, -50%); 252 | } 253 | --------------------------------------------------------------------------------