├── Procfile ├── public ├── _redirects ├── robots.txt ├── favicon.ico ├── images │ ├── logo-512.png │ ├── flag-logo.png │ ├── logo-black.png │ ├── logo-white.png │ ├── not-found.png │ ├── about-alerts.png │ ├── about-focus.png │ ├── about-trader.png │ ├── banner-city.jpeg │ ├── banner-main.jpeg │ ├── chat-avatar.png │ ├── landing-money.png │ ├── landing-price.png │ ├── landing-works.png │ ├── sidebar-logo.png │ ├── about-education.png │ ├── auth-background.png │ ├── footer-facebook.png │ ├── footer-twitter.png │ ├── landing-action.png │ ├── landing-market.png │ ├── landing-trader.png │ ├── profile-avatar.png │ ├── about-professional.png │ ├── about-real-market.png │ ├── banner-background.png │ ├── chat-header-logo.png │ ├── footer-instagram.png │ ├── offers-background.png │ ├── banner-background-2.jpg │ ├── education-background.png │ ├── features-curvylines.png │ ├── about-customer-support.png │ ├── slider-arrow-forward.svg │ ├── decoration │ │ ├── triangle-deco.svg │ │ └── circle-deco.svg │ ├── features-signal.svg │ ├── features-news.svg │ ├── features-support.svg │ └── features-broker.svg ├── locales │ ├── zh │ │ ├── starter-landing.json │ │ └── common.json │ ├── id │ │ ├── starter-landing.json │ │ └── common.json │ ├── ar │ │ ├── starter-landing.json │ │ └── common.json │ ├── de │ │ ├── starter-landing.json │ │ └── common.json │ ├── en │ │ ├── starter-landing.json │ │ └── common.json │ └── pt │ │ ├── starter-landing.json │ │ └── common.json ├── text │ ├── link.js │ └── brand.js ├── manifest.json └── index.html ├── icon.png ├── src ├── views │ ├── web │ │ ├── auth │ │ │ └── components │ │ │ │ ├── Title │ │ │ │ ├── index.js │ │ │ │ ├── TitleSecondary.js │ │ │ │ ├── Title.js │ │ │ │ └── title-style.js │ │ │ │ ├── SocialAuth │ │ │ │ └── SocialAuth.js │ │ │ │ └── AuthFrame │ │ │ │ └── AuthFrame.js │ │ ├── landing │ │ │ ├── components │ │ │ │ ├── FAQ │ │ │ │ │ └── index.js │ │ │ │ ├── Contact │ │ │ │ │ └── index.js │ │ │ │ ├── Footer │ │ │ │ │ ├── index.js │ │ │ │ │ └── footer-style.js │ │ │ │ ├── Header │ │ │ │ │ ├── index.js │ │ │ │ │ ├── menu.js │ │ │ │ │ └── MobileMenu.js │ │ │ │ ├── PageNav │ │ │ │ │ ├── index.js │ │ │ │ │ ├── pagenav-style.js │ │ │ │ │ └── PageNav.js │ │ │ │ ├── Counter │ │ │ │ │ ├── index.js │ │ │ │ │ ├── counter-style.js │ │ │ │ │ └── Counter.js │ │ │ │ ├── Feature │ │ │ │ │ ├── index.js │ │ │ │ │ ├── Feature.js │ │ │ │ │ ├── Parallax.js │ │ │ │ │ ├── MainFeature.js │ │ │ │ │ └── feature-style.js │ │ │ │ ├── Pricing │ │ │ │ │ ├── index.js │ │ │ │ │ ├── pricing-style.js │ │ │ │ │ └── Pricing.js │ │ │ │ ├── Subscribe │ │ │ │ │ ├── index.js │ │ │ │ │ ├── subscribe-style.js │ │ │ │ │ └── SubscribeForm.js │ │ │ │ ├── Testimonials │ │ │ │ │ ├── index.js │ │ │ │ │ ├── testi-style.js │ │ │ │ │ └── Testimonials.js │ │ │ │ ├── AnimateSlider │ │ │ │ │ ├── index.js │ │ │ │ │ ├── slider-style.js │ │ │ │ │ └── AnimateSlider.js │ │ │ │ └── Disclaimer │ │ │ │ │ └── Disclaimer.js │ │ │ └── Landing.js │ │ ├── notFound │ │ │ ├── NotFound.js │ │ │ └── notFound-style.js │ │ └── resetPassword │ │ │ └── resetPassword-style.js │ ├── admin │ │ ├── support │ │ │ └── Support.js │ │ ├── education │ │ │ └── Education.js │ │ ├── social │ │ │ └── Social.js │ │ ├── dashboard │ │ │ └── components │ │ │ │ ├── TotalSponsoredUsers.js │ │ │ │ ├── TotalUsers.js │ │ │ │ ├── TotalSignals.js │ │ │ │ ├── TotalLogins.js │ │ │ │ ├── TotalFreeSignals.js │ │ │ │ └── TotalPayingUsers.js │ │ ├── logs │ │ │ └── Logs.js │ │ ├── subscriptions │ │ │ ├── components │ │ │ │ └── SubscriptionsList.js │ │ │ └── Subscriptions.js │ │ ├── questions │ │ │ └── Questions.js │ │ ├── groupChat │ │ │ └── components │ │ │ │ └── GroupChatMembers.js │ │ ├── sponsor │ │ │ └── Sponsor.js │ │ ├── users │ │ │ └── Users.js │ │ ├── signals │ │ │ └── Signals.js │ │ └── account │ │ │ └── Account.js │ └── user │ │ ├── support │ │ ├── Support.js │ │ └── components │ │ │ ├── SupportLive.js │ │ │ └── ComingSoon.js │ │ ├── dashboard │ │ └── components │ │ │ ├── Budget.js │ │ │ ├── TotalPips.js │ │ │ ├── TotalUsers.js │ │ │ ├── TotalProfits.js │ │ │ ├── UpgradePlan.js │ │ │ ├── TradePie.js │ │ │ └── LatestAlerts.js │ │ ├── education │ │ └── Education.js │ │ ├── groupChat │ │ ├── components │ │ │ ├── GroupChatMembers.js │ │ │ └── UpgradePlan.js │ │ └── GroupChat.js │ │ └── viewSignals │ │ └── ViewSignals.js ├── theme │ ├── overrides │ │ ├── MuiTypography.js │ │ ├── MuiPaper.js │ │ ├── MuiTableHead.js │ │ ├── MuiButton.js │ │ ├── MuiIconButton.js │ │ ├── MuiTableCell.js │ │ ├── MuiTableRow.js │ │ └── index.js │ ├── common.js │ ├── Palette.js │ └── Typography.js ├── vendors │ ├── slick │ │ ├── ajax-loader.gif │ │ ├── fonts │ │ │ ├── slick.eot │ │ │ ├── slick.ttf │ │ │ ├── slick.woff │ │ │ └── slick.svg │ │ ├── slick.css │ │ └── slick-theme.css │ ├── page-transition.css │ └── animate-extends.css ├── helpers │ └── getInitials.js ├── common │ └── Validators.js ├── index.js ├── config │ └── Constants.js ├── components │ ├── RouteWithLayout.js │ ├── AuthRouteWithLayout.js │ └── AuthAdminRouteWithLayout.js ├── layouts │ ├── web │ │ ├── Main.js │ │ └── components │ │ │ └── Footer.js │ ├── admin │ │ ├── components │ │ │ ├── Footer.js │ │ │ ├── Topbar.js │ │ │ └── sidebar │ │ │ │ └── components │ │ │ │ ├── Profile.js │ │ │ │ └── SidebarNav.js │ │ └── Main.js │ └── user │ │ ├── components │ │ ├── Footer.js │ │ ├── Topbar.js │ │ └── sidebar │ │ │ └── components │ │ │ ├── UpgradePlan.js │ │ │ ├── Profile.js │ │ │ └── SidebarNav.js │ │ └── Main.js ├── assets │ └── scss │ │ └── index.scss └── App.js ├── screetshots └── website.png ├── jsconfig.json ├── .gitignore └── package.json /Procfile: -------------------------------------------------------------------------------- 1 | web: npm run start -------------------------------------------------------------------------------- /public/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/icon.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | -------------------------------------------------------------------------------- /src/views/web/auth/components/Title/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Title'; 2 | -------------------------------------------------------------------------------- /src/views/web/landing/components/FAQ/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './FAQ' 2 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Contact/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Contact' -------------------------------------------------------------------------------- /src/views/web/landing/components/Footer/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Footer' 2 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Header/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Header' 2 | -------------------------------------------------------------------------------- /src/views/web/landing/components/PageNav/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './PageNav' -------------------------------------------------------------------------------- /src/views/web/landing/components/Counter/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Counter' 2 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Feature/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Feature' 2 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Pricing/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Pricing' 2 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/views/web/landing/components/Subscribe/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './SubscribeForm' 2 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Testimonials/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Testimonials' -------------------------------------------------------------------------------- /src/views/web/landing/components/AnimateSlider/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './AnimateSlider' 2 | -------------------------------------------------------------------------------- /screetshots/website.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/screetshots/website.png -------------------------------------------------------------------------------- /public/images/logo-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/logo-512.png -------------------------------------------------------------------------------- /public/locales/zh/starter-landing.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "一个简单的例子", 3 | "description_text": "从这里开始建立你的页面。" 4 | } -------------------------------------------------------------------------------- /public/images/flag-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/flag-logo.png -------------------------------------------------------------------------------- /public/images/logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/logo-black.png -------------------------------------------------------------------------------- /public/images/logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/logo-white.png -------------------------------------------------------------------------------- /public/images/not-found.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/not-found.png -------------------------------------------------------------------------------- /public/images/about-alerts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/about-alerts.png -------------------------------------------------------------------------------- /public/images/about-focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/about-focus.png -------------------------------------------------------------------------------- /public/images/about-trader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/about-trader.png -------------------------------------------------------------------------------- /public/images/banner-city.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/banner-city.jpeg -------------------------------------------------------------------------------- /public/images/banner-main.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/banner-main.jpeg -------------------------------------------------------------------------------- /public/images/chat-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/chat-avatar.png -------------------------------------------------------------------------------- /public/images/landing-money.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/landing-money.png -------------------------------------------------------------------------------- /public/images/landing-price.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/landing-price.png -------------------------------------------------------------------------------- /public/images/landing-works.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/landing-works.png -------------------------------------------------------------------------------- /public/images/sidebar-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/sidebar-logo.png -------------------------------------------------------------------------------- /src/theme/overrides/MuiTypography.js: -------------------------------------------------------------------------------- 1 | export default { 2 | gutterBottom: { 3 | marginBottom: 8 4 | } 5 | } -------------------------------------------------------------------------------- /public/images/about-education.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/about-education.png -------------------------------------------------------------------------------- /public/images/auth-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/auth-background.png -------------------------------------------------------------------------------- /public/images/footer-facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/footer-facebook.png -------------------------------------------------------------------------------- /public/images/footer-twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/footer-twitter.png -------------------------------------------------------------------------------- /public/images/landing-action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/landing-action.png -------------------------------------------------------------------------------- /public/images/landing-market.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/landing-market.png -------------------------------------------------------------------------------- /public/images/landing-trader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/landing-trader.png -------------------------------------------------------------------------------- /public/images/profile-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/profile-avatar.png -------------------------------------------------------------------------------- /src/vendors/slick/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/src/vendors/slick/ajax-loader.gif -------------------------------------------------------------------------------- /src/vendors/slick/fonts/slick.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/src/vendors/slick/fonts/slick.eot -------------------------------------------------------------------------------- /src/vendors/slick/fonts/slick.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/src/vendors/slick/fonts/slick.ttf -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "src" 4 | }, 5 | "include": [ 6 | "src", 7 | "i18n.js" 8 | ] 9 | } -------------------------------------------------------------------------------- /public/images/about-professional.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/about-professional.png -------------------------------------------------------------------------------- /public/images/about-real-market.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/about-real-market.png -------------------------------------------------------------------------------- /public/images/banner-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/banner-background.png -------------------------------------------------------------------------------- /public/images/chat-header-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/chat-header-logo.png -------------------------------------------------------------------------------- /public/images/footer-instagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/footer-instagram.png -------------------------------------------------------------------------------- /public/images/offers-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/offers-background.png -------------------------------------------------------------------------------- /src/vendors/slick/fonts/slick.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/src/vendors/slick/fonts/slick.woff -------------------------------------------------------------------------------- /public/images/banner-background-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/banner-background-2.jpg -------------------------------------------------------------------------------- /public/images/education-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/education-background.png -------------------------------------------------------------------------------- /public/images/features-curvylines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/features-curvylines.png -------------------------------------------------------------------------------- /public/images/about-customer-support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdeenM/megatrade-website/HEAD/public/images/about-customer-support.png -------------------------------------------------------------------------------- /public/locales/id/starter-landing.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Contoh sederhana", 3 | "description_text": "Mulai buat halaman Anda dari sini." 4 | } -------------------------------------------------------------------------------- /public/locales/ar/starter-landing.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "مثال بسيط", 3 | "description_text": "إنها صفحة فارغة. ابدأ في إنشاء صفحتك من هنا." 4 | } -------------------------------------------------------------------------------- /public/locales/de/starter-landing.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Ein einfaches Beispiel", 3 | "description_text": "Baue deine Seite mit here auf" 4 | } -------------------------------------------------------------------------------- /public/locales/en/starter-landing.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "A simple example", 3 | "description_text": "Start to build your'e page from here." 4 | } -------------------------------------------------------------------------------- /public/locales/pt/starter-landing.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Um exemplo simples", 3 | "description_text": "Comece a construir sua página aqui." 4 | } -------------------------------------------------------------------------------- /src/theme/overrides/MuiPaper.js: -------------------------------------------------------------------------------- 1 | export default { 2 | elevation1: { 3 | boxShadow: '0 0 0 1px rgba(63,63,68,0.05), 0 1px 3px 0 rgba(63,63,68,0.15)' 4 | } 5 | } -------------------------------------------------------------------------------- /src/theme/overrides/MuiTableHead.js: -------------------------------------------------------------------------------- 1 | import { colors } from '@material-ui/core' 2 | 3 | export default { 4 | root: { 5 | backgroundColor: colors.grey[50] 6 | } 7 | } -------------------------------------------------------------------------------- /src/helpers/getInitials.js: -------------------------------------------------------------------------------- 1 | export default (name = '') => 2 | name 3 | .replace(/\s+/, ' ') 4 | .split(' ') 5 | .slice(0, 2) 6 | .map(v => v && v[0].toUpperCase()) 7 | .join('') -------------------------------------------------------------------------------- /src/common/Validators.js: -------------------------------------------------------------------------------- 1 | const checked = (value, options) => { 2 | if (value !== true) { 3 | return options.message || 'must be checked' 4 | } 5 | }; 6 | 7 | export default { 8 | checked 9 | }; -------------------------------------------------------------------------------- /public/text/link.js: -------------------------------------------------------------------------------- 1 | const link = { 2 | starter: { 3 | home: '/', 4 | contact: '/contact', 5 | login: '/login', 6 | register: '/register' 7 | } 8 | }; 9 | 10 | export default link; 11 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Header/menu.js: -------------------------------------------------------------------------------- 1 | const menu = [ 2 | 'home', 3 | 'feature', 4 | 'testimonials', 5 | 'pricing', 6 | 'faq', 7 | 'subscribe', 8 | 'contact' 9 | ] 10 | 11 | export default menu 12 | -------------------------------------------------------------------------------- /src/theme/overrides/MuiButton.js: -------------------------------------------------------------------------------- 1 | export default { 2 | contained: { 3 | backgroundColor: '#FFFFFF', 4 | boxShadow: 5 | '0 1px 1px 0 rgba(0,0,0,0.14), 0 2px 1px -1px rgba(0,0,0,0.12), 0 1px 3px 0 rgba(0,0,0,0.20)' 6 | } 7 | } -------------------------------------------------------------------------------- /src/theme/overrides/MuiIconButton.js: -------------------------------------------------------------------------------- 1 | import Palette from '../Palette' 2 | 3 | export default { 4 | root: { 5 | color: Palette.icon, 6 | '&:hover': { 7 | backgroundColor: 'rgba(0, 0, 0, 0.03)' 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/theme/overrides/MuiTableCell.js: -------------------------------------------------------------------------------- 1 | import Palette from '../Palette' 2 | import Typography from '../Typography' 3 | 4 | export default { 5 | root: { 6 | ...Typography.body1, 7 | borderBottom: `1px solid ${Palette.divider}` 8 | } 9 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | 4 | import App from './App' 5 | import * as serviceWorker from './serviceWorker' 6 | 7 | ReactDOM.render(, document.getElementById('root')) 8 | 9 | serviceWorker.unregister() -------------------------------------------------------------------------------- /public/images/slider-arrow-forward.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/theme/overrides/MuiTableRow.js: -------------------------------------------------------------------------------- 1 | import Palette from '../Palette' 2 | 3 | export default { 4 | root: { 5 | '&$selected': { 6 | backgroundColor: Palette.background.default 7 | }, 8 | '&$hover': { 9 | '&:hover': { 10 | backgroundColor: Palette.background.default 11 | } 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/views/web/landing/components/AnimateSlider/slider-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | 3 | const sliderStyles = makeStyles(theme => ({ 4 | heroButtons: { 5 | marginTop: theme.spacing(4), 6 | }, 7 | heroContent: { 8 | position: 'relative' 9 | } 10 | })) 11 | 12 | export default sliderStyles -------------------------------------------------------------------------------- /src/config/Constants.js: -------------------------------------------------------------------------------- 1 | // https://megatrade-server.herokuapp.com 2 | 3 | export default { 4 | SERVER_URL: 'https://megatrade-server.herokuapp.com', 5 | GOOGLE_TRACKING_ID: 'UA-158201801-1', 6 | FACEBOOK_APP_ID: '442263256673614', 7 | GOOGLE_CLIENT_ID: '94334450177-alqfl3cs59hmue1ebk5dvtuv973k3qa4.apps.googleusercontent.com' 8 | } -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Mega Trade", 3 | "name": "Mega Trade Website - World Class Trading Signals", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 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 | # misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | /package-lock.json 19 | 20 | npm-debug.log* 21 | yarn-debug.log* 22 | yarn-error.log* 23 | -------------------------------------------------------------------------------- /public/images/decoration/triangle-deco.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/theme/common.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | 3 | export const useTextAlign = makeStyles({ 4 | textCenter: { 5 | textAlign: 'center' 6 | }, 7 | textLeft: { 8 | textAlign: 'left' 9 | }, 10 | textRight: { 11 | textAlign: 'right' 12 | } 13 | }) 14 | 15 | export const useFloat = makeStyles({ 16 | floatLeft: { 17 | float: 'left' 18 | }, 19 | floatRight: { 20 | float: 'right' 21 | }, 22 | }) 23 | -------------------------------------------------------------------------------- /src/theme/overrides/index.js: -------------------------------------------------------------------------------- 1 | import MuiPaper from './MuiPaper' 2 | import MuiButton from './MuiButton' 3 | import MuiTableCell from './MuiTableCell' 4 | import MuiTableHead from './MuiTableHead' 5 | import MuiIconButton from './MuiIconButton' 6 | import MuiTypography from './MuiTypography' 7 | 8 | export default { 9 | MuiPaper, 10 | MuiButton, 11 | MuiTableCell, 12 | MuiTableHead, 13 | MuiIconButton, 14 | MuiTypography 15 | } -------------------------------------------------------------------------------- /public/text/brand.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | starter: { 3 | name: 'Luxi Starter', 4 | desc: 'Luxi Starter - React Starter Template', 5 | prefix: 'luxi', 6 | footerText: 'Luxi Theme All Rights Reserved 2019', 7 | logoText: 'Luxi Theme', 8 | projectName: 'Starter Project', 9 | url: 'luxi.ux-maestro.com', 10 | img: '/public/images/logo.png', 11 | notifMsg: 'Donec sit amet nulla sed arcu pulvinar ultricies commodo id ligula.' 12 | } 13 | }; 14 | -------------------------------------------------------------------------------- /src/vendors/page-transition.css: -------------------------------------------------------------------------------- 1 | .page-fade-transition-enter { 2 | opacity: 0; 3 | } 4 | 5 | .page-fade-transition-enter-active { 6 | opacity: 1; 7 | transition: opacity 300ms; 8 | } 9 | 10 | .page-fade-transition-exit { 11 | opacity: 1; 12 | } 13 | 14 | .page-fade-transition-exit-active { 15 | opacity: 0; 16 | transition: opacity 300ms; 17 | } 18 | 19 | .fragment-fadeIn { 20 | opacity: 0; 21 | transition-delay: 300ms 22 | } 23 | 24 | .page-transition-enter-done .fragment-fadeIn { 25 | opacity: 1; 26 | transition: opacity 400ms; 27 | } -------------------------------------------------------------------------------- /src/views/web/landing/components/Pricing/pricing-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | 3 | const useStyles = makeStyles(theme => ({ 4 | pricingWrap: { 5 | marginTop: theme.spacing(5) 6 | }, 7 | cardHeader: { 8 | backgroundColor: theme.palette.type === 'dark' ? theme.palette.grey[900] : theme.palette.grey[200], 9 | }, 10 | cardPricing: { 11 | display: 'flex', 12 | justifyContent: 'center', 13 | alignItems: 'baseline', 14 | marginBottom: theme.spacing(2), 15 | } 16 | })) 17 | 18 | export default useStyles 19 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Feature/Feature.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Container } from '@material-ui/core' 3 | 4 | import Parallax from './Parallax' 5 | import useStyles from './feature-style' 6 | import MainFeature from './MainFeature' 7 | import MoreFeature from './MoreFeature' 8 | 9 | const Feature = () => { 10 | const classes = useStyles() 11 | return ( 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | ) 21 | } 22 | 23 | export default Feature 24 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Subscribe/subscribe-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | 3 | const subscribeStyles = makeStyles(theme => ({ 4 | subscribeWrap: { 5 | maxWidth: 600, 6 | margin: theme.spacing(0, 2), 7 | [theme.breakpoints.up('md')]: { 8 | margin: '0 auto -32px', 9 | }, 10 | zIndex: 10, 11 | position: 'relative' 12 | }, 13 | paper: { 14 | padding: theme.spacing(4) 15 | }, 16 | textField: { 17 | marginTop: theme.spacing(3) 18 | }, 19 | rightIcon: { 20 | marginLeft: theme.spacing(2) 21 | } 22 | })) 23 | 24 | export default subscribeStyles 25 | -------------------------------------------------------------------------------- /public/images/decoration/circle-deco.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/views/admin/support/Support.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Grid } from '@material-ui/core' 3 | import { makeStyles } from '@material-ui/styles' 4 | 5 | const useStyles = makeStyles(theme => ({ 6 | root: { 7 | padding: theme.spacing(3) 8 | } 9 | })) 10 | 11 | const Support = () => { 12 | const classes = useStyles() 13 | 14 | return ( 15 |
16 | 20 | 21 |
22 | ) 23 | } 24 | 25 | export default Support -------------------------------------------------------------------------------- /src/components/RouteWithLayout.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { Route } from 'react-router-dom' 4 | 5 | const RouteWithLayout = props => { 6 | const { layout: Layout, component: Component, ...rest } = props 7 | 8 | return ( 9 | ( 12 | 13 | 14 | 15 | )} /> 16 | ) 17 | } 18 | 19 | RouteWithLayout.propTypes = { 20 | path: PropTypes.string, 21 | layout: PropTypes.any.isRequired, 22 | component: PropTypes.any.isRequired 23 | } 24 | 25 | export default RouteWithLayout -------------------------------------------------------------------------------- /src/views/admin/education/Education.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Grid } from '@material-ui/core' 3 | import { makeStyles } from '@material-ui/styles' 4 | 5 | const useStyles = makeStyles(theme => ({ 6 | root: { 7 | padding: theme.spacing(4) 8 | } 9 | })) 10 | 11 | const Education = () => { 12 | const classes = useStyles() 13 | 14 | return ( 15 |
16 | 20 | 21 |
22 | ) 23 | } 24 | 25 | export default Education -------------------------------------------------------------------------------- /src/layouts/web/Main.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | 6 | import Footer from './components/Footer' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: {}, 10 | content: { 11 | height: '100%' 12 | } 13 | })) 14 | 15 | const Main = props => { 16 | const { children } = props 17 | 18 | const classes = useStyles() 19 | 20 | return ( 21 |
22 |
23 | {children} 24 | 25 |
26 |
27 |
28 | ) 29 | } 30 | 31 | Main.propTypes = { 32 | children: PropTypes.node 33 | } 34 | 35 | export default Main -------------------------------------------------------------------------------- /src/layouts/web/components/Footer.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { Typography } from '@material-ui/core' 5 | import { makeStyles } from '@material-ui/styles' 6 | 7 | const useStyles = makeStyles(theme => ({ 8 | root: { 9 | padding: theme.spacing(1) 10 | } 11 | })) 12 | 13 | const Footer = props => { 14 | const { className, ...rest } = props 15 | 16 | const classes = useStyles() 17 | 18 | return ( 19 |
22 | © 2020 – Mega Trade, All rights reserved. 23 |
24 | ) 25 | } 26 | 27 | Footer.propTypes = { 28 | className: PropTypes.string 29 | } 30 | 31 | export default Footer -------------------------------------------------------------------------------- /src/layouts/admin/components/Footer.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { Typography } from '@material-ui/core' 5 | import { makeStyles } from '@material-ui/styles' 6 | 7 | const useStyles = makeStyles(theme => ({ 8 | root: { 9 | padding: theme.spacing(1) 10 | } 11 | })) 12 | 13 | const Footer = props => { 14 | const { className, ...rest } = props 15 | 16 | const classes = useStyles() 17 | 18 | return ( 19 |
22 | © 2020 – Mega Trade, All rights reserved. 23 |
24 | ) 25 | } 26 | 27 | Footer.propTypes = { 28 | className: PropTypes.string 29 | } 30 | 31 | export default Footer -------------------------------------------------------------------------------- /src/layouts/user/components/Footer.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { Typography } from '@material-ui/core' 5 | import { makeStyles } from '@material-ui/styles' 6 | 7 | const useStyles = makeStyles(theme => ({ 8 | root: { 9 | padding: theme.spacing(1) 10 | } 11 | })) 12 | 13 | const Footer = props => { 14 | const { className, ...rest } = props 15 | 16 | const classes = useStyles() 17 | 18 | return ( 19 |
22 | © 2020 – Mega Trade, All rights reserved. 23 |
24 | ) 25 | } 26 | 27 | Footer.propTypes = { 28 | className: PropTypes.string 29 | } 30 | 31 | export default Footer -------------------------------------------------------------------------------- /src/views/user/support/Support.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Grid } from '@material-ui/core' 3 | import { makeStyles } from '@material-ui/styles' 4 | 5 | import SupportLive from './components/SupportLive' 6 | 7 | const useStyles = makeStyles(theme => ({ 8 | root: { 9 | padding: theme.spacing(3) 10 | } 11 | })) 12 | 13 | const Support = () => { 14 | const classes = useStyles() 15 | 16 | return ( 17 |
18 | 24 | 30 | 31 |
32 | ) 33 | } 34 | 35 | export default Support -------------------------------------------------------------------------------- /src/assets/scss/index.scss: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | html { 8 | height: 100%; 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | } 12 | 13 | body { 14 | background-color: #f4f6f8; 15 | height: 100%; 16 | } 17 | 18 | a { 19 | text-decoration: none; 20 | } 21 | 22 | #root { 23 | height: 100%; 24 | } 25 | 26 | .rcw-conversation-container > .rcw-header { 27 | background-color:#549FFC; 28 | } 29 | 30 | .rcw-launcher { 31 | background-color:#549FFC; 32 | } 33 | 34 | .rcw-message > .rcw-client { 35 | background-color: #549FFC; 36 | color: white; 37 | } 38 | 39 | .rcw-message > .rcw-response { 40 | background-color: #f4f6f8; 41 | color: black; 42 | } 43 | 44 | .rcw-send-icon { 45 | color: #549FFC; 46 | } -------------------------------------------------------------------------------- /src/views/web/landing/components/Testimonials/testi-style.js: -------------------------------------------------------------------------------- 1 | import { colors } from '@material-ui/core' 2 | import { makeStyles } from '@material-ui/core/styles' 3 | 4 | const testiStyles = makeStyles(theme => ({ 5 | testimonialWrap: { 6 | width: '100%', 7 | position: 'relative', 8 | overflow: 'hidden' 9 | }, 10 | carousel: { 11 | marginTop: theme.spacing(3) 12 | }, 13 | item: { 14 | padding: theme.spacing(2) 15 | }, 16 | card: { 17 | padding: theme.spacing(3) 18 | }, 19 | name: { 20 | display: 'flex', 21 | marginTop: theme.spacing(), 22 | alignItems: 'center', 23 | '& span': { 24 | display: 'inline-block', 25 | marginLeft: theme.spacing() 26 | } 27 | }, 28 | avatar: { 29 | width: 30, 30 | height: 30, 31 | backgroundColor: colors.blue[500] 32 | } 33 | })) 34 | 35 | export default testiStyles 36 | -------------------------------------------------------------------------------- /src/components/AuthRouteWithLayout.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { Route, Redirect } from 'react-router-dom' 4 | 5 | const AuthRouteWithLayout = props => { 6 | const { layout: Layout, component: Component, ...rest } = props 7 | 8 | const userId = localStorage.getItem('userId') 9 | 10 | return ( 11 | 15 | userId 16 | ? 17 | 18 | 19 | : 24 | } /> 25 | ) 26 | } 27 | 28 | AuthRouteWithLayout.propTypes = { 29 | path: PropTypes.string, 30 | layout: PropTypes.any.isRequired, 31 | component: PropTypes.any.isRequired 32 | } 33 | 34 | export default AuthRouteWithLayout -------------------------------------------------------------------------------- /src/views/web/landing/components/Counter/counter-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | 3 | const counterStyles = makeStyles(theme => ({ 4 | counterWrap: { 5 | background: theme.palette.primary.main, 6 | padding: theme.spacing(8, 0) 7 | }, 8 | text: {}, 9 | counterItem: { 10 | color: theme.palette.common.white, 11 | [theme.breakpoints.up('md')]: { 12 | display: 'flex', 13 | }, 14 | textAlign: 'center', 15 | alignItems: 'center', 16 | justifyContent: 'center', 17 | '& svg': { 18 | marginRight: theme.spacing(2), 19 | fill: theme.palette.common.white, 20 | width: 40, 21 | height: 40, 22 | [theme.breakpoints.up('md')]: { 23 | width: 80, 24 | height: 80, 25 | }, 26 | }, 27 | '& $text': { 28 | '& h4': { 29 | fontWeight: 'bold', 30 | } 31 | } 32 | } 33 | })) 34 | 35 | export default counterStyles 36 | -------------------------------------------------------------------------------- /src/views/admin/social/Social.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Grid } from '@material-ui/core' 3 | import { makeStyles } from '@material-ui/styles' 4 | 5 | import Post from './components/Post' 6 | 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | padding: theme.spacing(4) 11 | } 12 | })) 13 | 14 | const Social = () => { 15 | const classes = useStyles() 16 | 17 | return ( 18 |
19 | 22 | 28 | 29 | 30 | 31 |
32 | ) 33 | } 34 | 35 | export default Social -------------------------------------------------------------------------------- /src/views/web/auth/components/Title/TitleSecondary.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import Typography from '@material-ui/core/Typography' 4 | import clsx from 'clsx' 5 | import useStyles from './title-style' 6 | 7 | export default function TitleSecondary(props) { 8 | const classes = useStyles() 9 | const { children, align } = props 10 | const setAlign = alignment => { 11 | switch (alignment) { 12 | case 'left': 13 | return classes.left 14 | case 'right': 15 | return classes.right 16 | case 'center': 17 | return classes.center 18 | default: 19 | return classes.left 20 | } 21 | } 22 | return ( 23 |
24 | 25 | {children} 26 | 27 |
28 | ) 29 | } 30 | 31 | TitleSecondary.propTypes = { 32 | children: PropTypes.node.isRequired, 33 | align: PropTypes.string, 34 | } 35 | 36 | TitleSecondary.defaultProps = { 37 | align: 'left' 38 | } 39 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 19 | Mega Trade - World Class Trading Signals 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /src/components/AuthAdminRouteWithLayout.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { Route, Redirect } from 'react-router-dom' 4 | 5 | const AuthAdminRouteWithLayout = props => { 6 | const { layout: Layout, component: Component, ...rest } = props 7 | 8 | const adminId = localStorage.getItem('adminId') 9 | 10 | return ( 11 | 15 | adminId 16 | ? 17 | 18 | 19 | : 24 | } /> 25 | ) 26 | } 27 | 28 | AuthAdminRouteWithLayout.propTypes = { 29 | path: PropTypes.string, 30 | layout: PropTypes.any.isRequired, 31 | component: PropTypes.any.isRequired 32 | } 33 | 34 | export default AuthAdminRouteWithLayout -------------------------------------------------------------------------------- /src/views/web/auth/components/Title/Title.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import Typography from '@material-ui/core/Typography' 4 | import clsx from 'clsx' 5 | import useStyles from './title-style' 6 | 7 | export default function Title(props) { 8 | const classes = useStyles() 9 | const { 10 | caption, 11 | text, 12 | align, 13 | dark 14 | } = props 15 | const setAlign = alignment => { 16 | switch (alignment) { 17 | case 'left': 18 | return classes.left 19 | case 'right': 20 | return classes.right 21 | case 'center': 22 | return classes.center 23 | default: 24 | return classes.left 25 | } 26 | } 27 | return ( 28 |
29 | 30 | {caption} 31 | 32 | 33 | {text} 34 | 35 |
36 | ) 37 | } 38 | 39 | Title.propTypes = { 40 | caption: PropTypes.string.isRequired, 41 | text: PropTypes.string.isRequired, 42 | align: PropTypes.string, 43 | dark: PropTypes.bool, 44 | } 45 | 46 | Title.defaultProps = { 47 | align: 'left', 48 | dark: false 49 | } 50 | -------------------------------------------------------------------------------- /src/views/web/notFound/NotFound.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Button, Grid, Container, Typography } from '@material-ui/core' 3 | 4 | import useStyles from './notFound-style' 5 | 6 | const NotFound = () => { 7 | const classes = useStyles() 8 | 9 | return ( 10 |
11 | 12 | 13 | 14 |
15 |
16 | logo 19 | 20 | 21 | 404 22 | 23 |
24 |
25 |
26 | 27 | 28 |
29 | This page could not be found. 30 | 31 | 32 | You can either stay and chill here, or go back to the beginning. 33 | 34 | 35 | 38 |
39 |
40 |
41 |
42 |
43 | ) 44 | } 45 | 46 | export default NotFound 47 | -------------------------------------------------------------------------------- /src/layouts/admin/components/Topbar.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import MenuIcon from '@material-ui/icons/Menu' 5 | import { makeStyles } from '@material-ui/styles' 6 | import { Link as RouterLink } from 'react-router-dom' 7 | import { AppBar, Toolbar, Hidden, IconButton } from '@material-ui/core' 8 | 9 | const useStyles = makeStyles(theme => ({ 10 | root: { 11 | boxShadow: 'none' 12 | }, 13 | flexGrow: { 14 | flexGrow: 1 15 | }, 16 | signOutButton: { 17 | marginLeft: theme.spacing(1) 18 | } 19 | })) 20 | 21 | const Topbar = props => { 22 | const { className, onSidebarOpen, history, ...rest } = props 23 | 24 | const classes = useStyles() 25 | 26 | return ( 27 | 30 | 31 | 32 | logo 35 | 36 | 37 |
38 | 39 | 40 | 43 | 44 | 45 | 46 | 47 | 48 | ) 49 | } 50 | 51 | Topbar.propTypes = { 52 | history: PropTypes.object, 53 | className: PropTypes.string, 54 | onSidebarOpen: PropTypes.func 55 | } 56 | 57 | export default Topbar -------------------------------------------------------------------------------- /public/locales/zh/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "一个简单的例子", 3 | "subtitle": "这是一个空白页面。从这里开始建立你的页面。", 4 | "error_with_status": "服务器上发生错误", 5 | "404": "无法找到此页面。", 6 | "404_subtitle": "你可以留在这里冷静,或者回到起点。", 7 | "back": "回到家", 8 | "error_without_status": "服务器上发生错误", 9 | "contact_title": "免费项目报价", 10 | "contact_title2": "向我们问好", 11 | "contact_subtitle": "你有什么问题吗?你准备好降低成本并创造新的收入吗?或者你只是想打个招呼?给我们留言。", 12 | "form_name": "你叫什么名字?*", 13 | "form_email": "你的电子邮件是什么?*", 14 | "form_phone": "你的电话号码是多少?", 15 | "form_company": "你的公司是什么?", 16 | "form_message": "在这里写下你的留言", 17 | "form_terms": "我已阅读并接受条款", 18 | "form_privacy": "服务与隐私政策*", 19 | "form_send": "发送消息", 20 | "login": "登录", 21 | "login_create": "创建新帐户", 22 | "login_or": "或通过电子邮件登录", 23 | "login_email": "电子邮件", 24 | "login_password": "密码", 25 | "login_remember": "记住", 26 | "login_forgot": "忘记密码", 27 | "continue": "继续", 28 | "login_title": "欢迎回来", 29 | "login_subtitle": "请先登录以继续", 30 | "register": "注册", 31 | "register_already": "已经有帐户?", 32 | "register_or": "或通过电子邮件注册", 33 | "register_name": "名称?*", 34 | "register_email": "电子邮件?*", 35 | "register_password": "密码", 36 | "register_confirm": "确认密码", 37 | "register_title": "很高兴认识您:)", 38 | "register_subtitle": "只需注册即可加入我们", 39 | "accept": "接受", 40 | "en": "English", 41 | "de": "Deutsch", 42 | "zh": "简体中文", 43 | "pt": "󠁥󠁮󠁧󠁿Português", 44 | "id": "󠁥󠁮󠁧󠁿Bahasa Indonesia", 45 | "ar": "󠁥󠁮󠁧󠁿العربيّة" 46 | } -------------------------------------------------------------------------------- /public/images/features-signal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 9 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/views/web/notFound/notFound-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | 3 | const useStyles = makeStyles(theme => ({ 4 | errorWrap: { 5 | width: '100%', 6 | minHeight: '90vh', 7 | display: 'flex', 8 | alignItems: 'center' 9 | }, 10 | flex: { 11 | display: 'flex', 12 | justifyContent: 'center' 13 | }, 14 | deco: { 15 | position: 'relative', 16 | [theme.breakpoints.down('md')]: { 17 | height: 320, 18 | }, 19 | '& h3': { 20 | fontFamily: 'Roboto Condensed', 21 | color: theme.palette.primary.main, 22 | fontSize: 106, 23 | textTransform: 'capitalize', 24 | fontWeight: 700, 25 | paddingTop: 40, 26 | paddingLeft: 20, 27 | position: 'relative', 28 | zIndex: 1, 29 | }, 30 | '&:before': { 31 | content: '"', 32 | width: 210, 33 | height: 220, 34 | background: theme.palette.primary.main, 35 | borderRadius: 24, 36 | transform: 'rotate(45deg)', 37 | position: 'absolute', 38 | top: theme.spacing(-1), 39 | left: 0, 40 | } 41 | }, 42 | text: { 43 | borderLeft: `1px solid ${theme.palette.divider}`, 44 | [theme.breakpoints.up('md')]: { 45 | paddingLeft: theme.spacing(5), 46 | }, 47 | [theme.breakpoints.down('md')]: { 48 | textAlign: 'center' 49 | }, 50 | '& h4': { 51 | fontWeight: theme.typography.fontWeightBold, 52 | marginBottom: theme.spacing(4) 53 | }, 54 | '& p': { 55 | fontSize: 22, 56 | color: theme.palette.text.secondary 57 | } 58 | }, 59 | button: { 60 | marginTop: theme.spacing(4) 61 | } 62 | })) 63 | 64 | export default useStyles 65 | -------------------------------------------------------------------------------- /src/views/web/auth/components/SocialAuth/SocialAuth.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import GoogleLogin from 'react-google-login' 3 | import Button from '@material-ui/core/Button' 4 | import GoogleIcon from 'react-ionicons/lib/LogoGoogle' 5 | import FacebookIcon from 'react-ionicons/lib/LogoFacebook' 6 | import FacebookLogin from 'react-facebook-login/dist/facebook-login-render-props' 7 | 8 | import Constants from 'config/Constants' 9 | import useStyles from '../../form-style' 10 | 11 | const SocialAuth = props => { 12 | const classes = useStyles() 13 | const { onFacebook, onGoogle } = props 14 | 15 | return ( 16 |
17 | {/* } /> */} 31 | 32 | } /> 46 |
47 | ) 48 | } 49 | 50 | 51 | export default SocialAuth 52 | -------------------------------------------------------------------------------- /src/views/user/dashboard/components/Budget.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import MoneyIcon from '@material-ui/icons/Money' 5 | import { makeStyles } from '@material-ui/styles' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%' 11 | }, 12 | content: { 13 | display: 'flex', 14 | alignItems: 'center' 15 | }, 16 | title: { 17 | fontWeight: 700 18 | }, 19 | avatar: { 20 | width: 56, 21 | height: 56, 22 | backgroundColor: theme.palette.error.main 23 | }, 24 | icon: { 25 | width: 32, 26 | height: 32 27 | } 28 | })) 29 | 30 | const Budget = props => { 31 | const { className, budget, ...rest } = props 32 | 33 | const classes = useStyles() 34 | 35 | return ( 36 | 39 | 40 | 43 | 44 | 49 | TRADING BUDGET 50 | 51 | 52 | ${budget} 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | 66 | Budget.propTypes = { 67 | className: PropTypes.string 68 | } 69 | 70 | export default Budget -------------------------------------------------------------------------------- /src/views/user/dashboard/components/TotalPips.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | import BarChartIcon from '@material-ui/icons/BarChart' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%' 11 | }, 12 | content: { 13 | display: 'flex', 14 | alignItems: 'center' 15 | }, 16 | title: { 17 | fontWeight: 700 18 | }, 19 | avatar: { 20 | width: 56, 21 | height: 56, 22 | backgroundColor: theme.palette.primary.main 23 | }, 24 | icon: { 25 | width: 32, 26 | height: 32 27 | } 28 | })) 29 | 30 | const TotalPips = props => { 31 | const { className, pips, ...rest } = props 32 | 33 | const classes = useStyles() 34 | 35 | return ( 36 | 39 | 40 | 43 | 44 | 49 | TOTAL PIPS 50 | 51 | 52 | {pips} 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | 66 | TotalPips.propTypes = { 67 | className: PropTypes.string 68 | } 69 | 70 | export default TotalPips -------------------------------------------------------------------------------- /src/views/user/dashboard/components/TotalUsers.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | import PeopleIcon from '@material-ui/icons/PeopleOutlined' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%' 11 | }, 12 | content: { 13 | display: 'flex', 14 | alignItems: 'center' 15 | }, 16 | title: { 17 | fontWeight: 700 18 | }, 19 | avatar: { 20 | width: 56, 21 | height: 56, 22 | backgroundColor: theme.palette.success.main 23 | }, 24 | icon: { 25 | height: 32, 26 | width: 32 27 | } 28 | })) 29 | 30 | const TotalUsers = props => { 31 | const { className, users, ...rest } = props 32 | 33 | const classes = useStyles() 34 | 35 | return ( 36 | 39 | 40 | 43 | 44 | 49 | TOTAL USERS 50 | 51 | 52 | {users} 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | 66 | TotalUsers.propTypes = { 67 | className: PropTypes.string 68 | } 69 | 70 | export default TotalUsers -------------------------------------------------------------------------------- /src/views/admin/dashboard/components/TotalSponsoredUsers.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | import SponsoredIcon from '@material-ui/icons/MoneyOff' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%' 11 | }, 12 | content: { 13 | display: 'flex', 14 | alignItems: 'center' 15 | }, 16 | title: { 17 | fontWeight: 700 18 | }, 19 | avatar: { 20 | width: 56, 21 | height: 56, 22 | backgroundColor: 'firebrick' 23 | }, 24 | icon: { 25 | height: 32, 26 | width: 32 27 | } 28 | })) 29 | 30 | const TotalUsers = props => { 31 | const { className, sponsoredUsers, ...rest } = props 32 | 33 | const classes = useStyles() 34 | 35 | return ( 36 | 39 | 40 | 43 | 44 | 49 | TOTAL SPONSORED USERS 50 | 51 | 52 | {sponsoredUsers} 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | 66 | TotalUsers.propTypes = { 67 | className: PropTypes.string 68 | } 69 | 70 | export default TotalUsers -------------------------------------------------------------------------------- /src/layouts/user/Main.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import PropTypes from 'prop-types' 3 | import React, { useState } from 'react' 4 | import { useMediaQuery } from '@material-ui/core' 5 | import { makeStyles, useTheme } from '@material-ui/styles' 6 | 7 | import Footer from './components/Footer' 8 | import Topbar from './components/Topbar' 9 | import Sidebar from './components/sidebar/Sidebar' 10 | 11 | const useStyles = makeStyles(theme => ({ 12 | root: { 13 | paddingTop: 56, 14 | height: '100%', 15 | [theme.breakpoints.up('sm')]: { 16 | paddingTop: 64 17 | } 18 | }, 19 | shiftContent: { 20 | paddingLeft: 240 21 | }, 22 | content: { 23 | height: '100%' 24 | } 25 | })) 26 | 27 | const Main = props => { 28 | const { children } = props 29 | 30 | const theme = useTheme() 31 | const classes = useStyles() 32 | const isDesktop = useMediaQuery(theme.breakpoints.up('lg'), { 33 | defaultMatches: true 34 | }) 35 | 36 | const [openSidebar, setOpenSidebar] = useState(false) 37 | 38 | const onSidebarOpen = () => { 39 | setOpenSidebar(true) 40 | } 41 | 42 | const onSidebarClose = () => { 43 | setOpenSidebar(false) 44 | } 45 | 46 | const shouldOpenSidebar = isDesktop ? true : openSidebar 47 | 48 | return ( 49 |
54 | 55 | 56 | 60 | 61 |
62 | {children} 63 | 64 |
65 |
66 |
67 | ) 68 | } 69 | 70 | Main.propTypes = { 71 | children: PropTypes.node 72 | } 73 | 74 | export default Main -------------------------------------------------------------------------------- /src/views/web/landing/components/Feature/Parallax.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import { Parallax, ParallaxProvider } from 'react-scroll-parallax' 4 | 5 | import useStyles from './feature-style' 6 | 7 | export default function ParallaxDeco() { 8 | const classes = useStyles() 9 | return ( 10 |
11 | 12 |
13 | 16 | 26 | 27 | 28 | 29 | 30 | 33 | 43 | 44 | 45 | 46 | 47 | 50 | 60 | 61 | 62 | 63 |
64 |
65 |
66 | ) 67 | } -------------------------------------------------------------------------------- /src/layouts/admin/Main.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import PropTypes from 'prop-types' 3 | import React, { useState } from 'react' 4 | import { useMediaQuery } from '@material-ui/core' 5 | import { makeStyles, useTheme } from '@material-ui/styles' 6 | 7 | import Footer from './components/Footer' 8 | import Topbar from './components/Topbar' 9 | import Sidebar from './components/sidebar/Sidebar' 10 | 11 | const useStyles = makeStyles(theme => ({ 12 | root: { 13 | paddingTop: 56, 14 | height: '100%', 15 | [theme.breakpoints.up('sm')]: { 16 | paddingTop: 64 17 | } 18 | }, 19 | shiftContent: { 20 | paddingLeft: 240 21 | }, 22 | content: { 23 | height: '100%' 24 | } 25 | })) 26 | 27 | const Main = props => { 28 | const { children } = props 29 | 30 | const theme = useTheme() 31 | const classes = useStyles() 32 | const isDesktop = useMediaQuery(theme.breakpoints.up('lg'), { 33 | defaultMatches: true 34 | }) 35 | 36 | const [openSidebar, setOpenSidebar] = useState(false) 37 | 38 | const onSidebarOpen = () => { 39 | setOpenSidebar(true) 40 | } 41 | 42 | const onSidebarClose = () => { 43 | setOpenSidebar(false) 44 | } 45 | 46 | const shouldOpenSidebar = isDesktop ? true : openSidebar 47 | 48 | return ( 49 |
54 | 55 | 56 | 60 | 61 |
62 | {children} 63 | 64 |
65 |
66 |
67 | ) 68 | } 69 | 70 | Main.propTypes = { 71 | children: PropTypes.node 72 | } 73 | 74 | export default Main -------------------------------------------------------------------------------- /src/layouts/user/components/Topbar.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import PropTypes from 'prop-types' 3 | import React, { useState } from 'react' 4 | import MenuIcon from '@material-ui/icons/Menu' 5 | import { makeStyles } from '@material-ui/styles' 6 | import { Link as RouterLink } from 'react-router-dom' 7 | import NotificationsIcon from '@material-ui/icons/NotificationsOutlined' 8 | import { AppBar, Toolbar, Badge, Hidden, IconButton } from '@material-ui/core' 9 | 10 | const useStyles = makeStyles(theme => ({ 11 | root: { 12 | boxShadow: 'none' 13 | }, 14 | flexGrow: { 15 | flexGrow: 1 16 | }, 17 | signOutButton: { 18 | marginLeft: theme.spacing(1) 19 | } 20 | })) 21 | 22 | const Topbar = props => { 23 | const { className, onSidebarOpen, history, ...rest } = props 24 | 25 | const classes = useStyles() 26 | 27 | const [notifications] = useState([]) 28 | 29 | return ( 30 | 33 | 34 | 35 | logo 38 | 39 | 40 |
41 | 42 | 43 | 44 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | 61 | 62 | ) 63 | } 64 | 65 | Topbar.propTypes = { 66 | history: PropTypes.object, 67 | className: PropTypes.string, 68 | onSidebarOpen: PropTypes.func 69 | } 70 | 71 | export default Topbar -------------------------------------------------------------------------------- /src/views/admin/logs/Logs.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import { makeStyles } from '@material-ui/styles' 3 | import React, { useEffect, useState } from 'react' 4 | import { Grid, Dialog, CircularProgress, DialogContent } from '@material-ui/core' 5 | 6 | import { AdminApi } from 'config/Api' 7 | import LogsTable from './components/LogsTable' 8 | 9 | const adminApi = new AdminApi() 10 | 11 | const useStyles = makeStyles(theme => ({ 12 | root: { 13 | padding: theme.spacing(4) 14 | } 15 | })) 16 | 17 | const Subscriptions = () => { 18 | const classes = useStyles() 19 | const { enqueueSnackbar } = useSnackbar() 20 | 21 | const adminId = localStorage.getItem('adminId') 22 | 23 | const [isLoading, setIsLoading] = useState(true) 24 | const [logsState, setLogsState] = useState([]) 25 | 26 | useEffect(() => { fetchLogs() }, []) 27 | 28 | const fetchLogs = async () => { 29 | const fetchLogsResult = await adminApi.fetchLogs({ adminId }) 30 | if (fetchLogsResult.error) { 31 | setIsLoading(false) 32 | return enqueueSnackbar(fetchLogsResult.message, { variant: 'error' }) 33 | } 34 | 35 | setLogsState(fetchLogsResult.data) 36 | setIsLoading(false) 37 | } 38 | 39 | const reloadData = () => fetchLogs() 40 | 41 | if (isLoading) 42 | return ( 43 | 44 | 45 | 46 | 47 | 48 | ) 49 | 50 | return ( 51 |
52 | 55 | 61 | 65 | 66 | 67 |
68 | ) 69 | } 70 | 71 | export default Subscriptions -------------------------------------------------------------------------------- /src/views/admin/subscriptions/components/SubscriptionsList.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Grid } from '@material-ui/core' 3 | import { makeStyles } from '@material-ui/styles' 4 | 5 | import SubscriptionsCard from './components/SubscriptionsCard' 6 | 7 | const useStyles = makeStyles(theme => ({ 8 | root: {}, 9 | row: { 10 | height: '42px', 11 | display: 'flex', 12 | alignItems: 'center', 13 | marginTop: theme.spacing(1) 14 | }, 15 | content: { 16 | marginTop: theme.spacing(2) 17 | }, 18 | pagination: { 19 | display: 'flex', 20 | alignItems: 'center', 21 | justifyContent: 'flex-end', 22 | marginTop: theme.spacing(3) 23 | } 24 | })) 25 | 26 | const SubscriptionsList = props => { 27 | const { reloadData, subscriptionsState } = props 28 | 29 | const classes = useStyles() 30 | 31 | return ( 32 |
33 |
34 | 37 | { 38 | subscriptionsState.map((subscription, i) => ( 39 | 45 | 48 | 49 | )) 50 | } 51 | 52 |
53 |
54 | ) 55 | } 56 | 57 | export default SubscriptionsList -------------------------------------------------------------------------------- /src/views/web/auth/components/Title/title-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles'; 2 | 3 | const titleStyles = makeStyles(theme => ({ 4 | left: { 5 | textAlign: 'left', 6 | '&:after': { 7 | left: 0, 8 | } 9 | }, 10 | right: { 11 | textAlign: 'right', 12 | '&:after': { 13 | right: 0, 14 | } 15 | }, 16 | center: { 17 | textAlign: 'center', 18 | '&:after': { 19 | left: '50%', 20 | marginLeft: -35, 21 | } 22 | }, 23 | caption: { 24 | textTransform: 'uppercase', 25 | color: theme.palette.type === 'dark' ? theme.palette.primary.light : theme.palette.primary.dark, 26 | fontWeight: theme.typography.fontWeightBold, 27 | fontSize: 16, 28 | marginBottom: theme.spacing(), 29 | [theme.breakpoints.down('sm')]: { 30 | fontSize: 12 31 | } 32 | }, 33 | dark: {}, 34 | title: { 35 | display: 'block', 36 | position: 'relative', 37 | marginBottom: theme.spacing(3), 38 | '& h4': { 39 | color: theme.palette.text.primary, 40 | fontWeight: theme.typography.fontWeightBold, 41 | textTransform: 'capitalize', 42 | lineHeight: '32px', 43 | [theme.breakpoints.down('sm')]: { 44 | fontSize: 22 45 | } 46 | }, 47 | '&$dark': { 48 | '& $caption': { 49 | color: theme.palette.primary.light 50 | }, 51 | '& h4': { 52 | color: theme.palette.common.white, 53 | } 54 | } 55 | }, 56 | titleSecondary: { 57 | display: 'block', 58 | position: 'relative', 59 | '& h4': { 60 | color: theme.palette.text.primary, 61 | fontWeight: theme.typography.fontWeightBold, 62 | textTransform: 'capitalize' 63 | }, 64 | '& strong': { 65 | color: theme.palette.text.primary, 66 | } 67 | } 68 | })); 69 | 70 | export default titleStyles; 71 | -------------------------------------------------------------------------------- /src/layouts/admin/components/sidebar/components/Profile.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import PropTypes from 'prop-types' 3 | import { makeStyles } from '@material-ui/styles' 4 | import React, { useState, useEffect } from 'react' 5 | import { Link as RouterLink } from 'react-router-dom' 6 | import { Avatar, Typography, colors } from '@material-ui/core' 7 | 8 | import getInitials from 'helpers/getInitials' 9 | 10 | const useStyles = makeStyles(theme => ({ 11 | root: { 12 | display: 'flex', 13 | alignItems: 'center', 14 | flexDirection: 'column', 15 | minHeight: 'fit-content' 16 | }, 17 | avatar: { 18 | width: 60, 19 | height: 60, 20 | backgroundColor: colors.blue[500] 21 | }, 22 | name: { 23 | marginTop: theme.spacing(1) 24 | } 25 | })) 26 | 27 | const Profile = props => { 28 | const { className, profile, ...rest } = props 29 | 30 | const classes = useStyles() 31 | 32 | const [profileState, setProfileState] = useState({ 33 | avatar: '', 34 | lastName: '', 35 | firstName: '' 36 | }) 37 | 38 | useEffect(() => { 39 | setProfileState(profileState => ({ 40 | ...profileState, 41 | avatar: profile.avatar, 42 | lastName: profile.lastName, 43 | firstName: profile.firstName 44 | })) 45 | }, [profile]) 46 | 47 | return ( 48 |
51 | 56 | {getInitials(profileState.firstName + ' ' + profileState.lastName)} 57 | 58 | 59 | 62 | {profileState.firstName + ' ' + profileState.lastName} 63 | 64 |
65 | ) 66 | } 67 | 68 | Profile.propTypes = { 69 | className: PropTypes.string 70 | } 71 | 72 | export default Profile 73 | -------------------------------------------------------------------------------- /src/views/user/dashboard/components/TotalProfits.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | import AttachMoneyIcon from '@material-ui/icons/AttachMoney' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%', 11 | color: theme.palette.primary.contrastText, 12 | backgroundColor: theme.palette.primary.main 13 | }, 14 | content: { 15 | display: 'flex', 16 | alignItems: 'center' 17 | }, 18 | title: { 19 | fontWeight: 700 20 | }, 21 | avatar: { 22 | width: 56, 23 | height: 56, 24 | color: theme.palette.primary.main, 25 | backgroundColor: theme.palette.white 26 | }, 27 | icon: { 28 | width: 32, 29 | height: 32 30 | } 31 | })) 32 | 33 | const TotalProfit = props => { 34 | const { className, profits, ...rest } = props 35 | 36 | const classes = useStyles() 37 | 38 | return ( 39 | 42 | 43 | 46 | 47 | 52 | TOTAL PROFIT 53 | 54 | 55 | 58 | ${profits} 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | ) 71 | } 72 | 73 | TotalProfit.propTypes = { 74 | className: PropTypes.string 75 | } 76 | 77 | export default TotalProfit -------------------------------------------------------------------------------- /public/images/features-news.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 8 | 9 | 12 | 14 | 16 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/views/admin/questions/Questions.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import { makeStyles } from '@material-ui/styles' 3 | import React, { useEffect, useState } from 'react' 4 | import { Grid, Dialog, CircularProgress, DialogContent } from '@material-ui/core' 5 | 6 | import { AdminApi } from 'config/Api' 7 | import QuestionsTable from './components/QuestionsTable' 8 | 9 | const adminApi = new AdminApi() 10 | 11 | const useStyles = makeStyles(theme => ({ 12 | root: { 13 | padding: theme.spacing(4) 14 | } 15 | })) 16 | 17 | const Questions = () => { 18 | const classes = useStyles() 19 | const { enqueueSnackbar } = useSnackbar() 20 | 21 | const adminId = localStorage.getItem('adminId') 22 | 23 | const [isLoading, setIsLoading] = useState(true) 24 | const [questionsState, setQuestionsState] = useState([]) 25 | 26 | useEffect(() => { 27 | fetchQuestionsList() 28 | }, []) 29 | 30 | const fetchQuestionsList = async () => { 31 | const fetchQuestionsListResult = await adminApi.fetchQuestions({ adminId }) 32 | if (fetchQuestionsListResult.error) { 33 | setIsLoading(false) 34 | return enqueueSnackbar(fetchQuestionsListResult.message, { variant: 'error' }) 35 | } 36 | 37 | setQuestionsState(fetchQuestionsListResult.data) 38 | setIsLoading(false) 39 | } 40 | 41 | const reloadData = () => fetchQuestionsList() 42 | 43 | if (isLoading) 44 | return ( 45 | 46 | 47 | 48 | 49 | 50 | ) 51 | 52 | return ( 53 |
54 | 57 | 63 | 66 | 67 | 68 |
69 | ) 70 | } 71 | 72 | export default Questions -------------------------------------------------------------------------------- /src/layouts/user/components/sidebar/components/UpgradePlan.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { Link } from 'react-router-dom' 5 | import { makeStyles } from '@material-ui/styles' 6 | import { Typography, Button } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | marginTop: 50, 11 | borderRadius: 25, 12 | backgroundColor: theme.palette.background.default 13 | }, 14 | media: { 15 | height: 80, 16 | textAlign: 'center', 17 | paddingTop: theme.spacing(2), 18 | '& > img': { 19 | width: 'auto', 20 | height: '100%' 21 | } 22 | }, 23 | content: { 24 | padding: theme.spacing(1, 2) 25 | }, 26 | actions: { 27 | display: 'flex', 28 | justifyContent: 'center', 29 | padding: theme.spacing(1, 2) 30 | } 31 | })) 32 | 33 | const UpgradePlan = props => { 34 | const { className, ...rest } = props 35 | 36 | const classes = useStyles() 37 | 38 | return ( 39 |
42 |
43 | upgrade 46 |
47 | 48 |
49 | 53 | Upgrade Subscription 54 | 55 | 56 | 59 | Upgrade your Subscription to recieve all signals 60 | 61 |
62 | 63 |
64 | 71 |
72 |
73 | ) 74 | } 75 | 76 | UpgradePlan.propTypes = { 77 | className: PropTypes.string 78 | } 79 | 80 | export default UpgradePlan -------------------------------------------------------------------------------- /public/locales/ar/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "مثال بسيط", 3 | "subtitle": "إنها صفحة فارغة. ابدأ في إنشاء صفحتك من هنا.", 4 | "error_with_status": "حدث خطأ على الخادم", 5 | "404": "تعذر العثور على هذه الصفحة.", 6 | "404_subtitle": "يمكنك إما البقاء والاسترخاء هنا ، أو العودة إلى البداية.", 7 | "back": "العودة إلى المنزل", 8 | "error_without_status": "حدث خطأ على الخادم", 9 | "contact_title": "مشروع مجاني اقتباس", 10 | "contact_title2": "قل مرحبا لنا", 11 | "contact_subtitle": "هل لديك أي أسئلة؟ هل أنت مستعد لخفض التكلفة وتحقيق إيرادات جديدة؟ أو هل تريد فقط أن تقول مرحبا؟ أرسل لنا رسالة.", 12 | "form_name": "ما اسمك؟ *", 13 | "form_email": "ما هو بريدك الإلكتروني؟ *", 14 | "form_phone": "ما هو رقم هاتفك؟", 15 | "form_company": "ما هي شركتك؟", 16 | "form_message": "اكتب رسالتك هنا", 17 | "form_terms": "لقد قرأت ووافقت على شروط", 18 | "form_privacy": "سياسة الخدمة والخصوصية *", 19 | "form_send": "إرسال رسالة", 20 | "login": "تسجيل الدخول", 21 | "login_lcreate": "إنشاء حساب جديد", 22 | "login_or": "أو تسجيل الدخول عبر البريد الإلكتروني", 23 | "login_email": "البريد الإلكتروني", 24 | "login_password": "كلمه السر", 25 | "login_remember": "تذكر", 26 | "login_forgot": "نسيت كلمة المرور", 27 | "continue": "استمر", 28 | "login_title": "مرحبًا بك مرة أخرى", 29 | "login_subtitle": "الرجاء تسجيل الدخول للمتابعة", 30 | "register": "تسجيل", 31 | "register_already": "هل لديك حساب بالفعل؟", 32 | "register_or": "أو التسجيل باستخدام البريد الإلكتروني", 33 | "register_name": "الاسم؟ *", 34 | "register_email": "البريد الإلكتروني؟ *", 35 | "register_password": "كلمه السر", 36 | "register_confirm": "تأكيد كلمة المرور", 37 | "register_title": "تشرفت بمعرفتك :)", 38 | "register_subtitle": "فقط سجل للانضمام إلينا", 39 | "accept": "قبول", 40 | "en": "English", 41 | "de": "Deutsch", 42 | "zh": "简体中文", 43 | "pt": "󠁥󠁮󠁧󠁿Português", 44 | "id": "󠁥󠁮󠁧󠁿Bahasa Indonesia", 45 | "ar": "󠁥󠁮󠁧󠁿العربيّة" 46 | } -------------------------------------------------------------------------------- /public/images/features-support.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 9 | 14 | 15 | 16 | 18 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/theme/Palette.js: -------------------------------------------------------------------------------- 1 | import { colors } from '@material-ui/core' 2 | 3 | const white = '#FFFFFF' 4 | const black = '#000000' 5 | 6 | export default { 7 | main: { 8 | palette: { 9 | black, 10 | white, 11 | primary: { 12 | contrastText: white, 13 | dark: colors.blue[900], 14 | main: colors.blue[500], 15 | light: colors.blue[100] 16 | }, 17 | secondary: { 18 | contrastText: white, 19 | dark: colors.orange[900], 20 | main: colors.orange[500], 21 | light: colors.orange[100] 22 | }, 23 | success: { 24 | contrastText: white, 25 | dark: colors.green[900], 26 | main: colors.green[600], 27 | light: colors.green[400] 28 | }, 29 | info: { 30 | contrastText: white, 31 | dark: colors.blue[900], 32 | main: colors.blue[600], 33 | light: colors.blue[400] 34 | }, 35 | warning: { 36 | contrastText: white, 37 | dark: colors.orange[900], 38 | main: colors.orange[600], 39 | light: colors.orange[400] 40 | }, 41 | error: { 42 | contrastText: white, 43 | dark: colors.red[900], 44 | main: colors.red[600], 45 | light: colors.red[400] 46 | }, 47 | text: { 48 | link: colors.blue[600], 49 | primary: colors.blueGrey[900], 50 | secondary: colors.blueGrey[600] 51 | }, 52 | background: { 53 | paper: white, 54 | default: '#F4F6F8' 55 | }, 56 | icon: colors.blueGrey[600], 57 | divider: colors.grey[200] 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /src/layouts/user/components/sidebar/components/Profile.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import PropTypes from 'prop-types' 3 | import { makeStyles } from '@material-ui/styles' 4 | import React, { useState, useEffect } from 'react' 5 | import { Link as RouterLink } from 'react-router-dom' 6 | import { Avatar, Typography, colors } from '@material-ui/core' 7 | 8 | import getInitials from 'helpers/getInitials' 9 | 10 | const useStyles = makeStyles(theme => ({ 11 | root: { 12 | display: 'flex', 13 | alignItems: 'center', 14 | flexDirection: 'column', 15 | minHeight: 'fit-content' 16 | }, 17 | avatar: { 18 | width: 60, 19 | height: 60, 20 | backgroundColor: colors.blue[500] 21 | }, 22 | name: { 23 | marginTop: theme.spacing(1) 24 | } 25 | })) 26 | 27 | const Profile = props => { 28 | const { className, profile, ...rest } = props 29 | 30 | const classes = useStyles() 31 | 32 | const [profileState, setProfileState] = useState({ 33 | avatar: '', 34 | lastName: '', 35 | firstName: '', 36 | membership: '' 37 | }) 38 | 39 | useEffect(() => { 40 | setProfileState(profileState => ({ 41 | ...profileState, 42 | avatar: profile.avatar, 43 | lastName: profile.lastName, 44 | firstName: profile.firstName, 45 | membership: profile.membership 46 | })) 47 | }, [profile]) 48 | 49 | return ( 50 |
53 | 58 | {getInitials(profileState.firstName + ' ' + profileState.lastName)} 59 | 60 | 61 | 64 | {profileState.firstName + ' ' + profileState.lastName} 65 | 66 | 67 | {profileState.membership} 68 |
69 | ) 70 | } 71 | 72 | Profile.propTypes = { 73 | className: PropTypes.string 74 | } 75 | 76 | export default Profile -------------------------------------------------------------------------------- /public/locales/en/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "A simple example", 3 | "subtitle": "It's a blank-page. Start to build your'e page from here.", 4 | "error_with_status": "An error occurred on server", 5 | "404": "This page could not be found.", 6 | "404_subtitle": "You can either stay and chill here, or go back to the beginning.", 7 | "back": "back to home", 8 | "error_without_status": "An error occurred on the server", 9 | "contact_title": "Free Project Quote", 10 | "contact_title2": "Say Hello to Us", 11 | "contact_subtitle": "Do you have any questions? Are you ready to reduce cost and create new revenue? Or you simply want to say hi? Drop us a message.", 12 | "form_name": "What is your name? *", 13 | "form_email": "What it your email? *", 14 | "form_phone": "What is your phone number?", 15 | "form_company": "What is your company?", 16 | "form_message": "Write your message here", 17 | "form_terms": "I have read and accept the Terms of", 18 | "form_privacy": "Service & Privacy Policy *", 19 | "form_send": "Send Message", 20 | "login": "login", 21 | "login_create": "Create new account", 22 | "login_or": "Or login with email", 23 | "login_email": "Email", 24 | "login_password": "Password", 25 | "login_remember": "Remember", 26 | "login_forgot": "Forgot Password", 27 | "continue": "Continue", 28 | "login_title": "Welcome back", 29 | "login_subtitle": "Please login to continue", 30 | "register": "Register", 31 | "register_already": "Already have account?", 32 | "register_or": "Or register with email", 33 | "register_name": "Name? *", 34 | "register_email": "Email? *", 35 | "register_password": "Password", 36 | "register_confirm": "Confirm Password", 37 | "register_title": "Nice to meet you :)", 38 | "register_subtitle": "Just register to join with us", 39 | "accept": "Accept", 40 | "en": "English", 41 | "de": "Deutsch", 42 | "zh": "简体中文", 43 | "pt": "󠁥󠁮󠁧󠁿Português", 44 | "id": "󠁥󠁮󠁧󠁿Bahasa Indonesia", 45 | "ar": "󠁥󠁮󠁧󠁿العربيّة" 46 | } -------------------------------------------------------------------------------- /src/views/web/landing/components/Disclaimer/Disclaimer.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { makeStyles } from '@material-ui/core/styles' 3 | import { Typography, Container, Grid } from '@material-ui/core' 4 | 5 | const useStyles = makeStyles(theme => ({ 6 | container: { 7 | display: 'flex' 8 | }, 9 | cardWrapper: { 10 | zIndex: 1 11 | } 12 | })) 13 | 14 | const Disclaimer = () => { 15 | const classes = useStyles() 16 | 17 | return ( 18 | 19 | 20 | 25 | 28 | RISK DISCLAIMER: 29 | 30 | 31 | 32 | Trading foreiegn exchange, commodities, crypto currencies, shares, bonds, indices carries high level of risk and may not suitable for every investor. Whole capital is at risk and entire amount of investment may be lost in short period of time. 33 | 34 | 35 | 36 | Megatrade.world will not accept any liability for loss of capital, damage, loss of profit which may arise directly or indirectly from use of or reliance on Megatrade.world service/products. The possibility exists that loss could sustain to all or some of your initial investment. 37 | 38 | 39 | 40 | Past performance displayed on Megatrade.world is not indicative of future results. No representation is being made that anyone is likely to achieve profits or losses similar to those shown on Megatrade.world before getting involved in trading you should carefully consider your objectives, risks, level of your experience. If you have any doubts you should seek advice from independent financial advisor. 41 | 42 | 43 | 44 | 45 | ) 46 | } 47 | 48 | export default Disclaimer -------------------------------------------------------------------------------- /src/views/user/support/components/SupportLive.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import SendIcon from '@material-ui/icons/Send' 4 | import { makeStyles } from '@material-ui/styles' 5 | import { Card, CardContent, CardActions, TextField, InputAdornment, IconButton, Paper, colors } from '@material-ui/core' 6 | 7 | import ComingSoon from './ComingSoon' 8 | 9 | const useStyles = makeStyles(theme => ({ 10 | root: {}, 11 | paperUpgrade: { 12 | display: 'flex', 13 | width: '100%', 14 | alignItems: 'center', 15 | justifyContent: 'center', 16 | height: window.innerHeight * 0.7, 17 | backgroundColor: theme.palette.background.default 18 | }, 19 | paper: { 20 | width: '100%', 21 | height: window.innerHeight * 0.7, 22 | backgroundColor: theme.palette.background.default 23 | }, 24 | content: { 25 | width: '100%', 26 | padding: '2%', 27 | overflow: 'auto', 28 | position: 'relative', 29 | maxHeight: window.innerHeight * 0.7 30 | }, 31 | avatar: { 32 | marginRight: theme.spacing(2), 33 | backgroundColor: colors.blue[500] 34 | } 35 | })) 36 | 37 | const SupportLive = props => { 38 | const { className, ...rest } = props 39 | 40 | const classes = useStyles() 41 | 42 | return ( 43 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 62 | 66 | 67 | 68 | 69 | }} /> 70 | 71 | 72 | ) 73 | } 74 | 75 | SupportLive.propTypes = { 76 | className: PropTypes.string 77 | } 78 | 79 | export default SupportLive -------------------------------------------------------------------------------- /public/locales/pt/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Um exemplo simples", 3 | "subtitle": "É uma página em branco. Comece a construir sua página aqui.", 4 | "error_with_status": "Ocorreu um erro no servidor", 5 | "404": "Não foi possível encontrar esta página.", 6 | "404_subtitle": "Você pode ficar e relaxar aqui, ou voltar ao começo.", 7 | "back": "voltar para casa", 8 | "error_without_status": "Ocorreu um erro no servidor", 9 | "contact_title": "Orçamento gratuito do projeto", 10 | "contact_title2": "Diga Olá para nós", 11 | "contact_subtitle": "Você tem alguma dúvida? Você está pronto para reduzir custos e criar novas receitas? Ou simplesmente quer dizer oi? Envie-nos uma mensagem.", 12 | "form_name": "Qual é o seu nome? *", 13 | "form_email": "Qual é o seu email? *", 14 | "form_phone": "Qual é o seu número de telefone?", 15 | "form_company": "Qual é a sua empresa?", 16 | "form_message": "Escreva sua mensagem aqui", 17 | "form_terms": "Li e aceito os Termos de", 18 | "form_privacy": "Serviço e política de privacidade *", 19 | "form_send": "Enviar mensagem", 20 | "login": "login", 21 | "login_create": "Crie uma nova conta", 22 | "login_or": "Ou entre com o e-mail", 23 | "login_email": "E-mail", 24 | "login_password": "Senha", 25 | "login_remember": "Lembre-se", 26 | "login_forgot": "Esqueceu a senha", 27 | "continue": "Continuar", 28 | "login_title": "Bem-vindo de volta", 29 | "login_subtitle": "Faça o login para continuar", 30 | "register": "Registo", 31 | "register_already": "Já possui uma conta?", 32 | "register_or": "Ou registre-se com o email", 33 | "register_name": "Nome? *", 34 | "register_email": "E-mail? *", 35 | "register_password": "Senha", 36 | "register_confirm": "Confirmar senha", 37 | "register_title": "Prazer em conhecê-lo :)", 38 | "register_subtitle": "Basta registrar-se para se juntar a nós", 39 | "accept": "aceitar", 40 | "en": "English", 41 | "de": "Deutsch", 42 | "zh": "简体中文", 43 | "pt": "󠁥󠁮󠁧󠁿Português", 44 | "id": "󠁥󠁮󠁧󠁿Bahasa Indonesia", 45 | "ar": "󠁥󠁮󠁧󠁿العربيّة" 46 | } -------------------------------------------------------------------------------- /src/theme/Typography.js: -------------------------------------------------------------------------------- 1 | import Palette from './Palette' 2 | 3 | export default { 4 | h1: { 5 | fontWeight: 500, 6 | fontSize: '35px', 7 | lineHeight: '40px', 8 | letterSpacing: '-0.24px', 9 | color: Palette.text.primary 10 | }, 11 | h2: { 12 | fontWeight: 500, 13 | fontSize: '29px', 14 | lineHeight: '32px', 15 | letterSpacing: '-0.24px', 16 | color: Palette.text.primary 17 | }, 18 | h3: { 19 | fontWeight: 500, 20 | fontSize: '24px', 21 | lineHeight: '28px', 22 | letterSpacing: '-0.06px', 23 | color: Palette.text.primary 24 | }, 25 | h4: { 26 | fontWeight: 500, 27 | fontSize: '20px', 28 | lineHeight: '24px', 29 | letterSpacing: '-0.06px', 30 | color: Palette.text.primary 31 | }, 32 | h5: { 33 | fontWeight: 500, 34 | fontSize: '16px', 35 | lineHeight: '20px', 36 | letterSpacing: '-0.05px', 37 | color: Palette.text.primary 38 | }, 39 | h6: { 40 | fontWeight: 500, 41 | fontSize: '14px', 42 | lineHeight: '20px', 43 | letterSpacing: '-0.05px', 44 | color: Palette.text.primary 45 | }, 46 | subtitle1: { 47 | fontSize: '16px', 48 | lineHeight: '25px', 49 | letterSpacing: '-0.05px', 50 | color: Palette.text.primary 51 | }, 52 | subtitle2: { 53 | fontWeight: 400, 54 | fontSize: '14px', 55 | lineHeight: '21px', 56 | letterSpacing: '-0.05px', 57 | color: Palette.text.secondary 58 | }, 59 | body1: { 60 | fontSize: '14px', 61 | lineHeight: '21px', 62 | letterSpacing: '-0.05px', 63 | color: Palette.text.primary 64 | }, 65 | body2: { 66 | fontSize: '12px', 67 | lineHeight: '18px', 68 | letterSpacing: '-0.04px', 69 | color: Palette.text.secondary 70 | }, 71 | button: { 72 | fontSize: '14px', 73 | color: Palette.text.primary 74 | }, 75 | caption: { 76 | fontSize: '11px', 77 | lineHeight: '13px', 78 | letterSpacing: '0.33px', 79 | color: Palette.text.secondary 80 | }, 81 | overline: { 82 | fontWeight: 500, 83 | fontSize: '11px', 84 | lineHeight: '13px', 85 | letterSpacing: '0.33px', 86 | textTransform: 'uppercase', 87 | color: Palette.text.secondary 88 | } 89 | } -------------------------------------------------------------------------------- /src/views/web/landing/components/Subscribe/SubscribeForm.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import React, { useState } from 'react' 3 | import SendIcon from '@material-ui/icons/Send' 4 | import { Paper, Typography, TextField, Button, Grid } from '@material-ui/core' 5 | 6 | import useStyles from './subscribe-style' 7 | import { MiscellaneousApi } from 'config/Api' 8 | 9 | const miscellaneousApi = new MiscellaneousApi() 10 | 11 | const Pricing = () => { 12 | const classes = useStyles() 13 | const { enqueueSnackbar } = useSnackbar() 14 | 15 | const [values, setValues] = useState({ 16 | email: '', 17 | }) 18 | 19 | const handleChange = name => event => { 20 | setValues({ ...values, [name]: event.target.value }) 21 | } 22 | 23 | const onSubscribePress = async () => { 24 | const subscribeResult = await miscellaneousApi.newsLetter({ email: values.email }) 25 | if (subscribeResult.error) 26 | enqueueSnackbar(subscribeResult.message, { variant: 'error' }) 27 | else 28 | enqueueSnackbar(subscribeResult.message, { variant: 'success' }) 29 | } 30 | 31 | return ( 32 |
33 | 34 | Subscribe Our Newsletter 35 | 36 |
37 | 38 | 39 | 47 | 48 | 49 | 50 | 53 | 54 | 55 |
56 |
57 |
58 | ) 59 | } 60 | 61 | export default Pricing -------------------------------------------------------------------------------- /public/locales/id/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Contoh sederhana", 3 | "subtitle": "Ini halaman kosong. Mulai buat halaman Anda dari sini.", 4 | "error_with_status": "Terjadi kesalahan di server", 5 | "404": "Halaman ini tidak dapat ditemukan.", 6 | "404_subtitle": "Anda bisa tinggal dan bersantai di sini, atau kembali ke awal.", 7 | "back": "kembali ke beranda", 8 | "error_without_status": "Terjadi kesalahan di server", 9 | "contact_title": "Kutipan Proyek Gratis", 10 | "contact_title2": "Katakan Halo kepada Kami", 11 | "contact_subtitle": "Apakah Anda memiliki pertanyaan? Apakah Anda siap untuk mengurangi biaya dan membuat pendapatan baru? Atau Anda hanya ingin menyapa? Kirim pesan kepada kami.", 12 | "form_name": "Siapa nama Anda? *", 13 | "form_email": "Apa itu email Anda? *", 14 | "form_phone": "Berapa nomor telepon Anda?", 15 | "form_company": "Apa perusahaan Anda?", 16 | "form_message": "Tulis pesan Anda di sini", 17 | "form_terms": "Saya telah membaca dan menerima Ketentuan", 18 | "form_privacy": "Layanan & Kebijakan Privasi *", 19 | "form_send": "Kirim Pesan", 20 | "login": "masuk", 21 | "login_create": "Buat akun baru", 22 | "login_or": "Atau masuk dengan email", 23 | "login_email": "Email", 24 | "login_password": "Kata Sandi", 25 | "login_remember": "Ingat", 26 | "login_forgot": "Lupa Kata Sandi", 27 | "continue": "Lanjutkan", 28 | "login_title": "Selamat datang kembali", 29 | "login_subtitle": "Silakan masuk untuk melanjutkan", 30 | "register": "Daftar", 31 | "register_already": "Sudah punya akun?", 32 | "register_or": "Atau daftar dengan email", 33 | "register_name": "Nama? *", 34 | "register_email": "Email? *", 35 | "register_password": "Kata Sandi", 36 | "register_confirm": "Konfirmasi Kata Sandi", 37 | "register_title": "Senang bertemu Anda :)", 38 | "register_subtitle": "Cukup daftar untuk bergabung dengan kami", 39 | "accept": "Setuju", 40 | "en": "English", 41 | "de": "Deutsch", 42 | "zh": "简体中文", 43 | "pt": "󠁥󠁮󠁧󠁿Português", 44 | "id": "󠁥󠁮󠁧󠁿Bahasa Indonesia", 45 | "ar": "󠁥󠁮󠁧󠁿العربيّة" 46 | } -------------------------------------------------------------------------------- /src/views/user/education/Education.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { makeStyles } from '@material-ui/styles' 3 | import { Typography, Grid } from '@material-ui/core' 4 | 5 | const useStyles = makeStyles(theme => ({ 6 | root: { 7 | padding: theme.spacing(3) 8 | }, 9 | content: { 10 | marginTop: 20, 11 | textAlign: 'center' 12 | }, 13 | contentInner: { 14 | marginTop: 20 15 | }, 16 | image: { 17 | width: 560, 18 | marginTop: 50, 19 | maxWidth: '100%', 20 | display: 'inline-block' 21 | } 22 | })) 23 | 24 | const Education = () => { 25 | const classes = useStyles() 26 | 27 | return ( 28 |
29 | 33 | 37 |
38 | 39 | Coming Soon! 40 | 41 | 42 |
43 | 44 | We are working on making the educational content available as soon as possible, stay tuned and we will notify you once we launch. 45 | 46 | 47 | 48 | In the mean time feel free to email us your thoughts. 49 | 50 |
51 | 52 | not found 56 |
57 |
58 |
59 |
60 | ) 61 | } 62 | 63 | export default Education -------------------------------------------------------------------------------- /src/views/admin/dashboard/components/TotalUsers.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | import PeopleIcon from '@material-ui/icons/PeopleOutlined' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%' 11 | }, 12 | content: { 13 | display: 'flex', 14 | alignItems: 'center' 15 | }, 16 | title: { 17 | fontWeight: 700 18 | }, 19 | avatar: { 20 | width: 56, 21 | height: 56, 22 | backgroundColor: 'green' 23 | }, 24 | icon: { 25 | height: 32, 26 | width: 32 27 | } 28 | })) 29 | 30 | const TotalUsers = props => { 31 | const { className, users, ...rest } = props 32 | 33 | const classes = useStyles() 34 | 35 | return ( 36 | 39 | 40 | 43 | 44 | 49 | TOTAL USERS 50 | 51 | 52 | {users} 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | 66 | TotalUsers.propTypes = { 67 | className: PropTypes.string 68 | } 69 | 70 | export default TotalUsers -------------------------------------------------------------------------------- /src/views/admin/dashboard/components/TotalSignals.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | import SignalsIcon from '@material-ui/icons/TrendingUp' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%' 11 | }, 12 | content: { 13 | display: 'flex', 14 | alignItems: 'center' 15 | }, 16 | title: { 17 | fontWeight: 700 18 | }, 19 | avatar: { 20 | width: 56, 21 | height: 56, 22 | backgroundColor: 'gold' 23 | }, 24 | icon: { 25 | height: 32, 26 | width: 32 27 | } 28 | })) 29 | 30 | const TotalUsers = props => { 31 | const { className, signals, ...rest } = props 32 | 33 | const classes = useStyles() 34 | 35 | return ( 36 | 39 | 40 | 43 | 44 | 49 | TOTAL SIGNALS 50 | 51 | 52 | {signals} 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | 66 | TotalUsers.propTypes = { 67 | className: PropTypes.string 68 | } 69 | 70 | export default TotalUsers -------------------------------------------------------------------------------- /src/views/admin/dashboard/components/TotalLogins.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | import LoginIcon from '@material-ui/icons/Input' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%' 11 | }, 12 | content: { 13 | display: 'flex', 14 | alignItems: 'center' 15 | }, 16 | title: { 17 | fontWeight: 700 18 | }, 19 | avatar: { 20 | width: 56, 21 | height: 56, 22 | backgroundColor: theme.palette.secondary.main 23 | }, 24 | icon: { 25 | height: 32, 26 | width: 32 27 | } 28 | })) 29 | 30 | const TotalUsers = props => { 31 | const { className, logins, ...rest } = props 32 | 33 | const classes = useStyles() 34 | 35 | return ( 36 | 39 | 40 | 43 | 44 | 49 | TOTAL LOGINS 50 | 51 | 52 | {logins} 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | 66 | TotalUsers.propTypes = { 67 | className: PropTypes.string 68 | } 69 | 70 | export default TotalUsers -------------------------------------------------------------------------------- /src/views/user/groupChat/components/GroupChatMembers.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { makeStyles } from '@material-ui/styles' 4 | import { Card, CardHeader, CardContent, Divider, List, ListItemText, ListItemAvatar, ListItem, Avatar, colors } from '@material-ui/core' 5 | 6 | import getInitials from 'helpers/getInitials' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%', 11 | maxHeight: window.innerHeight * 0.85 12 | }, 13 | avatar: { 14 | marginRight: theme.spacing(2), 15 | backgroundColor: colors.blue[500] 16 | }, 17 | content: { 18 | width: '100%', 19 | padding: '2%', 20 | overflow: 'auto', 21 | position: 'relative', 22 | maxHeight: window.innerHeight * 0.6, 23 | backgroundColor: theme.palette.background.paper 24 | } 25 | })) 26 | 27 | const GroupChatMembers = props => { 28 | const { className, users, profile, ...rest } = props 29 | 30 | const classes = useStyles() 31 | 32 | const userId = localStorage.getItem('userId') 33 | 34 | return ( 35 | 38 | 41 | 42 | 43 | 44 | 45 | 46 | {users.map((user, i) => ( 47 | 48 | 49 | 50 | 53 | {getInitials(user.fullName)} 54 | 55 | 56 | 57 | 60 | 61 | 62 | 63 | 64 | ))} 65 | 66 | 67 | 68 | ) 69 | } 70 | 71 | GroupChatMembers.propTypes = { 72 | className: PropTypes.string 73 | } 74 | 75 | export default GroupChatMembers -------------------------------------------------------------------------------- /src/views/admin/groupChat/components/GroupChatMembers.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PropTypes from 'prop-types' 3 | import { makeStyles } from '@material-ui/styles' 4 | import { Card, CardHeader, CardContent, Divider, List, ListItemText, ListItemAvatar, ListItem, Avatar, colors } from '@material-ui/core' 5 | 6 | import getInitials from 'helpers/getInitials' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%', 11 | maxHeight: window.innerHeight * 0.85 12 | }, 13 | avatar: { 14 | marginRight: theme.spacing(2), 15 | backgroundColor: colors.blue[500] 16 | }, 17 | content: { 18 | width: '100%', 19 | padding: '2%', 20 | overflow: 'auto', 21 | position: 'relative', 22 | maxHeight: window.innerHeight * 0.6, 23 | backgroundColor: theme.palette.background.paper 24 | } 25 | })) 26 | 27 | const GroupChatMembers = props => { 28 | const { className, users, profile, ...rest } = props 29 | 30 | const classes = useStyles() 31 | 32 | const adminId = localStorage.getItem('adminId') 33 | 34 | return ( 35 | 38 | 41 | 42 | 43 | 44 | 45 | 46 | {users.map((user, i) => ( 47 | 48 | 49 | 50 | 53 | {getInitials(user.fullName)} 54 | 55 | 56 | 57 | 60 | 61 | 62 | 63 | 64 | ))} 65 | 66 | 67 | 68 | ) 69 | } 70 | 71 | GroupChatMembers.propTypes = { 72 | className: PropTypes.string 73 | } 74 | 75 | export default GroupChatMembers -------------------------------------------------------------------------------- /src/views/admin/dashboard/components/TotalFreeSignals.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | import SignalsIcon from '@material-ui/icons/TrendingUp' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%' 11 | }, 12 | content: { 13 | display: 'flex', 14 | alignItems: 'center' 15 | }, 16 | title: { 17 | fontWeight: 700 18 | }, 19 | avatar: { 20 | width: 56, 21 | height: 56, 22 | backgroundColor: theme.palette.primary.main 23 | }, 24 | icon: { 25 | height: 32, 26 | width: 32 27 | } 28 | })) 29 | 30 | const TotalUsers = props => { 31 | const { className, freeSignals, ...rest } = props 32 | 33 | const classes = useStyles() 34 | 35 | return ( 36 | 39 | 40 | 43 | 44 | 49 | TOTAL FREE SIGNALS 50 | 51 | 52 | {freeSignals} 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | 66 | TotalUsers.propTypes = { 67 | className: PropTypes.string 68 | } 69 | 70 | export default TotalUsers -------------------------------------------------------------------------------- /src/layouts/admin/components/sidebar/components/SidebarNav.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import PropTypes from 'prop-types' 3 | import React, { forwardRef } from 'react' 4 | import { makeStyles } from '@material-ui/styles' 5 | import { NavLink as RouterLink } from 'react-router-dom' 6 | import { List, ListItem, Button } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: {}, 10 | item: { 11 | paddingTop: 0, 12 | display: 'flex', 13 | paddingBottom: 0 14 | }, 15 | button: { 16 | width: '100%', 17 | letterSpacing: 0, 18 | padding: '10px 8px', 19 | textTransform: 'none', 20 | color: theme.palette.text, 21 | justifyContent: 'flex-start', 22 | fontWeight: theme.typography.fontWeightMedium 23 | }, 24 | icon: { 25 | width: 24, 26 | height: 24, 27 | display: 'flex', 28 | alignItems: 'center', 29 | color: theme.palette.icon, 30 | marginRight: theme.spacing(1) 31 | }, 32 | active: { 33 | color: theme.palette.primary.main, 34 | fontWeight: theme.typography.fontWeightMedium, 35 | '& $icon': { 36 | color: theme.palette.primary.main 37 | } 38 | } 39 | })) 40 | 41 | const CustomRouterLink = forwardRef((props, ref) => ( 42 |
45 | 46 |
47 | )) 48 | 49 | const SidebarNav = props => { 50 | const { pages, className, ...rest } = props 51 | 52 | const classes = useStyles() 53 | 54 | return ( 55 | 58 | { 59 | pages.map(page => ( 60 | 64 | 72 | 73 | )) 74 | } 75 | 76 | ) 77 | } 78 | 79 | SidebarNav.propTypes = { 80 | className: PropTypes.string, 81 | pages: PropTypes.array.isRequired 82 | } 83 | 84 | export default SidebarNav -------------------------------------------------------------------------------- /src/views/user/viewSignals/ViewSignals.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import { makeStyles } from '@material-ui/styles' 3 | import React, { useEffect, useState } from 'react' 4 | import { Grid, Dialog, CircularProgress, DialogContent } from '@material-ui/core' 5 | 6 | import { UserApi } from 'config/Api' 7 | import SignalsTable from './components/SignalsTable' 8 | 9 | const userApi = new UserApi() 10 | 11 | const useStyles = makeStyles(theme => ({ 12 | root: { 13 | padding: theme.spacing(4) 14 | } 15 | })) 16 | 17 | const ViewSignals = () => { 18 | const classes = useStyles() 19 | const { enqueueSnackbar } = useSnackbar() 20 | 21 | const userId = localStorage.getItem('userId') 22 | 23 | const [isLoading, setIsLoading] = useState(true) 24 | const [signalsState, setSignalsState] = useState([]) 25 | 26 | useEffect(() => { fetchSignals() }, []) 27 | 28 | const fetchSignals = async () => { 29 | const fetchSignalsResult = await userApi.fetchSignals({ userId }) 30 | if (fetchSignalsResult.error) { 31 | setIsLoading(false) 32 | return enqueueSnackbar(fetchSignalsResult.message, { variant: 'error' }) 33 | } 34 | 35 | setSignalsState(fetchSignalsResult.data) 36 | setIsLoading(false) 37 | } 38 | 39 | if (isLoading) 40 | return ( 41 | 42 | 43 | 44 | 45 | 46 | ) 47 | 48 | return ( 49 |
50 | 53 | 59 | 62 | 63 | 64 |
65 | ) 66 | } 67 | 68 | export default ViewSignals -------------------------------------------------------------------------------- /src/vendors/slick/fonts/slick.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by Fontastic.me 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/locales/de/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Ein einfaches Beispiel", 3 | "subtitle": "Es ist eine leere Seite. Baue deine Seite mit here auf", 4 | "error_with_status": "Auf dem Server ist ein Fehler aufgetreten", 5 | "404": "Diese Seite konnte nicht gefunden werden.", 6 | "404_subtitle": "Sie können entweder hier bleiben und entspannen oder zum Anfang zurückkehren.", 7 | "zurück": "zurück nach Hause", 8 | "error_without_status": "Auf dem Server ist ein Fehler aufgetreten", 9 | "contact_title": "Kostenloses Projektangebot", 10 | "contact_title2": "Sag Hallo zu uns", 11 | "contact_subtitle": "Haben Sie Fragen? Sind Sie bereit, Kosten zu senken und neue Einnahmen zu generieren? Oder möchten Sie einfach nur Hallo sagen? Schreiben Sie uns eine Nachricht.", 12 | "form_name": "Wie ist Ihr Name? *", 13 | "form_email": "Wie lautet Ihre E-Mail-Adresse? *", 14 | "form_phone": "Wie lautet Ihre Telefonnummer?", 15 | "form_company": "Was ist Ihre Firma?", 16 | "form_message": "Geben Sie hier Ihre Nachricht ein", 17 | "form_terms": "Ich habe die AGB von gelesen und akzeptiere sie.", 18 | "form_privacy": "Service & Datenschutz *", 19 | "form_send": "Nachricht senden", 20 | "login": "Einloggen", 21 | "login_create": "Neues Konto erstellen", 22 | "login_or": "Oder mit E-Mail einloggen", 23 | "login_email": "Email", 24 | "login_password": "Passwort", 25 | "login_remember": "Merken", 26 | "login_forgot": "Passwort vergessen", 27 | "continue": "Weiter", 28 | "login_title": "Willkommen zurück", 29 | "login_subtitle": "Bitte einloggen um fortzufahren", 30 | "register": "Register", 31 | "register_already": "Haben Sie schon ein Konto?", 32 | "register_or": "Oder registriere dich per E-Mail", 33 | "register_name": "Name? *", 34 | "register_email": "Email? *", 35 | "register_password": "Passwort", 36 | "register_confirm": "Passwort bestätigen", 37 | "register_title": "Schön dich zu treffen :)", 38 | "register_subtitle": "Einfach registrieren, um bei uns mitzumachen", 39 | "accept": "Accept", 40 | "en": "English", 41 | "de": "Deutsch", 42 | "zh": "简体中文", 43 | "pt": "󠁥󠁮󠁧󠁿Português", 44 | "id": "󠁥󠁮󠁧󠁿Bahasa Indonesia", 45 | "ar": "󠁥󠁮󠁧󠁿العربيّة" 46 | } -------------------------------------------------------------------------------- /src/views/admin/subscriptions/Subscriptions.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import { makeStyles } from '@material-ui/styles' 3 | import React, { useEffect, useState } from 'react' 4 | import { Grid, Dialog, CircularProgress, DialogContent } from '@material-ui/core' 5 | 6 | import { AdminApi } from 'config/Api' 7 | import NewSubscription from './components/NewSubscription' 8 | import SubscriptionsList from './components/SubscriptionsList' 9 | 10 | const adminApi = new AdminApi() 11 | 12 | const useStyles = makeStyles(theme => ({ 13 | root: { 14 | padding: theme.spacing(4) 15 | } 16 | })) 17 | 18 | const Subscriptions = () => { 19 | const classes = useStyles() 20 | 21 | const { enqueueSnackbar } = useSnackbar() 22 | 23 | const adminId = localStorage.getItem('adminId') 24 | 25 | const [isLoading, setIsLoading] = useState(true) 26 | const [subscriptionsState, setSubscriptionsState] = useState([]) 27 | 28 | useEffect(() => { fetchSubscriptions() }, []) 29 | 30 | const fetchSubscriptions = async () => { 31 | const fetchSubscriptionsResult = await adminApi.fetchSubscriptions({ adminId }) 32 | if (fetchSubscriptionsResult.error) { 33 | setIsLoading(false) 34 | return enqueueSnackbar(fetchSubscriptionsResult.message, { variant: 'error' }) 35 | } 36 | 37 | setSubscriptionsState(fetchSubscriptionsResult.data) 38 | setIsLoading(false) 39 | } 40 | 41 | const reloadData = () => fetchSubscriptions() 42 | 43 | if (isLoading) 44 | return ( 45 | 46 | 47 | 48 | 49 | 50 | ) 51 | 52 | return ( 53 |
54 | 57 | 63 | 66 | 67 | 68 | 74 | 76 | 77 | 78 |
79 | ) 80 | } 81 | 82 | export default Subscriptions -------------------------------------------------------------------------------- /src/views/web/landing/components/PageNav/pagenav-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | import { fade } from '@material-ui/core/styles/colorManipulator' 3 | 4 | const pagenav = makeStyles(theme => ({ 5 | show: {}, 6 | fab: { 7 | transform: 'scale(0.5)', 8 | transition: 'all 0.5s ease', 9 | opacity: 0, 10 | position: 'absolute', 11 | bottom: 0, 12 | right: 0, 13 | background: theme.palette.primary.light, 14 | fontWeight: theme.typography.fontWeightBold, 15 | '& svg': { 16 | fill: theme.palette.primary.dark, 17 | width: 40, 18 | height: 40 19 | }, 20 | '&:hover': { 21 | '& svg': { 22 | fill: theme.palette.primary.light, 23 | }, 24 | }, 25 | }, 26 | pageNav: { 27 | zIndex: 200, 28 | position: 'fixed', 29 | bottom: 40, 30 | right: 40, 31 | '& nav': { 32 | transition: 'height 0.5s ease', 33 | transitionDelay: '0.5s', 34 | height: 0, 35 | padding: theme.spacing(1, 1, 7), 36 | overflow: 'hidden' 37 | }, 38 | '&$show': { 39 | '& $fab': { 40 | opacity: 1, 41 | transform: 'scale(1)', 42 | } 43 | }, 44 | '& ul': { 45 | margin: '0 14px 16px 0', 46 | padding: 0, 47 | position: 'relative' 48 | }, 49 | '& li': { 50 | marginBottom: theme.spacing(3), 51 | listStyle: 'none', 52 | opacity: 0, 53 | position: 'relative', 54 | transition: 'all 0.4s ease', 55 | '& a': { 56 | width: 12, 57 | height: 12, 58 | boxShadow: theme.shadows[1], 59 | background: fade(theme.palette.common.white, 0.3), 60 | border: `1px solid ${theme.palette.primary.dark}`, 61 | display: 'block', 62 | transition: 'all 0.4s ease', 63 | borderRadius: 3, 64 | transform: 'rotate(45deg)' 65 | }, 66 | '&[class="active"] a': { 67 | background: theme.palette.primary.dark, 68 | border: `1px solid ${theme.palette.primary.light}`, 69 | }, 70 | }, 71 | '&:hover': { 72 | '& li': { 73 | opacity: 1, 74 | top: '0 !important', 75 | }, 76 | '& nav': { 77 | transitionDelay: '0s', 78 | height: '100%' 79 | } 80 | } 81 | }, 82 | tooltip: { 83 | textTransform: 'capitalize', 84 | background: theme.palette.primary.dark, 85 | fontSize: 14 86 | }, 87 | })) 88 | 89 | export default pagenav 90 | -------------------------------------------------------------------------------- /src/views/admin/sponsor/Sponsor.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import { makeStyles } from '@material-ui/styles' 3 | import React, { useEffect, useState } from 'react' 4 | import { Grid, Dialog, CircularProgress, DialogContent } from '@material-ui/core' 5 | 6 | import { AdminApi } from 'config/Api' 7 | import SponsorsTable from './components/SponsorsTable' 8 | 9 | const adminApi = new AdminApi() 10 | 11 | const useStyles = makeStyles(theme => ({ 12 | root: { 13 | padding: theme.spacing(4) 14 | } 15 | })) 16 | 17 | const Sponsors = () => { 18 | const classes = useStyles() 19 | const { enqueueSnackbar } = useSnackbar() 20 | 21 | const adminId = localStorage.getItem('adminId') 22 | 23 | const [isLoading, setIsLoading] = useState(true) 24 | const [sponsorsState, setSponsorsState] = useState([]) 25 | 26 | useEffect(() => { 27 | fetchSponsorsList() 28 | }, []) 29 | 30 | const fetchSponsorsList = async () => { 31 | const fetchSponsorsListResult = await adminApi.fetchSponsors({ adminId }) 32 | if (fetchSponsorsListResult.error) { 33 | setIsLoading(false) 34 | return enqueueSnackbar(fetchSponsorsListResult.message, { variant: 'error' }) 35 | } 36 | 37 | setSponsorsState(fetchSponsorsListResult.data) 38 | setIsLoading(false) 39 | } 40 | 41 | const reloadData = () => fetchSponsorsList() 42 | 43 | if (isLoading) 44 | return ( 45 | 46 | 47 | 48 | 49 | 50 | ) 51 | 52 | return ( 53 |
54 | 57 | 63 | 66 | 67 | 68 |
69 | ) 70 | } 71 | 72 | export default Sponsors -------------------------------------------------------------------------------- /src/views/web/auth/components/AuthFrame/AuthFrame.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import HomeIcon from 'react-ionicons/lib/IosHomeOutline' 5 | import { IconButton, Hidden, Paper, Typography, Container, Grid } from '@material-ui/core' 6 | 7 | import useStyles from '../../form-style' 8 | 9 | const AuthFrame = props => { 10 | const classes = useStyles() 11 | const { children, title, subtitle } = props 12 | 13 | return ( 14 |
15 | 16 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 | 35 | 36 | 37 |
38 |
39 | logo 40 | 41 | 42 | Mega Trade 43 | 44 |
45 | 46 | 47 | {title} 48 | 49 | 50 | 51 | {subtitle} 52 | 53 |
54 |
55 |
56 | 57 | 58 |
59 | {children} 60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | ) 68 | } 69 | 70 | AuthFrame.propTypes = { 71 | children: PropTypes.node.isRequired, 72 | title: PropTypes.string.isRequired, 73 | subtitle: PropTypes.string, 74 | } 75 | 76 | AuthFrame.defaultProps = { 77 | subtitle: '', 78 | } 79 | 80 | export default AuthFrame 81 | -------------------------------------------------------------------------------- /src/vendors/slick/slick.css: -------------------------------------------------------------------------------- 1 | /* Slider */ 2 | .slick-slider 3 | { 4 | position: relative; 5 | 6 | display: block; 7 | box-sizing: border-box; 8 | 9 | -webkit-user-select: none; 10 | -moz-user-select: none; 11 | -ms-user-select: none; 12 | user-select: none; 13 | 14 | -webkit-touch-callout: none; 15 | -khtml-user-select: none; 16 | -ms-touch-action: pan-y; 17 | touch-action: pan-y; 18 | -webkit-tap-highlight-color: transparent; 19 | } 20 | 21 | .slick-list 22 | { 23 | position: relative; 24 | 25 | display: block; 26 | overflow: hidden; 27 | 28 | margin: 0; 29 | padding: 0; 30 | } 31 | .slick-list:focus 32 | { 33 | outline: none; 34 | } 35 | .slick-list.dragging 36 | { 37 | cursor: pointer; 38 | cursor: hand; 39 | } 40 | 41 | .slick-slider .slick-track, 42 | .slick-slider .slick-list 43 | { 44 | -webkit-transform: translate3d(0, 0, 0); 45 | -moz-transform: translate3d(0, 0, 0); 46 | -ms-transform: translate3d(0, 0, 0); 47 | -o-transform: translate3d(0, 0, 0); 48 | transform: translate3d(0, 0, 0); 49 | } 50 | 51 | .slick-track 52 | { 53 | position: relative; 54 | top: 0; 55 | left: 0; 56 | 57 | display: block; 58 | margin-left: auto; 59 | margin-right: auto; 60 | } 61 | .slick-track:before, 62 | .slick-track:after 63 | { 64 | display: table; 65 | 66 | content: ''; 67 | } 68 | .slick-track:after 69 | { 70 | clear: both; 71 | } 72 | .slick-loading .slick-track 73 | { 74 | visibility: hidden; 75 | } 76 | 77 | .slick-slide 78 | { 79 | display: none; 80 | float: left; 81 | 82 | height: 100%; 83 | min-height: 1px; 84 | } 85 | .slick-slide img 86 | { 87 | display: block; 88 | } 89 | .slick-slide.slick-loading img 90 | { 91 | display: none; 92 | } 93 | .slick-slide.dragging img 94 | { 95 | pointer-events: none; 96 | } 97 | .slick-initialized .slick-slide 98 | { 99 | display: block; 100 | } 101 | .slick-loading .slick-slide 102 | { 103 | visibility: hidden; 104 | } 105 | .slick-vertical .slick-slide 106 | { 107 | display: block; 108 | 109 | height: auto; 110 | 111 | border: 1px solid transparent; 112 | } 113 | .slick-arrow.slick-hidden { 114 | display: none; 115 | } 116 | -------------------------------------------------------------------------------- /src/layouts/user/components/sidebar/components/SidebarNav.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import ReactGA from 'react-ga' 3 | import PropTypes from 'prop-types' 4 | import React, { forwardRef } from 'react' 5 | import { makeStyles } from '@material-ui/styles' 6 | import { NavLink as RouterLink } from 'react-router-dom' 7 | import { List, ListItem, Button } from '@material-ui/core' 8 | 9 | const useStyles = makeStyles(theme => ({ 10 | root: {}, 11 | item: { 12 | paddingTop: 0, 13 | display: 'flex', 14 | paddingBottom: 0 15 | }, 16 | button: { 17 | width: '100%', 18 | letterSpacing: 0, 19 | padding: '10px 8px', 20 | textTransform: 'none', 21 | color: theme.palette.text, 22 | justifyContent: 'flex-start', 23 | fontWeight: theme.typography.fontWeightMedium 24 | }, 25 | icon: { 26 | width: 24, 27 | height: 24, 28 | display: 'flex', 29 | alignItems: 'center', 30 | color: theme.palette.icon, 31 | marginRight: theme.spacing(1) 32 | }, 33 | active: { 34 | color: theme.palette.primary.main, 35 | fontWeight: theme.typography.fontWeightMedium, 36 | '& $icon': { 37 | color: theme.palette.primary.main 38 | } 39 | } 40 | })) 41 | 42 | const CustomRouterLink = forwardRef((props, ref) => ( 43 |
46 | 47 |
48 | )) 49 | 50 | const SidebarNav = props => { 51 | const { pages, className, ...rest } = props 52 | 53 | const classes = useStyles() 54 | 55 | return ( 56 | 59 | { 60 | pages.map(page => ( 61 | 65 | 78 | 79 | )) 80 | } 81 | 82 | ) 83 | } 84 | 85 | SidebarNav.propTypes = { 86 | className: PropTypes.string, 87 | pages: PropTypes.array.isRequired 88 | } 89 | 90 | export default SidebarNav -------------------------------------------------------------------------------- /src/views/admin/users/Users.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import { makeStyles } from '@material-ui/styles' 3 | import React, { useEffect, useState } from 'react' 4 | import { Grid, Dialog, CircularProgress, DialogContent } from '@material-ui/core' 5 | 6 | import { AdminApi } from 'config/Api' 7 | import UsersTable from './components/UsersTable' 8 | 9 | const adminApi = new AdminApi() 10 | 11 | const useStyles = makeStyles(theme => ({ 12 | root: { 13 | padding: theme.spacing(4) 14 | } 15 | })) 16 | 17 | const Users = () => { 18 | const classes = useStyles() 19 | const { enqueueSnackbar } = useSnackbar() 20 | 21 | const adminId = localStorage.getItem('adminId') 22 | 23 | const [isLoading, setIsLoading] = useState(true) 24 | const [usersListState, setUsersListState] = useState([]) 25 | const [subscriptionsState, setSubscriptionsState] = useState([]) 26 | 27 | useEffect(() => { 28 | fetchUsersList() 29 | fetchSubscriptions() 30 | }, []) 31 | 32 | const fetchUsersList = async () => { 33 | const fetchUsersListResult = await adminApi.fetchUsersList({ adminId }) 34 | if (fetchUsersListResult.error) { 35 | setIsLoading(false) 36 | return enqueueSnackbar(fetchUsersListResult.message, { variant: 'error' }) 37 | } 38 | 39 | setUsersListState(fetchUsersListResult.data) 40 | setIsLoading(false) 41 | } 42 | 43 | const fetchSubscriptions = async () => { 44 | const fetchSubscriptionsResult = await adminApi.fetchSubscriptions({ adminId }) 45 | if (fetchSubscriptionsResult.error) { 46 | return enqueueSnackbar(fetchSubscriptionsResult.message, { variant: 'error' }) 47 | } 48 | 49 | setSubscriptionsState(fetchSubscriptionsResult.data) 50 | } 51 | 52 | const reloadData = () => { 53 | fetchUsersList() 54 | fetchSubscriptions() 55 | } 56 | 57 | if (isLoading) 58 | return ( 59 | 60 | 61 | 62 | 63 | 64 | ) 65 | 66 | return ( 67 |
68 | 71 | 77 | 81 | 82 | 83 |
84 | ) 85 | } 86 | 87 | export default Users -------------------------------------------------------------------------------- /src/views/web/resetPassword/resetPassword-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | import { fade, darken } from '@material-ui/core/styles/colorManipulator' 3 | 4 | const useStyles = makeStyles(theme => ({ 5 | errorWrap: { 6 | width: '100%', 7 | minHeight: '90vh', 8 | display: 'flex', 9 | alignItems: 'center' 10 | }, 11 | flex: { 12 | display: 'flex', 13 | justifyContent: 'center' 14 | }, 15 | deco: { 16 | position: 'relative', 17 | [theme.breakpoints.down('md')]: { 18 | height: 320, 19 | }, 20 | '& h3': { 21 | fontFamily: 'Roboto Condensed', 22 | color: theme.palette.primary.main, 23 | fontSize: 106, 24 | textTransform: 'capitalize', 25 | fontWeight: 700, 26 | paddingTop: 40, 27 | paddingLeft: 20, 28 | position: 'relative', 29 | zIndex: 1, 30 | }, 31 | '&:before': { 32 | content: '"', 33 | width: 210, 34 | height: 220, 35 | background: theme.palette.primary.main, 36 | borderRadius: 24, 37 | transform: 'rotate(45deg)', 38 | position: 'absolute', 39 | top: theme.spacing(-1), 40 | left: 0, 41 | } 42 | }, 43 | input: { 44 | width: '100%', 45 | '& label': { 46 | left: theme.spacing(0.5), 47 | }, 48 | '& > div': { 49 | overflow: 'hidden', 50 | '& input, textarea': { 51 | paddingLeft: theme.spacing(2), 52 | '&:focus': { 53 | background: theme.palette.background.default 54 | }, 55 | } 56 | }, 57 | '&$light': { 58 | '& label': { 59 | color: theme.palette.common.white, 60 | }, 61 | '& > div': { 62 | border: `1px solid ${fade(theme.palette.primary.light, 0.5)}`, 63 | '& input': { 64 | color: theme.palette.common.white, 65 | '&:focus': { 66 | background: fade(theme.palette.text.hint, 0.2) 67 | }, 68 | '&:hover': { 69 | background: fade(theme.palette.text.hint, 0.2) 70 | } 71 | }, 72 | } 73 | } 74 | }, 75 | text: { 76 | borderLeft: `1px solid ${theme.palette.divider}`, 77 | [theme.breakpoints.up('md')]: { 78 | paddingLeft: theme.spacing(5), 79 | }, 80 | [theme.breakpoints.down('md')]: { 81 | textAlign: 'center' 82 | }, 83 | '& h4': { 84 | fontWeight: theme.typography.fontWeightBold, 85 | marginBottom: theme.spacing(4) 86 | }, 87 | '& p': { 88 | fontSize: 22, 89 | color: theme.palette.text.secondary 90 | } 91 | }, 92 | button: { 93 | marginTop: theme.spacing(4) 94 | } 95 | })) 96 | 97 | export default useStyles 98 | -------------------------------------------------------------------------------- /src/views/admin/dashboard/components/TotalPayingUsers.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { makeStyles } from '@material-ui/styles' 5 | import AttachMoneyIcon from '@material-ui/icons/AttachMoney' 6 | import { Card, CardContent, Grid, Typography, Avatar } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%', 11 | color: theme.palette.primary.contrastText, 12 | backgroundColor: theme.palette.primary.main 13 | }, 14 | content: { 15 | display: 'flex', 16 | alignItems: 'center' 17 | }, 18 | title: { 19 | fontWeight: 700 20 | }, 21 | avatar: { 22 | width: 56, 23 | height: 56, 24 | color: theme.palette.primary.main, 25 | backgroundColor: theme.palette.background.paper 26 | }, 27 | icon: { 28 | width: 32, 29 | height: 32 30 | } 31 | })) 32 | 33 | const TotalProfit = props => { 34 | const { className, payingUsers, ...rest } = props 35 | 36 | const classes = useStyles() 37 | 38 | return ( 39 | 42 | 43 | 46 | 47 | 52 | TOTAL PAYING USERS 53 | 54 | 55 | 58 | {payingUsers} 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | ) 71 | } 72 | 73 | TotalProfit.propTypes = { 74 | className: PropTypes.string 75 | } 76 | 77 | export default TotalProfit -------------------------------------------------------------------------------- /src/views/user/support/components/ComingSoon.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { Link } from 'react-router-dom' 5 | import { makeStyles } from '@material-ui/styles' 6 | import { Typography, Button } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | marginTop: 50, 11 | borderRadius: 25, 12 | backgroundColor: theme.palette.background.default 13 | }, 14 | media: { 15 | height: 80, 16 | textAlign: 'center', 17 | paddingTop: theme.spacing(2), 18 | '& > img': { 19 | width: 'auto', 20 | height: '100%' 21 | } 22 | }, 23 | content: { 24 | padding: theme.spacing(1, 2) 25 | }, 26 | actions: { 27 | display: 'flex', 28 | justifyContent: 'center', 29 | padding: theme.spacing(1, 2) 30 | } 31 | })) 32 | 33 | const UpgradePlan = props => { 34 | const { className, ...rest } = props 35 | 36 | const classes = useStyles() 37 | 38 | return ( 39 |
42 |
43 | upgrade 46 |
47 | 48 |
49 | 53 | We are Sorry! Live is coming soon to Premium Members 54 | 55 | 56 | 59 | Upgrade your Subscription to recieve all features including trading signals, group chat, etc. 60 | 61 |
62 | 63 |
64 | 71 |
72 |
73 | ) 74 | } 75 | 76 | UpgradePlan.propTypes = { 77 | className: PropTypes.string 78 | } 79 | 80 | export default UpgradePlan -------------------------------------------------------------------------------- /src/views/user/groupChat/components/UpgradePlan.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { Link } from 'react-router-dom' 5 | import { makeStyles } from '@material-ui/styles' 6 | import { Typography, Button } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | marginTop: 50, 11 | borderRadius: 25, 12 | backgroundColor: theme.palette.background.default 13 | }, 14 | media: { 15 | height: 80, 16 | textAlign: 'center', 17 | paddingTop: theme.spacing(2), 18 | '& > img': { 19 | width: 'auto', 20 | height: '100%' 21 | } 22 | }, 23 | content: { 24 | padding: theme.spacing(1, 2) 25 | }, 26 | actions: { 27 | display: 'flex', 28 | justifyContent: 'center', 29 | padding: theme.spacing(1, 2) 30 | } 31 | })) 32 | 33 | const UpgradePlan = props => { 34 | const { className, ...rest } = props 35 | 36 | const classes = useStyles() 37 | 38 | return ( 39 |
42 |
43 | upgrade 46 |
47 | 48 |
49 | 53 | We are Sorry! Group Chat is only available to Premium Members 54 | 55 | 56 | 59 | Upgrade your Subscription to recieve all features including trading signals, group chat, etc. 60 | 61 |
62 | 63 |
64 | 71 |
72 |
73 | ) 74 | } 75 | 76 | UpgradePlan.propTypes = { 77 | className: PropTypes.string 78 | } 79 | 80 | export default UpgradePlan -------------------------------------------------------------------------------- /src/views/web/landing/components/Header/MobileMenu.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React, { Fragment } from 'react' 3 | import PropTypes from 'prop-types' 4 | import useStyles from './header-style' 5 | import SwipeableDrawer from '@material-ui/core/SwipeableDrawer' 6 | import { Divider, ListItem, List, ListItemText } from '@material-ui/core' 7 | 8 | 9 | import navMenu from './menu' 10 | 11 | const MobileMenu = props => { 12 | const classes = useStyles() 13 | const { toggleDrawer, open } = props 14 | 15 | const userId = localStorage.getItem('userId') 16 | 17 | const SideList = () => ( 18 |
23 |
24 | 25 | {navMenu.map((item, index) => ( 26 | 33 | 34 | 35 | ))} 36 | 37 | 38 | 39 | 40 | 41 | {userId 42 | ? 43 | 48 | 49 | 50 | 51 | : 52 | {['login', 'register'].map((text, index) => ( 53 | 60 | 61 | 62 | ))} 63 | } 64 | 65 |
66 |
67 | ) 68 | 69 | return ( 70 | 78 | 79 | 80 | ) 81 | } 82 | 83 | 84 | MobileMenu.propTypes = { 85 | toggleDrawer: PropTypes.func.isRequired, 86 | open: PropTypes.bool.isRequired, 87 | } 88 | 89 | export default MobileMenu 90 | -------------------------------------------------------------------------------- /src/views/user/dashboard/components/UpgradePlan.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { Link } from 'react-router-dom' 5 | import { makeStyles } from '@material-ui/styles' 6 | import { Typography, Button } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | margin: 50, 11 | padding: 50, 12 | marginTop: 50, 13 | borderRadius: 25, 14 | backgroundColor: theme.palette.background.default 15 | }, 16 | media: { 17 | height: 80, 18 | textAlign: 'center', 19 | paddingTop: theme.spacing(2), 20 | '& > img': { 21 | width: 'auto', 22 | height: '100%' 23 | } 24 | }, 25 | content: { 26 | padding: theme.spacing(1, 2) 27 | }, 28 | actions: { 29 | display: 'flex', 30 | justifyContent: 'center', 31 | padding: theme.spacing(1, 2) 32 | } 33 | })) 34 | 35 | const UpgradePlan = props => { 36 | const { className, ...rest } = props 37 | 38 | const classes = useStyles() 39 | 40 | return ( 41 |
44 |
45 | upgrade 48 |
49 | 50 |
51 | 55 | We are Sorry! Trade Signals are only available to Basic & Premium Members 56 | 57 | 58 | 61 | Upgrade your Subscription to recieve all features including trading signals, group chat, etc. 62 | 63 |
64 | 65 |
66 | 73 |
74 |
75 | ) 76 | } 77 | 78 | UpgradePlan.propTypes = { 79 | className: PropTypes.string 80 | } 81 | 82 | export default UpgradePlan -------------------------------------------------------------------------------- /src/views/admin/signals/Signals.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import { makeStyles } from '@material-ui/styles' 3 | import React, { useEffect, useState } from 'react' 4 | import { Grid, Dialog, CircularProgress, DialogContent } from '@material-ui/core' 5 | 6 | import { AdminApi } from 'config/Api' 7 | import SignalsTable from './components/SignalsTable' 8 | import FreeSignalsTable from './components/FreeSignalsTable' 9 | 10 | const adminApi = new AdminApi() 11 | 12 | const useStyles = makeStyles(theme => ({ 13 | root: { 14 | padding: theme.spacing(4) 15 | } 16 | })) 17 | 18 | const Signals = () => { 19 | const classes = useStyles() 20 | const { enqueueSnackbar } = useSnackbar() 21 | 22 | const adminId = localStorage.getItem('adminId') 23 | 24 | const [isLoading, setIsLoading] = useState(true) 25 | const [signalsState, setSignalsState] = useState([]) 26 | const [freeSignalsState, setFreeSignalsState] = useState([]) 27 | 28 | useEffect(() => { 29 | fetchSignalsList() 30 | fetchFreeSignalsList() 31 | }, []) 32 | 33 | const fetchFreeSignalsList = async () => { 34 | const fetchFreeSignalsListResult = await adminApi.fetchFreeSignals({ adminId }) 35 | if (fetchFreeSignalsListResult.error) { 36 | setIsLoading(false) 37 | return enqueueSnackbar(fetchFreeSignalsListResult.message, { variant: 'error' }) 38 | } 39 | 40 | setFreeSignalsState(fetchFreeSignalsListResult.data) 41 | setIsLoading(false) 42 | } 43 | 44 | const fetchSignalsList = async () => { 45 | const fetchSignalsListResult = await adminApi.fetchSignals({ adminId }) 46 | if (fetchSignalsListResult.error) { 47 | setIsLoading(false) 48 | return enqueueSnackbar(fetchSignalsListResult.message, { variant: 'error' }) 49 | } 50 | 51 | setSignalsState(fetchSignalsListResult.data) 52 | setIsLoading(false) 53 | } 54 | 55 | const reloadData = () => { 56 | fetchSignalsList() 57 | fetchFreeSignalsList() 58 | } 59 | 60 | if (isLoading) 61 | return ( 62 | 63 | 64 | 65 | 66 | 67 | ) 68 | 69 | return ( 70 |
71 | 74 | 80 | 83 | 84 | 85 | 91 | 94 | 95 | 96 |
97 | ) 98 | } 99 | 100 | export default Signals -------------------------------------------------------------------------------- /src/views/web/landing/components/PageNav/PageNav.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import Scrollspy from 'react-scrollspy' 3 | import { Fab, Tooltip } from '@material-ui/core' 4 | import React, { useState, useEffect } from 'react' 5 | import ArrowIcon from '@material-ui/icons/ArrowUpward' 6 | import AnchorLink from 'react-anchor-link-smooth-scroll' 7 | 8 | import navMenu from '../Header/menu' 9 | import useStyles from './pagenav-style' 10 | 11 | function createData(id, name, url) { 12 | return { 13 | id, 14 | url, 15 | name 16 | } 17 | } 18 | 19 | const LinkBtn = React.forwardRef(function LinkBtn(props, ref) { 20 | return 21 | }) 22 | 23 | const PageNav = props => { 24 | const [show, setShow] = useState(false) 25 | let flagShow = false 26 | 27 | const handleScroll = () => { 28 | const doc = document.documentElement 29 | const scroll = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0) 30 | const newFlagShow = (scroll > 500) 31 | if (flagShow !== newFlagShow) { 32 | setShow(newFlagShow) 33 | flagShow = newFlagShow 34 | } 35 | } 36 | 37 | useEffect(() => { 38 | window.addEventListener('scroll', handleScroll) 39 | }, []) 40 | 41 | const classes = useStyles() 42 | const [menuList] = useState([ 43 | createData(1, navMenu[0], '#' + navMenu[0].replace(/ /g, '_')), 44 | createData(2, navMenu[1], '#' + navMenu[1].replace(/ /g, '_')), 45 | createData(3, navMenu[2], '#' + navMenu[2].replace(/ /g, '_')), 46 | createData(4, navMenu[3], '#' + navMenu[3].replace(/ /g, '_')), 47 | createData(5, navMenu[4], '#' + navMenu[4].replace(/ /g, '_')), 48 | createData(6, navMenu[5], '#' + navMenu[5].replace(/ /g, '_')), 49 | createData(6, navMenu[6], '#' + navMenu[6].replace(/ /g, '_')), 50 | ]) 51 | 52 | return ( 53 |
54 | 60 | 66 | 67 | 68 | 69 | 70 | 89 |
90 | ) 91 | } 92 | 93 | export default PageNav 94 | -------------------------------------------------------------------------------- /src/vendors/animate-extends.css: -------------------------------------------------------------------------------- 1 | @-webkit-keyframes fadeInLeftShort { 2 | from { 3 | opacity: 0; 4 | -webkit-transform: translate3d(-5%, 0, 0); 5 | transform: translate3d(-5%, 0, 0); 6 | } 7 | 8 | to { 9 | opacity: 1; 10 | -webkit-transform: translate3d(0, 0, 0); 11 | transform: translate3d(0, 0, 0); 12 | } 13 | } 14 | 15 | @keyframes fadeInLeftShort { 16 | from { 17 | opacity: 0; 18 | -webkit-transform: translate3d(-5%, 0, 0); 19 | transform: translate3d(-5%, 0, 0); 20 | } 21 | 22 | to { 23 | opacity: 1; 24 | -webkit-transform: translate3d(0, 0, 0); 25 | transform: translate3d(0, 0, 0); 26 | } 27 | } 28 | 29 | @-webkit-keyframes fadeInLeftMedium { 30 | from { 31 | opacity: 0; 32 | -webkit-transform: translate3d(-25%, 0, 0); 33 | transform: translate3d(-25%, 0, 0); 34 | } 35 | 36 | to { 37 | opacity: 1; 38 | -webkit-transform: translate3d(0, 0, 0); 39 | transform: translate3d(0, 0, 0); 40 | } 41 | } 42 | 43 | @keyframes fadeInLeftMedium { 44 | from { 45 | opacity: 0; 46 | -webkit-transform: translate3d(-25%, 0, 0); 47 | transform: translate3d(-25%, 0, 0); 48 | } 49 | 50 | to { 51 | opacity: 1; 52 | -webkit-transform: translate3d(0, 0, 0); 53 | transform: translate3d(0, 0, 0); 54 | } 55 | } 56 | 57 | .fadeInLeftShort { 58 | -webkit-animation-name: fadeInLeftMedium; 59 | animation-name: fadeInLeftMedium; 60 | } 61 | 62 | @-webkit-keyframes zoomInShort { 63 | from { 64 | opacity: 0; 65 | -webkit-transform: scale3d(0.8, 0.8, 0.8); 66 | transform: scale3d(0.8, 0.8, 0.8); 67 | } 68 | 69 | 50% { 70 | opacity: 1; 71 | } 72 | } 73 | 74 | @keyframes zoomInShort { 75 | from { 76 | opacity: 0; 77 | -webkit-transform: scale3d(0.9, 0.9, 0.9); 78 | transform: scale3d(0.9, 0.9, 0.9); 79 | } 80 | 81 | 50% { 82 | opacity: 1; 83 | } 84 | } 85 | 86 | .zoomInShort { 87 | -webkit-animation-name: zoomInShort; 88 | animation-name: zoomInShort; 89 | } 90 | 91 | @-webkit-keyframes fadeInUpShort { 92 | from { 93 | opacity: 0; 94 | -webkit-transform: translate3d(0, 10%, 0); 95 | transform: translate3d(0, 100%, 0); 96 | } 97 | 98 | to { 99 | opacity: 1; 100 | -webkit-transform: translate3d(0, 10%, 0); 101 | transform: translate3d(0, 0, 0); 102 | } 103 | } 104 | 105 | @keyframes fadeInUpShort { 106 | from { 107 | opacity: 0; 108 | -webkit-transform: translate3d(0, 10%, 0); 109 | transform: translate3d(0, 10%, 0); 110 | } 111 | 112 | to { 113 | opacity: 1; 114 | -webkit-transform: translate3d(0, 0, 0); 115 | transform: translate3d(0, 0, 0); 116 | } 117 | } 118 | 119 | .fadeInUp { 120 | -webkit-animation-name: fadeInUpShort; 121 | animation-name: fadeInUpShort; 122 | } -------------------------------------------------------------------------------- /src/views/web/landing/components/Testimonials/Testimonials.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Carousel from 'react-slick' 3 | import { Typography, Avatar, Paper } from '@material-ui/core' 4 | 5 | import useStyle from './testi-style' 6 | import { useTextAlign } from 'theme/common' 7 | 8 | const testiContent = [ 9 | { 10 | text: 'I had very good experience with this guys and I can recommend it to anyone. They go for trade with high probability not just for any trade.', 11 | avatar: 'https://randomuser.me/api/portraits/men/3.jpg', 12 | name: 'James, Dorset, UK' 13 | }, 14 | { 15 | text: 'As a member of their signal service, they really know how to trade forex. I like their mid-term trading setup.', 16 | avatar: 'https://randomuser.me/api/portraits/men/75.jpg', 17 | name: 'Sang, Texas, USA' 18 | }, 19 | { 20 | text: 'They provide an excellent service with frequent and incredibly reliable Forex signals. Their service is massively helping me along my journey through the trading world!', 21 | avatar: 'https://randomuser.me/api/portraits/women/90.jpg', 22 | name: 'Elliot, United Kingdom' 23 | } 24 | ] 25 | 26 | const Testimonials = () => { 27 | const classes = useStyle() 28 | const align = useTextAlign() 29 | const settings = { 30 | dots: true, 31 | infinite: true, 32 | speed: 500, 33 | slidesToShow: 3, 34 | slidesToScroll: 1, 35 | responsive: [{ 36 | breakpoint: 1024, 37 | settings: { 38 | slidesToShow: 3, 39 | slidesToScroll: 3, 40 | infinite: true, 41 | dots: true 42 | } 43 | }, { 44 | breakpoint: 600, 45 | settings: { 46 | slidesToShow: 2, 47 | slidesToScroll: 2 48 | } 49 | }, { 50 | breakpoint: 480, 51 | settings: { 52 | slidesToShow: 1, 53 | slidesToScroll: 1 54 | } 55 | }] 56 | } 57 | 58 | return ( 59 |
60 | 61 | Testimonials 62 | 63 | 64 | Curabitur egestas consequat lorem, vel fermentum augue porta id. 65 | 66 | 67 |
68 | 69 | {testiContent.map((item, index) => ( 70 |
71 | 72 | 73 | {item.text} 74 | 75 |
76 | 80 | 81 | {item.name} 82 | 83 |
84 |
85 |
86 | ))} 87 |
88 |
89 |
90 | ) 91 | } 92 | 93 | export default Testimonials 94 | -------------------------------------------------------------------------------- /src/views/web/landing/components/AnimateSlider/AnimateSlider.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Slider from 'react-animated-slider' 3 | import { Typography, Button, Grid } from '@material-ui/core' 4 | 5 | import useStyles from './slider-style' 6 | 7 | import 'vendors/animate-slider.css' 8 | import 'react-animated-slider/build/horizontal.css' 9 | 10 | const AnimateSlider = () => { 11 | const classes = useStyles() 12 | 13 | return ( 14 |
15 | 19 |
22 |
23 | World Class Trading Signals 24 | 25 | 99% Successful signal trades. We provide all you need to make the right trades. 26 | 27 |
28 | 29 | 30 | 33 | 34 | 35 |
36 |
37 |
38 | 39 |
42 |
43 | World Class Trading Signals 44 | 45 | 99% Successful signal trades. We provide all you need to make the right trades. 46 | 47 |
48 | 49 | 50 | 53 | 54 | 55 |
56 |
57 |
58 | 59 |
62 |
63 | World Class Trading Signals 64 | 65 | 99% Successful signal trades. We provide all you need to make the right trades. 66 | 67 |
68 | 69 | 70 | 73 | 74 | 75 |
76 |
77 |
78 | 79 |
80 |
81 | ) 82 | } 83 | 84 | AnimateSlider.getInitialProps = async () => ({ 85 | namespacesRequired: ['common', 'starter-landing'] 86 | }) 87 | 88 | export default AnimateSlider 89 | -------------------------------------------------------------------------------- /src/views/web/landing/Landing.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import PropTypes from 'prop-types' 3 | import React, { Fragment } from 'react' 4 | import { CssBaseline, Hidden, makeStyles, Container } from '@material-ui/core' 5 | 6 | import FAQ from './components/FAQ' 7 | import Header from './components/Header' 8 | import Footer from './components/Footer' 9 | import Counter from './components/Counter' 10 | import Contact from './components/Contact' 11 | import Feature from './components/Feature' 12 | import PageNav from './components/PageNav' 13 | import Pricing from './components/Pricing' 14 | import Subscribe from './components/Subscribe' 15 | import Testimonials from './components/Testimonials' 16 | import AnimateSlider from './components/AnimateSlider' 17 | import Disclaimer from './components/Disclaimer/Disclaimer' 18 | 19 | const sectionMargin = margin => (margin * 15) 20 | const useStyles = makeStyles(theme => ({ 21 | mainWrap: { 22 | position: 'relative', 23 | width: '100%', 24 | overflow: 'hidden', 25 | }, 26 | spaceBottom: { 27 | marginBottom: sectionMargin(theme.spacing()) 28 | }, 29 | spaceTop: { 30 | paddingTop: sectionMargin(theme.spacing()) 31 | }, 32 | containerWrap: { 33 | marginTop: theme.spacing(15) 34 | } 35 | })) 36 | 37 | const Landing = props => { 38 | const classes = useStyles() 39 | 40 | return ( 41 | 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 | 74 |
75 | 76 |
77 | 78 |
79 | 80 |
81 | 82 |
83 | 84 |
85 | 86 |
87 | 88 |
89 |
90 | 91 | 92 | 93 | 94 | 95 |
96 |
97 | 98 | ) 99 | } 100 | 101 | Landing.getInitialProps = async () => ({ 102 | namespacesRequired: ['common'] 103 | }) 104 | 105 | Landing.propTypes = { 106 | onToggleDir: PropTypes.func.isRequired, 107 | onToggleDark: PropTypes.func.isRequired, 108 | } 109 | 110 | export default Landing -------------------------------------------------------------------------------- /src/views/user/dashboard/components/TradePie.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import PropTypes from 'prop-types' 4 | import { Doughnut } from 'react-chartjs-2' 5 | import { makeStyles, useTheme } from '@material-ui/styles' 6 | import { Card, CardHeader, CardContent, Divider, Typography } from '@material-ui/core' 7 | 8 | const useStyles = makeStyles(theme => ({ 9 | root: { 10 | height: '100%' 11 | }, 12 | chartContainer: { 13 | height: '300px', 14 | position: 'relative' 15 | }, 16 | stats: { 17 | display: 'flex', 18 | flexWrap: 'wrap', 19 | justifyContent: 'center', 20 | marginTop: theme.spacing(2) 21 | }, 22 | option: { 23 | textAlign: 'center', 24 | padding: theme.spacing(1) 25 | }, 26 | optionIcon: { 27 | color: theme.palette.icon 28 | } 29 | })) 30 | 31 | const TradePie = props => { 32 | const { className, focus, ...rest } = props 33 | 34 | const theme = useTheme() 35 | const classes = useStyles() 36 | 37 | const data = { 38 | datasets: [ 39 | { 40 | borderWidth: 8, 41 | data: focus.data, 42 | borderColor: theme.palette.background.paper, 43 | hoverBorderColor: theme.palette.background.paper, 44 | backgroundColor: focus.backgroundColor 45 | } 46 | ], 47 | labels: focus.labels 48 | } 49 | 50 | const options = { 51 | animation: false, 52 | responsive: true, 53 | cutoutPercentage: 70, 54 | maintainAspectRatio: false, 55 | legend: { 56 | display: true, 57 | labels: { 58 | fontColor: theme.palette.text.primary 59 | } 60 | }, 61 | layout: { 62 | padding: 0 63 | }, 64 | tooltips: { 65 | mode: 'index', 66 | enabled: false, 67 | borderWidth: 1, 68 | intersect: false, 69 | borderColor: theme.palette.divider, 70 | backgroundColor: theme.palette.background.paper, 71 | titleFontColor: theme.palette.text.primary, 72 | bodyFontColor: theme.palette.text.secondary, 73 | footerFontColor: theme.palette.text.secondary 74 | } 75 | } 76 | 77 | return ( 78 | 81 | 84 | 85 | 86 | 87 | 88 |
89 | 92 |
93 | 94 |
95 | { 96 | focus.labels.map((option, i) => ( 97 |
100 | 102 | {option} 103 | 104 | 105 | 108 | {focus.data[i]}% 109 | 110 |
111 | )) 112 | } 113 |
114 |
115 |
116 | ) 117 | } 118 | 119 | TradePie.propTypes = { 120 | className: PropTypes.string 121 | } 122 | 123 | export default TradePie -------------------------------------------------------------------------------- /src/views/web/landing/components/Pricing/Pricing.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import StarIcon from '@material-ui/icons/StarBorder' 3 | import { Button, Card, CardActions, CardContent, CardHeader, Grid, Typography, Container } from '@material-ui/core' 4 | 5 | import useStyles from './pricing-style' 6 | 7 | const tiers = [ 8 | { 9 | price: '0', 10 | durartion: '/wk', 11 | title: 'Free Membership', 12 | buttonVariant: 'contained', 13 | buttonText: 'Sign up for free', 14 | description: ['Unlimited Trading Tools', 'Real Time Market News & Calendar'] 15 | }, 16 | { 17 | price: '2.99', 18 | durartion: '/wk', 19 | title: 'Basic Membership', 20 | buttonVariant: 'contained', 21 | buttonText: 'Sign up for free', 22 | description: ['Unlimited Trading Tools', 'Real Time Market News & Calendar', 'Unlimited Trading Signals'] 23 | }, 24 | { 25 | price: '9.99', 26 | durartion: '/wk', 27 | title: 'Premium Membership', 28 | buttonVariant: 'contained', 29 | buttonText: 'Sign up for free', 30 | description: ['Unlimited Trading Tools', 'Real Time Market News & Calendar', 'Unlimited Trading Signals', 'Unlimited Community Chat Access'] 31 | } 32 | ] 33 | 34 | export default function Pricing() { 35 | const classes = useStyles() 36 | 37 | return ( 38 | 39 | 40 | Pricing and Plan 41 | 42 | 43 | 44 | We provide various membership packages for all your needs, you can start with our FREE membership simply by signing up and upgrading anytime you feel like it! 45 | 46 | 47 |
48 | 49 | {tiers.map(tier => ( 50 | 51 | 52 | : null} /> 59 | 60 | 61 |
62 | 63 | $ {tier.price} 64 | 65 | 66 | 67 | {tier.durartion} 68 | 69 |
70 | 71 | {tier.description.map((item, i) => ( 72 | 73 | {item} 74 | ))} 75 |
76 | 77 | 78 | 81 | 82 |
83 |
84 | ))} 85 |
86 |
87 |
88 | ) 89 | } 90 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "megatrade-website", 3 | "version": "1.0.0", 4 | "description": "Mega Trade Website - World Class Trading Signals", 5 | "keywords": [ 6 | "react", 7 | "finance", 8 | "reactjs", 9 | "trading", 10 | "dashboard", 11 | "Megatrade", 12 | "Mega Trade", 13 | "trading signals", 14 | "dashboard-react" 15 | ], 16 | "homepage": "https://megatrade.world", 17 | "bugs": { 18 | "email": "abdeen.mohamed@outlook.com", 19 | "url": "https://github.com/AbdeenM/megatrade-website/issues" 20 | }, 21 | "license": "MIT", 22 | "author": { 23 | "name": "Abdeen Mohamed", 24 | "url": "https://github.com/AbdeenM", 25 | "email": "abdeen.mohamed@outlook.com" 26 | }, 27 | "main": "index.js", 28 | "repository": { 29 | "type": "git", 30 | "url": "https://github.com/AbdeenM/megatrade-website" 31 | }, 32 | "dependencies": { 33 | "@material-ui/core": "^4.11.0", 34 | "@material-ui/icons": "^4.9.1", 35 | "@material-ui/styles": "^4.10.0", 36 | "animate.css": "^3.7.2", 37 | "axios": "^0.19.2", 38 | "chart.js": "^2.9.3", 39 | "clsx": "^1.1.1", 40 | "history": "^4.10.1", 41 | "i18n-react": "^0.7.0", 42 | "moment": "^2.29.1", 43 | "node-sass": "^4.14.1", 44 | "notistack": "^0.9.17", 45 | "prop-types": "^15.7.2", 46 | "react": "^16.14.0", 47 | "react-anchor-link-smooth-scroll": "^1.0.12", 48 | "react-animated-slider": "^2.0.0", 49 | "react-chartjs-2": "^2.10.0", 50 | "react-clock": "^2.4.0", 51 | "react-countup": "^4.3.3", 52 | "react-dom": "^16.14.0", 53 | "react-facebook-login": "^4.1.1", 54 | "react-ga": "^2.7.0", 55 | "react-google-login": "^5.1.21", 56 | "react-ionicons": "^3.1.4", 57 | "react-live-clock": "^4.0.5", 58 | "react-material-ui-form-validator": "^2.1.1", 59 | "react-paypal-button-v2": "^2.6.2", 60 | "react-perfect-scrollbar": "^1.5.8", 61 | "react-router-dom": "^5.2.0", 62 | "react-scripts": "^3.4.3", 63 | "react-scroll-parallax": "^2.3.4", 64 | "react-scrollspy": "^3.4.3", 65 | "react-slick": "^0.25.2", 66 | "react-tradingview-widget": "^1.3.2", 67 | "react-wow": "^1.0.0", 68 | "serve": "^11.3.2", 69 | "socket.io-client": "^2.3.1", 70 | "use-socket.io-client": "^1.1.0", 71 | "uuid": "^3.4.0", 72 | "validate.js": "^0.13.1" 73 | }, 74 | "scripts": { 75 | "test": "react-scripts test", 76 | "dev": "react-scripts start", 77 | "start": "serve -s build", 78 | "build": "react-scripts build", 79 | "eject": "react-scripts eject" 80 | }, 81 | "private": true, 82 | "eslintConfig": { 83 | "extends": "react-app" 84 | }, 85 | "browserslist": { 86 | "production": [ 87 | ">0.2%", 88 | "not dead", 89 | "not op_mini all" 90 | ], 91 | "development": [ 92 | "last 1 chrome version", 93 | "last 1 firefox version", 94 | "last 1 safari version" 95 | ] 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /public/images/features-broker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 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 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Counter/Counter.js: -------------------------------------------------------------------------------- 1 | import ReactWOW from 'react-wow' 2 | import CountUp from 'react-countup' 3 | import React, { useState } from 'react' 4 | import { Typography, Grid, Container } from '@material-ui/core' 5 | 6 | import useStyles from './counter-style' 7 | 8 | import PipsIcon from '@material-ui/icons/TrendingUp' 9 | import TradesIcon from '@material-ui/icons/SwapCalls' 10 | import ExperienceIcon from '@material-ui/icons/Schedule' 11 | import UsersIcon from '@material-ui/icons/SupervisorAccount' 12 | 13 | const Counter = () => { 14 | const classes = useStyles() 15 | const [play, setPlay] = useState(false) 16 | 17 | const countup = (val, isPlay) => ( 18 | 19 | {isPlay ? : 0} 20 | 21 | ) 22 | 23 | const handlePlay = () => { 24 | setTimeout(() => { setPlay(true) }, 500) 25 | } 26 | 27 | return ( 28 |
29 | 30 | 31 | 32 | 33 |
34 | 35 | 36 |
37 | 38 | {countup(200, play)}+ 39 | 40 | 41 | 42 | Subscribers this month 43 | 44 |
45 |
46 |
47 |
48 | 49 | 50 | 51 |
52 | 53 | 54 |
55 | 56 | ~{countup(9, play)} 57 | 58 | 59 | 60 | Trades per day 61 | 62 |
63 |
64 |
65 |
66 | 67 | 68 | 69 |
70 | 71 | 72 |
73 | 74 | ~{countup(450, play)} 75 | 76 | 77 | 78 | Pips per month 79 | 80 |
81 |
82 |
83 |
84 | 85 | 86 | 87 |
88 | 89 | 90 |
91 | 92 | {countup(10, play)}+ 93 | 94 | 95 | 96 | Years of Experience 97 | 98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 | ) 106 | } 107 | 108 | export default Counter -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactGA from 'react-ga' 3 | import Validate from 'validate.js' 4 | import { Chart } from 'react-chartjs-2' 5 | import { Router } from 'react-router-dom' 6 | import { SnackbarProvider } from 'notistack' 7 | import { createBrowserHistory } from 'history' 8 | import { CssBaseline, MuiThemeProvider, createMuiTheme } from '@material-ui/core' 9 | 10 | import theme from './theme' 11 | import Routes from './Routes' 12 | import './assets/scss/index.scss' 13 | import Chartjs from './helpers/chartjs' 14 | import Constants from 'config/Constants' 15 | import Validators from './common/Validators' 16 | 17 | import 'animate.css/animate.css' 18 | import 'vendors/slick/slick.css' 19 | import 'vendors/animate-extends.css' 20 | import 'vendors/page-transition.css' 21 | import 'vendors/slick/slick-theme.css' 22 | import 'react-perfect-scrollbar/dist/css/styles.css' 23 | 24 | const browserHistory = createBrowserHistory() 25 | 26 | Chart.helpers.extend(Chart.elements.Rectangle.prototype, { 27 | draw: Chartjs.draw 28 | }) 29 | 30 | Validate.validators = { 31 | ...Validate.validators, 32 | ...Validators 33 | } 34 | 35 | let themeType = 'light' 36 | if (typeof Storage !== 'undefined') 37 | themeType = localStorage.getItem('theme') || 'light' 38 | 39 | export default class App extends React.Component { 40 | state = { 41 | mainTheme: { 42 | ...theme('main', themeType) 43 | }, 44 | isFirstMessage: true, 45 | botResponse: 'Thank you for visiting our website! One of our team members will get back to you shortly. In the mean time feel free to create a free account and check out your personal dashboard.' 46 | } 47 | 48 | componentDidMount = () => { 49 | ReactGA.initialize(Constants.GOOGLE_TRACKING_ID, { 50 | gaOptions: { 51 | userId: localStorage.getItem('userId') || '-' 52 | } 53 | }) 54 | 55 | ReactGA.pageview(window.location.pathname + window.location.search) 56 | 57 | browserHistory.listen(location => { 58 | ReactGA.set({ page: location.pathname }) 59 | ReactGA.pageview(location.pathname) 60 | }) 61 | } 62 | 63 | toggleDarkTheme = () => { 64 | const { mainTheme } = this.state 65 | const newPaletteType = mainTheme.palette.type === 'light' ? 'dark' : 'light'; 66 | localStorage.setItem('theme', mainTheme.palette.type === 'light' ? 'dark' : 'light') 67 | 68 | this.setState({ 69 | mainTheme: { 70 | ...theme('main', newPaletteType), 71 | direction: theme.direction 72 | } 73 | }) 74 | } 75 | 76 | toggleDirection = dir => { 77 | const { mainTheme } = this.state 78 | document.dir = dir 79 | 80 | this.setState({ 81 | mainTheme: { 82 | ...mainTheme, 83 | direction: dir, 84 | palette: { 85 | ...mainTheme.palette 86 | } 87 | } 88 | }) 89 | } 90 | 91 | render() { 92 | const { mainTheme } = this.state 93 | const appTheme = createMuiTheme(mainTheme) 94 | 95 | return ( 96 | 97 | 98 | 99 | 102 | 103 |
104 | 107 |
108 |
109 |
110 |
111 | ) 112 | } 113 | } -------------------------------------------------------------------------------- /src/views/admin/account/Account.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import { makeStyles } from '@material-ui/styles' 3 | import React, { useEffect, useState } from 'react' 4 | import { Grid, Dialog, CircularProgress, DialogContent } from '@material-ui/core' 5 | 6 | import Password from '../account/components/Password' 7 | import AccountDetails from './components/AccountDetails' 8 | import AccountProfile from './components/AccountProfile' 9 | 10 | import { AdminApi } from 'config/Api' 11 | 12 | const adminApi = new AdminApi() 13 | 14 | const useStyles = makeStyles(theme => ({ 15 | root: { 16 | padding: theme.spacing(4) 17 | } 18 | })) 19 | 20 | const Account = props => { 21 | const classes = useStyles() 22 | const { enqueueSnackbar } = useSnackbar() 23 | 24 | const adminId = localStorage.getItem('adminId') 25 | 26 | const [isLoading, setIsLoading] = useState(true) 27 | const [profileState, setProfileState] = useState({ 28 | city: '', 29 | email: '', 30 | avatar: '', 31 | number: '', 32 | country: '', 33 | lastName: '', 34 | firstName: '' 35 | }) 36 | 37 | useEffect(() => { fetchProfileDetails() }, []) 38 | 39 | const fetchProfileDetails = async () => { 40 | const fetchAccountResult = await adminApi.fetchAccount({ adminId }) 41 | 42 | if (fetchAccountResult.error) { 43 | setIsLoading(false) 44 | return enqueueSnackbar(fetchAccountResult.message, { variant: 'error' }) 45 | } 46 | 47 | setProfileState(profileState => ({ 48 | ...profileState, 49 | city: fetchAccountResult.data.city || '', 50 | email: fetchAccountResult.data.email || '', 51 | avatar: fetchAccountResult.data.avatar || '', 52 | number: fetchAccountResult.data.number || '', 53 | country: fetchAccountResult.data.country || '', 54 | lastName: fetchAccountResult.data.lastName || '', 55 | firstName: fetchAccountResult.data.firstName || '' 56 | })) 57 | 58 | setIsLoading(false) 59 | } 60 | 61 | const reloadData = () => fetchProfileDetails() 62 | 63 | if (isLoading) 64 | return ( 65 | 66 | 67 | 68 | 69 | 70 | ) 71 | 72 | return ( 73 |
74 | 77 | 83 | 93 | 94 | 95 | 101 | 102 | 103 | 104 | 110 | 120 | 121 | 122 |
123 | ) 124 | } 125 | 126 | export default Account -------------------------------------------------------------------------------- /src/vendors/slick/slick-theme.css: -------------------------------------------------------------------------------- 1 | /* Slider */ 2 | .slick-loading .slick-list 3 | { 4 | background: #fff url('./ajax-loader.gif') center center no-repeat; 5 | } 6 | 7 | /* Icons */ 8 | /* Arrows */ 9 | .slick-prev, 10 | .slick-next 11 | { 12 | font-size: 0; 13 | line-height: 0; 14 | 15 | position: absolute; 16 | top: 50%; 17 | 18 | display: block; 19 | 20 | width: 20px; 21 | height: 20px; 22 | padding: 0; 23 | -webkit-transform: translate(0, -50%); 24 | -ms-transform: translate(0, -50%); 25 | transform: translate(0, -50%); 26 | 27 | cursor: pointer; 28 | 29 | color: transparent; 30 | border: none; 31 | outline: none; 32 | background: transparent; 33 | } 34 | .slick-prev:hover, 35 | .slick-prev:focus, 36 | .slick-next:hover, 37 | .slick-next:focus 38 | { 39 | color: transparent; 40 | outline: none; 41 | background: transparent; 42 | } 43 | .slick-prev:hover:before, 44 | .slick-prev:focus:before, 45 | .slick-next:hover:before, 46 | .slick-next:focus:before 47 | { 48 | opacity: 1; 49 | } 50 | .slick-prev.slick-disabled:before, 51 | .slick-next.slick-disabled:before 52 | { 53 | opacity: .25; 54 | } 55 | 56 | .slick-prev:before, 57 | .slick-next:before 58 | { 59 | font-family: 'slick'; 60 | font-size: 20px; 61 | line-height: 1; 62 | 63 | opacity: .75; 64 | color: white; 65 | 66 | -webkit-font-smoothing: antialiased; 67 | -moz-osx-font-smoothing: grayscale; 68 | } 69 | 70 | .slick-prev 71 | { 72 | left: -25px; 73 | } 74 | .slick-prev:before 75 | { 76 | content: '←'; 77 | } 78 | 79 | .slick-next 80 | { 81 | right: -25px; 82 | } 83 | .slick-next:before 84 | { 85 | content: '→'; 86 | } 87 | 88 | /* Dots */ 89 | .slick-dotted.slick-slider 90 | { 91 | margin-bottom: 30px; 92 | } 93 | 94 | .slick-dots 95 | { 96 | position: absolute; 97 | bottom: -25px; 98 | 99 | display: block; 100 | 101 | width: 100%; 102 | padding: 0; 103 | margin: 0; 104 | 105 | list-style: none; 106 | 107 | text-align: center; 108 | } 109 | .slick-dots li 110 | { 111 | position: relative; 112 | 113 | display: inline-block; 114 | 115 | width: 20px; 116 | height: 20px; 117 | margin: 0 5px; 118 | padding: 0; 119 | 120 | cursor: pointer; 121 | } 122 | .slick-dots li button 123 | { 124 | font-size: 0; 125 | line-height: 0; 126 | 127 | display: block; 128 | 129 | width: 20px; 130 | height: 20px; 131 | padding: 5px; 132 | 133 | cursor: pointer; 134 | 135 | color: transparent; 136 | border: 0; 137 | outline: none; 138 | background: transparent; 139 | } 140 | .slick-dots li button:hover, 141 | .slick-dots li button:focus 142 | { 143 | outline: none; 144 | } 145 | .slick-dots li button:hover:before, 146 | .slick-dots li button:focus:before 147 | { 148 | opacity: 1; 149 | } 150 | .slick-dots li button:before 151 | { 152 | font-family: 'slick'; 153 | font-size: 6px; 154 | line-height: 20px; 155 | 156 | position: absolute; 157 | top: 0; 158 | left: 0; 159 | 160 | width: 20px; 161 | height: 20px; 162 | 163 | content: '•'; 164 | text-align: center; 165 | 166 | opacity: .25; 167 | color: black; 168 | 169 | -webkit-font-smoothing: antialiased; 170 | -moz-osx-font-smoothing: grayscale; 171 | } 172 | .slick-dots li.slick-active button:before 173 | { 174 | opacity: .75; 175 | color: black; 176 | } 177 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Feature/MainFeature.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Grid, Typography } from '@material-ui/core' 3 | 4 | import useStyles from './feature-style' 5 | 6 | const MainFeature = () => { 7 | const classes = useStyles() 8 | 9 | return ( 10 |
11 | 12 | 13 |
14 | signals 18 | 19 | 20 | TRADING SIGNALS 21 | 22 | 23 | 24 | Recieve world class signals real time from your personal dashboard, emails, SMS and any method you prefer. 25 | 26 |
27 |
28 | 29 | 30 |
31 | news 35 | 36 | 37 | TRADING NEWS 38 | 39 | 40 | 41 | Keep up with the latest trends with our economic calendar that shows traders and investors all the important events which affect financial markets. It will help understand and forecast the right trading choices. 42 | 43 |
44 |
45 | 46 | 47 |
48 | academy 52 | 53 | 54 | TRADING ACADEMY 55 | 56 | 57 | 58 | We provide Step by step guides and tutorials that help everyone learn the tricks of the trade, weither you are a beginner or an expret at the trade we have something for all levels to help them make profitable trades. 59 | 60 |
61 |
62 | 63 | 64 |
65 | academy 69 | 70 | 71 | TRADING ACADEMY 72 | 73 | 74 | 75 | Weither you know brokers or don’t, worry not we got you! We have access to various elite brokers helping you choose reliable trading services provider as it is crucial for your tradering success. 76 | 77 |
78 |
79 | 80 | 81 |
82 | academy 86 | 87 | 88 | 360 CUSTOMER SUPPORT 89 | 90 | 91 | 92 | We believe your success is our success so put you above all, our friendly customer support team would be more than happy to answer all your questions at any time, if you require technical or trading help let us know and we will put you in touch with an expert. 93 | 94 |
95 |
96 |
97 |
98 | ) 99 | } 100 | 101 | export default MainFeature 102 | -------------------------------------------------------------------------------- /src/views/web/landing/components/Footer/footer-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | 3 | const footerStyles = makeStyles(theme => ({ 4 | link: { 5 | margin: theme.spacing(1, 1.5), 6 | }, 7 | footer: { 8 | position: 'relative', 9 | marginTop: theme.spacing(8), 10 | paddingTop: theme.spacing(3), 11 | paddingBottom: theme.spacing(8), 12 | '& ul': { 13 | margin: 0, 14 | padding: 0, 15 | }, 16 | '& li': { 17 | listStyle: 'none', 18 | marginBottom: theme.spacing(), 19 | '& a': { 20 | fontSize: 14, 21 | textDecoration: 'none !important', 22 | '&:hover': { 23 | color: theme.palette.primary.main 24 | } 25 | } 26 | }, 27 | '& p': { 28 | [theme.breakpoints.down('sm')]: { 29 | padding: theme.spacing(0, 3) 30 | } 31 | } 32 | }, 33 | title: { 34 | color: theme.palette.type === 'dark' ? theme.palette.primary.light : theme.palette.primary.dark, 35 | fontSize: 14, 36 | textTransform: 'uppercase', 37 | marginBottom: theme.spacing(3), 38 | fontWeight: theme.typography.fontWeightBold, 39 | }, 40 | logo: { 41 | textAlign: 'left', 42 | display: 'flex', 43 | alignItems: 'center', 44 | marginBottom: theme.spacing(3), 45 | '& img': { 46 | filter: 'grayscale(1) contrast(0.5) brightness(1.5)', 47 | width: 48, 48 | marginRight: theme.spacing(), 49 | }, 50 | '& h6': { 51 | color: theme.palette.text.disabled, 52 | }, 53 | [theme.breakpoints.down('sm')]: { 54 | padding: theme.spacing(0, 3) 55 | } 56 | }, 57 | footerDesc: { 58 | display: 'block', 59 | fontSize: 14, 60 | marginBottom: theme.spacing(2) 61 | }, 62 | socmed: { 63 | display: 'flex', 64 | justifyContent: 'center', 65 | marginBottom: theme.spacing(4), 66 | '& button': { 67 | margin: theme.spacing(), 68 | color: theme.palette.type === 'dark' ? theme.palette.primary.light : theme.palette.primary.dark, 69 | background: theme.palette.divider, 70 | width: 36, 71 | height: 36, 72 | '& svg': { 73 | fill: theme.palette.type === 'dark' ? theme.palette.primary.light : theme.palette.primary.dark, 74 | } 75 | }, 76 | '& svg': { 77 | width: 24, 78 | height: 24 79 | } 80 | }, 81 | icon: { 82 | '& + div': { 83 | background: 'none !important', 84 | padding: theme.spacing(1.5, 1.5, 1.5, 4), 85 | width: 'calc(100% - 32px)', 86 | } 87 | }, 88 | selectLang: { 89 | margin: '0 auto', 90 | width: 200, 91 | display: 'inherit', 92 | marginTop: theme.spacing(2), 93 | color: theme.palette.type === 'dark' ? theme.palette.primary.light : theme.palette.primary.dark, 94 | '& $icon': { 95 | top: 21, 96 | position: 'relative', 97 | }, 98 | '& fieldset': { 99 | boxShadow: '0 1.5px 12px 2px rgba(0, 0, 0, 0.06)', 100 | border: `1px solid ${theme.palette.type === 'dark' ? theme.palette.primary.light : theme.palette.primary.main} !important`, 101 | '& legend': { 102 | top: 5, 103 | position: 'relative', 104 | borderTop: `1px solid ${theme.palette.type === 'dark' ? theme.palette.primary.light : theme.palette.primary.main}` 105 | } 106 | } 107 | }, 108 | siteMapItem: { 109 | [theme.breakpoints.down('md')]: { 110 | paddingBottom: '0 !important', 111 | paddingTop: '0 !important', 112 | } 113 | }, 114 | accordionRoot: { 115 | background: 'none', 116 | boxShadow: 'none', 117 | maxWidth: 480, 118 | margin: '0 auto', 119 | marginTop: theme.spacing(2), 120 | }, 121 | accordionContent: { 122 | margin: 0 123 | }, 124 | accordionIcon: { 125 | padding: 0 126 | } 127 | })) 128 | 129 | export default footerStyles 130 | -------------------------------------------------------------------------------- /src/views/user/dashboard/components/LatestAlerts.js: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | import React from 'react' 3 | import moment from 'moment' 4 | import PropTypes from 'prop-types' 5 | import { Bar } from 'react-chartjs-2' 6 | import { makeStyles } from '@material-ui/styles' 7 | import { Card, CardHeader, CardContent, Divider, Button, useTheme } from '@material-ui/core' 8 | 9 | const useStyles = makeStyles(() => ({ 10 | root: {}, 11 | chartContainer: { 12 | height: 400, 13 | position: 'relative' 14 | }, 15 | actions: { 16 | justifyContent: 'flex-end' 17 | } 18 | })) 19 | 20 | const LatestAlerts = props => { 21 | const { className, alerts, ...rest } = props 22 | 23 | const classes = useStyles() 24 | const theme = useTheme() 25 | 26 | const getWeekDays = () => { 27 | let weekDays = [] 28 | const startOfWeek = moment().startOf('week') 29 | 30 | Array(7).fill().map((each, i) => weekDays.push(moment(startOfWeek).add(i, 'days'))) 31 | 32 | const labels = [] 33 | weekDays.forEach(weekday => { 34 | labels.push(moment(weekday).format('DD MMM')) 35 | }) 36 | 37 | return labels 38 | } 39 | 40 | const data = { 41 | labels: getWeekDays(), 42 | datasets: [ 43 | { 44 | label: 'This year', 45 | backgroundColor: theme.palette.primary.main, 46 | data: alerts.thisYear 47 | }, 48 | { 49 | label: 'Last year', 50 | backgroundColor: theme.palette.neutral, 51 | data: alerts.lastYear 52 | } 53 | ] 54 | } 55 | 56 | const options = { 57 | animation: false, 58 | responsive: true, 59 | cornerRadius: 20, 60 | legend: { display: false }, 61 | maintainAspectRatio: false, 62 | tooltips: { 63 | mode: 'index', 64 | enabled: true, 65 | borderWidth: 1, 66 | intersect: false, 67 | borderColor: theme.palette.divider, 68 | backgroundColor: theme.palette.background.paper, 69 | titleFontColor: theme.palette.text.primary, 70 | bodyFontColor: theme.palette.text.secondary, 71 | footerFontColor: theme.palette.text.secondary 72 | }, 73 | layout: { padding: 0 }, 74 | scales: { 75 | xAxes: [ 76 | { 77 | barThickness: 12, 78 | barPercentage: 0.5, 79 | maxBarThickness: 10, 80 | categoryPercentage: 0.5, 81 | ticks: { 82 | fontColor: theme.palette.text.secondary 83 | }, 84 | gridLines: { 85 | display: false, 86 | drawBorder: false 87 | } 88 | } 89 | ], 90 | yAxes: [ 91 | { 92 | ticks: { 93 | min: 0, 94 | beginAtZero: true, 95 | fontColor: theme.palette.text.secondary 96 | }, 97 | gridLines: { 98 | borderDash: [2], 99 | drawBorder: false, 100 | borderDashOffset: [2], 101 | color: theme.palette.divider, 102 | zeroLineBorderDash: [2], 103 | zeroLineBorderDashOffset: [2], 104 | zeroLineColor: theme.palette.divider 105 | } 106 | } 107 | ] 108 | } 109 | } 110 | 111 | return ( 112 | 115 | 122 | Last 7 days 123 | 124 | } /> 125 | 126 | 127 | 128 | 129 |
130 | 133 |
134 |
135 |
136 | ) 137 | } 138 | 139 | LatestAlerts.propTypes = { 140 | className: PropTypes.string 141 | } 142 | 143 | export default LatestAlerts -------------------------------------------------------------------------------- /src/views/web/landing/components/Feature/feature-style.js: -------------------------------------------------------------------------------- 1 | import { makeStyles } from '@material-ui/core/styles' 2 | 3 | const decoration = theme => ({ 4 | background: theme.palette.type === 'dark' ? theme.palette.primary.dark : theme.palette.primary.light, 5 | borderRadius: '50%', 6 | width: 250, 7 | height: 250, 8 | position: 'absolute', 9 | top: -20, 10 | left: 60, 11 | opacity: 0.5 12 | }) 13 | 14 | const featureStyles = makeStyles(theme => ({ 15 | pageSection: { 16 | marginBottom: theme.spacing(20) 17 | }, 18 | featureWrap: { 19 | position: 'relative' 20 | }, 21 | icon: {}, 22 | image: { 23 | height: 55 24 | }, 25 | featureList: { 26 | textAlign: 'center', 27 | '& h5': { 28 | margin: `${theme.spacing(3)}px 0` 29 | }, 30 | '& $icon': { 31 | fill: theme.palette.primary.main, 32 | width: 100, 33 | height: 100 34 | } 35 | }, 36 | title: {}, 37 | text: {}, 38 | img: {}, 39 | imgFull: {}, 40 | last: {}, 41 | featureMore: { 42 | position: 'relative', 43 | '& $title': { 44 | marginBottom: theme.spacing(3) 45 | }, 46 | '& $text': { 47 | fontSize: 22 48 | }, 49 | '& $img': { 50 | position: 'relative', 51 | width: 400, 52 | maxWidth: '98%', 53 | '& img': { 54 | width: '100%' 55 | } 56 | }, 57 | '& $imgFull': { 58 | position: 'relative', 59 | textAlign: 'center', 60 | maxWidth: 800, 61 | margin: '0 auto', 62 | [theme.breakpoints.down('sm')]: { 63 | maxWidth: '98%', 64 | }, 65 | marginTop: theme.spacing(5), 66 | '& img': { 67 | width: '100%' 68 | } 69 | }, 70 | }, 71 | featureItem: { 72 | position: 'relative', 73 | marginBottom: theme.spacing(20), 74 | '&$last': { 75 | marginBottom: 0, 76 | } 77 | }, 78 | deco1: { 79 | ...decoration(theme) 80 | }, 81 | deco2: { 82 | ...decoration(theme), 83 | width: 450, 84 | height: 450, 85 | top: 40, 86 | left: 'calc(50% - 350px)', 87 | }, 88 | parallaxWrap: { 89 | position: 'absolute', 90 | width: '100%', 91 | height: '100%', 92 | overflow: 'hidden', 93 | top: 0, 94 | left: 0, 95 | zIndex: 0, 96 | [theme.breakpoints.down('md')]: { 97 | display: 'none' 98 | }, 99 | '& figure > div': { 100 | height: 1000, 101 | width: '100%', 102 | position: 'relative', 103 | top: 500, 104 | } 105 | }, 106 | bannerParallaxWrap: { 107 | height: 800, 108 | width: '100%', 109 | position: 'absolute', 110 | display: 'block', 111 | '& figure': { 112 | height: 800, 113 | width: '100%', 114 | display: 'block', 115 | position: 'absolute', 116 | }, 117 | '& figure > div': { 118 | height: 800, 119 | width: '100%', 120 | display: 'block', 121 | position: 'absolute', 122 | top: 0, 123 | } 124 | }, 125 | parallaxVertical: { 126 | width: '100%', 127 | height: '100%', 128 | position: 'absolute', 129 | [theme.breakpoints.up('lg')]: { 130 | transform: 'scale(0.3)' 131 | } 132 | }, 133 | parallaxDot: { 134 | top: -20, 135 | fill: theme.palette.text.hint, 136 | width: 845, 137 | height: 1099, 138 | opacity: 0.4, 139 | left: -370 140 | }, 141 | parallaxTriangle: { 142 | top: 100, 143 | outline: theme.palette.text.hint, 144 | opacity: 0.1, 145 | width: 902, 146 | height: 1042, 147 | stroke: theme.palette.text.hint, 148 | fill: 'transparent', 149 | strokeWidth: 50, 150 | right: -210 151 | }, 152 | parallaxCircle: { 153 | top: 250, 154 | width: 600, 155 | height: 570, 156 | opacity: 0.1, 157 | stroke: theme.palette.text.hint, 158 | fill: 'transparent', 159 | strokeWidth: 40, 160 | right: 40 161 | }, 162 | })) 163 | 164 | export default featureStyles 165 | -------------------------------------------------------------------------------- /src/views/user/groupChat/GroupChat.js: -------------------------------------------------------------------------------- 1 | import { useSnackbar } from 'notistack' 2 | import useSocket from 'use-socket.io-client' 3 | import { makeStyles } from '@material-ui/styles' 4 | import React, { useEffect, useState } from 'react' 5 | import { Grid, Dialog, CircularProgress, DialogContent, Hidden } from '@material-ui/core' 6 | 7 | import { UserApi } from 'config/Api' 8 | import Constants from 'config/Constants' 9 | import GroupChatLive from './components/GroupChatLive' 10 | import GroupChatMembers from './components/GroupChatMembers' 11 | 12 | const userApi = new UserApi() 13 | 14 | const useStyles = makeStyles(theme => ({ 15 | root: { 16 | padding: theme.spacing(3) 17 | }, 18 | content: { 19 | marginTop: 20, 20 | textAlign: 'center' 21 | }, 22 | contentInner: { 23 | marginTop: 20 24 | }, 25 | image: { 26 | width: 560, 27 | marginTop: 50, 28 | maxWidth: '100%', 29 | display: 'inline-block' 30 | } 31 | })) 32 | 33 | const GroupChat = () => { 34 | const classes = useStyles() 35 | const { enqueueSnackbar } = useSnackbar() 36 | 37 | const userId = localStorage.getItem('userId') 38 | 39 | const [isPaid, setIsPaid] = useState(false) 40 | const [isLoading, setIsLoading] = useState(true) 41 | const [socket] = useSocket(`${Constants.SERVER_URL}/chat-group`, { 42 | autoConnect: false 43 | }) 44 | const [availableUsersState, setAvailableUsersState] = useState([]) 45 | const [groupChatHistoryState, setGroupChatHistoryState] = useState([]) 46 | const [profileState, setProfileState] = useState({ 47 | avatar: '', 48 | fullName: '' 49 | }) 50 | 51 | useEffect(() => { fetchProfileDetails() }, []) 52 | 53 | const fetchProfileDetails = async () => { 54 | const fetchAccountResult = await userApi.fetchAccount({ userId }) 55 | 56 | if (fetchAccountResult.error) { 57 | setIsLoading(false) 58 | return enqueueSnackbar(fetchAccountResult.message, { variant: 'error' }) 59 | } 60 | 61 | setProfileState(profileState => ({ 62 | ...profileState, 63 | avatar: fetchAccountResult.data.avatar || '', 64 | fullName: fetchAccountResult.data.firstName + ' ' + fetchAccountResult.data.lastName || '' 65 | })) 66 | 67 | if (fetchAccountResult.data.membership !== 'Free Membership') 68 | setIsPaid(true) 69 | 70 | setIsLoading(false) 71 | } 72 | 73 | useEffect(() => { 74 | if (isPaid && !isLoading) { 75 | socket.connect() 76 | 77 | socket.emit('userJoined', { 78 | id: userId, 79 | avatar: profileState.avatar, 80 | fullName: profileState.fullName 81 | }) 82 | 83 | socket.on('availableUsers', data => setAvailableUsersState(data)) 84 | 85 | socket.on('chatHistory', data => setGroupChatHistoryState(data)) 86 | 87 | socket.on('message', data => setGroupChatHistoryState(groupChatHistoryState => ([...groupChatHistoryState, data]))) 88 | } 89 | }, [isPaid, isLoading]) 90 | 91 | if (isLoading) 92 | return ( 93 | 94 | 95 | 96 | 97 | 98 | ) 99 | 100 | return ( 101 |
102 | 106 | 107 | 113 | 116 | 117 | 118 | 119 | 125 | 130 | 131 | 132 |
133 | ) 134 | } 135 | 136 | export default GroupChat --------------------------------------------------------------------------------