├── .env.example ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .prettierrc ├── .vscode └── settings.json ├── .yarn └── install-state.gz ├── .yarnrc.yml ├── LICENSE ├── README.md ├── config.ts ├── jsconfig.json ├── next-env.d.ts ├── next.config.js ├── package-lock.json ├── package.json ├── public ├── assets │ ├── background │ │ ├── overlay_1.svg │ │ ├── overlay_2.jpg │ │ ├── overlay_3.jpg │ │ └── overlay_4.jpg │ ├── eotc.pdf │ ├── icons │ │ ├── faqs │ │ │ ├── ic_account.svg │ │ │ ├── ic_assurances.svg │ │ │ ├── ic_delivery.svg │ │ │ ├── ic_package.svg │ │ │ ├── ic_payment.svg │ │ │ └── ic_refund.svg │ │ ├── flags │ │ │ ├── Flag_of_Ethiopia.svg.png │ │ │ ├── ethiopia.svg │ │ │ ├── ic_flag_cn.svg │ │ │ ├── ic_flag_de.svg │ │ │ ├── ic_flag_en.svg │ │ │ ├── ic_flag_fr.svg │ │ │ ├── ic_flag_kr.svg │ │ │ ├── ic_flag_sa.svg │ │ │ ├── ic_flag_us.svg │ │ │ └── ic_flag_vn.svg │ │ ├── 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_cart.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_kanban.svg │ │ │ ├── ic_label.svg │ │ │ ├── ic_lock.svg │ │ │ ├── ic_mail.svg │ │ │ ├── ic_menu_item.svg │ │ │ └── ic_user.svg │ │ ├── notification │ │ │ ├── ic_chat.svg │ │ │ ├── ic_mail.svg │ │ │ ├── ic_package.svg │ │ │ └── ic_shipping.svg │ │ ├── payments │ │ │ ├── ic_mastercard.svg │ │ │ ├── ic_paypal.svg │ │ │ └── ic_visa.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 │ │ ├── illustration_dashboard.png │ │ ├── illustration_docs.svg │ │ ├── illustration_empty_cart.svg │ │ ├── illustration_empty_content.svg │ │ └── illustration_empty_mail.svg │ ├── images │ │ ├── avatars │ │ │ ├── avatar_1.jpg │ │ │ ├── avatar_10.jpg │ │ │ ├── avatar_11.jpg │ │ │ ├── avatar_12.jpg │ │ │ ├── avatar_13.jpg │ │ │ ├── avatar_14.jpg │ │ │ ├── avatar_15.jpg │ │ │ ├── avatar_16.jpg │ │ │ ├── avatar_17.jpg │ │ │ ├── avatar_18.jpg │ │ │ ├── avatar_19.jpg │ │ │ ├── avatar_2.jpg │ │ │ ├── avatar_20.jpg │ │ │ ├── avatar_21.jpg │ │ │ ├── avatar_22.jpg │ │ │ ├── avatar_23.jpg │ │ │ ├── avatar_24.jpg │ │ │ ├── avatar_3.jpg │ │ │ ├── avatar_4.jpg │ │ │ ├── avatar_5.jpg │ │ │ ├── avatar_6.jpg │ │ │ ├── avatar_7.jpg │ │ │ ├── avatar_8.jpg │ │ │ ├── avatar_9.jpg │ │ │ └── avatar_default.jpg │ │ ├── covers │ │ │ ├── cover_1.jpg │ │ │ ├── cover_10.jpg │ │ │ ├── cover_11.jpg │ │ │ ├── cover_12.jpg │ │ │ ├── cover_13.jpg │ │ │ ├── cover_14.jpg │ │ │ ├── cover_15.jpg │ │ │ ├── cover_16.jpg │ │ │ ├── cover_17.jpg │ │ │ ├── cover_18.jpg │ │ │ ├── cover_19.jpg │ │ │ ├── cover_2.jpg │ │ │ ├── cover_20.jpg │ │ │ ├── cover_21.jpg │ │ │ ├── cover_22.jpg │ │ │ ├── cover_23.jpg │ │ │ ├── cover_24.jpg │ │ │ ├── cover_25.jpg │ │ │ ├── cover_26.jpg │ │ │ ├── cover_3.jpg │ │ │ ├── cover_4.jpg │ │ │ ├── cover_5.jpg │ │ │ ├── cover_6.jpg │ │ │ ├── cover_7.jpg │ │ │ ├── cover_8.jpg │ │ │ └── cover_9.jpg │ │ ├── eotc.png │ │ ├── eotcmk.jpg │ │ ├── home │ │ │ ├── darkmode.png │ │ │ ├── for_teachers.png │ │ │ ├── rocket.png │ │ │ └── zone_landing.png │ │ └── products │ │ │ └── product.png │ ├── middle-logo-264x300.png │ ├── placeholder.svg │ ├── shape_avatar.svg │ └── 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_single.svg ├── manifest.json ├── robots.txt └── site.webmanifest ├── src ├── _mock │ ├── _account.ts │ ├── _blog.ts │ ├── _book.ts │ ├── _chat.ts │ ├── _files.ts │ ├── _kanban.ts │ ├── _mail.ts │ ├── _mock.js │ ├── _mock.ts │ ├── _products.ts │ ├── arrays │ │ ├── _analytics.js │ │ ├── _app.js │ │ ├── _banking.js │ │ ├── _booking.js │ │ ├── _courses.js │ │ ├── _ecommerce.js │ │ ├── _files.js │ │ ├── _invoice.js │ │ ├── _others.js │ │ ├── _plans.js │ │ ├── _user.js │ │ └── index.js │ ├── assets │ │ ├── address.js │ │ ├── address.ts │ │ ├── boolean.js │ │ ├── company.js │ │ ├── email.js │ │ ├── funcs.ts │ │ ├── index.js │ │ ├── name.js │ │ ├── number.js │ │ ├── phoneNumber.js │ │ ├── role.js │ │ └── text.js │ ├── index.js │ ├── index.ts │ ├── map │ │ ├── cities.js │ │ ├── countries.js │ │ └── map-style-basic-v8.json │ └── utils.js ├── assets │ ├── data │ │ ├── countries.js │ │ └── index.js │ ├── icons │ │ ├── EmailInboxIcon.js │ │ ├── PasswordIcon.js │ │ ├── PlanFreeIcon.js │ │ ├── PlanPremiumIcon.js │ │ ├── PlanStarterIcon.js │ │ ├── SentIcon.js │ │ └── index.js │ └── illustrations │ │ ├── BackgroundIllustration.js │ │ ├── BookingIllustration.js │ │ ├── CheckInIllustration.js │ │ ├── CheckOutIllustration.js │ │ ├── ComingSoonIllustration.js │ │ ├── ForbiddenIllustration.js │ │ ├── MaintenanceIllustration.js │ │ ├── MotivationIllustration.js │ │ ├── OrderCompleteIllustration.js │ │ ├── PageNotFoundIllustration.js │ │ ├── SeoIllustration.js │ │ ├── SeverErrorIllustration.js │ │ ├── UpgradeStorageIllustration.js │ │ ├── UploadIllustration.js │ │ └── index.js ├── auth │ ├── Auth0Context.js │ ├── AuthGuard.js │ ├── AwsCognitoContext.js │ ├── FirebaseContext.js │ ├── GuestGuard.js │ ├── JwtContext.js │ ├── RoleBasedGuard.js │ ├── useAuthContext.js │ └── utils.js ├── components │ ├── animate │ │ ├── DialogAnimate.js │ │ ├── FabButtonAnimate.js │ │ ├── IconButtonAnimate.js │ │ ├── MotionContainer.js │ │ ├── MotionLazyContainer.js │ │ ├── MotionViewport.js │ │ ├── TextAnimate.js │ │ ├── features.js │ │ ├── index.js │ │ └── 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 │ ├── badge-status │ │ ├── BadgeStatus.js │ │ ├── index.js │ │ └── styles.js │ ├── carousel │ │ ├── CarouselArrowIndex.js │ │ ├── CarouselArrows.js │ │ ├── CarouselDots.js │ │ ├── Icon.js │ │ └── index.js │ ├── chart │ │ ├── index.js │ │ ├── styles.js │ │ └── useChart.js │ ├── color-utils │ │ ├── ColorMultiPicker.js │ │ ├── ColorPreview.js │ │ ├── ColorSinglePicker.js │ │ ├── Icon.js │ │ └── index.js │ ├── confirm-dialog │ │ ├── ConfirmDialog.js │ │ └── index.js │ ├── custom-avatar │ │ ├── CustomAvatar.js │ │ ├── CustomAvatarGroup.js │ │ └── index.js │ ├── custom-breadcrumbs │ │ ├── CustomBreadcrumbs.js │ │ ├── LinkItem.js │ │ └── index.js │ ├── custom-input │ │ ├── CustomSmallSelect.js │ │ ├── CustomTextField.js │ │ ├── IncrementerButton.js │ │ └── index.js │ ├── date-range-picker │ │ ├── DateRangePicker.js │ │ ├── index.js │ │ └── useDateRangePicker.js │ ├── editor │ │ ├── Editor.js │ │ ├── EditorToolbar.js │ │ ├── index.js │ │ └── styles.js │ ├── empty-content │ │ ├── EmptyContent.js │ │ └── index.js │ ├── file-thumbnail │ │ ├── DownloadButton.js │ │ ├── FileThumbnail.js │ │ ├── index.js │ │ └── utils.js │ ├── hook-form │ │ ├── FormProvider.js │ │ ├── RHFAutocomplete.js │ │ ├── RHFCheckbox.js │ │ ├── RHFCodes.js │ │ ├── RHFEditor.js │ │ ├── RHFRadioGroup.js │ │ ├── RHFSelect.js │ │ ├── RHFSlider.js │ │ ├── RHFSwitch.js │ │ ├── RHFTextField.js │ │ ├── RHFUpload.js │ │ └── index.js │ ├── iconify │ │ ├── Iconify.js │ │ └── index.js │ ├── image │ │ ├── Image.js │ │ ├── getRatio.js │ │ └── index.js │ ├── label │ │ ├── Label.js │ │ ├── index.js │ │ └── styles.js │ ├── lightbox │ │ ├── Lightbox.js │ │ ├── index.js │ │ └── styles.js │ ├── loading-screen │ │ ├── LoadingScreen.js │ │ └── index.js │ ├── logo │ │ ├── Logo.js │ │ └── index.js │ ├── map │ │ ├── MapControl.js │ │ ├── MapMarker.js │ │ ├── MapPopup.js │ │ ├── index.js │ │ └── styles.js │ ├── markdown │ │ ├── Markdown.js │ │ ├── index.js │ │ └── styles.js │ ├── mega-menu │ │ ├── MegaMenuDesktopHorizon.js │ │ ├── MegaMenuDesktopVertical.js │ │ ├── MegaMenuMobile.js │ │ ├── MenuCarousel.js │ │ ├── MenuHotProducts.js │ │ └── index.js │ ├── menu-popover │ │ ├── MenuPopover.js │ │ ├── getPosition.js │ │ ├── index.js │ │ └── styles.js │ ├── nav-section │ │ ├── horizontal │ │ │ ├── NavItem.js │ │ │ ├── NavList.js │ │ │ ├── NavSectionHorizontal.js │ │ │ ├── index.js │ │ │ └── styles.js │ │ ├── index.js │ │ ├── mini │ │ │ ├── NavItem.js │ │ │ ├── NavList.js │ │ │ ├── NavSectionMini.js │ │ │ ├── index.js │ │ │ └── styles.js │ │ └── vertical │ │ │ ├── NavItem.js │ │ │ ├── NavList.js │ │ │ ├── NavSectionVertical.js │ │ │ ├── index.js │ │ │ └── styles.js │ ├── organizational-chart │ │ ├── OrganizationalChart.js │ │ ├── index.js │ │ └── node │ │ │ ├── GroupNode.js │ │ │ ├── SimpleNode.js │ │ │ ├── StandardNode.js │ │ │ └── index.js │ ├── progress-bar │ │ ├── ProgressBar.js │ │ ├── index.js │ │ └── styles.js │ ├── scrollbar │ │ ├── Scrollbar.js │ │ ├── index.js │ │ └── styles.js │ ├── search-not-found │ │ ├── SearchNotFound.js │ │ └── index.js │ ├── settings │ │ ├── SettingsContext.js │ │ ├── ThemeColorPresets.js │ │ ├── ThemeContrast.js │ │ ├── ThemeRtlLayout.js │ │ ├── ThemeSettings.js │ │ ├── config-setting.js │ │ ├── drawer │ │ │ ├── BadgeDot.js │ │ │ ├── Block.js │ │ │ ├── ColorPresetsOptions.js │ │ │ ├── ContrastOptions.js │ │ │ ├── DirectionOptions.js │ │ │ ├── FullScreenOptions.js │ │ │ ├── LayoutOptions.js │ │ │ ├── ModeOptions.js │ │ │ ├── SettingsDrawer.js │ │ │ ├── StretchOptions.js │ │ │ ├── ToggleButton.js │ │ │ └── index.js │ │ ├── index.js │ │ ├── presets.js │ │ └── styles.js │ ├── skeleton │ │ ├── SkeletonConversationItem.js │ │ ├── SkeletonKanbanColumn.js │ │ ├── SkeletonMailNavItem.js │ │ ├── SkeletonMap.js │ │ ├── SkeletonPostDetails.js │ │ ├── SkeletonPostItem.js │ │ ├── SkeletonProductDetails.js │ │ ├── SkeletonProductItem.js │ │ └── index.js │ ├── snackbar │ │ ├── SnackbarProvider.js │ │ ├── index.js │ │ └── styles.js │ ├── svg-color │ │ ├── SvgColor.js │ │ └── index.js │ ├── table │ │ ├── TableEmptyRows.js │ │ ├── TableHeadCustom.js │ │ ├── TableNoData.js │ │ ├── TablePaginationCustom.js │ │ ├── TableSelectedAction.js │ │ ├── TableSkeleton.js │ │ ├── index.js │ │ ├── useTable.js │ │ └── utils.js │ ├── text-max-line │ │ ├── TextMaxLine.js │ │ ├── index.js │ │ └── useTypography.js │ └── upload │ │ ├── Upload.js │ │ ├── UploadAvatar.js │ │ ├── UploadBox.js │ │ ├── errors │ │ └── RejectionFiles.js │ │ ├── index.js │ │ └── preview │ │ ├── AvatarPreview.js │ │ ├── MultiFilePreview.js │ │ └── SingleFilePreview.js ├── config-global.js ├── hooks │ ├── useActiveLink.js │ ├── useCopyToClipboard.js │ ├── useCountdown.js │ ├── useDoubleClick.js │ ├── useEventListener.js │ ├── useOffSetTop.js │ └── useResponsive.js ├── layouts │ ├── compact │ │ ├── CompactLayout.js │ │ ├── Header.js │ │ └── index.js │ ├── dashboard │ │ ├── DashboardLayout.js │ │ ├── Main.js │ │ ├── header │ │ │ ├── AccountPopover.js │ │ │ ├── ContactsPopover.js │ │ │ ├── Header.js │ │ │ ├── LanguagePopover.js │ │ │ ├── NotificationsPopover.js │ │ │ ├── Searchbar.js │ │ │ └── index.js │ │ ├── index.js │ │ └── nav │ │ │ ├── NavAccount.js │ │ │ ├── NavDocs.js │ │ │ ├── NavHorizontal.js │ │ │ ├── NavMini.js │ │ │ ├── NavToggleButton.js │ │ │ ├── NavVertical.js │ │ │ └── config-navigation.js │ ├── login │ │ ├── LoginLayout.js │ │ ├── index.js │ │ └── styles.js │ ├── main │ │ ├── Footer.js │ │ ├── Header.js │ │ ├── MainLayout.js │ │ ├── index.js │ │ └── nav │ │ │ ├── config-navigation.js │ │ │ ├── desktop │ │ │ ├── NavDesktop.js │ │ │ ├── NavItem.js │ │ │ ├── NavList.js │ │ │ ├── index.js │ │ │ └── styles.js │ │ │ └── mobile │ │ │ ├── NavItem.js │ │ │ ├── NavList.js │ │ │ ├── NavMobile.js │ │ │ ├── index.js │ │ │ └── styles.js │ └── simple │ │ ├── Header.js │ │ ├── SimpleLayout.js │ │ └── index.js ├── lib │ └── dbConnect.js ├── locales │ ├── ThemeLocalization.js │ ├── config-lang.js │ ├── i18n.js │ ├── index.js │ ├── langs │ │ ├── am.js │ │ ├── ao.js │ │ ├── ar.js │ │ ├── cn.js │ │ ├── en.js │ │ ├── fr.js │ │ └── vi.js │ └── useLocales.js ├── models │ ├── blog.js │ ├── book.js │ ├── course.js │ ├── test.js │ └── user.js ├── pages │ ├── 403.js │ ├── 404.js │ ├── 500.js │ ├── _app.js │ ├── _document.js │ ├── about-us.js │ ├── api │ │ ├── account │ │ │ ├── login.tsx │ │ │ ├── my-account.tsx │ │ │ └── register.tsx │ │ ├── ap │ │ │ └── [token].tsx │ │ ├── blog │ │ │ ├── post.tsx │ │ │ └── posts │ │ │ │ ├── index.tsx │ │ │ │ ├── recent.tsx │ │ │ │ └── search.tsx │ │ ├── book │ │ │ ├── index.tsx │ │ │ ├── post.tsx │ │ │ ├── recent.tsx │ │ │ └── search.tsx │ │ ├── books.js │ │ ├── calendar │ │ │ └── events │ │ │ │ ├── delete.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── new.tsx │ │ │ │ └── update.tsx │ │ ├── chat │ │ │ ├── contacts.tsx │ │ │ ├── conversation │ │ │ │ ├── index.tsx │ │ │ │ └── mark-as-seen.tsx │ │ │ ├── conversations.tsx │ │ │ ├── messages │ │ │ │ └── new.tsx │ │ │ ├── participants.tsx │ │ │ └── search.tsx │ │ ├── courses │ │ │ ├── [slug].tsx │ │ │ └── index.tsx │ │ ├── kanban │ │ │ ├── board.tsx │ │ │ └── columns │ │ │ │ ├── delete.tsx │ │ │ │ ├── new.tsx │ │ │ │ └── update.tsx │ │ ├── mail │ │ │ ├── labels.tsx │ │ │ ├── mail.tsx │ │ │ └── mails.tsx │ │ ├── posts.js │ │ ├── products │ │ │ ├── index.tsx │ │ │ ├── product.tsx │ │ │ └── search.tsx │ │ ├── santim │ │ │ └── [token].tsx │ │ └── user │ │ │ ├── index.tsx │ │ │ └── role.tsx │ ├── auth │ │ ├── login-unprotected.js │ │ ├── login.js │ │ ├── new-password.js │ │ ├── register-unprotected.js │ │ ├── register.js │ │ ├── reset-password.js │ │ └── verify.js │ ├── blog │ │ └── [title].js │ ├── blogs.js │ ├── coming-soon.js │ ├── contact-us.js │ ├── dashboard │ │ ├── analytics.js │ │ ├── app.js │ │ ├── banking.js │ │ ├── blank.js │ │ ├── blog │ │ │ ├── index.js │ │ │ ├── new.js │ │ │ ├── post │ │ │ │ └── [title].js │ │ │ └── posts.js │ │ ├── books │ │ │ ├── index.js │ │ │ └── new.js │ │ ├── calendar.js │ │ ├── chat │ │ │ ├── [conversationKey].js │ │ │ ├── index.js │ │ │ └── new.js │ │ ├── courses │ │ │ ├── [slug] │ │ │ │ ├── [lesson].js │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ └── list.js │ │ ├── e-commerce │ │ │ ├── checkout.js │ │ │ ├── index.js │ │ │ ├── list.js │ │ │ ├── product │ │ │ │ ├── [name].js │ │ │ │ ├── [name] │ │ │ │ │ └── edit.js │ │ │ │ └── new.js │ │ │ └── shop.js │ │ ├── ecommerce.js │ │ ├── file.js │ │ ├── index.js │ │ └── user │ │ │ ├── [name] │ │ │ └── edit.js │ │ │ ├── account.js │ │ │ ├── cards.js │ │ │ ├── index.js │ │ │ ├── list.js │ │ │ ├── new.js │ │ │ └── profile.js │ ├── faqs.js │ ├── index.js │ └── maintenance.js ├── redux │ ├── rootReducer.js │ ├── slices │ │ ├── calendar.js │ │ ├── chat.js │ │ ├── kanban.js │ │ ├── mail.js │ │ └── product.js │ └── store.js ├── routes │ └── paths.js ├── sections │ ├── @dashboard │ │ ├── blog │ │ │ ├── BlogNewPostForm.js │ │ │ ├── BlogNewPostPreview.js │ │ │ ├── BlogPostCard.js │ │ │ ├── BlogPostHero.js │ │ │ ├── BlogPostTags.js │ │ │ ├── comment │ │ │ │ ├── BlogPostCommentForm.js │ │ │ │ ├── BlogPostCommentItem.js │ │ │ │ └── BlogPostCommentList.js │ │ │ ├── filter │ │ │ │ ├── BlogPostsSearch.js │ │ │ │ └── BlogPostsSort.js │ │ │ └── index.js │ │ ├── books │ │ │ └── BookNewPostForm.js │ │ ├── calendar │ │ │ ├── CalendarFilterDrawer.js │ │ │ ├── CalendarForm.js │ │ │ ├── CalendarToolbar.js │ │ │ ├── index.js │ │ │ └── styles.js │ │ ├── chat │ │ │ ├── Chat.js │ │ │ ├── header │ │ │ │ ├── ChatHeaderCompose.js │ │ │ │ └── ChatHeaderDetail.js │ │ │ ├── index.js │ │ │ ├── message │ │ │ │ ├── ChatMessageInput.js │ │ │ │ ├── ChatMessageItem.js │ │ │ │ └── ChatMessageList.js │ │ │ ├── nav │ │ │ │ ├── ChatNav.js │ │ │ │ ├── ChatNavAccount.js │ │ │ │ ├── ChatNavItem.js │ │ │ │ ├── ChatNavList.js │ │ │ │ ├── ChatNavSearch.js │ │ │ │ └── ChatNavSearchResults.js │ │ │ └── room │ │ │ │ ├── ChatRoom.js │ │ │ │ ├── ChatRoomAttachments.js │ │ │ │ ├── ChatRoomCollapseButton.js │ │ │ │ ├── ChatRoomGroup.js │ │ │ │ ├── ChatRoomParticipantInfoDialog.js │ │ │ │ └── ChatRoomSingle.js │ │ ├── courses │ │ │ └── CourseCard.js │ │ ├── e-commerce │ │ │ ├── CartWidget.js │ │ │ ├── ProductNewEditForm.js │ │ │ ├── checkout │ │ │ │ ├── CheckoutOrderComplete.js │ │ │ │ ├── CheckoutSteps.js │ │ │ │ ├── CheckoutSummary.js │ │ │ │ ├── billing │ │ │ │ │ ├── CheckoutBillingAddress.js │ │ │ │ │ └── CheckoutBillingNewAddressForm.js │ │ │ │ ├── cart │ │ │ │ │ ├── CheckoutCart.js │ │ │ │ │ ├── CheckoutCartProduct.js │ │ │ │ │ └── CheckoutCartProductList.js │ │ │ │ ├── index.js │ │ │ │ └── payment │ │ │ │ │ ├── CheckoutBillingInfo.js │ │ │ │ │ ├── CheckoutDelivery.js │ │ │ │ │ ├── CheckoutPayment.js │ │ │ │ │ └── CheckoutPaymentMethods.js │ │ │ ├── details │ │ │ │ ├── ProductDetailsCarousel.js │ │ │ │ ├── ProductDetailsNewReviewForm.js │ │ │ │ ├── ProductDetailsReview.js │ │ │ │ ├── ProductDetailsReviewList.js │ │ │ │ ├── ProductDetailsSummary.js │ │ │ │ └── index.js │ │ │ ├── list │ │ │ │ ├── ProductTableRow.js │ │ │ │ ├── ProductTableToolbar.js │ │ │ │ └── index.js │ │ │ └── shop │ │ │ │ ├── ShopFilterDrawer.js │ │ │ │ ├── ShopProductCard.js │ │ │ │ ├── ShopProductList.js │ │ │ │ ├── ShopProductSearch.js │ │ │ │ ├── ShopProductSort.js │ │ │ │ ├── ShopTagFiltered.js │ │ │ │ └── index.js │ │ ├── file │ │ │ ├── FileChangeViewButton.js │ │ │ ├── FileInvitedItem.js │ │ │ ├── FilePanel.js │ │ │ ├── filter │ │ │ │ ├── FileFilterButton.js │ │ │ │ ├── FileFilterName.js │ │ │ │ └── FileFilterType.js │ │ │ ├── index.js │ │ │ ├── item │ │ │ │ ├── FileCard.js │ │ │ │ ├── FileFolderCard.js │ │ │ │ └── FileTableRow.js │ │ │ ├── portal │ │ │ │ ├── FileActionSelected.js │ │ │ │ ├── FileDetailsDrawer.js │ │ │ │ ├── FileNewFolderDialog.js │ │ │ │ └── FileShareDialog.js │ │ │ └── view │ │ │ │ ├── FileGridView.js │ │ │ │ └── FileListView.js │ │ ├── general │ │ │ ├── analytics │ │ │ │ ├── AnalyticsConversionRates.js │ │ │ │ ├── AnalyticsCurrentSubject.js │ │ │ │ ├── AnalyticsCurrentVisits.js │ │ │ │ ├── AnalyticsNewsUpdate.js │ │ │ │ ├── AnalyticsOrderTimeline.js │ │ │ │ ├── AnalyticsTasks.js │ │ │ │ ├── AnalyticsTrafficBySite.js │ │ │ │ ├── AnalyticsWebsiteVisits.js │ │ │ │ ├── AnalyticsWidgetSummary.js │ │ │ │ └── index.js │ │ │ ├── app │ │ │ │ ├── AppAreaInstalled.js │ │ │ │ ├── AppCurrentDownload.js │ │ │ │ ├── AppFeatured.js │ │ │ │ ├── AppNewInvoice.js │ │ │ │ ├── AppTopAuthors.js │ │ │ │ ├── AppTopInstalledCountries.js │ │ │ │ ├── AppTopRelated.js │ │ │ │ ├── AppWelcome.js │ │ │ │ ├── AppWidget.js │ │ │ │ ├── AppWidgetSummary.js │ │ │ │ └── index.js │ │ │ ├── banking │ │ │ │ ├── BankingBalanceStatistics.js │ │ │ │ ├── BankingContacts.js │ │ │ │ ├── BankingCurrentBalance.js │ │ │ │ ├── BankingExpensesCategories.js │ │ │ │ ├── BankingInviteFriends.js │ │ │ │ ├── BankingQuickTransfer.js │ │ │ │ ├── BankingRecentTransitions.js │ │ │ │ ├── BankingWidgetSummary.js │ │ │ │ └── index.js │ │ │ ├── e-commerce │ │ │ │ ├── EcommerceBestSalesman.js │ │ │ │ ├── EcommerceCurrentBalance.js │ │ │ │ ├── EcommerceLatestProducts.js │ │ │ │ ├── EcommerceNewProducts.js │ │ │ │ ├── EcommerceSaleByGender.js │ │ │ │ ├── EcommerceSalesOverview.js │ │ │ │ ├── EcommerceWidgetSummary.js │ │ │ │ ├── EcommerceYearlySales.js │ │ │ │ └── index.js │ │ │ └── file │ │ │ │ ├── FileGeneralDataActivity.js │ │ │ │ ├── FileGeneralRecentCard.js │ │ │ │ ├── FileGeneralStorageOverview.js │ │ │ │ ├── FileGeneralUpgrade.js │ │ │ │ ├── FileGeneralWidget.js │ │ │ │ └── index.js │ │ └── user │ │ │ ├── UserNewEditForm.js │ │ │ ├── account │ │ │ ├── AccountChangePassword.js │ │ │ ├── AccountGeneral.js │ │ │ ├── AccountNotifications.js │ │ │ ├── AccountSocialLinks.js │ │ │ └── index.js │ │ │ ├── cards │ │ │ ├── UserCard.js │ │ │ └── index.js │ │ │ ├── list │ │ │ ├── UserTableRow.js │ │ │ ├── UserTableToolbar.js │ │ │ └── index.js │ │ │ └── profile │ │ │ ├── ProfileCover.js │ │ │ ├── ProfileFollowers.js │ │ │ ├── ProfileFriends.js │ │ │ ├── ProfileGallery.js │ │ │ ├── home │ │ │ ├── Profile.js │ │ │ ├── ProfileAbout.js │ │ │ ├── ProfileFollowInfo.js │ │ │ ├── ProfilePostCard.js │ │ │ ├── ProfilePostInput.js │ │ │ └── ProfileSocialInfo.js │ │ │ └── index.js │ ├── _examples │ │ ├── Block.js │ │ ├── ComponentCard.js │ │ ├── ComponentHero.js │ │ ├── config-navigation.js │ │ ├── extra │ │ │ ├── animate │ │ │ │ ├── ControlPanel.js │ │ │ │ ├── background │ │ │ │ │ ├── ContainerView.js │ │ │ │ │ ├── Toolbar.js │ │ │ │ │ └── index.js │ │ │ │ ├── dialog │ │ │ │ │ ├── ContainerView.js │ │ │ │ │ └── index.js │ │ │ │ ├── getVariant.js │ │ │ │ ├── index.js │ │ │ │ ├── inview │ │ │ │ │ ├── ContainerView.js │ │ │ │ │ ├── Toolbar.js │ │ │ │ │ └── index.js │ │ │ │ ├── other │ │ │ │ │ ├── Button.js │ │ │ │ │ ├── Logo.js │ │ │ │ │ └── index.js │ │ │ │ └── scroll │ │ │ │ │ ├── ContainerView.js │ │ │ │ │ ├── Toolbar.js │ │ │ │ │ └── index.js │ │ │ ├── carousel │ │ │ │ ├── CarouselAnimation.js │ │ │ │ ├── CarouselBasic1.js │ │ │ │ ├── CarouselBasic2.js │ │ │ │ ├── CarouselBasic3.js │ │ │ │ ├── CarouselBasic4.js │ │ │ │ ├── CarouselCenterMode.js │ │ │ │ ├── CarouselThumbnail.js │ │ │ │ └── index.js │ │ │ ├── chart │ │ │ │ ├── ChartArea.js │ │ │ │ ├── ChartBar.js │ │ │ │ ├── ChartColumnMultiple.js │ │ │ │ ├── ChartColumnNegative.js │ │ │ │ ├── ChartColumnSingle.js │ │ │ │ ├── ChartColumnStacked.js │ │ │ │ ├── ChartDonut.js │ │ │ │ ├── ChartLine.js │ │ │ │ ├── ChartMixed.js │ │ │ │ ├── ChartPie.js │ │ │ │ ├── ChartRadarBar.js │ │ │ │ ├── ChartRadialBar.js │ │ │ │ └── index.js │ │ │ ├── form │ │ │ │ ├── ReactHookForm.js │ │ │ │ ├── ValuesPreview.js │ │ │ │ ├── index.js │ │ │ │ └── schema.js │ │ │ └── map │ │ │ │ ├── MapGeoJSONAnimation.js │ │ │ │ ├── MapHighlightByFilter.js │ │ │ │ ├── MapMarkersPopups.js │ │ │ │ ├── change-theme │ │ │ │ ├── ControlPanel.js │ │ │ │ └── index.js │ │ │ │ ├── clusters │ │ │ │ ├── index.js │ │ │ │ └── layers.js │ │ │ │ ├── draggable-markers │ │ │ │ ├── ControlPanel.js │ │ │ │ └── index.js │ │ │ │ ├── heatmap │ │ │ │ ├── ControlPanel.js │ │ │ │ ├── index.js │ │ │ │ └── map-style.js │ │ │ │ ├── interaction │ │ │ │ ├── ControlPanel.js │ │ │ │ └── index.js │ │ │ │ ├── side-by-side │ │ │ │ ├── ControlPanel.js │ │ │ │ └── index.js │ │ │ │ └── viewport-animation │ │ │ │ ├── ControlPanel.js │ │ │ │ └── index.js │ │ ├── index.js │ │ └── mui │ │ │ ├── Chips.js │ │ │ ├── Textfields.js │ │ │ ├── button │ │ │ ├── ButtonGroups.js │ │ │ ├── ButtonVariants.js │ │ │ ├── FloatingActionButton.js │ │ │ ├── IconButtons.js │ │ │ └── ToggleButtons.js │ │ │ ├── data-grid │ │ │ ├── DataGridBasic.js │ │ │ └── DataGridCustom.js │ │ │ ├── dialog │ │ │ ├── AlertDialog.js │ │ │ ├── FormDialogs.js │ │ │ ├── FullScreenDialogs.js │ │ │ ├── MaxWidthDialog.js │ │ │ ├── ScrollDialog.js │ │ │ ├── SimpleDialogs.js │ │ │ └── TransitionsDialogs.js │ │ │ ├── pickers │ │ │ ├── PickerDate.js │ │ │ ├── PickerDateRange.js │ │ │ ├── PickerDateTime.js │ │ │ └── PickerTime.js │ │ │ ├── progress │ │ │ ├── ProgressCircular.js │ │ │ └── ProgressLinear.js │ │ │ ├── stepper │ │ │ ├── CustomizedStepper.js │ │ │ ├── HorizontalLinearStepper.js │ │ │ ├── LinearAlternativeLabel.js │ │ │ └── VerticalLinearStepper.js │ │ │ ├── table │ │ │ ├── BasicTable.js │ │ │ ├── GroupingFixedHeader.js │ │ │ ├── collapsible-table │ │ │ │ ├── CollapsibleTableRow.js │ │ │ │ └── index.js │ │ │ └── sorting-selecting │ │ │ │ ├── SortingSelectingToolbar.js │ │ │ │ └── index.js │ │ │ └── transfer-list │ │ │ ├── EnhancedTransferList.js │ │ │ └── SimpleTransferList.js │ ├── about │ │ ├── AboutHero.js │ │ ├── AboutTeam.js │ │ ├── AboutTestimonials.js │ │ ├── AboutVision.js │ │ ├── AboutWhat.js │ │ └── index.js │ ├── auth │ │ ├── AuthLoginForm.js │ │ ├── AuthNewPasswordForm.js │ │ ├── AuthRegisterForm.js │ │ ├── AuthResetPasswordForm.js │ │ ├── AuthVerifyCodeForm.js │ │ ├── AuthWithSocial.js │ │ ├── Login.js │ │ ├── LoginAuth0.js │ │ └── Register.js │ ├── books │ │ ├── BookCard.js │ │ ├── BookDetails.js │ │ └── BookView.js │ ├── contact │ │ ├── ContactForm.js │ │ ├── ContactHero.js │ │ ├── ContactMap.js │ │ └── index.js │ ├── faqs │ │ ├── FaqsCategory.js │ │ ├── FaqsForm.js │ │ ├── FaqsHero.js │ │ ├── FaqsList.js │ │ └── index.js │ ├── home │ │ ├── HomeDarkMode.js │ │ ├── HomeFeatures.js │ │ ├── HomeForTeachers.js │ │ ├── HomeHero.js │ │ ├── HomeHugePackBooks.js │ │ ├── HomeLookingFor.js │ │ ├── HomeStart.js │ │ └── index.js │ └── payment │ │ ├── PaymentBillingAddress.js │ │ ├── PaymentMethods.js │ │ ├── PaymentNewCardDialog.js │ │ ├── PaymentSummary.js │ │ └── index.js ├── theme │ ├── colorpalette.ts │ ├── customShadows.js │ ├── globalStyles.js │ ├── index.js │ ├── overrides │ │ ├── Accordion.js │ │ ├── Alert.js │ │ ├── Autocomplete.js │ │ ├── Avatar.js │ │ ├── Backdrop.js │ │ ├── Badge.js │ │ ├── Breadcrumbs.js │ │ ├── Button.js │ │ ├── ButtonGroup.js │ │ ├── Card.js │ │ ├── Checkbox.js │ │ ├── Chip.js │ │ ├── ControlLabel.js │ │ ├── CustomIcons.js │ │ ├── DataGrid.js │ │ ├── Dialog.js │ │ ├── Drawer.js │ │ ├── Fab.js │ │ ├── Input.js │ │ ├── Link.js │ │ ├── List.js │ │ ├── LoadingButton.js │ │ ├── Menu.js │ │ ├── Pagination.js │ │ ├── Paper.js │ │ ├── Popover.js │ │ ├── Progress.js │ │ ├── Radio.js │ │ ├── Rating.js │ │ ├── Select.js │ │ ├── Skeleton.js │ │ ├── Slider.js │ │ ├── Stepper.js │ │ ├── SvgIcon.js │ │ ├── Switch.js │ │ ├── Table.js │ │ ├── Tabs.js │ │ ├── Timeline.js │ │ ├── ToggleButton.js │ │ ├── Tooltip.js │ │ ├── TreeView.js │ │ ├── Typography.js │ │ └── index.js │ ├── palette.js │ ├── shadows.js │ └── typography.js └── utils │ ├── axios.js │ ├── axios.ts │ ├── cors.ts │ ├── createEmotionCache.js │ ├── cssStyles.js │ ├── flattenArray.js │ ├── formatNumber.js │ ├── formatTime.js │ ├── highlight.js │ ├── init-middleware.js │ ├── localStorageAvailable.js │ └── uuidv4.js ├── tsconfig.json └── yarn.lock /.env.example: -------------------------------------------------------------------------------- 1 | # copy this file to .env.local and fill the values 2 | MONGODB_URI= -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | // .eslintignore 2 | **/node_modules/* 3 | **/out/* 4 | **/.next/* 5 | **/src/* 6 | next.config.js 7 | -------------------------------------------------------------------------------- /.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 | # next.js 12 | /.next/ 13 | /.swc/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env.local 30 | .env.development.local 31 | .env.test.local 32 | .env.production.local 33 | 34 | # vercel 35 | .vercel 36 | 37 | # Local Netlify folder 38 | .netlify 39 | 40 | _static 41 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true, 4 | "trailingComma": "es5", 5 | "tabWidth": 2 6 | } 7 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javascript.validate.enable": false, 3 | "typescript.validate.enable": false, 4 | } 5 | -------------------------------------------------------------------------------- /.yarn/install-state.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/.yarn/install-state.gz -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | -------------------------------------------------------------------------------- /config.ts: -------------------------------------------------------------------------------- 1 | // API 2 | // ---------------------------------------------------------------------- 3 | 4 | export const HOST_API = 5 | process.env.NODE_ENV === 'production' ? process.env.PRODUCTION_API || '' : process.env.DEV_API ? process.env.DEV_API : ''; 6 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "." 4 | }, 5 | "include": [ 6 | "src/**/*" 7 | ], 8 | "exclude": [ 9 | "node_modules" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | swcMinify: false, 3 | trailingSlash: true, 4 | env: { 5 | // HOST 6 | HOST_API_KEY: '', 7 | // CLOUD 8 | REACT_APP_CLOUD_NAME: 'dbyn25cyp', 9 | REACT_APP_CLOUD_API_KEY: '785511957617838', 10 | REACT_APP_CLOUD_API_SECRET: 'jE2ugA9Cc0nhvXG7V3BiuzYaEtY', 11 | REACT_APP_CLOUDINARY_URL: 'cloudinary://785511957617838:jE2ugA9Cc0nhvXG7V3BiuzYaEtY@dbyn25cyp', 12 | 13 | // MAPBOX 14 | MAPBOX_API: '', 15 | // FIREBASE 16 | FIREBASE_API_KEY: '', 17 | FIREBASE_AUTH_DOMAIN: '', 18 | FIREBASE_PROJECT_ID: '', 19 | FIREBASE_STORAGE_BUCKET: '', 20 | FIREBASE_MESSAGING_SENDER_ID: '', 21 | FIREBASE_APPID: '', 22 | FIREBASE_MEASUREMENT_ID: '', 23 | // AWS COGNITO 24 | AWS_COGNITO_USER_POOL_ID: '', 25 | AWS_COGNITO_CLIENT_ID: '', 26 | // AUTH0 27 | AUTH0_DOMAIN: '', 28 | AUTH0_CLIENT_ID: '', 29 | }, 30 | }; 31 | -------------------------------------------------------------------------------- /public/assets/background/overlay_1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/background/overlay_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/background/overlay_2.jpg -------------------------------------------------------------------------------- /public/assets/background/overlay_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/background/overlay_3.jpg -------------------------------------------------------------------------------- /public/assets/background/overlay_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/background/overlay_4.jpg -------------------------------------------------------------------------------- /public/assets/eotc.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/eotc.pdf -------------------------------------------------------------------------------- /public/assets/icons/flags/Flag_of_Ethiopia.svg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/icons/flags/Flag_of_Ethiopia.svg.png -------------------------------------------------------------------------------- /public/assets/icons/flags/ic_flag_fr.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/icons/flags/ic_flag_vn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | ic_flag_vn 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_blank.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /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_menu_item.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/assets/icons/navbar/ic_user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/icons/payments/ic_mastercard.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/icons/payments/ic_visa.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/icons/setting/ic_contrast_bold.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/assets/illustrations/illustration_dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/illustrations/illustration_dashboard.png -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_1.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_10.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_11.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_12.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_13.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_14.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_15.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_16.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_17.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_18.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_19.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_2.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_20.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_21.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_22.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_23.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_24.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_3.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_4.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_5.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_6.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_7.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_8.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_9.jpg -------------------------------------------------------------------------------- /public/assets/images/avatars/avatar_default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/avatars/avatar_default.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_1.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_10.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_11.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_12.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_13.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_14.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_15.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_16.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_17.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_18.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_19.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_2.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_20.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_21.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_22.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_23.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_24.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_25.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_26.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_3.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_4.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_5.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_6.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_7.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_8.jpg -------------------------------------------------------------------------------- /public/assets/images/covers/cover_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/covers/cover_9.jpg -------------------------------------------------------------------------------- /public/assets/images/eotc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/eotc.png -------------------------------------------------------------------------------- /public/assets/images/eotcmk.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/eotcmk.jpg -------------------------------------------------------------------------------- /public/assets/images/home/darkmode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/home/darkmode.png -------------------------------------------------------------------------------- /public/assets/images/home/for_teachers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/home/for_teachers.png -------------------------------------------------------------------------------- /public/assets/images/home/rocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/home/rocket.png -------------------------------------------------------------------------------- /public/assets/images/home/zone_landing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/home/zone_landing.png -------------------------------------------------------------------------------- /public/assets/images/products/product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/images/products/product.png -------------------------------------------------------------------------------- /public/assets/middle-logo-264x300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/middle-logo-264x300.png -------------------------------------------------------------------------------- /public/assets/placeholder.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/shape_avatar.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/assets/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/assets/transparent.png -------------------------------------------------------------------------------- /public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/favicon/favicon.ico -------------------------------------------------------------------------------- /public/fonts/CircularStd-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/fonts/CircularStd-Bold.otf -------------------------------------------------------------------------------- /public/fonts/CircularStd-Book.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/fonts/CircularStd-Book.otf -------------------------------------------------------------------------------- /public/fonts/CircularStd-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/fonts/CircularStd-Medium.otf -------------------------------------------------------------------------------- /public/fonts/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/public/fonts/Roboto-Bold.ttf -------------------------------------------------------------------------------- /public/fonts/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BisRyy/bet/04094fe286d63d674c173ff84dee2bf0fb03044f/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/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "React Material Bete Liq", 3 | "short_name": "BeteLiq", 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 | -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /src/_mock/_account.ts: -------------------------------------------------------------------------------- 1 | // config 2 | import { HOST_API } from '../../config'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export const JWT_SECRET = 'minimal-secret-key'; 7 | 8 | export const JWT_EXPIRES_IN = '3 days'; 9 | 10 | export const users = [ 11 | { 12 | id: '8864c717-587d-472a-929a-8e5f298024da-0', 13 | displayName: 'Beteliq Admin', 14 | email: 'dev@bisrat.tech', 15 | password: 'dev@bisrat.tech', 16 | photoURL: `${HOST_API}/assets/images/avatars/avatar_default.jpg`, 17 | phoneNumber: '++251 911 111 111', 18 | country: 'Ethiopia', 19 | address: 'Addis Ababa', 20 | state: 'Addis Ababa', 21 | city: 'Addis Ababa', 22 | zipCode: '1000', 23 | about: 'God is Good', 24 | role: 'superadmin', 25 | isPublic: true, 26 | }, 27 | ]; 28 | -------------------------------------------------------------------------------- /src/_mock/arrays/index.js: -------------------------------------------------------------------------------- 1 | export * from './_app'; 2 | export * from './_user'; 3 | export * from './_files'; 4 | export * from './_plans'; 5 | export * from './_others'; 6 | export * from './_booking'; 7 | export * from './_banking'; 8 | export * from './_invoice'; 9 | export * from './_ecommerce'; 10 | export * from './_analytics'; 11 | -------------------------------------------------------------------------------- /src/_mock/assets/address.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const fullAddress = [ 4 | // Ethiopian addresses 5 | 'Addis Ababa', 6 | 'Adama', 7 | 'Hawassa', 8 | 'Mekelle', 9 | 'Dire Dawa', 10 | 'Jimma', 11 | 'Bahir Dar', 12 | 'Gondar', 13 | 'Dessie', 14 | 'Awasa', 15 | ]; 16 | 17 | export const country = [ 18 | 'Ethiopia', 19 | 'Eritrea', 20 | ]; 21 | -------------------------------------------------------------------------------- /src/_mock/assets/boolean.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const boolean = [ 4 | true, 5 | true, 6 | true, 7 | false, 8 | false, 9 | true, 10 | false, 11 | false, 12 | false, 13 | false, 14 | true, 15 | true, 16 | true, 17 | false, 18 | false, 19 | false, 20 | true, 21 | false, 22 | false, 23 | false, 24 | true, 25 | false, 26 | false, 27 | true, 28 | true, 29 | true, 30 | false, 31 | false, 32 | true, 33 | true, 34 | false, 35 | true, 36 | false, 37 | true, 38 | true, 39 | true, 40 | false, 41 | true, 42 | false, 43 | false, 44 | ]; 45 | -------------------------------------------------------------------------------- /src/_mock/assets/funcs.ts: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function randomNumber(number: number) { 4 | return Math.floor(Math.random() * number) + 1; 5 | } 6 | 7 | export function randomNumberRange(min: number, max: number) { 8 | return Math.floor(Math.random() * (max - min + 1)) + min; 9 | } 10 | 11 | export function randomInArray(array: T[]) { 12 | return array[Math.floor(Math.random() * array.length)]; 13 | } 14 | -------------------------------------------------------------------------------- /src/_mock/assets/index.js: -------------------------------------------------------------------------------- 1 | export * from './name'; 2 | export * from './role'; 3 | export * from './text'; 4 | export * from './email'; 5 | export * from './number'; 6 | export * from './address'; 7 | export * from './boolean'; 8 | export * from './company'; 9 | export * from './phoneNumber'; 10 | -------------------------------------------------------------------------------- /src/_mock/assets/role.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const role = [ 4 | 'Admin', 5 | 'User', 6 | "Bishop", 7 | "Priest", 8 | "Deacon", 9 | "Subdeacon", 10 | "Reader", 11 | "Cantor", 12 | "Choir Director", 13 | "Iconographer", 14 | "Bell Ringer", 15 | "Altar Server", 16 | "Sacristan", 17 | "Chancellor", 18 | "Metropolitan", 19 | "Archbishop", 20 | "Abbot", 21 | "Monk", 22 | "Nun", 23 | "Lay Reader", 24 | "Youth Minister", 25 | "Catechist", 26 | "Missionary", 27 | "Theologian", 28 | "Chaplain", 29 | "Deaconess", 30 | "Lector", 31 | "Acolyte", 32 | "Chorister", 33 | "Teacher", 34 | "Elder", 35 | "Hospitality Coordinator", 36 | "Fundraiser", 37 | "Stewardship Director", 38 | "Social Media Coordinator", 39 | "Communications Director", 40 | "Archivist", 41 | "Researcher", 42 | "Historian", 43 | "Outreach Coordinator", 44 | "Camp Director", 45 | "Spiritual Director", 46 | "Missions Coordinator", 47 | "Choir Member", 48 | "Event Coordinator", 49 | "Volunteer Coordinator", 50 | ]; 51 | -------------------------------------------------------------------------------- /src/_mock/index.js: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | 3 | export { default } from './_mock'; 4 | -------------------------------------------------------------------------------- /src/_mock/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from './_mock'; 2 | -------------------------------------------------------------------------------- /src/_mock/utils.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function randomNumber(number) { 4 | return Math.floor(Math.random() * number) + 1; 5 | } 6 | 7 | export function randomNumberRange(min, max) { 8 | return Math.floor(Math.random() * (max - min + 1)) + min; 9 | } 10 | 11 | export function randomInArray(array) { 12 | return array[Math.floor(Math.random() * array.length)]; 13 | } 14 | -------------------------------------------------------------------------------- /src/assets/data/index.js: -------------------------------------------------------------------------------- 1 | export * from './countries'; 2 | -------------------------------------------------------------------------------- /src/assets/icons/index.js: -------------------------------------------------------------------------------- 1 | export { default as SentIcon } from './SentIcon'; 2 | export { default as PasswordIcon } from './PasswordIcon'; 3 | export { default as PlanFreeIcon } from './PlanFreeIcon'; 4 | export { default as EmailInboxIcon } from './EmailInboxIcon'; 5 | export { default as PlanStarterIcon } from './PlanStarterIcon'; 6 | export { default as PlanPremiumIcon } from './PlanPremiumIcon'; 7 | -------------------------------------------------------------------------------- /src/assets/illustrations/index.js: -------------------------------------------------------------------------------- 1 | export { default as SeoIllustration } from './SeoIllustration'; 2 | export { default as UploadIllustration } from './UploadIllustration'; 3 | export { default as BookingIllustration } from './BookingIllustration'; 4 | export { default as CheckInIllustration } from './CheckInIllustration'; 5 | export { default as CheckOutIllustration } from './CheckOutIllustration'; 6 | export { default as ForbiddenIllustration } from './ForbiddenIllustration'; 7 | export { default as SeverErrorIllustration } from './SeverErrorIllustration'; 8 | export { default as MotivationIllustration } from './MotivationIllustration'; 9 | export { default as ComingSoonIllustration } from './ComingSoonIllustration'; 10 | export { default as MaintenanceIllustration } from './MaintenanceIllustration'; 11 | export { default as PageNotFoundIllustration } from './PageNotFoundIllustration'; 12 | export { default as OrderCompleteIllustration } from './OrderCompleteIllustration'; 13 | export { default as UpgradeStorageIllustration } from './UpgradeStorageIllustration'; 14 | -------------------------------------------------------------------------------- /src/auth/GuestGuard.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { useEffect } from 'react'; 3 | // next 4 | import { useRouter } from 'next/router'; 5 | // routes 6 | import { PATH_DASHBOARD } from '../routes/paths'; 7 | // components 8 | import LoadingScreen from '../components/loading-screen'; 9 | // 10 | import { useAuthContext } from './useAuthContext'; 11 | 12 | // ---------------------------------------------------------------------- 13 | 14 | GuestGuard.propTypes = { 15 | children: PropTypes.node, 16 | }; 17 | 18 | export default function GuestGuard({ children }) { 19 | const { push } = useRouter(); 20 | 21 | const { isAuthenticated, isInitialized } = useAuthContext(); 22 | 23 | useEffect(() => { 24 | if (isAuthenticated) { 25 | push(PATH_DASHBOARD.root); 26 | } 27 | // eslint-disable-next-line react-hooks/exhaustive-deps 28 | }, [isAuthenticated]); 29 | 30 | if (isInitialized === isAuthenticated) { 31 | return ; 32 | } 33 | 34 | return <> {children} ; 35 | } 36 | -------------------------------------------------------------------------------- /src/auth/useAuthContext.js: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | // 3 | import { AuthContext } from './JwtContext'; 4 | // import { AuthContext } from './Auth0Context'; 5 | // import { AuthContext } from './FirebaseContext'; 6 | // import { AuthContext } from './AwsCognitoContext'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | export const useAuthContext = () => { 11 | const context = useContext(AuthContext); 12 | 13 | if (!context) throw new Error('useAuthContext context must be use inside AuthProvider'); 14 | 15 | return context; 16 | }; 17 | -------------------------------------------------------------------------------- /src/components/animate/MotionContainer.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { m } from 'framer-motion'; 3 | // @mui 4 | import { Box } from '@mui/material'; 5 | // 6 | import { varContainer } from './variants'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | MotionContainer.propTypes = { 11 | action: PropTypes.bool, 12 | animate: PropTypes.bool, 13 | children: PropTypes.node, 14 | }; 15 | 16 | export default function MotionContainer({ animate, action = false, children, ...other }) { 17 | if (action) { 18 | return ( 19 | 26 | {children} 27 | 28 | ); 29 | } 30 | 31 | return ( 32 | 40 | {children} 41 | 42 | ); 43 | } 44 | -------------------------------------------------------------------------------- /src/components/animate/MotionLazyContainer.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { LazyMotion, m } from 'framer-motion'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | // eslint-disable-next-line import/extensions 7 | const loadFeatures = () => import('./features.js').then((res) => res.default); 8 | 9 | MotionLazyContainer.propTypes = { 10 | children: PropTypes.node, 11 | }; 12 | 13 | export default function MotionLazyContainer({ children }) { 14 | return ( 15 | 16 | {children} 17 | 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /src/components/animate/MotionViewport.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { m } from 'framer-motion'; 3 | // @mui 4 | import { Box } from '@mui/material'; 5 | // hooks 6 | import useResponsive from '../../hooks/useResponsive'; 7 | // 8 | import { varContainer } from './variants'; 9 | 10 | // ---------------------------------------------------------------------- 11 | 12 | MotionViewport.propTypes = { 13 | children: PropTypes.node, 14 | disableAnimatedMobile: PropTypes.bool, 15 | }; 16 | 17 | export default function MotionViewport({ children, disableAnimatedMobile = true, ...other }) { 18 | const isMobile = useResponsive('down', 'sm'); 19 | 20 | if (isMobile && disableAnimatedMobile) { 21 | return {children}; 22 | } 23 | 24 | return ( 25 | 33 | {children} 34 | 35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /src/components/animate/TextAnimate.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { m } from 'framer-motion'; 3 | // @mui 4 | import { Box } from '@mui/material'; 5 | // 6 | import { varFade } from './variants'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | TextAnimate.propTypes = { 11 | text: PropTypes.string, 12 | variants: PropTypes.object, 13 | sx: PropTypes.object, 14 | }; 15 | 16 | export default function TextAnimate({ text, variants, sx, ...other }) { 17 | return ( 18 | 29 | {text.split('').map((letter, index) => ( 30 | 31 | {letter} 32 | 33 | ))} 34 | 35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /src/components/animate/features.js: -------------------------------------------------------------------------------- 1 | import { domMax } from 'framer-motion'; 2 | 3 | export default domMax; 4 | -------------------------------------------------------------------------------- /src/components/animate/index.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export * from './variants'; 4 | 5 | export { default as DialogAnimate } from './DialogAnimate'; 6 | export { default as TextAnimate } from './TextAnimate'; 7 | 8 | export { default as FabButtonAnimate } from './FabButtonAnimate'; 9 | export { default as IconButtonAnimate } from './IconButtonAnimate'; 10 | 11 | export { default as MotionViewport } from './MotionViewport'; 12 | export { default as MotionContainer } from './MotionContainer'; 13 | 14 | export { default as MotionLazyContainer } from './MotionLazyContainer'; 15 | -------------------------------------------------------------------------------- /src/components/animate/variants/actions.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export const varHover = (scale) => ({ 4 | hover: { 5 | scale: scale || 1.1, 6 | }, 7 | }); 8 | -------------------------------------------------------------------------------- /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 { varTranEnter, varTranExit } 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: { opacity: 1, rotate: 0, transition: varTranEnter({ durationIn, easeIn }) }, 16 | exit: { opacity: 0, rotate: -360, transition: varTranExit({ durationOut, easeOut }) }, 17 | }, 18 | 19 | // OUT 20 | out: { 21 | initial: { opacity: 1, rotate: 0 }, 22 | animate: { opacity: 0, rotate: -360, transition: varTranExit({ durationOut, easeOut }) }, 23 | }, 24 | }; 25 | }; 26 | -------------------------------------------------------------------------------- /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/badge-status/BadgeStatus.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // @mui 3 | import { useTheme } from '@mui/material/styles'; 4 | // 5 | import { StyledBadgeStatus } from './styles'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | BadgeStatus.propTypes = { 10 | sx: PropTypes.object, 11 | size: PropTypes.oneOf(['small', 'medium', 'large']), 12 | status: PropTypes.oneOf(['away', 'busy', 'unread', 'online', 'offline', 'invisible']), 13 | }; 14 | 15 | export default function BadgeStatus({ size = 'medium', status = 'offline', sx }) { 16 | const theme = useTheme(); 17 | 18 | return ; 19 | } 20 | -------------------------------------------------------------------------------- /src/components/badge-status/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './BadgeStatus'; 2 | -------------------------------------------------------------------------------- /src/components/carousel/index.js: -------------------------------------------------------------------------------- 1 | import Carousel from 'react-slick'; 2 | 3 | export { default as CarouselDots } from './CarouselDots'; 4 | export { default as CarouselArrows } from './CarouselArrows'; 5 | export { default as CarouselArrowIndex } from './CarouselArrowIndex'; 6 | 7 | export default Carousel; 8 | -------------------------------------------------------------------------------- /src/components/chart/index.js: -------------------------------------------------------------------------------- 1 | import dynamic from 'next/dynamic'; 2 | 3 | const Chart = dynamic(() => import('react-apexcharts'), { ssr: false }); 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | export { default as StyledChart } from './styles'; 8 | 9 | export { default as useChart } from './useChart'; 10 | 11 | export default Chart; 12 | -------------------------------------------------------------------------------- /src/components/color-utils/index.js: -------------------------------------------------------------------------------- 1 | export { default as ColorPreview } from './ColorPreview'; 2 | export { default as ColorMultiPicker } from './ColorMultiPicker'; 3 | export { default as ColorSinglePicker } from './ColorSinglePicker'; 4 | -------------------------------------------------------------------------------- /src/components/confirm-dialog/ConfirmDialog.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // @mui 3 | import { Dialog, Button, DialogTitle, DialogActions, DialogContent } from '@mui/material'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | ConfirmDialog.propTypes = { 8 | open: PropTypes.bool, 9 | title: PropTypes.node, 10 | action: PropTypes.node, 11 | content: PropTypes.node, 12 | onClose: PropTypes.func, 13 | }; 14 | 15 | export default function ConfirmDialog({ title, content, action, open, onClose, ...other }) { 16 | return ( 17 | 18 | {title} 19 | 20 | {content && {content} } 21 | 22 | 23 | {action} 24 | 25 | 28 | 29 | 30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /src/components/confirm-dialog/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './ConfirmDialog'; 2 | -------------------------------------------------------------------------------- /src/components/custom-avatar/index.js: -------------------------------------------------------------------------------- 1 | export { default as CustomAvatar } from './CustomAvatar'; 2 | export { default as CustomAvatarGroup } from './CustomAvatarGroup'; 3 | -------------------------------------------------------------------------------- /src/components/custom-breadcrumbs/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './CustomBreadcrumbs'; 2 | -------------------------------------------------------------------------------- /src/components/custom-input/CustomSmallSelect.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { alpha, styled } from '@mui/material/styles'; 3 | import { TextField } from '@mui/material'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | const CustomSmallSelect = styled((props) => ( 8 | 9 | ))(({ theme }) => ({ 10 | '& fieldset': { 11 | display: 'none', 12 | }, 13 | '& select': { 14 | ...theme.typography.subtitle2, 15 | padding: theme.spacing(0.5, 0, 0.5, 1), 16 | paddingRight: '28px !important', 17 | }, 18 | '& .MuiOutlinedInput-root': { 19 | borderRadius: Number(theme.shape.borderRadius) * 0.75, 20 | backgroundColor: alpha(theme.palette.grey[500], 0.08), 21 | }, 22 | })); 23 | 24 | export default CustomSmallSelect; 25 | -------------------------------------------------------------------------------- /src/components/custom-input/CustomTextField.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { alpha, styled } from '@mui/material/styles'; 3 | import { TextField } from '@mui/material'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | const CustomTextField = styled(TextField, { 8 | shouldForwardProp: (prop) => prop !== 'width', 9 | })(({ width, theme }) => ({ 10 | '& fieldset': { 11 | display: 'none', 12 | }, 13 | '& .MuiOutlinedInput-root': { 14 | width, 15 | border: `solid 1px ${alpha(theme.palette.grey[500], 0.32)}`, 16 | transition: theme.transitions.create(['box-shadow', 'width'], { 17 | duration: theme.transitions.duration.shorter, 18 | }), 19 | '&.Mui-focused': { 20 | boxShadow: theme.customShadows.z20, 21 | ...(width && { 22 | [theme.breakpoints.up('sm')]: { 23 | width: width + 60, 24 | }, 25 | }), 26 | }, 27 | }, 28 | })); 29 | 30 | export default CustomTextField; 31 | -------------------------------------------------------------------------------- /src/components/custom-input/index.js: -------------------------------------------------------------------------------- 1 | export { default as CustomSmallSelect } from './CustomSmallSelect'; 2 | export { default as CustomTextField } from './CustomTextField'; 3 | 4 | export { default as IncrementerButton } from './IncrementerButton'; 5 | -------------------------------------------------------------------------------- /src/components/date-range-picker/index.js: -------------------------------------------------------------------------------- 1 | export { default as useDateRangePicker } from './useDateRangePicker'; 2 | 3 | export { default } from './DateRangePicker'; 4 | -------------------------------------------------------------------------------- /src/components/editor/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Editor'; 2 | -------------------------------------------------------------------------------- /src/components/empty-content/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './EmptyContent'; 2 | -------------------------------------------------------------------------------- /src/components/file-thumbnail/index.js: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | 3 | export { default } from './FileThumbnail'; 4 | 5 | export { default as DownloadButton } from './DownloadButton'; 6 | -------------------------------------------------------------------------------- /src/components/hook-form/FormProvider.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // form 3 | import { FormProvider as Form } from 'react-hook-form'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | FormProvider.propTypes = { 8 | children: PropTypes.node, 9 | methods: PropTypes.object, 10 | onSubmit: PropTypes.func, 11 | }; 12 | 13 | export default function FormProvider({ children, onSubmit, methods }) { 14 | return ( 15 |
16 | {children}
17 | 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /src/components/hook-form/RHFSlider.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // form 3 | import { useFormContext, Controller } from 'react-hook-form'; 4 | // @mui 5 | import { Slider, FormHelperText } from '@mui/material'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | RHFSlider.propTypes = { 10 | name: PropTypes.string, 11 | helperText: PropTypes.node, 12 | }; 13 | 14 | export default function RHFSlider({ name, helperText, ...other }) { 15 | const { control } = useFormContext(); 16 | 17 | return ( 18 | ( 22 |
23 | 24 | 25 | {(!!error || helperText) && ( 26 | {error ? error?.message : helperText} 27 | )} 28 |
29 | )} 30 | /> 31 | ); 32 | } 33 | -------------------------------------------------------------------------------- /src/components/hook-form/RHFSwitch.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // form 3 | import { useFormContext, Controller } from 'react-hook-form'; 4 | // @mui 5 | import { Switch, FormControlLabel, FormHelperText } from '@mui/material'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | RHFSwitch.propTypes = { 10 | name: PropTypes.string, 11 | helperText: PropTypes.node, 12 | }; 13 | 14 | export default function RHFSwitch({ name, helperText, ...other }) { 15 | const { control } = useFormContext(); 16 | 17 | return ( 18 | ( 22 |
23 | } {...other} /> 24 | 25 | {(!!error || helperText) && ( 26 | {error ? error?.message : helperText} 27 | )} 28 |
29 | )} 30 | /> 31 | ); 32 | } 33 | -------------------------------------------------------------------------------- /src/components/hook-form/RHFTextField.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // form 3 | import { useFormContext, Controller } from 'react-hook-form'; 4 | // @mui 5 | import { TextField } from '@mui/material'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | RHFTextField.propTypes = { 10 | name: PropTypes.string, 11 | helperText: PropTypes.node, 12 | }; 13 | 14 | export default function RHFTextField({ name, helperText, ...other }) { 15 | const { control } = useFormContext(); 16 | 17 | return ( 18 | ( 22 | 30 | )} 31 | /> 32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /src/components/hook-form/index.js: -------------------------------------------------------------------------------- 1 | export * from './RHFUpload'; 2 | export * from './RHFSelect'; 3 | export * from './RHFCheckbox'; 4 | 5 | export { default } from './FormProvider'; 6 | 7 | export { default as RHFCodes } from './RHFCodes'; 8 | export { default as RHFSwitch } from './RHFSwitch'; 9 | export { default as RHFEditor } from './RHFEditor'; 10 | export { default as RHFSlider } from './RHFSlider'; 11 | export { default as RHFTextField } from './RHFTextField'; 12 | export { default as RHFRadioGroup } from './RHFRadioGroup'; 13 | export { default as RHFAutocomplete } from './RHFAutocomplete'; 14 | -------------------------------------------------------------------------------- /src/components/iconify/Iconify.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { forwardRef } from 'react'; 3 | // icons 4 | import { Icon } from '@iconify/react'; 5 | // @mui 6 | import { Box } from '@mui/material'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | const Iconify = forwardRef(({ icon, width = 20, sx, ...other }, ref) => ( 11 | 12 | )); 13 | 14 | Iconify.propTypes = { 15 | sx: PropTypes.object, 16 | width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), 17 | icon: PropTypes.oneOfType([PropTypes.element, PropTypes.string]), 18 | }; 19 | 20 | export default Iconify; 21 | -------------------------------------------------------------------------------- /src/components/iconify/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Iconify'; 2 | -------------------------------------------------------------------------------- /src/components/image/getRatio.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export default function getRatio(ratio = '1/1') { 4 | return { 5 | '4/3': 'calc(100% / 4 * 3)', 6 | '3/4': 'calc(100% / 3 * 4)', 7 | '6/4': 'calc(100% / 6 * 4)', 8 | '4/6': 'calc(100% / 4 * 6)', 9 | '16/9': 'calc(100% / 16 * 9)', 10 | '9/16': 'calc(100% / 9 * 16)', 11 | '21/9': 'calc(100% / 21 * 9)', 12 | '9/21': 'calc(100% / 9 * 21)', 13 | '1/1': '100%', 14 | }[ratio]; 15 | } 16 | -------------------------------------------------------------------------------- /src/components/image/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Image'; 2 | -------------------------------------------------------------------------------- /src/components/label/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Label'; 2 | -------------------------------------------------------------------------------- /src/components/lightbox/index.js: -------------------------------------------------------------------------------- 1 | export * from 'yet-another-react-lightbox'; 2 | 3 | export { default } from './Lightbox'; 4 | -------------------------------------------------------------------------------- /src/components/loading-screen/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './LoadingScreen'; 2 | -------------------------------------------------------------------------------- /src/components/logo/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Logo'; 2 | -------------------------------------------------------------------------------- /src/components/map/MapMarker.js: -------------------------------------------------------------------------------- 1 | import { Marker } from 'react-map-gl'; 2 | // @mui 3 | import { Box } from '@mui/material'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | const SIZE = 20; 8 | 9 | const ICON = `M20.2,15.7L20.2,15.7c1.1-1.6,1.8-3.6,1.8-5.7c0-5.6-4.5-10-10-10S2,4.5,2,10c0,2,0.6,3.9,1.6,5.4c0,0.1,0.1,0.2,0.2,0.3 10 | c0,0,0.1,0.1,0.1,0.2c0.2,0.3,0.4,0.6,0.7,0.9c2.6,3.1,7.4,7.6,7.4,7.6s4.8-4.5,7.4-7.5c0.2-0.3,0.5-0.6,0.7-0.9 11 | C20.1,15.8,20.2,15.8,20.2,15.7z`; 12 | 13 | // ---------------------------------------------------------------------- 14 | 15 | export default function MapMarker({ ...other }) { 16 | return ( 17 | 18 | theme.palette.error.main, 26 | transform: `translate(${-SIZE / 2}px,${-SIZE}px)`, 27 | }} 28 | > 29 | 30 | 31 | 32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /src/components/map/MapPopup.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // 3 | import { StyledPopup } from './styles'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | MapPopup.propTypes = { 8 | children: PropTypes.node, 9 | sx: PropTypes.object, 10 | }; 11 | 12 | export default function MapPopup({ sx, children, ...other }) { 13 | return ( 14 | 15 | {children} 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/components/map/index.js: -------------------------------------------------------------------------------- 1 | export * from './styles'; 2 | 3 | export { default as MapPopup } from './MapPopup'; 4 | export { default as MapMarker } from './MapMarker'; 5 | export { default as MapControl } from './MapControl'; 6 | -------------------------------------------------------------------------------- /src/components/markdown/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Markdown'; 2 | -------------------------------------------------------------------------------- /src/components/mega-menu/index.js: -------------------------------------------------------------------------------- 1 | export { default as MegaMenuMobile } from './MegaMenuMobile'; 2 | export { default as MegaMenuDesktopHorizon } from './MegaMenuDesktopHorizon'; 3 | export { default as MegaMenuDesktopVertical } from './MegaMenuDesktopVertical'; 4 | -------------------------------------------------------------------------------- /src/components/menu-popover/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './MenuPopover'; 2 | -------------------------------------------------------------------------------- /src/components/nav-section/horizontal/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './NavSectionHorizontal'; 2 | -------------------------------------------------------------------------------- /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 './NavSectionMini'; 2 | -------------------------------------------------------------------------------- /src/components/nav-section/vertical/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './NavSectionVertical'; 2 | -------------------------------------------------------------------------------- /src/components/organizational-chart/index.js: -------------------------------------------------------------------------------- 1 | import dynamic from 'next/dynamic'; 2 | 3 | const OrganizationalChart = dynamic(() => import('./OrganizationalChart'), { ssr: false }); 4 | 5 | export default OrganizationalChart; 6 | -------------------------------------------------------------------------------- /src/components/organizational-chart/node/SimpleNode.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // @mui 3 | import { alpha } from '@mui/material/styles'; 4 | import { Typography, Card } from '@mui/material'; 5 | 6 | // ---------------------------------------------------------------------- 7 | 8 | SimpleNode.propTypes = { 9 | node: PropTypes.object, 10 | sx: PropTypes.object, 11 | }; 12 | 13 | export default function SimpleNode({ node, sx }) { 14 | return ( 15 | (theme.palette.mode === 'light' ? 'primary.darker' : 'primary.lighter'), 23 | bgcolor: (theme) => alpha(theme.palette.primary.main, 0.08), 24 | border: (theme) => `1px solid ${alpha(theme.palette.primary.main, 0.24)}`, 25 | ...sx, 26 | }} 27 | > 28 | {node.name} 29 | 30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /src/components/organizational-chart/node/index.js: -------------------------------------------------------------------------------- 1 | export { default as GroupNode } from './GroupNode'; 2 | export { default as SimpleNode } from './SimpleNode'; 3 | export { default as StandardNode } from './StandardNode'; 4 | -------------------------------------------------------------------------------- /src/components/progress-bar/index.js: -------------------------------------------------------------------------------- 1 | export { default as StyledProgressBar } from './styles'; 2 | 3 | export { default } from './ProgressBar'; 4 | -------------------------------------------------------------------------------- /src/components/scrollbar/Scrollbar.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { memo } from 'react'; 3 | // @mui 4 | import { Box } from '@mui/material'; 5 | // 6 | import { StyledRootScrollbar, StyledScrollbar } from './styles'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | Scrollbar.propTypes = { 11 | sx: PropTypes.object, 12 | children: PropTypes.node, 13 | }; 14 | 15 | function Scrollbar({ children, sx, ...other }) { 16 | const userAgent = typeof navigator === 'undefined' ? 'SSR' : navigator.userAgent; 17 | 18 | const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent); 19 | 20 | if (isMobile) { 21 | return ( 22 | 23 | {children} 24 | 25 | ); 26 | } 27 | 28 | return ( 29 | 30 | 31 | {children} 32 | 33 | 34 | ); 35 | } 36 | 37 | export default memo(Scrollbar); 38 | -------------------------------------------------------------------------------- /src/components/scrollbar/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Scrollbar'; 2 | -------------------------------------------------------------------------------- /src/components/scrollbar/styles.js: -------------------------------------------------------------------------------- 1 | import SimpleBar from 'simplebar-react'; 2 | // @mui 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/SearchNotFound.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // @mui 3 | import { Paper, Typography } from '@mui/material'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | SearchNotFound.propTypes = { 8 | query: PropTypes.string, 9 | sx: PropTypes.object, 10 | }; 11 | 12 | export default function SearchNotFound({ query, sx, ...other }) { 13 | return query ? ( 14 | 21 | 22 | Not found 23 | 24 | 25 | 26 | No results found for   27 | "{query}". 28 |
Try checking for typos or using complete words. 29 |
30 |
31 | ) : ( 32 | 33 | Please enter keywords 34 | 35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /src/components/search-not-found/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './SearchNotFound'; 2 | -------------------------------------------------------------------------------- /src/components/settings/ThemeColorPresets.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import merge from 'lodash/merge'; 3 | import { useMemo } from 'react'; 4 | // @mui 5 | import { alpha, ThemeProvider, createTheme, useTheme } from '@mui/material/styles'; 6 | // 7 | import { useSettingsContext } from './SettingsContext'; 8 | 9 | // ---------------------------------------------------------------------- 10 | 11 | ThemeColorPresets.propTypes = { 12 | children: PropTypes.node, 13 | }; 14 | 15 | export default function ThemeColorPresets({ children }) { 16 | const outerTheme = useTheme(); 17 | 18 | const { presetsColor } = useSettingsContext(); 19 | 20 | const themeOptions = useMemo( 21 | () => ({ 22 | palette: { 23 | primary: presetsColor, 24 | }, 25 | customShadows: { 26 | primary: `0 8px 16px 0 ${alpha(presetsColor.main, 0.24)}`, 27 | }, 28 | }), 29 | [presetsColor] 30 | ); 31 | 32 | const theme = createTheme(merge(outerTheme, themeOptions)); 33 | 34 | return {children}; 35 | } 36 | -------------------------------------------------------------------------------- /src/components/settings/ThemeRtlLayout.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { useEffect } from 'react'; 3 | // rtl 4 | import { prefixer } from 'stylis'; 5 | import rtlPlugin from 'stylis-plugin-rtl'; 6 | // emotion 7 | import createCache from '@emotion/cache'; 8 | import { CacheProvider } from '@emotion/react'; 9 | // @mui 10 | import { useTheme } from '@mui/material/styles'; 11 | 12 | // ---------------------------------------------------------------------- 13 | 14 | ThemeRtlLayout.propTypes = { 15 | children: PropTypes.node, 16 | }; 17 | 18 | export default function ThemeRtlLayout({ children }) { 19 | const theme = useTheme(); 20 | 21 | useEffect(() => { 22 | document.dir = theme.direction; 23 | }, [theme.direction]); 24 | 25 | const cacheRtl = createCache({ 26 | key: theme.direction === 'rtl' ? 'rtl' : 'css', 27 | stylisPlugins: theme.direction === 'rtl' ? [prefixer, rtlPlugin] : [], 28 | }); 29 | 30 | return {children}; 31 | } 32 | -------------------------------------------------------------------------------- /src/components/settings/ThemeSettings.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import ThemeContrast from './ThemeContrast'; 3 | import ThemeRtlLayout from './ThemeRtlLayout'; 4 | import ThemeColorPresets from './ThemeColorPresets'; 5 | import SettingsDrawer from './drawer'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | ThemeSettings.propTypes = { 10 | children: PropTypes.node, 11 | }; 12 | 13 | export default function ThemeSettings({ children }) { 14 | return ( 15 | 16 | 17 | 18 | {children} 19 | {/* */} 20 | 21 | 22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /src/components/settings/config-setting.js: -------------------------------------------------------------------------------- 1 | // PLEASE REMOVE `LOCAL STORAGE` WHEN YOU CHANGE SETTINGS. 2 | // ---------------------------------------------------------------------- 3 | 4 | export const defaultSettings = { 5 | themeMode: 'light', 6 | themeDirection: 'ltr', 7 | themeContrast: 'default', 8 | themeLayout: 'mini', 9 | themeColorPresets: 'default', 10 | themeStretch: false, 11 | }; 12 | -------------------------------------------------------------------------------- /src/components/settings/drawer/BadgeDot.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // @mui 3 | import { Box } from '@mui/material'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | BadgeDot.propTypes = { 8 | sx: PropTypes.object, 9 | }; 10 | 11 | export default function BadgeDot({ sx, ...other }) { 12 | return ( 13 | 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /src/components/settings/drawer/LayoutOptions.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { RadioGroup } from '@mui/material'; 3 | // 4 | import { useSettingsContext } from '../SettingsContext'; 5 | import { StyledCard, StyledWrap, MaskControl, LayoutIcon } from '../styles'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | const OPTIONS = ['vertical', 'horizontal', 'mini']; 10 | 11 | export default function LayoutOptions() { 12 | const { themeLayout, onChangeLayout } = useSettingsContext(); 13 | 14 | return ( 15 | 16 | 17 | {OPTIONS.map((layout) => ( 18 | 19 | 20 | 21 | 22 | 23 | ))} 24 | 25 | 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /src/components/settings/drawer/ModeOptions.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { RadioGroup } from '@mui/material'; 3 | // 4 | import SvgColor from '../../svg-color'; 5 | import { useSettingsContext } from '../SettingsContext'; 6 | import { StyledCard, StyledWrap, MaskControl } from '../styles'; 7 | 8 | // ---------------------------------------------------------------------- 9 | 10 | const OPTIONS = ['light', 'dark']; 11 | 12 | export default function ModeOptions() { 13 | const { themeMode, onChangeMode } = useSettingsContext(); 14 | 15 | return ( 16 | 17 | 18 | {OPTIONS.map((mode) => ( 19 | 20 | 23 | 24 | 25 | 26 | ))} 27 | 28 | 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /src/components/settings/drawer/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './SettingsDrawer'; 2 | -------------------------------------------------------------------------------- /src/components/settings/index.js: -------------------------------------------------------------------------------- 1 | export { SettingsProvider, useSettingsContext } from './SettingsContext'; 2 | 3 | export { default as ThemeSettings } from './ThemeSettings'; 4 | -------------------------------------------------------------------------------- /src/components/skeleton/SkeletonConversationItem.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // @mui 3 | import { Stack, Skeleton } from '@mui/material'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | SkeletonConversationItem.propTypes = { 8 | sx: PropTypes.object, 9 | }; 10 | 11 | export default function SkeletonConversationItem({ sx, ...other }) { 12 | return ( 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /src/components/skeleton/SkeletonKanbanColumn.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { Stack, Skeleton, Box, Paper } from '@mui/material'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function SkeletonKanbanColumn({ ...other }) { 7 | return ( 8 | 9 | {[...Array(3)].map((_, index) => ( 10 | 11 | 12 | 13 | 14 | {index === 0 && ( 15 | 16 | )} 17 | 18 | {index !== 2 && ( 19 | 20 | )} 21 | 22 | 23 | ))} 24 | 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /src/components/skeleton/SkeletonMailNavItem.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // @mui 3 | import { Stack, Skeleton } from '@mui/material'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | SkeletonMailNavItem.propTypes = { 8 | sx: PropTypes.object, 9 | }; 10 | 11 | export default function SkeletonMailNavItem({ sx, ...other }) { 12 | return ( 13 | 14 | 15 | 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/components/skeleton/SkeletonMap.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { Stack, Skeleton } from '@mui/material'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function SkeletonMap({ ...other }) { 7 | return ( 8 | 9 | {[...Array(5)].map((_, index) => ( 10 | 15 | ))} 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/components/skeleton/SkeletonPostDetails.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { Box, Skeleton } from '@mui/material'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function SkeletonPostDetails() { 7 | return ( 8 | <> 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/components/skeleton/SkeletonPostItem.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { Box, Skeleton, Grid } from '@mui/material'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function SkeletonPostItem({ ...other }) { 7 | return ( 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /src/components/skeleton/SkeletonProductDetails.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { Grid, Skeleton } from '@mui/material'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function SkeletonProductDetails({ ...other }) { 7 | return ( 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /src/components/skeleton/SkeletonProductItem.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { Card, Skeleton, Stack } from '@mui/material'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function SkeletonProductItem({ ...other }) { 7 | return ( 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /src/components/skeleton/index.js: -------------------------------------------------------------------------------- 1 | export { default as SkeletonMap } from './SkeletonMap'; 2 | export { default as SkeletonPostItem } from './SkeletonPostItem'; 3 | export { default as SkeletonPostDetails } from './SkeletonPostDetails'; 4 | export { default as SkeletonProductItem } from './SkeletonProductItem'; 5 | export { default as SkeletonMailNavItem } from './SkeletonMailNavItem'; 6 | export { default as SkeletonKanbanColumn } from './SkeletonKanbanColumn'; 7 | export { default as SkeletonProductDetails } from './SkeletonProductDetails'; 8 | export { default as SkeletonConversationItem } from './SkeletonConversationItem'; 9 | -------------------------------------------------------------------------------- /src/components/snackbar/index.js: -------------------------------------------------------------------------------- 1 | export * from 'notistack'; 2 | 3 | export { default } from './SnackbarProvider'; 4 | -------------------------------------------------------------------------------- /src/components/svg-color/SvgColor.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | import { forwardRef } from 'react'; 3 | // @mui 4 | import { Box } from '@mui/material'; 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/svg-color/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './SvgColor'; 2 | -------------------------------------------------------------------------------- /src/components/table/TableEmptyRows.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // @mui 3 | import { TableRow, TableCell } from '@mui/material'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | TableEmptyRows.propTypes = { 8 | height: PropTypes.number, 9 | emptyRows: PropTypes.number, 10 | }; 11 | 12 | export default function TableEmptyRows({ emptyRows, height }) { 13 | if (!emptyRows) { 14 | return null; 15 | } 16 | 17 | return ( 18 | 25 | 26 | 27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /src/components/table/TableNoData.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // @mui 3 | import { TableRow, TableCell } from '@mui/material'; 4 | // 5 | import EmptyContent from '../empty-content'; 6 | 7 | // ---------------------------------------------------------------------- 8 | 9 | TableNoData.propTypes = { 10 | isNotFound: PropTypes.bool, 11 | }; 12 | 13 | export default function TableNoData({ isNotFound }) { 14 | return ( 15 | 16 | {isNotFound ? ( 17 | 18 | 24 | 25 | ) : ( 26 | 27 | )} 28 | 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /src/components/table/TableSkeleton.js: -------------------------------------------------------------------------------- 1 | // @mui 2 | import { TableRow, TableCell, Skeleton, Stack } from '@mui/material'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function TableSkeleton({ ...other }) { 7 | return ( 8 | 9 | 10 | 11 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /src/components/table/index.js: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | 3 | export { default as useTable } from './useTable'; 4 | 5 | export { default as TableNoData } from './TableNoData'; 6 | export { default as TableSkeleton } from './TableSkeleton'; 7 | export { default as TableEmptyRows } from './TableEmptyRows'; 8 | export { default as TableHeadCustom } from './TableHeadCustom'; 9 | export { default as TableSelectedAction } from './TableSelectedAction'; 10 | export { default as TablePaginationCustom } from './TablePaginationCustom'; 11 | -------------------------------------------------------------------------------- /src/components/table/utils.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------- 2 | 3 | export function emptyRows(page, rowsPerPage, arrayLength) { 4 | return page > 0 ? Math.max(0, (1 + page) * rowsPerPage - arrayLength) : 0; 5 | } 6 | 7 | function descendingComparator(a, b, orderBy) { 8 | if (b[orderBy] < a[orderBy]) { 9 | return -1; 10 | } 11 | if (b[orderBy] > a[orderBy]) { 12 | return 1; 13 | } 14 | return 0; 15 | } 16 | 17 | export function getComparator(order, orderBy) { 18 | return order === 'desc' 19 | ? (a, b) => descendingComparator(a, b, orderBy) 20 | : (a, b) => -descendingComparator(a, b, orderBy); 21 | } 22 | -------------------------------------------------------------------------------- /src/components/text-max-line/index.js: -------------------------------------------------------------------------------- 1 | export { default as useTypography } from './useTypography'; 2 | 3 | export { default } from './TextMaxLine'; 4 | -------------------------------------------------------------------------------- /src/components/upload/index.js: -------------------------------------------------------------------------------- 1 | export { default as RejectionFiles } from './errors/RejectionFiles'; 2 | 3 | export { default as AvatarPreview } from './preview/AvatarPreview'; 4 | export { default as MultiFilePreview } from './preview/MultiFilePreview'; 5 | export { default as SingleFilePreview } from './preview/SingleFilePreview'; 6 | 7 | export { default as Upload } from './Upload'; 8 | export { default as UploadBox } from './UploadBox'; 9 | export { default as UploadAvatar } from './UploadAvatar'; 10 | -------------------------------------------------------------------------------- /src/components/upload/preview/AvatarPreview.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // 3 | import Image from '../../image'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | AvatarPreview.propTypes = { 8 | file: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), 9 | }; 10 | 11 | export default function AvatarPreview({ file }) { 12 | if (!file) { 13 | return null; 14 | } 15 | 16 | const imgUrl = typeof file === 'string' ? file : file.preview; 17 | 18 | return ( 19 | avatar 31 | ); 32 | } 33 | -------------------------------------------------------------------------------- /src/components/upload/preview/SingleFilePreview.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // 3 | import Image from '../../image'; 4 | 5 | // ---------------------------------------------------------------------- 6 | 7 | SingleFilePreview.propTypes = { 8 | file: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), 9 | }; 10 | 11 | export default function SingleFilePreview({ file }) { 12 | if (!file) { 13 | return null; 14 | } 15 | 16 | const imgUrl = typeof file === 'string' ? file : file.preview; 17 | 18 | return ( 19 | file preview 32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /src/hooks/useActiveLink.js: -------------------------------------------------------------------------------- 1 | import { useRouter } from 'next/router'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export default function useActiveLink(path, deep = true) { 6 | const { pathname, asPath } = useRouter(); 7 | 8 | const checkPath = path.startsWith('#'); 9 | 10 | const currentPath = path === '/' ? '/' : `${path}/`; 11 | 12 | const normalActive = 13 | (!checkPath && pathname === currentPath) || (!checkPath && asPath === currentPath); 14 | 15 | const deepActive = 16 | (!checkPath && pathname.includes(currentPath)) || (!checkPath && asPath.includes(currentPath)); 17 | 18 | return { 19 | active: deep ? deepActive : normalActive, 20 | isExternalLink: path.includes('http'), 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /src/hooks/useCopyToClipboard.js: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | function useCopyToClipboard() { 6 | const [copiedText, setCopiedText] = useState(null); 7 | 8 | const copy = async (text) => { 9 | if (!navigator?.clipboard) { 10 | console.warn('Clipboard not supported'); 11 | return false; 12 | } 13 | 14 | // Try to save to clipboard then save it in the state if worked 15 | try { 16 | await navigator.clipboard.writeText(text); 17 | setCopiedText(text); 18 | return true; 19 | } catch (error) { 20 | console.warn('Copy failed', error); 21 | setCopiedText(null); 22 | return false; 23 | } 24 | }; 25 | 26 | return { copiedText, copy }; 27 | } 28 | 29 | export default useCopyToClipboard; 30 | -------------------------------------------------------------------------------- /src/hooks/useDoubleClick.js: -------------------------------------------------------------------------------- 1 | import { useCallback, useRef } from 'react'; 2 | 3 | // ---------------------------------------------------------------------- 4 | 5 | export default function useDoubleClick({ click, doubleClick, timeout = 250 }) { 6 | const clickTimeout = useRef(); 7 | 8 | const clearClickTimeout = () => { 9 | if (clickTimeout) { 10 | clearTimeout(clickTimeout.current); 11 | clickTimeout.current = null; 12 | } 13 | }; 14 | 15 | return useCallback( 16 | (event) => { 17 | clearClickTimeout(); 18 | if (click && event.detail === 1) { 19 | clickTimeout.current = setTimeout(() => { 20 | click(event); 21 | }, timeout); 22 | } 23 | if (event.detail % 2 === 0) { 24 | doubleClick(event); 25 | } 26 | }, 27 | [click, doubleClick, timeout] 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/hooks/useOffSetTop.js: -------------------------------------------------------------------------------- 1 | import { useScroll } from 'framer-motion'; 2 | import { useState, useEffect } from 'react'; 3 | 4 | // ---------------------------------------------------------------------- 5 | 6 | export default function useOffSetTop(top = 100, options) { 7 | const { scrollY } = useScroll(options); 8 | 9 | const [value, setValue] = useState(false); 10 | 11 | useEffect( 12 | () => 13 | scrollY.on('change', (scrollHeight) => { 14 | if (scrollHeight > top) { 15 | setValue(true); 16 | } else { 17 | setValue(false); 18 | } 19 | }), 20 | [scrollY, top] 21 | ); 22 | 23 | return value; 24 | } 25 | 26 | // Usage 27 | // const offset = useOffSetTop(100); 28 | 29 | // Or 30 | // const offset = useOffSetTop(100, { 31 | // container: ref, 32 | // }); 33 | -------------------------------------------------------------------------------- /src/layouts/compact/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './CompactLayout'; 2 | -------------------------------------------------------------------------------- /src/layouts/dashboard/header/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './Header'; 2 | -------------------------------------------------------------------------------- /src/layouts/dashboard/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './DashboardLayout'; 2 | -------------------------------------------------------------------------------- /src/layouts/login/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './LoginLayout'; 2 | -------------------------------------------------------------------------------- /src/layouts/main/MainLayout.js: -------------------------------------------------------------------------------- 1 | import PropTypes from 'prop-types'; 2 | // next 3 | import dynamic from 'next/dynamic'; 4 | import { useRouter } from 'next/router'; 5 | // @mui 6 | import { Box } from '@mui/material'; 7 | // 8 | const Header = dynamic(() => import('./Header'), { ssr: false }); 9 | const Footer = dynamic(() => import('./Footer'), { ssr: false }); 10 | 11 | // ---------------------------------------------------------------------- 12 | 13 | MainLayout.propTypes = { 14 | children: PropTypes.node, 15 | }; 16 | 17 | export default function MainLayout({ children }) { 18 | const { pathname } = useRouter(); 19 | 20 | const isHome = pathname === '/'; 21 | 22 | return ( 23 | 24 |
25 | 26 | 35 | {children} 36 | 37 | 38 |