├── .editorconfig ├── .env ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierignore ├── .prettierrc ├── README.md ├── index.html ├── jsconfig.json ├── package-lock.json ├── package.json ├── public ├── _redirects ├── assets │ ├── background │ │ ├── overlay_1.svg │ │ ├── overlay_2.jpg │ │ ├── overlay_3.jpg │ │ └── overlay_4.jpg │ ├── cyan-blur.png │ ├── icons │ │ ├── app │ │ │ ├── ic_chrome.svg │ │ │ ├── ic_drive.svg │ │ │ ├── ic_dropbox.svg │ │ │ ├── ic_evernote.svg │ │ │ ├── ic_github.svg │ │ │ └── ic_onedrive.svg │ │ ├── auth │ │ │ ├── ic_amplify.svg │ │ │ ├── ic_auth0.svg │ │ │ ├── ic_firebase.svg │ │ │ └── ic_jwt.svg │ │ ├── brands │ │ │ ├── ic_brand_amazon.svg │ │ │ ├── ic_brand_hbo.svg │ │ │ ├── ic_brand_ibm.svg │ │ │ ├── ic_brand_lya.svg │ │ │ ├── ic_brand_netflix.svg │ │ │ └── ic_brand_spotify.svg │ │ ├── components │ │ │ ├── ic_accordion.svg │ │ │ ├── ic_alert.svg │ │ │ ├── ic_autocomplete.svg │ │ │ ├── ic_avatar.svg │ │ │ ├── ic_badge.svg │ │ │ ├── ic_breadcrumbs.svg │ │ │ ├── ic_buttons.svg │ │ │ ├── ic_checkbox.svg │ │ │ ├── ic_chip.svg │ │ │ ├── ic_colors.svg │ │ │ ├── ic_data_grid.svg │ │ │ ├── ic_dialog.svg │ │ │ ├── ic_extra_animate.svg │ │ │ ├── ic_extra_carousel.svg │ │ │ ├── ic_extra_chart.svg │ │ │ ├── ic_extra_copy_to_clipboard.svg │ │ │ ├── ic_extra_editor.svg │ │ │ ├── ic_extra_form_validation.svg │ │ │ ├── ic_extra_image.svg │ │ │ ├── ic_extra_label.svg │ │ │ ├── ic_extra_lightbox.svg │ │ │ ├── ic_extra_map.svg │ │ │ ├── ic_extra_markdown.svg │ │ │ ├── ic_extra_mega_menu.svg │ │ │ ├── ic_extra_multi_language.svg │ │ │ ├── ic_extra_navigation_bar.svg │ │ │ ├── ic_extra_organization_chart.svg │ │ │ ├── ic_extra_scroll.svg │ │ │ ├── ic_extra_scroll_progress.svg │ │ │ ├── ic_extra_snackbar.svg │ │ │ ├── ic_extra_text_max_line.svg │ │ │ ├── ic_extra_upload.svg │ │ │ ├── ic_grid.svg │ │ │ ├── ic_icons.svg │ │ │ ├── ic_list.svg │ │ │ ├── ic_menu.svg │ │ │ ├── ic_pagination.svg │ │ │ ├── ic_pickers.svg │ │ │ ├── ic_popover.svg │ │ │ ├── ic_progress.svg │ │ │ ├── ic_radio_button.svg │ │ │ ├── ic_rating.svg │ │ │ ├── ic_shadows.svg │ │ │ ├── ic_slider.svg │ │ │ ├── ic_stepper.svg │ │ │ ├── ic_switch.svg │ │ │ ├── ic_table.svg │ │ │ ├── ic_tabs.svg │ │ │ ├── ic_textfield.svg │ │ │ ├── ic_timeline.svg │ │ │ ├── ic_tooltip.svg │ │ │ ├── ic_transfer_list.svg │ │ │ ├── ic_tree_view.svg │ │ │ └── ic_typography.svg │ │ ├── empty │ │ │ ├── ic_cart.svg │ │ │ ├── ic_content.svg │ │ │ ├── ic_email_disabled.svg │ │ │ ├── ic_email_selected.svg │ │ │ ├── ic_folder_empty.svg │ │ │ └── ic_mail.svg │ │ ├── faqs │ │ │ ├── ic_account.svg │ │ │ ├── ic_assurances.svg │ │ │ ├── ic_delivery.svg │ │ │ ├── ic_package.svg │ │ │ ├── ic_payment.svg │ │ │ └── ic_refund.svg │ │ ├── files │ │ │ ├── ic_ai.svg │ │ │ ├── ic_audio.svg │ │ │ ├── ic_document.svg │ │ │ ├── ic_excel.svg │ │ │ ├── ic_file.svg │ │ │ ├── ic_folder.svg │ │ │ ├── ic_img.svg │ │ │ ├── ic_js.svg │ │ │ ├── ic_pdf.svg │ │ │ ├── ic_power_point.svg │ │ │ ├── ic_pts.svg │ │ │ ├── ic_txt.svg │ │ │ ├── ic_video.svg │ │ │ ├── ic_word.svg │ │ │ └── ic_zip.svg │ │ ├── glass │ │ │ ├── ic_glass_bag.png │ │ │ ├── ic_glass_buy.png │ │ │ ├── ic_glass_message.png │ │ │ └── ic_glass_users.png │ │ ├── home │ │ │ ├── ic_design.svg │ │ │ ├── ic_development.svg │ │ │ └── ic_make_brand.svg │ │ ├── navbar │ │ │ ├── ic_analytics.svg │ │ │ ├── ic_banking.svg │ │ │ ├── ic_blank.svg │ │ │ ├── ic_blog.svg │ │ │ ├── ic_booking.svg │ │ │ ├── ic_calendar.svg │ │ │ ├── ic_chat.svg │ │ │ ├── ic_dashboard.svg │ │ │ ├── ic_disabled.svg │ │ │ ├── ic_ecommerce.svg │ │ │ ├── ic_external.svg │ │ │ ├── ic_file.svg │ │ │ ├── ic_folder.svg │ │ │ ├── ic_invoice.svg │ │ │ ├── ic_job.svg │ │ │ ├── ic_kanban.svg │ │ │ ├── ic_label.svg │ │ │ ├── ic_lock.svg │ │ │ ├── ic_mail.svg │ │ │ ├── ic_menu_item.svg │ │ │ ├── ic_order.svg │ │ │ ├── ic_product.svg │ │ │ ├── ic_tour.svg │ │ │ └── ic_user.svg │ │ ├── notification │ │ │ ├── ic_chat.svg │ │ │ ├── ic_delivery.svg │ │ │ ├── ic_mail.svg │ │ │ └── ic_order.svg │ │ ├── platforms │ │ │ ├── ic_figma.svg │ │ │ ├── ic_js.svg │ │ │ ├── ic_nextjs.svg │ │ │ ├── ic_ts.svg │ │ │ └── ic_vite.svg │ │ └── setting │ │ │ ├── ic_align_left.svg │ │ │ ├── ic_align_right.svg │ │ │ ├── ic_collapse.svg │ │ │ ├── ic_contrast.svg │ │ │ ├── ic_contrast_bold.svg │ │ │ ├── ic_exit_full_screen.svg │ │ │ ├── ic_full_screen.svg │ │ │ ├── ic_moon.svg │ │ │ ├── ic_setting.svg │ │ │ └── ic_sun.svg │ ├── illustrations │ │ ├── characters │ │ │ ├── character_1.png │ │ │ ├── character_10.png │ │ │ ├── character_11.png │ │ │ ├── character_2.png │ │ │ ├── character_3.png │ │ │ ├── character_4.png │ │ │ ├── character_5.png │ │ │ ├── character_6.png │ │ │ ├── character_7.png │ │ │ ├── character_8.png │ │ │ └── character_9.png │ │ └── illustration_dashboard.png │ ├── images │ │ ├── about │ │ │ ├── hero.jpg │ │ │ ├── testimonials.jpg │ │ │ ├── vision.jpg │ │ │ ├── what_1.png │ │ │ └── what_2.png │ │ ├── contact │ │ │ └── hero.jpg │ │ ├── faqs │ │ │ └── hero.jpg │ │ └── home │ │ │ ├── clean │ │ │ ├── page_1.webp │ │ │ ├── page_10.webp │ │ │ ├── page_2.webp │ │ │ ├── page_3.webp │ │ │ ├── page_4.webp │ │ │ ├── page_5.webp │ │ │ ├── page_6.webp │ │ │ ├── page_7.webp │ │ │ ├── page_8.webp │ │ │ └── page_9.webp │ │ │ ├── darkmode.webp │ │ │ ├── for_designer.webp │ │ │ ├── hero │ │ │ ├── dark_1.webp │ │ │ ├── dark_2.webp │ │ │ ├── light_1.webp │ │ │ └── light_2.webp │ │ │ ├── presets │ │ │ ├── block_blue.webp │ │ │ ├── block_cyan.webp │ │ │ ├── block_default.webp │ │ │ ├── block_orange.webp │ │ │ ├── block_purple.webp │ │ │ ├── block_red.webp │ │ │ ├── chart_blue.webp │ │ │ ├── chart_cyan.webp │ │ │ ├── chart_default.webp │ │ │ ├── chart_orange.webp │ │ │ ├── chart_purple.webp │ │ │ ├── chart_red.webp │ │ │ ├── grid.webp │ │ │ ├── screen_blue.webp │ │ │ ├── screen_cyan.webp │ │ │ ├── screen_default.webp │ │ │ ├── screen_orange.webp │ │ │ ├── screen_purple.webp │ │ │ ├── screen_red.webp │ │ │ ├── sidebar_blue.webp │ │ │ ├── sidebar_cyan.webp │ │ │ ├── sidebar_default.webp │ │ │ ├── sidebar_orange.webp │ │ │ ├── sidebar_purple.webp │ │ │ └── sidebar_red.webp │ │ │ ├── rocket.webp │ │ │ └── zone_landing.webp │ ├── logo-mini.png │ ├── logo.png │ ├── logo_mini.png │ ├── placeholder.svg │ ├── red-blur.png │ └── transparent.png ├── favicon │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ └── favicon.ico ├── fonts │ ├── CircularStd-Bold.otf │ ├── CircularStd-Book.otf │ ├── CircularStd-Medium.otf │ ├── Roboto-Bold.ttf │ ├── Roboto-Regular.ttf │ └── index.css ├── logo │ ├── logo_full.svg │ ├── logo_single.png │ └── logo_single.svg ├── manifest.json └── robots.txt ├── setup_proxy.js ├── src ├── _mock │ ├── _blog.js │ ├── _calendar.js │ ├── _files.js │ ├── _invoice.js │ ├── _job.js │ ├── _mock.js │ ├── _order.js │ ├── _others.js │ ├── _overview.js │ ├── _product.js │ ├── _tour.js │ ├── _user.js │ ├── assets.js │ ├── index.js │ └── map │ │ ├── cities.js │ │ ├── countries.js │ │ └── map-style-basic-v8.json ├── app.jsx ├── assets │ ├── data │ │ ├── countries.js │ │ └── index.js │ ├── icons │ │ ├── email-inbox-icon.jsx │ │ ├── index.js │ │ ├── password-icon.jsx │ │ ├── plan-free-icon.jsx │ │ ├── plan-premium-icon.jsx │ │ ├── plan-starter-icon.jsx │ │ └── sent-icon.jsx │ ├── illustrations │ │ ├── avatar-shape.jsx │ │ ├── background-shape.jsx │ │ ├── booking-illustration.jsx │ │ ├── check-in-illustration.jsx │ │ ├── check-out-illustration.jsx │ │ ├── coming-soon-illustration.jsx │ │ ├── forbidden-illustration.jsx │ │ ├── index.js │ │ ├── maintenance-illustration.jsx │ │ ├── motivation-illustration.jsx │ │ ├── order-complete-illustration.jsx │ │ ├── page-not-found-illustration.jsx │ │ ├── seo-illustration.jsx │ │ ├── sever-error-illustration.jsx │ │ ├── upgrade-storage-illustration.jsx │ │ └── upload-illustration.jsx │ └── img │ │ ├── logo.png │ │ └── logo_mini.png ├── auth │ ├── context │ │ └── jwt │ │ │ ├── auth-consumer.jsx │ │ │ ├── auth-context.js │ │ │ ├── auth-provider.jsx │ │ │ ├── index.js │ │ │ └── utils.js │ ├── guard │ │ ├── auth-guard.jsx │ │ ├── guest-guard.jsx │ │ ├── index.js │ │ └── role-based-guard.jsx │ └── hooks │ │ ├── index.js │ │ └── use-auth-context.js ├── components │ ├── animate │ │ ├── index.js │ │ ├── motion-container.jsx │ │ ├── motion-lazy.jsx │ │ ├── motion-viewport.jsx │ │ └── variants │ │ │ ├── actions.js │ │ │ ├── background.js │ │ │ ├── bounce.js │ │ │ ├── container.js │ │ │ ├── fade.js │ │ │ ├── flip.js │ │ │ ├── index.js │ │ │ ├── path.js │ │ │ ├── rotate.js │ │ │ ├── scale.js │ │ │ ├── slide.js │ │ │ ├── transition.js │ │ │ └── zoom.js │ ├── chart │ │ ├── index.js │ │ └── use-chart.js │ ├── component-block.jsx │ ├── custom-popover │ │ ├── custom-popover.jsx │ │ ├── index.js │ │ ├── styles.js │ │ ├── use-popover.js │ │ └── utils.js │ ├── empty-content │ │ ├── empty-content.jsx │ │ └── index.js │ ├── file-thumbnail │ │ ├── download-button.jsx │ │ ├── file-thumbnail.jsx │ │ ├── index.js │ │ └── utils.js │ ├── hook-form │ │ ├── form-provider.jsx │ │ ├── index.js │ │ ├── rhf-select.jsx │ │ └── rhf-text-field.jsx │ ├── iconify │ │ ├── iconify.jsx │ │ └── index.js │ ├── label │ │ ├── index.js │ │ ├── label.jsx │ │ └── styles.js │ ├── loading-screen │ │ ├── index.js │ │ ├── loading-screen.jsx │ │ └── splash-screen.jsx │ ├── logo │ │ ├── index.js │ │ └── logo.jsx │ ├── nav-section │ │ ├── horizontal │ │ │ ├── index.js │ │ │ ├── nav-item.jsx │ │ │ ├── nav-list.jsx │ │ │ └── nav-section-horizontal.jsx │ │ ├── index.js │ │ ├── mini │ │ │ ├── index.js │ │ │ ├── nav-item.jsx │ │ │ ├── nav-list.jsx │ │ │ └── nav-section-mini.jsx │ │ └── vertical │ │ │ ├── index.js │ │ │ ├── nav-item.jsx │ │ │ ├── nav-list.jsx │ │ │ └── nav-section-vertical.jsx │ ├── progress-bar │ │ ├── index.js │ │ ├── progress-bar.jsx │ │ └── styles.jsx │ ├── scrollbar │ │ ├── index.js │ │ ├── scrollbar.jsx │ │ └── styles.js │ ├── search-not-found │ │ ├── index.js │ │ └── search-not-found.jsx │ ├── settings │ │ ├── context │ │ │ ├── index.js │ │ │ ├── settings-context.js │ │ │ └── settings-provider.jsx │ │ ├── drawer │ │ │ ├── base-option.jsx │ │ │ ├── fullscreen-option.jsx │ │ │ ├── index.js │ │ │ ├── layout-options.jsx │ │ │ ├── presets-options.jsx │ │ │ ├── settings-drawer.jsx │ │ │ └── stretch-options.jsx │ │ └── index.js │ ├── snackbar │ │ ├── index.js │ │ ├── snackbar-provider.jsx │ │ └── styles.js │ ├── svg-color │ │ ├── index.js │ │ └── svg-color.jsx │ └── table │ │ ├── index.js │ │ ├── table-empty-rows.jsx │ │ ├── table-head-custom.jsx │ │ ├── table-no-data.jsx │ │ ├── table-pagination-custom.jsx │ │ ├── table-selected-action.jsx │ │ ├── table-skeleton.jsx │ │ ├── use-table.js │ │ └── utils.js ├── config-global.js ├── global.css ├── hooks │ ├── use-boolean.js │ ├── use-event-listener.js │ ├── use-local-storage.js │ ├── use-mocked-user.js │ ├── use-off-set-top.js │ ├── use-responsive.js │ └── use-scroll-to-top.js ├── layouts │ ├── auth │ │ └── classic.jsx │ ├── common │ │ ├── account-popover.jsx │ │ ├── contacts-popover.jsx │ │ ├── header-shadow.jsx │ │ ├── header-simple.jsx │ │ ├── language-popover.jsx │ │ ├── nav-toggle-button.jsx │ │ ├── nav-upgrade.jsx │ │ ├── notifications-popover │ │ │ ├── index.jsx │ │ │ └── notification-item.jsx │ │ ├── searchbar │ │ │ ├── index.jsx │ │ │ ├── result-item.jsx │ │ │ └── utils.js │ │ └── settings-button.jsx │ ├── compact │ │ └── index.jsx │ ├── config-layout.js │ └── dashboard │ │ ├── config-navigation.jsx │ │ ├── header.jsx │ │ ├── index.jsx │ │ ├── main.jsx │ │ ├── nav-horizontal.jsx │ │ ├── nav-mini.jsx │ │ └── nav-vertical.jsx ├── main.jsx ├── pages │ ├── 404.jsx │ ├── auth │ │ └── jwt │ │ │ ├── login.jsx │ │ │ └── register.jsx │ └── dashboard │ │ ├── Address.jsx │ │ ├── CashOut.jsx │ │ ├── Dashboard.jsx │ │ ├── Profile.jsx │ │ ├── Transaction.jsx │ │ ├── User.jsx │ │ ├── Withdraw.jsx │ │ └── six.jsx ├── routes │ ├── components │ │ ├── index.js │ │ └── router-link.jsx │ ├── hooks │ │ ├── index.js │ │ ├── use-active-link.js │ │ ├── use-params.js │ │ ├── use-pathname.js │ │ ├── use-router.js │ │ └── use-search-params.js │ ├── paths.js │ └── sections │ │ ├── auth.jsx │ │ ├── dashboard.jsx │ │ ├── index.jsx │ │ └── main.jsx ├── sections │ ├── address │ │ ├── Table.jsx │ │ └── view.jsx │ ├── auth │ │ └── jwt │ │ │ ├── index.js │ │ │ ├── jwt-login-view.jsx │ │ │ └── jwt-register-view.jsx │ ├── cashout │ │ ├── Table.jsx │ │ └── view.jsx │ ├── dashboard │ │ ├── app-welcome.jsx │ │ ├── app-widget-summary.jsx │ │ └── view.jsx │ ├── error │ │ ├── 403-view.jsx │ │ ├── 500-view.jsx │ │ ├── index.js │ │ └── not-found-view.jsx │ ├── profile │ │ ├── Table.jsx │ │ └── View.jsx │ ├── six │ │ └── view.jsx │ ├── transaction │ │ ├── Table.jsx │ │ └── view.jsx │ ├── user │ │ ├── Table.jsx │ │ ├── UserModal.jsx │ │ ├── UserModal_.jsx │ │ └── view.jsx │ └── withdraw │ │ ├── Table.jsx │ │ └── view.jsx ├── theme │ ├── css.js │ ├── custom-shadows.js │ ├── index.jsx │ ├── options │ │ ├── contrast.js │ │ ├── presets.js │ │ └── right-to-left.jsx │ ├── overrides │ │ ├── components │ │ │ ├── accordion.js │ │ │ ├── alert.js │ │ │ ├── appbar.js │ │ │ ├── autocomplete.js │ │ │ ├── avatar.js │ │ │ ├── backdrop.js │ │ │ ├── badge.js │ │ │ ├── breadcrumbs.js │ │ │ ├── button-group.js │ │ │ ├── button.js │ │ │ ├── card.js │ │ │ ├── checkbox.js │ │ │ ├── chip.js │ │ │ ├── css-baseline.js │ │ │ ├── data-grid.js │ │ │ ├── date-picker.jsx │ │ │ ├── dialog.js │ │ │ ├── drawer.js │ │ │ ├── fab.js │ │ │ ├── list.js │ │ │ ├── loading-button.js │ │ │ ├── menu.js │ │ │ ├── pagination.js │ │ │ ├── paper.js │ │ │ ├── popover.js │ │ │ ├── progress.js │ │ │ ├── radio.js │ │ │ ├── rating.js │ │ │ ├── select.js │ │ │ ├── skeleton.js │ │ │ ├── slider.js │ │ │ ├── stepper.js │ │ │ ├── svg-icon.js │ │ │ ├── switch.js │ │ │ ├── table.js │ │ │ ├── tabs.js │ │ │ ├── textfield.js │ │ │ ├── timeline.js │ │ │ ├── toggle-button.js │ │ │ ├── tooltip.js │ │ │ ├── tree-view.js │ │ │ └── typography.js │ │ ├── default-props.jsx │ │ └── index.js │ ├── palette.js │ ├── shadows.js │ └── typography.js └── utils │ ├── axios.js │ ├── flatten-array.js │ ├── format-number.js │ ├── format-time.js │ ├── storage-available.js │ └── useUserData.js ├── vercel.json ├── vite.config.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = space 7 | indent_size = 2 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # HOST 2 | # VITE_HOST_API=https://api-dev-minimal-v510.vercel.app 3 | VITE_HOST_API=https://test.paycrypto.money/v2 4 | 5 | # ASSETS 6 | VITE_ASSETS_API=https://api-dev-minimal-v510.vercel.app 7 | 8 | # MAP 9 | VITE_MAPBOX_API= 10 | 11 | # FIREBASE 12 | VITE_FIREBASE_API_KEY= 13 | VITE_FIREBASE_AUTH_DOMAIN= 14 | VITE_FIREBASE_PROJECT_ID= 15 | VITE_FIREBASE_STORAGE_BUCKET= 16 | VITE_FIREBASE_MESSAGING_SENDER_ID= 17 | VITE_FIREBASE_APPID= 18 | 19 | # AWS AMPLIFY 20 | VITE_AWS_AMPLIFY_USER_POOL_ID= 21 | VITE_AWS_AMPLIFY_USER_POOL_WEB_CLIENT_ID= 22 | VITE_AWS_AMPLIFY_REGION= 23 | 24 | # AUTH0 25 | VITE_AUTH0_CALLBACK_URL= 26 | VITE_AUTH0_DOMAIN= 27 | VITE_AUTH0_CLIENT_ID= -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | // .eslintignore 2 | build/* 3 | dist/* 4 | public/* 5 | **/out/* 6 | **/node_modules/* 7 | 8 | **/.next/* 9 | next.config.js 10 | 11 | vite.config.js 12 | vite.config.ts 13 | 14 | src/reportWebVitals.js 15 | src/service-worker.js 16 | src/serviceWorkerRegistration.js 17 | src/setupTests.js 18 | 19 | src/reportWebVitals.ts 20 | src/service-worker.ts 21 | src/serviceWorkerRegistration.ts 22 | src/setupTests.ts 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | .pnp 6 | .pnp.js 7 | 8 | # testing 9 | coverage 10 | 11 | # production 12 | .next 13 | .swc 14 | _static 15 | out 16 | dist 17 | build 18 | 19 | # environment variables 20 | # .env 21 | .env.local 22 | .env.development.local 23 | .env.test.local 24 | .env.production.local 25 | 26 | # misc 27 | .DS_Store 28 | .vercel 29 | .netlify 30 | .unimportedrc.json 31 | tsconfig.tsbuildinfo 32 | .vscode 33 | 34 | npm-debug.log* 35 | yarn-debug.log* 36 | yarn-error.log* 37 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build/* 2 | dist/* 3 | public/* 4 | **/out/* 5 | **/.next/* 6 | **/node_modules/* 7 | 8 | package-lock.json 9 | yarn.lock 10 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true, 4 | "trailingComma": "es5", 5 | "tabWidth": 2 6 | } 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## NODE.JS 2 | 3 | - Node 16.x || 18.x 4 | 5 | ## USING YARN (Recommend) 6 | 7 | - yarn install 8 | - yarn dev 9 | 10 | ## USING NPM 11 | 12 | - npm i OR npm i --legacy-peer-deps 13 | - npm run dev 14 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "." 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /public/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 -------------------------------------------------------------------------------- /public/assets/background/overlay_1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/background/overlay_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/background/overlay_2.jpg -------------------------------------------------------------------------------- /public/assets/background/overlay_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/background/overlay_3.jpg -------------------------------------------------------------------------------- /public/assets/background/overlay_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/background/overlay_4.jpg -------------------------------------------------------------------------------- /public/assets/cyan-blur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/cyan-blur.png -------------------------------------------------------------------------------- /public/assets/icons/app/ic_chrome.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/assets/icons/app/ic_drive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/app/ic_dropbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/icons/app/ic_github.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/icons/app/ic_onedrive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/auth/ic_amplify.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/assets/icons/auth/ic_auth0.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/auth/ic_firebase.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /public/assets/icons/auth/ic_jwt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 11 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /public/assets/icons/brands/ic_brand_hbo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/icons/brands/ic_brand_lya.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/icons/brands/ic_brand_netflix.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_autocomplete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_avatar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_breadcrumbs.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_buttons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_checkbox.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_chip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_data_grid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_dialog.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_grid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_pagination.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_popover.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_progress.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_radio_button.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_shadows.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_slider.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_switch.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_table.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_textfield.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_timeline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_tooltip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/assets/icons/components/ic_tree_view.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/assets/icons/files/ic_file.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /public/assets/icons/files/ic_folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/glass/ic_glass_bag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/icons/glass/ic_glass_bag.png -------------------------------------------------------------------------------- /public/assets/icons/glass/ic_glass_buy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/icons/glass/ic_glass_buy.png -------------------------------------------------------------------------------- /public/assets/icons/glass/ic_glass_message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/icons/glass/ic_glass_message.png -------------------------------------------------------------------------------- /public/assets/icons/glass/ic_glass_users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/icons/glass/ic_glass_users.png -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_blank.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_blog.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_dashboard.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_disabled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_ecommerce.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_kanban.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_label.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_mail.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_menu_item.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_tour.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/platforms/ic_figma.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /public/assets/icons/platforms/ic_ts.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/setting/ic_collapse.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/setting/ic_contrast.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/setting/ic_contrast_bold.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/setting/ic_moon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/setting/ic_setting.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_1.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_10.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_11.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_2.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_3.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_4.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_5.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_6.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_7.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_8.png -------------------------------------------------------------------------------- /public/assets/illustrations/characters/character_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/characters/character_9.png -------------------------------------------------------------------------------- /public/assets/illustrations/illustration_dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/illustrations/illustration_dashboard.png -------------------------------------------------------------------------------- /public/assets/images/about/hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/about/hero.jpg -------------------------------------------------------------------------------- /public/assets/images/about/testimonials.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/about/testimonials.jpg -------------------------------------------------------------------------------- /public/assets/images/about/vision.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/about/vision.jpg -------------------------------------------------------------------------------- /public/assets/images/about/what_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/about/what_1.png -------------------------------------------------------------------------------- /public/assets/images/about/what_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/about/what_2.png -------------------------------------------------------------------------------- /public/assets/images/contact/hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/contact/hero.jpg -------------------------------------------------------------------------------- /public/assets/images/faqs/hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/faqs/hero.jpg -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_1.webp -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_10.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_10.webp -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_2.webp -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_3.webp -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_4.webp -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_5.webp -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_6.webp -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_7.webp -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_8.webp -------------------------------------------------------------------------------- /public/assets/images/home/clean/page_9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/clean/page_9.webp -------------------------------------------------------------------------------- /public/assets/images/home/darkmode.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/darkmode.webp -------------------------------------------------------------------------------- /public/assets/images/home/for_designer.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/for_designer.webp -------------------------------------------------------------------------------- /public/assets/images/home/hero/dark_1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/hero/dark_1.webp -------------------------------------------------------------------------------- /public/assets/images/home/hero/dark_2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/hero/dark_2.webp -------------------------------------------------------------------------------- /public/assets/images/home/hero/light_1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/hero/light_1.webp -------------------------------------------------------------------------------- /public/assets/images/home/hero/light_2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/hero/light_2.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/block_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/block_blue.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/block_cyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/block_cyan.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/block_default.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/block_default.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/block_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/block_orange.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/block_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/block_purple.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/block_red.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/block_red.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/chart_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/chart_blue.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/chart_cyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/chart_cyan.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/chart_default.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/chart_default.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/chart_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/chart_orange.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/chart_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/chart_purple.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/chart_red.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/chart_red.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/grid.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/grid.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/screen_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/screen_blue.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/screen_cyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/screen_cyan.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/screen_default.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/screen_default.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/screen_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/screen_orange.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/screen_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/screen_purple.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/screen_red.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/screen_red.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/sidebar_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/sidebar_blue.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/sidebar_cyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/sidebar_cyan.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/sidebar_default.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/sidebar_default.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/sidebar_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/sidebar_orange.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/sidebar_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/sidebar_purple.webp -------------------------------------------------------------------------------- /public/assets/images/home/presets/sidebar_red.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/presets/sidebar_red.webp -------------------------------------------------------------------------------- /public/assets/images/home/rocket.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/rocket.webp -------------------------------------------------------------------------------- /public/assets/images/home/zone_landing.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/images/home/zone_landing.webp -------------------------------------------------------------------------------- /public/assets/logo-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/logo-mini.png -------------------------------------------------------------------------------- /public/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/logo.png -------------------------------------------------------------------------------- /public/assets/logo_mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/logo_mini.png -------------------------------------------------------------------------------- /public/assets/placeholder.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/assets/red-blur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/red-blur.png -------------------------------------------------------------------------------- /public/assets/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/assets/transparent.png -------------------------------------------------------------------------------- /public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/favicon/favicon.ico -------------------------------------------------------------------------------- /public/fonts/CircularStd-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/fonts/CircularStd-Bold.otf -------------------------------------------------------------------------------- /public/fonts/CircularStd-Book.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/fonts/CircularStd-Book.otf -------------------------------------------------------------------------------- /public/fonts/CircularStd-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/fonts/CircularStd-Medium.otf -------------------------------------------------------------------------------- /public/fonts/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/fonts/Roboto-Bold.ttf -------------------------------------------------------------------------------- /public/fonts/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/fonts/Roboto-Regular.ttf -------------------------------------------------------------------------------- /public/fonts/index.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'CircularStd'; 3 | font-weight: 400; 4 | font-style: normal; 5 | src: local('CircularStd'), url('CircularStd-Book.otf') format('opentype'); 6 | } 7 | 8 | @font-face { 9 | font-family: 'CircularStd'; 10 | font-weight: 500; 11 | font-style: normal; 12 | src: local('CircularStd'), url('CircularStd-Medium.otf') format('opentype'); 13 | } 14 | 15 | @font-face { 16 | font-family: 'CircularStd'; 17 | font-weight: 700; 18 | font-style: normal; 19 | src: local('CircularStd'), url('CircularStd-Bold.otf') format('opentype'); 20 | } 21 | 22 | -------------------------------------------------------------------------------- /public/logo/logo_single.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/public/logo/logo_single.png -------------------------------------------------------------------------------- /public/logo/logo_single.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Minimal UI", 3 | "short_name": "Minimal UI", 4 | "display": "standalone", 5 | "start_url": "/", 6 | "theme_color": "#000000", 7 | "background_color": "#ffffff", 8 | "icons": [ 9 | { 10 | "src": "favicon/android-chrome-192x192.png", 11 | "sizes": "192x192", 12 | "type": "image/png" 13 | }, 14 | { 15 | "src": "favicon/android-chrome-512x512.png", 16 | "sizes": "512x512", 17 | "type": "image/png" 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /setup_proxy.js: -------------------------------------------------------------------------------- 1 | const { createProxyMiddleware } = require('http-proxy-middleware'); 2 | 3 | module.exports = function (app) { 4 | app.use( 5 | '/v2', 6 | createProxyMiddleware({ 7 | target: 'https://test.paycrypto.money', 8 | changeOrigin: true, 9 | secure: false, 10 | }) 11 | ); 12 | }; 13 | -------------------------------------------------------------------------------- /src/_mock/_blog.js: -------------------------------------------------------------------------------- 1 | export const POST_PUBLISH_OPTIONS = [ 2 | { 3 | value: 'published', 4 | label: 'Published', 5 | }, 6 | { 7 | value: 'draft', 8 | label: 'Draft', 9 | }, 10 | ]; 11 | 12 | export const POST_SORT_OPTIONS = [ 13 | { value: 'latest', label: 'Latest' }, 14 | { value: 'popular', label: 'Popular' }, 15 | { value: 'oldest', label: 'Oldest' }, 16 | ]; 17 | -------------------------------------------------------------------------------- /src/_mock/_calendar.js: -------------------------------------------------------------------------------- 1 | import { info, error, primary, success, warning, secondary } from 'src/theme/palette'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export const CALENDAR_COLOR_OPTIONS = [ 6 | primary.main, 7 | secondary.main, 8 | info.main, 9 | info.darker, 10 | success.main, 11 | warning.main, 12 | error.main, 13 | error.darker, 14 | ]; 15 | -------------------------------------------------------------------------------- /src/_mock/index.js: -------------------------------------------------------------------------------- 1 | export * from './assets'; 2 | export * from './_mock'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export * from './_job'; 7 | export * from './_user'; 8 | export * from './_tour'; 9 | export * from './_blog'; 10 | export * from './_files'; 11 | export * from './_order'; 12 | export * from './_others'; 13 | export * from './_invoice'; 14 | export * from './_product'; 15 | export * from './_overview'; 16 | export * from './_calendar'; 17 | -------------------------------------------------------------------------------- /src/app.jsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable perfectionist/sort-imports */ 2 | import 'src/global.css'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | import Router from 'src/routes/sections'; 7 | 8 | import ThemeProvider from 'src/theme'; 9 | 10 | import { useScrollToTop } from 'src/hooks/use-scroll-to-top'; 11 | 12 | import ProgressBar from 'src/components/progress-bar'; 13 | import { MotionLazy } from 'src/components/animate/motion-lazy'; 14 | import { SettingsDrawer, SettingsProvider } from 'src/components/settings'; 15 | 16 | import { AuthProvider } from 'src/auth/context/jwt'; 17 | 18 | // ---------------------------------------------------------------------- 19 | 20 | export default function App() { 21 | 22 | useScrollToTop(); 23 | 24 | return ( 25 | 26 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | ); 46 | } 47 | -------------------------------------------------------------------------------- /src/assets/data/index.js: -------------------------------------------------------------------------------- 1 | export * from './countries'; 2 | -------------------------------------------------------------------------------- /src/assets/icons/index.js: -------------------------------------------------------------------------------- 1 | export { default as SentIcon } from './sent-icon'; 2 | export { default as PasswordIcon } from './password-icon'; 3 | export { default as PlanFreeIcon } from './plan-free-icon'; 4 | export { default as EmailInboxIcon } from './email-inbox-icon'; 5 | export { default as PlanStarterIcon } from './plan-starter-icon'; 6 | export { default as PlanPremiumIcon } from './plan-premium-icon'; 7 | -------------------------------------------------------------------------------- /src/assets/illustrations/avatar-shape.jsx: -------------------------------------------------------------------------------- 1 | import { memo } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | import Box from '@mui/material/Box'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | function AvatarShape({ sx, ...other }) { 9 | return ( 10 | 23 | 28 | 29 | ); 30 | } 31 | 32 | AvatarShape.propTypes = { 33 | sx: PropTypes.object, 34 | }; 35 | 36 | export default memo(AvatarShape); 37 | -------------------------------------------------------------------------------- /src/assets/illustrations/background-shape.jsx: -------------------------------------------------------------------------------- 1 | import { memo } from 'react'; 2 | 3 | import { useTheme } from '@mui/material/styles'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | function BackgroundShape() { 8 | const theme = useTheme(); 9 | 10 | const PRIMARY_MAIN = theme.palette.primary.main; 11 | 12 | return ( 13 | <> 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | ); 29 | } 30 | 31 | export default memo(BackgroundShape); 32 | -------------------------------------------------------------------------------- /src/assets/illustrations/index.js: -------------------------------------------------------------------------------- 1 | export { default as AvatarShape } from './avatar-shape'; 2 | 3 | export { default as SeoIllustration } from './seo-illustration'; 4 | export { default as UploadIllustration } from './upload-illustration'; 5 | export { default as BookingIllustration } from './booking-illustration'; 6 | export { default as CheckInIllustration } from './check-in-illustration'; 7 | export { default as CheckoutIllustration } from './check-out-illustration'; 8 | export { default as ForbiddenIllustration } from './forbidden-illustration'; 9 | export { default as MotivationIllustration } from './motivation-illustration'; 10 | export { default as SeverErrorIllustration } from './sever-error-illustration'; 11 | export { default as ComingSoonIllustration } from './coming-soon-illustration'; 12 | export { default as MaintenanceIllustration } from './maintenance-illustration'; 13 | export { default as PageNotFoundIllustration } from './page-not-found-illustration'; 14 | export { default as OrderCompleteIllustration } from './order-complete-illustration'; 15 | export { default as UpgradeStorageIllustration } from './upgrade-storage-illustration'; 16 | -------------------------------------------------------------------------------- /src/assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/src/assets/img/logo.png -------------------------------------------------------------------------------- /src/assets/img/logo_mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smartcoder0402/react-paycrypto-dashboard/40ee007e7dcd30614a9492f64bd1ff2daaa7ce71/src/assets/img/logo_mini.png -------------------------------------------------------------------------------- /src/auth/context/jwt/auth-consumer.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import { SplashScreen } from 'src/components/loading-screen'; 4 | 5 | import { AuthContext } from './auth-context'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | export function AuthConsumer({ children }) { 10 | return ( 11 | 12 | {(auth) => (auth.loading ? : children)} 13 | 14 | ); 15 | } 16 | 17 | AuthConsumer.propTypes = { 18 | children: PropTypes.node, 19 | }; 20 | -------------------------------------------------------------------------------- /src/auth/context/jwt/auth-context.js: -------------------------------------------------------------------------------- 1 | import { createContext } from 'react'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export const AuthContext = createContext({}); 6 | -------------------------------------------------------------------------------- /src/auth/context/jwt/index.js: -------------------------------------------------------------------------------- 1 | export { AuthContext } from './auth-context'; 2 | export { AuthConsumer } from './auth-consumer'; 3 | export { AuthProvider } from './auth-provider'; 4 | -------------------------------------------------------------------------------- /src/auth/guard/guest-guard.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { useEffect, useCallback } from 'react'; 3 | 4 | import { paths } from 'src/routes/paths'; 5 | import { useRouter, useSearchParams } from 'src/routes/hooks'; 6 | 7 | import { SplashScreen } from 'src/components/loading-screen'; 8 | 9 | import { useAuthContext } from '../hooks'; 10 | 11 | // ---------------------------------------------------------------------- 12 | 13 | export default function GuestGuard({ children }) { 14 | const { loading } = useAuthContext(); 15 | 16 | return <>{loading ? : {children}}; 17 | } 18 | 19 | GuestGuard.propTypes = { 20 | children: PropTypes.node, 21 | }; 22 | 23 | // ---------------------------------------------------------------------- 24 | 25 | function Container({ children }) { 26 | const router = useRouter(); 27 | 28 | const searchParams = useSearchParams(); 29 | 30 | const returnTo = searchParams.get('returnTo') || paths.dashboard.root; 31 | 32 | const { authenticated } = useAuthContext(); 33 | 34 | const check = useCallback(() => { 35 | if (authenticated) { 36 | router.replace(returnTo); 37 | } 38 | }, [authenticated, returnTo, router]); 39 | 40 | useEffect(() => { 41 | check(); 42 | }, [check]); 43 | 44 | return <>{children}; 45 | } 46 | 47 | Container.propTypes = { 48 | children: PropTypes.node, 49 | }; 50 | -------------------------------------------------------------------------------- /src/auth/guard/index.js: -------------------------------------------------------------------------------- 1 | export { default as AuthGuard } from './auth-guard'; 2 | export { default as GuestGuard } from './guest-guard'; 3 | export { default as RoleBasedGuard } from './role-based-guard'; 4 | -------------------------------------------------------------------------------- /src/auth/hooks/index.js: -------------------------------------------------------------------------------- 1 | export { useAuthContext } from './use-auth-context'; 2 | -------------------------------------------------------------------------------- /src/auth/hooks/use-auth-context.js: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | 3 | import { AuthContext } from '../context/jwt/auth-context'; 4 | 5 | export const useAuthContext = () => { 6 | const context = useContext(AuthContext); 7 | 8 | if (!context) throw new Error('useAuthContext context must be use inside AuthProvider'); 9 | 10 | return context; 11 | }; 12 | -------------------------------------------------------------------------------- /src/components/animate/index.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export * from './variants'; 4 | 5 | export { default as MotionViewport } from './motion-viewport'; 6 | export { default as MotionContainer } from './motion-container'; 7 | -------------------------------------------------------------------------------- /src/components/animate/motion-container.jsx: -------------------------------------------------------------------------------- 1 | import { m } from 'framer-motion'; 2 | import PropTypes from 'prop-types'; 3 | 4 | import Box from '@mui/material/Box'; 5 | 6 | import { varContainer } from './variants'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | export default function MotionContainer({ animate, action = false, children, ...other }) { 11 | if (action) { 12 | return ( 13 | 20 | {children} 21 | 22 | ); 23 | } 24 | 25 | return ( 26 | 34 | {children} 35 | 36 | ); 37 | } 38 | 39 | MotionContainer.propTypes = { 40 | action: PropTypes.bool, 41 | animate: PropTypes.bool, 42 | children: PropTypes.node, 43 | }; 44 | -------------------------------------------------------------------------------- /src/components/animate/motion-lazy.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { m, domMax, LazyMotion } from 'framer-motion'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function MotionLazy({ children }) { 7 | return ( 8 | 9 | {children} 10 | 11 | ); 12 | } 13 | 14 | MotionLazy.propTypes = { 15 | children: PropTypes.node, 16 | }; 17 | -------------------------------------------------------------------------------- /src/components/animate/motion-viewport.jsx: -------------------------------------------------------------------------------- 1 | import { m } from 'framer-motion'; 2 | import PropTypes from 'prop-types'; 3 | 4 | import Box from '@mui/material/Box'; 5 | 6 | import { useResponsive } from 'src/hooks/use-responsive'; 7 | 8 | import { varContainer } from './variants'; 9 | 10 | // ---------------------------------------------------------------------- 11 | 12 | export default function MotionViewport({ children, disableAnimatedMobile = true, ...other }) { 13 | const smDown = useResponsive('down', 'sm'); 14 | 15 | if (smDown && disableAnimatedMobile) { 16 | return {children}; 17 | } 18 | 19 | return ( 20 | 28 | {children} 29 | 30 | ); 31 | } 32 | 33 | MotionViewport.propTypes = { 34 | children: PropTypes.node, 35 | disableAnimatedMobile: PropTypes.bool, 36 | }; 37 | -------------------------------------------------------------------------------- /src/components/animate/variants/actions.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const varHover = (hover = 1.09, tap = 0.97) => ({ 4 | hover: { scale: hover }, 5 | tap: { scale: tap }, 6 | }); 7 | -------------------------------------------------------------------------------- /src/components/animate/variants/container.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const varContainer = (props) => { 4 | const staggerIn = props?.staggerIn || 0.05; 5 | const delayIn = props?.staggerIn || 0.05; 6 | const staggerOut = props?.staggerIn || 0.05; 7 | 8 | return { 9 | animate: { 10 | transition: { 11 | staggerChildren: staggerIn, 12 | delayChildren: delayIn, 13 | }, 14 | }, 15 | exit: { 16 | transition: { 17 | staggerChildren: staggerOut, 18 | staggerDirection: -1, 19 | }, 20 | }, 21 | }; 22 | }; 23 | -------------------------------------------------------------------------------- /src/components/animate/variants/index.js: -------------------------------------------------------------------------------- 1 | export * from './path'; 2 | export * from './fade'; 3 | export * from './zoom'; 4 | export * from './flip'; 5 | export * from './slide'; 6 | export * from './scale'; 7 | export * from './bounce'; 8 | export * from './rotate'; 9 | export * from './actions'; 10 | export * from './container'; 11 | export * from './transition'; 12 | export * from './background'; 13 | -------------------------------------------------------------------------------- /src/components/animate/variants/path.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const TRANSITION = { 4 | duration: 2, 5 | ease: [0.43, 0.13, 0.23, 0.96], 6 | }; 7 | 8 | export const varPath = { 9 | animate: { 10 | fillOpacity: [0, 0, 1], 11 | pathLength: [1, 0.4, 0], 12 | transition: TRANSITION, 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /src/components/animate/variants/rotate.js: -------------------------------------------------------------------------------- 1 | import { varTranExit, varTranEnter } from './transition'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export const varRotate = (props) => { 6 | const durationIn = props?.durationIn; 7 | const durationOut = props?.durationOut; 8 | const easeIn = props?.easeIn; 9 | const easeOut = props?.easeOut; 10 | 11 | return { 12 | // IN 13 | in: { 14 | initial: { opacity: 0, rotate: -360 }, 15 | animate: { 16 | opacity: 1, 17 | rotate: 0, 18 | transition: varTranEnter({ durationIn, easeIn }), 19 | }, 20 | exit: { 21 | opacity: 0, 22 | rotate: -360, 23 | transition: varTranExit({ durationOut, easeOut }), 24 | }, 25 | }, 26 | 27 | // OUT 28 | out: { 29 | initial: { opacity: 1, rotate: 0 }, 30 | animate: { 31 | opacity: 0, 32 | rotate: -360, 33 | transition: varTranExit({ durationOut, easeOut }), 34 | }, 35 | }, 36 | }; 37 | }; 38 | -------------------------------------------------------------------------------- /src/components/animate/variants/scale.js: -------------------------------------------------------------------------------- 1 | import { varTranExit, varTranEnter } from './transition'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export const varScale = (props) => { 6 | const durationIn = props?.durationIn; 7 | const durationOut = props?.durationOut; 8 | const easeIn = props?.easeIn; 9 | const easeOut = props?.easeOut; 10 | 11 | return { 12 | // IN 13 | inX: { 14 | initial: { scaleX: 0, opacity: 0 }, 15 | animate: { 16 | scaleX: 1, 17 | opacity: 1, 18 | transition: varTranEnter({ durationIn, easeIn }), 19 | }, 20 | exit: { 21 | scaleX: 0, 22 | opacity: 0, 23 | transition: varTranExit({ durationOut, easeOut }), 24 | }, 25 | }, 26 | inY: { 27 | initial: { scaleY: 0, opacity: 0 }, 28 | animate: { 29 | scaleY: 1, 30 | opacity: 1, 31 | transition: varTranEnter({ durationIn, easeIn }), 32 | }, 33 | exit: { 34 | scaleY: 0, 35 | opacity: 0, 36 | transition: varTranExit({ durationOut, easeOut }), 37 | }, 38 | }, 39 | 40 | // OUT 41 | outX: { 42 | initial: { scaleX: 1, opacity: 1 }, 43 | animate: { 44 | scaleX: 0, 45 | opacity: 0, 46 | transition: varTranEnter({ durationIn, easeIn }), 47 | }, 48 | }, 49 | outY: { 50 | initial: { scaleY: 1, opacity: 1 }, 51 | animate: { 52 | scaleY: 0, 53 | opacity: 0, 54 | transition: varTranEnter({ durationIn, easeIn }), 55 | }, 56 | }, 57 | }; 58 | }; 59 | -------------------------------------------------------------------------------- /src/components/animate/variants/transition.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const varTranHover = (props) => { 4 | const duration = props?.duration || 0.32; 5 | const ease = props?.ease || [0.43, 0.13, 0.23, 0.96]; 6 | 7 | return { duration, ease }; 8 | }; 9 | 10 | export const varTranEnter = (props) => { 11 | const duration = props?.durationIn || 0.64; 12 | const ease = props?.easeIn || [0.43, 0.13, 0.23, 0.96]; 13 | 14 | return { duration, ease }; 15 | }; 16 | 17 | export const varTranExit = (props) => { 18 | const duration = props?.durationOut || 0.48; 19 | const ease = props?.easeOut || [0.43, 0.13, 0.23, 0.96]; 20 | 21 | return { duration, ease }; 22 | }; 23 | -------------------------------------------------------------------------------- /src/components/chart/index.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | // export { default } from './chart'; 4 | 5 | export { default as useChart } from './use-chart'; 6 | -------------------------------------------------------------------------------- /src/components/component-block.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import Paper from '@mui/material/Paper'; 4 | import Stack from '@mui/material/Stack'; 5 | import { alpha } from '@mui/material/styles'; 6 | import CardHeader from '@mui/material/CardHeader'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | export default function ComponentBlock({ title, sx, children, ...other }) { 11 | return ( 12 | alpha(theme.palette.grey[500], 0.04), 18 | }} 19 | > 20 | {title && } 21 | 22 | 35 | {children} 36 | 37 | 38 | ); 39 | } 40 | 41 | ComponentBlock.propTypes = { 42 | children: PropTypes.node, 43 | sx: PropTypes.object, 44 | title: PropTypes.string, 45 | }; 46 | -------------------------------------------------------------------------------- /src/components/custom-popover/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './custom-popover'; 2 | 3 | export { default as usePopover } from './use-popover'; 4 | -------------------------------------------------------------------------------- /src/components/custom-popover/use-popover.js: -------------------------------------------------------------------------------- 1 | import { useState, useCallback } from 'react'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export default function usePopover() { 6 | const [open, setOpen] = useState(null); 7 | 8 | const onOpen = useCallback((event) => { 9 | setOpen(event.currentTarget); 10 | }, []); 11 | 12 | const onClose = useCallback(() => { 13 | setOpen(null); 14 | }, []); 15 | 16 | return { 17 | open, 18 | onOpen, 19 | onClose, 20 | setOpen, 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /src/components/empty-content/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './empty-content'; 2 | -------------------------------------------------------------------------------- /src/components/file-thumbnail/download-button.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import { useTheme } from '@mui/material/styles'; 4 | import IconButton from '@mui/material/IconButton'; 5 | 6 | import { bgBlur } from 'src/theme/css'; 7 | 8 | import Iconify from '../iconify'; 9 | 10 | // ---------------------------------------------------------------------- 11 | 12 | export default function DownloadButton({ onDownload }) { 13 | const theme = useTheme(); 14 | 15 | return ( 16 | 42 | 43 | 44 | ); 45 | } 46 | 47 | DownloadButton.propTypes = { 48 | onDownload: PropTypes.func, 49 | }; 50 | -------------------------------------------------------------------------------- /src/components/file-thumbnail/index.js: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | 3 | export { default } from './file-thumbnail'; 4 | 5 | export { default as DownloadButton } from './download-button'; 6 | -------------------------------------------------------------------------------- /src/components/hook-form/form-provider.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { FormProvider as Form } from 'react-hook-form'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function FormProvider({ children, onSubmit, methods }) { 7 | return ( 8 |
9 | {children}
10 | 11 | ); 12 | } 13 | 14 | FormProvider.propTypes = { 15 | children: PropTypes.node, 16 | methods: PropTypes.object, 17 | onSubmit: PropTypes.func, 18 | }; 19 | -------------------------------------------------------------------------------- /src/components/hook-form/index.js: -------------------------------------------------------------------------------- 1 | export * from './rhf-select'; 2 | export { default } from './form-provider'; 3 | 4 | export { default as RHFTextField } from './rhf-text-field'; 5 | -------------------------------------------------------------------------------- /src/components/hook-form/rhf-text-field.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { Controller, useFormContext } from 'react-hook-form'; 3 | 4 | import TextField from '@mui/material/TextField'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | export default function RHFTextField({ name, helperText, type, ...other }) { 9 | const { control } = useFormContext(); 10 | 11 | return ( 12 | ( 16 | { 22 | if (type === 'number') { 23 | field.onChange(Number(event.target.value)); 24 | } else { 25 | field.onChange(event.target.value); 26 | } 27 | }} 28 | error={!!error} 29 | helperText={error ? error?.message : helperText} 30 | {...other} 31 | /> 32 | )} 33 | /> 34 | ); 35 | } 36 | 37 | RHFTextField.propTypes = { 38 | helperText: PropTypes.object, 39 | name: PropTypes.string, 40 | type: PropTypes.string, 41 | }; 42 | -------------------------------------------------------------------------------- /src/components/iconify/iconify.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { forwardRef } from 'react'; 3 | import { Icon } from '@iconify/react'; 4 | 5 | import Box from '@mui/material/Box'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | const Iconify = forwardRef(({ icon, width = 20, sx, ...other }, ref) => ( 10 | 18 | )); 19 | 20 | Iconify.propTypes = { 21 | icon: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), 22 | sx: PropTypes.object, 23 | width: PropTypes.number, 24 | }; 25 | 26 | export default Iconify; 27 | -------------------------------------------------------------------------------- /src/components/iconify/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './iconify'; 2 | -------------------------------------------------------------------------------- /src/components/label/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './label'; 2 | -------------------------------------------------------------------------------- /src/components/loading-screen/index.js: -------------------------------------------------------------------------------- 1 | export { default as SplashScreen } from './splash-screen'; 2 | export { default as LoadingScreen } from './loading-screen'; 3 | -------------------------------------------------------------------------------- /src/components/loading-screen/loading-screen.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import Box from '@mui/material/Box'; 4 | import LinearProgress from '@mui/material/LinearProgress'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | export default function LoadingScreen({ sx, ...other }) { 9 | return ( 10 | 23 | 24 | 25 | ); 26 | } 27 | 28 | LoadingScreen.propTypes = { 29 | sx: PropTypes.object, 30 | }; 31 | -------------------------------------------------------------------------------- /src/components/logo/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './logo'; 2 | -------------------------------------------------------------------------------- /src/components/nav-section/horizontal/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './nav-section-horizontal'; 2 | -------------------------------------------------------------------------------- /src/components/nav-section/horizontal/nav-section-horizontal.jsx: -------------------------------------------------------------------------------- 1 | import { memo } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | import Stack from '@mui/material/Stack'; 5 | 6 | import NavList from './nav-list'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | function NavSectionHorizontal({ data, slotProps, sx, ...other }) { 11 | return ( 12 | 24 | {data.map((group, index) => ( 25 | 26 | ))} 27 | 28 | ); 29 | } 30 | 31 | NavSectionHorizontal.propTypes = { 32 | data: PropTypes.array, 33 | sx: PropTypes.object, 34 | slotProps: PropTypes.object, 35 | }; 36 | 37 | export default memo(NavSectionHorizontal); 38 | 39 | // ---------------------------------------------------------------------- 40 | 41 | function Group({ items, slotProps }) { 42 | return ( 43 | <> 44 | {items.map((list) => ( 45 | 46 | ))} 47 | 48 | ); 49 | } 50 | 51 | Group.propTypes = { 52 | items: PropTypes.array, 53 | slotProps: PropTypes.object, 54 | }; 55 | -------------------------------------------------------------------------------- /src/components/nav-section/index.js: -------------------------------------------------------------------------------- 1 | export { default as NavSectionMini } from './mini'; 2 | export { default as NavSectionVertical } from './vertical'; 3 | export { default as NavSectionHorizontal } from './horizontal'; 4 | -------------------------------------------------------------------------------- /src/components/nav-section/mini/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './nav-section-mini'; 2 | -------------------------------------------------------------------------------- /src/components/nav-section/mini/nav-section-mini.jsx: -------------------------------------------------------------------------------- 1 | import { memo } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | import Stack from '@mui/material/Stack'; 5 | 6 | import NavList from './nav-list'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | function NavSectionMini({ data, slotProps, ...other }) { 11 | return ( 12 | 13 | {data.map((group, index) => ( 14 | 15 | ))} 16 | 17 | ); 18 | } 19 | 20 | NavSectionMini.propTypes = { 21 | data: PropTypes.array, 22 | slotProps: PropTypes.object, 23 | }; 24 | 25 | export default memo(NavSectionMini); 26 | 27 | // ---------------------------------------------------------------------- 28 | 29 | function Group({ items, slotProps }) { 30 | return ( 31 | <> 32 | {items.map((list) => ( 33 | 34 | ))} 35 | 36 | ); 37 | } 38 | 39 | Group.propTypes = { 40 | items: PropTypes.array, 41 | slotProps: PropTypes.object, 42 | }; 43 | -------------------------------------------------------------------------------- /src/components/nav-section/vertical/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './nav-section-vertical'; 2 | -------------------------------------------------------------------------------- /src/components/progress-bar/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './progress-bar'; 2 | 3 | export { default as StyledProgressBar } from './styles'; 4 | -------------------------------------------------------------------------------- /src/components/progress-bar/progress-bar.jsx: -------------------------------------------------------------------------------- 1 | import NProgress from 'nprogress'; 2 | import { useState, useEffect } from 'react'; 3 | 4 | import { usePathname } from 'src/routes/hooks'; 5 | 6 | import StyledProgressBar from './styles'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | export default function ProgressBar() { 11 | const pathname = usePathname(); 12 | 13 | const [mounted, setMounted] = useState(false); 14 | 15 | const [visible, setVisible] = useState(false); 16 | 17 | useEffect(() => { 18 | setMounted(true); 19 | }, []); 20 | 21 | useEffect(() => { 22 | if (!visible) { 23 | NProgress.start(); 24 | setVisible(true); 25 | } 26 | 27 | if (visible) { 28 | NProgress.done(); 29 | setVisible(false); 30 | } 31 | 32 | if (!visible && mounted) { 33 | setVisible(false); 34 | NProgress.done(); 35 | } 36 | 37 | return () => { 38 | NProgress.done(); 39 | }; 40 | // eslint-disable-next-line react-hooks/exhaustive-deps 41 | }, [pathname, mounted]); 42 | 43 | if (!mounted) { 44 | return null; 45 | } 46 | 47 | return ; 48 | } 49 | -------------------------------------------------------------------------------- /src/components/progress-bar/styles.jsx: -------------------------------------------------------------------------------- 1 | import { useTheme } from '@mui/material/styles'; 2 | import GlobalStyles from '@mui/material/GlobalStyles'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function StyledProgressBar() { 7 | const theme = useTheme(); 8 | 9 | const inputGlobalStyles = ( 10 | 37 | ); 38 | 39 | return inputGlobalStyles; 40 | } 41 | -------------------------------------------------------------------------------- /src/components/scrollbar/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './scrollbar'; 2 | -------------------------------------------------------------------------------- /src/components/scrollbar/scrollbar.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { memo, forwardRef } from 'react'; 3 | 4 | import Box from '@mui/material/Box'; 5 | 6 | import { StyledScrollbar, StyledRootScrollbar } from './styles'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | const Scrollbar = forwardRef(({ children, sx, ...other }, ref) => { 11 | const userAgent = typeof navigator === 'undefined' ? 'SSR' : navigator.userAgent; 12 | 13 | const mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent); 14 | 15 | if (mobile) { 16 | return ( 17 | 18 | {children} 19 | 20 | ); 21 | } 22 | 23 | return ( 24 | 25 | 33 | {children} 34 | 35 | 36 | ); 37 | }); 38 | 39 | Scrollbar.propTypes = { 40 | children: PropTypes.node, 41 | sx: PropTypes.object, 42 | }; 43 | 44 | export default memo(Scrollbar); 45 | -------------------------------------------------------------------------------- /src/components/scrollbar/styles.js: -------------------------------------------------------------------------------- 1 | import SimpleBar from 'simplebar-react'; 2 | 3 | import { alpha, styled } from '@mui/material/styles'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export const StyledRootScrollbar = styled('div')(() => ({ 8 | flexGrow: 1, 9 | height: '100%', 10 | overflow: 'hidden', 11 | })); 12 | 13 | export const StyledScrollbar = styled(SimpleBar)(({ theme }) => ({ 14 | maxHeight: '100%', 15 | '& .simplebar-scrollbar': { 16 | '&:before': { 17 | backgroundColor: alpha(theme.palette.grey[600], 0.48), 18 | }, 19 | '&.simplebar-visible:before': { 20 | opacity: 1, 21 | }, 22 | }, 23 | '& .simplebar-mask': { 24 | zIndex: 'inherit', 25 | }, 26 | })); 27 | -------------------------------------------------------------------------------- /src/components/search-not-found/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './search-not-found'; 2 | -------------------------------------------------------------------------------- /src/components/search-not-found/search-not-found.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import Paper from '@mui/material/Paper'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | export default function SearchNotFound({ query, sx, ...other }) { 9 | return query ? ( 10 | 18 | 19 | Not Found 20 | 21 | 22 | 23 | No results found for   24 | "{query}". 25 |
Try checking for typos or using complete words. 26 |
27 |
28 | ) : ( 29 | 30 | Please enter keywords 31 | 32 | ); 33 | } 34 | 35 | SearchNotFound.propTypes = { 36 | query: PropTypes.string, 37 | sx: PropTypes.object, 38 | }; 39 | -------------------------------------------------------------------------------- /src/components/settings/context/index.js: -------------------------------------------------------------------------------- 1 | export { SettingsProvider } from './settings-provider'; 2 | export { useSettingsContext } from './settings-context'; 3 | -------------------------------------------------------------------------------- /src/components/settings/context/settings-context.js: -------------------------------------------------------------------------------- 1 | import { useContext, createContext } from 'react'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export const SettingsContext = createContext({}); 6 | 7 | export const useSettingsContext = () => { 8 | const context = useContext(SettingsContext); 9 | 10 | if (!context) throw new Error('useSettingsContext must be use inside SettingsProvider'); 11 | 12 | return context; 13 | }; 14 | -------------------------------------------------------------------------------- /src/components/settings/drawer/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './settings-drawer'; 2 | -------------------------------------------------------------------------------- /src/components/settings/index.js: -------------------------------------------------------------------------------- 1 | export * from './context'; 2 | 3 | export { default as SettingsDrawer } from './drawer'; 4 | -------------------------------------------------------------------------------- /src/components/snackbar/index.js: -------------------------------------------------------------------------------- 1 | export * from 'notistack'; 2 | 3 | export { default as SnackbarProvider } from './snackbar-provider'; 4 | -------------------------------------------------------------------------------- /src/components/svg-color/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './svg-color'; 2 | -------------------------------------------------------------------------------- /src/components/svg-color/svg-color.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { forwardRef } from 'react'; 3 | 4 | import Box from '@mui/material/Box'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | const SvgColor = forwardRef(({ src, sx, ...other }, ref) => ( 9 | 24 | )); 25 | 26 | SvgColor.propTypes = { 27 | src: PropTypes.string, 28 | sx: PropTypes.object, 29 | }; 30 | 31 | export default SvgColor; 32 | -------------------------------------------------------------------------------- /src/components/table/index.js: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | 3 | export { default as useTable } from './use-table'; 4 | 5 | export { default as TableNoData } from './table-no-data'; 6 | export { default as TableSkeleton } from './table-skeleton'; 7 | export { default as TableEmptyRows } from './table-empty-rows'; 8 | export { default as TableHeadCustom } from './table-head-custom'; 9 | export { default as TableSelectedAction } from './table-selected-action'; 10 | export { default as TablePaginationCustom } from './table-pagination-custom'; 11 | -------------------------------------------------------------------------------- /src/components/table/table-empty-rows.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import TableRow from '@mui/material/TableRow'; 4 | import TableCell from '@mui/material/TableCell'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | export default function TableEmptyRows({ emptyRows, height }) { 9 | if (!emptyRows) { 10 | return null; 11 | } 12 | 13 | return ( 14 | 21 | 22 | 23 | ); 24 | } 25 | 26 | TableEmptyRows.propTypes = { 27 | emptyRows: PropTypes.number, 28 | height: PropTypes.number, 29 | }; 30 | -------------------------------------------------------------------------------- /src/components/table/table-no-data.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import TableRow from '@mui/material/TableRow'; 4 | import TableCell from '@mui/material/TableCell'; 5 | 6 | import EmptyContent from '../empty-content'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | export default function TableNoData({ notFound, sx, title }) { 11 | return ( 12 | 13 | {notFound ? ( 14 | 15 | 23 | 24 | ) : ( 25 | 26 | )} 27 | 28 | ); 29 | } 30 | 31 | TableNoData.propTypes = { 32 | notFound: PropTypes.bool, 33 | sx: PropTypes.object, 34 | title: PropTypes.string 35 | }; 36 | -------------------------------------------------------------------------------- /src/components/table/table-pagination-custom.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import Box from '@mui/material/Box'; 4 | import Switch from '@mui/material/Switch'; 5 | import TablePagination from '@mui/material/TablePagination'; 6 | import FormControlLabel from '@mui/material/FormControlLabel'; 7 | 8 | export default function TablePaginationCustom({ 9 | dense, 10 | onChangeDense, 11 | rowsPerPageOptions = [5, 10, 25, 50], 12 | sx, 13 | ...other 14 | }) { 15 | return ( 16 | 17 | 25 | 26 | {onChangeDense && ( 27 | } 30 | sx={{ 31 | pl: 2, 32 | py: 1.5, 33 | top: 0, 34 | position: { 35 | sm: 'absolute', 36 | }, 37 | }} 38 | /> 39 | )} 40 | 41 | ); 42 | } 43 | 44 | TablePaginationCustom.propTypes = { 45 | dense: PropTypes.bool, 46 | onChangeDense: PropTypes.func, 47 | rowsPerPageOptions: PropTypes.arrayOf(PropTypes.number), 48 | sx: PropTypes.object, 49 | }; 50 | -------------------------------------------------------------------------------- /src/components/table/table-skeleton.jsx: -------------------------------------------------------------------------------- 1 | import Stack from '@mui/material/Stack'; 2 | import Skeleton from '@mui/material/Skeleton'; 3 | import TableRow from '@mui/material/TableRow'; 4 | import TableCell from '@mui/material/TableCell'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | export default function TableSkeleton({ ...other }) { 9 | return ( 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /src/components/table/utils.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function emptyRows(page, rowsPerPage, arrayLength) { 4 | return page ? Math.max(0, (1 + page) * rowsPerPage - arrayLength) : 0; 5 | } 6 | 7 | function descendingComparator(a, b, orderBy) { 8 | if (a[orderBy] === null) { 9 | return 1; 10 | } 11 | if (b[orderBy] === null) { 12 | return -1; 13 | } 14 | if (b[orderBy] < a[orderBy]) { 15 | return -1; 16 | } 17 | if (b[orderBy] > a[orderBy]) { 18 | return 1; 19 | } 20 | return 0; 21 | } 22 | 23 | export function getComparator(order, orderBy) { 24 | return order === 'desc' 25 | ? (a, b) => descendingComparator(a, b, orderBy) 26 | : (a, b) => -descendingComparator(a, b, orderBy); 27 | } 28 | -------------------------------------------------------------------------------- /src/config-global.js: -------------------------------------------------------------------------------- 1 | import { paths } from 'src/routes/paths'; 2 | 3 | // API 4 | // ---------------------------------------------------------------------- 5 | 6 | export const HOST_API = import.meta.env.VITE_HOST_API; 7 | export const ASSETS_API = import.meta.env.VITE_ASSETS_API; 8 | 9 | export const FIREBASE_API = { 10 | apiKey: import.meta.env.VITE_FIREBASE_API_KEY, 11 | authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN, 12 | projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID, 13 | storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET, 14 | messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID, 15 | appId: import.meta.env.VITE_FIREBASE_APPID, 16 | measurementId: import.meta.env.VITE_FIREBASE_MEASUREMENT_ID, 17 | }; 18 | 19 | export const AMPLIFY_API = { 20 | userPoolId: import.meta.env.VITE_AWS_AMPLIFY_USER_POOL_ID, 21 | userPoolWebClientId: import.meta.env.VITE_AWS_AMPLIFY_USER_POOL_WEB_CLIENT_ID, 22 | region: import.meta.env.VITE_AWS_AMPLIFY_REGION, 23 | }; 24 | 25 | export const AUTH0_API = { 26 | clientId: import.meta.env.VITE_AUTH0_CLIENT_ID, 27 | domain: import.meta.env.VITE_AUTH0_DOMAIN, 28 | callbackUrl: import.meta.env.VITE_AUTH0_CALLBACK_URL, 29 | }; 30 | 31 | export const MAPBOX_API = import.meta.env.VITE_MAPBOX_API; 32 | 33 | // ROOT PATH AFTER LOGIN SUCCESSFUL 34 | export const PATH_AFTER_LOGIN = paths.dashboard.root; // as '/dashboard' 35 | -------------------------------------------------------------------------------- /src/global.css: -------------------------------------------------------------------------------- 1 | /* scrollbar */ 2 | @import 'simplebar-react/dist/simplebar.min.css'; 3 | -------------------------------------------------------------------------------- /src/hooks/use-boolean.js: -------------------------------------------------------------------------------- 1 | import { useState, useCallback } from 'react'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export function useBoolean(defaultValue) { 6 | const [value, setValue] = useState(!!defaultValue); 7 | 8 | const onTrue = useCallback(() => { 9 | setValue(true); 10 | }, []); 11 | 12 | const onFalse = useCallback(() => { 13 | setValue(false); 14 | }, []); 15 | 16 | const onToggle = useCallback(() => { 17 | setValue((prev) => !prev); 18 | }, []); 19 | 20 | return { 21 | value, 22 | onTrue, 23 | onFalse, 24 | onToggle, 25 | setValue, 26 | }; 27 | } 28 | -------------------------------------------------------------------------------- /src/hooks/use-event-listener.js: -------------------------------------------------------------------------------- 1 | import { useRef, useEffect, useLayoutEffect } from 'react'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect; 6 | 7 | export function useEventListener(eventName, handler, element, options) { 8 | // Create a ref that stores handler 9 | const savedHandler = useRef(handler); 10 | 11 | useIsomorphicLayoutEffect(() => { 12 | savedHandler.current = handler; 13 | }, [handler]); 14 | 15 | useEffect(() => { 16 | // Define the listening target 17 | const targetElement = element?.current || window; 18 | if (!(targetElement && targetElement.addEventListener)) { 19 | return; 20 | } 21 | 22 | // Create event listener that calls handler function stored in ref 23 | const eventListener = (event) => savedHandler.current(event); 24 | 25 | targetElement.addEventListener(eventName, eventListener, options); 26 | 27 | // Remove event listener on cleanup 28 | // eslint-disable-next-line consistent-return 29 | return () => { 30 | targetElement.removeEventListener(eventName, eventListener); 31 | }; 32 | }, [eventName, element, options]); 33 | } 34 | -------------------------------------------------------------------------------- /src/hooks/use-mocked-user.js: -------------------------------------------------------------------------------- 1 | import { _mock } from 'src/_mock'; 2 | 3 | // TO GET THE USER FROM THE AUTHCONTEXT, YOU CAN USE 4 | 5 | // CHANGE: 6 | // import { useMockedUser } from 'src/hooks/use-mocked-user'; 7 | // const { user } = useMockedUser(); 8 | 9 | // TO: 10 | // import { useAuthContext } from 'src/auth/hooks'; 11 | // const { user } = useAuthContext(); 12 | 13 | // ---------------------------------------------------------------------- 14 | 15 | export function useMockedUser() { 16 | const user = { 17 | id: '8864c717-587d-472a-929a-8e5f298024da-0', 18 | displayName: 'Jaydon Frankie', 19 | email: 'demo@minimals.cc', 20 | password: 'demo1234', 21 | photoURL: _mock.image.avatar(24), 22 | phoneNumber: '+40 777666555', 23 | country: 'United States', 24 | address: '90210 Broadway Blvd', 25 | state: 'California', 26 | city: 'San Francisco', 27 | zipCode: '94116', 28 | about: 'Praesent turpis. Phasellus viverra nulla ut metus varius laoreet. Phasellus tempus.', 29 | role: 'admin', 30 | isPublic: true, 31 | }; 32 | 33 | return { user }; 34 | } 35 | -------------------------------------------------------------------------------- /src/hooks/use-off-set-top.js: -------------------------------------------------------------------------------- 1 | import { useScroll } from 'framer-motion'; 2 | import { useMemo, useState, useEffect, useCallback } from 'react'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function useOffSetTop(top = 0, options) { 7 | const { scrollY } = useScroll(options); 8 | 9 | const [value, setValue] = useState(false); 10 | 11 | const onOffSetTop = useCallback(() => { 12 | scrollY.on('change', (scrollHeight) => { 13 | if (scrollHeight > top) { 14 | setValue(true); 15 | } else { 16 | setValue(false); 17 | } 18 | }); 19 | }, [scrollY, top]); 20 | 21 | useEffect(() => { 22 | onOffSetTop(); 23 | }, [onOffSetTop]); 24 | 25 | const memoizedValue = useMemo(() => value, [value]); 26 | 27 | return memoizedValue; 28 | } 29 | 30 | // Usage 31 | // const offset = useOffSetTop(100); 32 | 33 | // Or 34 | // const offset = useOffSetTop(100, { 35 | // container: ref, 36 | // }); 37 | -------------------------------------------------------------------------------- /src/hooks/use-responsive.js: -------------------------------------------------------------------------------- 1 | import { useTheme } from '@mui/material/styles'; 2 | import useMediaQuery from '@mui/material/useMediaQuery'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function useResponsive(query, start, end) { 7 | const theme = useTheme(); 8 | 9 | const mediaUp = useMediaQuery(theme.breakpoints.up(start)); 10 | 11 | const mediaDown = useMediaQuery(theme.breakpoints.down(start)); 12 | 13 | const mediaBetween = useMediaQuery(theme.breakpoints.between(start, end)); 14 | 15 | const mediaOnly = useMediaQuery(theme.breakpoints.only(start)); 16 | 17 | if (query === 'up') { 18 | return mediaUp; 19 | } 20 | 21 | if (query === 'down') { 22 | return mediaDown; 23 | } 24 | 25 | if (query === 'between') { 26 | return mediaBetween; 27 | } 28 | 29 | return mediaOnly; 30 | } 31 | 32 | // ---------------------------------------------------------------------- 33 | 34 | export function useWidth() { 35 | const theme = useTheme(); 36 | 37 | const keys = [...theme.breakpoints.keys].reverse(); 38 | 39 | return ( 40 | keys.reduce((output, key) => { 41 | // eslint-disable-next-line react-hooks/rules-of-hooks 42 | const matches = useMediaQuery(theme.breakpoints.up(key)); 43 | 44 | return !output && matches ? key : output; 45 | }, null) || 'xs' 46 | ); 47 | } 48 | -------------------------------------------------------------------------------- /src/hooks/use-scroll-to-top.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { useLocation } from 'react-router-dom'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function useScrollToTop() { 7 | const { pathname } = useLocation(); 8 | 9 | useEffect(() => { 10 | window.scrollTo(0, 0); 11 | }, [pathname]); 12 | 13 | return null; 14 | } 15 | -------------------------------------------------------------------------------- /src/layouts/common/header-shadow.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import Box from '@mui/material/Box'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export default function HeaderShadow({ sx, ...other }) { 8 | return ( 9 | theme.customShadows.z8, 22 | ...sx, 23 | }} 24 | {...other} 25 | /> 26 | ); 27 | } 28 | 29 | HeaderShadow.propTypes = { 30 | sx: PropTypes.object, 31 | }; 32 | -------------------------------------------------------------------------------- /src/layouts/compact/index.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | 3 | import Stack from '@mui/material/Stack'; 4 | import Container from '@mui/material/Container'; 5 | 6 | import Header from '../common/header-simple'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | export default function CompactLayout({ children }) { 11 | return ( 12 | <> 13 |
14 | 15 | 16 | 26 | {children} 27 | 28 | 29 | 30 | ); 31 | } 32 | 33 | CompactLayout.propTypes = { 34 | children: PropTypes.node, 35 | }; 36 | -------------------------------------------------------------------------------- /src/layouts/config-layout.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const HEADER = { 4 | H_MOBILE: 64, 5 | H_DESKTOP: 80, 6 | H_DESKTOP_OFFSET: 80 - 16, 7 | }; 8 | 9 | export const NAV = { 10 | W_VERTICAL: 280, 11 | W_MINI: 88, 12 | }; 13 | -------------------------------------------------------------------------------- /src/layouts/dashboard/nav-mini.jsx: -------------------------------------------------------------------------------- 1 | import Box from '@mui/material/Box'; 2 | import Stack from '@mui/material/Stack'; 3 | 4 | import { useMockedUser } from 'src/hooks/use-mocked-user'; 5 | 6 | import { hideScroll } from 'src/theme/css'; 7 | 8 | import Logo from 'src/components/logo'; 9 | import { NavSectionMini } from 'src/components/nav-section'; 10 | 11 | import { NAV } from '../config-layout'; 12 | import { useNavData } from './config-navigation'; 13 | import NavToggleButton from '../common/nav-toggle-button'; 14 | 15 | // ---------------------------------------------------------------------- 16 | 17 | export default function NavMini() { 18 | const { user } = useMockedUser(); 19 | 20 | const navData = useNavData(); 21 | 22 | return ( 23 | 29 | 35 | 36 | `dashed 1px ${theme.palette.divider}`, 43 | ...hideScroll.x, 44 | }} 45 | > 46 | 47 | 48 | 54 | 55 | 56 | ); 57 | } 58 | -------------------------------------------------------------------------------- /src/main.jsx: -------------------------------------------------------------------------------- 1 | import { Suspense } from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import { BrowserRouter } from 'react-router-dom'; 4 | import { HelmetProvider } from 'react-helmet-async'; 5 | 6 | import App from './app'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | const root = ReactDOM.createRoot(document.getElementById('root')); 11 | 12 | root.render( 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | ); 21 | -------------------------------------------------------------------------------- /src/pages/404.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import { NotFoundView } from 'src/sections/error'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export default function NotFoundPage() { 8 | return ( 9 | <> 10 | 11 | 404 Page Not Found! 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/pages/auth/jwt/login.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import { JwtLoginView } from 'src/sections/auth/jwt'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export default function LoginPage() { 8 | return ( 9 | <> 10 | 11 | Jwt: Login 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/pages/auth/jwt/register.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import { JwtRegisterView } from 'src/sections/auth/jwt'; 4 | 5 | export default function RegisterPage() { 6 | return ( 7 | <> 8 | 9 | Jwt: Register 10 | 11 | 12 | 13 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/pages/dashboard/Address.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import AddressPanel from 'src/sections/address/view'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | const Address = () => ( 8 | <> 9 | 10 | Pay Crypto | Address 11 | 12 | 13 | 14 | 15 | ) 16 | 17 | export default Address; -------------------------------------------------------------------------------- /src/pages/dashboard/CashOut.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import Cashout from 'src/sections/cashout/view'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export default function Page() { 8 | return ( 9 | <> 10 | 11 | Dashboard: CashOut 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/pages/dashboard/Dashboard.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import Home from 'src/sections/dashboard/view'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | const Dashboard = () => ( 8 | <> 9 | 10 | Dashboard: Home 11 | 12 | 13 | 14 | 15 | ) 16 | 17 | export default Dashboard; -------------------------------------------------------------------------------- /src/pages/dashboard/Profile.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import ProfilePanel from 'src/sections/profile/View'; 4 | 5 | const Address = () => ( 6 | <> 7 | 8 | Pay Crypto | Profile 9 | 10 | 11 | 12 | 13 | ) 14 | 15 | export default Address; -------------------------------------------------------------------------------- /src/pages/dashboard/Transaction.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import FourView from 'src/sections/transaction/view'; 4 | 5 | const Transaction = () => ( 6 | <> 7 | 8 | Dashboard: Transactions 9 | 10 | 11 | 12 | 13 | ) 14 | 15 | export default Transaction; -------------------------------------------------------------------------------- /src/pages/dashboard/User.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import UserPanel from 'src/sections/user/view'; 4 | 5 | const User = () => ( 6 | <> 7 | 8 | Pay Crypto | User 9 | 10 | 11 | 12 | 13 | ) 14 | 15 | export default User; -------------------------------------------------------------------------------- /src/pages/dashboard/Withdraw.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import TwoView from 'src/sections/withdraw/view'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export default function Page() { 8 | return ( 9 | <> 10 | 11 | Dashboard: Withdraw 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/pages/dashboard/six.jsx: -------------------------------------------------------------------------------- 1 | import { Helmet } from 'react-helmet-async'; 2 | 3 | import SixView from 'src/sections/six/view'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export default function Page() { 8 | return ( 9 | <> 10 | 11 | Dashboard: Six 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/routes/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as RouterLink } from './router-link'; 2 | -------------------------------------------------------------------------------- /src/routes/components/router-link.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { forwardRef } from 'react'; 3 | import { Link } from 'react-router-dom'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | const RouterLink = forwardRef(({ href, ...other }, ref) => ); 8 | 9 | RouterLink.propTypes = { 10 | href: PropTypes.string, 11 | }; 12 | 13 | export default RouterLink; 14 | -------------------------------------------------------------------------------- /src/routes/hooks/index.js: -------------------------------------------------------------------------------- 1 | // 2 | export { useParams } from './use-params'; 3 | export { useRouter } from './use-router'; 4 | export { usePathname } from './use-pathname'; 5 | export { useActiveLink } from './use-active-link'; 6 | export { useSearchParams } from './use-search-params'; 7 | -------------------------------------------------------------------------------- /src/routes/hooks/use-active-link.js: -------------------------------------------------------------------------------- 1 | import { matchPath, useLocation } from 'react-router-dom'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export function useActiveLink(path, deep = true) { 6 | const { pathname } = useLocation(); 7 | 8 | const normalActive = path ? !!matchPath({ path, end: true }, pathname) : false; 9 | 10 | const deepActive = path ? !!matchPath({ path, end: false }, pathname) : false; 11 | 12 | return deep ? deepActive : normalActive; 13 | } 14 | -------------------------------------------------------------------------------- /src/routes/hooks/use-params.js: -------------------------------------------------------------------------------- 1 | import { useMemo } from 'react'; 2 | import { useParams as _useParams } from 'react-router-dom'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function useParams() { 7 | const params = _useParams(); 8 | 9 | return useMemo(() => params, [params]); 10 | } 11 | -------------------------------------------------------------------------------- /src/routes/hooks/use-pathname.js: -------------------------------------------------------------------------------- 1 | import { useMemo } from 'react'; 2 | import { useLocation } from 'react-router-dom'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function usePathname() { 7 | const { pathname } = useLocation(); 8 | 9 | return useMemo(() => pathname, [pathname]); 10 | } 11 | -------------------------------------------------------------------------------- /src/routes/hooks/use-router.js: -------------------------------------------------------------------------------- 1 | import { useMemo } from 'react'; 2 | import { useNavigate } from 'react-router-dom'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function useRouter() { 7 | const navigate = useNavigate(); 8 | 9 | const router = useMemo( 10 | () => ({ 11 | back: () => navigate(-1), 12 | forward: () => navigate(1), 13 | reload: () => window.location.reload(), 14 | push: (href) => navigate(href), 15 | replace: (href) => navigate(href, { replace: true }), 16 | }), 17 | [navigate] 18 | ); 19 | 20 | return router; 21 | } 22 | -------------------------------------------------------------------------------- /src/routes/hooks/use-search-params.js: -------------------------------------------------------------------------------- 1 | import { useMemo } from 'react'; 2 | import { useSearchParams as _useSearchParams } from 'react-router-dom'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function useSearchParams() { 7 | const [searchParams] = _useSearchParams(); 8 | 9 | return useMemo(() => searchParams, [searchParams]); 10 | } 11 | -------------------------------------------------------------------------------- /src/routes/paths.js: -------------------------------------------------------------------------------- 1 | const ROOTS = { 2 | AUTH: '/auth', 3 | DASHBOARD: '/dashboard', 4 | }; 5 | 6 | export const paths = { 7 | // AUTH 8 | auth: { 9 | jwt: { 10 | login: `${ROOTS.AUTH}/jwt/login`, 11 | }, 12 | }, 13 | 14 | // DASHBOARD 15 | dashboard: { 16 | root: ROOTS.DASHBOARD, 17 | profile: `${ROOTS.DASHBOARD}/profile`, 18 | address: `${ROOTS.DASHBOARD}/address`, 19 | transaction: `${ROOTS.DASHBOARD}/transaction`, 20 | withdraw: `${ROOTS.DASHBOARD}/withdraw`, 21 | cashout: `${ROOTS.DASHBOARD}/cashout`, 22 | user: `${ROOTS.DASHBOARD}/user`, 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /src/routes/sections/auth.jsx: -------------------------------------------------------------------------------- 1 | import { lazy, Suspense } from 'react'; 2 | import { Outlet } from 'react-router-dom'; 3 | 4 | import { GuestGuard } from 'src/auth/guard'; 5 | import AuthClassicLayout from 'src/layouts/auth/classic'; 6 | 7 | import { SplashScreen } from 'src/components/loading-screen'; 8 | 9 | // JWT 10 | const JwtLoginPage = lazy(() => import('src/pages/auth/jwt/login')); 11 | 12 | const authJwt = { 13 | path: 'jwt', 14 | element: ( 15 | 16 | }> 17 | 18 | 19 | 20 | ), 21 | children: [ 22 | { 23 | path: 'login', 24 | element: ( 25 | 26 | 27 | 28 | ), 29 | } 30 | ], 31 | }; 32 | 33 | export const authRoutes = [ 34 | { 35 | path: 'auth', 36 | children: [authJwt], 37 | }, 38 | ]; 39 | -------------------------------------------------------------------------------- /src/routes/sections/index.jsx: -------------------------------------------------------------------------------- 1 | import { Navigate, useRoutes } from 'react-router-dom'; 2 | 3 | import { PATH_AFTER_LOGIN } from 'src/config-global'; 4 | 5 | import { mainRoutes } from './main'; 6 | import { authRoutes } from './auth'; 7 | import { dashboardRoutes } from './dashboard'; 8 | 9 | // ---------------------------------------------------------------------- 10 | 11 | export default function Router() { 12 | return useRoutes([ 13 | { 14 | path: '/', 15 | element: , 16 | }, 17 | 18 | // Auth routes 19 | ...authRoutes, 20 | 21 | // Dashboard routes 22 | ...dashboardRoutes, 23 | 24 | // Main routes 25 | ...mainRoutes, 26 | 27 | // No match 404 28 | { path: '*', element: }, 29 | ]); 30 | } 31 | -------------------------------------------------------------------------------- /src/routes/sections/main.jsx: -------------------------------------------------------------------------------- 1 | import { lazy } from 'react'; 2 | import { Outlet } from 'react-router-dom'; 3 | 4 | import CompactLayout from 'src/layouts/compact'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | const Page404 = lazy(() => import('src/pages/404')); 9 | 10 | // ---------------------------------------------------------------------- 11 | 12 | export const mainRoutes = [ 13 | { 14 | element: ( 15 | 16 | 17 | 18 | ), 19 | children: [{ path: '404', element: }], 20 | }, 21 | ]; 22 | -------------------------------------------------------------------------------- /src/sections/address/view.jsx: -------------------------------------------------------------------------------- 1 | import Card from '@mui/material/Card'; 2 | import Stack from '@mui/material/Stack'; 3 | import Container from '@mui/material/Container'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | import ComponentBlock from 'src/components/component-block'; 7 | import { useSettingsContext } from 'src/components/settings'; 8 | 9 | import Table from 'src/sections/address/Table'; 10 | 11 | const AddressPanel = () => { 12 | const settings = useSettingsContext(); 13 | 14 | return ( 15 | 16 | Address 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | ); 27 | } 28 | 29 | export default AddressPanel; -------------------------------------------------------------------------------- /src/sections/auth/jwt/index.js: -------------------------------------------------------------------------------- 1 | export { default as JwtLoginView } from './jwt-login-view'; 2 | export { default as JwtRegisterView } from './jwt-register-view'; 3 | -------------------------------------------------------------------------------- /src/sections/cashout/view.jsx: -------------------------------------------------------------------------------- 1 | import Card from '@mui/material/Card'; 2 | import Stack from '@mui/material/Stack'; 3 | import Container from '@mui/material/Container'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | import ComponentBlock from 'src/components/component-block'; 7 | import { useSettingsContext } from 'src/components/settings'; 8 | 9 | import Table from 'src/sections/cashout/Table'; 10 | 11 | const CashOutPanel = () => { 12 | const settings = useSettingsContext(); 13 | 14 | return ( 15 | 16 | CashOut 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | ); 27 | } 28 | 29 | export default CashOutPanel; -------------------------------------------------------------------------------- /src/sections/error/403-view.jsx: -------------------------------------------------------------------------------- 1 | import { m } from 'framer-motion'; 2 | 3 | import Button from '@mui/material/Button'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | import { RouterLink } from 'src/routes/components'; 7 | 8 | import CompactLayout from 'src/layouts/compact'; 9 | import { ForbiddenIllustration } from 'src/assets/illustrations'; 10 | 11 | import { varBounce, MotionContainer } from 'src/components/animate'; 12 | 13 | // ---------------------------------------------------------------------- 14 | 15 | export default function View403() { 16 | return ( 17 | 18 | 19 | 20 | 21 | No permission 22 | 23 | 24 | 25 | 26 | 27 | The page you're trying access has restricted access. 28 |
29 | Please refer to your system administrator 30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 40 |
41 |
42 | ); 43 | } 44 | -------------------------------------------------------------------------------- /src/sections/error/500-view.jsx: -------------------------------------------------------------------------------- 1 | import { m } from 'framer-motion'; 2 | 3 | import Button from '@mui/material/Button'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | import { RouterLink } from 'src/routes/components'; 7 | 8 | import CompactLayout from 'src/layouts/compact'; 9 | import { SeverErrorIllustration } from 'src/assets/illustrations'; 10 | 11 | import { varBounce, MotionContainer } from 'src/components/animate'; 12 | 13 | // ---------------------------------------------------------------------- 14 | 15 | export default function Page500() { 16 | return ( 17 | 18 | 19 | 20 | 21 | 500 Internal Server Error 22 | 23 | 24 | 25 | 26 | 27 | There was an error, please try again later. 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 38 | 39 | 40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /src/sections/error/index.js: -------------------------------------------------------------------------------- 1 | export { default as View403 } from './403-view'; 2 | export { default as View500 } from './500-view'; 3 | export { default as NotFoundView } from './not-found-view'; 4 | -------------------------------------------------------------------------------- /src/sections/error/not-found-view.jsx: -------------------------------------------------------------------------------- 1 | import { m } from 'framer-motion'; 2 | 3 | import Button from '@mui/material/Button'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | import { RouterLink } from 'src/routes/components'; 7 | 8 | import CompactLayout from 'src/layouts/compact'; 9 | import { PageNotFoundIllustration } from 'src/assets/illustrations'; 10 | 11 | import { varBounce, MotionContainer } from 'src/components/animate'; 12 | 13 | // ---------------------------------------------------------------------- 14 | 15 | export default function NotFoundView() { 16 | return ( 17 | 18 | 19 | 20 | 21 | Sorry, Page Not Found! 22 | 23 | 24 | 25 | 26 | 27 | Sorry, we couldn’t find the page you’re looking for. Perhaps you’ve mistyped the URL? Be 28 | sure to check your spelling. 29 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 44 | 45 | 46 | ); 47 | } 48 | -------------------------------------------------------------------------------- /src/sections/profile/View.jsx: -------------------------------------------------------------------------------- 1 | import Stack from '@mui/material/Stack'; 2 | import Container from '@mui/material/Container'; 3 | import Typography from '@mui/material/Typography'; 4 | 5 | import ComponentBlock from 'src/components/component-block'; 6 | import { useSettingsContext } from 'src/components/settings'; 7 | 8 | import Table from 'src/sections/profile/Table'; 9 | 10 | const CashOutPanel = () => { 11 | const settings = useSettingsContext(); 12 | 13 | return ( 14 | 15 | Account Overview 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | ); 24 | } 25 | 26 | export default CashOutPanel; -------------------------------------------------------------------------------- /src/sections/six/view.jsx: -------------------------------------------------------------------------------- 1 | import Box from '@mui/material/Box'; 2 | import { alpha } from '@mui/material/styles'; 3 | import Container from '@mui/material/Container'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | import { useSettingsContext } from 'src/components/settings'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | export default function SixView() { 11 | const settings = useSettingsContext(); 12 | 13 | return ( 14 | 15 | Page Six 16 | 17 | alpha(theme.palette.grey[500], 0.04), 24 | border: (theme) => `dashed 1px ${theme.palette.divider}`, 25 | }} 26 | /> 27 | 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/sections/transaction/view.jsx: -------------------------------------------------------------------------------- 1 | import Card from '@mui/material/Card'; 2 | import Stack from '@mui/material/Stack'; 3 | import Container from '@mui/material/Container'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | import ComponentBlock from 'src/components/component-block'; 7 | import { useSettingsContext } from 'src/components/settings'; 8 | 9 | import TransactionTable from "src/sections/transaction/Table"; 10 | 11 | const TransactionPanel = () => { 12 | const settings = useSettingsContext(); 13 | 14 | return ( 15 | 16 | Transaction 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | ); 27 | } 28 | 29 | export default TransactionPanel; -------------------------------------------------------------------------------- /src/sections/user/view.jsx: -------------------------------------------------------------------------------- 1 | import Card from "@mui/material/Card"; 2 | import Stack from "@mui/material/Stack"; 3 | import Container from '@mui/material/Container'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | import ComponentBlock from 'src/components/component-block'; 7 | import { useSettingsContext } from 'src/components/settings'; 8 | 9 | import UserTable from "src/sections/user/Table"; 10 | 11 | const UserPanel = () => { 12 | const settings = useSettingsContext(); 13 | 14 | return ( 15 | 16 | User 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | ) 27 | } 28 | 29 | export default UserPanel; -------------------------------------------------------------------------------- /src/sections/withdraw/view.jsx: -------------------------------------------------------------------------------- 1 | import Card from '@mui/material/Card'; 2 | import Stack from '@mui/material/Stack'; 3 | import Container from '@mui/material/Container'; 4 | import Typography from '@mui/material/Typography'; 5 | 6 | import ComponentBlock from 'src/components/component-block'; 7 | import { useSettingsContext } from 'src/components/settings'; 8 | 9 | import Withdraw from "src/sections/withdraw/Table"; 10 | 11 | const WithdrawPanel = () => { 12 | const settings = useSettingsContext(); 13 | 14 | return ( 15 | 16 | Withdraw 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | ); 27 | } 28 | 29 | export default WithdrawPanel; -------------------------------------------------------------------------------- /src/theme/custom-shadows.js: -------------------------------------------------------------------------------- 1 | import { alpha } from '@mui/material/styles'; 2 | 3 | import { grey, info, error, common, primary, success, warning, secondary } from './palette'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export function customShadows(mode) { 8 | const color = mode === 'light' ? grey[500] : common.black; 9 | 10 | const transparent = alpha(color, 0.16); 11 | 12 | return { 13 | z1: `0 1px 2px 0 ${transparent}`, 14 | z4: `0 4px 8px 0 ${transparent}`, 15 | z8: `0 8px 16px 0 ${transparent}`, 16 | z12: `0 12px 24px -4px ${transparent}`, 17 | z16: `0 16px 32px -4px ${transparent}`, 18 | z20: `0 20px 40px -4px ${transparent}`, 19 | z24: `0 24px 48px 0 ${transparent}`, 20 | // 21 | card: `0 0 2px 0 ${alpha(color, 0.2)}, 0 12px 24px -4px ${alpha(color, 0.12)}`, 22 | dropdown: `0 0 2px 0 ${alpha(color, 0.24)}, -20px 20px 40px -4px ${alpha(color, 0.24)}`, 23 | dialog: `-40px 40px 80px -8px ${alpha(common.black, 0.24)}`, 24 | // 25 | primary: `0 8px 16px 0 ${alpha(primary.main, 0.24)}`, 26 | info: `0 8px 16px 0 ${alpha(info.main, 0.24)}`, 27 | secondary: `0 8px 16px 0 ${alpha(secondary.main, 0.24)}`, 28 | success: `0 8px 16px 0 ${alpha(success.main, 0.24)}`, 29 | warning: `0 8px 16px 0 ${alpha(warning.main, 0.24)}`, 30 | error: `0 8px 16px 0 ${alpha(error.main, 0.24)}`, 31 | }; 32 | } 33 | -------------------------------------------------------------------------------- /src/theme/options/contrast.js: -------------------------------------------------------------------------------- 1 | import { grey } from '../palette'; 2 | import { customShadows } from '../custom-shadows'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export function createContrast(contrast, mode) { 7 | const theme = { 8 | ...(contrast === 'bold' && 9 | mode === 'light' && { 10 | palette: { 11 | background: { 12 | default: grey[200], 13 | }, 14 | }, 15 | }), 16 | }; 17 | 18 | const components = { 19 | ...(contrast === 'bold' && { 20 | MuiCard: { 21 | styleOverrides: { 22 | root: { 23 | boxShadow: customShadows(mode).z1, 24 | }, 25 | }, 26 | }, 27 | }), 28 | }; 29 | 30 | return { 31 | ...theme, 32 | components, 33 | }; 34 | } 35 | -------------------------------------------------------------------------------- /src/theme/options/right-to-left.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import createCache from '@emotion/cache'; 4 | import rtlPlugin from 'stylis-plugin-rtl'; 5 | import { CacheProvider } from '@emotion/react'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | export default function RTL({ children, themeDirection }) { 10 | useEffect(() => { 11 | document.dir = themeDirection; 12 | }, [themeDirection]); 13 | 14 | const cacheRtl = createCache({ 15 | key: 'rtl', 16 | prepend: true, 17 | // https://github.com/styled-components/stylis-plugin-rtl/issues/35 18 | stylisPlugins: [rtlPlugin], 19 | }); 20 | 21 | if (themeDirection === 'rtl') { 22 | return {children}; 23 | } 24 | 25 | return <>{children}; 26 | } 27 | 28 | RTL.propTypes = { 29 | children: PropTypes.node, 30 | themeDirection: PropTypes.oneOf(['rtl', 'ltr']), 31 | }; 32 | -------------------------------------------------------------------------------- /src/theme/overrides/components/accordion.js: -------------------------------------------------------------------------------- 1 | import { accordionClasses } from '@mui/material/Accordion'; 2 | import { typographyClasses } from '@mui/material/Typography'; 3 | import { accordionSummaryClasses } from '@mui/material/AccordionSummary'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export function accordion(theme) { 8 | return { 9 | MuiAccordion: { 10 | styleOverrides: { 11 | root: { 12 | backgroundColor: 'transparent', 13 | [`&.${accordionClasses.expanded}`]: { 14 | boxShadow: theme.customShadows.z8, 15 | borderRadius: theme.shape.borderRadius, 16 | backgroundColor: theme.palette.background.paper, 17 | }, 18 | [`&.${accordionClasses.disabled}`]: { 19 | backgroundColor: 'transparent', 20 | }, 21 | }, 22 | }, 23 | }, 24 | MuiAccordionSummary: { 25 | styleOverrides: { 26 | root: { 27 | paddingLeft: theme.spacing(2), 28 | paddingRight: theme.spacing(1), 29 | [`&.${accordionSummaryClasses.disabled}`]: { 30 | opacity: 1, 31 | color: theme.palette.action.disabled, 32 | [`& .${typographyClasses.root}`]: { 33 | color: 'inherit', 34 | }, 35 | }, 36 | }, 37 | expandIconWrapper: { 38 | color: 'inherit', 39 | }, 40 | }, 41 | }, 42 | }; 43 | } 44 | -------------------------------------------------------------------------------- /src/theme/overrides/components/appbar.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function appBar(theme) { 4 | return { 5 | MuiAppBar: { 6 | styleOverrides: { 7 | root: { 8 | boxShadow: 'none', 9 | }, 10 | }, 11 | }, 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /src/theme/overrides/components/autocomplete.js: -------------------------------------------------------------------------------- 1 | import { alpha } from '@mui/material/styles'; 2 | import { svgIconClasses } from '@mui/material/SvgIcon'; 3 | import { autocompleteClasses } from '@mui/material/Autocomplete'; 4 | 5 | import { paper, menuItem } from '../../css'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | export function autocomplete(theme) { 10 | return { 11 | MuiAutocomplete: { 12 | styleOverrides: { 13 | root: { 14 | [`& span.${autocompleteClasses.tag}`]: { 15 | ...theme.typography.subtitle2, 16 | height: 24, 17 | minWidth: 24, 18 | lineHeight: '24px', 19 | textAlign: 'center', 20 | padding: theme.spacing(0, 0.75), 21 | color: theme.palette.text.secondary, 22 | borderRadius: theme.shape.borderRadius, 23 | backgroundColor: alpha(theme.palette.grey[500], 0.16), 24 | }, 25 | }, 26 | paper: { 27 | ...paper({ theme, dropdown: true }), 28 | }, 29 | listbox: { 30 | padding: 0, 31 | [`& .${autocompleteClasses.option}`]: { 32 | ...menuItem(theme), 33 | }, 34 | }, 35 | endAdornment: { 36 | [`& .${svgIconClasses.root}`]: { 37 | width: 18, 38 | height: 18, 39 | }, 40 | }, 41 | }, 42 | }, 43 | }; 44 | } 45 | -------------------------------------------------------------------------------- /src/theme/overrides/components/backdrop.js: -------------------------------------------------------------------------------- 1 | import { alpha } from '@mui/material/styles'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export function backdrop(theme) { 6 | return { 7 | MuiBackdrop: { 8 | styleOverrides: { 9 | root: { 10 | backgroundColor: alpha(theme.palette.grey[900], 0.8), 11 | }, 12 | invisible: { 13 | background: 'transparent', 14 | }, 15 | }, 16 | }, 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /src/theme/overrides/components/breadcrumbs.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function breadcrumbs(theme) { 4 | return { 5 | MuiBreadcrumbs: { 6 | styleOverrides: { 7 | separator: { 8 | marginLeft: theme.spacing(2), 9 | marginRight: theme.spacing(2), 10 | }, 11 | li: { 12 | display: 'inline-flex', 13 | margin: theme.spacing(0.25, 0), 14 | '& > *': { 15 | ...theme.typography.body2, 16 | }, 17 | }, 18 | }, 19 | }, 20 | }; 21 | } 22 | -------------------------------------------------------------------------------- /src/theme/overrides/components/card.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function card(theme) { 4 | return { 5 | MuiCard: { 6 | styleOverrides: { 7 | root: { 8 | position: 'relative', 9 | boxShadow: theme.customShadows.card, 10 | borderRadius: theme.shape.borderRadius * 2, 11 | zIndex: 0, // Fix Safari overflow: hidden with border radius 12 | }, 13 | }, 14 | }, 15 | MuiCardHeader: { 16 | styleOverrides: { 17 | root: { 18 | padding: theme.spacing(3, 3, 0), 19 | }, 20 | }, 21 | }, 22 | MuiCardContent: { 23 | styleOverrides: { 24 | root: { 25 | padding: theme.spacing(3), 26 | }, 27 | }, 28 | }, 29 | }; 30 | } 31 | -------------------------------------------------------------------------------- /src/theme/overrides/components/checkbox.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function checkbox(theme) { 4 | return { 5 | MuiCheckbox: { 6 | styleOverrides: { 7 | root: { 8 | padding: theme.spacing(1), 9 | }, 10 | }, 11 | }, 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /src/theme/overrides/components/css-baseline.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function cssBaseline(theme) { 4 | return { 5 | MuiCssBaseline: { 6 | styleOverrides: { 7 | '*': { 8 | boxSizing: 'border-box', 9 | }, 10 | html: { 11 | margin: 0, 12 | padding: 0, 13 | width: '100%', 14 | height: '100%', 15 | WebkitOverflowScrolling: 'touch', 16 | }, 17 | body: { 18 | margin: 0, 19 | padding: 0, 20 | width: '100%', 21 | height: '100%', 22 | }, 23 | '#root, #__next': { 24 | width: '100%', 25 | height: '100%', 26 | }, 27 | input: { 28 | '&[type=number]': { 29 | MozAppearance: 'textfield', 30 | '&::-webkit-outer-spin-button': { 31 | margin: 0, 32 | WebkitAppearance: 'none', 33 | }, 34 | '&::-webkit-inner-spin-button': { 35 | margin: 0, 36 | WebkitAppearance: 'none', 37 | }, 38 | }, 39 | }, 40 | img: { 41 | maxWidth: '100%', 42 | display: 'inline-block', 43 | verticalAlign: 'bottom', 44 | }, 45 | }, 46 | }, 47 | }; 48 | } 49 | -------------------------------------------------------------------------------- /src/theme/overrides/components/dialog.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function dialog(theme) { 4 | return { 5 | MuiDialog: { 6 | styleOverrides: { 7 | paper: ({ ownerState }) => ({ 8 | boxShadow: theme.customShadows.dialog, 9 | borderRadius: theme.shape.borderRadius * 2, 10 | ...(!ownerState.fullScreen && { 11 | margin: theme.spacing(2), 12 | }), 13 | }), 14 | paperFullScreen: { 15 | borderRadius: 0, 16 | }, 17 | }, 18 | }, 19 | MuiDialogTitle: { 20 | styleOverrides: { 21 | root: { 22 | padding: theme.spacing(3), 23 | }, 24 | }, 25 | }, 26 | MuiDialogContent: { 27 | styleOverrides: { 28 | root: { 29 | padding: theme.spacing(0, 3), 30 | }, 31 | dividers: { 32 | borderTop: 0, 33 | borderBottomStyle: 'dashed', 34 | paddingBottom: theme.spacing(3), 35 | }, 36 | }, 37 | }, 38 | MuiDialogActions: { 39 | styleOverrides: { 40 | root: { 41 | padding: theme.spacing(3), 42 | '& > :not(:first-of-type)': { 43 | marginLeft: theme.spacing(1.5), 44 | }, 45 | }, 46 | }, 47 | }, 48 | }; 49 | } 50 | -------------------------------------------------------------------------------- /src/theme/overrides/components/drawer.js: -------------------------------------------------------------------------------- 1 | import { alpha } from '@mui/material/styles'; 2 | import { drawerClasses } from '@mui/material/Drawer'; 3 | 4 | import { paper } from '../../css'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | export function drawer(theme) { 9 | const lightMode = theme.palette.mode === 'light'; 10 | 11 | return { 12 | MuiDrawer: { 13 | styleOverrides: { 14 | root: ({ ownerState }) => ({ 15 | ...(ownerState.variant === 'temporary' && { 16 | [`& .${drawerClasses.paper}`]: { 17 | ...paper({ theme }), 18 | ...(ownerState.anchor === 'left' && { 19 | boxShadow: `40px 40px 80px -8px ${alpha( 20 | lightMode ? theme.palette.grey[500] : theme.palette.common.black, 21 | 0.24 22 | )}`, 23 | }), 24 | ...(ownerState.anchor === 'right' && { 25 | boxShadow: `-40px 40px 80px -8px ${alpha( 26 | lightMode ? theme.palette.grey[500] : theme.palette.common.black, 27 | 0.24 28 | )}`, 29 | }), 30 | }, 31 | }), 32 | }), 33 | }, 34 | }, 35 | }; 36 | } 37 | -------------------------------------------------------------------------------- /src/theme/overrides/components/list.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function list(theme) { 4 | return { 5 | MuiListItemIcon: { 6 | styleOverrides: { 7 | root: { 8 | color: 'inherit', 9 | minWidth: 'auto', 10 | marginRight: theme.spacing(2), 11 | }, 12 | }, 13 | }, 14 | MuiListItemAvatar: { 15 | styleOverrides: { 16 | root: { 17 | minWidth: 'auto', 18 | marginRight: theme.spacing(2), 19 | }, 20 | }, 21 | }, 22 | MuiListItemText: { 23 | styleOverrides: { 24 | root: { 25 | margin: 0, 26 | }, 27 | multiline: { 28 | margin: 0, 29 | }, 30 | }, 31 | }, 32 | }; 33 | } 34 | -------------------------------------------------------------------------------- /src/theme/overrides/components/loading-button.js: -------------------------------------------------------------------------------- 1 | import { loadingButtonClasses } from '@mui/lab/LoadingButton'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export function loadingButton(theme) { 6 | return { 7 | MuiLoadingButton: { 8 | styleOverrides: { 9 | root: ({ ownerState }) => ({ 10 | ...(ownerState.variant === 'soft' && { 11 | [`& .${loadingButtonClasses.loadingIndicatorStart}`]: { 12 | left: 10, 13 | }, 14 | [`& .${loadingButtonClasses.loadingIndicatorEnd}`]: { 15 | right: 14, 16 | }, 17 | ...(ownerState.size === 'small' && { 18 | [`& .${loadingButtonClasses.loadingIndicatorStart}`]: { 19 | left: 10, 20 | }, 21 | [`& .${loadingButtonClasses.loadingIndicatorEnd}`]: { 22 | right: 10, 23 | }, 24 | }), 25 | }), 26 | }), 27 | }, 28 | }, 29 | }; 30 | } 31 | -------------------------------------------------------------------------------- /src/theme/overrides/components/menu.js: -------------------------------------------------------------------------------- 1 | import { menuItem } from '../../css'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export function menu(theme) { 6 | return { 7 | MuiMenuItem: { 8 | styleOverrides: { 9 | root: { 10 | ...menuItem(theme), 11 | }, 12 | }, 13 | }, 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /src/theme/overrides/components/paper.js: -------------------------------------------------------------------------------- 1 | import { alpha } from '@mui/material/styles'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export function paper(theme) { 6 | return { 7 | MuiPaper: { 8 | styleOverrides: { 9 | root: { 10 | backgroundImage: 'none', 11 | }, 12 | outlined: { 13 | borderColor: alpha(theme.palette.grey[500], 0.16), 14 | }, 15 | }, 16 | }, 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /src/theme/overrides/components/popover.js: -------------------------------------------------------------------------------- 1 | import { listClasses } from '@mui/material/List'; 2 | 3 | import { paper } from '../../css'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export function popover(theme) { 8 | return { 9 | MuiPopover: { 10 | styleOverrides: { 11 | paper: { 12 | ...paper({ theme, dropdown: true }), 13 | [`& .${listClasses.root}`]: { 14 | paddingTop: 0, 15 | paddingBottom: 0, 16 | }, 17 | }, 18 | }, 19 | }, 20 | }; 21 | } 22 | -------------------------------------------------------------------------------- /src/theme/overrides/components/progress.js: -------------------------------------------------------------------------------- 1 | import { alpha } from '@mui/material/styles'; 2 | import { linearProgressClasses } from '@mui/material/LinearProgress'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | const COLORS = ['primary', 'secondary', 'info', 'success', 'warning', 'error']; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | export function progress(theme) { 11 | const rootStyles = (ownerState) => { 12 | const bufferVariant = ownerState.variant === 'buffer'; 13 | 14 | const defaultStyle = { 15 | borderRadius: 4, 16 | [`& .${linearProgressClasses.bar}`]: { 17 | borderRadius: 4, 18 | }, 19 | ...(bufferVariant && { 20 | backgroundColor: 'transparent', 21 | }), 22 | }; 23 | 24 | const colorStyle = COLORS.map((color) => ({ 25 | ...(ownerState.color === color && { 26 | backgroundColor: alpha(theme.palette[color].main, 0.24), 27 | }), 28 | })); 29 | 30 | return [defaultStyle, ...colorStyle]; 31 | }; 32 | 33 | return { 34 | MuiLinearProgress: { 35 | styleOverrides: { 36 | root: ({ ownerState }) => rootStyles(ownerState), 37 | }, 38 | }, 39 | }; 40 | } 41 | -------------------------------------------------------------------------------- /src/theme/overrides/components/radio.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function radio(theme) { 4 | return { 5 | // CHECKBOX, RADIO, SWITCH 6 | MuiFormControlLabel: { 7 | styleOverrides: { 8 | label: { 9 | ...theme.typography.body2, 10 | }, 11 | }, 12 | }, 13 | 14 | MuiRadio: { 15 | styleOverrides: { 16 | root: { 17 | padding: theme.spacing(1), 18 | }, 19 | }, 20 | }, 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /src/theme/overrides/components/rating.js: -------------------------------------------------------------------------------- 1 | import { alpha } from '@mui/material/styles'; 2 | import { ratingClasses } from '@mui/material/Rating'; 3 | import { svgIconClasses } from '@mui/material/SvgIcon'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export function rating(theme) { 8 | return { 9 | MuiRating: { 10 | styleOverrides: { 11 | root: { 12 | [`&.${ratingClasses.disabled}`]: { 13 | opacity: 0.48, 14 | }, 15 | }, 16 | iconEmpty: { 17 | color: alpha(theme.palette.grey[500], 0.48), 18 | }, 19 | sizeSmall: { 20 | [`& .${svgIconClasses.root}`]: { 21 | width: 20, 22 | height: 20, 23 | }, 24 | }, 25 | sizeMedium: { 26 | [`& .${svgIconClasses.root}`]: { 27 | width: 24, 28 | height: 24, 29 | }, 30 | }, 31 | sizeLarge: { 32 | [`& .${svgIconClasses.root}`]: { 33 | width: 28, 34 | height: 28, 35 | }, 36 | }, 37 | }, 38 | }, 39 | }; 40 | } 41 | -------------------------------------------------------------------------------- /src/theme/overrides/components/select.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function select(theme) { 4 | return { 5 | MuiSelect: { 6 | styleOverrides: { 7 | icon: { 8 | right: 10, 9 | width: 18, 10 | height: 18, 11 | top: 'calc(50% - 9px)', 12 | }, 13 | }, 14 | }, 15 | MuiNativeSelect: { 16 | styleOverrides: { 17 | icon: { 18 | right: 10, 19 | width: 18, 20 | height: 18, 21 | top: 'calc(50% - 9px)', 22 | }, 23 | }, 24 | }, 25 | }; 26 | } 27 | -------------------------------------------------------------------------------- /src/theme/overrides/components/skeleton.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function skeleton(theme) { 4 | return { 5 | MuiSkeleton: { 6 | styleOverrides: { 7 | root: { 8 | backgroundColor: theme.palette.background.neutral, 9 | }, 10 | rounded: { 11 | borderRadius: theme.shape.borderRadius * 2, 12 | }, 13 | }, 14 | }, 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /src/theme/overrides/components/slider.js: -------------------------------------------------------------------------------- 1 | import { sliderClasses } from '@mui/material/Slider'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export function slider(theme) { 6 | const lightMode = theme.palette.mode === 'light'; 7 | 8 | return { 9 | MuiSlider: { 10 | styleOverrides: { 11 | root: { 12 | [`&.${sliderClasses.disabled}`]: { 13 | color: theme.palette.action.disabled, 14 | }, 15 | }, 16 | rail: { 17 | opacity: 0.32, 18 | }, 19 | markLabel: { 20 | fontSize: 13, 21 | color: theme.palette.text.disabled, 22 | }, 23 | valueLabel: { 24 | borderRadius: 8, 25 | backgroundColor: theme.palette.grey[lightMode ? 800 : 700], 26 | }, 27 | }, 28 | }, 29 | }; 30 | } 31 | -------------------------------------------------------------------------------- /src/theme/overrides/components/stepper.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function stepper(theme) { 4 | return { 5 | MuiStepConnector: { 6 | styleOverrides: { 7 | line: { 8 | borderColor: theme.palette.divider, 9 | }, 10 | }, 11 | }, 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /src/theme/overrides/components/svg-icon.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function svgIcon(theme) { 4 | return { 5 | MuiSvgIcon: { 6 | styleOverrides: { 7 | fontSizeLarge: { 8 | width: 32, 9 | height: 32, 10 | fontSize: 'inherit', 11 | }, 12 | }, 13 | }, 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /src/theme/overrides/components/tabs.js: -------------------------------------------------------------------------------- 1 | import { tabClasses } from '@mui/material/Tab'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export function tabs(theme) { 6 | return { 7 | MuiTabs: { 8 | styleOverrides: { 9 | indicator: { 10 | backgroundColor: theme.palette.text.primary, 11 | }, 12 | scrollButtons: { 13 | width: 48, 14 | borderRadius: '50%', 15 | }, 16 | }, 17 | }, 18 | MuiTab: { 19 | styleOverrides: { 20 | root: { 21 | padding: 0, 22 | opacity: 1, 23 | minWidth: 48, 24 | minHeight: 48, 25 | fontWeight: theme.typography.fontWeightSemiBold, 26 | '&:not(:last-of-type)': { 27 | marginRight: theme.spacing(3), 28 | [theme.breakpoints.up('sm')]: { 29 | marginRight: theme.spacing(5), 30 | }, 31 | }, 32 | [`&:not(.${tabClasses.selected})`]: { 33 | color: theme.palette.text.secondary, 34 | }, 35 | }, 36 | }, 37 | }, 38 | }; 39 | } 40 | -------------------------------------------------------------------------------- /src/theme/overrides/components/timeline.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function timeline(theme) { 4 | return { 5 | MuiTimelineDot: { 6 | styleOverrides: { 7 | root: { 8 | boxShadow: 'none', 9 | }, 10 | }, 11 | }, 12 | MuiTimelineConnector: { 13 | styleOverrides: { 14 | root: { 15 | backgroundColor: theme.palette.divider, 16 | }, 17 | }, 18 | }, 19 | }; 20 | } 21 | -------------------------------------------------------------------------------- /src/theme/overrides/components/tooltip.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function tooltip(theme) { 4 | const lightMode = theme.palette.mode === 'light'; 5 | 6 | return { 7 | MuiTooltip: { 8 | styleOverrides: { 9 | tooltip: { 10 | backgroundColor: theme.palette.grey[lightMode ? 800 : 700], 11 | }, 12 | arrow: { 13 | color: theme.palette.grey[lightMode ? 800 : 700], 14 | }, 15 | }, 16 | }, 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /src/theme/overrides/components/tree-view.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function treeView(theme) { 4 | return { 5 | MuiTreeItem: { 6 | styleOverrides: { 7 | label: { 8 | ...theme.typography.body2, 9 | }, 10 | iconContainer: { 11 | width: 'auto', 12 | }, 13 | }, 14 | }, 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /src/theme/overrides/components/typography.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function typography(theme) { 4 | return { 5 | MuiTypography: { 6 | styleOverrides: { 7 | paragraph: { 8 | marginBottom: theme.spacing(2), 9 | }, 10 | gutterBottom: { 11 | marginBottom: theme.spacing(1), 12 | }, 13 | }, 14 | }, 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/flatten-array.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function flattenArray(list, key = 'children') { 4 | let children = []; 5 | 6 | const flatten = list?.map((item) => { 7 | if (item[key] && item[key].length) { 8 | children = [...children, ...item[key]]; 9 | } 10 | return item; 11 | }); 12 | 13 | return flatten?.concat(children.length ? flattenArray(children, key) : children); 14 | } 15 | -------------------------------------------------------------------------------- /src/utils/format-number.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line import/no-extraneous-dependencies 2 | import numeral from 'numeral'; 3 | 4 | export function fNumber(number) { 5 | return numeral(number).format(); 6 | } 7 | 8 | export function fCurrency(number) { 9 | const format = number ? numeral(number).format('$0,0.00') : ''; 10 | 11 | return result(format, '.00'); 12 | } 13 | 14 | export function fPercent(number) { 15 | const format = number ? numeral(Number(number) / 100).format('0.0%') : ''; 16 | 17 | return result(format, '.0'); 18 | } 19 | 20 | export function fShortenNumber(number) { 21 | const format = number ? numeral(number).format('0.00a') : ''; 22 | 23 | return result(format, '.00'); 24 | } 25 | 26 | export function fData(number) { 27 | const format = number ? numeral(number).format('0.0 b') : ''; 28 | 29 | return result(format, '.0'); 30 | } 31 | 32 | function result(format, key = '.00') { 33 | const isInteger = format.includes(key); 34 | 35 | return isInteger ? format.replace(key, '') : format; 36 | } 37 | -------------------------------------------------------------------------------- /src/utils/format-time.js: -------------------------------------------------------------------------------- 1 | import { format, getTime, formatDistanceToNow } from 'date-fns'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export function fDate(date, newFormat) { 6 | const fm = newFormat || 'dd MMM yyyy'; 7 | 8 | return date ? format(new Date(date), fm) : ''; 9 | } 10 | 11 | export function fDateTime(date, newFormat) { 12 | const fm = newFormat || 'dd MMM yyyy p'; 13 | 14 | return date ? format(new Date(date), fm) : ''; 15 | } 16 | 17 | export function fTimestamp(date) { 18 | return date ? getTime(new Date(date)) : ''; 19 | } 20 | 21 | export function fToNow(date) { 22 | return date 23 | ? formatDistanceToNow(new Date(date), { 24 | addSuffix: true, 25 | }) 26 | : ''; 27 | } 28 | -------------------------------------------------------------------------------- /src/utils/storage-available.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function localStorageAvailable() { 4 | try { 5 | const key = '__some_random_key_you_are_not_going_to_use__'; 6 | window.localStorage.setItem(key, key); 7 | window.localStorage.removeItem(key); 8 | return true; 9 | } catch (error) { 10 | return false; 11 | } 12 | } 13 | 14 | export function localStorageGetItem(key, defaultValue = '') { 15 | const storageAvailable = localStorageAvailable(); 16 | 17 | let value; 18 | 19 | if (storageAvailable) { 20 | value = localStorage.getItem(key) || defaultValue; 21 | } 22 | 23 | return value; 24 | } 25 | -------------------------------------------------------------------------------- /src/utils/useUserData.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-unresolved */ 2 | import { useState, useEffect } from 'react'; 3 | 4 | import axios, { endpoints } from './axios'; 5 | 6 | const useUserData = (id) => { 7 | const [userData, setUserData] = useState(); 8 | 9 | useEffect(() => { 10 | axios 11 | .get(endpoints.user.list) 12 | .then((response) => { 13 | setUserData(response.data.items); 14 | }) 15 | .catch((error) => { 16 | console.log(error); 17 | }); 18 | }, []); 19 | 20 | return { 21 | userData, 22 | }; 23 | }; 24 | 25 | export default useUserData; 26 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "rewrites": [ 3 | { 4 | "source": "/(.*)", 5 | "destination": "/" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { defineConfig } from 'vite'; 3 | import react from '@vitejs/plugin-react-swc'; 4 | import checker from 'vite-plugin-checker'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | export default defineConfig({ 9 | plugins: [ 10 | react(), 11 | checker({ 12 | eslint: { 13 | lintCommand: 'eslint "./src/**/*.{js,jsx,ts,tsx}"', 14 | }, 15 | }), 16 | ], 17 | resolve: { 18 | alias: [ 19 | { 20 | find: /^~(.+)/, 21 | replacement: path.join(process.cwd(), 'node_modules/$1'), 22 | }, 23 | { 24 | find: /^src(.+)/, 25 | replacement: path.join(process.cwd(), 'src/$1'), 26 | }, 27 | ], 28 | }, 29 | server: { 30 | port: 3031, 31 | }, 32 | preview: { 33 | port: 3031, 34 | }, 35 | }); 36 | --------------------------------------------------------------------------------