├── .dockerignore ├── .env.example ├── .github └── workflows │ ├── dev.yml │ ├── main.yml │ └── pr.yml ├── .gitignore ├── .prettierrc.js ├── .yarn └── releases │ └── yarn-3.2.3.cjs ├── .yarnrc.yml ├── Dockerfile ├── LICENSE ├── README.md ├── default.conf ├── docker-compose.build.yml ├── docker-compose.yml ├── env-map.js ├── package.json ├── public ├── assets │ ├── favicon.ico │ ├── locales │ │ ├── en │ │ │ └── translation.json │ │ ├── fa │ │ │ └── translation.json │ │ └── uzb │ │ │ └── translation.json │ ├── logo │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── android-icon-144x144.png │ │ ├── android-icon-192x192.png │ │ ├── android-icon-36x36.png │ │ ├── android-icon-48x48.png │ │ ├── android-icon-72x72.png │ │ ├── android-icon-96x96.png │ │ ├── apple-icon-114x114.png │ │ ├── apple-icon-120x120.png │ │ ├── apple-icon-144x144.png │ │ ├── apple-icon-152x152.png │ │ ├── apple-icon-180x180.png │ │ ├── apple-icon-57x57.png │ │ ├── apple-icon-60x60.png │ │ ├── apple-icon-72x72.png │ │ ├── apple-icon-76x76.png │ │ ├── apple-icon-precomposed.png │ │ ├── apple-icon.png │ │ ├── apple-touch-icon.png │ │ ├── browserconfig.xml │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── logo-mini.svg │ │ ├── logo.svg │ │ ├── ms-icon-144x144.png │ │ ├── ms-icon-150x150.png │ │ ├── ms-icon-310x310.png │ │ └── ms-icon-70x70.png │ └── manifest.json ├── charting_library │ ├── charting_library.min.d.ts │ ├── charting_library.min.js │ ├── datafeed-api.d.ts │ └── static │ │ ├── ar-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── bundles │ │ ├── 0.1d4cbcaddbec7d8c5363.js │ │ ├── 1.2fa13f88d2bf6ae6f3f0.css │ │ ├── 1.2fa13f88d2bf6ae6f3f0.rtl.css │ │ ├── 1.ea828ac684caa2b94a1b.js │ │ ├── 10.0501e55a3ef6aa50aec6.js │ │ ├── 10.c0a8664f16f3834961e4.css │ │ ├── 10.c0a8664f16f3834961e4.rtl.css │ │ ├── 11.b900b9cb8ed6dd3bc321.css │ │ ├── 11.b900b9cb8ed6dd3bc321.rtl.css │ │ ├── 11.dd520838f92e45cd91e3.js │ │ ├── 12.18e3c4b9c329e737cb80.js │ │ ├── 12.87f9777d9fe2086ce090.css │ │ ├── 12.87f9777d9fe2086ce090.rtl.css │ │ ├── 13.46f312828e93b6546d0c.js │ │ ├── 14.579d7892443d1a90180c.js │ │ ├── 15.19c5212d15382007773d.js │ │ ├── 16.cc58f582c191485d9392.css │ │ ├── 16.cc58f582c191485d9392.rtl.css │ │ ├── 16.e0d00f8a564954896734.js │ │ ├── 17.00b04a06a8cd9c6f5f6c.js │ │ ├── 18.183d41ade16dae257526.css │ │ ├── 18.183d41ade16dae257526.rtl.css │ │ ├── 18.e4c458360dbad4de5cf6.js │ │ ├── 19.aba848e28ec755548668.css │ │ ├── 19.aba848e28ec755548668.rtl.css │ │ ├── 19.c5542d290eefbb001433.js │ │ ├── 2.195070ea59b3395625da.js │ │ ├── 2.a3e34146d368d13b6bc1.css │ │ ├── 2.a3e34146d368d13b6bc1.rtl.css │ │ ├── 20.2416da4fc4c075b56691.js │ │ ├── 20.f75162343321d7d9178c.css │ │ ├── 20.f75162343321d7d9178c.rtl.css │ │ ├── 21.7e987db0ed47cc3f789c.css │ │ ├── 21.7e987db0ed47cc3f789c.rtl.css │ │ ├── 21.fc856808959a5b8734f7.js │ │ ├── 22.c118eafc7686081984c8.js │ │ ├── 22.f31ebffc8672752a2d4b.css │ │ ├── 22.f31ebffc8672752a2d4b.rtl.css │ │ ├── 23.7c4be219df640cb3880c.css │ │ ├── 23.7c4be219df640cb3880c.rtl.css │ │ ├── 23.e89d09694523563b8f86.js │ │ ├── 24.319f9ed9725f3cea260a.js │ │ ├── 25.15d449d35706e01821dd.js │ │ ├── 26.16e9146c09ea7d6b839a.js │ │ ├── 27.54aad15135c7ea57b345.js │ │ ├── 28.3f2589cd73664ea3f3e3.js │ │ ├── 29.6a6accc00e80feb13030.js │ │ ├── 3.f41fdd1a128935b63e5b.js │ │ ├── 30.c3cc90c5fbe9a2b87ffb.js │ │ ├── 31.5c895c4f655400b0b4e2.css │ │ ├── 31.5c895c4f655400b0b4e2.rtl.css │ │ ├── 31.d081df3316799b489847.js │ │ ├── 32.48df7a8cdc38d60b308b.js │ │ ├── 32.b92773bfff0363a69bb9.css │ │ ├── 32.b92773bfff0363a69bb9.rtl.css │ │ ├── 33.4a74c62095be3045c87e.js │ │ ├── 33.ac320c107772f8e72252.css │ │ ├── 33.ac320c107772f8e72252.rtl.css │ │ ├── 34.17e0ce399a577f17ba55.js │ │ ├── 34.dd27b311326fd1fc6fde.css │ │ ├── 34.dd27b311326fd1fc6fde.rtl.css │ │ ├── 35.47b9d16b3fa10b495a11.css │ │ ├── 35.47b9d16b3fa10b495a11.rtl.css │ │ ├── 35.58433cec10095e3c1b7e.js │ │ ├── 36.2ee80b40751fcc88a65c.js │ │ ├── 36.e9a6bec06ee11d2c2d4a.css │ │ ├── 36.e9a6bec06ee11d2c2d4a.rtl.css │ │ ├── 37.065a5f2249aafcfe50ec.css │ │ ├── 37.065a5f2249aafcfe50ec.rtl.css │ │ ├── 37.1735365b01406a8d696d.js │ │ ├── 38.4073381c29c4e2bc2209.css │ │ ├── 38.4073381c29c4e2bc2209.rtl.css │ │ ├── 38.9ae2eea9402c30aa3046.js │ │ ├── 39.5f64b4bc2e263edfbf6e.css │ │ ├── 39.5f64b4bc2e263edfbf6e.rtl.css │ │ ├── 39.7e524b82ef9947f0f19f.js │ │ ├── 4.80bf1a925965757be6d4.js │ │ ├── 40.0f54f57304896d7506a2.css │ │ ├── 40.0f54f57304896d7506a2.rtl.css │ │ ├── 40.42bd9598272e9dd24457.js │ │ ├── 41.11c024e8e0504741fd66.js │ │ ├── 41.1dc91fcdd5dbde1247d7.css │ │ ├── 41.1dc91fcdd5dbde1247d7.rtl.css │ │ ├── 42.0491acaaf55887f7fcb3.js │ │ ├── 42.db948a104cb86b7df06e.css │ │ ├── 42.db948a104cb86b7df06e.rtl.css │ │ ├── 43.12df9892872230fa2898.css │ │ ├── 43.12df9892872230fa2898.rtl.css │ │ ├── 43.4ae432f1b8259dbfd0e5.js │ │ ├── 44.01ec30ff4ce8cf7fa8e5.css │ │ ├── 44.01ec30ff4ce8cf7fa8e5.rtl.css │ │ ├── 44.7aabc64d3dfb54c85d60.js │ │ ├── 45.6c1fc3ac2f6063249f97.js │ │ ├── 45.e09d2beed14ffd8995a9.css │ │ ├── 45.e09d2beed14ffd8995a9.rtl.css │ │ ├── 46.75a0e6fecbc3c92a6bc7.js │ │ ├── 46.923fdbea563cd1d28d4c.css │ │ ├── 46.923fdbea563cd1d28d4c.rtl.css │ │ ├── 47.773635a99e184d6dc131.js │ │ ├── 47.b48791ffffadc9c96a10.css │ │ ├── 47.b48791ffffadc9c96a10.rtl.css │ │ ├── 48.912258c9b4f11cd518c3.css │ │ ├── 48.912258c9b4f11cd518c3.rtl.css │ │ ├── 48.9d08141ee2d55bcad3e7.js │ │ ├── 49.0cb5c561f3b28a047912.css │ │ ├── 49.0cb5c561f3b28a047912.rtl.css │ │ ├── 49.929acbc67c2613c57f58.js │ │ ├── 5.1beaffde9123ffaeff74.js │ │ ├── 50.2c50aad369bf63f77061.js │ │ ├── 50.e2f9bc14536ad546e595.css │ │ ├── 50.e2f9bc14536ad546e595.rtl.css │ │ ├── 51.30c5804303a9f1c455e3.js │ │ ├── 51.a35e4c0d0b08a018e307.css │ │ ├── 51.a35e4c0d0b08a018e307.rtl.css │ │ ├── 52.be1d70abe1a172cc5c3a.css │ │ ├── 52.be1d70abe1a172cc5c3a.rtl.css │ │ ├── 52.c212ca3684de16c6f115.js │ │ ├── 53.3f6d736abe33683640bc.css │ │ ├── 53.3f6d736abe33683640bc.rtl.css │ │ ├── 53.7217742e39b70fc9d431.js │ │ ├── 54.9eb4ca2a30197d95fe82.js │ │ ├── 54.cf540e4ba48bf75e96c2.css │ │ ├── 54.cf540e4ba48bf75e96c2.rtl.css │ │ ├── 55.7707e6ae9f2ec8cfb656.js │ │ ├── 55.c11884ad80d526214fb6.css │ │ ├── 55.c11884ad80d526214fb6.rtl.css │ │ ├── 56.83cd8456e872f49059c3.js │ │ ├── 56.ea0c135a2b02b495fbb5.css │ │ ├── 56.ea0c135a2b02b495fbb5.rtl.css │ │ ├── 57.6384b62456dc4fed6ffb.js │ │ ├── 57.651927021db01a7ed13f.css │ │ ├── 57.651927021db01a7ed13f.rtl.css │ │ ├── 58.8077d6b199609737b3d5.js │ │ ├── 58.82b7bef062a290e587d4.css │ │ ├── 58.82b7bef062a290e587d4.rtl.css │ │ ├── 6.35dee0cfeb8a4d70732c.css │ │ ├── 6.35dee0cfeb8a4d70732c.rtl.css │ │ ├── 6.902d5f3923d45b49b876.js │ │ ├── 7.e98fce2ffac2c552565f.css │ │ ├── 7.e98fce2ffac2c552565f.rtl.css │ │ ├── 7.fc0941206f7b7d32812d.js │ │ ├── 8.180c6bdc716e5045b645.css │ │ ├── 8.180c6bdc716e5045b645.rtl.css │ │ ├── 8.62bd4ee21281906a7019.js │ │ ├── 9.855edb9bea2352bd5129.js │ │ ├── add-compare-dialog.e9db1b14483f3e7358f4.js │ │ ├── change-interval-dialog.c8c04c297cc329376f2b.js │ │ ├── chart-bottom-toolbar.da7ac0cc35cc8a26f65a.js │ │ ├── chart-widget-gui.8005316cfc1f06be4bf0.js │ │ ├── clipboard.5403f9bd852af06addff.js │ │ ├── confirm-inputs-dialog.f9823e95a365cd8974c9.js │ │ ├── confirm-symbol-input-dialog.c72289c830292c73812f.js │ │ ├── context-menu-renderer.5eff9c34fa03e94b2c1b.js │ │ ├── create-dialog.472fe015128398f27a86.js │ │ ├── crosshair.6c091f7d5427d0c5e6d9dc3a90eb2b20.cur │ │ ├── dialogs-core.c712826575e8ea62d8e0.js │ │ ├── dialogs-core.e9f630dd3fdeb4ceee21.css │ │ ├── dialogs-core.e9f630dd3fdeb4ceee21.rtl.css │ │ ├── dot.ed68e83c16f77203e73dbc4c3a7c7fa1.cur │ │ ├── drawing-toolbar.35360bdf4aedb7db7287.js │ │ ├── ds-property-pages.33a0b54c87f584f79681.js │ │ ├── editobjectdialog.a4fd348616e0724542ac.js │ │ ├── eraser.0579d40b812fa2c3ffe72e5803a6e14c.cur │ │ ├── export-data.ea9e219d1d41389ea3b7.js │ │ ├── floating-toolbars.d7f25f59513991368767.js │ │ ├── fontawesome-webfont.3293616ec0c605c7c2db25829a0a509e.woff │ │ ├── fontawesome-webfont.40f9a03d174178efb12303caa9bc7cd8.woff2 │ │ ├── go-to-date-dialog-impl.51162344726d8956c763.js │ │ ├── grab.bc156522a6b55a60be9fae15c14b66c5.cur │ │ ├── grabbing.1c0862a8a8c0fb02885557bc97fdafe7.cur │ │ ├── hammerjs.46686dd839f22b742351.js │ │ ├── header-toolbar.743cca210a6a3e37939e.js │ │ ├── ie-fallback-logos.589046871bfa17cbfbda.js │ │ ├── lazy-jquery-ui.3a9fe36168ca8e6cacb8.js │ │ ├── lazy-velocity.d040cf1092d3b2920dde.js │ │ ├── library.bb7ca756e7cbe50becb3.css │ │ ├── library.bb7ca756e7cbe50becb3.rtl.css │ │ ├── library.e964cdc99937c68d0389.js │ │ ├── line-tools-icons.c89643eed013eb0ff7c1.js │ │ ├── load-chart-dialog.24806d5c5be9fbdfd103.js │ │ ├── lt-pane-views.e06093931461762ecd11.js │ │ ├── moment.fdf50ccef2c78863664d.js │ │ ├── new-edit-object-dialog.232c44a337440602cba4.js │ │ ├── objecttreedialog.bb84539d18c87a88a80b.js │ │ ├── opacity-pattern.a6506134daec7169f68f563f084a9d41.svg │ │ ├── precache-manifest.60144109bbe17651b1eb050c29e4f6f4.js │ │ ├── react.cdaa9c19dda854fad341.js │ │ ├── restricted-toolset.e356a29caff335c91f6b.js │ │ ├── runtime.d22af752ee0c2111becd.js │ │ ├── series-icons-map.e3b746e7a7341e8ddb2d.js │ │ ├── series-pane-views.678a074c53e327c3184a.js │ │ ├── service-worker.js │ │ ├── study-market.ff409c6c02ba9edc0151.js │ │ ├── study-pane-views.ee901b6c4a31f84ba03d.js │ │ ├── study-template-dialog.a6f710070f1f64f2ef11.js │ │ ├── symbol-info-dialog-impl.eaddb54cc066d7a021e2.js │ │ ├── symbolsearch.0057814b113bcee3d957.js │ │ ├── take-chart-image-dialog-impl.d61e03a87b11d0c1adf1.js │ │ ├── vendors.267dd414d71e078f822c.js │ │ └── zoom.e21f24dd632c7069139bc47ae89c54b5.cur │ │ ├── cs-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── da_DK-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── de-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── el-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── en-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── es-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── et_EE-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── fa-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── fr-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── he_IL-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── hu_HU-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── id_ID-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── images │ │ ├── balloon.png │ │ ├── bar-loader.gif │ │ ├── button-bg.png │ │ ├── charting_library │ │ │ ├── logo-widget-copyright-faded.png │ │ │ └── logo-widget-copyright.png │ │ ├── controlll.png │ │ ├── delayed.png │ │ ├── dialogs │ │ │ ├── checkbox.png │ │ │ ├── close-flat.png │ │ │ ├── large-slider-handle.png │ │ │ ├── linewidth-slider.png │ │ │ └── opacity-slider.png │ │ ├── icons.png │ │ ├── prediction-clock-black.png │ │ ├── prediction-clock-white.png │ │ ├── prediction-failure-white.png │ │ ├── prediction-success-white.png │ │ ├── price_label.png │ │ ├── select-bg.png │ │ ├── svg │ │ │ ├── chart │ │ │ │ ├── bucket2.svg │ │ │ │ ├── font.svg │ │ │ │ ├── large-slider-handle.svg │ │ │ │ └── pencil2.svg │ │ │ └── question-mark-rounded.svg │ │ ├── tvcolorpicker-bg-gradient.png │ │ ├── tvcolorpicker-bg.png │ │ ├── tvcolorpicker-check.png │ │ └── tvcolorpicker-sprite.png │ │ ├── it-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── ja-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── ko-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── ms_MY-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── nl_NL-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── no-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── pl-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── pt-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── ro-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── ru-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── sk_SK-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── sv-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── th-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── tr-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── vi-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ ├── zh-tv-chart.8562c7b8f7bdb50c1f5d.html │ │ └── zh_TW-tv-chart.8562c7b8f7bdb50c1f5d.html ├── datafeeds │ ├── README.md │ └── udf │ │ ├── .npmrc │ │ ├── README.md │ │ ├── dist │ │ ├── bundle.js │ │ └── polyfills.js │ │ ├── lib │ │ ├── data-pulse-provider.js │ │ ├── helpers.js │ │ ├── history-provider.js │ │ ├── iquotes-provider.js │ │ ├── quotes-provider.js │ │ ├── quotes-pulse-provider.js │ │ ├── requester.js │ │ ├── symbols-storage.js │ │ ├── udf-compatible-datafeed-base.js │ │ └── udf-compatible-datafeed.js │ │ ├── package.json │ │ ├── rollup.config.js │ │ ├── src │ │ ├── data-pulse-provider.js │ │ ├── data-pulse-provider.ts │ │ ├── helpers.js │ │ ├── helpers.ts │ │ ├── history-provider.js │ │ ├── history-provider.ts │ │ ├── iquotes-provider.js │ │ ├── iquotes-provider.ts │ │ ├── polyfills.es6 │ │ ├── quotes-provider.js │ │ ├── quotes-provider.ts │ │ ├── quotes-pulse-provider.js │ │ ├── quotes-pulse-provider.ts │ │ ├── requester.js │ │ ├── requester.ts │ │ ├── symbols-storage.js │ │ ├── symbols-storage.ts │ │ ├── udf-compatible-datafeed-base.js │ │ ├── udf-compatible-datafeed-base.ts │ │ ├── udf-compatible-datafeed.js │ │ └── udf-compatible-datafeed.ts │ │ └── tsconfig.json ├── index.html └── robots.txt ├── src ├── Hooks │ ├── useInterval.js │ └── useQuery.js ├── assets │ ├── fontIcon │ │ └── opex-icon │ │ │ ├── LICENSE.txt │ │ │ ├── README.txt │ │ │ ├── config.json │ │ │ ├── css │ │ │ ├── animation.css │ │ │ ├── opex-icon-codes.css │ │ │ ├── opex-icon-embedded.css │ │ │ ├── opex-icon-ie7-codes.css │ │ │ ├── opex-icon-ie7.css │ │ │ └── opex-icon.css │ │ │ ├── demo.html │ │ │ └── font │ │ │ ├── opex-icon.eot │ │ │ ├── opex-icon.svg │ │ │ ├── opex-icon.ttf │ │ │ ├── opex-icon.woff │ │ │ └── opex-icon.woff2 │ ├── fonts │ │ └── IRANYekan │ │ │ └── Farsi_numerals │ │ │ ├── eot │ │ │ ├── iranyekanwebblackfanum.eot │ │ │ ├── iranyekanwebboldfanum.eot │ │ │ ├── iranyekanwebextrablackfanum.eot │ │ │ ├── iranyekanwebextraboldfanum.eot │ │ │ ├── iranyekanweblightfanum.eot │ │ │ ├── iranyekanwebmediumfanum.eot │ │ │ ├── iranyekanwebregularfanum.eot │ │ │ └── iranyekanwebthinfanum.eot │ │ │ ├── svg │ │ │ ├── iranyekanwebblackfanum.svg │ │ │ ├── iranyekanwebboldfanum.svg │ │ │ ├── iranyekanwebextrablackfanum.svg │ │ │ ├── iranyekanwebextraboldfanum.svg │ │ │ ├── iranyekanweblightfanum.svg │ │ │ ├── iranyekanwebmediumfanum.svg │ │ │ ├── iranyekanwebregularfanum.svg │ │ │ └── iranyekanwebthinfanum.svg │ │ │ ├── ttf │ │ │ ├── iranyekanwebblackfanum.ttf │ │ │ ├── iranyekanwebboldfanum.ttf │ │ │ ├── iranyekanwebextrablackfanum.ttf │ │ │ ├── iranyekanwebextraboldfanum.ttf │ │ │ ├── iranyekanweblightfanum.ttf │ │ │ ├── iranyekanwebmediumfanum.ttf │ │ │ ├── iranyekanwebregularfanum.ttf │ │ │ └── iranyekanwebthinfanum.ttf │ │ │ └── woff │ │ │ ├── iranyekanwebblackfanum.woff │ │ │ ├── iranyekanwebboldfanum.woff │ │ │ ├── iranyekanwebextrablackfanum.woff │ │ │ ├── iranyekanwebextraboldfanum.woff │ │ │ ├── iranyekanweblightfanum.woff │ │ │ ├── iranyekanwebmediumfanum.woff │ │ │ ├── iranyekanwebregularfanum.woff │ │ │ └── iranyekanwebthinfanum.woff │ ├── images.js │ └── images │ │ └── src │ │ ├── OpexMockupMac.png │ │ ├── OpexPanelMockupDark.png │ │ ├── OpexPanelMockupLight.png │ │ ├── approve.svg │ │ ├── approveAnimation.gif │ │ ├── astronaut.svg │ │ ├── astronautAlone.svg │ │ ├── astronautAloneSwing.svg │ │ ├── authentication.svg │ │ ├── binance.svg │ │ ├── binanceUSD.svg │ │ ├── bitcoin.svg │ │ ├── bitcoinCash.svg │ │ ├── block.svg │ │ ├── chart.svg │ │ ├── dogecoin.svg │ │ ├── ethereum.svg │ │ ├── ethereumLight.svg │ │ ├── linearLoading.gif │ │ ├── linearLoadingBgOrange.gif │ │ ├── litecoin.svg │ │ ├── opex-qr-code.svg │ │ ├── opexCoin.svg │ │ ├── pending.svg │ │ ├── reject.svg │ │ ├── rejectAnimation.gif │ │ ├── safe.svg │ │ ├── security.svg │ │ ├── signIn.svg │ │ ├── signOut.svg │ │ ├── solana.svg │ │ ├── spaceStar.png │ │ ├── squareLoading.gif │ │ ├── squareLoadingLight.gif │ │ ├── testBinance.svg │ │ ├── testBitcoin.svg │ │ ├── testEthereumLight.svg │ │ ├── testTether.svg │ │ ├── testTron.svg │ │ ├── testbinanceUSD.svg │ │ ├── tether.svg │ │ ├── toman.svg │ │ ├── toncoin.svg │ │ └── tron.svg ├── components │ ├── AccordionBox │ │ ├── AccordionBox.js │ │ └── AccordionBox.module.css │ ├── ActionSheet │ │ ├── ActionSheet.js │ │ └── ActionSheet.module.css │ ├── AdvanceTradingView │ │ ├── AdvanceTradingView.css │ │ ├── AdvanceTradingView.jsx │ │ ├── DataFeed.js │ │ └── HistoryProvider.js │ ├── Button │ │ └── Button.js │ ├── Date │ │ └── Date.js │ ├── Error │ │ └── Error.js │ ├── FullWidthError │ │ └── FullWidthError.js │ ├── FullWidthLoading │ │ ├── FullWidthError.module.css │ │ └── FullWidthLoading.js │ ├── HeaderBuilder │ │ ├── HeaderBuilder.js │ │ └── HeaderBuilder.module.css │ ├── Icon │ │ └── Icon.js │ ├── ImageInput │ │ └── ImageInput.js │ ├── Info │ │ └── Info.js │ ├── Layout │ │ ├── Layout.js │ │ ├── Layout.module.css │ │ └── LayoutHeader │ │ │ ├── LayoutHeader.js │ │ │ └── LayoutHeader.module.css │ ├── Loading │ │ └── Loading.js │ ├── NullMarketStats │ │ └── NullMarketStats.js │ ├── NumberInput │ │ ├── NumberInput.js │ │ └── NumberInput.module.css │ ├── Popup │ │ ├── Popup.js │ │ ├── Popup.module.css │ │ └── PopupAddress │ │ │ └── PopupAddress.js │ ├── ProtectedRoute │ │ └── ProtectedRoute.js │ ├── ScrollBar │ │ └── index.js │ ├── SelectInput │ │ └── SelectInput.js │ ├── ShimmerEffect │ │ ├── ShimmerEffect.js │ │ └── ShimmerEffect.module.css │ ├── TextInput │ │ ├── TextInput.js │ │ └── TextInput.module.css │ ├── ToggleSwitch │ │ ├── ToggleSwitch.js │ │ └── ToggleSwitch.module.css │ └── VerticalTextInput │ │ ├── VerticalNumberInput.js │ │ └── VerticalNumberInput.module.css ├── constants │ ├── chart.js │ └── global.js ├── index.css ├── index.js ├── logo.svg ├── main │ ├── Browser │ │ ├── Browser.js │ │ ├── Pages │ │ │ ├── 404 │ │ │ │ └── index.js │ │ │ ├── AllMarket │ │ │ │ ├── AllMarket.js │ │ │ │ ├── AllMarket.module.css │ │ │ │ └── components │ │ │ │ │ ├── AllMarketInfo │ │ │ │ │ ├── AllMarketInfo.js │ │ │ │ │ ├── AllMarketInfo.module.css │ │ │ │ │ └── components │ │ │ │ │ │ ├── AllMarketInfoCard │ │ │ │ │ │ ├── AllMarketInfoCard.js │ │ │ │ │ │ └── AllMarketInfoCard.module.css │ │ │ │ │ │ └── AllMarketInfoTable │ │ │ │ │ │ ├── AllMarketInfoTable.js │ │ │ │ │ │ └── AllMarketInfoTable.module.css │ │ │ │ │ ├── PriceInfo │ │ │ │ │ ├── PriceInfo.js │ │ │ │ │ ├── PriceInfo.module.css │ │ │ │ │ └── components │ │ │ │ │ │ ├── MostDecreasedPrice │ │ │ │ │ │ └── MostDecreasedPrice.js │ │ │ │ │ │ └── MostIncreasedPrice │ │ │ │ │ │ └── MostIncreasedPrice.js │ │ │ │ │ ├── Swing │ │ │ │ │ ├── Swing.js │ │ │ │ │ └── Swing.module.css │ │ │ │ │ └── VolumeInfo │ │ │ │ │ ├── VolumeInfo.js │ │ │ │ │ ├── VolumeInfo.module.css │ │ │ │ │ └── components │ │ │ │ │ ├── MostTrades │ │ │ │ │ └── MostTrades.js │ │ │ │ │ └── MostVolume │ │ │ │ │ └── MostVolume.js │ │ │ ├── EasyTrading │ │ │ │ ├── EasyTrading.js │ │ │ │ ├── EasyTrading.module.css │ │ │ │ └── components │ │ │ │ │ └── EasyOrder │ │ │ │ │ ├── EasyOrder.js │ │ │ │ │ └── EasyOrder.module.css │ │ │ ├── Info │ │ │ │ ├── AboutUs │ │ │ │ │ ├── AboutUs.js │ │ │ │ │ └── AboutUs.module.css │ │ │ │ ├── Commission │ │ │ │ │ ├── Commission.js │ │ │ │ │ └── Commission.module.css │ │ │ │ ├── ContactUs │ │ │ │ │ ├── ContactUs.js │ │ │ │ │ └── ContactUs.module.css │ │ │ │ ├── Guide │ │ │ │ │ ├── Guide.js │ │ │ │ │ └── Guide.module.css │ │ │ │ ├── Rules │ │ │ │ │ ├── Rules.js │ │ │ │ │ └── Rules.module.css │ │ │ │ └── TransferFees │ │ │ │ │ ├── TransferFees.js │ │ │ │ │ └── TransferFees.module.css │ │ │ ├── Landing │ │ │ │ ├── Landing.js │ │ │ │ ├── Landing.module.css │ │ │ │ └── components │ │ │ │ │ ├── GeneralInfo │ │ │ │ │ ├── GeneralInfo.js │ │ │ │ │ └── GeneralInfo.module.css │ │ │ │ │ ├── MarketInfo │ │ │ │ │ ├── MarketInfo.js │ │ │ │ │ ├── MarketInfo.module.css │ │ │ │ │ └── components │ │ │ │ │ │ ├── MarketInfoCard │ │ │ │ │ │ ├── MarketInfoCard.js │ │ │ │ │ │ └── MarketInfoCard.module.css │ │ │ │ │ │ └── MarketInfoTable │ │ │ │ │ │ ├── MarketInfoTable.js │ │ │ │ │ │ └── MarketInfoTable.module.css │ │ │ │ │ ├── MarketTitle │ │ │ │ │ ├── MarketTitle.js │ │ │ │ │ └── MarketTitle.module.css │ │ │ │ │ ├── MarketView │ │ │ │ │ ├── MarketView.js │ │ │ │ │ ├── MarketView.module.css │ │ │ │ │ └── components │ │ │ │ │ │ ├── MostDecreasedPrice │ │ │ │ │ │ └── MostDecreasedPrice.js │ │ │ │ │ │ ├── MostIncreasedPrice │ │ │ │ │ │ └── MostIncreasedPrice.js │ │ │ │ │ │ └── MostVolume │ │ │ │ │ │ └── MostVolume.js │ │ │ │ │ └── Spinner │ │ │ │ │ ├── Spinner.js │ │ │ │ │ └── Spinner.module.css │ │ │ ├── Login │ │ │ │ ├── Login.js │ │ │ │ ├── Login.module.css │ │ │ │ └── components │ │ │ │ │ ├── EmailVerification │ │ │ │ │ └── EmailVerification.js │ │ │ │ │ ├── ForgetPassword │ │ │ │ │ └── ForgetPassword.js │ │ │ │ │ ├── LoginForm │ │ │ │ │ └── LoginForm.js │ │ │ │ │ ├── LoginLoading │ │ │ │ │ └── LoginFormLoading.js │ │ │ │ │ ├── OTPForm │ │ │ │ │ └── OTPForm.js │ │ │ │ │ └── RegisterForm │ │ │ │ │ └── RegisterForm.js │ │ │ ├── User │ │ │ │ ├── User.js │ │ │ │ ├── User.module.css │ │ │ │ └── components │ │ │ │ │ ├── ForgetPassword │ │ │ │ │ ├── ForgetPassword.js │ │ │ │ │ └── ForgetPassword.module.css │ │ │ │ │ └── Verify │ │ │ │ │ ├── Verify.js │ │ │ │ │ └── Verify.module.css │ │ │ └── UserPanel │ │ │ │ ├── Sections │ │ │ │ ├── Content │ │ │ │ │ ├── Content.js │ │ │ │ │ └── components │ │ │ │ │ │ ├── History │ │ │ │ │ │ ├── History.js │ │ │ │ │ │ ├── History.module.css │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── DepositHistory │ │ │ │ │ │ │ ├── DepositHistory.js │ │ │ │ │ │ │ └── DepositHistory.module.css │ │ │ │ │ │ │ ├── DepositHistoryTable │ │ │ │ │ │ │ ├── DepositHistoryTable.js │ │ │ │ │ │ │ └── DepositHistoryTable.module.css │ │ │ │ │ │ │ ├── Transactions │ │ │ │ │ │ │ ├── Transactions.js │ │ │ │ │ │ │ └── Transactions.module.css │ │ │ │ │ │ │ ├── TransactionsTable │ │ │ │ │ │ │ ├── TransactionsTable.js │ │ │ │ │ │ │ └── TransactionsTable.module.css │ │ │ │ │ │ │ ├── WithdrawHistory │ │ │ │ │ │ │ ├── WithdrawHistory.js │ │ │ │ │ │ │ └── WithdrawHistory.module.css │ │ │ │ │ │ │ └── WithdrawHistoryTable │ │ │ │ │ │ │ ├── WithdrawHistoryTable.js │ │ │ │ │ │ │ └── WithdrawHistoryTable.module.css │ │ │ │ │ │ ├── Market │ │ │ │ │ │ ├── Market.js │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── LastTrades │ │ │ │ │ │ │ ├── LastTrades.js │ │ │ │ │ │ │ ├── LastTrades.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ └── LastTradesTable │ │ │ │ │ │ │ │ ├── LastTradesTable.js │ │ │ │ │ │ │ │ └── LastTradesTable.module.css │ │ │ │ │ │ │ ├── MyOrders │ │ │ │ │ │ │ ├── MyOrders.js │ │ │ │ │ │ │ ├── MyOrders.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ ├── OpenOrders │ │ │ │ │ │ │ │ └── OpenOrders.js │ │ │ │ │ │ │ │ ├── OrdersHistory │ │ │ │ │ │ │ │ └── OrdersHistory.js │ │ │ │ │ │ │ │ ├── StopMarket │ │ │ │ │ │ │ │ └── StopMarket.js │ │ │ │ │ │ │ │ └── Trades │ │ │ │ │ │ │ │ └── Trades.js │ │ │ │ │ │ │ ├── Order │ │ │ │ │ │ │ ├── Order.js │ │ │ │ │ │ │ ├── Order.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ ├── BuyOrder │ │ │ │ │ │ │ │ └── BuyOrder.js │ │ │ │ │ │ │ │ └── SellOrder │ │ │ │ │ │ │ │ └── SellOrder.js │ │ │ │ │ │ │ ├── OrderBook │ │ │ │ │ │ │ ├── OrderBook.js │ │ │ │ │ │ │ ├── OrderBook.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ ├── OrderBookTable │ │ │ │ │ │ │ │ ├── OrderBookTable.js │ │ │ │ │ │ │ │ └── OrderBookTable.module.css │ │ │ │ │ │ │ │ └── OrderBookTooltip │ │ │ │ │ │ │ │ └── OrderBookTooltip.js │ │ │ │ │ │ │ ├── Overview │ │ │ │ │ │ │ ├── Overview.js │ │ │ │ │ │ │ ├── Overview.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ └── InformationBlock │ │ │ │ │ │ │ │ └── InformationBlock.js │ │ │ │ │ │ │ └── TradingView │ │ │ │ │ │ │ ├── TradingView.js │ │ │ │ │ │ │ ├── TradingView.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ └── MarketChart │ │ │ │ │ │ │ └── MarketChart.js │ │ │ │ │ │ ├── Settings │ │ │ │ │ │ ├── Settings.js │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── APIKey │ │ │ │ │ │ │ ├── APIKey.js │ │ │ │ │ │ │ ├── APIKey.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ ├── APIKeyList │ │ │ │ │ │ │ │ ├── APIKeyList.js │ │ │ │ │ │ │ │ ├── APIKeyList.module.css │ │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ │ └── APIKeyCard │ │ │ │ │ │ │ │ │ └── APIKeyCard.js │ │ │ │ │ │ │ │ └── CreateAPIKey │ │ │ │ │ │ │ │ ├── CreateAPIKey.js │ │ │ │ │ │ │ │ ├── CreateAPIKey.module.css │ │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ └── ResultPage │ │ │ │ │ │ │ │ ├── ResultPage.js │ │ │ │ │ │ │ │ └── ResultPage.module.css │ │ │ │ │ │ │ ├── Authentication │ │ │ │ │ │ │ ├── Authentication.js │ │ │ │ │ │ │ ├── Authentication.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ ├── HelpStep │ │ │ │ │ │ │ │ ├── HelpStep.js │ │ │ │ │ │ │ │ └── HelpStep.module.css │ │ │ │ │ │ │ │ ├── PersonalProfileStep │ │ │ │ │ │ │ │ ├── PersonalProfileStep.js │ │ │ │ │ │ │ │ └── PersonalProfileStep.module.css │ │ │ │ │ │ │ │ ├── SendPhotosStep │ │ │ │ │ │ │ │ ├── SendPhotosStep.js │ │ │ │ │ │ │ │ └── SendPhotosStep.module.css │ │ │ │ │ │ │ │ └── SendToAdminStep │ │ │ │ │ │ │ │ ├── SendToAdminStep.js │ │ │ │ │ │ │ │ └── SendToAdminStep.module.css │ │ │ │ │ │ │ ├── Personalization │ │ │ │ │ │ │ ├── Personalization.js │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ └── PersonalizationForm │ │ │ │ │ │ │ │ ├── PersonalizationForm.js │ │ │ │ │ │ │ │ └── PersonalizationForm.module.css │ │ │ │ │ │ │ ├── Profile │ │ │ │ │ │ │ ├── Profile.js │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ ├── PersonalProfile │ │ │ │ │ │ │ │ ├── PersonalProfile.js │ │ │ │ │ │ │ │ └── PersonalProfile.module.css │ │ │ │ │ │ │ │ └── UserAccountStatus │ │ │ │ │ │ │ │ ├── UserAccountStatus.js │ │ │ │ │ │ │ │ └── UserAccountStatus.module.css │ │ │ │ │ │ │ └── Security │ │ │ │ │ │ │ ├── Security.js │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── ActiveSessions │ │ │ │ │ │ │ ├── ActiveSessions.js │ │ │ │ │ │ │ ├── ActiveSessions.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ ├── Details │ │ │ │ │ │ │ │ ├── Details.js │ │ │ │ │ │ │ │ └── Details.module.css │ │ │ │ │ │ │ │ └── Session │ │ │ │ │ │ │ │ ├── Session.js │ │ │ │ │ │ │ │ └── Session.module.css │ │ │ │ │ │ │ ├── ChangePassword │ │ │ │ │ │ │ ├── ChangePassword.js │ │ │ │ │ │ │ └── ChangePassword.module.css │ │ │ │ │ │ │ ├── LoginReports │ │ │ │ │ │ │ ├── LoginReports.js │ │ │ │ │ │ │ └── LoginReports.module.css │ │ │ │ │ │ │ └── SetTwoStepVerification │ │ │ │ │ │ │ ├── SetTwoStepVerification.js │ │ │ │ │ │ │ ├── SetTwoStepVerification.module.css │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── ActivateOTP.js │ │ │ │ │ │ │ └── DisableOTP.js │ │ │ │ │ │ ├── TechnicalChart │ │ │ │ │ │ ├── TechnicalChart.js │ │ │ │ │ │ └── TechnicalChart.module.css │ │ │ │ │ │ ├── TransactionHistory │ │ │ │ │ │ ├── TransactionHistory.js │ │ │ │ │ │ ├── TransactionHistory.module.css │ │ │ │ │ │ └── components │ │ │ │ │ │ │ └── TransactionHistoryTable │ │ │ │ │ │ │ ├── TransactionHistoryTable.js │ │ │ │ │ │ │ └── TransactionHistoryTable.module.css │ │ │ │ │ │ ├── Transactions │ │ │ │ │ │ ├── Transactions.js │ │ │ │ │ │ ├── Transactions.module.css │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── BuyAndSell │ │ │ │ │ │ │ ├── BuyAndSell.js │ │ │ │ │ │ │ └── BuyAndSell.module.css │ │ │ │ │ │ │ ├── BuyAndSellTable │ │ │ │ │ │ │ ├── BuyAndSellTable.js │ │ │ │ │ │ │ └── BuyAndSellTable.module.css │ │ │ │ │ │ │ ├── DepositHistory │ │ │ │ │ │ │ ├── DepositHistory.js │ │ │ │ │ │ │ └── DepositHistory.module.css │ │ │ │ │ │ │ ├── DepositHistoryTable │ │ │ │ │ │ │ ├── DepositHistoryTable.js │ │ │ │ │ │ │ └── DepositHistoryTable.module.css │ │ │ │ │ │ │ ├── WithdrawHistory │ │ │ │ │ │ │ ├── WithdrawHistory.js │ │ │ │ │ │ │ └── WithdrawHistory.module.css │ │ │ │ │ │ │ └── WithdrawHistoryTable │ │ │ │ │ │ │ ├── WithdrawHistoryTable.js │ │ │ │ │ │ │ └── WithdrawHistoryTable.module.css │ │ │ │ │ │ └── Wallet │ │ │ │ │ │ ├── Wallet.js │ │ │ │ │ │ └── components │ │ │ │ │ │ ├── DepositTx │ │ │ │ │ │ ├── DepositTx.js │ │ │ │ │ │ └── DepositTx.module.css │ │ │ │ │ │ ├── DepositTxTable │ │ │ │ │ │ ├── DepositTxTable.js │ │ │ │ │ │ └── DepositTxTable.module.css │ │ │ │ │ │ ├── DepositWithdraw │ │ │ │ │ │ ├── DepositWithdraw.js │ │ │ │ │ │ ├── DepositWithdraw.module.css │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── Deposit │ │ │ │ │ │ │ ├── Deposit.js │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ ├── Address │ │ │ │ │ │ │ │ └── Address.js │ │ │ │ │ │ │ │ ├── IRT │ │ │ │ │ │ │ │ ├── IRT.module.css │ │ │ │ │ │ │ │ ├── IRTDeposit.js │ │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ │ └── CallbackPage │ │ │ │ │ │ │ │ │ ├── CallbackPage.js │ │ │ │ │ │ │ │ │ └── CallbackPage.module.css │ │ │ │ │ │ │ │ └── Transfer.js │ │ │ │ │ │ │ └── Withdrawal.js │ │ │ │ │ │ ├── DepositWithdrawTx │ │ │ │ │ │ ├── DepositWithdrawTx.js │ │ │ │ │ │ ├── DepositWithdrawTx.module.css │ │ │ │ │ │ └── components │ │ │ │ │ │ │ ├── DepositWithdrawTxTables │ │ │ │ │ │ │ └── DepositWithdrawTxTables.js │ │ │ │ │ │ │ ├── FilterTxs │ │ │ │ │ │ │ └── FilterTxs.js │ │ │ │ │ │ │ └── IRTTx │ │ │ │ │ │ │ └── IRTTx.js │ │ │ │ │ │ ├── OrdersTrades │ │ │ │ │ │ ├── OrdersTrades.js │ │ │ │ │ │ └── OrdersTrades.module.css │ │ │ │ │ │ ├── OrdersTradesFilter │ │ │ │ │ │ ├── OrdersTradesFilter.js │ │ │ │ │ │ └── OrdersTradesFilter.module.css │ │ │ │ │ │ ├── WithdrawTx │ │ │ │ │ │ ├── WithdrawTx.js │ │ │ │ │ │ └── WithdrawTx.module.css │ │ │ │ │ │ └── WithdrawTxTable │ │ │ │ │ │ ├── WithdrawTxTable.js │ │ │ │ │ │ └── WithdrawTxTable.module.css │ │ │ │ ├── Footer │ │ │ │ │ ├── Footer.js │ │ │ │ │ └── Footer.module.css │ │ │ │ ├── Header │ │ │ │ │ ├── Header.js │ │ │ │ │ ├── Header.module.css │ │ │ │ │ └── components │ │ │ │ │ │ ├── Clock │ │ │ │ │ │ └── Clock.js │ │ │ │ │ │ ├── MarketHeader │ │ │ │ │ │ ├── MarketHeader.js │ │ │ │ │ │ └── MarketHeader.module.css │ │ │ │ │ │ ├── SettingsHeader │ │ │ │ │ │ ├── SettingsHeader.js │ │ │ │ │ │ └── SettingsHeader.module.css │ │ │ │ │ │ └── WalletHeader │ │ │ │ │ │ ├── WalletHeader.js │ │ │ │ │ │ └── WalletHeader.module.css │ │ │ │ ├── MainMenu │ │ │ │ │ ├── MainMenu.js │ │ │ │ │ └── MainMenu.module.css │ │ │ │ └── SubMenu │ │ │ │ │ ├── SubMenu.js │ │ │ │ │ ├── SubMenu.module.css │ │ │ │ │ └── components │ │ │ │ │ ├── MarketSubMenu │ │ │ │ │ ├── MarketSubMenu.js │ │ │ │ │ ├── MarketSubMenu.module.css │ │ │ │ │ └── components │ │ │ │ │ │ ├── MarketCard │ │ │ │ │ │ ├── MarketCard.js │ │ │ │ │ │ └── MarketCard.module.css │ │ │ │ │ │ └── MarketPairCard │ │ │ │ │ │ ├── MarketCard.module.css │ │ │ │ │ │ └── MarketPairCard.js │ │ │ │ │ ├── MessagesSubMenu │ │ │ │ │ ├── MessagesSubMenu.js │ │ │ │ │ ├── MessagesSubMenu.module.css │ │ │ │ │ └── components │ │ │ │ │ │ ├── MessagesCard │ │ │ │ │ │ ├── MessagesCard.js │ │ │ │ │ │ └── MessagesCard.module.css │ │ │ │ │ │ └── NotifCard │ │ │ │ │ │ ├── NotifCard.js │ │ │ │ │ │ └── NotifCard.module.css │ │ │ │ │ ├── SettingsSubMenu │ │ │ │ │ ├── SettingsSubMenu.js │ │ │ │ │ └── SettingsSubMenu.module.css │ │ │ │ │ └── WalletSubMenu │ │ │ │ │ ├── WalletSubMenu.js │ │ │ │ │ ├── WalletSubMenu.module.css │ │ │ │ │ └── components │ │ │ │ │ ├── WalletBalance │ │ │ │ │ └── WalletBalance.js │ │ │ │ │ ├── WalletList │ │ │ │ │ └── WalletList.js │ │ │ │ │ ├── WalletListItem │ │ │ │ │ └── WalletListItem.js │ │ │ │ │ └── WalletLoading │ │ │ │ │ └── WalletLoading.js │ │ │ │ ├── UserPanel.js │ │ │ │ └── UserPanel.module.css │ │ ├── Routes │ │ │ └── routes.js │ │ └── Styles │ │ │ └── Browser.css │ ├── Mobile │ │ ├── Mobile.js │ │ └── Mobille.css │ └── main.js ├── queries │ ├── hooks │ │ ├── useDepositTxs.js │ │ ├── useGetAPIKeyList.js │ │ ├── useGetBuyAndSellHistory.js │ │ ├── useGetChartCandlesticks.js │ │ ├── useGetCurrencyInfo.js │ │ ├── useGetDepositAddress.js │ │ ├── useGetDepositHistory.js │ │ ├── useGetExchangeInfo.js │ │ ├── useGetFeeForSymbol.js │ │ ├── useGetIPGOpenInvoice.js │ │ ├── useGetKycStatus.js │ │ ├── useGetLastPrices.js │ │ ├── useGetMarketStats.js │ │ ├── useGetQuoteCurrencies.js │ │ ├── useGetTransactionsHistory.js │ │ ├── useGetUserAccount.js │ │ ├── useGetUserActiveSessions.js │ │ ├── useGetUserAssets.js │ │ ├── useGetUserAssetsEstimatedValue.js │ │ ├── useGetUserAttributes.js │ │ ├── useGetUserOtpStatus.js │ │ ├── useGetWithdrawHistory.js │ │ ├── useIPGDeposit.js │ │ ├── useLastTrades.js │ │ ├── useMyOpenOrders.js │ │ ├── useMyOrderHistory.js │ │ ├── useMyTrades.js │ │ ├── useOrderBook.js │ │ ├── useOverview.js │ │ ├── useTxs.js │ │ └── useWithdrawTxs.js │ └── index.js ├── reportWebVitals.js ├── setup │ ├── axios │ │ └── setupAxios.js │ └── configs │ │ └── configs.js ├── setupTests.js ├── store │ ├── actions │ │ ├── actionTypes.js │ │ ├── auth.js │ │ ├── exchange.js │ │ ├── global.js │ │ └── index.js │ ├── reducers │ │ ├── authReducer.js │ │ ├── exchangeReducer.js │ │ └── globalReducer.js │ └── sagas │ │ ├── auth.js │ │ ├── global.js │ │ └── index.js └── utils │ └── utils.js └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | # ignore .git and .cache folders 2 | .git 3 | .cache 4 | 5 | # node 6 | node_modules 7 | 8 | # build artifacts 9 | build -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | #UI ENV 2 | REACT_APP_TITLE= 3 | REACT_APP_DESCRIPTION_CONTENT= 4 | #MANIFEST 5 | REACT_APP_MANIFEST_FILE= 6 | #API CONFIG 7 | REACT_APP_API_BASE_URL= 8 | REACT_APP_CLIENT_ID= 9 | REACT_APP_LOGIN_CLIENT_ID= 10 | REACT_APP_CLIENT_SECRET= 11 | #LANGUAGES 12 | REACT_APP_MULTI_LANGS_SUPPORT= 13 | REACT_APP_PRELOAD_LANG= 14 | REACT_APP_LANGS_SUPPORT= 15 | #DEFAULT THEME 16 | REACT_APP_DEFAULT_THEME= 17 | #SYSTEM_EMAIL 18 | REACT_APP_SYSTEM_EMAIL_ADDRESS= -------------------------------------------------------------------------------- /.github/workflows/dev.yml: -------------------------------------------------------------------------------- 1 | name: Push images on dev branch update 2 | 3 | on: 4 | push: 5 | branches: 6 | - develop 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-20.04 11 | name: OPEX web app build 12 | env: 13 | TAG: dev 14 | steps: 15 | - name: Checkout Source Code 16 | uses: actions/checkout@v2 17 | - name: Build Docker images 18 | env: 19 | GENERATE_SOURCEMAP: '' 20 | run: docker compose -f docker-compose.build.yml build 21 | - name: Login to GitHub Container Registry 22 | uses: docker/login-action@v1 23 | with: 24 | registry: ghcr.io 25 | username: ${{ github.actor }} 26 | password: ${{ secrets.GITHUB_TOKEN }} 27 | - name: Push images to GitHub Container Registry 28 | run: docker compose -f docker-compose.build.yml push 29 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Push images on main branch update 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-20.04 11 | name: OPEX web app build 12 | env: 13 | TAG: latest 14 | steps: 15 | - name: Checkout Source Code 16 | uses: actions/checkout@v2 17 | - name: Build Docker images 18 | env: 19 | GENERATE_SOURCEMAP: false 20 | run: docker compose -f docker-compose.build.yml build 21 | - name: Login to GitHub Container Registry 22 | uses: docker/login-action@v1 23 | with: 24 | registry: ghcr.io 25 | username: ${{ github.actor }} 26 | password: ${{ secrets.GITHUB_TOKEN }} 27 | - name: Push images to GitHub Container Registry 28 | run: docker compose -f docker-compose.build.yml push 29 | -------------------------------------------------------------------------------- /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | name: Build on pull request 2 | 3 | on: 4 | pull_request: 5 | types: [ opened, synchronize, reopened ] 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-20.04 10 | name: OPEX web app build 11 | steps: 12 | - name: Checkout Source Code 13 | uses: actions/checkout@v2 14 | - name: Build Docker images 15 | env: 16 | TAG: latest 17 | GENERATE_SOURCEMAP: false 18 | run: docker compose -f docker-compose.build.yml build 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | /public/env.js 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/releases 10 | !.yarn/plugins 11 | !.yarn/sdks 12 | !.yarn/versions 13 | .pnp.* 14 | 15 | # testing 16 | /coverage 17 | 18 | # production 19 | /build 20 | 21 | # misc 22 | .DS_Store 23 | .env 24 | .env.local 25 | .env.development.local 26 | .env.test.local 27 | .env.production.local 28 | .eslintcache 29 | .idea 30 | .vscode 31 | 32 | 33 | npm-debug.log* 34 | yarn-debug.log* 35 | yarn-error.log* 36 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | bracketSpacing: false, 3 | jsxBracketSameLine: true, 4 | singleQuote: false, 5 | tabWidth: 2, 6 | semi: true, 7 | trailingComma: 'all', 8 | endOfLine: 'auto', 9 | }; 10 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | 3 | yarnPath: .yarn/releases/yarn-3.2.3.cjs 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-gallium AS build 2 | COPY . /web-app 3 | WORKDIR /web-app 4 | ENV NODE_ENV production 5 | RUN yarn cache clean 6 | RUN yarn install --immutable 7 | ARG GENERATE_SOURCEMAP='false' 8 | ENV GENERATE_SOURCEMAP $GENERATE_SOURCEMAP 9 | RUN yarn build 10 | 11 | FROM nginx:1.20.2 12 | COPY default.conf /etc/nginx/conf.d 13 | COPY --from=build /web-app/build /var/www/opex/html 14 | WORKDIR /var/www/opex/html 15 | COPY env-map.js . 16 | CMD cat env-map.js | envsubst > env.js && nginx -g "daemon off;" 17 | EXPOSE 80 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 OPEX 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | listen [::]:80; 4 | root /var/www/opex/html; 5 | index index.html index.htm index.nginx-debian.html; 6 | 7 | location / { 8 | try_files $uri $uri/ =404; 9 | } 10 | 11 | location /metrics { 12 | stub_status on; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /docker-compose.build.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | web-app: 4 | image: ghcr.io/opexdev/web-app:$TAG 5 | build: 6 | context: . 7 | args: 8 | - GENERATE_SOURCEMAP=$GENERATE_SOURCEMAP -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | web-app: 4 | image: ghcr.io/opexdev/web-app 5 | environment: 6 | - ENV=$WEB_APP_ENV 7 | - APP_TITLE=$WEB_APP_TITLE 8 | - DESCRIPTION=$WEB_APP_DESCRIPTION 9 | - API_BASE_URL=$API_BASE_URL 10 | - CLIENT_ID=$CLIENT_ID 11 | - LOGIN_CLIENT_ID=$CLIENT_LOGIN_ID 12 | - CLIENT_SECRET=$CLIENT_SECRET 13 | - PRELOAD_LANG=$PRELOAD_LANG 14 | - LANGS_SUPPORT=$LANGS_SUPPORT 15 | - DEFAULT_THEME=$DEFAULT_THEME 16 | - REGISTER_EMAIL_ADDRESS=$REGISTER_EMAIL_ADDRESS 17 | - REFERENCE_FIAT_CURRENCY=$WEB_APP_REFERENCE_FIAT_CURRENCY 18 | - CALENDAR_TYPE=$WEB_APP_CALENDAR_TYPE 19 | - MOBILE_URL=$WEB_APP_MOBILE_URL 20 | networks: 21 | - default 22 | deploy: 23 | restart_policy: 24 | condition: on-failure 25 | networks: 26 | default: 27 | driver: bridge -------------------------------------------------------------------------------- /env-map.js: -------------------------------------------------------------------------------- 1 | window.env = { 2 | REACT_APP_ENV: "$ENV", 3 | REACT_APP_TITLE: "$APP_TITLE", 4 | REACT_APP_DESCRIPTION_CONTENT: "$DESCRIPTION", 5 | REACT_APP_API_BASE_URL: "$API_BASE_URL", 6 | REACT_APP_LOGIN_CLIENT_ID: "$CLIENT_ID", 7 | REACT_APP_CLIENT_ID: "$CLIENT_ID", 8 | REACT_APP_CLIENT_SECRET: "$CLIENT_SECRET", 9 | REACT_APP_PRELOAD_LANG : "$PRELOAD_LANG", 10 | REACT_APP_LANGS_SUPPORT : "$LANGS_SUPPORT", 11 | REACT_APP_DEFAULT_THEME : "$DEFAULT_THEME", 12 | REACT_APP_SYSTEM_EMAIL_ADDRESS : "$REGISTER_EMAIL_ADDRESS", 13 | REACT_APP_REFERENCE_FIAT_CURRENCY : "$REFERENCE_FIAT_CURRENCY", 14 | REACT_APP_CALENDAR_TYPE : "$CALENDAR_TYPE", 15 | REACT_APP_MOBILE_URL : "$MOBILE_URL", 16 | } -------------------------------------------------------------------------------- /public/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/favicon.ico -------------------------------------------------------------------------------- /public/assets/logo/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/assets/logo/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/assets/logo/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/android-icon-144x144.png -------------------------------------------------------------------------------- /public/assets/logo/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/android-icon-192x192.png -------------------------------------------------------------------------------- /public/assets/logo/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/android-icon-36x36.png -------------------------------------------------------------------------------- /public/assets/logo/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/android-icon-48x48.png -------------------------------------------------------------------------------- /public/assets/logo/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/android-icon-72x72.png -------------------------------------------------------------------------------- /public/assets/logo/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/android-icon-96x96.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-114x114.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-120x120.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-144x144.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-152x152.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-180x180.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-57x57.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-60x60.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-72x72.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-76x76.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon-precomposed.png -------------------------------------------------------------------------------- /public/assets/logo/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-icon.png -------------------------------------------------------------------------------- /public/assets/logo/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/apple-touch-icon.png -------------------------------------------------------------------------------- /public/assets/logo/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /public/assets/logo/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/favicon-16x16.png -------------------------------------------------------------------------------- /public/assets/logo/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/favicon-32x32.png -------------------------------------------------------------------------------- /public/assets/logo/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/favicon-96x96.png -------------------------------------------------------------------------------- /public/assets/logo/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/favicon.ico -------------------------------------------------------------------------------- /public/assets/logo/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/ms-icon-144x144.png -------------------------------------------------------------------------------- /public/assets/logo/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/ms-icon-150x150.png -------------------------------------------------------------------------------- /public/assets/logo/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/ms-icon-310x310.png -------------------------------------------------------------------------------- /public/assets/logo/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/assets/logo/ms-icon-70x70.png -------------------------------------------------------------------------------- /public/assets/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Opex", 3 | "name": "Open Source Exchange", 4 | "icons": [ 5 | { 6 | "src": "/assets/logo/android-icon-36x36.png", 7 | "sizes": "36x36", 8 | "type": "image\/png", 9 | "density": "0.75" 10 | }, 11 | { 12 | "src": "/assets/logo/android-icon-48x48.png", 13 | "sizes": "48x48", 14 | "type": "image\/png", 15 | "density": "1.0" 16 | }, 17 | { 18 | "src": "/assets/logo/android-icon-72x72.png", 19 | "sizes": "72x72", 20 | "type": "image\/png", 21 | "density": "1.5" 22 | }, 23 | { 24 | "src": "/assets/logo/android-icon-96x96.png", 25 | "sizes": "96x96", 26 | "type": "image\/png", 27 | "density": "2.0" 28 | }, 29 | { 30 | "src": "/assets/logo/android-icon-144x144.png", 31 | "sizes": "144x144", 32 | "type": "image\/png", 33 | "density": "3.0" 34 | }, 35 | { 36 | "src": "/assets/logo/android-icon-192x192.png", 37 | "sizes": "192x192", 38 | "type": "image\/png", 39 | "density": "4.0" 40 | } 41 | ], 42 | "start_url": "/", 43 | "display": "standalone", 44 | "theme_color": "#000000", 45 | "background_color": "#ffffff" 46 | } 47 | -------------------------------------------------------------------------------- /public/charting_library/static/bundles/1.ea828ac684caa2b94a1b.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[1],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/10.0501e55a3ef6aa50aec6.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[10],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/11.dd520838f92e45cd91e3.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[11],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/12.18e3c4b9c329e737cb80.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[12],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/12.87f9777d9fe2086ce090.css: -------------------------------------------------------------------------------- 1 | .dialog-2APwxL3O-{display:flex;min-width:280px;text-align:left;box-sizing:border-box;background-color:#fff;flex-direction:column}html.theme-dark .dialog-2APwxL3O-{background-color:#1e222d}.dialog-2APwxL3O-.rounded-tXI9mwGE-{border-radius:4px}.dialog-2APwxL3O-.shadowed-2M13-xZa-{box-shadow:0 1px 2px 1px rgba(0,0,0,.275)}.dialog-2APwxL3O-.fullscreen-2RqU2pqU-{position:fixed;width:100%;max-width:100%;height:100%;max-height:100%;min-height:100%} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/12.87f9777d9fe2086ce090.rtl.css: -------------------------------------------------------------------------------- 1 | .dialog-2APwxL3O-{display:flex;min-width:280px;text-align:right;box-sizing:border-box;background-color:#fff;flex-direction:column}html.theme-dark .dialog-2APwxL3O-{background-color:#1e222d}.dialog-2APwxL3O-.rounded-tXI9mwGE-{border-radius:4px}.dialog-2APwxL3O-.shadowed-2M13-xZa-{box-shadow:0 1px 2px 1px rgba(0,0,0,.275)}.dialog-2APwxL3O-.fullscreen-2RqU2pqU-{position:fixed;width:100%;max-width:100%;height:100%;max-height:100%;min-height:100%} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/16.e0d00f8a564954896734.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[16],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/18.e4c458360dbad4de5cf6.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[18],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/19.c5542d290eefbb001433.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[19],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/2.195070ea59b3395625da.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[2],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/20.2416da4fc4c075b56691.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[20],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/20.f75162343321d7d9178c.css: -------------------------------------------------------------------------------- 1 | .tv-caret{content:"";display:inline-block;width:0;height:0;border-style:solid;border-width:4px 4px 0;border-color:currentColor transparent transparent;margin-left:5px;vertical-align:middle;transition:transform .35s ease}.active .tv-caret,.i-dropped .tv-caret:not(.tv-caret--strict),.tv-caret--strict.i-dropped{transform:rotate(-180deg);will-change:transform;transition-duration:.33}.tv-caret--small{margin-left:3px;margin-right:-1px;border-top-width:3px;border-right-width:3px;border-left-width:3px}.tv-caret--colored{transition:transform .35s ease,color .35s ease}.tv-caret--no-margin{margin-left:0} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/20.f75162343321d7d9178c.rtl.css: -------------------------------------------------------------------------------- 1 | .tv-caret{content:"";display:inline-block;width:0;height:0;border-style:solid;border-width:4px 4px 0;border-color:currentColor transparent transparent;margin-right:5px;vertical-align:middle;transition:transform .35s ease}.active .tv-caret,.i-dropped .tv-caret:not(.tv-caret--strict),.tv-caret--strict.i-dropped{transform:rotate(180deg);will-change:transform;transition-duration:.33}.tv-caret--small{margin-right:3px;margin-left:-1px;border-top-width:3px;border-left-width:3px;border-right-width:3px}.tv-caret--colored{transition:transform .35s ease,color .35s ease}.tv-caret--no-margin{margin-right:0} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/21.fc856808959a5b8734f7.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[21],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/22.c118eafc7686081984c8.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[22],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/23.7c4be219df640cb3880c.css: -------------------------------------------------------------------------------- 1 | .dialog-34XTwGTT-{position:fixed;min-width:280px;width:100%;max-width:380px}.dialog-34XTwGTT- [data-dragg-area]{cursor:url(grab.bc156522a6b55a60be9fae15c14b66c5.cur),move;cursor:grab}.dialog-34XTwGTT- [data-dragg-area].dragging-33JfMDO6-{cursor:url(grabbing.1c0862a8a8c0fb02885557bc97fdafe7.cur),move;cursor:grabbing} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/23.7c4be219df640cb3880c.rtl.css: -------------------------------------------------------------------------------- 1 | .dialog-34XTwGTT-{position:fixed;min-width:280px;width:100%;max-width:380px}.dialog-34XTwGTT- [data-dragg-area]{cursor:url(grab.bc156522a6b55a60be9fae15c14b66c5.cur),move;cursor:grab}.dialog-34XTwGTT- [data-dragg-area].dragging-33JfMDO6-{cursor:url(grabbing.1c0862a8a8c0fb02885557bc97fdafe7.cur),move;cursor:grabbing} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/23.e89d09694523563b8f86.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[23],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/31.d081df3316799b489847.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[31],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/32.48df7a8cdc38d60b308b.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[32],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/33.4a74c62095be3045c87e.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[33],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/34.17e0ce399a577f17ba55.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[34],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/35.47b9d16b3fa10b495a11.css: -------------------------------------------------------------------------------- 1 | .tv-tabbed-dialog{background-color:#fff;color:#4a4a4a}html.theme-dark .tv-tabbed-dialog{color:#c5cbce;background-color:#1e222d}.tv-tabbed-dialog__header{display:flex;position:relative;padding-top:0;padding-left:0;padding-bottom:0;border-bottom:none!important;margin-bottom:-1px;z-index:6}.tv-tabbed-dialog__bottom-border{position:absolute;left:0;right:0;bottom:0;height:1px;background-color:#dadde0;z-index:-1}html.theme-dark .tv-tabbed-dialog__bottom-border{background-color:#363c4e}.tv-tabbed-dialog__tab-page{height:100%;display:none}.tv-tabbed-dialog__tab-page.active{overflow-y:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;display:block}.tv-tabbed-dialog__close{z-index:6;top:5px}.tv-tabbed-dialog__tabs{width:100%;flex-shrink:1;height:53px}.tv-tabbed-dialog__custom-controls{margin-left:10px;flex-shrink:0}.tv-tabbed-dialog__tabs-arrow-left:before,.tv-tabbed-dialog__tabs-arrow-right:before{content:"";position:absolute;bottom:1px;left:0;right:0;height:1px}.tv-tabbed-dialog__tabs-arrow-left:before{background:linear-gradient(90deg,#dadde0 0,#dadde0 85%,hsla(0,0%,100%,0))}.tv-tabbed-dialog__tabs-arrow-right:before{background:linear-gradient(270deg,#dadde0 0,#dadde0 85%,hsla(0,0%,100%,0))} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/35.47b9d16b3fa10b495a11.rtl.css: -------------------------------------------------------------------------------- 1 | .tv-tabbed-dialog{background-color:#fff;color:#4a4a4a}html.theme-dark .tv-tabbed-dialog{color:#c5cbce;background-color:#1e222d}.tv-tabbed-dialog__header{display:flex;position:relative;padding-top:0;padding-right:0;padding-bottom:0;border-bottom:none!important;margin-bottom:-1px;z-index:6}.tv-tabbed-dialog__bottom-border{position:absolute;right:0;left:0;bottom:0;height:1px;background-color:#dadde0;z-index:-1}html.theme-dark .tv-tabbed-dialog__bottom-border{background-color:#363c4e}.tv-tabbed-dialog__tab-page{height:100%;display:none}.tv-tabbed-dialog__tab-page.active{overflow-y:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;display:block}.tv-tabbed-dialog__close{z-index:6;top:5px}.tv-tabbed-dialog__tabs{width:100%;flex-shrink:1;height:53px}.tv-tabbed-dialog__custom-controls{margin-right:10px;flex-shrink:0}.tv-tabbed-dialog__tabs-arrow-left:before,.tv-tabbed-dialog__tabs-arrow-right:before{content:"";position:absolute;bottom:1px;right:0;left:0;height:1px}.tv-tabbed-dialog__tabs-arrow-left:before{background:linear-gradient(270deg,#dadde0 0,#dadde0 85%,hsla(0,0%,100%,0))}.tv-tabbed-dialog__tabs-arrow-right:before{background:linear-gradient(90deg,#dadde0 0,#dadde0 85%,hsla(0,0%,100%,0))} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/35.58433cec10095e3c1b7e.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[35],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/36.2ee80b40751fcc88a65c.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[36],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/36.e9a6bec06ee11d2c2d4a.css: -------------------------------------------------------------------------------- 1 | .tv-text-input{color:#4a4a4a;margin:0;border:1px solid;border-color:#dadde0;display:inline-block;overflow:hidden;width:100px;height:26px;vertical-align:top;padding:0 5px}html.theme-dark .tv-text-input{border-color:#363c4e;color:#c5cbce}.tv-text-input:focus{border-color:#2196f3}html.theme-dark .tv-text-input:focus{border-color:#1976d2}.tv-text-input.inset{background:#fff}html.theme-dark .tv-text-input.inset{background:#131722}.tv-text-input.ticker{height:25px;width:60px}.tv-text-input.ticker--longer-sign_8{width:72px}.tv-text-input.ticker--evenlonger{width:90px} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/36.e9a6bec06ee11d2c2d4a.rtl.css: -------------------------------------------------------------------------------- 1 | .tv-text-input{color:#4a4a4a;margin:0;border:1px solid;border-color:#dadde0;display:inline-block;overflow:hidden;width:100px;height:26px;vertical-align:top;padding:0 5px;direction:ltr;text-align:right}html.theme-dark .tv-text-input{border-color:#363c4e;color:#c5cbce}.tv-text-input:focus{border-color:#2196f3}html.theme-dark .tv-text-input:focus{border-color:#1976d2}.tv-text-input.inset{background:#fff}html.theme-dark .tv-text-input.inset{background:#131722}.tv-text-input.ticker{height:25px;width:60px}.tv-text-input.ticker--longer-sign_8{width:72px}.tv-text-input.ticker--evenlonger{width:90px} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/37.065a5f2249aafcfe50ec.css: -------------------------------------------------------------------------------- 1 | .star-uhAI7sV4-{display:block;opacity:.7;box-sizing:border-box;transition:opacity .35s ease;padding:4px;margin:-4px}.star-uhAI7sV4- svg{display:block;fill:currentColor;pointer-events:none}.star-uhAI7sV4-.checked-2bhy04CF- svg{fill:#ffca3b}.star-uhAI7sV4-:active{opacity:1;transition-duration:60ms}@media (any-hover:hover),(min--moz-device-pixel-ratio:0),(min-width:0\0){.star-uhAI7sV4-:hover{opacity:1;transition-duration:60ms}} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/37.065a5f2249aafcfe50ec.rtl.css: -------------------------------------------------------------------------------- 1 | .star-uhAI7sV4-{display:block;opacity:.7;box-sizing:border-box;transition:opacity .35s ease;padding:4px;margin:-4px}.star-uhAI7sV4- svg{display:block;fill:currentColor;pointer-events:none}.star-uhAI7sV4-.checked-2bhy04CF- svg{fill:#ffca3b}.star-uhAI7sV4-:active{opacity:1;transition-duration:60ms}@media (any-hover:hover),(min--moz-device-pixel-ratio:0),(min-width:0\0){.star-uhAI7sV4-:hover{opacity:1;transition-duration:60ms}} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/37.1735365b01406a8d696d.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[37],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/38.9ae2eea9402c30aa3046.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[38],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/39.5f64b4bc2e263edfbf6e.css: -------------------------------------------------------------------------------- 1 | .tabs-1LGqoVz6-{display:flex;position:relative;width:100%}.tab-1Yr0rq0J-{flex:1 1;padding:13px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;border-bottom:1px solid;border-color:#e1ecf2;transition:color .35s ease;color:#131722}html.theme-dark .tab-1Yr0rq0J-{color:#b2b5be;border-color:#363c4e}.tab-1Yr0rq0J-.noBorder-oc3HwerO-{border-bottom:0}.tab-1Yr0rq0J-.disabled-s8cEYElA-{color:#eceff2}.tab-1Yr0rq0J-.active-37sipdzm-{color:#2196f3}html.theme-dark .tab-1Yr0rq0J-.active-37sipdzm-{color:#1976d2}.defaultCursor-Np9BHjTg-{cursor:default}.slider-1-X4lOmE-{position:absolute;bottom:0;left:0;height:3px;background-color:#2196f3;transition-timing-function:cubic-bezier(.215,.61,.355,1)}html.theme-dark .slider-1-X4lOmE-{background-color:#1976d2}.content-2asssfGq-{width:100%} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/39.5f64b4bc2e263edfbf6e.rtl.css: -------------------------------------------------------------------------------- 1 | .tabs-1LGqoVz6-{display:flex;position:relative;width:100%}.tab-1Yr0rq0J-{flex:1 1;padding:13px 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;border-bottom:1px solid;border-color:#e1ecf2;transition:color .35s ease;color:#131722}html.theme-dark .tab-1Yr0rq0J-{color:#b2b5be;border-color:#363c4e}.tab-1Yr0rq0J-.noBorder-oc3HwerO-{border-bottom:0}.tab-1Yr0rq0J-.disabled-s8cEYElA-{color:#eceff2}.tab-1Yr0rq0J-.active-37sipdzm-{color:#2196f3}html.theme-dark .tab-1Yr0rq0J-.active-37sipdzm-{color:#1976d2}.defaultCursor-Np9BHjTg-{cursor:default}.slider-1-X4lOmE-{position:absolute;bottom:0;left:0;height:3px;background-color:#2196f3;transition-timing-function:cubic-bezier(.215,.61,.355,1)}html.theme-dark .slider-1-X4lOmE-{background-color:#1976d2}.content-2asssfGq-{width:100%} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/39.7e524b82ef9947f0f19f.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[39],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/40.42bd9598272e9dd24457.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[40],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/41.11c024e8e0504741fd66.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[41],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/42.0491acaaf55887f7fcb3.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[42],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/43.4ae432f1b8259dbfd0e5.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[43],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/44.7aabc64d3dfb54c85d60.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[44],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/45.6c1fc3ac2f6063249f97.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[45],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/46.75a0e6fecbc3c92a6bc7.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[46],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/47.773635a99e184d6dc131.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[47],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/48.9d08141ee2d55bcad3e7.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[48],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/49.929acbc67c2613c57f58.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[49],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/50.2c50aad369bf63f77061.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[50],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/51.30c5804303a9f1c455e3.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[51],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/52.c212ca3684de16c6f115.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[52],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/53.7217742e39b70fc9d431.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[53],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/54.9eb4ca2a30197d95fe82.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[54],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/55.7707e6ae9f2ec8cfb656.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[55],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/55.c11884ad80d526214fb6.css: -------------------------------------------------------------------------------- 1 | .popupDialog-2VK9ttEi-{max-width:450px}.content-BtJ6qB4V- .row-3iYHykfo-{display:flex;padding-bottom:12px}.content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi-{font-size:13px}.content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi- .title-22tx3Djt-{color:#888989}html.theme-dark .content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi- .title-22tx3Djt-{color:#758696}.content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi- .value-2xvVEs1a-{font-weight:700;color:#4a4a4a}html.theme-dark .content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi- .value-2xvVEs1a-{color:#c5cbce}.content-BtJ6qB4V- .row-3iYHykfo- .columnTitle-3ypCTDKd-{text-align:left}.content-BtJ6qB4V- .row-3iYHykfo- .columnValue-Xr4j0qyI-{margin-left:auto;text-align:right} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/55.c11884ad80d526214fb6.rtl.css: -------------------------------------------------------------------------------- 1 | .popupDialog-2VK9ttEi-{max-width:450px}.content-BtJ6qB4V- .row-3iYHykfo-{display:flex;padding-bottom:12px}.content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi-{font-size:13px}.content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi- .title-22tx3Djt-{color:#888989}html.theme-dark .content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi- .title-22tx3Djt-{color:#758696}.content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi- .value-2xvVEs1a-{font-weight:700;color:#4a4a4a}html.theme-dark .content-BtJ6qB4V- .row-3iYHykfo- .column-2FlX4ngi- .value-2xvVEs1a-{color:#c5cbce}.content-BtJ6qB4V- .row-3iYHykfo- .columnTitle-3ypCTDKd-{text-align:right}.content-BtJ6qB4V- .row-3iYHykfo- .columnValue-Xr4j0qyI-{margin-right:auto;text-align:left} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/56.83cd8456e872f49059c3.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[56],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/57.6384b62456dc4fed6ffb.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[57],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/58.8077d6b199609737b3d5.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[58],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/6.35dee0cfeb8a4d70732c.css: -------------------------------------------------------------------------------- 1 | .tv-ticker{display:inline;position:absolute;width:13px;height:27px;margin:0 0 0 -13px}.tv-ticker__btn{width:7px;height:8px;padding:2px;border:1px solid;border-color:#dadde0;background:#fff;fill:#9db2bd}html.theme-dark .tv-ticker__btn{background:#131722;border-color:#363c4e}.tv-ticker__btn>svg{display:block;width:7px;height:8px}.tv-ticker__btn--up>svg{transform:scaleY(-1)}.tv-ticker__btn--down{border-top-width:0}@media (any-hover:hover),(min--moz-device-pixel-ratio:0),(min-width:0\0){.tv-ticker__btn:hover{background-color:#f2f2f2}}@media (any-hover:hover),(min--moz-device-pixel-ratio:0),(min-width:0\0){html.theme-dark .tv-ticker__btn:hover{background-color:#1c2030}}.tv-ticker__btn.i-active,.tv-ticker__btn:active{background-color:#ececec}html.theme-dark .tv-ticker__btn.i-active,html.theme-dark .tv-ticker__btn:active{background-color:#262b3e}input:focus+.tv-ticker .tv-ticker__btn{border-color:#2196f3;fill:#2196f3}html.theme-dark input:focus+.tv-ticker .tv-ticker__btn{fill:#1976d2;border-color:#1976d2}input:disabled+.tv-ticker{display:none} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/6.35dee0cfeb8a4d70732c.rtl.css: -------------------------------------------------------------------------------- 1 | .tv-ticker{display:inline;position:absolute;width:13px;height:27px;margin:0 -13px 0 0}.tv-ticker__btn{width:7px;height:8px;padding:2px;border:1px solid;border-color:#dadde0;background:#fff;fill:#9db2bd}html.theme-dark .tv-ticker__btn{background:#131722;border-color:#363c4e}.tv-ticker__btn>svg{display:block;width:7px;height:8px}.tv-ticker__btn--up>svg{transform:scaleY(-1)}.tv-ticker__btn--down{border-top-width:0}@media (any-hover:hover),(min--moz-device-pixel-ratio:0),(min-width:0\0){.tv-ticker__btn:hover{background-color:#f2f2f2}}@media (any-hover:hover),(min--moz-device-pixel-ratio:0),(min-width:0\0){html.theme-dark .tv-ticker__btn:hover{background-color:#1c2030}}.tv-ticker__btn.i-active,.tv-ticker__btn:active{background-color:#ececec}html.theme-dark .tv-ticker__btn.i-active,html.theme-dark .tv-ticker__btn:active{background-color:#262b3e}input:focus+.tv-ticker .tv-ticker__btn{border-color:#2196f3;fill:#2196f3}html.theme-dark input:focus+.tv-ticker .tv-ticker__btn{fill:#1976d2;border-color:#1976d2}input:disabled+.tv-ticker{display:none} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/6.902d5f3923d45b49b876.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[6],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/7.fc0941206f7b7d32812d.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[7],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/8.180c6bdc716e5045b645.css: -------------------------------------------------------------------------------- 1 | .menuWrap-1gEtmoET-{text-align:left;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:border-box;z-index:100;border-radius:3px;background-color:#fff;box-shadow:0 2px 4px 0 rgba(107,121,136,.4)}html.theme-dark .menuWrap-1gEtmoET-{background-color:#1e222d;box-shadow:0 2px 4px 0 #000}.menuWrap-1gEtmoET-.isMeasuring-FZ0EJCM2-{position:fixed;visibility:hidden;opacity:0;pointer-events:none}.scrollWrap-1B5MfTJt-{height:100%;overflow-x:hidden;overflow-y:auto;-ms-overflow-style:scrollbar}.scrollWrap-1B5MfTJt-.momentumBased-1Jq4gQt2-{-webkit-overflow-scrolling:touch}.scrollWrap-1B5MfTJt-::-webkit-scrollbar{width:5px;height:5px}.scrollWrap-1B5MfTJt-::-webkit-scrollbar-thumb{border:1px solid;border-color:#f1f3f6;border-radius:3px;background-color:#9db2bd}html.theme-dark .scrollWrap-1B5MfTJt-::-webkit-scrollbar-thumb{background-color:#363c4e;border-color:#1c2030}.scrollWrap-1B5MfTJt-::-webkit-scrollbar-track{background-color:transparent;border-radius:3px}.menuBox-20sJGjtG-{padding:6px 0}.isHidden-2vLQpR1t-{display:none} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/8.180c6bdc716e5045b645.rtl.css: -------------------------------------------------------------------------------- 1 | .menuWrap-1gEtmoET-{text-align:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:border-box;z-index:100;border-radius:3px;background-color:#fff;box-shadow:0 2px 4px 0 rgba(107,121,136,.4)}html.theme-dark .menuWrap-1gEtmoET-{background-color:#1e222d;box-shadow:0 2px 4px 0 #000}.menuWrap-1gEtmoET-.isMeasuring-FZ0EJCM2-{position:fixed;visibility:hidden;opacity:0;pointer-events:none}.scrollWrap-1B5MfTJt-{height:100%;overflow-x:hidden;overflow-y:auto;-ms-overflow-style:scrollbar}.scrollWrap-1B5MfTJt-.momentumBased-1Jq4gQt2-{-webkit-overflow-scrolling:touch}.scrollWrap-1B5MfTJt-::-webkit-scrollbar{width:5px;height:5px}.scrollWrap-1B5MfTJt-::-webkit-scrollbar-thumb{border:1px solid;border-color:#f1f3f6;border-radius:3px;background-color:#9db2bd}html.theme-dark .scrollWrap-1B5MfTJt-::-webkit-scrollbar-thumb{background-color:#363c4e;border-color:#1c2030}.scrollWrap-1B5MfTJt-::-webkit-scrollbar-track{background-color:transparent;border-radius:3px}.menuBox-20sJGjtG-{padding:6px 0}.isHidden-2vLQpR1t-{display:none} -------------------------------------------------------------------------------- /public/charting_library/static/bundles/8.62bd4ee21281906a7019.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[8],[]]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/confirm-symbol-input-dialog.c72289c830292c73812f.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([["confirm-symbol-input-dialog"],{kzGG:function(n,o,t){"use strict";function e(n,o,t){var e,i,p,a=$('');a.css({float:"none","box-sizing":"border-box",width:"100%"}),e=null,i=Object(c.createDialog)({title:o||window.t("Add Symbol"),width:400,actions:[{name:"apply",text:window.t("Apply"),type:"primary"}],content:a,isClickOutFn:function(n){if(e&&(n.target===e[0]||e[0].contains(n.target)))return!1}}),p=Object(l.symbolSearchUIService)().bindToInput(a,{callback:function(o){n(o),i.close()},onPopupOpen:function(n){n.css("z-index",i.zIndex),e=n},onPopupClose:function(){e=null}}),i.on("action:apply",function(){p.then(function(n){n.acceptTypeIn()})}),t&&i.on("beforeClose",function(){t()}),i.open()}var i,c,l;t.r(o),t.d(o,"showConfirmSymbolInputDialog",function(){return e}),i=t("P5fv"),t("YFKU"),c=t("YDhE"),l=t("pZll")}}]); -------------------------------------------------------------------------------- /public/charting_library/static/bundles/crosshair.6c091f7d5427d0c5e6d9dc3a90eb2b20.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/bundles/crosshair.6c091f7d5427d0c5e6d9dc3a90eb2b20.cur -------------------------------------------------------------------------------- /public/charting_library/static/bundles/dot.ed68e83c16f77203e73dbc4c3a7c7fa1.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/bundles/dot.ed68e83c16f77203e73dbc4c3a7c7fa1.cur -------------------------------------------------------------------------------- /public/charting_library/static/bundles/eraser.0579d40b812fa2c3ffe72e5803a6e14c.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/bundles/eraser.0579d40b812fa2c3ffe72e5803a6e14c.cur -------------------------------------------------------------------------------- /public/charting_library/static/bundles/fontawesome-webfont.3293616ec0c605c7c2db25829a0a509e.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/bundles/fontawesome-webfont.3293616ec0c605c7c2db25829a0a509e.woff -------------------------------------------------------------------------------- /public/charting_library/static/bundles/fontawesome-webfont.40f9a03d174178efb12303caa9bc7cd8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/bundles/fontawesome-webfont.40f9a03d174178efb12303caa9bc7cd8.woff2 -------------------------------------------------------------------------------- /public/charting_library/static/bundles/grab.bc156522a6b55a60be9fae15c14b66c5.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/bundles/grab.bc156522a6b55a60be9fae15c14b66c5.cur -------------------------------------------------------------------------------- /public/charting_library/static/bundles/grabbing.1c0862a8a8c0fb02885557bc97fdafe7.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/bundles/grabbing.1c0862a8a8c0fb02885557bc97fdafe7.cur -------------------------------------------------------------------------------- /public/charting_library/static/bundles/opacity-pattern.a6506134daec7169f68f563f084a9d41.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/charting_library/static/bundles/precache-manifest.60144109bbe17651b1eb050c29e4f6f4.js: -------------------------------------------------------------------------------- 1 | self.__precacheManifest = [ 2 | ]; -------------------------------------------------------------------------------- /public/charting_library/static/bundles/service-worker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Welcome to your Workbox-powered service worker! 3 | * 4 | * You'll need to register this file in your web app and you should 5 | * disable HTTP caching for this file too. 6 | * See https://goo.gl/nhQhGp 7 | * 8 | * The rest of the code is auto-generated. Please don't update this file 9 | * directly; instead, make changes to your Workbox build configuration 10 | * and re-run your build process. 11 | * See https://goo.gl/2aRDsh 12 | */ 13 | 14 | importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js"); 15 | 16 | importScripts( 17 | "bundles/precache-manifest.60144109bbe17651b1eb050c29e4f6f4.js" 18 | ); 19 | 20 | /** 21 | * The workboxSW.precacheAndRoute() method efficiently caches and responds to 22 | * requests for URLs in the manifest. 23 | * See https://goo.gl/S9QRab 24 | */ 25 | self.__precacheManifest = [].concat(self.__precacheManifest || []); 26 | workbox.precaching.suppressWarnings(); 27 | workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); 28 | 29 | workbox.routing.registerRoute(/chart\/.*/, workbox.strategies.networkFirst({ "cacheName":"network-first", plugins: [] }), 'GET'); 30 | -------------------------------------------------------------------------------- /public/charting_library/static/bundles/zoom.e21f24dd632c7069139bc47ae89c54b5.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/bundles/zoom.e21f24dd632c7069139bc47ae89c54b5.cur -------------------------------------------------------------------------------- /public/charting_library/static/images/balloon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/balloon.png -------------------------------------------------------------------------------- /public/charting_library/static/images/bar-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/bar-loader.gif -------------------------------------------------------------------------------- /public/charting_library/static/images/button-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/button-bg.png -------------------------------------------------------------------------------- /public/charting_library/static/images/charting_library/logo-widget-copyright-faded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/charting_library/logo-widget-copyright-faded.png -------------------------------------------------------------------------------- /public/charting_library/static/images/charting_library/logo-widget-copyright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/charting_library/logo-widget-copyright.png -------------------------------------------------------------------------------- /public/charting_library/static/images/controlll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/controlll.png -------------------------------------------------------------------------------- /public/charting_library/static/images/delayed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/delayed.png -------------------------------------------------------------------------------- /public/charting_library/static/images/dialogs/checkbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/dialogs/checkbox.png -------------------------------------------------------------------------------- /public/charting_library/static/images/dialogs/close-flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/dialogs/close-flat.png -------------------------------------------------------------------------------- /public/charting_library/static/images/dialogs/large-slider-handle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/dialogs/large-slider-handle.png -------------------------------------------------------------------------------- /public/charting_library/static/images/dialogs/linewidth-slider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/dialogs/linewidth-slider.png -------------------------------------------------------------------------------- /public/charting_library/static/images/dialogs/opacity-slider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/dialogs/opacity-slider.png -------------------------------------------------------------------------------- /public/charting_library/static/images/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/icons.png -------------------------------------------------------------------------------- /public/charting_library/static/images/prediction-clock-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/prediction-clock-black.png -------------------------------------------------------------------------------- /public/charting_library/static/images/prediction-clock-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/prediction-clock-white.png -------------------------------------------------------------------------------- /public/charting_library/static/images/prediction-failure-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/prediction-failure-white.png -------------------------------------------------------------------------------- /public/charting_library/static/images/prediction-success-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/prediction-success-white.png -------------------------------------------------------------------------------- /public/charting_library/static/images/price_label.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/price_label.png -------------------------------------------------------------------------------- /public/charting_library/static/images/select-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/select-bg.png -------------------------------------------------------------------------------- /public/charting_library/static/images/svg/chart/bucket2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/charting_library/static/images/svg/chart/font.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/charting_library/static/images/svg/chart/large-slider-handle.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/charting_library/static/images/svg/chart/pencil2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/charting_library/static/images/svg/question-mark-rounded.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/charting_library/static/images/tvcolorpicker-bg-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/tvcolorpicker-bg-gradient.png -------------------------------------------------------------------------------- /public/charting_library/static/images/tvcolorpicker-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/tvcolorpicker-bg.png -------------------------------------------------------------------------------- /public/charting_library/static/images/tvcolorpicker-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/tvcolorpicker-check.png -------------------------------------------------------------------------------- /public/charting_library/static/images/tvcolorpicker-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/charting_library/static/images/tvcolorpicker-sprite.png -------------------------------------------------------------------------------- /public/datafeeds/README.md: -------------------------------------------------------------------------------- 1 | # Charting Library Datafeeds 2 | 3 | This folder contains implementation of Charting Library Datafeeds. 4 | -------------------------------------------------------------------------------- /public/datafeeds/udf/.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /public/datafeeds/udf/lib/helpers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * If you want to enable logs from datafeed set it to `true` 3 | */ 4 | var isLoggingEnabled = false; 5 | export function logMessage(message) { 6 | if (isLoggingEnabled) { 7 | var now = new Date(); 8 | // tslint:disable-next-line:no-console 9 | console.log(now.toLocaleTimeString() + "." + now.getMilliseconds() + "> " + message); 10 | } 11 | } 12 | export function getErrorMessage(error) { 13 | if (error === undefined) { 14 | return ''; 15 | } 16 | else if (typeof error === 'string') { 17 | return error; 18 | } 19 | return error.message; 20 | } 21 | -------------------------------------------------------------------------------- /public/datafeeds/udf/lib/iquotes-provider.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/datafeeds/udf/lib/iquotes-provider.js -------------------------------------------------------------------------------- /public/datafeeds/udf/lib/quotes-provider.js: -------------------------------------------------------------------------------- 1 | import { getErrorMessage, logMessage, } from './helpers'; 2 | var QuotesProvider = /** @class */ (function () { 3 | function QuotesProvider(datafeedUrl, requester) { 4 | this._datafeedUrl = datafeedUrl; 5 | this._requester = requester; 6 | } 7 | QuotesProvider.prototype.getQuotes = function (symbols) { 8 | var _this = this; 9 | return new Promise(function (resolve, reject) { 10 | _this._requester.sendRequest(_this._datafeedUrl, 'quotes', { symbols: symbols }) 11 | .then(function (response) { 12 | if (response.s === 'ok') { 13 | resolve(response.d); 14 | } 15 | else { 16 | reject(response.errmsg); 17 | } 18 | }) 19 | .catch(function (error) { 20 | var errorMessage = getErrorMessage(error); 21 | logMessage("QuotesProvider: getQuotes failed, error=" + errorMessage); 22 | reject("network error: " + errorMessage); 23 | }); 24 | }); 25 | }; 26 | return QuotesProvider; 27 | }()); 28 | export { QuotesProvider }; 29 | -------------------------------------------------------------------------------- /public/datafeeds/udf/lib/udf-compatible-datafeed.js: -------------------------------------------------------------------------------- 1 | import * as tslib_1 from "tslib"; 2 | import { UDFCompatibleDatafeedBase } from './udf-compatible-datafeed-base'; 3 | import { QuotesProvider } from './quotes-provider'; 4 | import { Requester } from './requester'; 5 | var UDFCompatibleDatafeed = /** @class */ (function (_super) { 6 | tslib_1.__extends(UDFCompatibleDatafeed, _super); 7 | function UDFCompatibleDatafeed(datafeedURL, updateFrequency) { 8 | if (updateFrequency === void 0) { updateFrequency = 10 * 1000; } 9 | var _this = this; 10 | var requester = new Requester(); 11 | var quotesProvider = new QuotesProvider(datafeedURL, requester); 12 | _this = _super.call(this, datafeedURL, quotesProvider, requester, updateFrequency) || this; 13 | return _this; 14 | } 15 | return UDFCompatibleDatafeed; 16 | }(UDFCompatibleDatafeedBase)); 17 | export { UDFCompatibleDatafeed }; 18 | -------------------------------------------------------------------------------- /public/datafeeds/udf/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "dependencies": { 4 | "promise-polyfill": "6.0.2", 5 | "tslib": "1.7.1", 6 | "whatwg-fetch": "2.0.3" 7 | }, 8 | "devDependencies": { 9 | "rollup": "0.49.2", 10 | "rollup-plugin-buble": "0.15.0", 11 | "rollup-plugin-node-resolve": "3.0.0", 12 | "rollup-plugin-uglify": "2.0.1", 13 | "typescript": "3.3.1" 14 | }, 15 | "scripts": { 16 | "compile": "tsc", 17 | "bundle-js": "rollup -c rollup.config.js", 18 | "build": "npm run compile && npm run bundle-js" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /public/datafeeds/udf/rollup.config.js: -------------------------------------------------------------------------------- 1 | /* globals process */ 2 | 3 | var buble = require('rollup-plugin-buble'); 4 | var uglify = require('rollup-plugin-uglify'); 5 | var nodeResolve = require('rollup-plugin-node-resolve'); 6 | 7 | var environment = process.env.ENV || 'development'; 8 | var isDevelopmentEnv = (environment === 'development'); 9 | 10 | module.exports = [ 11 | { 12 | input: 'lib/udf-compatible-datafeed.js', 13 | name: 'Datafeeds', 14 | sourceMap: false, 15 | output: { 16 | format: 'umd', 17 | file: 'dist/bundle.js', 18 | }, 19 | plugins: [ 20 | nodeResolve({ jsnext: true, main: true }), 21 | buble(), 22 | !isDevelopmentEnv && uglify({ output: { inline_script: true } }), 23 | ], 24 | }, 25 | { 26 | input: 'src/polyfills.es6', 27 | sourceMap: false, 28 | context: 'window', 29 | output: { 30 | format: 'iife', 31 | file: 'dist/polyfills.js', 32 | }, 33 | plugins: [ 34 | nodeResolve({ jsnext: true, main: true }), 35 | buble(), 36 | uglify({ output: { inline_script: true } }), 37 | ], 38 | }, 39 | ]; 40 | -------------------------------------------------------------------------------- /public/datafeeds/udf/src/helpers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * If you want to enable logs from datafeed set it to `true` 3 | */ 4 | var isLoggingEnabled = false; 5 | export function logMessage(message) { 6 | if (isLoggingEnabled) { 7 | var now = new Date(); 8 | // tslint:disable-next-line:no-console 9 | console.log(now.toLocaleTimeString() + "." + now.getMilliseconds() + "> " + message); 10 | } 11 | } 12 | export function getErrorMessage(error) { 13 | if (error === undefined) { 14 | return ''; 15 | } 16 | else if (typeof error === 'string') { 17 | return error; 18 | } 19 | return error.message; 20 | } 21 | -------------------------------------------------------------------------------- /public/datafeeds/udf/src/helpers.ts: -------------------------------------------------------------------------------- 1 | export interface RequestParams { 2 | [paramName: string]: string | string[] | number; 3 | } 4 | 5 | export interface UdfResponse { 6 | s: string; 7 | } 8 | 9 | export interface UdfOkResponse extends UdfResponse { 10 | s: 'ok'; 11 | } 12 | 13 | export interface UdfErrorResponse { 14 | s: 'error'; 15 | errmsg: string; 16 | } 17 | 18 | /** 19 | * If you want to enable logs from datafeed set it to `true` 20 | */ 21 | const isLoggingEnabled = false; 22 | export function logMessage(message: string): void { 23 | if (isLoggingEnabled) { 24 | const now = new Date(); 25 | // tslint:disable-next-line:no-console 26 | console.log(`${now.toLocaleTimeString()}.${now.getMilliseconds()}> ${message}`); 27 | } 28 | } 29 | 30 | export function getErrorMessage(error: string | Error | undefined): string { 31 | if (error === undefined) { 32 | return ''; 33 | } else if (typeof error === 'string') { 34 | return error; 35 | } 36 | 37 | return error.message; 38 | } 39 | -------------------------------------------------------------------------------- /public/datafeeds/udf/src/iquotes-provider.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/public/datafeeds/udf/src/iquotes-provider.js -------------------------------------------------------------------------------- /public/datafeeds/udf/src/iquotes-provider.ts: -------------------------------------------------------------------------------- 1 | import { QuoteData } from '../../../charting_library/datafeed-api'; 2 | 3 | import { 4 | UdfOkResponse, 5 | } from './helpers'; 6 | 7 | export interface UdfQuotesResponse extends UdfOkResponse { 8 | d: QuoteData[]; 9 | } 10 | 11 | export interface IQuotesProvider { 12 | // tslint:disable-next-line:variable-name tv-variable-name 13 | getQuotes(symbols: string[]): Promise; 14 | } 15 | -------------------------------------------------------------------------------- /public/datafeeds/udf/src/polyfills.es6: -------------------------------------------------------------------------------- 1 | import 'promise-polyfill'; 2 | import 'whatwg-fetch'; 3 | -------------------------------------------------------------------------------- /public/datafeeds/udf/src/quotes-provider.js: -------------------------------------------------------------------------------- 1 | import { getErrorMessage, logMessage, } from './helpers'; 2 | var QuotesProvider = /** @class */ (function () { 3 | function QuotesProvider(datafeedUrl, requester) { 4 | this._datafeedUrl = datafeedUrl; 5 | this._requester = requester; 6 | } 7 | QuotesProvider.prototype.getQuotes = function (symbols) { 8 | var _this = this; 9 | return new Promise(function (resolve, reject) { 10 | _this._requester.sendRequest(_this._datafeedUrl, 'quotes', { symbols: symbols }) 11 | .then(function (response) { 12 | if (response.s === 'ok') { 13 | resolve(response.d); 14 | } 15 | else { 16 | reject(response.errmsg); 17 | } 18 | }) 19 | .catch(function (error) { 20 | var errorMessage = getErrorMessage(error); 21 | logMessage("QuotesProvider: getQuotes failed, error=" + errorMessage); 22 | reject("network error: " + errorMessage); 23 | }); 24 | }); 25 | }; 26 | return QuotesProvider; 27 | }()); 28 | export { QuotesProvider }; 29 | -------------------------------------------------------------------------------- /public/datafeeds/udf/src/udf-compatible-datafeed.js: -------------------------------------------------------------------------------- 1 | import * as tslib_1 from "tslib"; 2 | import { UDFCompatibleDatafeedBase } from './udf-compatible-datafeed-base'; 3 | import { QuotesProvider } from './quotes-provider'; 4 | import { Requester } from './requester'; 5 | var UDFCompatibleDatafeed = /** @class */ (function (_super) { 6 | tslib_1.__extends(UDFCompatibleDatafeed, _super); 7 | function UDFCompatibleDatafeed(datafeedURL, updateFrequency) { 8 | if (updateFrequency === void 0) { updateFrequency = 10 * 1000; } 9 | var _this = this; 10 | var requester = new Requester(); 11 | var quotesProvider = new QuotesProvider(datafeedURL, requester); 12 | _this = _super.call(this, datafeedURL, quotesProvider, requester, updateFrequency) || this; 13 | return _this; 14 | } 15 | return UDFCompatibleDatafeed; 16 | }(UDFCompatibleDatafeedBase)); 17 | export { UDFCompatibleDatafeed }; 18 | -------------------------------------------------------------------------------- /public/datafeeds/udf/src/udf-compatible-datafeed.ts: -------------------------------------------------------------------------------- 1 | import { UDFCompatibleDatafeedBase } from './udf-compatible-datafeed-base'; 2 | import { QuotesProvider } from './quotes-provider'; 3 | import { Requester } from './requester'; 4 | 5 | export class UDFCompatibleDatafeed extends UDFCompatibleDatafeedBase { 6 | public constructor(datafeedURL: string, updateFrequency: number = 10 * 1000) { 7 | const requester = new Requester(); 8 | const quotesProvider = new QuotesProvider(datafeedURL, requester); 9 | super(datafeedURL, quotesProvider, requester, updateFrequency); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /public/datafeeds/udf/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./src", 4 | "importHelpers": true, 5 | "lib": [ 6 | "dom", 7 | "es2015.promise", 8 | "es2015.symbol.wellknown", 9 | "es5" 10 | ], 11 | "module": "es6", 12 | "moduleResolution": "node", 13 | "noEmitOnError": true, 14 | "noFallthroughCasesInSwitch": true, 15 | "noImplicitReturns": true, 16 | "noUnusedLocals": true, 17 | "outDir": "./lib/", 18 | "sourceMap": false, 19 | "strict": true, 20 | "target": "es5" 21 | }, 22 | "include": [ 23 | "./src/**/*.ts" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /src/Hooks/useInterval.js: -------------------------------------------------------------------------------- 1 | import {useEffect, useRef} from "react"; 2 | 3 | const useInterval = (callback, delay) => { 4 | const savedCallback = useRef(); 5 | useEffect(() => { 6 | savedCallback.current = callback; 7 | }, [callback]); 8 | useEffect(() => { 9 | function tick() { 10 | savedCallback.current(); 11 | } 12 | if (delay !== null) { 13 | let id = setInterval(tick, delay); 14 | return () => clearInterval(id); 15 | } 16 | }, [delay]); 17 | } 18 | export default useInterval; -------------------------------------------------------------------------------- /src/Hooks/useQuery.js: -------------------------------------------------------------------------------- 1 | import {useLocation} from "react-router-dom"; 2 | 3 | const useQuery = () => { 4 | return new URLSearchParams(useLocation().search); 5 | } 6 | 7 | export default useQuery; -------------------------------------------------------------------------------- /src/assets/fontIcon/opex-icon/font/opex-icon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fontIcon/opex-icon/font/opex-icon.eot -------------------------------------------------------------------------------- /src/assets/fontIcon/opex-icon/font/opex-icon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fontIcon/opex-icon/font/opex-icon.ttf -------------------------------------------------------------------------------- /src/assets/fontIcon/opex-icon/font/opex-icon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fontIcon/opex-icon/font/opex-icon.woff -------------------------------------------------------------------------------- /src/assets/fontIcon/opex-icon/font/opex-icon.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fontIcon/opex-icon/font/opex-icon.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebblackfanum.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebblackfanum.eot -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebboldfanum.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebboldfanum.eot -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebextrablackfanum.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebextrablackfanum.eot -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebextraboldfanum.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebextraboldfanum.eot -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanweblightfanum.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanweblightfanum.eot -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebmediumfanum.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebmediumfanum.eot -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebregularfanum.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebregularfanum.eot -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebthinfanum.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/eot/iranyekanwebthinfanum.eot -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebblackfanum.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebblackfanum.ttf -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebboldfanum.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebboldfanum.ttf -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebextrablackfanum.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebextrablackfanum.ttf -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebextraboldfanum.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebextraboldfanum.ttf -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanweblightfanum.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanweblightfanum.ttf -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebmediumfanum.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebmediumfanum.ttf -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebregularfanum.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebregularfanum.ttf -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebthinfanum.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/ttf/iranyekanwebthinfanum.ttf -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebblackfanum.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebblackfanum.woff -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebboldfanum.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebboldfanum.woff -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebextrablackfanum.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebextrablackfanum.woff -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebextraboldfanum.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebextraboldfanum.woff -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanweblightfanum.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanweblightfanum.woff -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebmediumfanum.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebmediumfanum.woff -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebregularfanum.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebregularfanum.woff -------------------------------------------------------------------------------- /src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebthinfanum.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/fonts/IRANYekan/Farsi_numerals/woff/iranyekanwebthinfanum.woff -------------------------------------------------------------------------------- /src/assets/images/src/OpexMockupMac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/OpexMockupMac.png -------------------------------------------------------------------------------- /src/assets/images/src/OpexPanelMockupDark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/OpexPanelMockupDark.png -------------------------------------------------------------------------------- /src/assets/images/src/OpexPanelMockupLight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/OpexPanelMockupLight.png -------------------------------------------------------------------------------- /src/assets/images/src/approveAnimation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/approveAnimation.gif -------------------------------------------------------------------------------- /src/assets/images/src/binance.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 13 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/assets/images/src/binanceUSD.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/assets/images/src/bitcoin.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/images/src/chart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/images/src/dogecoin.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/images/src/ethereumLight.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/images/src/linearLoading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/linearLoading.gif -------------------------------------------------------------------------------- /src/assets/images/src/linearLoadingBgOrange.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/linearLoadingBgOrange.gif -------------------------------------------------------------------------------- /src/assets/images/src/opexCoin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/assets/images/src/rejectAnimation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/rejectAnimation.gif -------------------------------------------------------------------------------- /src/assets/images/src/security.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/images/src/signIn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 11 | 15 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/assets/images/src/signOut.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/images/src/spaceStar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/spaceStar.png -------------------------------------------------------------------------------- /src/assets/images/src/squareLoading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/squareLoading.gif -------------------------------------------------------------------------------- /src/assets/images/src/squareLoadingLight.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/assets/images/src/squareLoadingLight.gif -------------------------------------------------------------------------------- /src/assets/images/src/testBinance.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 13 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/assets/images/src/testEthereumLight.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/assets/images/src/testTether.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 11 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/assets/images/src/testbinanceUSD.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/assets/images/src/toman.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/images/src/toncoin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/components/AdvanceTradingView/AdvanceTradingView.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/components/AdvanceTradingView/AdvanceTradingView.css -------------------------------------------------------------------------------- /src/components/Button/Button.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const Button = ({buttonTitle,buttonClass,buttonStyle,innerRef, ...rest}) => { 4 | return ( 5 | 13 | ); 14 | }; 15 | 16 | export default Button; 17 | -------------------------------------------------------------------------------- /src/components/Date/Date.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import moment from "moment-jalaali"; 3 | import {useSelector} from "react-redux"; 4 | 5 | const Date = ({date}) => { 6 | const type = useSelector((state) => state.exchange.dateType) 7 | const calendar = () => { 8 | 9 | switch (type) { 10 | case "Jalali": 11 | return moment(date).format("jYY/jMM/jDD"); 12 | case "Hijri": 13 | return moment(date).format("YY/MM/DD"); 14 | case "Georgian": 15 | return moment(date).format("iYY/iMM/iDD"); 16 | default: 17 | return moment(date).format("YY/MM/DD"); 18 | } 19 | }; 20 | 21 | return (<>{calendar()}); 22 | }; 23 | 24 | export default Date; 25 | -------------------------------------------------------------------------------- /src/components/Error/Error.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {useTranslation} from "react-i18next"; 3 | import Button from "../Button/Button"; 4 | 5 | const Error = ({errorMsg, retryFunc}) => { 6 | const {t} = useTranslation(); 7 | return ( 8 |
9 | {errorMsg ?? t('error')} 10 | { 11 | retryFunc ?
22 | ); 23 | }; 24 | 25 | export default Error; -------------------------------------------------------------------------------- /src/components/FullWidthLoading/FullWidthLoading.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import classes from './FullWidthError.module.css' 3 | 4 | const FullWidthLoading = () => { 5 | return ( 6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | ); 15 | }; 16 | 17 | export default FullWidthLoading; 18 | 19 | -------------------------------------------------------------------------------- /src/components/HeaderBuilder/HeaderBuilder.module.css: -------------------------------------------------------------------------------- 1 | .container{ 2 | height: 12vh; 3 | background-color: var(--menu); 4 | } 5 | .content { 6 | width: 95%; 7 | height: 100%; 8 | } 9 | 10 | .signOut { 11 | width: 5%; 12 | height: 100%; 13 | } -------------------------------------------------------------------------------- /src/components/Icon/Icon.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const Icon = (props) => { 4 | return ( 5 | 6 | 7 | 8 | ); 9 | }; 10 | 11 | export default Icon; 12 | -------------------------------------------------------------------------------- /src/components/Info/Info.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {useTranslation} from "react-i18next"; 3 | import Icon from "../Icon/Icon"; 4 | import {useDispatch, useSelector} from "react-redux"; 5 | import {setInfoMessage} from "../../store/actions"; 6 | 7 | const Info = () => { 8 | const {t} = useTranslation(); 9 | const dispatch = useDispatch(); 10 | //const type = useSelector((state) => state.global.info.type) 11 | const message = useSelector((state) => state.global.info.message) 12 | 13 | if (!message) return <> 14 | 15 | return ( 16 |
17 | {t(message)} 18 | dispatch(setInfoMessage(null, null))} 22 | /> 23 |
24 | ); 25 | }; 26 | 27 | export default Info; -------------------------------------------------------------------------------- /src/components/Layout/Layout.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import classes from './Layout.module.css' 3 | import LayoutHeader from "./LayoutHeader/LayoutHeader"; 4 | import {Outlet} from "react-router-dom"; 5 | import Footer from "../../main/Browser/Pages/UserPanel/Sections/Footer/Footer"; 6 | import ScrollBar from "../ScrollBar"; 7 | 8 | const Layout = () => { 9 | return ( 10 |
11 | 12 |
13 | 14 | 15 |
16 | 17 |
18 |
19 | ); 20 | }; 21 | 22 | export default Layout; 23 | -------------------------------------------------------------------------------- /src/components/Layout/Layout.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | /*height: 100%;*/ 3 | top: 0; 4 | bottom: 0; 5 | background-color: var(--mainContent); 6 | position: absolute; 7 | } 8 | .content { 9 | height: 88%; 10 | } -------------------------------------------------------------------------------- /src/components/Layout/LayoutHeader/LayoutHeader.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 12%; 3 | background-color: var(--menu); 4 | } 5 | .content { 6 | } 7 | 8 | .thisButton { 9 | background-color: var(--menu); 10 | color: var(--textColor); 11 | } 12 | 13 | .name { 14 | display: -webkit-box; 15 | -webkit-line-clamp: 1; 16 | -webkit-box-orient: vertical; 17 | overflow: hidden; 18 | } 19 | 20 | .icon { 21 | font-size: 2.5rem !important; 22 | } 23 | 24 | .dropBox { 25 | border-bottom: 0.5px solid var(--orange); 26 | } 27 | 28 | .title { 29 | line-height: 2em; 30 | } -------------------------------------------------------------------------------- /src/components/Loading/Loading.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {useTranslation} from "react-i18next"; 3 | import {images} from "../../assets/images"; 4 | import {useSelector} from "react-redux"; 5 | import {isMobile} from 'react-device-detect'; 6 | 7 | const Loading = () => { 8 | const theme = useSelector((state) => state.global.theme) 9 | const {t} = useTranslation(); 10 | return ( 11 |
12 | loading... 13 | {t('loading')} 14 |
15 | ); 16 | }; 17 | export default Loading; -------------------------------------------------------------------------------- /src/components/NullMarketStats/NullMarketStats.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {Trans, useTranslation} from "react-i18next"; 3 | 4 | const NullMarketStats = ({interval}) => { 5 | 6 | const {t} = useTranslation(); 7 | 8 | return ( 9 | 10 | 16 | 17 | ); 18 | }; 19 | 20 | export default NullMarketStats; 21 | -------------------------------------------------------------------------------- /src/components/Popup/Popup.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | position: absolute; 3 | top: 11vh; 4 | width: 30%; 5 | height: 50vh; 6 | background-color: var(--popupAlpha); 7 | z-index: 3; 8 | box-shadow: -1px 5px 8px -2px #101010ad; 9 | right: 47.5%; 10 | border-radius: 9px; 11 | } 12 | 13 | :global(.ltr) .container { 14 | left: 47.5%; 15 | right: initial; 16 | } 17 | 18 | .header { 19 | height: 12%; 20 | } 21 | 22 | .content { 23 | height: 76%; 24 | } 25 | 26 | .footer { 27 | height: 12%; 28 | 29 | } 30 | 31 | .thisButton { 32 | width: 30%; 33 | } 34 | 35 | .walletButton { 36 | background-color: var(--orange); 37 | } 38 | 39 | .closeButton { 40 | background-color: var(--darkRed); 41 | width: 20%; 42 | } 43 | 44 | .thisInput { 45 | width: 100%; 46 | } 47 | 48 | .thisInput :global(.after) { 49 | width: 10%; 50 | cursor: pointer; 51 | } 52 | 53 | .thisInput :global(input) { 54 | width: 90% !important; 55 | cursor: not-allowed; 56 | font-family: 'Roboto', sans-serif; 57 | } 58 | 59 | .thisInput :global(.lead) { 60 | width: 30%; 61 | } 62 | .thisInput :global(.selectExternalClass) { 63 | width: 70% !important; 64 | } 65 | -------------------------------------------------------------------------------- /src/components/ProtectedRoute/ProtectedRoute.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {Login} from "../../main/Browser/Routes/routes"; 3 | import {Navigate, Outlet, useLocation} from "react-router-dom"; 4 | import {useSelector} from "react-redux"; 5 | 6 | const ProtectedRoute = () => { 7 | let location = useLocation(); 8 | const isLogin = useSelector((state) => state.auth.isLogin) 9 | 10 | if (!isLogin) return 11 | 12 | return ; 13 | }; 14 | export default ProtectedRoute; 15 | -------------------------------------------------------------------------------- /src/components/ScrollBar/index.js: -------------------------------------------------------------------------------- 1 | import React, {useEffect, useRef} from "react"; 2 | import {Scrollbars} from "rc-scrollbars"; 3 | import {useLocation} from "react-router-dom"; 4 | 5 | const ScrollBar = ({customClass, ...props}) => { 6 | 7 | const location = useLocation(); 8 | const scrollRef = useRef(null); 9 | 10 | useEffect(() => { 11 | scrollRef.current.scrollTop() 12 | }, [location.pathname]); 13 | 14 | const style = props.style ? props.style : {width: "100%", height: "100%"}; 15 | return ( 16 | ( 21 |
22 | )} 23 | renderThumbVertical={(props) => ( 24 |
25 | )} 26 | renderView={(props) =>
} 27 | ref={scrollRef} 28 | style={style}> 29 | {props.children} 30 | 31 | ); 32 | }; 33 | 34 | export default ScrollBar; 35 | -------------------------------------------------------------------------------- /src/components/SelectInput/SelectInput.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Select from "react-select"; 3 | 4 | const SelectInput = (props) => { 5 | return props.onchange(e)} checked={props.checked}/> 9 | 10 | 11 | ); 12 | }; 13 | 14 | export default ToggleSwitch; -------------------------------------------------------------------------------- /src/components/ToggleSwitch/ToggleSwitch.module.css: -------------------------------------------------------------------------------- 1 | .switch { 2 | position: relative; 3 | display: inline-block; 4 | width: 2.5rem; 5 | height: 1.5rem; 6 | } 7 | .switch input { 8 | opacity: 0; 9 | width: 0; 10 | height: 0; 11 | } 12 | .slider { 13 | position: absolute; 14 | cursor: pointer; 15 | top: 0; 16 | left: 0; 17 | right: 0; 18 | bottom: 0; 19 | border-radius: 34px; 20 | background-color: var(--textColor); 21 | -webkit-transition: .4s; 22 | transition: .4s; 23 | } 24 | .slider:before { 25 | position: absolute; 26 | content: ""; 27 | width: 1.1rem; 28 | height: 1.1rem; 29 | top: 0.2rem; 30 | left: 0.18rem; 31 | right: initial; 32 | background-color: var(--white); 33 | } 34 | :global(.ltr) .slider:before { 35 | right: 0.18rem; 36 | left: initial; 37 | } 38 | input:checked + .slider { 39 | background-color: var(--activeTab); 40 | } 41 | input:focus + .slider { 42 | box-shadow: 0 0 1px var(--activeTab); 43 | } 44 | input:checked + .slider:before { 45 | right: 0.18rem; 46 | left: initial; 47 | } 48 | :global(.ltr) input:checked + .slider:before { 49 | left: 0.18rem; 50 | right: initial; 51 | } 52 | .slider:before { 53 | border-radius: 50%; 54 | } -------------------------------------------------------------------------------- /src/constants/global.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/constants/global.js -------------------------------------------------------------------------------- /src/main/Browser/Pages/404/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/main/Browser/Pages/404/index.js -------------------------------------------------------------------------------- /src/main/Browser/Pages/AllMarket/AllMarket.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | background-repeat: repeat; 3 | background-position: center center; 4 | background-size: 600px 1200px; 5 | } 6 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/AllMarket/components/AllMarketInfo/AllMarketInfo.module.css: -------------------------------------------------------------------------------- 1 | .header { 2 | height: 10vh; 3 | } 4 | 5 | /*.title { 6 | background-color: var(--cardBodyAlpha); 7 | }*/ 8 | 9 | .active { 10 | background-color: var(--activeTitle); 11 | color: var(--activeTab); 12 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/AllMarket/components/AllMarketInfo/components/AllMarketInfoCard/AllMarketInfoCard.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 100%; 3 | display: grid; 4 | grid-template-columns: 20% 20% 20% 20% 20%; 5 | } 6 | 7 | .item { 8 | margin: 1vh 0.5vw; 9 | border-radius: 8px; 10 | height: 37vh; 11 | } 12 | 13 | .thisButton:hover { 14 | background-color: var(--container) !important; 15 | color: var(--activeTab); 16 | } 17 | 18 | .thisButton { 19 | width: 80%; 20 | background: var(--cardHeaderAlpha); 21 | color: var(--textColor); 22 | bottom: 0; 23 | } 24 | 25 | .filter { 26 | filter: blur(4px); 27 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/AllMarket/components/AllMarketInfo/components/AllMarketInfoTable/AllMarketInfoTable.module.css: -------------------------------------------------------------------------------- 1 | .row:last-child { 2 | border-bottom: none; 3 | } 4 | 5 | .row:nth-child(odd) { 6 | background-color: var(--tableRow); 7 | } 8 | 9 | .thisButton:hover { 10 | background-color: var(--container); 11 | } 12 | 13 | .thisButton { 14 | width: 80%; 15 | background: var(--cardHeaderAlpha); 16 | color: var(--textColor); 17 | bottom: 0; 18 | } 19 | 20 | .filter { 21 | filter: blur(4px); 22 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/AllMarket/components/PriceInfo/PriceInfo.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 30vh; 3 | width: 80% 4 | } 5 | 6 | .header { 7 | height: 25%; 8 | } 9 | 10 | .content { 11 | height: 75%; 12 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/AllMarket/components/VolumeInfo/VolumeInfo.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 30vh; 3 | width: 80% 4 | } 5 | 6 | .header { 7 | height: 25%; 8 | } 9 | 10 | .content { 11 | height: 75%; 12 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/AllMarket/components/VolumeInfo/components/MostTrades/MostTrades.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {images} from "../../../../../../../../assets/images"; 3 | import i18n from "i18next"; 4 | import {BN} from "../../../../../../../../utils/utils"; 5 | import {useTranslation} from "react-i18next"; 6 | 7 | const MostTrades = ({mostTrades}) => { 8 | 9 | const {t} = useTranslation(); 10 | 11 | return ( 12 | <> 13 | {mostTrades?.pairInfo?.baseAsset} 17 | {t("currency." + mostTrades?.pairInfo?.baseAsset)} 18 |
19 | {new BN(mostTrades?.tradeCount).toFormat()} 20 |
21 | 22 | 23 | ); 24 | }; 25 | 26 | export default MostTrades; 27 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/EasyTrading/EasyTrading.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import EasyOrder from "./components/EasyOrder/EasyOrder"; 3 | 4 | const EasyTrading = () => { 5 | return ; 6 | }; 7 | 8 | export default EasyTrading; 9 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/EasyTrading/EasyTrading.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/main/Browser/Pages/EasyTrading/EasyTrading.module.css -------------------------------------------------------------------------------- /src/main/Browser/Pages/Info/AboutUs/AboutUs.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100%; 3 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Info/Commission/Commission.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100%; 3 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Info/ContactUs/ContactUs.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import classes from './ContactUs.module.css'; 3 | import {useTranslation} from "react-i18next"; 4 | 5 | const ContactUs = () => { 6 | const {t} = useTranslation(); 7 | 8 | return ( 9 |
10 |
11 | {t("contactUs.subTitle1")} 12 | {t("contactUs.text1")} 13 | 14 |
15 | {t("contactUs.businessEmails")}: 16 | {t("contactUs.businessEmailsValue")} 17 |
18 |
19 | 20 | {t("contactUs.supportRelated")}: 21 | {t("contactUs.supportRelatedValue")} 22 |
23 | 24 |
25 |
26 | ); 27 | }; 28 | 29 | export default ContactUs; 30 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/Info/ContactUs/ContactUs.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100%; 3 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Info/Guide/Guide.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100%; 3 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Info/Rules/Rules.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100%; 3 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Info/TransferFees/TransferFees.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100%; 3 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Landing/Landing.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | 3 | background-repeat: repeat; 4 | background-position: center center; 5 | background-size: 600px 1200px; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/Landing/components/GeneralInfo/GeneralInfo.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 27%; 3 | width: 90% 4 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Landing/components/MarketInfo/MarketInfo.module.css: -------------------------------------------------------------------------------- 1 | .header { 2 | height: 10vh; 3 | } 4 | 5 | /*.title { 6 | background-color: var(--cardBodyAlpha); 7 | }*/ 8 | 9 | .active { 10 | background-color: var(--activeTitle); 11 | color: var(--activeTab); 12 | } 13 | 14 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/Landing/components/MarketInfo/components/MarketInfoCard/MarketInfoCard.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 100%; 3 | display: grid; 4 | grid-template-columns: 20% 20% 20% 20% 20%; 5 | } 6 | 7 | .item { 8 | margin: 1vh 0.5vw; 9 | border-radius: 8px; 10 | height: 37vh; 11 | } 12 | 13 | .item:hover { 14 | background-color: var(--container) !important; 15 | } 16 | 17 | .filter { 18 | filter: blur(4px); 19 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Landing/components/MarketInfo/components/MarketInfoTable/MarketInfoTable.module.css: -------------------------------------------------------------------------------- 1 | .row:last-child { 2 | border-bottom: none; 3 | } 4 | 5 | .row:nth-child(odd) { 6 | background-color: var(--tableRow); 7 | } 8 | 9 | .row:hover { 10 | background-color: var(--container); 11 | } 12 | 13 | .filter { 14 | filter: blur(4px); 15 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Landing/components/MarketView/MarketView.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 55vh; 3 | width: 90% 4 | } 5 | 6 | .header { 7 | height: 15%; 8 | } 9 | 10 | .content { 11 | height: 85%; 12 | } 13 | 14 | .thisLoading { 15 | width: 5vw; 16 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/Landing/components/Spinner/Spinner.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import classes from './Spinner.module.css' 3 | import {images} from "../../../../../../assets/images"; 4 | 5 | const Spinner = () => { 6 | return ( 7 |
8 |
9 | BTC 10 |
11 |
12 | ETH 13 |
14 |
15 | USDT 16 |
17 | astronautAlone 18 |
19 | ); 20 | }; 21 | 22 | export default Spinner; -------------------------------------------------------------------------------- /src/main/Browser/Pages/Login/components/LoginLoading/LoginFormLoading.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {images} from "../../../../../../assets/images"; 3 | import {useSelector} from "react-redux"; 4 | 5 | const LoginFormLoading = () => { 6 | const theme = useSelector((state) => state.global.theme) 7 | 8 | return
9 | Loading 11 |
12 | } 13 | 14 | export default LoginFormLoading; -------------------------------------------------------------------------------- /src/main/Browser/Pages/Login/components/OTPForm/OTPForm.js: -------------------------------------------------------------------------------- 1 | import classes from "../../Login.module.css"; 2 | import React from "react"; 3 | import TextInput from "../../../../../../components/TextInput/TextInput"; 4 | import {useTranslation} from "react-i18next"; 5 | 6 | 7 | const OTPForm = ({initialVal, setOTP}) => { 8 | const {t} = useTranslation(); 9 | 10 | const OTPInputHandler = (value) => { 11 | const userInput = value.replace(/[^0-9]+/g, "").slice(0, 6) 12 | setOTP(userInput) 13 | } 14 | 15 | return ( 16 | <> 17 | OTPInputHandler(e.target.value)} 23 | /> 24 | 25 | ) 26 | } 27 | 28 | export default OTPForm; -------------------------------------------------------------------------------- /src/main/Browser/Pages/User/User.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {Navigate, Route, Routes} from "react-router-dom"; 3 | import * as RoutesName from "../../Routes/routes"; 4 | import Verify from "./components/Verify/Verify"; 5 | import ForgetPassword from "./components/ForgetPassword/ForgetPassword"; 6 | import classes from "./User.module.css"; 7 | import {images} from "../../../../assets/images"; 8 | 9 | const User = () => { 10 | return ( 11 |
12 | 13 | }/> 14 | }/> 15 | }/> 16 | 17 |
18 | ); 19 | }; 20 | 21 | export default User; -------------------------------------------------------------------------------- /src/main/Browser/Pages/User/User.module.css: -------------------------------------------------------------------------------- 1 | .container{ 2 | /*height: 100vh;*/ 3 | background-color: var(--mainContent); 4 | background-repeat: repeat; 5 | background-position: center center; 6 | background-size: 600px 1200px; 7 | top: 0; 8 | bottom: 0; 9 | position: absolute; 10 | } 11 | 12 | .content{ 13 | top: 20%; 14 | left: 32.5%; 15 | width: 35%; 16 | height: 60%; 17 | background-color: var(--cardBodyAlpha); 18 | z-index: 7; 19 | } 20 | .content img{ 21 | width: 7vw; 22 | } 23 | .thisButton { 24 | width: 100%; 25 | background-color: var(--green); 26 | color: #000 !important; 27 | 28 | } 29 | .forgetPassWordHeader{ 30 | height: 18% 31 | } 32 | 33 | .forgetPassWordContent{ 34 | height: 64% 35 | } 36 | 37 | .forgetPassWordFooter{ 38 | height: 18% 39 | } 40 | 41 | 42 | .passwordInput { 43 | margin: 1vh 0; 44 | width: 100%; 45 | } 46 | .passwordInput :global(.lead) { 47 | width: 45%; 48 | cursor: pointer; 49 | } 50 | .passwordInput :global(.after) { 51 | width: 12.5%; 52 | cursor: pointer; 53 | } 54 | .passwordInput :global(input) { 55 | width: 42.5% !important; 56 | } 57 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/User/components/ForgetPassword/ForgetPassword.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/main/Browser/Pages/User/components/ForgetPassword/ForgetPassword.module.css -------------------------------------------------------------------------------- /src/main/Browser/Pages/User/components/Verify/Verify.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/main/Browser/Pages/User/components/Verify/Verify.module.css -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/History/History.module.css: -------------------------------------------------------------------------------- 1 | .thisInput :global(.lead) { 2 | width: 30%; 3 | } 4 | .thisInput :global(.selectExternalClass) { 5 | width: 70% !important; 6 | } 7 | 8 | .thisInput :global(.rmdp-container ) { 9 | width: 70%; 10 | height: 100%; 11 | } 12 | 13 | 14 | 15 | .thisButton { 16 | background-color: var(--orange); 17 | color: #000; 18 | } 19 | .disable:disabled,.button[disabled] { 20 | border: 0.3vh solid var(--cardHeader); 21 | background: var(--cardHeader); 22 | color: var(--textColor); 23 | cursor: not-allowed; 24 | } 25 | 26 | .thisButton:disabled,.button[disabled] { 27 | border: 0.3vh solid var(--cardHeader); 28 | background: var(--cardHeader); 29 | color: var(--textColor); 30 | cursor: not-allowed; 31 | } 32 | 33 | 34 | 35 | .header { 36 | height: 10vh; 37 | } 38 | 39 | /*.title { 40 | background-color: var(--cardBodyAlpha); 41 | }*/ 42 | 43 | .active { 44 | background-color: var(--activeTitle); 45 | color: var(--activeTab); 46 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/History/components/DepositHistory/DepositHistory.module.css: -------------------------------------------------------------------------------- 1 | .thisButton { 2 | background-color: var(--orange); 3 | color: #000; 4 | } 5 | .disable:disabled,.button[disabled] { 6 | border: 0.3vh solid var(--cardBodyAlpha); 7 | background: var(--cardBodyAlpha); 8 | color: var(--textColor); 9 | cursor: not-allowed; 10 | } 11 | 12 | .thisButton:disabled,.button[disabled] { 13 | border: 0.3vh solid var(--cardBodyAlpha); 14 | background: var(--cardBodyAlpha); 15 | color: var(--textColor); 16 | cursor: not-allowed; 17 | } 18 | 19 | .thisInput :global(.lead) { 20 | width: 30%; 21 | } 22 | .thisInput :global(.selectExternalClass) { 23 | width: 70%; 24 | } 25 | .thisInput :global(.rmdp-container ) { 26 | width: 70%; 27 | } 28 | .thisInput.datePicker :global(.rmdp-container ) { 29 | font-size: 0.85rem; 30 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/History/components/DepositHistoryTable/DepositHistoryTable.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even) { 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/History/components/Transactions/Transactions.module.css: -------------------------------------------------------------------------------- 1 | .thisButton { 2 | background-color: var(--orange); 3 | color: #000; 4 | } 5 | .disable:disabled,.button[disabled] { 6 | border: 0.3vh solid var(--cardBodyAlpha); 7 | background: var(--cardBodyAlpha); 8 | color: var(--textColor); 9 | cursor: not-allowed; 10 | } 11 | 12 | .thisButton:disabled,.button[disabled] { 13 | border: 0.3vh solid var(--cardBodyAlpha); 14 | background: var(--cardBodyAlpha); 15 | color: var(--textColor); 16 | cursor: not-allowed; 17 | } 18 | 19 | 20 | .thisInput :global(.lead) { 21 | width: 30%; 22 | } 23 | .thisInput :global(.selectExternalClass) { 24 | width: 70%; 25 | } 26 | .thisInput :global(.rmdp-container ) { 27 | width: 70%; 28 | } 29 | .thisInput.datePicker :global(.rmdp-container ) { 30 | font-size: 0.85rem; 31 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/History/components/TransactionsTable/TransactionsTable.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even) { 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/History/components/WithdrawHistory/WithdrawHistory.module.css: -------------------------------------------------------------------------------- 1 | .thisButton { 2 | background-color: var(--orange); 3 | color: #000; 4 | } 5 | .disable:disabled,.button[disabled] { 6 | border: 0.3vh solid var(--cardBodyAlpha); 7 | background: var(--cardBodyAlpha); 8 | color: var(--textColor); 9 | cursor: not-allowed; 10 | } 11 | 12 | .thisButton:disabled,.button[disabled] { 13 | border: 0.3vh solid var(--cardBodyAlpha); 14 | background: var(--cardBodyAlpha); 15 | color: var(--textColor); 16 | cursor: not-allowed; 17 | } 18 | 19 | .thisInput :global(.lead) { 20 | width: 30%; 21 | } 22 | .thisInput :global(.selectExternalClass) { 23 | width: 70%; 24 | } 25 | .thisInput :global(.rmdp-container ) { 26 | width: 70%; 27 | } 28 | .thisInput.datePicker :global(.rmdp-container ) { 29 | font-size: 0.85rem; 30 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/History/components/WithdrawHistoryTable/WithdrawHistoryTable.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even) { 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/LastTrades/LastTrades.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 55vh; 3 | } 4 | .header { 5 | height: 12%; 6 | padding: 1vh 1vw; 7 | } 8 | .header span { 9 | width: 50%; 10 | text-align: center; 11 | } 12 | .content { 13 | height: 88%; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/LastTrades/components/LastTradesTable/LastTradesTable.module.css: -------------------------------------------------------------------------------- 1 | .container tr:nth-child(even) td { 2 | background-color: var(--tableRow); 3 | transition: background-color 0.4s; 4 | } 5 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/MyOrders/MyOrders.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 55vh; 3 | border-radius: 9px; 4 | } 5 | .iconBG { 6 | vertical-align: middle; 7 | border-radius: 50vw; 8 | } 9 | .close { 10 | max-height: 0; 11 | overflow: hidden; 12 | transition: max-height 0.3s; 13 | opacity: 0; 14 | line-height: 0; 15 | visibility: collapse; 16 | } 17 | .open { 18 | max-height: 2vh; 19 | transition: max-height 0.6s; 20 | } 21 | .safariFlexSize :global(.accordion-header) { 22 | flex: 22; 23 | } 24 | .safariFlexSize :global(.accordion-body) { 25 | flex: 77; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/Order/Order.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 78vh; 3 | } 4 | .content { 5 | height: 100%; 6 | padding: 1.8vh 1vw; 7 | } 8 | .thisButton { 9 | width: 100%; 10 | } 11 | .alertSubmit{ 12 | background-color: var(--orange); 13 | } 14 | .thisButton.buyOrder { 15 | background-color: var(--darkGreen); 16 | } 17 | .thisButton.sellOrder { 18 | background-color: var(--darkRed); 19 | } 20 | .thisButton:disabled,.button[disabled] { 21 | border: 0.3vh solid var(--cardHeader); 22 | background: var(--cardHeader); 23 | color: var(--textColor); 24 | cursor: not-allowed; 25 | } 26 | .thisLoading{ 27 | width: 5vw; 28 | } 29 | .dangerHint span i { 30 | background-color: #6619bf; 31 | width: 1.1vw; 32 | height: 1.1vw; 33 | border-radius: 50vw; 34 | display: flex; 35 | align-items: center; 36 | justify-content: center; 37 | } 38 | .dangerHint :global(.alert) { 39 | font-size: 0.7vw; 40 | color: #6619bf; 41 | } 42 | .stopMarket { 43 | background: var(--cardHeader); 44 | } 45 | .stopMarket input { 46 | cursor: not-allowed; 47 | } 48 | .safariFlexSize :global(.accordion-header) { 49 | flex: 17; 50 | } 51 | .safariFlexSize :global(.accordion-body) { 52 | flex: 83; 53 | } 54 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/OrderBook/OrderBook.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 100%; 3 | height: 58vh; 4 | } 5 | .header { 6 | height: 20%; 7 | padding: 1vh 1vw; 8 | } 9 | .header span { 10 | width: 50%; 11 | text-align: center; 12 | } 13 | .content { 14 | height: 80%; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/OrderBook/components/OrderBookTable/OrderBookTable.module.css: -------------------------------------------------------------------------------- 1 | .container .tbody .tbodyRow:nth-child(even) span{ 2 | background-color: var(--tableRow); 3 | transition: background-color 0.4s; 4 | } 5 | :global #opex-tooltip { 6 | background-color: var(--toolTipBG); 7 | color: var(--textColor); 8 | border: 0.1vh solid transparent; 9 | border-radius: 5px; 10 | font-size: 0.8vw; 11 | padding: 0.5vh 1vw; 12 | opacity: 1 !important; 13 | z-index: 10; 14 | } 15 | :global .place-bottom::after { 16 | border-bottom-color: var(--toolTipBG) !important; 17 | } 18 | :global .place-left::after { 19 | border-left-color: var(--toolTipBG) !important; 20 | } 21 | :global .place-right::after { 22 | border-right-color: var(--toolTipBG) !important; 23 | } 24 | :global .place-top::after { 25 | border-top-color: var(--toolTipBG) !important; 26 | } 27 | .selected { 28 | background: var(--orangeAlpha) !important; 29 | } 30 | .tbody{ 31 | line-height: 4.7vh; 32 | } 33 | .thead{ 34 | position: sticky; 35 | top: 0; 36 | z-index: 1; 37 | font-weight: normal; 38 | background-color: var(--tableHeader); 39 | line-height: 4.7vh; 40 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/OrderBook/components/OrderBookTooltip/OrderBookTooltip.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {useTranslation} from "react-i18next"; 3 | 4 | const OrderBookTooltip = (props) => { 5 | const {t} = useTranslation(); 6 | return ( 7 |
8 |
9 | ${t("averagePrice")}: 10 | ${props.price.toLocaleString()} 11 |
12 |
13 | ${t("totalVolume")}: 14 | ${props.amount} 15 |
16 |
17 | ${t("totalPrice")}: 18 | ${props.totalPrice.toLocaleString()} 19 |
20 |
21 | ); 22 | }; 23 | 24 | export default OrderBookTooltip; -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/Overview/Overview.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import classes from "./Overview.module.css"; 3 | import {useTranslation} from "react-i18next"; 4 | import InformationBlock from "./components/InformationBlock/InformationBlock"; 5 | import AccordionBox from "../../../../../../../../../../components/AccordionBox/AccordionBox"; 6 | 7 | const Overview = () => { 8 | const {t} = useTranslation(); 9 | 10 | const data = [ 11 | {title: t("overview.lastDay"), body: }, 12 | {title: t("overview.lastWeek"), body: }, 13 | {title: t("overview.lastMonth"), body: }, 14 | ]; 15 | 16 | return ( 17 |
19 | 24 |
25 | ); 26 | }; 27 | 28 | 29 | export default Overview; 30 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/Overview/Overview.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 38vh; 3 | width: 100%; 4 | } 5 | .content { 6 | height: 100%; 7 | } 8 | 9 | .safariFlexSize :global(.accordion-header) { 10 | flex: 4; 11 | } 12 | .safariFlexSize :global(.accordion-body) { 13 | flex: 6; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/TradingView/TradingView.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {useTranslation} from "react-i18next"; 3 | import AccordionBox from "../../../../../../../../../../components/AccordionBox/AccordionBox"; 4 | import MarketChart from "./components/MarketChart/MarketChart"; 5 | 6 | const TradingView = () => { 7 | const {t} = useTranslation(); 8 | const charts = [ 9 | {title: t("charts.globalChart"), body: }, 10 | {title: t("charts.opexChart"), body: }, 11 | ]; 12 | return ( 13 |
15 | 19 |
20 | ); 21 | }; 22 | 23 | export default TradingView; -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Market/components/TradingView/TradingView.module.css: -------------------------------------------------------------------------------- 1 | .chartContainer { 2 | height: 100%; 3 | align-items: center; 4 | justify-content: center; 5 | display: flex; 6 | padding: 0 1vw; 7 | flex-direction: row; 8 | direction: ltr; 9 | position: relative; 10 | } 11 | :global(div[data-highcharts-chart]) { 12 | width: 100%; 13 | height: 100%; 14 | } 15 | :global(.highcharts-container) { 16 | width: 100% !important; 17 | height: 100% !important; 18 | border-radius: 9px; 19 | } 20 | :global(.highcharts-point-up) { 21 | fill: var(--green); 22 | stroke: var(--green); 23 | } 24 | :global(.highcharts-point-down) { 25 | fill: var(--red); 26 | stroke: var(--red); 27 | } 28 | :global(.highcharts-color-1) { 29 | fill: var(--activeTab); 30 | stroke: var(--activeTab); 31 | } 32 | .error { 33 | position: absolute; 34 | top: 50%; 35 | left: 0; 36 | right: 0; 37 | bottom: 0; 38 | text-align: center; 39 | z-index: 2; 40 | vertical-align: text-bottom; 41 | } 42 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/APIKey/APIKey.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import CreateAPIKey from "./components/CreateAPIKey/CreateAPIKey"; 3 | import APIKeyList from "./components/APIKeyList/APIKeyList"; 4 | 5 | const APIKey = () => { 6 | return ( 7 | <> 8 | 9 | 10 | 11 | ); 12 | }; 13 | 14 | export default APIKey; 15 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/APIKey/APIKey.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/APIKey/APIKey.module.css -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/APIKey/components/APIKeyList/APIKeyList.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | 3 | } 4 | 5 | .thisButton { 6 | border-radius: 8px; 7 | direction: ltr; 8 | text-align: center; 9 | font-size: 0.8rem; 10 | padding: 1.3vh 0vw; 11 | color: var(--textColor); 12 | width: 7vw; 13 | } 14 | 15 | .thisButton:hover { 16 | background-color: var(--blue); 17 | } 18 | 19 | .enable { 20 | background-color: var(--darkGreen); 21 | } 22 | 23 | .disable { 24 | background-color: var(--darkRed); 25 | } 26 | 27 | .thisLoading { 28 | width: 5vw; 29 | } 30 | 31 | .title { 32 | display: none 33 | } 34 | 35 | .titleNav:hover .title { 36 | display: block; 37 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/APIKey/components/CreateAPIKey/CreateAPIKey.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 45vh; 3 | } 4 | .header { 5 | height: 23%; 6 | padding: 1vh 1vw; 7 | } 8 | .header span { 9 | width: 50%; 10 | text-align: center; 11 | } 12 | .content { 13 | height: 77%; 14 | } 15 | 16 | .allowedIPsInput :global(.lead) { 17 | width: 24%; 18 | } 19 | .allowedIPsInput :global(input) { 20 | width: 76%; 21 | } 22 | 23 | .thisLoading{ 24 | width: 5vw; 25 | } 26 | 27 | .thisButton { 28 | width: 10%; 29 | background-color: var(--darkGreen); 30 | } 31 | 32 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/APIKey/components/CreateAPIKey/components/ResultPage/ResultPage.module.css: -------------------------------------------------------------------------------- 1 | .container{ 2 | width: 100%; 3 | height: 100%; 4 | position: fixed; 5 | top: 0; 6 | /*background-color: #0304038f;*/ 7 | background-color: rgba(0, 0, 0, 0.66); 8 | z-index: 6; 9 | right: 0; 10 | } 11 | .content{ 12 | position: fixed; 13 | top: 9%; 14 | left: 31.5%; 15 | width: 37%; 16 | height: 82%; 17 | background-color: var(--cardBody); 18 | z-index: 7; 19 | } 20 | .content img{ 21 | width: 4vw; 22 | } 23 | .thisButton { 24 | background-color: var(--orange); 25 | color: #000 !important; 26 | } 27 | 28 | .thisInput :global(.lead) { 29 | width: 20%; 30 | } 31 | .thisInput :global(input) { 32 | width: 70%; 33 | } 34 | .thisInput :global(.after) { 35 | width: 10%; 36 | } 37 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Authentication/Authentication.module.css: -------------------------------------------------------------------------------- 1 | .wizardBox { 2 | height: 6vh; 3 | width: 60%; 4 | } 5 | .activeStep { 6 | color: var(--activeTab); 7 | font-size: 1vw; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Authentication/components/HelpStep/HelpStep.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import classes from "./HelpStep.module.css"; 3 | import {useTranslation} from "react-i18next"; 4 | import Button from "../../../../../../../../../../../../components/Button/Button"; 5 | 6 | const HelpStep = ({nextStep}) => { 7 | const {t} = useTranslation(); 8 | 9 | return ( 10 |
11 |
12 |
13 |

{t("HelpStep.title")}

14 |
15 |
16 |
17 | {t("HelpStep.content")} 18 |
19 |
25 |
26 |
27 | ); 28 | }; 29 | 30 | export default HelpStep; -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Authentication/components/HelpStep/HelpStep.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 75vh; 3 | } 4 | .header { 5 | height: 12%; 6 | } 7 | .content { 8 | height: 88%; 9 | } 10 | .thisButton { 11 | width: 10%; 12 | background-color: var(--darkGreen); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Authentication/components/PersonalProfileStep/PersonalProfileStep.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 75vh; 3 | } 4 | .header { 5 | height: 12%; 6 | } 7 | .content { 8 | height: 88%; 9 | } 10 | .content :global(.row) { 11 | width: 100%; 12 | } 13 | .addressInput :global(.lead) { 14 | width: 24.5%; 15 | } 16 | .addressInput :global(input) { 17 | width: 75.5%; 18 | } 19 | .thisButton { 20 | width: 20%; 21 | } 22 | .thisButton.prev{ 23 | background-color: var(--orange); 24 | } 25 | .thisButton.next{ 26 | background-color: var(--darkGreen); 27 | } 28 | .email :global(input){ 29 | background-color: var(--cardHeader); 30 | cursor: not-allowed; 31 | } 32 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Authentication/components/SendPhotosStep/SendPhotosStep.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 75vh; 3 | } 4 | .header { 5 | height: 12%; 6 | } 7 | .content { 8 | height: 88%; 9 | } 10 | .thisButton { 11 | width: 30%; 12 | } 13 | .thisButton.prev{ 14 | background-color: var(--orange); 15 | } 16 | .thisButton.next{ 17 | background-color: var(--darkGreen); 18 | } 19 | 20 | .zoneBox { 21 | width: 22vw; 22 | padding: 2vh 1vw; 23 | border-radius: 10px; 24 | border: 0.3vh dotted var(--cardBorder); 25 | } 26 | .cancel { 27 | top: 0.8vh; 28 | left: 0.1vw; 29 | } 30 | .zone { 31 | padding: 2vh 1vw; 32 | height: 30vh; 33 | border-radius: 10px; 34 | background-repeat: no-repeat; 35 | background-position: center center; 36 | background-size: cover; 37 | background-color: var(--cardHeader); 38 | } 39 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Authentication/components/SendToAdminStep/SendToAdminStep.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 75vh; 3 | } 4 | .header { 5 | height: 12%; 6 | } 7 | .content { 8 | height: 88%; 9 | } 10 | .thisButton { 11 | width: 10%; 12 | } 13 | .thisButton.prev{ 14 | background-color: var(--orange); 15 | } 16 | .thisButton.submit{ 17 | background-color: var(--darkGreen); 18 | } 19 | .content img{ 20 | width: 8vw; 21 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Personalization/Personalization.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PersonalizationForm from "./components/PersonalizationForm/PersonalizationForm"; 3 | 4 | const Personalization = () => { 5 | return ( 6 |
7 | 8 |
9 | ); 10 | }; 11 | 12 | export default Personalization; 13 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Personalization/components/PersonalizationForm/PersonalizationForm.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 35vh; 3 | } 4 | .header { 5 | height: 20%; 6 | padding: 1vh 1vw; 7 | } 8 | .header span { 9 | width: 50%; 10 | text-align: center; 11 | } 12 | .content { 13 | height: 80%; 14 | width: 100%; 15 | } 16 | .content :global(.row) { 17 | width: 100%; 18 | } 19 | .thisButton { 20 | width: 10%; 21 | background-color: var(--darkGreen); 22 | } 23 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Profile/Profile.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PersonalProfile from "./components/PersonalProfile/PersonalProfile"; 3 | 4 | const Profile = () => { 5 | return ( 6 | <> 7 |
8 | 9 |
10 | 11 | ); 12 | }; 13 | 14 | export default Profile; -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Profile/components/PersonalProfile/PersonalProfile.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 65vh; 3 | } 4 | .header { 5 | height: 12%; 6 | } 7 | .content { 8 | height: 88%; 9 | } 10 | .content :global(.row) { 11 | width: 100%; 12 | } 13 | .addressInput :global(.lead) { 14 | width: 24.5%; 15 | } 16 | .addressInput :global(input) { 17 | width: 75.5%; 18 | } 19 | .thisButton { 20 | width: 20%; 21 | } 22 | .thisButton.prev{ 23 | background-color: var(--orange); 24 | } 25 | .thisButton.next{ 26 | background-color: var(--darkGreen); 27 | } 28 | .content :global(input){ 29 | cursor: not-allowed; 30 | } 31 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Profile/components/UserAccountStatus/UserAccountStatus.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 30vh; 3 | } 4 | .header { 5 | height: 30%; 6 | padding: 1vh 1vw; 7 | } 8 | .header span { 9 | text-align: center; 10 | } 11 | .content { 12 | height: 70%; 13 | } 14 | .iconCustomClasss { 15 | display: flex; 16 | justify-content: flex-end; 17 | } 18 | 19 | .content tr:nth-child(even) td { 20 | background-color: var(--tableRow); 21 | transition: background-color 0.4s; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Security/Security.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ChangePassword from "./components/ChangePassword/ChangePassword"; 3 | import ActiveSessions from "./components/ActiveSessions/ActiveSessions"; 4 | import SetTwoStepVerification from "./components/SetTwoStepVerification/SetTwoStepVerification"; 5 | 6 | const Security = () => { 7 | return ( 8 | <> 9 |
10 |
11 | 12 |
13 |
14 | 15 |
16 |
17 |
18 | 19 |
20 | 21 | ); 22 | }; 23 | 24 | export default Security; -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Security/components/ActiveSessions/ActiveSessions.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 65vh; 3 | } 4 | .header { 5 | height: 15%; 6 | padding: 1vh 1vw; 7 | } 8 | .header span { 9 | width: 50%; 10 | text-align: center; 11 | } 12 | .content { 13 | height: 85%; 14 | } 15 | 16 | 17 | .thisSession { 18 | background: var(--cardHeaderAlpha); 19 | } 20 | 21 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Security/components/ActiveSessions/components/Session/Session.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even){ 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } 7 | 8 | .thisLoading{ 9 | width: 5vw; 10 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Security/components/ChangePassword/ChangePassword.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 65vh; 3 | } 4 | .header { 5 | height: 15%; 6 | padding: 1vh 1vw; 7 | } 8 | .header span { 9 | width: 50%; 10 | text-align: center; 11 | } 12 | .content { 13 | height: 85%; 14 | } 15 | .content :global(.row) { 16 | width: 100%; 17 | } 18 | .thisButton { 19 | width: 20%; 20 | background-color: var(--darkGreen); 21 | } 22 | .passwordInput :global(.lead) { 23 | width: 50%; 24 | cursor: pointer; 25 | } 26 | .passwordInput :global(.after) { 27 | width: 10%; 28 | cursor: pointer; 29 | } 30 | .passwordInput :global(input) { 31 | width: 40% !important; 32 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Security/components/LoginReports/LoginReports.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import classes from "./LoginReports.module.css"; 3 | import {useTranslation} from "react-i18next"; 4 | 5 | const LoginReports = () => { 6 | const {t} = useTranslation(); 7 | 8 | return ( 9 |
11 |
13 |
14 |

{t("LoginReports.title")}

15 |
16 |
17 |
18 | {t("LoginReports.title")} 19 |
20 |
21 | ); 22 | }; 23 | 24 | export default LoginReports; 25 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Security/components/LoginReports/LoginReports.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 30vh; 3 | } 4 | .header { 5 | height: 20%; 6 | padding: 1vh 1vw; 7 | } 8 | .header span { 9 | width: 50%; 10 | text-align: center; 11 | } 12 | .content { 13 | height: 80%; 14 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Settings/components/Security/components/SetTwoStepVerification/SetTwoStepVerification.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 40vh; 3 | } 4 | .header { 5 | height: 23%; 6 | padding: 1vh 1vw; 7 | } 8 | .header span { 9 | width: 50%; 10 | text-align: center; 11 | } 12 | .content { 13 | height: 77%; 14 | } 15 | 16 | .thisLoading{ 17 | width: 5vw; 18 | } 19 | 20 | .thisButton { 21 | width: 10%; 22 | background-color: var(--darkGreen); 23 | } 24 | .submit{ 25 | width: 15%; 26 | } 27 | .disableOtp{ 28 | background-color: var(--darkRed); 29 | width: 15%; 30 | } 31 | 32 | .thisInput :global(.lead) { 33 | width: 35%; 34 | } 35 | .thisInput :global(input) { 36 | width: 75% !important; 37 | letter-spacing: 1rem; 38 | } 39 | /*.thisInput :global(input) { 40 | width: 85% !important; 41 | }*/ 42 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/TechnicalChart/TechnicalChart.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import AdvanceTradingView from "../../../../../../../../components/AdvanceTradingView/AdvanceTradingView"; 3 | 4 | const TechnicalChart = () => { 5 | 6 | 7 | return ( 8 | 9 | ); 10 | }; 11 | 12 | export default TechnicalChart; 13 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/TechnicalChart/TechnicalChart.module.css: -------------------------------------------------------------------------------- 1 | .content{ 2 | width: 95%; 3 | /*height: 100vh;*/ 4 | z-index: 6; 5 | /*margin-right: 5%;*/ 6 | background-color: var(--cardBody); 7 | } 8 | :global(.ltr) .content{ 9 | /*margin-left: 5%; 10 | margin-right: initial;*/ 11 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/TransactionHistory/TransactionHistory.module.css: -------------------------------------------------------------------------------- 1 | .thisInput :global(.lead) { 2 | width: 30%; 3 | } 4 | .thisInput :global(.selectExternalClass) { 5 | width: 70% !important; 6 | } 7 | 8 | .thisInput :global(.rmdp-container ) { 9 | width: 70%; 10 | height: 100%; 11 | } 12 | 13 | 14 | 15 | .thisButton { 16 | background-color: var(--orange); 17 | color: #000; 18 | } 19 | .disable:disabled,.button[disabled] { 20 | border: 0.3vh solid var(--cardHeader); 21 | background: var(--cardHeader); 22 | color: var(--textColor); 23 | cursor: not-allowed; 24 | } 25 | 26 | .thisButton:disabled,.button[disabled] { 27 | border: 0.3vh solid var(--cardHeader); 28 | background: var(--cardHeader); 29 | color: var(--textColor); 30 | cursor: not-allowed; 31 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/TransactionHistory/components/TransactionHistoryTable/TransactionHistoryTable.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even) { 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Transactions/Transactions.module.css: -------------------------------------------------------------------------------- 1 | .thisInput :global(.lead) { 2 | width: 30%; 3 | } 4 | .thisInput :global(.selectExternalClass) { 5 | width: 70% !important; 6 | } 7 | 8 | .thisInput :global(.rmdp-container ) { 9 | width: 70%; 10 | height: 100%; 11 | } 12 | 13 | 14 | 15 | .thisButton { 16 | background-color: var(--orange); 17 | color: #000; 18 | } 19 | .disable:disabled,.button[disabled] { 20 | border: 0.3vh solid var(--cardHeader); 21 | background: var(--cardHeader); 22 | color: var(--textColor); 23 | cursor: not-allowed; 24 | } 25 | 26 | .thisButton:disabled,.button[disabled] { 27 | border: 0.3vh solid var(--cardHeader); 28 | background: var(--cardHeader); 29 | color: var(--textColor); 30 | cursor: not-allowed; 31 | } 32 | 33 | 34 | 35 | .header { 36 | height: 10vh; 37 | } 38 | 39 | /*.title { 40 | background-color: var(--cardBodyAlpha); 41 | }*/ 42 | 43 | .active { 44 | background-color: var(--activeTitle); 45 | color: var(--activeTab); 46 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Transactions/components/BuyAndSell/BuyAndSell.module.css: -------------------------------------------------------------------------------- 1 | .thisButton { 2 | background-color: var(--orange); 3 | color: #000; 4 | } 5 | .disable:disabled,.button[disabled] { 6 | border: 0.3vh solid var(--cardBodyAlpha); 7 | background: var(--cardBodyAlpha); 8 | color: var(--textColor); 9 | cursor: not-allowed; 10 | } 11 | 12 | .thisButton:disabled,.button[disabled] { 13 | border: 0.3vh solid var(--cardBodyAlpha); 14 | background: var(--cardBodyAlpha); 15 | color: var(--textColor); 16 | cursor: not-allowed; 17 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Transactions/components/BuyAndSellTable/BuyAndSellTable.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even) { 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Transactions/components/DepositHistory/DepositHistory.module.css: -------------------------------------------------------------------------------- 1 | .thisButton { 2 | background-color: var(--orange); 3 | color: #000; 4 | } 5 | .disable:disabled,.button[disabled] { 6 | border: 0.3vh solid var(--cardBodyAlpha); 7 | background: var(--cardBodyAlpha); 8 | color: var(--textColor); 9 | cursor: not-allowed; 10 | } 11 | 12 | .thisButton:disabled,.button[disabled] { 13 | border: 0.3vh solid var(--cardBodyAlpha); 14 | background: var(--cardBodyAlpha); 15 | color: var(--textColor); 16 | cursor: not-allowed; 17 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Transactions/components/DepositHistoryTable/DepositHistoryTable.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even) { 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Transactions/components/WithdrawHistory/WithdrawHistory.module.css: -------------------------------------------------------------------------------- 1 | .thisButton { 2 | background-color: var(--orange); 3 | color: #000; 4 | } 5 | .disable:disabled,.button[disabled] { 6 | border: 0.3vh solid var(--cardBodyAlpha); 7 | background: var(--cardBodyAlpha); 8 | color: var(--textColor); 9 | cursor: not-allowed; 10 | } 11 | 12 | .thisButton:disabled,.button[disabled] { 13 | border: 0.3vh solid var(--cardBodyAlpha); 14 | background: var(--cardBodyAlpha); 15 | color: var(--textColor); 16 | cursor: not-allowed; 17 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Transactions/components/WithdrawHistoryTable/WithdrawHistoryTable.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even) { 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/DepositTx/DepositTx.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | /*height: 60vh;*/ 3 | border-radius: 9px; 4 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/DepositTxTable/DepositTxTable.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even) { 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/DepositWithdraw/DepositWithdraw.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import classes from "./DepositWithdraw.module.css"; 3 | import {useTranslation} from "react-i18next"; 4 | import AccordionBox from "../../../../../../../../../../components/AccordionBox/AccordionBox"; 5 | import Withdrawal from "./components/Withdrawal"; 6 | import Deposit from "./components/Deposit/Deposit"; 7 | 8 | 9 | const DepositWithdraw = () => { 10 | const {t} = useTranslation(); 11 | 12 | const data = [ 13 | {id: 1, title: t("deposit"), body: }, 14 | {id: 2, title: t("withdrawal"), body: }, 15 | ]; 16 | 17 | return ( 18 |
20 | 25 |
26 | ); 27 | }; 28 | 29 | export default DepositWithdraw; -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/DepositWithdraw/components/Deposit/components/IRT/IRT.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/DepositWithdraw/components/Deposit/components/IRT/IRT.module.css -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/DepositWithdraw/components/Deposit/components/IRT/components/CallbackPage/CallbackPage.module.css: -------------------------------------------------------------------------------- 1 | .container{ 2 | width: 100%; 3 | height: 100%; 4 | position: fixed; 5 | top: 0; 6 | /*background-color: #0304038f;*/ 7 | background-color: rgba(0, 0, 0, 0.66); 8 | z-index: 6; 9 | right: 0; 10 | } 11 | .content{ 12 | position: fixed; 13 | top: 27.5%; 14 | left: 37.5%; 15 | width: 25%; 16 | height: 45%; 17 | background-color: var(--cardBody); 18 | z-index: 7; 19 | } 20 | .content img{ 21 | width: 7vw; 22 | } 23 | .thisButton { 24 | width: 100%; 25 | background-color: var(--orange); 26 | color: #000 !important; 27 | 28 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/DepositWithdrawTx/DepositWithdrawTx.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import DepositTx from "../DepositTx/DepositTx"; 3 | import WithdrawTx from "../WithdrawTx/WithdrawTx"; 4 | 5 | const DepositWithdrawTx = () => { 6 | return ( 7 |
8 | 9 | 10 |
11 | ) 12 | }; 13 | 14 | export default DepositWithdrawTx; -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/OrdersTrades/OrdersTrades.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 50vh; 3 | border-radius: 9px; 4 | } 5 | .iconBG { 6 | vertical-align: middle; 7 | 8 | border-radius: 50vw; 9 | } 10 | .close { 11 | max-height: 0; 12 | overflow: hidden; 13 | transition: max-height 0.3s; 14 | opacity: 0; 15 | line-height: 0; 16 | visibility: collapse; 17 | } 18 | .open { 19 | max-height: 2vh; 20 | transition: max-height 0.6s; 21 | } 22 | .safariFlexSize :global(.accordion-header) { 23 | flex: 22; 24 | } 25 | .safariFlexSize :global(.accordion-body) { 26 | flex: 77; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/WithdrawTx/WithdrawTx.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | /*height: 60vh;*/ 3 | border-radius: 9px; 4 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Content/components/Wallet/components/WithdrawTxTable/WithdrawTxTable.module.css: -------------------------------------------------------------------------------- 1 | .striped:nth-child(even) { 2 | background-color: var(--tableRow); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } 7 | 8 | .thisButton { 9 | width: 100%; 10 | background-color: var(--darkRed); 11 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Footer/Footer.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | background-color: var(--footer); 3 | -webkit-transition: background-color 0.4s; 4 | -o-transition: background-color 0.4s; 5 | transition: background-color 0.4s; 6 | } 7 | 8 | .languages span { 9 | border-left: 0.01vh solid #f58634; 10 | } 11 | 12 | :global(.ltr) .languages span { 13 | border-right: 0.01vh solid #f58634; 14 | border-left: initial; 15 | } 16 | 17 | .languages span:last-child { 18 | border-left: initial; 19 | } 20 | :global(.ltr) .languages span:last-child { 21 | border-left: initial; 22 | border-right: initial; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Header/components/Clock/Clock.js: -------------------------------------------------------------------------------- 1 | import moment from "moment-jalaali"; 2 | import React, {useState} from "react"; 3 | import {useSelector} from "react-redux"; 4 | import useInterval from "../../../../../../../../Hooks/useInterval"; 5 | 6 | const Clock = () => { 7 | const type = useSelector((state) => state.exchange.dateType) 8 | const calendar = () => { 9 | switch (type) { 10 | case "Jalali": 11 | return moment().format("jYYYY/jMM/jDD - HH:mm:ss"); 12 | case "Hijri": 13 | return moment().format("YYYY/MM/DD - HH:mm:ss"); 14 | case "Georgian": 15 | return moment().format("iYYYY/iMM/iDD - HH:mm:ss"); 16 | default: 17 | return moment().format("YYYY/MM/DD - HH:mm:ss"); 18 | } 19 | }; 20 | 21 | const [time, setTime] = useState(calendar()) 22 | 23 | useInterval(() => { 24 | setTime(calendar()) 25 | }, 1000); 26 | 27 | return (<>{time}); 28 | }; 29 | 30 | export default Clock; 31 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Header/components/SettingsHeader/SettingsHeader.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {useLocation} from "react-router-dom"; 3 | import {useTranslation} from "react-i18next"; 4 | 5 | const SettingHeader = () => { 6 | const location = useLocation() 7 | const {t} = useTranslation() 8 | 9 | return

10 | {t("routes." + location.pathname)} 11 |

12 | } 13 | export default SettingHeader; -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Header/components/SettingsHeader/SettingsHeader.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opexdev/web-app/80f728ed33ff4787b717ae3ffc5c502186805791/src/main/Browser/Pages/UserPanel/Sections/Header/components/SettingsHeader/SettingsHeader.module.css -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/Header/components/WalletHeader/WalletHeader.module.css: -------------------------------------------------------------------------------- 1 | .border{ 2 | border-right: 0.1vh solid var(--orange); 3 | border-left: 0.1vh solid var(--orange); 4 | } -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/SubMenu/SubMenu.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 22%; 3 | height: 100%; 4 | /* height: 100vh;*/ 5 | /*background-color: #fcfeff;*/ 6 | /*right: 5%;*/ 7 | /*position: fixed;*/ 8 | } 9 | :global(.ltr) .container { 10 | /*left: 5%; 11 | right: initial;*/ 12 | } 13 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/SubMenu/components/MarketSubMenu/MarketSubMenu.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 100%; 3 | height: 100%; 4 | } 5 | .content { 6 | height: 100%; 7 | padding: 1.8vh 1vw; 8 | } 9 | 10 | .TitleFontSize { 11 | font-size: 1.5vw; 12 | margin: 1vh 0; 13 | } 14 | .UlMaxWidth { 15 | } 16 | .listBorder { 17 | border-top: 0.1vh solid var(--borderBottom); 18 | /*border-bottom: 0.1vh solid var(--borderBottom);*/ 19 | transition: border 0.4s; 20 | } 21 | 22 | .safariFlexSize :global(.accordion-header) { 23 | flex: 14; 24 | } 25 | .safariFlexSize :global(.accordion-body) { 26 | flex: 86; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/SubMenu/components/MarketSubMenu/components/MarketCard/MarketCard.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ScrollBar from "../../../../../../../../../../components/ScrollBar"; 3 | import MarketPairCard from "../MarketPairCard/MarketPairCard"; 4 | 5 | const MarketCard = ({type, ...props}) => { 6 | 7 | return ( 8 |
9 | 10 | {props.pairs.map((pair) => )} 11 | 12 |
13 | ); 14 | }; 15 | 16 | export default MarketCard; 17 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/SubMenu/components/MessagesSubMenu/MessagesSubMenu.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 100%; 3 | height: 100vh; 4 | } 5 | .content { 6 | height: 100%; 7 | padding: 1.8vh 1vw; 8 | } 9 | .safariFlexSize :global(.accordion-header) { 10 | flex: 14; 11 | } 12 | .safariFlexSize :global(.accordion-body) { 13 | flex: 86; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/SubMenu/components/MessagesSubMenu/components/MessagesCard/MessagesCard.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/Sections/SubMenu/components/MessagesSubMenu/components/NotifCard/NotifCard.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | height: 5vh; 3 | border-bottom: 0.1vh solid var(--textColor); 4 | } 5 | .notifTime { 6 | border-left: 0.1vh solid var(--black); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/Browser/Pages/UserPanel/UserPanel.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | top: 0; 3 | bottom: 0; 4 | position: absolute; 5 | } -------------------------------------------------------------------------------- /src/main/Mobile/Mobile.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {useLocation} from "react-router-dom"; 3 | 4 | const Mobile = () => { 5 | let location = useLocation(); 6 | const redirectURL = window.env.REACT_APP_MOBILE_URL + location?.pathname + location?.search 7 | window.location.replace(redirectURL); 8 | } 9 | export default Mobile; -------------------------------------------------------------------------------- /src/main/Mobile/Mobille.css: -------------------------------------------------------------------------------- 1 | @media (max-width: 480px) { 2 | 3 | html,body{ 4 | font-size: 3.3vw; 5 | line-height: 3.5vh; 6 | top: 0; 7 | bottom: 0; 8 | left: 0; 9 | right: 0; 10 | position: absolute; 11 | 12 | } 13 | 14 | } 15 | 16 | 17 | @media screen and (orientation: landscape) { 18 | .mobile-view { 19 | font-size: 1vw; 20 | line-height: 14vh; 21 | border: 0.4vw dotted #4a5eab; 22 | } 23 | .mobile-view img { 24 | width: 12vw; 25 | } 26 | .mobile-view h1 { 27 | padding: 5vh 0; 28 | } 29 | } -------------------------------------------------------------------------------- /src/main/main.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import {BrowserRouter as Router} from "react-router-dom"; 3 | import {isBrowser} from "react-device-detect"; 4 | import Browser from "./Browser/Browser"; 5 | import Mobile from "./Mobile/Mobile"; 6 | 7 | const Main = ({baseURL}) => { 8 | return {isBrowser ? : } 9 | }; 10 | 11 | export default Main; -------------------------------------------------------------------------------- /src/queries/hooks/useDepositTxs.js: -------------------------------------------------------------------------------- 1 | import {getDepositTxs} from "js-api-client"; 2 | import {useQuery} from "@tanstack/react-query"; 3 | 4 | export const useDepositTxs = (currency) => { 5 | return useQuery( 6 | ['depositTxs', currency], 7 | () => getDepositTxsFunc(currency), 8 | { 9 | retry: 1, 10 | staleTime: 5000, 11 | refetchInterval: 10000 12 | }); 13 | } 14 | 15 | const getDepositTxsFunc = async (currency) => { 16 | const {data} = await getDepositTxs(currency) 17 | return data; 18 | } -------------------------------------------------------------------------------- /src/queries/hooks/useGetAPIKeyList.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getAPIKeyList} from "js-api-client"; 3 | 4 | export const useGetAPIKeyList = () => { 5 | return useQuery( 6 | ['APIKeyList'], getAPIKeyListFunc, 7 | { 8 | retry: 1, 9 | initialData: [] 10 | }); 11 | } 12 | 13 | export const getAPIKeyListFunc = async () => { 14 | const {data} = await getAPIKeyList() 15 | return data; 16 | } -------------------------------------------------------------------------------- /src/queries/hooks/useGetBuyAndSellHistory.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getBuyAndSellHistory} from "js-api-client/client/txs"; 3 | 4 | export const useGetBuyAndSellHistory = (user_id, query) => { 5 | 6 | return useQuery( 7 | ['buyAndSellHistory', user_id, query.coin, query.category, query.endTime, query.startTime, query.limit, query.offset, query.ascendingByTime], 8 | () => getBuyAndSellHistoryFunc(user_id, query), 9 | { 10 | retry: 1, 11 | staleTime: 5000, 12 | refetchInterval: 10000, 13 | }); 14 | } 15 | 16 | const getBuyAndSellHistoryFunc = async (user_id, query) => { 17 | const {data} = await getBuyAndSellHistory(user_id, query) 18 | return data?.transactions; 19 | } 20 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetChartCandlesticks.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getChartData, parseCandleData} from "js-api-client"; 3 | 4 | export const useGetChartCandlesticks = (activePairSymbol, type = "Global", interval = "1d", limit = "200") => { 5 | return useQuery( 6 | ['candlesticks', activePairSymbol, type], 7 | () => getChartCandles(activePairSymbol, type, interval, limit), 8 | { 9 | initialData: [], 10 | refetchInterval: 30000, 11 | retry: 1, 12 | select: (data) => { 13 | if (type !== "Global") { 14 | data = data.sort((a, b) => a[0] - b[0]) 15 | } 16 | return parseCandleData(data) 17 | } 18 | }); 19 | } 20 | 21 | export const getChartCandles = async (activePairSymbol, type, interval, limit) => { 22 | const {data} = await getChartData(activePairSymbol, type, interval, limit) 23 | return data; 24 | } 25 | 26 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetCurrencyInfo.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getCurrencyInfo} from "js-api-client"; 3 | 4 | export const useGetCurrencyInfo = (currency) => { 5 | return useQuery( 6 | ['currencyInfo', currency], 7 | () => getCurrencyInfoFunc(currency), 8 | { 9 | select: (data) => data[0] 10 | } 11 | ); 12 | } 13 | 14 | const getCurrencyInfoFunc = async (currency) => { 15 | const {data} = await getCurrencyInfo(currency) 16 | return data; 17 | 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetDepositAddress.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getDepositAddress} from "js-api-client"; 3 | 4 | export const useGetDepositAddress = (currency, network) => { 5 | return useQuery( 6 | ['depositAddress', currency, network], 7 | () => getDepositAddressFunc(currency, network), 8 | { 9 | retry: 1, 10 | refetchOnMount: false, 11 | staleTime: 30*60*1000, 12 | }); 13 | } 14 | 15 | const getDepositAddressFunc = async (currency, network) => { 16 | const {data} = await getDepositAddress(currency, network) 17 | return data; 18 | } -------------------------------------------------------------------------------- /src/queries/hooks/useGetDepositHistory.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getBuyAndSellHistory, getDepositHistory, getWithdrawHistory} from "js-api-client/client/txs"; 3 | import axios from "axios"; 4 | import {useSelector} from "react-redux"; 5 | 6 | export const useGetDepositHistory = (query) => { 7 | 8 | const user_id = useSelector((state) => state.auth.id) 9 | 10 | return useQuery( 11 | ['depositHistory', user_id, query.currency, query.category, query.endTime, query.startTime, query.limit, query.offset, query.ascendingByTime], 12 | () => getDepositHistoryFunc(query), 13 | { 14 | retry: 1, 15 | staleTime: 5000, 16 | refetchInterval: 10000, 17 | }); 18 | } 19 | 20 | const getDepositHistoryFunc = async (query) => { 21 | const {data} = await getDepositHistory(query) 22 | return data; 23 | } 24 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetExchangeInfo.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getExchangeInfo} from "js-api-client"; 3 | 4 | export const useGetExchangeInfo = (interval) => { 5 | return useQuery( 6 | ['exchangeInfo', interval], 7 | () => getExchangeInfoFunc(interval), 8 | { 9 | staleTime: 5000, 10 | refetchInterval: 10000 11 | }); 12 | } 13 | 14 | const getExchangeInfoFunc = async (interval) => { 15 | const {data} = await getExchangeInfo(interval) 16 | return data; 17 | 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetFeeForSymbol.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getFeeForSymbol} from "js-api-client"; 3 | 4 | export const useGetFeeForSymbol = (symbol) => { 5 | return useQuery( 6 | ['UserAssets', symbol], 7 | () => getFeeForSymbolFunc(symbol), 8 | { 9 | staleTime: 5000, 10 | refetchInterval: 10000, 11 | }); 12 | } 13 | 14 | const getFeeForSymbolFunc = async (symbol) => { 15 | const {data} = await getFeeForSymbol(symbol) 16 | return data; 17 | 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetIPGOpenInvoice.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getIpgOpenInvoice} from "js-api-client"; 3 | 4 | export const useGetIpgOpenInvoice = () => { 5 | return useQuery( 6 | ['ipgOpen'], 7 | () => getIpgOpenInvoiceFunc(), 8 | { 9 | retry: 1 10 | }); 11 | } 12 | 13 | const getIpgOpenInvoiceFunc = async () => { 14 | const {data} = await getIpgOpenInvoice() 15 | return data 16 | } -------------------------------------------------------------------------------- /src/queries/hooks/useGetKycStatus.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getKycStatus} from "js-api-client"; 3 | 4 | export const useGetKycStatus = (enabled = false) => { 5 | return useQuery( 6 | ['KycStatus'], getKycStatusFunc, { 7 | enabled, 8 | retry: 1 9 | }); 10 | } 11 | 12 | export const getKycStatusFunc = async () => { 13 | const {data} = await getKycStatus() 14 | return data; 15 | } 16 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetLastPrices.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getLastPrices} from "js-api-client"; 3 | 4 | export const useGetLastPrices = () => { 5 | return useQuery( 6 | ['lastPrices'], getLastPricesFunc, 7 | { 8 | retry: 1, 9 | initialData: [], 10 | refetchInterval: 5000 11 | }); 12 | } 13 | 14 | export const getLastPricesFunc = async () => { 15 | const newPrices = {} 16 | const {data} = await getLastPrices() 17 | for (const price of data) { 18 | newPrices[price.symbol] = price.price 19 | } 20 | return newPrices; 21 | } -------------------------------------------------------------------------------- /src/queries/hooks/useGetMarketStats.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getMarketStats} from "js-api-client"; 3 | 4 | export const useGetMarketStats = (interval) => { 5 | return useQuery( 6 | ['marketStats', interval], 7 | () => getMarketStatsFunc(interval), 8 | { 9 | staleTime: 5000, 10 | refetchInterval: 10000 11 | 12 | }); 13 | } 14 | 15 | const getMarketStatsFunc = async (interval) => { 16 | const {data} = await getMarketStats(interval) 17 | return data; 18 | 19 | } 20 | 21 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetQuoteCurrencies.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getQuoteCurrencies} from "js-api-client"; 3 | 4 | export const useGetQuoteCurrencies = () => { 5 | return useQuery( 6 | ['quoteCurrencie'], 7 | () => getQuoteCurrenciesFunc()); 8 | } 9 | 10 | const getQuoteCurrenciesFunc = async () => { 11 | const {data} = await getQuoteCurrencies() 12 | return data; 13 | } 14 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetTransactionsHistory.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getTransactionsHistory} from "js-api-client"; 3 | 4 | export const useGetTransactionsHistory = (query) => { 5 | return useQuery( 6 | ['transactionsHistory', query.currency, query.category, query.endTime, query.startTime, query.limit, query.offset, query.ascendingByTime], 7 | () => getTransactionsHistoryFunc(query), 8 | { 9 | retry: 1, 10 | staleTime: 5000, 11 | refetchInterval: 10000, 12 | }); 13 | } 14 | 15 | const getTransactionsHistoryFunc = async (query) => { 16 | const {data} = await getTransactionsHistory(query) 17 | return data; 18 | } 19 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetUserAccount.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getUserAccount, parseWalletsResponse} from "js-api-client"; 3 | import {useSelector} from "react-redux"; 4 | 5 | export const useGetUserAccount = () => { 6 | const userId = useSelector((state) => state.auth.id) 7 | return useQuery(['userAccount', userId], () => getUserAccountFunc(userId), 8 | { 9 | retry: 1, 10 | refetchInterval: 10000 11 | } 12 | ); 13 | } 14 | 15 | export const getUserAccountFunc = async (userId) => { 16 | if (!userId) return null 17 | const params = new URLSearchParams(); 18 | params.append('timestamp', Date.now().toString()); 19 | const {data} = await getUserAccount() 20 | return parseWalletsResponse(data); 21 | } -------------------------------------------------------------------------------- /src/queries/hooks/useGetUserActiveSessions.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getActiveSessions} from "js-api-client"; 3 | 4 | export const useGetUserActiveSessions = () => { 5 | return useQuery( 6 | ['userActiveSessions'], () => getActiveSessionsFunc(),{ 7 | retry: 1, 8 | staleTime: 5000, 9 | refetchInterval: 10000, 10 | select: (data) => data.sort((a, b) => b.lastAccess - a.lastAccess) 11 | }); 12 | } 13 | 14 | export const getActiveSessionsFunc = async () => { 15 | const {data} = await getActiveSessions(); 16 | return data; 17 | } -------------------------------------------------------------------------------- /src/queries/hooks/useGetUserAssets.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getUserAssets} from "js-api-client"; 3 | 4 | export const useGetUserAssets = (quoteAsset) => { 5 | return useQuery( 6 | ['UserAssets', quoteAsset], 7 | () => getUserAssetsFunc(quoteAsset), 8 | { 9 | staleTime: 5000, 10 | refetchInterval: 10000, 11 | 12 | }); 13 | } 14 | 15 | const getUserAssetsFunc = async (quoteAsset) => { 16 | const {data} = await getUserAssets(quoteAsset) 17 | return data; 18 | 19 | } 20 | 21 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetUserAssetsEstimatedValue.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getUserAssetsEstimatedValue} from "js-api-client"; 3 | 4 | export const useGetUserAssetsEstimatedValue = (quoteAsset) => { 5 | return useQuery( 6 | ['marketStats', quoteAsset], 7 | () => getUserAssetsEstimatedValueFunc(quoteAsset), 8 | { 9 | staleTime: 5000, 10 | refetchInterval: 10000, 11 | }); 12 | } 13 | 14 | const getUserAssetsEstimatedValueFunc = async (quoteAsset) => { 15 | const {data} = await getUserAssetsEstimatedValue(quoteAsset) 16 | return data; 17 | 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/queries/hooks/useGetUserAttributes.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getUserAttributes} from "js-api-client"; 3 | 4 | export const useGetUserAttributes = (select) => { 5 | return useQuery( 6 | ['userAttributes'], () => getUserAttributesFunc(), { 7 | select, 8 | retry: 1, 9 | }); 10 | } 11 | 12 | export const getUserAttributesFunc = async () => { 13 | const {data} = await getUserAttributes(); 14 | return data; 15 | } -------------------------------------------------------------------------------- /src/queries/hooks/useGetUserOtpStatus.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {checkUserOtpConfigs} from "js-api-client"; 3 | 4 | 5 | const clientSecret = window.env.REACT_APP_CLIENT_SECRET 6 | const clientId = window.env.REACT_APP_CLIENT_ID 7 | 8 | 9 | export const useGetUserOtpStatus = (username) => { 10 | return useQuery(['userOTP'], 11 | () => checkUserOtpConfigsFunc(username), 12 | { 13 | retry: 1 14 | } 15 | ); 16 | } 17 | 18 | export const checkUserOtpConfigsFunc = async (username) => { 19 | const {data: {otp}} = await checkUserOtpConfigs(username, clientId, clientSecret) 20 | return otp 21 | } -------------------------------------------------------------------------------- /src/queries/hooks/useGetWithdrawHistory.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getBuyAndSellHistory, getWithdrawHistory} from "js-api-client/client/txs"; 3 | import {useSelector} from "react-redux"; 4 | import axios from "axios"; 5 | 6 | export const useGetWithdrawHistory = (query) => { 7 | 8 | const user_id = useSelector((state) => state.auth.id) 9 | 10 | return useQuery( 11 | ['withdrawHistory', user_id, query.currency, query.category, query.endTime, query.startTime, query.limit, query.offset, query.ascendingByTime], 12 | () => getWithdrawHistoryFunc(query), 13 | { 14 | retry: 1, 15 | staleTime: 5000, 16 | refetchInterval: 10000, 17 | }); 18 | } 19 | 20 | const getWithdrawHistoryFunc = async (query) => { 21 | const {data} = await getWithdrawHistory(query) 22 | return data; 23 | } 24 | -------------------------------------------------------------------------------- /src/queries/hooks/useIPGDeposit.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getIPGDeposit} from "js-api-client"; 3 | 4 | export const useIPGDeposit = () => { 5 | return useQuery( 6 | ['IPGDepositTxs'], getIPGDepositFunc, 7 | { 8 | retry: 1 9 | }); 10 | } 11 | 12 | const getIPGDepositFunc = async () => { 13 | const {data} = await getIPGDeposit() 14 | return data; 15 | } 16 | -------------------------------------------------------------------------------- /src/queries/hooks/useLastTrades.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getLastTrades} from "js-api-client"; 3 | 4 | export const useLastTrades = (symbol, onSuccess) => { 5 | return useQuery( 6 | ['lastTrades', symbol], 7 | () => getLastTradesFunc(symbol), 8 | { 9 | retry: 1, 10 | staleTime: 5000, 11 | refetchInterval: 10000, 12 | keepPreviousData: true, 13 | onSuccess 14 | }); 15 | } 16 | 17 | const getLastTradesFunc = async (symbol) => { 18 | const {data} = await getLastTrades(symbol) 19 | return data; 20 | } -------------------------------------------------------------------------------- /src/queries/hooks/useMyOpenOrders.js: -------------------------------------------------------------------------------- 1 | import {getOpenOrder} from "js-api-client"; 2 | import {useQuery} from "@tanstack/react-query"; 3 | import moment from "moment"; 4 | 5 | export const useMyOpenOrders = (symbol) => { 6 | return useQuery( 7 | ['openOrders', symbol], 8 | () => getOpenOrderFunc(symbol), 9 | { 10 | retry: 1, 11 | staleTime: 5000, 12 | refetchInterval: 10000, 13 | select: (data) => data.sort((a, b) => moment(b.time).unix() - moment(a.time).unix()) 14 | }); 15 | } 16 | 17 | 18 | const getOpenOrderFunc = async (symbol) => { 19 | const {data} = await getOpenOrder(symbol) 20 | return data; 21 | } -------------------------------------------------------------------------------- /src/queries/hooks/useMyOrderHistory.js: -------------------------------------------------------------------------------- 1 | import moment from "moment"; 2 | import {useQuery} from "@tanstack/react-query"; 3 | import {getOrdersHistory} from "js-api-client"; 4 | 5 | export const useMyOrderHistory = (symbol) => { 6 | return useQuery( 7 | ['orderHistory', symbol], 8 | () => getOrdersHistoryFunc(symbol), 9 | { 10 | retry: 1, 11 | staleTime: 5000, 12 | refetchInterval: 10000, 13 | select: (data) => data.sort((a, b) => moment(b.time).unix() - moment(a.time).unix()).slice(0, 25) 14 | }); 15 | } 16 | 17 | const getOrdersHistoryFunc = async (symbol) => { 18 | const {data} = await getOrdersHistory(symbol) 19 | return data; 20 | } -------------------------------------------------------------------------------- /src/queries/hooks/useMyTrades.js: -------------------------------------------------------------------------------- 1 | import moment from "moment"; 2 | import {useQuery} from "@tanstack/react-query"; 3 | import {getMyTrades} from "js-api-client"; 4 | 5 | export const useMyTrades = (symbol) => { 6 | return useQuery( 7 | ['myTrades', symbol], 8 | () => getMyTradesFunc(symbol), 9 | { 10 | retry: 1, 11 | staleTime: 5000, 12 | refetchInterval: 10000, 13 | select: (data) => data.sort((a, b) => moment(b.time).unix() - moment(a.time).unix()).slice(0, 25) 14 | }); 15 | } 16 | 17 | 18 | const getMyTradesFunc = async (symbol) => { 19 | const {data} = await getMyTrades(symbol) 20 | return data; 21 | } 22 | -------------------------------------------------------------------------------- /src/queries/hooks/useOrderBook.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getOrderBook} from "js-api-client"; 3 | 4 | export const useOrderBook = (symbol, onSuccess) => { 5 | return useQuery( 6 | ['orderBook', symbol], 7 | () => getOrderBookFunc(symbol), 8 | { 9 | retry: 2, 10 | staleTime: 5000, 11 | refetchInterval: 10000, 12 | keepPreviousData: true, 13 | onSuccess 14 | }); 15 | } 16 | 17 | 18 | const getOrderBookFunc = async (symbol) => { 19 | const {data} = await getOrderBook(symbol) 20 | return data; 21 | } 22 | -------------------------------------------------------------------------------- /src/queries/hooks/useOverview.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getOverview} from "js-api-client"; 3 | 4 | export const useOverview = (symbol, period, quote) => { 5 | return useQuery( 6 | ['overview', symbol, period, quote], 7 | () => getOverviewFunc(symbol, period, quote), 8 | { 9 | staleTime: 5000, 10 | refetchInterval: 10000, 11 | select: (data) => {return symbol ? data[0] : data}, 12 | }); 13 | } 14 | 15 | const getOverviewFunc = async (symbol, period, quote) => { 16 | const {data} = await getOverview(symbol, period, quote) 17 | return data; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/queries/hooks/useWithdrawTxs.js: -------------------------------------------------------------------------------- 1 | import {useQuery} from "@tanstack/react-query"; 2 | import {getWithdrawTxs} from "js-api-client"; 3 | 4 | export const useWithdrawTxs = (currency) => { 5 | return useQuery( 6 | ['withdrawTxs', currency], 7 | () => getWithdrawTxsFunc(currency), 8 | { 9 | retry: 1, 10 | staleTime: 5000, 11 | refetchInterval: 10000, 12 | }); 13 | } 14 | 15 | const getWithdrawTxsFunc = async (currency) => { 16 | const {data} = await getWithdrawTxs(currency) 17 | return data; 18 | } -------------------------------------------------------------------------------- /src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = (onPerfEntry) => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import("web-vitals").then(({getCLS, getFID, getFCP, getLCP, getTTFB}) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /src/setup/configs/configs.js: -------------------------------------------------------------------------------- 1 | export const defaultConfigs = { 2 | "logoUrl": "logo/url", 3 | "title": "Title", 4 | "description": "Description text", 5 | "defaultLanguage": "en", 6 | "supportedLanguages": [ 7 | "en" 8 | ], 9 | "defaultTheme": "DARK", 10 | "supportEmail": "supportEmail@gmail.com", 11 | "baseCurrency": "TUSDT", 12 | "dateType": "Hijri" 13 | } -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import "@testing-library/jest-dom"; 6 | -------------------------------------------------------------------------------- /src/store/actions/global.js: -------------------------------------------------------------------------------- 1 | import * as actionTypes from "./actionTypes"; 2 | 3 | export const setThemeInitiate = (theme, isLogin) => { 4 | return { 5 | type: actionTypes.SET_THEME_INITIATE, 6 | isLogin, 7 | theme, 8 | }; 9 | }; 10 | 11 | export const setTheme = (theme) => { 12 | return { 13 | type: actionTypes.SET_THEME, 14 | theme: theme.toUpperCase(), 15 | }; 16 | }; 17 | 18 | export const setLoading = (isLoading) => { 19 | return { 20 | type: actionTypes.SET_LOADING, 21 | isLoading, 22 | }; 23 | }; 24 | 25 | export const setError = (error) => { 26 | return { 27 | type: actionTypes.SET_ERROR, 28 | error, 29 | }; 30 | }; 31 | 32 | export const loadConfig = (token) => { 33 | return { 34 | type: actionTypes.LOAD_CONFIG, 35 | token 36 | }; 37 | }; 38 | 39 | export const setInfoMessage = (messageType, message) => { 40 | return { 41 | type: actionTypes.SET_INFO_MESSAGE, 42 | messageType, 43 | message, 44 | }; 45 | }; 46 | 47 | export const setMarketInterval = (interval) => { 48 | return { 49 | type: actionTypes.SET_MARKET_INTERVAL, 50 | interval, 51 | }; 52 | }; -------------------------------------------------------------------------------- /src/store/actions/index.js: -------------------------------------------------------------------------------- 1 | export { 2 | loadConfig, 3 | setLoading, 4 | setThemeInitiate, 5 | setTheme, 6 | setError, 7 | setInfoMessage, 8 | setMarketInterval, 9 | } from "./global"; 10 | 11 | export { 12 | setActivePair, 13 | setActivePairInitiate, 14 | setBuyOrder, 15 | setSellOrder, 16 | setBestBuyPrice, 17 | setBestSellPrice, 18 | setExchange, 19 | setLastPrice, 20 | setLastTradePrice, 21 | setIPG, 22 | setIPGInitiate, 23 | setVerifyEmailLock, 24 | setVerifyEmailLockInitiate, 25 | setExchangeConfigs 26 | 27 | } from "./exchange"; 28 | 29 | export { 30 | logout, 31 | setLogoutInitiate, 32 | setUserTokens, 33 | setUserTokensInitiate, 34 | setUserInfo, 35 | changeUserInfo, 36 | setUserAccountInfo, 37 | setUserAccountInfoInitiate, 38 | setKYCStatus, 39 | setKYCStatusInitiate, 40 | setUserConfig, 41 | getUserConfigsInitiate, 42 | setFavPair, 43 | setFavPairInitiate 44 | } from "./auth"; -------------------------------------------------------------------------------- /src/store/sagas/index.js: -------------------------------------------------------------------------------- 1 | import {takeEvery} from "redux-saga/effects"; 2 | import * as actionTypes from "../actions/actionTypes"; 3 | 4 | import {getExchangeLastPrice, loadConfig, setActivePair, setIPGLock, setThemeSaga, setVerifyEmailLock} from "./global"; 5 | 6 | import {getUserConfigs, getUserKYCStatus, logout, setFavPair, setUserTokens} from "./auth"; 7 | 8 | export function* watchGlobal() { 9 | yield takeEvery(actionTypes.LOGOUT_INITIATE, logout); 10 | yield takeEvery(actionTypes.LOAD_CONFIG, loadConfig); 11 | yield takeEvery(actionTypes.SET_THEME_INITIATE, setThemeSaga); 12 | yield takeEvery(actionTypes.SET_ACTIVE_PAIR_INITIATE, setActivePair); 13 | yield takeEvery(actionTypes.SET_USER_TOKENS_INITIATE, setUserTokens); 14 | yield takeEvery(actionTypes.SET_IPG_INITIATE, setIPGLock); 15 | yield takeEvery(actionTypes.SET_VERIFY_EMAIL_LOCK_INITIATE, setVerifyEmailLock); 16 | yield takeEvery(actionTypes.SET_KYC_STATUS_INITIATE, getUserKYCStatus); 17 | yield takeEvery(actionTypes.SET_LAST_PRICE_INITIATE, getExchangeLastPrice); 18 | yield takeEvery(actionTypes.SET_FAV_PAIR_INITIATE, setFavPair); 19 | yield takeEvery(actionTypes.GET_USER_CONFIGS_INITIATE, getUserConfigs); 20 | } 21 | --------------------------------------------------------------------------------