@orbe-agro/client-core 5.3.9 → 5.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/@ecme/assets/styles/app.css +1 -1
- package/dist/@ecme/assets/styles/components/_input.css +1 -1
- package/dist/@ecme/assets/styles/components/_select.css +1 -1
- package/dist/@ecme/assets/styles/components/_tabs.css +1 -1
- package/dist/@ecme/assets/styles/components/index.css +1 -1
- package/dist/@ecme/assets/styles/tailwind/index.css +1 -1
- package/dist/@ecme/auth/AuthContext.js.map +1 -1
- package/dist/@ecme/auth/AuthProvider.js.map +1 -1
- package/dist/@ecme/components/docs/DemoCard/CardFooter.js.map +1 -1
- package/dist/@ecme/components/docs/DemoCard/DemoCard.js.map +1 -1
- package/dist/@ecme/components/docs/DocumentationNav.js.map +1 -1
- package/dist/@ecme/components/layouts/AuthLayout/AuthLayout.js.map +1 -1
- package/dist/@ecme/components/layouts/PostLoginLayout/PostLoginLayout.js.map +1 -1
- package/dist/@ecme/components/route/AppRoute.js.map +1 -1
- package/dist/@ecme/components/shared/AbbreviateNumber.js.map +1 -1
- package/dist/@ecme/components/shared/Affix.js.map +1 -1
- package/dist/@ecme/components/shared/AutoComplete.js.map +1 -1
- package/dist/@ecme/components/shared/CalendarView.js.map +1 -1
- package/dist/@ecme/components/shared/Chart.js.map +1 -1
- package/dist/@ecme/components/shared/ConfirmDialog.js.map +1 -1
- package/dist/@ecme/components/shared/DataTable.js.map +1 -1
- package/dist/@ecme/components/shared/DebounceInput.js.map +1 -1
- package/dist/@ecme/components/shared/GanttChart/TaskListTable.js.map +1 -1
- package/dist/@ecme/components/shared/GanttChart/getStartEndDateForProject.js.map +1 -1
- package/dist/@ecme/components/shared/GanttChart/tasksPreProcess.js.map +1 -1
- package/dist/@ecme/components/shared/Masonry/breakpoints.js.map +1 -1
- package/dist/@ecme/components/shared/Masonry/useCoulmnsCount.js.map +1 -1
- package/dist/@ecme/components/shared/Masonry/useMasonry.js.map +1 -1
- package/dist/@ecme/components/shared/Masonry/useWindowWidth.js.map +1 -1
- package/dist/@ecme/components/shared/OtpInput.js.map +1 -1
- package/dist/@ecme/components/shared/PasswordInput.js.map +1 -1
- package/dist/@ecme/components/shared/RegionMap.js.map +1 -1
- package/dist/@ecme/components/shared/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/@ecme/components/shared/StickyFooter.js.map +1 -1
- package/dist/@ecme/components/shared/StrictModeDroppable.js.map +1 -1
- package/dist/@ecme/components/shared/ToggleDrawer.js.map +1 -1
- package/dist/@ecme/components/shared/UsersAvatarGroup.js.map +1 -1
- package/dist/@ecme/components/template/HorizontalMenuContent/HorizontalMenuDropdown.js.map +1 -1
- package/dist/@ecme/components/template/HorizontalMenuContent/HorizontalMenuDropdownContent.js.map +1 -1
- package/dist/@ecme/components/template/HorizontalMenuContent/HorizontalMenuDropdownTrigger.js.map +1 -1
- package/dist/@ecme/components/template/LanguageSelector.js.map +1 -1
- package/dist/@ecme/components/template/MobileNav.js.map +1 -1
- package/dist/@ecme/components/template/Notification/Notification.js.map +1 -1
- package/dist/@ecme/components/template/Search.js.map +1 -1
- package/dist/@ecme/components/template/SideNavToggle.js.map +1 -1
- package/dist/@ecme/components/template/SidePanel/SidePanel.js.map +1 -1
- package/dist/@ecme/components/template/StackedSideNav/StackedSideNav.js.map +1 -1
- package/dist/@ecme/components/template/StackedSideNav/StackedSideNavMini.js.map +1 -1
- package/dist/@ecme/components/template/StackedSideNav/StackedSideNavSecondary.js.map +1 -1
- package/dist/@ecme/components/template/ThemeConfigurator/CopyButton.js.map +1 -1
- package/dist/@ecme/components/template/ThemeConfigurator/DirectionSwitcher.js.map +1 -1
- package/dist/@ecme/components/template/ThemeConfigurator/LayoutSwitcher.js.map +1 -1
- package/dist/@ecme/components/template/ThemeConfigurator/ModeSwitcher.js.map +1 -1
- package/dist/@ecme/components/template/UserProfileDropdown.js.map +1 -1
- package/dist/@ecme/components/template/VerticalMenuContent/VerticalMenuContent.js.map +1 -1
- package/dist/@ecme/components/ui/Alert/Alert.js.map +1 -1
- package/dist/@ecme/components/ui/Avatar/Avatar.js.map +1 -1
- package/dist/@ecme/components/ui/Avatar/AvatarGroup.js.map +1 -1
- package/dist/@ecme/components/ui/Button/Button.js.map +1 -1
- package/dist/@ecme/components/ui/Card/Card.js.map +1 -1
- package/dist/@ecme/components/ui/Checkbox/Checkbox.js.map +1 -1
- package/dist/@ecme/components/ui/Checkbox/Group.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/BasePicker.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/Calendar.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/CalendarBase.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/DatePicker.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/DatePickerRange.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/DateTimepicker.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/RangeCalendar.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/tables/DateTable.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/tables/MonthTable.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/tables/YearTable.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/tables/components/Month.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/utils/getDecadeRange.js.map +1 -1
- package/dist/@ecme/components/ui/DatePicker/utils/getMonthDays.js.map +1 -1
- package/dist/@ecme/components/ui/Dialog/Dialog.js.map +1 -1
- package/dist/@ecme/components/ui/Drawer/Drawer.js.map +1 -1
- package/dist/@ecme/components/ui/Dropdown/DropdownItem.js.map +1 -1
- package/dist/@ecme/components/ui/Dropdown/DropdownMenu.js.map +1 -1
- package/dist/@ecme/components/ui/Dropdown/context/menuContext.js.map +1 -1
- package/dist/@ecme/components/ui/Form/FormItem.js.map +1 -1
- package/dist/@ecme/components/ui/Input/Input.js.map +1 -1
- package/dist/@ecme/components/ui/Menu/MenuCollapse.js.map +1 -1
- package/dist/@ecme/components/ui/MenuItem/index.js.map +1 -1
- package/dist/@ecme/components/ui/Notification/Notification.js.map +1 -1
- package/dist/@ecme/components/ui/Pagination/Next.js.map +1 -1
- package/dist/@ecme/components/ui/Pagination/Pagers.js.map +1 -1
- package/dist/@ecme/components/ui/Pagination/Pagination.js.map +1 -1
- package/dist/@ecme/components/ui/Pagination/Prev.js.map +1 -1
- package/dist/@ecme/components/ui/Progress/Circle.js.map +1 -1
- package/dist/@ecme/components/ui/Progress/Progress.js.map +1 -1
- package/dist/@ecme/components/ui/Radio/Group.js.map +1 -1
- package/dist/@ecme/components/ui/Radio/Radio.js.map +1 -1
- package/dist/@ecme/components/ui/Segment/Segment.js.map +1 -1
- package/dist/@ecme/components/ui/Segment/SegmentItem.js.map +1 -1
- package/dist/@ecme/components/ui/Select/Select.js.map +1 -1
- package/dist/@ecme/components/ui/Steps/StepItem.js.map +1 -1
- package/dist/@ecme/components/ui/Steps/Steps.js.map +1 -1
- package/dist/@ecme/components/ui/Switcher/Switcher.js.map +1 -1
- package/dist/@ecme/components/ui/Tabs/TabNav.js.map +1 -1
- package/dist/@ecme/components/ui/TimeInput/AmPmInput.js.map +1 -1
- package/dist/@ecme/components/ui/TimeInput/TimeInput.js.map +1 -1
- package/dist/@ecme/components/ui/TimeInput/TimeInputField.js.map +1 -1
- package/dist/@ecme/components/ui/TimeInput/TimeInputRange.js.map +1 -1
- package/dist/@ecme/components/ui/TimeInput/utils/createAmPmHandler.js.map +1 -1
- package/dist/@ecme/components/ui/TimeInput/utils/createTimeHandler.js.map +1 -1
- package/dist/@ecme/components/ui/Tooltip/Arrow.js.map +1 -1
- package/dist/@ecme/components/ui/Tooltip/Tooltip.js.map +1 -1
- package/dist/@ecme/components/ui/Upload/Upload.js.map +1 -1
- package/dist/@ecme/components/ui/hooks/useCallbackRef.js.map +1 -1
- package/dist/@ecme/components/ui/hooks/useControllableState.js.map +1 -1
- package/dist/@ecme/components/ui/hooks/useDidUpdate.js.map +1 -1
- package/dist/@ecme/components/ui/hooks/useMergeRef.js.map +1 -1
- package/dist/@ecme/components/ui/hooks/useRootClose.js.map +1 -1
- package/dist/@ecme/components/ui/hooks/useTimeout.js.map +1 -1
- package/dist/@ecme/components/ui/hooks/useWindowSize.js.map +1 -1
- package/dist/@ecme/components/ui/toast/ToastWrapper.js.map +1 -1
- package/dist/@ecme/components/ui/toast/toast.js.map +1 -1
- package/dist/@ecme/components/ui/utils/chainedFunction.js.map +1 -1
- package/dist/@ecme/components/ui/utils/mapCloneElement.js.map +1 -1
- package/dist/@ecme/components/view/Activity/ActivityAvatar.js.map +1 -1
- package/dist/@ecme/components/view/Activity/ActivityEvent.js.map +1 -1
- package/dist/@ecme/components/view/ChatBox/components/Attachment.js.map +1 -1
- package/dist/@ecme/components/view/ChatBox/components/ChatInput.js.map +1 -1
- package/dist/@ecme/components/view/CreditCardDialog/CreditCardDialog.js.map +1 -1
- package/dist/@ecme/configs/chart.config.js.map +1 -1
- package/dist/@ecme/constants/theme.constant.js +23 -23
- package/dist/@ecme/constants/theme.constant.js.map +1 -1
- package/dist/@ecme/mock/fakeApi/accountsFakeApi.js.map +1 -1
- package/dist/@ecme/mock/fakeApi/aiFakeApi.js.map +1 -1
- package/dist/@ecme/mock/fakeApi/authFakeApi.js.map +1 -1
- package/dist/@ecme/mock/fakeApi/commonFakeApi.js.map +1 -1
- package/dist/@ecme/mock/fakeApi/customersFakeApi.js.map +1 -1
- package/dist/@ecme/mock/fakeApi/fileFakeApi.js.map +1 -1
- package/dist/@ecme/mock/fakeApi/helpCenterFakeApi.js.map +1 -1
- package/dist/@ecme/mock/fakeApi/ordersFakeApi.js.map +1 -1
- package/dist/@ecme/mock/fakeApi/productsFakeApi.js.map +1 -1
- package/dist/@ecme/services/ApiService.js.map +1 -1
- package/dist/@ecme/services/axios/AxiosRequestIntrceptorConfigCallback.js.map +1 -1
- package/dist/@ecme/store/authStore.js.map +1 -1
- package/dist/@ecme/store/localeStore.js.map +1 -1
- package/dist/@ecme/utils/cookiesStorage.js.map +1 -1
- package/dist/@ecme/utils/hoc/withHeaderItem.js.map +1 -1
- package/dist/@ecme/utils/hooks/useDarkMode.js.map +1 -1
- package/dist/@ecme/utils/hooks/useDirection.js.map +1 -1
- package/dist/@ecme/utils/hooks/useInfiniteScroll.js.map +1 -1
- package/dist/@ecme/utils/hooks/useInterval .js.map +1 -1
- package/dist/@ecme/utils/hooks/useLayoutGap.js.map +1 -1
- package/dist/@ecme/utils/hooks/useLocale.js.map +1 -1
- package/dist/@ecme/utils/hooks/useMenuActive.js.map +1 -1
- package/dist/@ecme/utils/hooks/useRandomBgColor.js.map +1 -1
- package/dist/@ecme/utils/hooks/useResponsive.js.map +1 -1
- package/dist/@ecme/utils/hooks/useScrollTop.js.map +1 -1
- package/dist/@ecme/utils/hooks/useThemeSchema.js.map +1 -1
- package/dist/@ecme/utils/hooks/useTimeOutMessage.js.map +1 -1
- package/dist/@ecme/utils/reorderDragable.js.map +1 -1
- package/dist/@ecme/utils/sortBy.js.map +1 -1
- package/dist/@ecme/utils/wildCardSearch.js.map +1 -1
- package/dist/@ecme/views/auth/ForgotPassword/ForgotPassword.js.map +1 -1
- package/dist/@ecme/views/auth/ForgotPassword/components/ForgotPasswordForm.js.map +1 -1
- package/dist/@ecme/views/auth/OtpVerification/OtpVerification.js.map +1 -1
- package/dist/@ecme/views/auth/OtpVerification/components/OtpVerificationForm.js.map +1 -1
- package/dist/@ecme/views/auth/ResetPassword/ResetPassword.js.map +1 -1
- package/dist/@ecme/views/auth/ResetPassword/components/ResetPasswordForm.js.map +1 -1
- package/dist/@ecme/views/auth/SignIn/components/OauthSignIn.js.map +1 -1
- package/dist/@ecme/views/auth/SignIn/components/SignInForm.js.map +1 -1
- package/dist/@ecme/views/auth/SignUp/components/SignUpForm.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/ActivityLog/ActivityLog.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Pricing/components/PaymentDialog.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Pricing/components/Plans.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/RolesPermissions/components/RolesPermissionsAccessDialog.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/RolesPermissions/components/RolesPermissionsGroups.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/RolesPermissions/components/RolesPermissionsUserAction.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/RolesPermissions/components/RolesPermissionsUserSelected.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/RolesPermissions/components/RolesPermissionsUserTable.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/RolesPermissions/store/rolePermissionsStore.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Settings/components/BillingHistory.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Settings/components/SettingIntegration.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Settings/components/SettingMobileMenu.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Settings/components/SettingsBilling.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Settings/components/SettingsMenu.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Settings/components/SettingsNotification.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Settings/components/SettingsProfile.js.map +1 -1
- package/dist/@ecme/views/concepts/accounts/Settings/components/SettingsSecurity.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Chat/components/ChatCustomAction.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Chat/components/ChatCustomContent.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Chat/components/ChatHistory.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Chat/components/ChatHistoryItem.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Chat/components/ChatHistoryRenameDialog.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Chat/components/ChatSideNav.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Chat/components/ChatView.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Chat/hooks/useChatSend.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Chat/store/generativeChatStore.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Image/components/Gallery.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Image/components/GeneratorPrompt.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Image/components/ImageDialog.js.map +1 -1
- package/dist/@ecme/views/concepts/ai/Image/store/imageGeneratorStore.js.map +1 -1
- package/dist/@ecme/views/concepts/calendar/Calendar/Calendar.js.map +1 -1
- package/dist/@ecme/views/concepts/calendar/Calendar/components/EventDialog.js.map +1 -1
- package/dist/@ecme/views/concepts/chat/Chat/components/ChatAction.js.map +1 -1
- package/dist/@ecme/views/concepts/chat/Chat/components/ChatBody.js.map +1 -1
- package/dist/@ecme/views/concepts/chat/Chat/components/ChatList.js.map +1 -1
- package/dist/@ecme/views/concepts/chat/Chat/components/ContactInfoDrawer.js.map +1 -1
- package/dist/@ecme/views/concepts/chat/Chat/components/NewChat.js.map +1 -1
- package/dist/@ecme/views/concepts/chat/Chat/hooks/useChat.js.map +1 -1
- package/dist/@ecme/views/concepts/chat/Chat/store/chatStore.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerCreate/CustomerCreate.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerDetails/ActivitySection.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerDetails/BillingSection.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerDetails/ProfileSection.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerEdit/CustomerEdit.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerForm/AccountSection.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerForm/CustomerForm.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerForm/OverviewSection.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerForm/ProfileImageSection.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerList/components/CustomerListSelected.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerList/components/CustomerListTable.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerList/components/CustomerListTableFilter.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerList/components/CustomersListTableTools.js.map +1 -1
- package/dist/@ecme/views/concepts/customers/CustomerList/store/customerListStore.js.map +1 -1
- package/dist/@ecme/views/concepts/files/FileManager/FileManager.js.map +1 -1
- package/dist/@ecme/views/concepts/files/FileManager/components/FileDetails.js.map +1 -1
- package/dist/@ecme/views/concepts/files/FileManager/components/FileItemDropdown.js.map +1 -1
- package/dist/@ecme/views/concepts/files/FileManager/components/FileManagerDeleteDialog.js.map +1 -1
- package/dist/@ecme/views/concepts/files/FileManager/components/FileManagerHeader.js.map +1 -1
- package/dist/@ecme/views/concepts/files/FileManager/components/FileManagerInviteDialog.js.map +1 -1
- package/dist/@ecme/views/concepts/files/FileManager/components/FileManagerRenameDialog.js.map +1 -1
- package/dist/@ecme/views/concepts/files/FileManager/components/UploadFile.js.map +1 -1
- package/dist/@ecme/views/concepts/files/FileManager/store/useFileManagerStore.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/Article/components/ArticleAction.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/EditArticle/components/EditArticleFooter.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/EditArticle/components/EditArticleHeader.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/ManageArticle/components/ArticleListSearch.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/ManageArticle/components/ArticleListSelected.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/ManageArticle/components/ArticleListTable.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/ManageArticle/components/ArticleTableFilter.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/ManageArticle/store/manageArticleStore.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/SupportHub/components/Article.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/SupportHub/components/ArticleList.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/SupportHub/components/Categories.js.map +1 -1
- package/dist/@ecme/views/concepts/help-center/SupportHub/components/TopSection.js.map +1 -1
- package/dist/@ecme/views/concepts/mail/Mail/components/MailBody.js.map +1 -1
- package/dist/@ecme/views/concepts/mail/Mail/components/MailBodyTop.js.map +1 -1
- package/dist/@ecme/views/concepts/mail/Mail/components/MailDetailAction.js.map +1 -1
- package/dist/@ecme/views/concepts/mail/Mail/components/MailDetailTitle.js.map +1 -1
- package/dist/@ecme/views/concepts/mail/Mail/components/MailEditor.js.map +1 -1
- package/dist/@ecme/views/concepts/mail/Mail/components/MailList.js.map +1 -1
- package/dist/@ecme/views/concepts/mail/Mail/components/MailSidebar.js.map +1 -1
- package/dist/@ecme/views/concepts/mail/Mail/hooks/useMail.js.map +1 -1
- package/dist/@ecme/views/concepts/mail/Mail/hooks/useMailAction.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderCreate/OrderCreate.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderDetails/components/OrderDetailHeaderExtra.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderEdit/OrderEdit.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderForm/OrderForm.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderForm/components/CustomerDetailSection.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderForm/components/PaymentMethodSection.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderForm/components/ProductSelectSection.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderList/components/OrderListTable.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderList/components/OrderListTableFilter.js.map +1 -1
- package/dist/@ecme/views/concepts/orders/OrderList/components/OrderListTableTools.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductCreate/ProductCreate.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductEdit/ProducEdit.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductForm/ProductForm.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductForm/components/GeneralSection.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductForm/components/ImageSection.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductForm/components/PricingSection.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductList/components/ProducListTableTools.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductList/components/ProductListSearch.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductList/components/ProductListSelected.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductList/components/ProductListTable.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductList/components/ProductTableFilter.js.map +1 -1
- package/dist/@ecme/views/concepts/products/ProductList/store/productListStore.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/Issue/Issue.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/Issue/components/IssueBody.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/Issue/components/IssueFooter.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/Issue/components/IssueHeader.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectDetails/ProjectDetails.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectDetails/components/ProjectDetailsActivity.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectDetails/components/ProjectDetailsHeader.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectDetails/components/ProjectDetailsNavigation.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectDetails/components/ProjectDetailsSetting.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectDetails/components/ProjectDetailsTask.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectList/components/NewProjectForm.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectList/components/NewTaskField.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectList/components/ProjectListContent.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectList/components/ProjectListHeader.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectList/hooks/useProjectList.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ProjectList/store/projectListStore.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ScrumBoard/components/AddNewColumnContent.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ScrumBoard/components/AddNewMemberContent.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ScrumBoard/components/AddNewTicketContent.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ScrumBoard/components/Board.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ScrumBoard/components/BoardCard.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ScrumBoard/components/BoardTitle.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ScrumBoard/components/ScrumBoardHeader.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/ScrumBoard/components/TicketContent.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/Tasks/Tasks.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/Tasks/components/AddTask.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/Tasks/components/TaskList.js.map +1 -1
- package/dist/@ecme/views/concepts/projects/Tasks/components/TasksHeader.js.map +1 -1
- package/dist/@ecme/views/dashboards/AnalyticDashboard/components/AnalyticChart.js.map +1 -1
- package/dist/@ecme/views/dashboards/AnalyticDashboard/components/AnalyticHeader.js.map +1 -1
- package/dist/@ecme/views/dashboards/AnalyticDashboard/components/DeviceSession.js.map +1 -1
- package/dist/@ecme/views/dashboards/AnalyticDashboard/components/Traffic.js.map +1 -1
- package/dist/@ecme/views/dashboards/EcommerceDashboard/components/Overview.js.map +1 -1
- package/dist/@ecme/views/dashboards/EcommerceDashboard/components/RecentOrder.js.map +1 -1
- package/dist/@ecme/views/dashboards/EcommerceDashboard/components/RevenueByChannel.js.map +1 -1
- package/dist/@ecme/views/dashboards/EcommerceDashboard/components/SalesTarget.js.map +1 -1
- package/dist/@ecme/views/dashboards/EcommerceDashboard/components/TopProduct.js.map +1 -1
- package/dist/@ecme/views/dashboards/MarketingDashboard/components/AdsPerformance.js.map +1 -1
- package/dist/@ecme/views/dashboards/MarketingDashboard/components/CreateCampaign.js.map +1 -1
- package/dist/@ecme/views/dashboards/MarketingDashboard/components/LeadPerformance.js.map +1 -1
- package/dist/@ecme/views/dashboards/MarketingDashboard/components/RecentCampaign.js.map +1 -1
- package/dist/@ecme/views/dashboards/ProjectDashboard/components/CreateEventDialog.js.map +1 -1
- package/dist/@ecme/views/dashboards/ProjectDashboard/components/CurrentTasks.js.map +1 -1
- package/dist/@ecme/views/dashboards/ProjectDashboard/components/Schedule.js.map +1 -1
- package/dist/@ecme/views/dashboards/ProjectDashboard/components/UpcomingSchedule.js.map +1 -1
- package/dist/@ecme/views/guide/Documentations/components/Layouts.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/CalendarViewDoc/Example.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/ConfirmDialogDoc/Example.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/CustomFormatInputDoc/Simple.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/CustomFormatInputDoc/WithForm.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/DataTableDoc/Basic.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/DataTableDoc/Checkable.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/DataTableDoc/Query.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/DebounceInputDoc/Example.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/GanttChartDoc/Example.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/MasonryDoc/Basic.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/MasonryDoc/Responsive.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/NumericInputDoc/Basic.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/NumericInputDoc/WithForm.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/OtpInputDoc/Basic.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/OtpInputDoc/Length.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/PasswordInputDoc/Example.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/PatternInputDoc/Basic.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/PatternInputDoc/WithForm.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/PresetSegmentItemOptionDoc/Example.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/RichTextEditorDoc/CustomConfig.js.map +1 -1
- package/dist/@ecme/views/guide/SharedComponentsDoc/components/RichTextEditorDoc/WithForm.js.map +1 -1
- package/dist/@ecme/views/ui-components/common/Button/ButtonWithIcon.js.map +1 -1
- package/dist/@ecme/views/ui-components/common/Button/Loading.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Calendar/CustomRender.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/DragAndDrop.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/Editable.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/Expanding.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/Filtering.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/Group.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/PaginationTable.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/Resizable.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/RowSelection.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/Sorting.js.map +1 -1
- package/dist/@ecme/views/ui-components/data-display/Table/SubComponent.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Alert/Closable.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Dialog/Basic.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Dialog/Closable.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Dialog/CloseWithEscBackdrop.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Dialog/CustomStyle.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Dialog/InternalScroll.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Dialog/Size.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Dialog/StaticBackdrop.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Drawer/Basic.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Drawer/Closable.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Drawer/CustomStyle.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Drawer/Footer.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Drawer/Placement.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Drawer/WidthHeight.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Progress/Dynamic.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Toast/AlertToast.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Toast/Closable.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Toast/CustomClose.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Toast/CustomIcon.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Toast/Duration.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Toast/Notification.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Toast/NotificationType.js.map +1 -1
- package/dist/@ecme/views/ui-components/feedback/Toast/Placement.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Checkbox/Default.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Checkbox/Group.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/DatePicker/Controlled.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/DatePicker/CustomRender.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/DatePicker/DisabledCertainDate.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/FormControl/AsyncValidation.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/FormControl/Basic.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/FormControl/DependentValidation.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/FormControl/DynamicForm.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/FormControl/FieldValidation.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/FormControl/Layout.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/FormControl/MixedFormControl.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/FormControl/SchemaValidation.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/FormControl/Sizes.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Input/PasswordVisible.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Radio/Group.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Radio/Vertical.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Segment/Controlled.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Segment/Size.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Select/AsyncOnSearch.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Select/Creatable.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Select/LoadOptionOnExpand.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Switcher/Basic.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Switcher/Controlled.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Switcher/Loading.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Upload/AvatarImage.js.map +1 -1
- package/dist/@ecme/views/ui-components/forms/Upload/BeforeUpload.js.map +1 -1
- package/dist/@ecme/views/ui-components/graph/Charts/DashedLine.js.map +1 -1
- package/dist/@ecme/views/ui-components/graph/Maps/ChoroplethQuantile.js.map +1 -1
- package/dist/@ecme/views/ui-components/graph/Maps/ChoroplethQuantize.js.map +1 -1
- package/dist/@ecme/views/ui-components/graph/Maps/MapChartWithTooltip.js.map +1 -1
- package/dist/@ecme/views/ui-components/graph/Maps/UsaStatesMapWithLabels.js.map +1 -1
- package/dist/@ecme/views/ui-components/navigation/Dropdown/Default.js.map +1 -1
- package/dist/@ecme/views/ui-components/navigation/Menu/CollapsableMenuItem.js.map +1 -1
- package/dist/@ecme/views/ui-components/navigation/Menu/Simple.js.map +1 -1
- package/dist/@ecme/views/ui-components/navigation/Pagination/Basic.js.map +1 -1
- package/dist/@ecme/views/ui-components/navigation/Pagination/Controlled.js.map +1 -1
- package/dist/@ecme/views/ui-components/navigation/Pagination/PageSize.js.map +1 -1
- package/dist/@ecme/views/ui-components/navigation/Steps/Clickable.js.map +1 -1
- package/dist/@ecme/views/ui-components/navigation/Steps/Controlled.js.map +1 -1
- package/dist/@types/@ecme/configs/chart.config.d.ts +2 -0
- package/dist/@types/@ecme/configs/chart.config.d.ts.map +1 -1
- package/dist/@types/base/configs/endpoints.config/centralNfe/centralNfe.d.ts +18 -0
- package/dist/@types/base/configs/endpoints.config/centralNfe/centralNfe.d.ts.map +1 -1
- package/dist/@types/base/configs/endpoints.config/centralNfe/config/vinculoUnidadeMedida.d.ts +20 -0
- package/dist/@types/base/configs/endpoints.config/centralNfe/config/vinculoUnidadeMedida.d.ts.map +1 -0
- package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts +18 -0
- package/dist/@types/base/configs/endpoints.config/endpoints.navigation.d.ts.map +1 -1
- package/dist/@types/base/configs/navigation.config/modules.submenu/centralNfe/submenu.centralNfe.d.ts.map +1 -1
- package/dist/@types/base/services/modules/centralNfe/index.d.ts +2 -0
- package/dist/@types/base/services/modules/centralNfe/index.d.ts.map +1 -1
- package/dist/@types/base/services/modules/centralNfe/vinculoUnidadeMedida/VinculoUnidadeMedidaService.d.ts +5 -0
- package/dist/@types/base/services/modules/centralNfe/vinculoUnidadeMedida/VinculoUnidadeMedidaService.d.ts.map +1 -0
- package/dist/base/assets/styles/init.css +1 -1
- package/dist/base/components/forms/GenericForms/GenericUploadFormSection.js.map +1 -1
- package/dist/base/components/forms/NumberFormVariant/GenericNumberFormSectionPercentage.js.map +1 -1
- package/dist/base/components/shared/AceitarProcessoDialog.js.map +1 -1
- package/dist/base/components/shared/AdicionarHistoricoDialog.js.map +1 -1
- package/dist/base/components/shared/CancelarProcessoDialog.js.map +1 -1
- package/dist/base/components/shared/ConcluirProcessoDialog.js.map +1 -1
- package/dist/base/components/shared/ReabrirProcessoDialog.js.map +1 -1
- package/dist/base/components/shared/RetornarFluxAtendimentoDialog.js.map +1 -1
- package/dist/base/components/shared/TransferirParaAtendenteDialog.js.map +1 -1
- package/dist/base/components/shared/TransferirParaSolicitanteDialog.js.map +1 -1
- package/dist/base/components/shared/TransferirProcessoDialog.js.map +1 -1
- package/dist/base/components/table/ListColumn.js.map +1 -1
- package/dist/base/components/tools/NavFilter.js.map +1 -1
- package/dist/base/configs/endpoints.config/centralNfe/centralNfe.js +5 -3
- package/dist/base/configs/endpoints.config/centralNfe/centralNfe.js.map +1 -1
- package/dist/base/configs/endpoints.config/centralNfe/config/vinculoUnidadeMedida.js +10 -0
- package/dist/base/configs/endpoints.config/centralNfe/config/vinculoUnidadeMedida.js.map +1 -0
- package/dist/base/configs/navigation.config/modules.submenu/centralNfe/submenu.centralNfe.js +10 -0
- package/dist/base/configs/navigation.config/modules.submenu/centralNfe/submenu.centralNfe.js.map +1 -1
- package/dist/base/hooks/flux/useAceitarProcesso.js.map +1 -1
- package/dist/base/hooks/flux/useAdicionarHistorico.js.map +1 -1
- package/dist/base/hooks/flux/useCancelarProcesso.js.map +1 -1
- package/dist/base/hooks/flux/useConcluirProcesso.js.map +1 -1
- package/dist/base/hooks/flux/useReabrirProcesso.js.map +1 -1
- package/dist/base/hooks/flux/useRetornarFluxoAtendimento.js.map +1 -1
- package/dist/base/hooks/flux/useTransferirParaAtendente.js.map +1 -1
- package/dist/base/hooks/flux/useTransferirParaSolicitante.js.map +1 -1
- package/dist/base/hooks/flux/useTransferirProcesso.js.map +1 -1
- package/dist/base/services/modules/centralNfe/index.js +13 -3
- package/dist/base/services/modules/centralNfe/index.js.map +1 -1
- package/dist/base/services/modules/centralNfe/vinculoUnidadeMedida/VinculoUnidadeMedidaService.js +37 -0
- package/dist/base/services/modules/centralNfe/vinculoUnidadeMedida/VinculoUnidadeMedidaService.js.map +1 -0
- package/dist/base/services/query.js.map +1 -1
- package/dist/base/utils/functions/formUtils.js.map +1 -1
- package/dist/base/utils/functions/handleInputChangeUtils.js.map +1 -1
- package/dist/base/utils/functions/stringUtils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Gallery.js","sources":["../../../../../../../lib/@ecme/views/concepts/ai/Image/components/Gallery.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport Alert from '@/components/ui/Alert'\nimport Skeleton from '@/components/ui/Skeleton'\nimport GalleryImage from './GalleryImage'\nimport Masonry from '@/components/shared/Masonry'\nimport { useImageGeneratorStore } from '../store/imageGeneratorStore'\nimport useInfiniteScroll from '@/utils/hooks/useInfiniteScroll'\nimport { apiGetImages } from '@/services/AiService'\nimport type { GetImageResponse, Gallery, GelleryItem } from '../type'\n\nconst Gallery = () => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, setIsInitialLoading] = useState(false)\n const [initialLoadComplete, setInitialLoadComplete] = useState(false)\n const [loadable, setLoadable] = useState(true)\n const [index, seIndex] = useState(1)\n\n const {\n setImageDialog,\n isGeneratedImagesView,\n isGeneratingImage,\n generatedImage,\n } = useImageGeneratorStore()\n\n const [imageList, setImageList] = useState<Gallery>([])\n\n const getImages = async (index: number) => {\n setIsInitialLoading(true)\n const resp = await apiGetImages<GetImageResponse, { index: number }>({\n index,\n })\n setImageList((prevImages) => [...prevImages, ...resp.data])\n setLoadable(resp.loadable)\n setIsInitialLoading(false)\n seIndex((prevIndex) => prevIndex + 1)\n if (!resp.loadable) {\n setLoadable(true)\n seIndex(() => 1)\n }\n }\n\n const { containerRef } = useInfiniteScroll({\n offset: '100px',\n async onLoadMore() {\n if (initialLoadComplete && loadable) {\n await getImages(index)\n }\n },\n })\n\n const initialLoad = async (index: number) => {\n setIsInitialLoading(true)\n const resp = await apiGetImages<\n GetImageResponse,\n { index: number; itemCount: number }\n >({ index, itemCount: 8 })\n setImageList(resp.data)\n setLoadable(resp.loadable)\n setIsInitialLoading(false)\n seIndex(3)\n setInitialLoadComplete(true)\n }\n\n const handleImageClick = (\n image: GelleryItem,\n type: 'generated' | 'existing',\n ) => {\n setImageDialog({\n open: true,\n props: { ...image, type },\n })\n }\n\n useEffect(() => {\n if (!initialLoadComplete) {\n initialLoad(index)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return (\n <>\n {isGeneratedImagesView && (\n <div className=\"rounded-xl bg-gray-100 dark:bg-gray-700 p-5 mb-4\">\n <h4 className=\"mb-4\">\n {isGeneratingImage ? 'Generating' : 'Result'}\n </h4>\n {!isGeneratingImage && generatedImage.length > 0 && (\n <Alert showIcon className=\"mb-4\" type=\"info\">\n This is a mock response designed to simulate an\n AI-generated reply. Please note that these image is\n not generated by an actual AI model.\n </Alert>\n )}\n <div className=\"grid grid-cols-2 xl:grid-cols-4 gap-4\">\n {isGeneratingImage ? (\n <>\n {[...Array(4).keys()].map((item) => (\n <Skeleton\n key={`loading-${item}`}\n className=\"rounded-xl bg-gray-300 dark:bg-gray-600\"\n height={250}\n />\n ))}\n </>\n ) : (\n <>\n {generatedImage.map((item) => {\n return (\n <GalleryImage\n key={item.id}\n galleryItem={item}\n onImageClick={() =>\n handleImageClick(\n item,\n 'generated',\n )\n }\n />\n )\n })}\n </>\n )}\n </div>\n </div>\n )}\n {initialLoadComplete && (\n <div>\n <h4 className=\"mb-4\">Recent images</h4>\n <div ref={containerRef}>\n <Masonry columns={{ 768: 2, 1280: 4 }} gap={16}>\n {imageList.map((item) => {\n return (\n <GalleryImage\n key={item.id}\n galleryItem={item}\n onImageClick={() =>\n handleImageClick(item, 'existing')\n }\n />\n )\n })}\n </Masonry>\n </div>\n </div>\n )}\n </>\n )\n}\n\nexport default Gallery\n"],"names":["Gallery","_","setIsInitialLoading","useState","initialLoadComplete","setInitialLoadComplete","loadable","setLoadable","index","seIndex","setImageDialog","isGeneratedImagesView","isGeneratingImage","generatedImage","useImageGeneratorStore","imageList","setImageList","getImages","resp","apiGetImages","prevImages","prevIndex","containerRef","useInfiniteScroll","initialLoad","handleImageClick","image","type","useEffect","jsxs","Fragment","jsx","Alert","item","Skeleton","GalleryImage","Masonry"],"mappings":";;;;;;;;;;;;AAUA,MAAMA,IAAU,MAAM;AAElB,QAAM,CAACC,GAAGC,CAAmB,IAAIC,EAAS,EAAK,GACzC,CAACC,GAAqBC,CAAsB,IAAIF,EAAS,EAAK,GAC9D,CAACG,GAAUC,CAAW,IAAIJ,EAAS,EAAI,GACvC,CAACK,GAAOC,CAAO,IAAIN,EAAS,CAAC,GAE7B;AAAA,IACF,gBAAAO;AAAA,IACA,uBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,gBAAAC;AAAA,EAAA,IACAC,EAAA,GAEE,CAACC,GAAWC,CAAY,IAAIb,EAAkB,CAAA,CAAE,GAEhDc,IAAY,OAAOT,MAAkB;AACvC,IAAAN,EAAoB,EAAI;AACxB,UAAMgB,IAAO,MAAMC,EAAkD;AAAA,MACjE,OAAAX;AAAAA,IAAA,CACH;AACD,IAAAQ,EAAa,CAACI,MAAe,CAAC,GAAGA,GAAY,GAAGF,EAAK,IAAI,CAAC,GAC1DX,EAAYW,EAAK,QAAQ,GACzBhB,EAAoB,EAAK,GACzBO,EAAQ,CAACY,MAAcA,IAAY,CAAC,GAC/BH,EAAK,aACNX,EAAY,EAAI,GAChBE,EAAQ,MAAM,CAAC;AAAA,
|
|
1
|
+
{"version":3,"file":"Gallery.js","sources":["../../../../../../../lib/@ecme/views/concepts/ai/Image/components/Gallery.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport Alert from '@/components/ui/Alert'\nimport Skeleton from '@/components/ui/Skeleton'\nimport GalleryImage from './GalleryImage'\nimport Masonry from '@/components/shared/Masonry'\nimport { useImageGeneratorStore } from '../store/imageGeneratorStore'\nimport useInfiniteScroll from '@/utils/hooks/useInfiniteScroll'\nimport { apiGetImages } from '@/services/AiService'\nimport type { GetImageResponse, Gallery, GelleryItem } from '../type'\n\nconst Gallery = () => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, setIsInitialLoading] = useState(false)\n const [initialLoadComplete, setInitialLoadComplete] = useState(false)\n const [loadable, setLoadable] = useState(true)\n const [index, seIndex] = useState(1)\n\n const {\n setImageDialog,\n isGeneratedImagesView,\n isGeneratingImage,\n generatedImage,\n } = useImageGeneratorStore()\n\n const [imageList, setImageList] = useState<Gallery>([])\n\n const getImages = async (index: number) => {\n setIsInitialLoading(true)\n const resp = await apiGetImages<GetImageResponse, { index: number }>({\n index,\n })\n setImageList((prevImages) => [...prevImages, ...resp.data])\n setLoadable(resp.loadable)\n setIsInitialLoading(false)\n seIndex((prevIndex) => prevIndex + 1)\n if (!resp.loadable) {\n setLoadable(true)\n seIndex(() => 1)\n }\n }\n\n const { containerRef } = useInfiniteScroll({\n offset: '100px',\n async onLoadMore() {\n if (initialLoadComplete && loadable) {\n await getImages(index)\n }\n },\n })\n\n const initialLoad = async (index: number) => {\n setIsInitialLoading(true)\n const resp = await apiGetImages<\n GetImageResponse,\n { index: number; itemCount: number }\n >({ index, itemCount: 8 })\n setImageList(resp.data)\n setLoadable(resp.loadable)\n setIsInitialLoading(false)\n seIndex(3)\n setInitialLoadComplete(true)\n }\n\n const handleImageClick = (\n image: GelleryItem,\n type: 'generated' | 'existing',\n ) => {\n setImageDialog({\n open: true,\n props: { ...image, type },\n })\n }\n\n useEffect(() => {\n if (!initialLoadComplete) {\n initialLoad(index)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return (\n <>\n {isGeneratedImagesView && (\n <div className=\"rounded-xl bg-gray-100 dark:bg-gray-700 p-5 mb-4\">\n <h4 className=\"mb-4\">\n {isGeneratingImage ? 'Generating' : 'Result'}\n </h4>\n {!isGeneratingImage && generatedImage.length > 0 && (\n <Alert showIcon className=\"mb-4\" type=\"info\">\n This is a mock response designed to simulate an\n AI-generated reply. Please note that these image is\n not generated by an actual AI model.\n </Alert>\n )}\n <div className=\"grid grid-cols-2 xl:grid-cols-4 gap-4\">\n {isGeneratingImage ? (\n <>\n {[...Array(4).keys()].map((item) => (\n <Skeleton\n key={`loading-${item}`}\n className=\"rounded-xl bg-gray-300 dark:bg-gray-600\"\n height={250}\n />\n ))}\n </>\n ) : (\n <>\n {generatedImage.map((item) => {\n return (\n <GalleryImage\n key={item.id}\n galleryItem={item}\n onImageClick={() =>\n handleImageClick(\n item,\n 'generated',\n )\n }\n />\n )\n })}\n </>\n )}\n </div>\n </div>\n )}\n {initialLoadComplete && (\n <div>\n <h4 className=\"mb-4\">Recent images</h4>\n <div ref={containerRef}>\n <Masonry columns={{ 768: 2, 1280: 4 }} gap={16}>\n {imageList.map((item) => {\n return (\n <GalleryImage\n key={item.id}\n galleryItem={item}\n onImageClick={() =>\n handleImageClick(item, 'existing')\n }\n />\n )\n })}\n </Masonry>\n </div>\n </div>\n )}\n </>\n )\n}\n\nexport default Gallery\n"],"names":["Gallery","_","setIsInitialLoading","useState","initialLoadComplete","setInitialLoadComplete","loadable","setLoadable","index","seIndex","setImageDialog","isGeneratedImagesView","isGeneratingImage","generatedImage","useImageGeneratorStore","imageList","setImageList","getImages","resp","apiGetImages","prevImages","prevIndex","containerRef","useInfiniteScroll","initialLoad","handleImageClick","image","type","useEffect","jsxs","Fragment","jsx","Alert","item","Skeleton","GalleryImage","Masonry"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeneratorPrompt.js","sources":["../../../../../../../lib/@ecme/views/concepts/ai/Image/components/GeneratorPrompt.tsx"],"sourcesContent":["import { useState, useRef } from 'react'\nimport Button from '@/components/ui/Button'\nimport Tooltip from '@/components/ui/Tooltip'\nimport Upload from '@/components/ui/Upload'\nimport toast from '@/components/ui/toast'\nimport Notification from '@/components/ui/Notification'\nimport CloseButton from '@/components/ui/CloseButton'\nimport ConfigDropdown from './ConfigDropdown'\nimport { useImageGeneratorStore } from '../store/imageGeneratorStore'\nimport {\n aspectRatioOptions,\n styleOptions,\n toneOptions,\n lightingOptions,\n cameraOptions,\n} from '../utils'\nimport { apiPostImages } from '@/services/AiService'\nimport { LuImage } from 'react-icons/lu'\nimport { ConfigsVariant, PostImageResponse } from '../type'\n\nconst GeneratorPrompt = () => {\n const [uploadedImage, setUploadedImage] = useState<File[]>([])\n\n const {\n generatorConfig,\n setGeneratorConfig,\n resetGeneratorConfig,\n onGenerateImage,\n onGenerateImageComplete,\n setGeneratedImage,\n isGeneratingImage,\n } = useImageGeneratorStore()\n\n const promptRef = useRef<HTMLTextAreaElement>(null)\n\n const handleClear = () => {\n resetGeneratorConfig()\n }\n\n const handleGenerate = async () => {\n const prompt = promptRef.current?.value\n\n if (!prompt) {\n toast.push(\n <Notification title={'Please enter prompt'} type=\"danger\" />,\n {\n placement: 'top-center',\n },\n )\n promptRef.current?.focus()\n\n return\n }\n onGenerateImage()\n const resp = await apiPostImages<PostImageResponse, { prompt: string }>(\n { prompt },\n )\n if (resp) {\n setGeneratedImage(resp)\n }\n onGenerateImageComplete()\n }\n\n const handleSetGeneratorConfig = (key: ConfigsVariant, value: string) => {\n setGeneratorConfig({ key, value })\n }\n\n const beforeUpload = (files: FileList | null) => {\n let valid: string | boolean = true\n\n const allowedFileType = ['image/jpeg', 'image/png', 'image/webp']\n\n if (files) {\n for (const f of files) {\n if (!allowedFileType.includes(f.type)) {\n valid = 'Please upload a .jpeg or .png file!'\n }\n }\n }\n\n return valid\n }\n\n return (\n <div className=\"rounded-lg p-4 border-2 border-gray-100 dark:border-gray-700\">\n <div className=\"flex gap-4 mb-4\">\n {uploadedImage.length > 0 && (\n <div className=\"max-w-[150px] relative cursor-pointer group\">\n {\n <img\n className=\"rounded-xl\"\n src={URL.createObjectURL(uploadedImage[0])}\n />\n }\n <div className=\"opacity-0 group-hover:opacity-100 bg-black/75 group-hover:flex items-center justify-center rounded-xl absolute top-0 left-0 w-full h-full transition-colors\">\n <CloseButton onClick={() => setUploadedImage([])} />\n </div>\n </div>\n )}\n <div className=\"flex-1\">\n <div className=\"heading-text text-base font-semibold\">\n Prompt\n </div>\n <textarea\n ref={promptRef}\n className=\"w-full resize-none mt-1 placeholder:text-gray-400 bg-transparent focus:outline-none heading-text\"\n placeholder=\"Decribe the image you want to generate\"\n />\n </div>\n </div>\n <div className=\"flex flex-col lg:flex-row gap-6 justify-between\">\n <div className=\"inline-flex flex-wrap gap-2\">\n <Tooltip title=\"Add image\">\n <Upload\n showList={false}\n beforeUpload={beforeUpload}\n uploadLimit={1}\n onChange={setUploadedImage}\n >\n <Button size=\"sm\" icon={<LuImage />} />\n </Upload>\n </Tooltip>\n <ConfigDropdown\n list={aspectRatioOptions}\n value={generatorConfig.aspectRatio}\n onSelect={(value) =>\n handleSetGeneratorConfig('aspectRatio', value)\n }\n />\n <ConfigDropdown\n list={styleOptions}\n value={generatorConfig.style}\n onSelect={(value) =>\n handleSetGeneratorConfig('style', value)\n }\n />\n <ConfigDropdown\n list={toneOptions}\n value={generatorConfig.tone}\n onSelect={(value) =>\n handleSetGeneratorConfig('tone', value)\n }\n />\n <ConfigDropdown\n list={lightingOptions}\n value={generatorConfig.lighting}\n onSelect={(value) =>\n handleSetGeneratorConfig('lighting', value)\n }\n />\n <ConfigDropdown\n list={cameraOptions}\n value={generatorConfig.camera}\n onSelect={(value) =>\n handleSetGeneratorConfig('camera', value)\n }\n />\n </div>\n <div className=\"flex flex-col sm:flex-row sm:justify-end gap-4\">\n <Button size=\"sm\" shape=\"circle\" onClick={handleClear}>\n Clear\n </Button>\n <Button\n size=\"sm\"\n variant=\"solid\"\n shape=\"circle\"\n loading={isGeneratingImage}\n onClick={handleGenerate}\n >\n Generate\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default GeneratorPrompt\n"],"names":["GeneratorPrompt","uploadedImage","setUploadedImage","useState","generatorConfig","setGeneratorConfig","resetGeneratorConfig","onGenerateImage","onGenerateImageComplete","setGeneratedImage","isGeneratingImage","useImageGeneratorStore","promptRef","useRef","handleClear","handleGenerate","prompt","_a","toast","jsx","Notification","_b","resp","apiPostImages","handleSetGeneratorConfig","key","value","beforeUpload","files","valid","allowedFileType","f","jsxs","CloseButton","Tooltip","Upload","Button","LuImage","ConfigDropdown","aspectRatioOptions","styleOptions","toneOptions","lightingOptions","cameraOptions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GeneratorPrompt.js","sources":["../../../../../../../lib/@ecme/views/concepts/ai/Image/components/GeneratorPrompt.tsx"],"sourcesContent":["import { useState, useRef } from 'react'\nimport Button from '@/components/ui/Button'\nimport Tooltip from '@/components/ui/Tooltip'\nimport Upload from '@/components/ui/Upload'\nimport toast from '@/components/ui/toast'\nimport Notification from '@/components/ui/Notification'\nimport CloseButton from '@/components/ui/CloseButton'\nimport ConfigDropdown from './ConfigDropdown'\nimport { useImageGeneratorStore } from '../store/imageGeneratorStore'\nimport {\n aspectRatioOptions,\n styleOptions,\n toneOptions,\n lightingOptions,\n cameraOptions,\n} from '../utils'\nimport { apiPostImages } from '@/services/AiService'\nimport { LuImage } from 'react-icons/lu'\nimport { ConfigsVariant, PostImageResponse } from '../type'\n\nconst GeneratorPrompt = () => {\n const [uploadedImage, setUploadedImage] = useState<File[]>([])\n\n const {\n generatorConfig,\n setGeneratorConfig,\n resetGeneratorConfig,\n onGenerateImage,\n onGenerateImageComplete,\n setGeneratedImage,\n isGeneratingImage,\n } = useImageGeneratorStore()\n\n const promptRef = useRef<HTMLTextAreaElement>(null)\n\n const handleClear = () => {\n resetGeneratorConfig()\n }\n\n const handleGenerate = async () => {\n const prompt = promptRef.current?.value\n\n if (!prompt) {\n toast.push(\n <Notification title={'Please enter prompt'} type=\"danger\" />,\n {\n placement: 'top-center',\n },\n )\n promptRef.current?.focus()\n\n return\n }\n onGenerateImage()\n const resp = await apiPostImages<PostImageResponse, { prompt: string }>(\n { prompt },\n )\n if (resp) {\n setGeneratedImage(resp)\n }\n onGenerateImageComplete()\n }\n\n const handleSetGeneratorConfig = (key: ConfigsVariant, value: string) => {\n setGeneratorConfig({ key, value })\n }\n\n const beforeUpload = (files: FileList | null) => {\n let valid: string | boolean = true\n\n const allowedFileType = ['image/jpeg', 'image/png', 'image/webp']\n\n if (files) {\n for (const f of files) {\n if (!allowedFileType.includes(f.type)) {\n valid = 'Please upload a .jpeg or .png file!'\n }\n }\n }\n\n return valid\n }\n\n return (\n <div className=\"rounded-lg p-4 border-2 border-gray-100 dark:border-gray-700\">\n <div className=\"flex gap-4 mb-4\">\n {uploadedImage.length > 0 && (\n <div className=\"max-w-[150px] relative cursor-pointer group\">\n {\n <img\n className=\"rounded-xl\"\n src={URL.createObjectURL(uploadedImage[0])}\n />\n }\n <div className=\"opacity-0 group-hover:opacity-100 bg-black/75 group-hover:flex items-center justify-center rounded-xl absolute top-0 left-0 w-full h-full transition-colors\">\n <CloseButton onClick={() => setUploadedImage([])} />\n </div>\n </div>\n )}\n <div className=\"flex-1\">\n <div className=\"heading-text text-base font-semibold\">\n Prompt\n </div>\n <textarea\n ref={promptRef}\n className=\"w-full resize-none mt-1 placeholder:text-gray-400 bg-transparent focus:outline-none heading-text\"\n placeholder=\"Decribe the image you want to generate\"\n />\n </div>\n </div>\n <div className=\"flex flex-col lg:flex-row gap-6 justify-between\">\n <div className=\"inline-flex flex-wrap gap-2\">\n <Tooltip title=\"Add image\">\n <Upload\n showList={false}\n beforeUpload={beforeUpload}\n uploadLimit={1}\n onChange={setUploadedImage}\n >\n <Button size=\"sm\" icon={<LuImage />} />\n </Upload>\n </Tooltip>\n <ConfigDropdown\n list={aspectRatioOptions}\n value={generatorConfig.aspectRatio}\n onSelect={(value) =>\n handleSetGeneratorConfig('aspectRatio', value)\n }\n />\n <ConfigDropdown\n list={styleOptions}\n value={generatorConfig.style}\n onSelect={(value) =>\n handleSetGeneratorConfig('style', value)\n }\n />\n <ConfigDropdown\n list={toneOptions}\n value={generatorConfig.tone}\n onSelect={(value) =>\n handleSetGeneratorConfig('tone', value)\n }\n />\n <ConfigDropdown\n list={lightingOptions}\n value={generatorConfig.lighting}\n onSelect={(value) =>\n handleSetGeneratorConfig('lighting', value)\n }\n />\n <ConfigDropdown\n list={cameraOptions}\n value={generatorConfig.camera}\n onSelect={(value) =>\n handleSetGeneratorConfig('camera', value)\n }\n />\n </div>\n <div className=\"flex flex-col sm:flex-row sm:justify-end gap-4\">\n <Button size=\"sm\" shape=\"circle\" onClick={handleClear}>\n Clear\n </Button>\n <Button\n size=\"sm\"\n variant=\"solid\"\n shape=\"circle\"\n loading={isGeneratingImage}\n onClick={handleGenerate}\n >\n Generate\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default GeneratorPrompt\n"],"names":["GeneratorPrompt","uploadedImage","setUploadedImage","useState","generatorConfig","setGeneratorConfig","resetGeneratorConfig","onGenerateImage","onGenerateImageComplete","setGeneratedImage","isGeneratingImage","useImageGeneratorStore","promptRef","useRef","handleClear","handleGenerate","prompt","_a","toast","jsx","Notification","_b","resp","apiPostImages","handleSetGeneratorConfig","key","value","beforeUpload","files","valid","allowedFileType","f","jsxs","CloseButton","Tooltip","Upload","Button","LuImage","ConfigDropdown","aspectRatioOptions","styleOptions","toneOptions","lightingOptions","cameraOptions"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageDialog.js","sources":["../../../../../../../lib/@ecme/views/concepts/ai/Image/components/ImageDialog.tsx"],"sourcesContent":["import { useState } from 'react'\nimport Button from '@/components/ui/Button'\nimport Dialog from '@/components/ui/Dialog'\nimport Tooltip from '@/components/ui/Tooltip'\nimport Tag from '@/components/ui/Tag'\nimport sleep from '@/utils/sleep'\nimport { useImageGeneratorStore } from '../store/imageGeneratorStore'\nimport {\n TbDownload,\n TbHeart,\n TbHeartFilled,\n TbAlertTriangle,\n} from 'react-icons/tb'\n\nconst ImageDialog = () => {\n const { imageDialog, setImageDialog } = useImageGeneratorStore()\n\n const [liked, setLiked] = useState(false)\n\n const handleDialogClose = async () => {\n setImageDialog({\n open: false,\n props: imageDialog.props,\n })\n await sleep(200)\n setImageDialog({\n open: false,\n props: {},\n })\n setLiked(false)\n }\n\n const downloadFile = () => {\n const fileSegment = imageDialog.props.image?.split('/') as string[]\n const fileName = fileSegment[fileSegment?.length - 1]\n const link = document.createElement('a')\n link.href = imageDialog.props.image || ''\n link.setAttribute('download', fileName)\n document.body.appendChild(link)\n link.click()\n link.parentNode?.removeChild(link)\n }\n\n return (\n <Dialog\n isOpen={imageDialog.open}\n width={900}\n onClose={handleDialogClose}\n onRequestClose={handleDialogClose}\n >\n <div className=\"flex flex-col md:flex-row gap-4\">\n <div className=\"md:max-w-[400px]\">\n <img\n className=\"rounded-xl\"\n src={imageDialog.props.image}\n alt={imageDialog.props.prompt}\n />\n </div>\n <div className=\"flex flex-col justify-between flex-1 gap-4\">\n <div className=\"mt-2\">\n <h5 className=\"font-bold\">Prompt</h5>\n <p className=\"mt-4\">{imageDialog.props.prompt}</p>\n <div className=\"inline-flex gap-2 mt-6\">\n <Tag>Size: {imageDialog.props.size}</Tag>\n <Tag>Ratio: {imageDialog.props.ratio}</Tag>\n {imageDialog.props.type === 'existing' && (\n <Tag>{imageDialog.props.like || 0} Likes</Tag>\n )}\n </div>\n </div>\n <div className=\"flex justify-end gap-2\">\n <Tooltip title=\"Download\">\n <Button\n icon={<TbDownload />}\n shape=\"circle\"\n size=\"sm\"\n onClick={downloadFile}\n />\n </Tooltip>\n {imageDialog.props.type === 'existing' && (\n <Tooltip\n title={\n <div className=\"w-12 text-center\">\n {liked ? 'Dislike' : 'Like'}\n </div>\n }\n >\n <Button\n icon={\n liked ? (\n <TbHeartFilled className=\"text-pink-500\" />\n ) : (\n <TbHeart />\n )\n }\n shape=\"circle\"\n size=\"sm\"\n onClick={() => setLiked(!liked)}\n />\n </Tooltip>\n )}\n <Tooltip title=\"Report\">\n <Button\n icon={<TbAlertTriangle />}\n shape=\"circle\"\n size=\"sm\"\n />\n </Tooltip>\n </div>\n </div>\n </div>\n </Dialog>\n )\n}\n\nexport default ImageDialog\n"],"names":["ImageDialog","imageDialog","setImageDialog","useImageGeneratorStore","liked","setLiked","useState","handleDialogClose","sleep","downloadFile","fileSegment","_a","fileName","link","_b","jsx","Dialog","jsxs","Tag","Tooltip","Button","TbDownload","TbHeartFilled","TbHeart","TbAlertTriangle"],"mappings":";;;;;;;;;;;;;AAcA,MAAMA,IAAc,MAAM;AACtB,QAAM,EAAE,aAAAC,GAAa,gBAAAC,EAAA,IAAmBC,EAAA,GAElC,CAACC,GAAOC,CAAQ,IAAIC,EAAS,EAAK,GAElCC,IAAoB,YAAY;AAClC,IAAAL,EAAe;AAAA,MACX,MAAM;AAAA,MACN,OAAOD,EAAY;AAAA,IAAA,CACtB,GACD,MAAMO,EAAM,GAAG,GACfN,EAAe;AAAA,MACX,MAAM;AAAA,MACN,OAAO,CAAA;AAAA,IAAC,CACX,GACDG,EAAS,EAAK;AAAA,
|
|
1
|
+
{"version":3,"file":"ImageDialog.js","sources":["../../../../../../../lib/@ecme/views/concepts/ai/Image/components/ImageDialog.tsx"],"sourcesContent":["import { useState } from 'react'\nimport Button from '@/components/ui/Button'\nimport Dialog from '@/components/ui/Dialog'\nimport Tooltip from '@/components/ui/Tooltip'\nimport Tag from '@/components/ui/Tag'\nimport sleep from '@/utils/sleep'\nimport { useImageGeneratorStore } from '../store/imageGeneratorStore'\nimport {\n TbDownload,\n TbHeart,\n TbHeartFilled,\n TbAlertTriangle,\n} from 'react-icons/tb'\n\nconst ImageDialog = () => {\n const { imageDialog, setImageDialog } = useImageGeneratorStore()\n\n const [liked, setLiked] = useState(false)\n\n const handleDialogClose = async () => {\n setImageDialog({\n open: false,\n props: imageDialog.props,\n })\n await sleep(200)\n setImageDialog({\n open: false,\n props: {},\n })\n setLiked(false)\n }\n\n const downloadFile = () => {\n const fileSegment = imageDialog.props.image?.split('/') as string[]\n const fileName = fileSegment[fileSegment?.length - 1]\n const link = document.createElement('a')\n link.href = imageDialog.props.image || ''\n link.setAttribute('download', fileName)\n document.body.appendChild(link)\n link.click()\n link.parentNode?.removeChild(link)\n }\n\n return (\n <Dialog\n isOpen={imageDialog.open}\n width={900}\n onClose={handleDialogClose}\n onRequestClose={handleDialogClose}\n >\n <div className=\"flex flex-col md:flex-row gap-4\">\n <div className=\"md:max-w-[400px]\">\n <img\n className=\"rounded-xl\"\n src={imageDialog.props.image}\n alt={imageDialog.props.prompt}\n />\n </div>\n <div className=\"flex flex-col justify-between flex-1 gap-4\">\n <div className=\"mt-2\">\n <h5 className=\"font-bold\">Prompt</h5>\n <p className=\"mt-4\">{imageDialog.props.prompt}</p>\n <div className=\"inline-flex gap-2 mt-6\">\n <Tag>Size: {imageDialog.props.size}</Tag>\n <Tag>Ratio: {imageDialog.props.ratio}</Tag>\n {imageDialog.props.type === 'existing' && (\n <Tag>{imageDialog.props.like || 0} Likes</Tag>\n )}\n </div>\n </div>\n <div className=\"flex justify-end gap-2\">\n <Tooltip title=\"Download\">\n <Button\n icon={<TbDownload />}\n shape=\"circle\"\n size=\"sm\"\n onClick={downloadFile}\n />\n </Tooltip>\n {imageDialog.props.type === 'existing' && (\n <Tooltip\n title={\n <div className=\"w-12 text-center\">\n {liked ? 'Dislike' : 'Like'}\n </div>\n }\n >\n <Button\n icon={\n liked ? (\n <TbHeartFilled className=\"text-pink-500\" />\n ) : (\n <TbHeart />\n )\n }\n shape=\"circle\"\n size=\"sm\"\n onClick={() => setLiked(!liked)}\n />\n </Tooltip>\n )}\n <Tooltip title=\"Report\">\n <Button\n icon={<TbAlertTriangle />}\n shape=\"circle\"\n size=\"sm\"\n />\n </Tooltip>\n </div>\n </div>\n </div>\n </Dialog>\n )\n}\n\nexport default ImageDialog\n"],"names":["ImageDialog","imageDialog","setImageDialog","useImageGeneratorStore","liked","setLiked","useState","handleDialogClose","sleep","downloadFile","fileSegment","_a","fileName","link","_b","jsx","Dialog","jsxs","Tag","Tooltip","Button","TbDownload","TbHeartFilled","TbHeart","TbAlertTriangle"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imageGeneratorStore.js","sources":["../../../../../../../lib/@ecme/views/concepts/ai/Image/store/imageGeneratorStore.ts"],"sourcesContent":["import { create } from 'zustand'\nimport { Gallery, GelleryItem, ConfigsVariant, GeneratorConfigs } from '../type'\n\ntype ImageDialog = {\n open: boolean\n props: Partial<GelleryItem> & {\n type?: 'generated' | 'existing'\n }\n}\n\ntype ImageGeneratorState = {\n isGeneratedImagesView: boolean\n isGeneratingImage: boolean\n generatedImage: Gallery\n generatorConfig: GeneratorConfigs\n imageDialog: ImageDialog\n}\n\ntype ImageGeneratorAction = {\n setGeneratorConfig: (payload: {\n key: ConfigsVariant\n value: string\n }) => void\n resetGeneratorConfig: () => void\n setImageDialog: (payload: ImageDialog) => void\n onGenerateImage: () => void\n onGenerateImageComplete: () => void\n setGeneratedImage: (payload: Gallery) => void\n}\n\nconst defaultGeneratoConfig = {\n aspectRatio: 'lanscape',\n style: 'noStyle',\n tone: 'noTone',\n lighting: 'noLighting',\n camera: 'noCamera',\n}\n\nconst initialState: ImageGeneratorState = {\n isGeneratedImagesView: false,\n isGeneratingImage: false,\n generatedImage: [],\n generatorConfig: { ...defaultGeneratoConfig },\n imageDialog: {\n open: false,\n props: {},\n },\n}\n\nexport const useImageGeneratorStore = create<\n ImageGeneratorState & ImageGeneratorAction\n>((set, get) => ({\n ...initialState,\n setGeneratorConfig: ({ key, value }) =>\n set(() => {\n const generatorConfig = get().generatorConfig\n generatorConfig[key] = value\n return { generatorConfig }\n }),\n resetGeneratorConfig: () =>\n set(() => ({ generatorConfig: { ...defaultGeneratoConfig } })),\n setImageDialog: (payload) => set(() => ({ imageDialog: payload })),\n onGenerateImage: () =>\n set(() => ({\n isGeneratedImagesView: true,\n isGeneratingImage: true,\n })),\n onGenerateImageComplete: () =>\n set(() => ({\n isGeneratingImage: false,\n })),\n setGeneratedImage: (payload) =>\n set(() => ({\n generatedImage: payload,\n })),\n}))\n"],"names":["defaultGeneratoConfig","initialState","useImageGeneratorStore","create","set","get","key","value","generatorConfig","payload"],"mappings":";AA8BA,MAAMA,IAAwB;AAAA,EAC1B,aAAa;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AACZ,GAEMC,IAAoC;AAAA,EACtC,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,gBAAgB,CAAA;AAAA,EAChB,iBAAiB,EAAE,GAAGD,EAAA;AAAA,EACtB,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO,CAAA;AAAA,EAAC;AAEhB,GAEaE,IAAyBC,EAEpC,CAACC,GAAKC,OAAS;AAAA,EACb,GAAGJ;AAAA,EACH,oBAAoB,CAAC,EAAE,KAAAK,GAAK,OAAAC,EAAA,MACxBH,EAAI,MAAM;AACN,UAAMI,IAAkBH,IAAM;AAC9B,WAAAG,EAAgBF,CAAG,IAAIC,GAChB,EAAE,iBAAAC,EAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"imageGeneratorStore.js","sources":["../../../../../../../lib/@ecme/views/concepts/ai/Image/store/imageGeneratorStore.ts"],"sourcesContent":["import { create } from 'zustand'\nimport { Gallery, GelleryItem, ConfigsVariant, GeneratorConfigs } from '../type'\n\ntype ImageDialog = {\n open: boolean\n props: Partial<GelleryItem> & {\n type?: 'generated' | 'existing'\n }\n}\n\ntype ImageGeneratorState = {\n isGeneratedImagesView: boolean\n isGeneratingImage: boolean\n generatedImage: Gallery\n generatorConfig: GeneratorConfigs\n imageDialog: ImageDialog\n}\n\ntype ImageGeneratorAction = {\n setGeneratorConfig: (payload: {\n key: ConfigsVariant\n value: string\n }) => void\n resetGeneratorConfig: () => void\n setImageDialog: (payload: ImageDialog) => void\n onGenerateImage: () => void\n onGenerateImageComplete: () => void\n setGeneratedImage: (payload: Gallery) => void\n}\n\nconst defaultGeneratoConfig = {\n aspectRatio: 'lanscape',\n style: 'noStyle',\n tone: 'noTone',\n lighting: 'noLighting',\n camera: 'noCamera',\n}\n\nconst initialState: ImageGeneratorState = {\n isGeneratedImagesView: false,\n isGeneratingImage: false,\n generatedImage: [],\n generatorConfig: { ...defaultGeneratoConfig },\n imageDialog: {\n open: false,\n props: {},\n },\n}\n\nexport const useImageGeneratorStore = create<\n ImageGeneratorState & ImageGeneratorAction\n>((set, get) => ({\n ...initialState,\n setGeneratorConfig: ({ key, value }) =>\n set(() => {\n const generatorConfig = get().generatorConfig\n generatorConfig[key] = value\n return { generatorConfig }\n }),\n resetGeneratorConfig: () =>\n set(() => ({ generatorConfig: { ...defaultGeneratoConfig } })),\n setImageDialog: (payload) => set(() => ({ imageDialog: payload })),\n onGenerateImage: () =>\n set(() => ({\n isGeneratedImagesView: true,\n isGeneratingImage: true,\n })),\n onGenerateImageComplete: () =>\n set(() => ({\n isGeneratingImage: false,\n })),\n setGeneratedImage: (payload) =>\n set(() => ({\n generatedImage: payload,\n })),\n}))\n"],"names":["defaultGeneratoConfig","initialState","useImageGeneratorStore","create","set","get","key","value","generatorConfig","payload"],"mappings":";AA8BA,MAAMA,IAAwB;AAAA,EAC1B,aAAa;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AACZ,GAEMC,IAAoC;AAAA,EACtC,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,gBAAgB,CAAA;AAAA,EAChB,iBAAiB,EAAE,GAAGD,EAAA;AAAA,EACtB,aAAa;AAAA,IACT,MAAM;AAAA,IACN,OAAO,CAAA;AAAA,EAAC;AAEhB,GAEaE,IAAyBC,EAEpC,CAACC,GAAKC,OAAS;AAAA,EACb,GAAGJ;AAAA,EACH,oBAAoB,CAAC,EAAE,KAAAK,GAAK,OAAAC,EAAA,MACxBH,EAAI,MAAM;AACN,UAAMI,IAAkBH,IAAM;AAC9B,WAAAG,EAAgBF,CAAG,IAAIC,GAChB,EAAE,iBAAAC,EAAA;AAAA,EACb,CAAC;AAAA,EACL,sBAAsB,MAClBJ,EAAI,OAAO,EAAE,iBAAiB,EAAE,GAAGJ,EAAA,EAAsB,EAAI;AAAA,EACjE,gBAAgB,CAACS,MAAYL,EAAI,OAAO,EAAE,aAAaK,IAAU;AAAA,EACjE,iBAAiB,MACbL,EAAI,OAAO;AAAA,IACP,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,EAAA,EACrB;AAAA,EACN,yBAAyB,MACrBA,EAAI,OAAO;AAAA,IACP,mBAAmB;AAAA,EAAA,EACrB;AAAA,EACN,mBAAmB,CAACK,MAChBL,EAAI,OAAO;AAAA,IACP,gBAAgBK;AAAA,EAAA,EAClB;AACV,EAAE;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.js","sources":["../../../../../../lib/@ecme/views/concepts/calendar/Calendar/Calendar.tsx"],"sourcesContent":["import { useState } from 'react'\nimport CalendarView from '@/components/shared/CalendarView'\nimport Container from '@/components/shared/Container'\nimport EventDialog from './components/EventDialog'\nimport { apiGetCalendar } from '@/services/CalendarService'\nimport cloneDeep from 'lodash/cloneDeep'\nimport dayjs from 'dayjs'\nimport useSWR from 'swr'\nimport type {\n GetCalendarResponse,\n SelectedCell,\n CalendarEventParam,\n} from './types'\nimport type {\n EventDropArg,\n EventClickArg,\n DateSelectArg,\n} from '@fullcalendar/core'\n\nconst Calendar = () => {\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const [selectedCell, setSelectedCell] = useState<SelectedCell>({\n type: '',\n })\n\n const { data: events, mutate } = useSWR(\n '/api/calendar',\n () => apiGetCalendar<GetCalendarResponse>(),\n {\n revalidateOnFocus: false,\n revalidateIfStale: false,\n revalidateOnReconnect: false,\n },\n )\n\n const handleCellSelect = (event: DateSelectArg) => {\n const { start, end } = event\n setSelectedCell({\n type: 'NEW',\n start: dayjs(start).format(),\n end: dayjs(end).format(),\n })\n setDialogOpen(true)\n }\n\n const handleEventClick = (arg: EventClickArg) => {\n const { start, end, id, title, extendedProps } = arg.event\n\n setSelectedCell({\n type: 'EDIT',\n eventColor: extendedProps.eventColor,\n title,\n start: start ? dayjs(start).toISOString() : undefined,\n end: end ? dayjs(end).toISOString() : undefined,\n id,\n })\n setDialogOpen(true)\n }\n\n const handleEventChange = (arg: EventDropArg) => {\n const newEvents = cloneDeep(events)?.map((event) => {\n if (arg.event.id === event.id) {\n const { id, extendedProps, start, end, title } = arg.event\n event = {\n id,\n start: dayjs(start).format(),\n end: dayjs(end).format(),\n title,\n eventColor: extendedProps.eventColor,\n }\n }\n return event\n })\n mutate(newEvents, false)\n }\n\n const handleSubmit = (data: CalendarEventParam, type: string) => {\n let newEvents = cloneDeep(events)\n if (type === 'NEW') {\n newEvents?.push(data)\n }\n\n if (type === 'EDIT') {\n newEvents = newEvents?.map((event) => {\n if (data.id === event.id) {\n event = data\n }\n return event\n })\n }\n mutate(newEvents, false)\n }\n\n return (\n <Container className=\"h-full\">\n <CalendarView\n editable\n selectable\n events={events}\n eventClick={handleEventClick}\n select={handleCellSelect}\n eventDrop={handleEventChange}\n />\n <EventDialog\n open={dialogOpen}\n selected={selectedCell}\n submit={handleSubmit}\n onDialogOpen={setDialogOpen}\n />\n </Container>\n )\n}\n\nexport default Calendar\n"],"names":["Calendar","dialogOpen","setDialogOpen","useState","selectedCell","setSelectedCell","events","mutate","useSWR","apiGetCalendar","jsxs","Container","jsx","CalendarView","arg","start","end","id","title","extendedProps","dayjs","event","newEvents","_a","cloneDeep","EventDialog","data","type"],"mappings":";;;;;;;;;AAmBA,MAAMA,IAAW,MAAM;AACnB,QAAM,CAACC,GAAYC,CAAa,IAAIC,EAAS,EAAK,GAE5C,CAACC,GAAcC,CAAe,IAAIF,EAAuB;AAAA,IAC3D,MAAM;AAAA,EAAA,CACT,GAEK,EAAE,MAAMG,GAAQ,QAAAC,EAAA,IAAWC;AAAA,IAC7B;AAAA,IACA,MAAMC,EAAA;AAAA,IACN;AAAA,MACI,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,uBAAuB;AAAA,IAAA;AAAA,EAC3B;AA6DJ,SACI,gBAAAC,EAACC,GAAA,EAAU,WAAU,UACjB,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,UAAQ;AAAA,QACR,YAAU;AAAA,QACV,QAAAP;AAAA,QACA,YAtDa,CAACQ,MAAuB;AAC7C,gBAAM,EAAE,OAAAC,GAAO,KAAAC,GAAK,IAAAC,GAAI,OAAAC,GAAO,eAAAC,EAAA,IAAkBL,EAAI;AAErD,UAAAT,EAAgB;AAAA,YACZ,MAAM;AAAA,YACN,YAAYc,EAAc;AAAA,YAC1B,OAAAD;AAAA,YACA,OAAOH,IAAQK,EAAML,CAAK,EAAE,gBAAgB;AAAA,YAC5C,KAAKC,IAAMI,EAAMJ,CAAG,EAAE,gBAAgB;AAAA,YACtC,IAAAC;AAAA,UAAA,CACH,GACDf,EAAc,EAAI;AAAA,
|
|
1
|
+
{"version":3,"file":"Calendar.js","sources":["../../../../../../lib/@ecme/views/concepts/calendar/Calendar/Calendar.tsx"],"sourcesContent":["import { useState } from 'react'\nimport CalendarView from '@/components/shared/CalendarView'\nimport Container from '@/components/shared/Container'\nimport EventDialog from './components/EventDialog'\nimport { apiGetCalendar } from '@/services/CalendarService'\nimport cloneDeep from 'lodash/cloneDeep'\nimport dayjs from 'dayjs'\nimport useSWR from 'swr'\nimport type {\n GetCalendarResponse,\n SelectedCell,\n CalendarEventParam,\n} from './types'\nimport type {\n EventDropArg,\n EventClickArg,\n DateSelectArg,\n} from '@fullcalendar/core'\n\nconst Calendar = () => {\n const [dialogOpen, setDialogOpen] = useState(false)\n\n const [selectedCell, setSelectedCell] = useState<SelectedCell>({\n type: '',\n })\n\n const { data: events, mutate } = useSWR(\n '/api/calendar',\n () => apiGetCalendar<GetCalendarResponse>(),\n {\n revalidateOnFocus: false,\n revalidateIfStale: false,\n revalidateOnReconnect: false,\n },\n )\n\n const handleCellSelect = (event: DateSelectArg) => {\n const { start, end } = event\n setSelectedCell({\n type: 'NEW',\n start: dayjs(start).format(),\n end: dayjs(end).format(),\n })\n setDialogOpen(true)\n }\n\n const handleEventClick = (arg: EventClickArg) => {\n const { start, end, id, title, extendedProps } = arg.event\n\n setSelectedCell({\n type: 'EDIT',\n eventColor: extendedProps.eventColor,\n title,\n start: start ? dayjs(start).toISOString() : undefined,\n end: end ? dayjs(end).toISOString() : undefined,\n id,\n })\n setDialogOpen(true)\n }\n\n const handleEventChange = (arg: EventDropArg) => {\n const newEvents = cloneDeep(events)?.map((event) => {\n if (arg.event.id === event.id) {\n const { id, extendedProps, start, end, title } = arg.event\n event = {\n id,\n start: dayjs(start).format(),\n end: dayjs(end).format(),\n title,\n eventColor: extendedProps.eventColor,\n }\n }\n return event\n })\n mutate(newEvents, false)\n }\n\n const handleSubmit = (data: CalendarEventParam, type: string) => {\n let newEvents = cloneDeep(events)\n if (type === 'NEW') {\n newEvents?.push(data)\n }\n\n if (type === 'EDIT') {\n newEvents = newEvents?.map((event) => {\n if (data.id === event.id) {\n event = data\n }\n return event\n })\n }\n mutate(newEvents, false)\n }\n\n return (\n <Container className=\"h-full\">\n <CalendarView\n editable\n selectable\n events={events}\n eventClick={handleEventClick}\n select={handleCellSelect}\n eventDrop={handleEventChange}\n />\n <EventDialog\n open={dialogOpen}\n selected={selectedCell}\n submit={handleSubmit}\n onDialogOpen={setDialogOpen}\n />\n </Container>\n )\n}\n\nexport default Calendar\n"],"names":["Calendar","dialogOpen","setDialogOpen","useState","selectedCell","setSelectedCell","events","mutate","useSWR","apiGetCalendar","jsxs","Container","jsx","CalendarView","arg","start","end","id","title","extendedProps","dayjs","event","newEvents","_a","cloneDeep","EventDialog","data","type"],"mappings":";;;;;;;;;AAmBA,MAAMA,IAAW,MAAM;AACnB,QAAM,CAACC,GAAYC,CAAa,IAAIC,EAAS,EAAK,GAE5C,CAACC,GAAcC,CAAe,IAAIF,EAAuB;AAAA,IAC3D,MAAM;AAAA,EAAA,CACT,GAEK,EAAE,MAAMG,GAAQ,QAAAC,EAAA,IAAWC;AAAA,IAC7B;AAAA,IACA,MAAMC,EAAA;AAAA,IACN;AAAA,MACI,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,MACnB,uBAAuB;AAAA,IAAA;AAAA,EAC3B;AA6DJ,SACI,gBAAAC,EAACC,GAAA,EAAU,WAAU,UACjB,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,UAAQ;AAAA,QACR,YAAU;AAAA,QACV,QAAAP;AAAA,QACA,YAtDa,CAACQ,MAAuB;AAC7C,gBAAM,EAAE,OAAAC,GAAO,KAAAC,GAAK,IAAAC,GAAI,OAAAC,GAAO,eAAAC,EAAA,IAAkBL,EAAI;AAErD,UAAAT,EAAgB;AAAA,YACZ,MAAM;AAAA,YACN,YAAYc,EAAc;AAAA,YAC1B,OAAAD;AAAA,YACA,OAAOH,IAAQK,EAAML,CAAK,EAAE,gBAAgB;AAAA,YAC5C,KAAKC,IAAMI,EAAMJ,CAAG,EAAE,gBAAgB;AAAA,YACtC,IAAAC;AAAA,UAAA,CACH,GACDf,EAAc,EAAI;AAAA,QACtB;AAAA,QA2CY,QAjEa,CAACmB,MAAyB;AAC/C,gBAAM,EAAE,OAAAN,GAAO,KAAAC,EAAA,IAAQK;AACvB,UAAAhB,EAAgB;AAAA,YACZ,MAAM;AAAA,YACN,OAAOe,EAAML,CAAK,EAAE,OAAA;AAAA,YACpB,KAAKK,EAAMJ,CAAG,EAAE,OAAA;AAAA,UAAO,CAC1B,GACDd,EAAc,EAAI;AAAA,QACtB;AAAA,QA0DY,WA1Cc,CAACY,MAAsB;;AAC7C,gBAAMQ,KAAYC,IAAAC,EAAUlB,CAAM,MAAhB,gBAAAiB,EAAmB,IAAI,CAACF,MAAU;AAChD,gBAAIP,EAAI,MAAM,OAAOO,EAAM,IAAI;AAC3B,oBAAM,EAAE,IAAAJ,GAAI,eAAAE,GAAe,OAAAJ,GAAO,KAAAC,GAAK,OAAAE,EAAA,IAAUJ,EAAI;AACrD,cAAAO,IAAQ;AAAA,gBACJ,IAAAJ;AAAA,gBACA,OAAOG,EAAML,CAAK,EAAE,OAAA;AAAA,gBACpB,KAAKK,EAAMJ,CAAG,EAAE,OAAA;AAAA,gBAChB,OAAAE;AAAA,gBACA,YAAYC,EAAc;AAAA,cAAA;AAAA,YAElC;AACA,mBAAOE;AAAA,UACX;AACA,UAAAd,EAAOe,GAAW,EAAK;AAAA,QAC3B;AAAA,MA2BuB;AAAA,IAAA;AAAA,IAEf,gBAAAV;AAAA,MAACa;AAAA,MAAA;AAAA,QACG,MAAMxB;AAAA,QACN,UAAUG;AAAA,QACV,QA9BS,CAACsB,GAA0BC,MAAiB;AAC7D,cAAIL,IAAYE,EAAUlB,CAAM;AAChC,UAAIqB,MAAS,UACTL,KAAA,QAAAA,EAAW,KAAKI,KAGhBC,MAAS,WACTL,IAAYA,KAAA,gBAAAA,EAAW,IAAI,CAACD,OACpBK,EAAK,OAAOL,EAAM,OAClBA,IAAQK,IAELL,MAGfd,EAAOe,GAAW,EAAK;AAAA,QAC3B;AAAA,QAgBY,cAAcpB;AAAA,MAAA;AAAA,IAAA;AAAA,EAClB,GACJ;AAER;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventDialog.js","sources":["../../../../../../../lib/@ecme/views/concepts/calendar/Calendar/components/EventDialog.tsx"],"sourcesContent":["import { useEffect } from 'react'\nimport Input from '@/components/ui/Input'\nimport Button from '@/components/ui/Button'\nimport Select from '@/components/ui/Select'\nimport DatePicker from '@/components/ui/DatePicker'\nimport Dialog from '@/components/ui/Dialog'\nimport { Form, FormItem } from '@/components/ui/Form'\nimport Badge from '@/components/ui/Badge'\nimport hooks from '@/components/ui/hooks'\nimport { Controller, useForm } from 'react-hook-form'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport { z } from 'zod'\nimport { TbChecks } from 'react-icons/tb'\nimport { components } from 'react-select'\nimport dayjs from 'dayjs'\nimport type { SelectedCell } from '../types'\nimport type { ControlProps, OptionProps } from 'react-select'\n\ntype FormModel = {\n title: string\n startDate: Date\n endDate: Date\n color: string\n}\n\nexport type EventParam = {\n id: string\n title: string\n start: string\n eventColor: string\n end?: string\n}\n\ntype ColorOption = {\n value: string\n label: string\n color: string\n}\n\ntype EventDialogProps = {\n open: boolean\n selected: SelectedCell\n onDialogOpen: (open: boolean) => void\n submit: (eventData: EventParam, type: string) => void\n}\n\nconst { Control } = components\n\nconst { useUniqueId } = hooks\n\nconst colorOptions = [\n {\n value: 'red',\n label: 'red',\n color: 'bg-red-400',\n },\n {\n value: 'orange',\n label: 'orange',\n color: 'bg-orange-400',\n },\n {\n value: 'yellow',\n label: 'yellow',\n color: 'bg-yellow-400',\n },\n {\n value: 'green',\n label: 'green',\n color: 'bg-green-400',\n },\n {\n value: 'blue',\n label: 'blue',\n color: 'bg-blue-400',\n },\n {\n value: 'purple',\n label: 'purple',\n color: 'bg-purple-400',\n },\n]\n\nconst CustomSelectOption = ({\n innerProps,\n label,\n data,\n isSelected,\n}: OptionProps<ColorOption>) => {\n return (\n <div\n className={`flex items-center justify-between rounded-lg p-2 ${\n isSelected\n ? 'bg-gray-100 dark:bg-gray-500'\n : 'hover:bg-gray-50 dark:hover:bg-gray-600'\n }`}\n {...innerProps}\n >\n <div className=\"flex items-center\">\n <Badge className={data.color} />\n <span className=\"ml-2 rtl:mr-2 capitalize\">{label}</span>\n </div>\n {isSelected && <TbChecks className=\"text-emerald-500 text-xl\" />}\n </div>\n )\n}\n\nconst CustomControl = ({ children, ...props }: ControlProps<ColorOption>) => {\n const selected = props.getValue()[0]\n\n return (\n <Control className=\"capitalize\" {...props}>\n {selected && (\n <Badge className={`${selected.color} ltr:ml-4 rtl:mr-4`} />\n )}\n {children}\n </Control>\n )\n}\n\nconst validationSchema = z.object({\n title: z.string().min(1, { message: 'Event title required' }),\n startDate: z.date({\n required_error: 'Please select a date',\n invalid_type_error: \"That's not a date!\",\n }),\n endDate: z.date({\n required_error: 'Please select a date',\n invalid_type_error: \"That's not a date!\",\n }),\n color: z.string().min(1, { message: 'Color required' }),\n})\n\nconst EventDialog = (props: EventDialogProps) => {\n const { submit, open, selected, onDialogOpen } = props\n\n const newId = useUniqueId('event-')\n\n const handleDialogClose = () => {\n onDialogOpen(false)\n }\n\n const onSubmit = (values: FormModel) => {\n const eventData: EventParam = {\n id: selected.id || newId,\n title: values.title,\n start: dayjs(values.startDate).format(),\n eventColor: values.color,\n }\n if (values.endDate) {\n eventData.end = dayjs(values.endDate).format()\n }\n console.log('eventData', eventData)\n submit?.(eventData, selected.type)\n handleDialogClose()\n }\n\n const {\n handleSubmit,\n reset,\n formState: { errors },\n control,\n } = useForm<FormModel>({\n resolver: zodResolver(validationSchema),\n })\n\n useEffect(() => {\n if (selected) {\n reset({\n title: selected.title || '',\n startDate: (selected.start &&\n dayjs(selected.start).toDate()) as Date,\n endDate: (selected.end && dayjs(selected.end).toDate()) as Date,\n color: selected.eventColor || colorOptions[0].value,\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selected])\n\n return (\n <Dialog\n isOpen={open}\n onClose={handleDialogClose}\n onRequestClose={handleDialogClose}\n >\n <h5 className=\"mb-4\">\n {selected.type === 'NEW' ? 'Add New Event' : 'Edit Event'}\n </h5>\n <Form\n className=\"flex-1 flex flex-col\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <FormItem\n label=\"Event title\"\n invalid={Boolean(errors.title)}\n errorMessage={errors.title?.message}\n >\n <Controller\n name=\"title\"\n control={control}\n render={({ field }) => (\n <Input\n type=\"text\"\n autoComplete=\"off\"\n placeholder=\"Event title\"\n {...field}\n />\n )}\n />\n </FormItem>\n <FormItem\n label=\"Start date\"\n invalid={Boolean(errors.startDate)}\n errorMessage={errors.startDate?.message}\n >\n <Controller\n name=\"startDate\"\n control={control}\n render={({ field }) => (\n <DatePicker\n value={field.value}\n onChange={field.onChange}\n />\n )}\n />\n </FormItem>\n <FormItem\n label=\"End date\"\n invalid={Boolean(errors.endDate)}\n errorMessage={errors.endDate?.message}\n >\n <Controller\n name=\"endDate\"\n control={control}\n render={({ field }) => (\n <DatePicker\n value={field.value}\n onChange={field.onChange}\n />\n )}\n />\n </FormItem>\n <FormItem\n label=\"Event color\"\n asterisk={true}\n invalid={Boolean(errors.color)}\n errorMessage={errors.color?.message}\n >\n <Controller\n name=\"color\"\n control={control}\n render={({ field }) => (\n <Select<ColorOption>\n options={colorOptions}\n value={colorOptions.filter(\n (option) => option.value === field.value,\n )}\n components={{\n Option: CustomSelectOption,\n Control: CustomControl,\n }}\n onChange={(selected) => {\n field.onChange(selected?.value)\n }}\n />\n )}\n />\n </FormItem>\n <FormItem className=\"mb-0 text-right rtl:text-left\">\n <Button block variant=\"solid\" type=\"submit\">\n {selected.type === 'NEW' ? 'Create' : 'Update'}\n </Button>\n </FormItem>\n </Form>\n </Dialog>\n )\n}\n\nexport default EventDialog\n"],"names":["Control","components","useUniqueId","hooks","colorOptions","CustomSelectOption","innerProps","label","data","isSelected","jsxs","jsx","Badge","TbChecks","CustomControl","children","props","selected","validationSchema","z","EventDialog","submit","open","onDialogOpen","newId","handleDialogClose","onSubmit","values","eventData","dayjs","handleSubmit","reset","errors","control","useForm","zodResolver","useEffect","Dialog","Form","FormItem","_a","Controller","field","Input","_b","DatePicker","_c","_d","Select","option","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EventDialog.js","sources":["../../../../../../../lib/@ecme/views/concepts/calendar/Calendar/components/EventDialog.tsx"],"sourcesContent":["import { useEffect } from 'react'\nimport Input from '@/components/ui/Input'\nimport Button from '@/components/ui/Button'\nimport Select from '@/components/ui/Select'\nimport DatePicker from '@/components/ui/DatePicker'\nimport Dialog from '@/components/ui/Dialog'\nimport { Form, FormItem } from '@/components/ui/Form'\nimport Badge from '@/components/ui/Badge'\nimport hooks from '@/components/ui/hooks'\nimport { Controller, useForm } from 'react-hook-form'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport { z } from 'zod'\nimport { TbChecks } from 'react-icons/tb'\nimport { components } from 'react-select'\nimport dayjs from 'dayjs'\nimport type { SelectedCell } from '../types'\nimport type { ControlProps, OptionProps } from 'react-select'\n\ntype FormModel = {\n title: string\n startDate: Date\n endDate: Date\n color: string\n}\n\nexport type EventParam = {\n id: string\n title: string\n start: string\n eventColor: string\n end?: string\n}\n\ntype ColorOption = {\n value: string\n label: string\n color: string\n}\n\ntype EventDialogProps = {\n open: boolean\n selected: SelectedCell\n onDialogOpen: (open: boolean) => void\n submit: (eventData: EventParam, type: string) => void\n}\n\nconst { Control } = components\n\nconst { useUniqueId } = hooks\n\nconst colorOptions = [\n {\n value: 'red',\n label: 'red',\n color: 'bg-red-400',\n },\n {\n value: 'orange',\n label: 'orange',\n color: 'bg-orange-400',\n },\n {\n value: 'yellow',\n label: 'yellow',\n color: 'bg-yellow-400',\n },\n {\n value: 'green',\n label: 'green',\n color: 'bg-green-400',\n },\n {\n value: 'blue',\n label: 'blue',\n color: 'bg-blue-400',\n },\n {\n value: 'purple',\n label: 'purple',\n color: 'bg-purple-400',\n },\n]\n\nconst CustomSelectOption = ({\n innerProps,\n label,\n data,\n isSelected,\n}: OptionProps<ColorOption>) => {\n return (\n <div\n className={`flex items-center justify-between rounded-lg p-2 ${\n isSelected\n ? 'bg-gray-100 dark:bg-gray-500'\n : 'hover:bg-gray-50 dark:hover:bg-gray-600'\n }`}\n {...innerProps}\n >\n <div className=\"flex items-center\">\n <Badge className={data.color} />\n <span className=\"ml-2 rtl:mr-2 capitalize\">{label}</span>\n </div>\n {isSelected && <TbChecks className=\"text-emerald-500 text-xl\" />}\n </div>\n )\n}\n\nconst CustomControl = ({ children, ...props }: ControlProps<ColorOption>) => {\n const selected = props.getValue()[0]\n\n return (\n <Control className=\"capitalize\" {...props}>\n {selected && (\n <Badge className={`${selected.color} ltr:ml-4 rtl:mr-4`} />\n )}\n {children}\n </Control>\n )\n}\n\nconst validationSchema = z.object({\n title: z.string().min(1, { message: 'Event title required' }),\n startDate: z.date({\n required_error: 'Please select a date',\n invalid_type_error: \"That's not a date!\",\n }),\n endDate: z.date({\n required_error: 'Please select a date',\n invalid_type_error: \"That's not a date!\",\n }),\n color: z.string().min(1, { message: 'Color required' }),\n})\n\nconst EventDialog = (props: EventDialogProps) => {\n const { submit, open, selected, onDialogOpen } = props\n\n const newId = useUniqueId('event-')\n\n const handleDialogClose = () => {\n onDialogOpen(false)\n }\n\n const onSubmit = (values: FormModel) => {\n const eventData: EventParam = {\n id: selected.id || newId,\n title: values.title,\n start: dayjs(values.startDate).format(),\n eventColor: values.color,\n }\n if (values.endDate) {\n eventData.end = dayjs(values.endDate).format()\n }\n console.log('eventData', eventData)\n submit?.(eventData, selected.type)\n handleDialogClose()\n }\n\n const {\n handleSubmit,\n reset,\n formState: { errors },\n control,\n } = useForm<FormModel>({\n resolver: zodResolver(validationSchema),\n })\n\n useEffect(() => {\n if (selected) {\n reset({\n title: selected.title || '',\n startDate: (selected.start &&\n dayjs(selected.start).toDate()) as Date,\n endDate: (selected.end && dayjs(selected.end).toDate()) as Date,\n color: selected.eventColor || colorOptions[0].value,\n })\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selected])\n\n return (\n <Dialog\n isOpen={open}\n onClose={handleDialogClose}\n onRequestClose={handleDialogClose}\n >\n <h5 className=\"mb-4\">\n {selected.type === 'NEW' ? 'Add New Event' : 'Edit Event'}\n </h5>\n <Form\n className=\"flex-1 flex flex-col\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <FormItem\n label=\"Event title\"\n invalid={Boolean(errors.title)}\n errorMessage={errors.title?.message}\n >\n <Controller\n name=\"title\"\n control={control}\n render={({ field }) => (\n <Input\n type=\"text\"\n autoComplete=\"off\"\n placeholder=\"Event title\"\n {...field}\n />\n )}\n />\n </FormItem>\n <FormItem\n label=\"Start date\"\n invalid={Boolean(errors.startDate)}\n errorMessage={errors.startDate?.message}\n >\n <Controller\n name=\"startDate\"\n control={control}\n render={({ field }) => (\n <DatePicker\n value={field.value}\n onChange={field.onChange}\n />\n )}\n />\n </FormItem>\n <FormItem\n label=\"End date\"\n invalid={Boolean(errors.endDate)}\n errorMessage={errors.endDate?.message}\n >\n <Controller\n name=\"endDate\"\n control={control}\n render={({ field }) => (\n <DatePicker\n value={field.value}\n onChange={field.onChange}\n />\n )}\n />\n </FormItem>\n <FormItem\n label=\"Event color\"\n asterisk={true}\n invalid={Boolean(errors.color)}\n errorMessage={errors.color?.message}\n >\n <Controller\n name=\"color\"\n control={control}\n render={({ field }) => (\n <Select<ColorOption>\n options={colorOptions}\n value={colorOptions.filter(\n (option) => option.value === field.value,\n )}\n components={{\n Option: CustomSelectOption,\n Control: CustomControl,\n }}\n onChange={(selected) => {\n field.onChange(selected?.value)\n }}\n />\n )}\n />\n </FormItem>\n <FormItem className=\"mb-0 text-right rtl:text-left\">\n <Button block variant=\"solid\" type=\"submit\">\n {selected.type === 'NEW' ? 'Create' : 'Update'}\n </Button>\n </FormItem>\n </Form>\n </Dialog>\n )\n}\n\nexport default EventDialog\n"],"names":["Control","components","useUniqueId","hooks","colorOptions","CustomSelectOption","innerProps","label","data","isSelected","jsxs","jsx","Badge","TbChecks","CustomControl","children","props","selected","validationSchema","z","EventDialog","submit","open","onDialogOpen","newId","handleDialogClose","onSubmit","values","eventData","dayjs","handleSubmit","reset","errors","control","useForm","zodResolver","useEffect","Dialog","Form","FormItem","_a","Controller","field","Input","_b","DatePicker","_c","_d","Select","option","Button"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatAction.js","sources":["../../../../../../../lib/@ecme/views/concepts/chat/Chat/components/ChatAction.tsx"],"sourcesContent":["import { useRef } from 'react'\nimport Dropdown from '@/components/ui/Dropdown'\nimport { useChatStore } from '../store/chatStore'\nimport {\n TbDotsVertical,\n TbBell,\n TbBellOff,\n TbShare3,\n TbTrash,\n TbUserPlus,\n} from 'react-icons/tb'\nimport type { DropdownRef } from '@/components/ui/Dropdown'\n\ntype ChatActionProps = {\n muted?: boolean\n}\n\nconst ChatAction = ({ muted }: ChatActionProps) => {\n const dropdownRef = useRef<DropdownRef>(null)\n const selectedChat = useChatStore((state) => state.selectedChat)\n const setSelectedChat = useChatStore((state) => state.setSelectedChat)\n const deleteConversationRecord = useChatStore(\n (state) => state.deleteConversationRecord,\n )\n const setChatMute = useChatStore((state) => state.setChatMute)\n\n const handleMute = () => {\n const nextMuted = !selectedChat.muted\n setSelectedChat({ ...selectedChat, muted: nextMuted })\n setChatMute({ id: selectedChat.id as string, muted: nextMuted })\n }\n\n const handleDelete = () => {\n deleteConversationRecord(selectedChat.id as string)\n setSelectedChat({})\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <Dropdown\n ref={dropdownRef}\n placement=\"bottom-end\"\n renderTitle={\n <button className=\"outline-none rounded-full p-2 text-xl bg-white dark:bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-400 hover:text-gray-800 dark:text-gray-200 dark:hover:text-gray-100\">\n <TbDotsVertical />\n </button>\n }\n >\n <Dropdown.Item eventKey=\"mute\" onClick={handleMute}>\n <span className=\"text-lg\">\n {muted ? <TbBellOff /> : <TbBell />}\n </span>\n <span>{muted ? 'Unmute' : 'Mute'}</span>\n </Dropdown.Item>\n {selectedChat.chatType === 'groups' ? (\n <Dropdown.Item eventKey=\"inviteMember\">\n <span className=\"text-lg\">\n <TbUserPlus />\n </span>\n <span>Invite member</span>\n </Dropdown.Item>\n ) : (\n <Dropdown.Item eventKey=\"shareContact\">\n <span className=\"text-lg\">\n <TbShare3 />\n </span>\n <span>Share contact</span>\n </Dropdown.Item>\n )}\n <Dropdown.Item eventKey=\"delete\" onClick={handleDelete}>\n <span className=\"text-lg text-error\">\n <TbTrash />\n </span>\n <span className=\"text-error\">Delete</span>\n </Dropdown.Item>\n </Dropdown>\n </div>\n )\n}\n\nexport default ChatAction\n"],"names":["ChatAction","muted","dropdownRef","useRef","selectedChat","useChatStore","state","setSelectedChat","deleteConversationRecord","setChatMute","handleMute","nextMuted","handleDelete","jsx","jsxs","Dropdown","TbDotsVertical","TbBellOff","TbBell","TbUserPlus","TbShare3","TbTrash"],"mappings":";;;;;AAiBA,MAAMA,IAAa,CAAC,EAAE,OAAAC,QAA6B;AAC/C,QAAMC,IAAcC,EAAoB,IAAI,GACtCC,IAAeC,EAAa,CAACC,MAAUA,EAAM,YAAY,GACzDC,IAAkBF,EAAa,CAACC,MAAUA,EAAM,eAAe,GAC/DE,IAA2BH;AAAA,IAC7B,CAACC,MAAUA,EAAM;AAAA,EAAA,GAEfG,IAAcJ,EAAa,CAACC,MAAUA,EAAM,WAAW,GAEvDI,IAAa,MAAM;AACrB,UAAMC,IAAY,CAACP,EAAa;AAChC,IAAAG,EAAgB,EAAE,GAAGH,GAAc,OAAOO,GAAW,GACrDF,EAAY,EAAE,IAAIL,EAAa,IAAc,OAAOO,GAAW;AAAA,
|
|
1
|
+
{"version":3,"file":"ChatAction.js","sources":["../../../../../../../lib/@ecme/views/concepts/chat/Chat/components/ChatAction.tsx"],"sourcesContent":["import { useRef } from 'react'\nimport Dropdown from '@/components/ui/Dropdown'\nimport { useChatStore } from '../store/chatStore'\nimport {\n TbDotsVertical,\n TbBell,\n TbBellOff,\n TbShare3,\n TbTrash,\n TbUserPlus,\n} from 'react-icons/tb'\nimport type { DropdownRef } from '@/components/ui/Dropdown'\n\ntype ChatActionProps = {\n muted?: boolean\n}\n\nconst ChatAction = ({ muted }: ChatActionProps) => {\n const dropdownRef = useRef<DropdownRef>(null)\n const selectedChat = useChatStore((state) => state.selectedChat)\n const setSelectedChat = useChatStore((state) => state.setSelectedChat)\n const deleteConversationRecord = useChatStore(\n (state) => state.deleteConversationRecord,\n )\n const setChatMute = useChatStore((state) => state.setChatMute)\n\n const handleMute = () => {\n const nextMuted = !selectedChat.muted\n setSelectedChat({ ...selectedChat, muted: nextMuted })\n setChatMute({ id: selectedChat.id as string, muted: nextMuted })\n }\n\n const handleDelete = () => {\n deleteConversationRecord(selectedChat.id as string)\n setSelectedChat({})\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <Dropdown\n ref={dropdownRef}\n placement=\"bottom-end\"\n renderTitle={\n <button className=\"outline-none rounded-full p-2 text-xl bg-white dark:bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-400 hover:text-gray-800 dark:text-gray-200 dark:hover:text-gray-100\">\n <TbDotsVertical />\n </button>\n }\n >\n <Dropdown.Item eventKey=\"mute\" onClick={handleMute}>\n <span className=\"text-lg\">\n {muted ? <TbBellOff /> : <TbBell />}\n </span>\n <span>{muted ? 'Unmute' : 'Mute'}</span>\n </Dropdown.Item>\n {selectedChat.chatType === 'groups' ? (\n <Dropdown.Item eventKey=\"inviteMember\">\n <span className=\"text-lg\">\n <TbUserPlus />\n </span>\n <span>Invite member</span>\n </Dropdown.Item>\n ) : (\n <Dropdown.Item eventKey=\"shareContact\">\n <span className=\"text-lg\">\n <TbShare3 />\n </span>\n <span>Share contact</span>\n </Dropdown.Item>\n )}\n <Dropdown.Item eventKey=\"delete\" onClick={handleDelete}>\n <span className=\"text-lg text-error\">\n <TbTrash />\n </span>\n <span className=\"text-error\">Delete</span>\n </Dropdown.Item>\n </Dropdown>\n </div>\n )\n}\n\nexport default ChatAction\n"],"names":["ChatAction","muted","dropdownRef","useRef","selectedChat","useChatStore","state","setSelectedChat","deleteConversationRecord","setChatMute","handleMute","nextMuted","handleDelete","jsx","jsxs","Dropdown","TbDotsVertical","TbBellOff","TbBell","TbUserPlus","TbShare3","TbTrash"],"mappings":";;;;;AAiBA,MAAMA,IAAa,CAAC,EAAE,OAAAC,QAA6B;AAC/C,QAAMC,IAAcC,EAAoB,IAAI,GACtCC,IAAeC,EAAa,CAACC,MAAUA,EAAM,YAAY,GACzDC,IAAkBF,EAAa,CAACC,MAAUA,EAAM,eAAe,GAC/DE,IAA2BH;AAAA,IAC7B,CAACC,MAAUA,EAAM;AAAA,EAAA,GAEfG,IAAcJ,EAAa,CAACC,MAAUA,EAAM,WAAW,GAEvDI,IAAa,MAAM;AACrB,UAAMC,IAAY,CAACP,EAAa;AAChC,IAAAG,EAAgB,EAAE,GAAGH,GAAc,OAAOO,GAAW,GACrDF,EAAY,EAAE,IAAIL,EAAa,IAAc,OAAOO,GAAW;AAAA,EACnE,GAEMC,IAAe,MAAM;AACvB,IAAAJ,EAAyBJ,EAAa,EAAY,GAClDG,EAAgB,CAAA,CAAE;AAAA,EACtB;AAEA,SACI,gBAAAM,EAAC,OAAA,EAAI,WAAU,2BACX,UAAA,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,KAAKb;AAAA,MACL,WAAU;AAAA,MACV,aACI,gBAAAW,EAAC,UAAA,EAAO,WAAU,4KACd,UAAA,gBAAAA,EAACG,KAAe,GACpB;AAAA,MAGJ,UAAA;AAAA,QAAA,gBAAAF,EAACC,EAAS,MAAT,EAAc,UAAS,QAAO,SAASL,GACpC,UAAA;AAAA,UAAA,gBAAAG,EAAC,QAAA,EAAK,WAAU,WACX,UAAAZ,sBAASgB,GAAA,CAAA,CAAU,IAAK,gBAAAJ,EAACK,GAAA,CAAA,CAAO,EAAA,CACrC;AAAA,UACA,gBAAAL,EAAC,QAAA,EAAM,UAAAZ,IAAQ,WAAW,OAAA,CAAO;AAAA,QAAA,GACrC;AAAA,QACCG,EAAa,aAAa,WACvB,gBAAAU,EAACC,EAAS,MAAT,EAAc,UAAS,gBACpB,UAAA;AAAA,UAAA,gBAAAF,EAAC,QAAA,EAAK,WAAU,WACZ,UAAA,gBAAAA,EAACM,KAAW,GAChB;AAAA,UACA,gBAAAN,EAAC,UAAK,UAAA,gBAAA,CAAa;AAAA,QAAA,EAAA,CACvB,IAEA,gBAAAC,EAACC,EAAS,MAAT,EAAc,UAAS,gBACpB,UAAA;AAAA,UAAA,gBAAAF,EAAC,QAAA,EAAK,WAAU,WACZ,UAAA,gBAAAA,EAACO,KAAS,GACd;AAAA,UACA,gBAAAP,EAAC,UAAK,UAAA,gBAAA,CAAa;AAAA,QAAA,GACvB;AAAA,0BAEHE,EAAS,MAAT,EAAc,UAAS,UAAS,SAASH,GACtC,UAAA;AAAA,UAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,sBACZ,UAAA,gBAAAA,EAACQ,KAAQ,GACb;AAAA,UACA,gBAAAR,EAAC,QAAA,EAAK,WAAU,cAAa,UAAA,SAAA,CAAM;AAAA,QAAA,EAAA,CACvC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAER;AAER;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBody.js","sources":["../../../../../../../lib/@ecme/views/concepts/chat/Chat/components/ChatBody.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useMemo } from 'react'\nimport Avatar from '@/components/ui/Avatar'\nimport Card from '@/components/ui/Card'\nimport ChatBox from '@/components/view/ChatBox'\nimport ChatAction from './ChatAction'\nimport StartConverstation from '@/assets/svg/StartConverstation'\nimport { useChatStore } from '../store/chatStore'\nimport { apiGetConversation } from '@/services/ChatService'\nimport classNames from '@/utils/classNames'\nimport useResponsive from '@/utils/hooks/useResponsive'\nimport dayjs from 'dayjs'\nimport uniqueId from 'lodash/uniqueId'\nimport { TbChevronLeft } from 'react-icons/tb'\nimport type { GetConversationResponse, Message, ChatType } from '../types'\nimport type { ScrollBarRef } from '@/components/ui/ScrollBar'\n\nconst getFileType = (file: File) => {\n console.log('file.type', file.type)\n switch (file.type) {\n case 'image/jpg':\n case 'image/jpeg':\n case 'image/png':\n case 'image/webp':\n return 'image'\n case 'video/mp4':\n case 'video/avi':\n return 'video'\n case 'audio/mp3':\n case 'audio/wav':\n return 'audio'\n default:\n return 'misc'\n }\n}\n\nconst ChatBody = () => {\n const scrollRef = useRef<ScrollBarRef>(null)\n const selectedChat = useChatStore((state) => state.selectedChat)\n const conversationRecord = useChatStore((state) => state.conversationRecord)\n const pushConversationRecord = useChatStore(\n (state) => state.pushConversationRecord,\n )\n const setSelectedChat = useChatStore((state) => state.setSelectedChat)\n const pushConversationMessage = useChatStore(\n (state) => state.pushConversationMessage,\n )\n const setContactInfoDrawer = useChatStore(\n (state) => state.setContactInfoDrawer,\n )\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, setIsFetchingConversation] = useState(false)\n const [conversation, setConversation] = useState<Message[]>([])\n\n const { smaller } = useResponsive()\n\n const scrollToBottom = () => {\n if (scrollRef.current?.getScrollElement) {\n const scrollElement = scrollRef.current.getScrollElement()\n if (scrollElement) {\n scrollElement.scrollTop = scrollElement.scrollHeight\n }\n }\n }\n\n const handleProfileClick = () => {\n setContactInfoDrawer({\n userId: selectedChat.user?.id as string,\n chatId: selectedChat.id as string,\n chatType: selectedChat.chatType as ChatType,\n open: true,\n })\n }\n\n const handlePushMessage = (message: Message) => {\n pushConversationMessage(selectedChat.id as string, message)\n setConversation((prevConversation) => {\n prevConversation.push(message)\n return structuredClone(prevConversation)\n })\n }\n\n const handleInputChange = async ({\n value,\n attachments,\n }: {\n value: string\n attachments?: File[]\n }) => {\n const newMessage: Message = {\n id: uniqueId('chat-conversation-'),\n sender: {\n id: '1',\n name: 'Angelina Gotelli',\n avatarImageUrl: '/img/avatars/thumb-1.jpg',\n },\n content: value,\n attachments: attachments?.map((attachment) => {\n return {\n type: getFileType(attachment),\n source: attachment,\n mediaUrl: URL.createObjectURL(attachment),\n }\n }),\n timestamp: dayjs().toDate(),\n type: 'regular',\n isMyMessage: true,\n }\n handlePushMessage(newMessage)\n }\n\n const cardHeaderProps = {\n header: {\n content: (\n <div className=\"flex items-center gap-2\">\n {smaller.md && (\n <button\n className=\"text-xl hover:text-primary\"\n onClick={() => setSelectedChat({})}\n >\n <TbChevronLeft />\n </button>\n )}\n <button\n className=\"flex items-center gap-2\"\n role=\"button\"\n onClick={handleProfileClick}\n >\n <div>\n <Avatar src={selectedChat.user?.avatarImageUrl} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex justify-between\">\n <div className=\"font-bold heading-text truncate\">\n {selectedChat.user?.name}\n </div>\n </div>\n <div>\n {selectedChat?.chatType === 'groups'\n ? 'click here for group info'\n : 'last seen recently'}\n </div>\n </div>\n </button>\n </div>\n ),\n extra: <ChatAction muted={selectedChat.muted} />,\n className: 'bg-gray-100 dark:bg-gray-600 h-[100px]',\n },\n }\n\n useEffect(() => {\n const fetchConvesation = async () => {\n setIsFetchingConversation(true)\n\n const record = conversationRecord.find(\n (item) => item.id === selectedChat.id,\n )\n\n if (record) {\n setConversation(record.conversation)\n } else {\n const resp = await apiGetConversation<GetConversationResponse>({\n id: selectedChat.id as string,\n })\n setConversation(resp.conversation)\n pushConversationRecord(resp)\n }\n\n setIsFetchingConversation(false)\n scrollToBottom()\n }\n\n if (selectedChat.id) {\n setConversation([])\n fetchConvesation()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedChat.id, conversation])\n\n const messageList = useMemo(() => {\n return conversation.map((item) => {\n item.timestamp = dayjs\n .unix(item.timestamp as number)\n .toDate() as Date\n if (item.isMyMessage) {\n item.showAvatar = false\n }\n return item\n })\n }, [conversation])\n\n return (\n <div\n className={classNames(\n 'w-full md:block',\n !selectedChat.id && 'hidden',\n )}\n >\n {selectedChat.id ? (\n <Card\n className=\"flex-1 h-full max-h-full dark:border-gray-700\"\n bodyClass=\"h-[calc(100%-100px)] relative\"\n {...cardHeaderProps}\n >\n <ChatBox\n ref={scrollRef}\n messageList={messageList}\n placeholder=\"Enter a prompt here\"\n showAvatar={true}\n avatarGap={true}\n messageListClass=\"h-[calc(100%-100px)]\"\n bubbleClass=\"max-w-[300px]\"\n onInputChange={handleInputChange}\n />\n </Card>\n ) : (\n <div className=\"flex-1 h-full max-h-full flex flex-col items-center justify-center rounded-2xl border border-gray-200 dark:border-gray-800\">\n <StartConverstation height={250} width={250} />\n <div className=\"mt-10 text-center\">\n <h3>Start Chatting!</h3>\n <p className=\"mt-2 text-base\">\n Pick a Conversation or Begin a New One\n </p>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default ChatBody\n"],"names":["getFileType","file","ChatBody","scrollRef","useRef","selectedChat","useChatStore","state","conversationRecord","pushConversationRecord","setSelectedChat","pushConversationMessage","setContactInfoDrawer","_","setIsFetchingConversation","useState","conversation","setConversation","smaller","useResponsive","scrollToBottom","_a","scrollElement","handleProfileClick","handlePushMessage","message","prevConversation","handleInputChange","value","attachments","newMessage","uniqueId","attachment","dayjs","cardHeaderProps","jsxs","jsx","TbChevronLeft","Avatar","_b","ChatAction","useEffect","fetchConvesation","record","item","resp","apiGetConversation","messageList","useMemo","classNames","Card","ChatBox","StartConverstation"],"mappings":";;;;;;;;;;;;;;;;AAgBA,MAAMA,IAAc,CAACC,MAAe;AAEhC,UADA,QAAQ,IAAI,aAAaA,EAAK,IAAI,GAC1BA,EAAK,MAAA;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EAAA;AAEnB,GAEMC,KAAW,MAAM;;AACnB,QAAMC,IAAYC,EAAqB,IAAI,GACrCC,IAAeC,EAAa,CAACC,MAAUA,EAAM,YAAY,GACzDC,IAAqBF,EAAa,CAACC,MAAUA,EAAM,kBAAkB,GACrEE,IAAyBH;AAAA,IAC3B,CAACC,MAAUA,EAAM;AAAA,EAAA,GAEfG,IAAkBJ,EAAa,CAACC,MAAUA,EAAM,eAAe,GAC/DI,IAA0BL;AAAA,IAC5B,CAACC,MAAUA,EAAM;AAAA,EAAA,GAEfK,IAAuBN;AAAA,IACzB,CAACC,MAAUA,EAAM;AAAA,EAAA,GAGf,CAACM,GAAGC,CAAyB,IAAIC,EAAS,EAAK,GAC/C,CAACC,GAAcC,CAAe,IAAIF,EAAoB,CAAA,CAAE,GAExD,EAAE,SAAAG,EAAA,IAAYC,EAAA,GAEdC,IAAiB,MAAM;;AACzB,SAAIC,IAAAlB,EAAU,YAAV,QAAAkB,EAAmB,kBAAkB;AACrC,YAAMC,IAAgBnB,EAAU,QAAQ,iBAAA;AACxC,MAAImB,MACAA,EAAc,YAAYA,EAAc;AAAA,IAC5C;AAAA,EACJ,GAGEC,IAAqB,MAAM;;AAC7B,IAAAX,EAAqB;AAAA,MACjB,SAAQS,IAAAhB,EAAa,SAAb,gBAAAgB,EAAmB;AAAA,MAC3B,QAAQhB,EAAa;AAAA,MACrB,UAAUA,EAAa;AAAA,MACvB,MAAM;AAAA,IAAA,CACT;AAAA,EAAA,GAGCmB,IAAoB,CAACC,MAAqB;AAC5C,IAAAd,EAAwBN,EAAa,IAAcoB,CAAO,GAC1DR,EAAgB,CAACS,OACbA,EAAiB,KAAKD,CAAO,GACtB,gBAAgBC,CAAgB,EAC1C;AAAA,EAAA,GAGCC,IAAoB,OAAO;AAAA,IAC7B,OAAAC;AAAA,IACA,aAAAC;AAAA,EAAA,MAIE;AACF,UAAMC,IAAsB;AAAA,MACxB,IAAIC,EAAS,oBAAoB;AAAA,MACjC,QAAQ;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,gBAAgB;AAAA,MAAA;AAAA,MAEpB,SAASH;AAAA,MACT,aAAaC,KAAA,gBAAAA,EAAa,IAAI,CAACG,OACpB;AAAA,QACH,MAAMhC,EAAYgC,CAAU;AAAA,QAC5B,QAAQA;AAAA,QACR,UAAU,IAAI,gBAAgBA,CAAU;AAAA,MAAA;AAAA,MAGhD,WAAWC,EAAA,EAAQ,OAAA;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAEjB,IAAAT,EAAkBM,CAAU;AAAA,EAAA,GAG1BI,IAAkB;AAAA,IACpB,QAAQ;AAAA,MACJ,SACI,gBAAAC,EAAC,OAAA,EAAI,WAAU,2BACV,UAAA;AAAA,QAAAjB,EAAQ,MACL,gBAAAkB;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAU;AAAA,YACV,SAAS,MAAM1B,EAAgB,EAAE;AAAA,YAEjC,4BAAC2B,GAAA,CAAA,CAAc;AAAA,UAAA;AAAA,QAAA;AAAA,QAGvB,gBAAAF;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,WAAU;AAAA,YACV,MAAK;AAAA,YACL,SAASZ;AAAA,YAET,UAAA;AAAA,cAAA,gBAAAa,EAAC,SACG,UAAA,gBAAAA,EAACE,GAAA,EAAO,MAAKjB,IAAAhB,EAAa,SAAb,gBAAAgB,EAAmB,gBAAgB,EAAA,CACpD;AAAA,cACA,gBAAAc,EAAC,OAAA,EAAI,WAAU,kBACX,UAAA;AAAA,gBAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,wBACX,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mCACV,WAAAG,IAAAlC,EAAa,SAAb,gBAAAkC,EAAmB,KAAA,CACxB,GACJ;AAAA,kCACC,OAAA,EACI,WAAAlC,KAAA,gBAAAA,EAAc,cAAa,WACtB,8BACA,qBAAA,CACV;AAAA,cAAA,EAAA,CACJ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ,GACJ;AAAA,MAEJ,OAAO,gBAAA+B,EAACI,GAAA,EAAW,OAAOnC,EAAa,OAAO;AAAA,MAC9C,WAAW;AAAA,IAAA;AAAA,EACf;AAGJ,EAAAoC,EAAU,MAAM;AACZ,UAAMC,IAAmB,YAAY;AACjC,MAAA5B,EAA0B,EAAI;AAE9B,YAAM6B,IAASnC,EAAmB;AAAA,QAC9B,CAACoC,MAASA,EAAK,OAAOvC,EAAa;AAAA,MAAA;AAGvC,UAAIsC;AACA,QAAA1B,EAAgB0B,EAAO,YAAY;AAAA,WAChC;AACH,cAAME,IAAO,MAAMC,EAA4C;AAAA,UAC3D,IAAIzC,EAAa;AAAA,QAAA,CACpB;AACD,QAAAY,EAAgB4B,EAAK,YAAY,GACjCpC,EAAuBoC,CAAI;AAAA,MAAA;AAG/B,MAAA/B,EAA0B,EAAK,GAC/BM,EAAA;AAAA,IAAe;AAGnB,IAAIf,EAAa,OACbY,EAAgB,CAAA,CAAE,GAClByB,EAAA;AAAA,EACJ,GAED,CAACrC,EAAa,IAAIW,CAAY,CAAC;AAElC,QAAM+B,IAAcC,EAAQ,MACjBhC,EAAa,IAAI,CAAC4B,OACrBA,EAAK,YAAYX,EACZ,KAAKW,EAAK,SAAmB,EAC7B,OAAA,GACDA,EAAK,gBACLA,EAAK,aAAa,KAEfA,EACV,GACF,CAAC5B,CAAY,CAAC;AAEjB,SACI,gBAAAoB;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAWa;AAAA,QACP;AAAA,QACA,CAAC5C,EAAa,MAAM;AAAA,MAAA;AAAA,MAGvB,YAAa,KACV,gBAAA+B;AAAA,QAACc;AAAA,QAAA;AAAA,UACG,WAAU;AAAA,UACV,WAAU;AAAA,UACT,GAAGhB;AAAA,UAEJ,UAAA,gBAAAE;AAAA,YAACe;AAAA,YAAA;AAAA,cACG,KAAKhD;AAAA,cACL,aAAA4C;AAAA,cACA,aAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,kBAAiB;AAAA,cACjB,aAAY;AAAA,cACZ,eAAepB;AAAA,YAAA;AAAA,UAAA;AAAA,QACnB;AAAA,MAAA,IAGJ,gBAAAQ,EAAC,OAAA,EAAI,WAAU,8HACX,UAAA;AAAA,QAAA,gBAAAC,EAACgB,GAAA,EAAmB,QAAQ,KAAK,OAAO,KAAK;AAAA,QAC7C,gBAAAjB,EAAC,OAAA,EAAI,WAAU,qBACX,UAAA;AAAA,UAAA,gBAAAC,EAAC,QAAG,UAAA,kBAAA,CAAe;AAAA,UACnB,gBAAAA,EAAC,KAAA,EAAE,WAAU,kBAAiB,UAAA,yCAAA,CAE9B;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,EAAA,CACJ;AAAA,IAAA;AAAA,EAAA;AAIhB;"}
|
|
1
|
+
{"version":3,"file":"ChatBody.js","sources":["../../../../../../../lib/@ecme/views/concepts/chat/Chat/components/ChatBody.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useMemo } from 'react'\nimport Avatar from '@/components/ui/Avatar'\nimport Card from '@/components/ui/Card'\nimport ChatBox from '@/components/view/ChatBox'\nimport ChatAction from './ChatAction'\nimport StartConverstation from '@/assets/svg/StartConverstation'\nimport { useChatStore } from '../store/chatStore'\nimport { apiGetConversation } from '@/services/ChatService'\nimport classNames from '@/utils/classNames'\nimport useResponsive from '@/utils/hooks/useResponsive'\nimport dayjs from 'dayjs'\nimport uniqueId from 'lodash/uniqueId'\nimport { TbChevronLeft } from 'react-icons/tb'\nimport type { GetConversationResponse, Message, ChatType } from '../types'\nimport type { ScrollBarRef } from '@/components/ui/ScrollBar'\n\nconst getFileType = (file: File) => {\n console.log('file.type', file.type)\n switch (file.type) {\n case 'image/jpg':\n case 'image/jpeg':\n case 'image/png':\n case 'image/webp':\n return 'image'\n case 'video/mp4':\n case 'video/avi':\n return 'video'\n case 'audio/mp3':\n case 'audio/wav':\n return 'audio'\n default:\n return 'misc'\n }\n}\n\nconst ChatBody = () => {\n const scrollRef = useRef<ScrollBarRef>(null)\n const selectedChat = useChatStore((state) => state.selectedChat)\n const conversationRecord = useChatStore((state) => state.conversationRecord)\n const pushConversationRecord = useChatStore(\n (state) => state.pushConversationRecord,\n )\n const setSelectedChat = useChatStore((state) => state.setSelectedChat)\n const pushConversationMessage = useChatStore(\n (state) => state.pushConversationMessage,\n )\n const setContactInfoDrawer = useChatStore(\n (state) => state.setContactInfoDrawer,\n )\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, setIsFetchingConversation] = useState(false)\n const [conversation, setConversation] = useState<Message[]>([])\n\n const { smaller } = useResponsive()\n\n const scrollToBottom = () => {\n if (scrollRef.current?.getScrollElement) {\n const scrollElement = scrollRef.current.getScrollElement()\n if (scrollElement) {\n scrollElement.scrollTop = scrollElement.scrollHeight\n }\n }\n }\n\n const handleProfileClick = () => {\n setContactInfoDrawer({\n userId: selectedChat.user?.id as string,\n chatId: selectedChat.id as string,\n chatType: selectedChat.chatType as ChatType,\n open: true,\n })\n }\n\n const handlePushMessage = (message: Message) => {\n pushConversationMessage(selectedChat.id as string, message)\n setConversation((prevConversation) => {\n prevConversation.push(message)\n return structuredClone(prevConversation)\n })\n }\n\n const handleInputChange = async ({\n value,\n attachments,\n }: {\n value: string\n attachments?: File[]\n }) => {\n const newMessage: Message = {\n id: uniqueId('chat-conversation-'),\n sender: {\n id: '1',\n name: 'Angelina Gotelli',\n avatarImageUrl: '/img/avatars/thumb-1.jpg',\n },\n content: value,\n attachments: attachments?.map((attachment) => {\n return {\n type: getFileType(attachment),\n source: attachment,\n mediaUrl: URL.createObjectURL(attachment),\n }\n }),\n timestamp: dayjs().toDate(),\n type: 'regular',\n isMyMessage: true,\n }\n handlePushMessage(newMessage)\n }\n\n const cardHeaderProps = {\n header: {\n content: (\n <div className=\"flex items-center gap-2\">\n {smaller.md && (\n <button\n className=\"text-xl hover:text-primary\"\n onClick={() => setSelectedChat({})}\n >\n <TbChevronLeft />\n </button>\n )}\n <button\n className=\"flex items-center gap-2\"\n role=\"button\"\n onClick={handleProfileClick}\n >\n <div>\n <Avatar src={selectedChat.user?.avatarImageUrl} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex justify-between\">\n <div className=\"font-bold heading-text truncate\">\n {selectedChat.user?.name}\n </div>\n </div>\n <div>\n {selectedChat?.chatType === 'groups'\n ? 'click here for group info'\n : 'last seen recently'}\n </div>\n </div>\n </button>\n </div>\n ),\n extra: <ChatAction muted={selectedChat.muted} />,\n className: 'bg-gray-100 dark:bg-gray-600 h-[100px]',\n },\n }\n\n useEffect(() => {\n const fetchConvesation = async () => {\n setIsFetchingConversation(true)\n\n const record = conversationRecord.find(\n (item) => item.id === selectedChat.id,\n )\n\n if (record) {\n setConversation(record.conversation)\n } else {\n const resp = await apiGetConversation<GetConversationResponse>({\n id: selectedChat.id as string,\n })\n setConversation(resp.conversation)\n pushConversationRecord(resp)\n }\n\n setIsFetchingConversation(false)\n scrollToBottom()\n }\n\n if (selectedChat.id) {\n setConversation([])\n fetchConvesation()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedChat.id, conversation])\n\n const messageList = useMemo(() => {\n return conversation.map((item) => {\n item.timestamp = dayjs\n .unix(item.timestamp as number)\n .toDate() as Date\n if (item.isMyMessage) {\n item.showAvatar = false\n }\n return item\n })\n }, [conversation])\n\n return (\n <div\n className={classNames(\n 'w-full md:block',\n !selectedChat.id && 'hidden',\n )}\n >\n {selectedChat.id ? (\n <Card\n className=\"flex-1 h-full max-h-full dark:border-gray-700\"\n bodyClass=\"h-[calc(100%-100px)] relative\"\n {...cardHeaderProps}\n >\n <ChatBox\n ref={scrollRef}\n messageList={messageList}\n placeholder=\"Enter a prompt here\"\n showAvatar={true}\n avatarGap={true}\n messageListClass=\"h-[calc(100%-100px)]\"\n bubbleClass=\"max-w-[300px]\"\n onInputChange={handleInputChange}\n />\n </Card>\n ) : (\n <div className=\"flex-1 h-full max-h-full flex flex-col items-center justify-center rounded-2xl border border-gray-200 dark:border-gray-800\">\n <StartConverstation height={250} width={250} />\n <div className=\"mt-10 text-center\">\n <h3>Start Chatting!</h3>\n <p className=\"mt-2 text-base\">\n Pick a Conversation or Begin a New One\n </p>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default ChatBody\n"],"names":["getFileType","file","ChatBody","scrollRef","useRef","selectedChat","useChatStore","state","conversationRecord","pushConversationRecord","setSelectedChat","pushConversationMessage","setContactInfoDrawer","_","setIsFetchingConversation","useState","conversation","setConversation","smaller","useResponsive","scrollToBottom","_a","scrollElement","handleProfileClick","handlePushMessage","message","prevConversation","handleInputChange","value","attachments","newMessage","uniqueId","attachment","dayjs","cardHeaderProps","jsxs","jsx","TbChevronLeft","Avatar","_b","ChatAction","useEffect","fetchConvesation","record","item","resp","apiGetConversation","messageList","useMemo","classNames","Card","ChatBox","StartConverstation"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatList.js","sources":["../../../../../../../lib/@ecme/views/concepts/chat/Chat/components/ChatList.tsx"],"sourcesContent":["import { useRef, useState, useEffect } from 'react'\nimport Avatar from '@/components/ui/Avatar'\nimport Badge from '@/components/ui/Badge'\nimport ScrollBar from '@/components/ui/ScrollBar'\nimport ChatSegment from './ChatSegment'\nimport NewChat from './NewChat'\nimport { useChatStore } from '../store/chatStore'\nimport useChat from '../hooks/useChat'\nimport classNames from '@/utils/classNames'\nimport useDebounce from '@/utils/hooks/useDebounce'\nimport { TbVolumeOff, TbSearch, TbX } from 'react-icons/tb'\nimport dayjs from 'dayjs'\nimport type { ChatType } from '../types'\nimport type { ChangeEvent } from 'react'\n\nconst ChatList = () => {\n const chats = useChatStore((state) => state.chats)\n const chatsFetched = useChatStore((state) => state.chatsFetched)\n const selectedChat = useChatStore((state) => state.selectedChat)\n const setSelectedChat = useChatStore((state) => state.setSelectedChat)\n const setMobileSidebar = useChatStore((state) => state.setMobileSidebar)\n const selectedChatType = useChatStore((state) => state.selectedChatType)\n const setSelectedChatType = useChatStore(\n (state) => state.setSelectedChatType,\n )\n const setChatRead = useChatStore((state) => state.setChatRead)\n\n const inputRef = useRef<HTMLInputElement>(null)\n\n const [showSearchBar, setShowSearchBar] = useState(false)\n const [queryText, setQueryText] = useState('')\n\n const { fetchChats } = useChat()\n\n useEffect(() => {\n if (!chatsFetched) {\n fetchChats()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(() => {\n if (showSearchBar) {\n inputRef.current?.focus()\n } else {\n inputRef.current?.blur()\n }\n }, [showSearchBar])\n\n const handleChatClick = ({\n id,\n user,\n muted,\n chatType,\n unread,\n }: {\n id: string\n user: { id: string; avatarImageUrl: string; name: string }\n muted: boolean\n chatType: ChatType\n unread: number\n }) => {\n if (unread > 0) {\n setChatRead(id)\n }\n\n setSelectedChat({\n id,\n user,\n muted,\n chatType,\n })\n setMobileSidebar(false)\n }\n\n function handleDebounceFn(e: ChangeEvent<HTMLInputElement>) {\n if (e.target.value.length > 0) {\n setSelectedChatType('')\n }\n\n if (e.target.value.length === 0) {\n setSelectedChatType('personal')\n }\n\n setQueryText(e.target.value)\n }\n\n const debounceFn = useDebounce(handleDebounceFn, 500)\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n debounceFn(e)\n }\n\n const handleSearchToggleClick = () => {\n setShowSearchBar(!showSearchBar)\n }\n\n return (\n <div className=\"flex flex-col justify-between h-full\">\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between mb-4\">\n {showSearchBar ? (\n <input\n ref={inputRef}\n className=\"flex-1 h-full placeholder:text-gray-400 placeholder:text-base placeholder:font-normal bg-transparent focus:outline-none heading-text font-bold\"\n placeholder=\"Search chat\"\n onChange={handleInputChange}\n />\n ) : (\n <h4>Chat</h4>\n )}\n <button\n className=\"close-button text-lg\"\n type=\"button\"\n onClick={handleSearchToggleClick}\n >\n {showSearchBar ? <TbX /> : <TbSearch />}\n </button>\n </div>\n <ChatSegment />\n </div>\n <ScrollBar className=\"h-[calc(100%-150px)] overflow-y-auto\">\n <div className=\"flex flex-col gap-2 h-full\">\n {chats\n .filter((item) => {\n if (queryText) {\n return item.name\n .toLowerCase()\n .includes(queryText)\n }\n\n return selectedChatType === item.chatType\n })\n .map((item) => (\n <div\n key={item.id}\n className={classNames(\n 'py-3 px-2 flex items-center gap-2 justify-between rounded-xl hover:bg-gray-100 dark:hover:bg-gray-700 relative cursor-pointer select-none',\n selectedChat.id === item.id &&\n 'bg-gray-100 dark:bg-gray-700',\n )}\n role=\"button\"\n onClick={() =>\n handleChatClick({\n id: item.id,\n user: {\n id: item.userId || item.groupId,\n avatarImageUrl: item.avatar,\n name: item.name,\n },\n muted: item.muted,\n chatType: item.chatType,\n unread: item.unread,\n })\n }\n >\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <div>\n <Avatar src={item.avatar} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex justify-between\">\n <div className=\"font-bold heading-text truncate flex gap-2 items-center\">\n <span>{item.name}</span>\n {item.muted && (\n <TbVolumeOff className=\"opacity-60\" />\n )}\n </div>\n </div>\n <div className=\"truncate\">\n {item.lastConversation}\n </div>\n </div>\n </div>\n <div className=\"flex gap-1 items-center\">\n <small className=\"font-semibold\">\n {dayjs\n .unix(item.time)\n .format('hh:mm A')}\n </small>\n {item.unread > 0 && (\n <Badge className=\"bg-primary\" />\n )}\n </div>\n </div>\n ))}\n </div>\n </ScrollBar>\n <NewChat />\n </div>\n )\n}\n\nexport default ChatList\n"],"names":["ChatList","chats","useChatStore","state","chatsFetched","selectedChat","setSelectedChat","setMobileSidebar","selectedChatType","setSelectedChatType","setChatRead","inputRef","useRef","showSearchBar","setShowSearchBar","useState","queryText","setQueryText","fetchChats","useChat","useEffect","_a","_b","handleChatClick","id","user","muted","chatType","unread","handleDebounceFn","debounceFn","useDebounce","jsxs","jsx","TbX","TbSearch","ChatSegment","ScrollBar","item","classNames","Avatar","TbVolumeOff","dayjs","Badge","NewChat"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChatList.js","sources":["../../../../../../../lib/@ecme/views/concepts/chat/Chat/components/ChatList.tsx"],"sourcesContent":["import { useRef, useState, useEffect } from 'react'\nimport Avatar from '@/components/ui/Avatar'\nimport Badge from '@/components/ui/Badge'\nimport ScrollBar from '@/components/ui/ScrollBar'\nimport ChatSegment from './ChatSegment'\nimport NewChat from './NewChat'\nimport { useChatStore } from '../store/chatStore'\nimport useChat from '../hooks/useChat'\nimport classNames from '@/utils/classNames'\nimport useDebounce from '@/utils/hooks/useDebounce'\nimport { TbVolumeOff, TbSearch, TbX } from 'react-icons/tb'\nimport dayjs from 'dayjs'\nimport type { ChatType } from '../types'\nimport type { ChangeEvent } from 'react'\n\nconst ChatList = () => {\n const chats = useChatStore((state) => state.chats)\n const chatsFetched = useChatStore((state) => state.chatsFetched)\n const selectedChat = useChatStore((state) => state.selectedChat)\n const setSelectedChat = useChatStore((state) => state.setSelectedChat)\n const setMobileSidebar = useChatStore((state) => state.setMobileSidebar)\n const selectedChatType = useChatStore((state) => state.selectedChatType)\n const setSelectedChatType = useChatStore(\n (state) => state.setSelectedChatType,\n )\n const setChatRead = useChatStore((state) => state.setChatRead)\n\n const inputRef = useRef<HTMLInputElement>(null)\n\n const [showSearchBar, setShowSearchBar] = useState(false)\n const [queryText, setQueryText] = useState('')\n\n const { fetchChats } = useChat()\n\n useEffect(() => {\n if (!chatsFetched) {\n fetchChats()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(() => {\n if (showSearchBar) {\n inputRef.current?.focus()\n } else {\n inputRef.current?.blur()\n }\n }, [showSearchBar])\n\n const handleChatClick = ({\n id,\n user,\n muted,\n chatType,\n unread,\n }: {\n id: string\n user: { id: string; avatarImageUrl: string; name: string }\n muted: boolean\n chatType: ChatType\n unread: number\n }) => {\n if (unread > 0) {\n setChatRead(id)\n }\n\n setSelectedChat({\n id,\n user,\n muted,\n chatType,\n })\n setMobileSidebar(false)\n }\n\n function handleDebounceFn(e: ChangeEvent<HTMLInputElement>) {\n if (e.target.value.length > 0) {\n setSelectedChatType('')\n }\n\n if (e.target.value.length === 0) {\n setSelectedChatType('personal')\n }\n\n setQueryText(e.target.value)\n }\n\n const debounceFn = useDebounce(handleDebounceFn, 500)\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n debounceFn(e)\n }\n\n const handleSearchToggleClick = () => {\n setShowSearchBar(!showSearchBar)\n }\n\n return (\n <div className=\"flex flex-col justify-between h-full\">\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between mb-4\">\n {showSearchBar ? (\n <input\n ref={inputRef}\n className=\"flex-1 h-full placeholder:text-gray-400 placeholder:text-base placeholder:font-normal bg-transparent focus:outline-none heading-text font-bold\"\n placeholder=\"Search chat\"\n onChange={handleInputChange}\n />\n ) : (\n <h4>Chat</h4>\n )}\n <button\n className=\"close-button text-lg\"\n type=\"button\"\n onClick={handleSearchToggleClick}\n >\n {showSearchBar ? <TbX /> : <TbSearch />}\n </button>\n </div>\n <ChatSegment />\n </div>\n <ScrollBar className=\"h-[calc(100%-150px)] overflow-y-auto\">\n <div className=\"flex flex-col gap-2 h-full\">\n {chats\n .filter((item) => {\n if (queryText) {\n return item.name\n .toLowerCase()\n .includes(queryText)\n }\n\n return selectedChatType === item.chatType\n })\n .map((item) => (\n <div\n key={item.id}\n className={classNames(\n 'py-3 px-2 flex items-center gap-2 justify-between rounded-xl hover:bg-gray-100 dark:hover:bg-gray-700 relative cursor-pointer select-none',\n selectedChat.id === item.id &&\n 'bg-gray-100 dark:bg-gray-700',\n )}\n role=\"button\"\n onClick={() =>\n handleChatClick({\n id: item.id,\n user: {\n id: item.userId || item.groupId,\n avatarImageUrl: item.avatar,\n name: item.name,\n },\n muted: item.muted,\n chatType: item.chatType,\n unread: item.unread,\n })\n }\n >\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <div>\n <Avatar src={item.avatar} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex justify-between\">\n <div className=\"font-bold heading-text truncate flex gap-2 items-center\">\n <span>{item.name}</span>\n {item.muted && (\n <TbVolumeOff className=\"opacity-60\" />\n )}\n </div>\n </div>\n <div className=\"truncate\">\n {item.lastConversation}\n </div>\n </div>\n </div>\n <div className=\"flex gap-1 items-center\">\n <small className=\"font-semibold\">\n {dayjs\n .unix(item.time)\n .format('hh:mm A')}\n </small>\n {item.unread > 0 && (\n <Badge className=\"bg-primary\" />\n )}\n </div>\n </div>\n ))}\n </div>\n </ScrollBar>\n <NewChat />\n </div>\n )\n}\n\nexport default ChatList\n"],"names":["ChatList","chats","useChatStore","state","chatsFetched","selectedChat","setSelectedChat","setMobileSidebar","selectedChatType","setSelectedChatType","setChatRead","inputRef","useRef","showSearchBar","setShowSearchBar","useState","queryText","setQueryText","fetchChats","useChat","useEffect","_a","_b","handleChatClick","id","user","muted","chatType","unread","handleDebounceFn","debounceFn","useDebounce","jsxs","jsx","TbX","TbSearch","ChatSegment","ScrollBar","item","classNames","Avatar","TbVolumeOff","dayjs","Badge","NewChat"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactInfoDrawer.js","sources":["../../../../../../../lib/@ecme/views/concepts/chat/Chat/components/ContactInfoDrawer.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport Avatar from '@/components/ui/Avatar'\nimport CloseButton from '@/components/ui/CloseButton'\nimport Drawer from '@/components/ui/Drawer'\nimport ScrollBar from '@/components/ui/ScrollBar'\nimport Tabs from '@/components/ui/Tabs'\nimport ImageGallery from '@/components/shared/ImageGallery'\nimport FileIcon from '@/components/view/FileIcon'\nimport fileSizeUnit from '@/utils/fileSizeUnit'\nimport { useChatStore } from '../store/chatStore'\nimport { apiGetContactDetails } from '@/services/ChatService'\nimport useSWRMutation from 'swr/mutation'\nimport isEmpty from 'lodash/isEmpty'\nimport dayjs from 'dayjs'\nimport {\n TbMail,\n TbPhone,\n TbClock,\n TbArrowDown,\n TbChevronRight,\n} from 'react-icons/tb'\nimport type { ReactNode } from 'react'\nimport type { GetContactDetailResponse } from '../types'\n\ntype ContactInfoFieldProps = {\n title?: string\n value?: string\n icon?: ReactNode\n}\n\nconst { TabNav, TabList, TabContent } = Tabs\n\nconst ContactInfoField = ({ title, value, icon }: ContactInfoFieldProps) => {\n return (\n <div className=\"flex items-center gap-4\">\n <div className=\"text-2xl\">{icon}</div>\n <div>\n <small className=\"font-semibold\">{title}</small>\n <p className=\"heading-text font-semibold\">{value}</p>\n </div>\n </div>\n )\n}\n\nconst ContactInfoDrawer = () => {\n const contactInfoDrawer = useChatStore((state) => state.contactInfoDrawer)\n const setContactInfoDrawer = useChatStore(\n (state) => state.setContactInfoDrawer,\n )\n\n const [imageGalleryIndex, setImageGalleryIndex] = useState(-1)\n\n const { trigger, data } = useSWRMutation(\n [`/api/chats/contact/${contactInfoDrawer.userId}`, contactInfoDrawer],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ([_, params]) =>\n apiGetContactDetails<GetContactDetailResponse>({\n id: params.userId,\n }),\n )\n\n const handleDrawerClose = () => {\n setContactInfoDrawer({\n userId: '',\n chatId: '',\n chatType: '',\n open: false,\n })\n }\n\n const handleDownload = () => {\n const blob = new Blob(\n [\n 'This text file is created to demonstrate how file downloading works in our template demo.',\n ],\n { type: 'text/plain;charset=utf-8' },\n )\n\n const link = document.createElement('a')\n link.href = window.URL.createObjectURL(blob)\n link.download = 'sample-dowoad-file'\n document.body.appendChild(link)\n\n link.click()\n\n document.body.removeChild(link)\n window.URL.revokeObjectURL(link.href)\n }\n\n useEffect(() => {\n if (contactInfoDrawer.userId) {\n trigger()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [contactInfoDrawer.userId])\n\n return (\n <Drawer\n title={null}\n closable={false}\n isOpen={contactInfoDrawer.open}\n showBackdrop={false}\n width={400}\n onClose={handleDrawerClose}\n onRequestClose={handleDrawerClose}\n >\n <div className=\"flex justify-end\">\n <CloseButton onClick={handleDrawerClose} />\n </div>\n {!isEmpty(data?.userDetails) && (\n <ScrollBar className=\"h-[calc(100%-30px)]\">\n <div className=\"mt-10 flex justify-center\">\n <Avatar src={data?.userDetails.img} size={90} />\n </div>\n <div className=\"mt-4 text-center\">\n <h5 className=\"font-bold\">{data?.userDetails.name}</h5>\n <span className=\"mt-1\">\n {contactInfoDrawer.chatType === 'personal'\n ? data?.userDetails.title\n : `Groups • ${data?.userDetails?.members?.length} members`}\n </span>\n </div>\n <div className=\"flex flex-col gap-y-7 mt-8\">\n {contactInfoDrawer.chatType === 'personal' ? (\n <>\n <ContactInfoField\n title=\"Email\"\n value={data.userDetails.email}\n icon={<TbMail />}\n />\n <ContactInfoField\n title=\"Phone\"\n value={\n data.userDetails?.personalInfo\n .phoneNumber\n }\n icon={<TbPhone />}\n />\n <ContactInfoField\n title=\"Last Online\"\n value={dayjs\n .unix(\n data.userDetails\n .lastOnline as number,\n )\n .format('DD MMM YYYY hh:mm A')}\n icon={<TbClock />}\n />\n </>\n ) : (\n <>\n <div>\n <div className=\"heading-text font-semibold\">\n Members\n </div>\n {data?.userDetails?.members?.map(\n (member) => (\n <div\n key={member.id}\n className=\"rounded-xl py-4 flex items-center justify-between gap-2 group\"\n >\n <div className=\"flex items-center gap-2\">\n <Avatar src={member.img} />\n <div>\n <div className=\"font-bold heading-text\">\n {member.name}\n </div>\n <span>\n {member.email}\n </span>\n </div>\n </div>\n {member.id !== '1' && (\n <button\n type=\"button\"\n className=\"close-button button-press-feedback opacity-0 group-hover:opacity-100\"\n >\n <TbChevronRight className=\"text-xl\" />\n </button>\n )}\n </div>\n ),\n )}\n </div>\n </>\n )}\n </div>\n <div className=\"mt-8\">\n <Tabs defaultValue=\"media\">\n <TabList>\n <TabNav value=\"media\" className=\"flex-1\">\n Media\n </TabNav>\n <TabNav value=\"files\" className=\"flex-1\">\n Files\n </TabNav>\n <TabNav value=\"tab3\" className=\"flex-1\">\n Links\n </TabNav>\n </TabList>\n <div className=\"py-4\">\n <TabContent value=\"media\">\n <ImageGallery\n index={imageGalleryIndex}\n slides={\n data.media.images?.map((img) => {\n return {\n src: img.url,\n }\n }) || []\n }\n onClose={() => setImageGalleryIndex(-1)}\n >\n <div className=\"grid grid-cols-3 gap-2\">\n {data.media.images?.map(\n (img, index) => (\n <div\n key={img.id}\n data-src={img.url}\n className=\"cursor-pointer\"\n role=\"button\"\n onClick={() =>\n setImageGalleryIndex(\n index,\n )\n }\n >\n <img\n className=\"rounded-xl\"\n src={img.url}\n />\n </div>\n ),\n )}\n </div>\n </ImageGallery>\n </TabContent>\n <TabContent value=\"files\">\n {data.media.files.map((file) => (\n <div\n key={file.id}\n className=\"rounded-xl py-4 flex items-center justify-between gap-2 group\"\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"text-3xl\">\n <FileIcon\n type={file.fileType}\n />\n </div>\n <div>\n <div className=\"font-bold heading-text\">\n {file.name}\n </div>\n <span className=\"text-xs\">\n {fileSizeUnit(\n file.size || 0,\n )}\n </span>\n </div>\n </div>\n <button\n type=\"button\"\n className=\"close-button button-press-feedback opacity-0 group-hover:opacity-100\"\n onClick={handleDownload}\n >\n <TbArrowDown className=\"text-xl\" />\n </button>\n </div>\n ))}\n </TabContent>\n <TabContent value=\"tab3\">\n {data.media.links.map((link) => (\n <a\n key={link.id}\n href={link.url}\n className=\"rounded-xl py-4 px-2 flex items-center justify-between gap-2 hover:bg-gray-100 dark:hover:bg-gray-700\"\n target='\"_blank'\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <div className=\"flex items-center\">\n <Avatar\n src={link.favicon}\n className=\"bg-transparent\"\n />\n </div>\n <div className=\"min-w-0\">\n <div className=\"font-bold heading-text truncate\">\n {link.title}\n </div>\n <div className=\"text-xs truncate\">\n {link.description}\n </div>\n </div>\n </div>\n </a>\n ))}\n </TabContent>\n </div>\n </Tabs>\n </div>\n </ScrollBar>\n )}\n </Drawer>\n )\n}\n\nexport default ContactInfoDrawer\n"],"names":["TabNav","TabList","TabContent","Tabs","ContactInfoField","title","value","icon","jsxs","jsx","ContactInfoDrawer","contactInfoDrawer","useChatStore","state","setContactInfoDrawer","imageGalleryIndex","setImageGalleryIndex","useState","trigger","data","useSWRMutation","_","params","apiGetContactDetails","handleDrawerClose","handleDownload","blob","link","useEffect","Drawer","CloseButton","isEmpty","ScrollBar","Avatar","_b","_a","Fragment","TbMail","_c","TbPhone","dayjs","TbClock","_e","_d","member","TbChevronRight","ImageGallery","_f","img","_g","index","file","FileIcon","fileSizeUnit","TbArrowDown"],"mappings":";;;;;;;;;;;;;;;;;;;;AA8BA,MAAM,EAAE,QAAAA,GAAQ,SAAAC,GAAS,YAAAC,EAAA,IAAeC,GAElCC,IAAmB,CAAC,EAAE,OAAAC,GAAO,OAAAC,GAAO,MAAAC,QAElC,gBAAAC,EAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,YAAY,UAAAF,GAAK;AAAA,oBAC/B,OAAA,EACG,UAAA;AAAA,IAAA,gBAAAE,EAAC,SAAA,EAAM,WAAU,iBAAiB,UAAAJ,GAAM;AAAA,IACxC,gBAAAI,EAAC,KAAA,EAAE,WAAU,8BAA8B,UAAAH,EAAA,CAAM;AAAA,EAAA,EAAA,CACrD;AAAA,GACJ,GAIFI,KAAoB,MAAM;;AAC5B,QAAMC,IAAoBC,EAAa,CAACC,MAAUA,EAAM,iBAAiB,GACnEC,IAAuBF;AAAA,IACzB,CAACC,MAAUA,EAAM;AAAA,EAAA,GAGf,CAACE,GAAmBC,CAAoB,IAAIC,EAAS,EAAE,GAEvD,EAAE,SAAAC,GAAS,MAAAC,EAAA,IAASC;AAAA,IACtB,CAAC,sBAAsBT,EAAkB,MAAM,IAAIA,CAAiB;AAAA;AAAA,IAEpE,CAAC,CAACU,GAAGC,CAAM,MACPC,EAA+C;AAAA,MAC3C,IAAID,EAAO;AAAA,IAAA,CACd;AAAA,EAAA,GAGHE,IAAoB,MAAM;AAC5B,IAAAV,EAAqB;AAAA,MACjB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IAAA,CACT;AAAA,EAAA,GAGCW,IAAiB,MAAM;AACzB,UAAMC,IAAO,IAAI;AAAA,MACb;AAAA,QACI;AAAA,MAAA;AAAA,MAEJ,EAAE,MAAM,2BAAA;AAAA,IAA2B,GAGjCC,IAAO,SAAS,cAAc,GAAG;AACvC,IAAAA,EAAK,OAAO,OAAO,IAAI,gBAAgBD,CAAI,GAC3CC,EAAK,WAAW,sBAChB,SAAS,KAAK,YAAYA,CAAI,GAE9BA,EAAK,MAAA,GAEL,SAAS,KAAK,YAAYA,CAAI,GAC9B,OAAO,IAAI,gBAAgBA,EAAK,IAAI;AAAA,EAAA;AAGxC,SAAAC,EAAU,MAAM;AACZ,IAAIjB,EAAkB,UAClBO,EAAA;AAAA,EACJ,GAED,CAACP,EAAkB,MAAM,CAAC,GAGzB,gBAAAH;AAAA,IAACqB;AAAA,IAAA;AAAA,MACG,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQlB,EAAkB;AAAA,MAC1B,cAAc;AAAA,MACd,OAAO;AAAA,MACP,SAASa;AAAA,MACT,gBAAgBA;AAAA,MAEhB,UAAA;AAAA,QAAA,gBAAAf,EAAC,SAAI,WAAU,oBACX,4BAACqB,GAAA,EAAY,SAASN,GAAmB,EAAA,CAC7C;AAAA,QACC,CAACO,EAAQZ,KAAA,gBAAAA,EAAM,WAAW,KACvB,gBAAAX,EAACwB,GAAA,EAAU,WAAU,uBACjB,UAAA;AAAA,UAAA,gBAAAvB,EAAC,OAAA,EAAI,WAAU,6BACX,UAAA,gBAAAA,EAACwB,GAAA,EAAO,KAAKd,KAAA,gBAAAA,EAAM,YAAY,KAAK,MAAM,GAAA,CAAI,GAClD;AAAA,UACA,gBAAAX,EAAC,OAAA,EAAI,WAAU,oBACX,UAAA;AAAA,YAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,aAAa,UAAAU,KAAA,gBAAAA,EAAM,YAAY,MAAK;AAAA,YAClD,gBAAAV,EAAC,QAAA,EAAK,WAAU,QACX,YAAkB,aAAa,aAC1BU,KAAA,gBAAAA,EAAM,YAAY,QAClB,aAAYe,KAAAC,IAAAhB,KAAA,gBAAAA,EAAM,gBAAN,gBAAAgB,EAAmB,YAAnB,gBAAAD,EAA4B,MAAM,WAAA,CACxD;AAAA,UAAA,GACJ;AAAA,4BACC,OAAA,EAAI,WAAU,8BACV,UAAAvB,EAAkB,aAAa,aAC5B,gBAAAH,EAAA4B,GAAA,EACI,UAAA;AAAA,YAAA,gBAAA3B;AAAA,cAACL;AAAA,cAAA;AAAA,gBACG,OAAM;AAAA,gBACN,OAAOe,EAAK,YAAY;AAAA,gBACxB,wBAAOkB,GAAA,CAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAElB,gBAAA5B;AAAA,cAACL;AAAA,cAAA;AAAA,gBACG,OAAM;AAAA,gBACN,QACIkC,IAAAnB,EAAK,gBAAL,gBAAAmB,EAAkB,aACb;AAAA,gBAET,wBAAOC,GAAA,CAAA,CAAQ;AAAA,cAAA;AAAA,YAAA;AAAA,YAEnB,gBAAA9B;AAAA,cAACL;AAAA,cAAA;AAAA,gBACG,OAAM;AAAA,gBACN,OAAOoC,EACF;AAAA,kBACGrB,EAAK,YACA;AAAA,gBAAA,EAER,OAAO,qBAAqB;AAAA,gBACjC,wBAAOsB,GAAA,CAAA,CAAQ;AAAA,cAAA;AAAA,YAAA;AAAA,UACnB,GACJ,IAEA,gBAAAhC,EAAA2B,GAAA,EACI,UAAA,gBAAA5B,EAAC,OAAA,EACG,UAAA;AAAA,YAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA,WAE5C;AAAA,aACCiC,KAAAC,IAAAxB,KAAA,gBAAAA,EAAM,gBAAN,gBAAAwB,EAAmB,YAAnB,gBAAAD,EAA4B;AAAA,cACzB,CAACE,MACG,gBAAApC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,WAAU;AAAA,kBAEV,UAAA;AAAA,oBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,sBAAA,gBAAAC,EAACwB,GAAA,EAAO,KAAKW,EAAO,IAAA,CAAK;AAAA,wCACxB,OAAA,EACG,UAAA;AAAA,wBAAA,gBAAAnC,EAAC,OAAA,EAAI,WAAU,0BACV,UAAAmC,EAAO,MACZ;AAAA,wBACA,gBAAAnC,EAAC,QAAA,EACI,UAAAmC,EAAO,MAAA,CACZ;AAAA,sBAAA,EAAA,CACJ;AAAA,oBAAA,GACJ;AAAA,oBACCA,EAAO,OAAO,OACX,gBAAAnC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACG,MAAK;AAAA,wBACL,WAAU;AAAA,wBAEV,UAAA,gBAAAA,EAACoC,GAAA,EAAe,WAAU,UAAA,CAAU;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACxC;AAAA,gBAAA;AAAA,gBApBCD,EAAO;AAAA,cAAA;AAAA;AAAA,UAwBxB,EAAA,CACJ,GACJ,GAER;AAAA,4BACC,OAAA,EAAI,WAAU,QACX,UAAA,gBAAApC,EAACL,GAAA,EAAK,cAAa,SACf,UAAA;AAAA,YAAA,gBAAAK,EAACP,GAAA,EACG,UAAA;AAAA,cAAA,gBAAAQ,EAACT,GAAA,EAAO,OAAM,SAAQ,WAAU,UAAS,UAAA,SAEzC;AAAA,gCACCA,GAAA,EAAO,OAAM,SAAQ,WAAU,UAAS,UAAA,SAEzC;AAAA,gCACCA,GAAA,EAAO,OAAM,QAAO,WAAU,UAAS,UAAA,QAAA,CAExC;AAAA,YAAA,GACJ;AAAA,YACA,gBAAAQ,EAAC,OAAA,EAAI,WAAU,QACX,UAAA;AAAA,cAAA,gBAAAC,EAACP,GAAA,EAAW,OAAM,SACd,UAAA,gBAAAO;AAAA,gBAACqC;AAAA,gBAAA;AAAA,kBACG,OAAO/B;AAAA,kBACP,UACIgC,IAAA5B,EAAK,MAAM,WAAX,gBAAA4B,EAAmB,IAAI,CAACC,OACb;AAAA,oBACH,KAAKA,EAAI;AAAA,kBAAA,QAEX,CAAA;AAAA,kBAEV,SAAS,MAAMhC,EAAqB,EAAE;AAAA,kBAEtC,4BAAC,OAAA,EAAI,WAAU,0BACV,WAAAiC,IAAA9B,EAAK,MAAM,WAAX,gBAAA8B,EAAmB;AAAA,oBAChB,CAACD,GAAKE,MACF,gBAAAzC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEG,YAAUuC,EAAI;AAAA,wBACd,WAAU;AAAA,wBACV,MAAK;AAAA,wBACL,SAAS,MACLhC;AAAA,0BACIkC;AAAA,wBAAA;AAAA,wBAIR,UAAA,gBAAAzC;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACG,WAAU;AAAA,4BACV,KAAKuC,EAAI;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBACb;AAAA,sBAbKA,EAAI;AAAA,oBAAA;AAAA,oBAgBrB,CACJ;AAAA,gBAAA;AAAA,cAAA,GAER;AAAA,cACA,gBAAAvC,EAACP,KAAW,OAAM,SACb,YAAK,MAAM,MAAM,IAAI,CAACiD,MACnB,gBAAA3C;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,WAAU;AAAA,kBAEV,UAAA;AAAA,oBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,2BACX,UAAA;AAAA,sBAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,YACX,UAAA,gBAAAA;AAAA,wBAAC2C;AAAA,wBAAA;AAAA,0BACG,MAAMD,EAAK;AAAA,wBAAA;AAAA,sBAAA,GAEnB;AAAA,wCACC,OAAA,EACG,UAAA;AAAA,wBAAA,gBAAA1C,EAAC,OAAA,EAAI,WAAU,0BACV,UAAA0C,EAAK,MACV;AAAA,wBACA,gBAAA1C,EAAC,QAAA,EAAK,WAAU,WACX,UAAA4C;AAAA,0BACGF,EAAK,QAAQ;AAAA,wBAAA,EACjB,CACJ;AAAA,sBAAA,EAAA,CACJ;AAAA,oBAAA,GACJ;AAAA,oBACA,gBAAA1C;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACG,MAAK;AAAA,wBACL,WAAU;AAAA,wBACV,SAASgB;AAAA,wBAET,UAAA,gBAAAhB,EAAC6C,GAAA,EAAY,WAAU,UAAA,CAAU;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACrC;AAAA,gBAAA;AAAA,gBA1BKH,EAAK;AAAA,cAAA,CA4BjB,GACL;AAAA,cACA,gBAAA1C,EAACP,KAAW,OAAM,QACb,YAAK,MAAM,MAAM,IAAI,CAACyB,MACnB,gBAAAlB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEG,MAAMkB,EAAK;AAAA,kBACX,WAAU;AAAA,kBACV,QAAO;AAAA,kBAEP,UAAA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,mCACX,UAAA;AAAA,oBAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,qBACX,UAAA,gBAAAA;AAAA,sBAACwB;AAAA,sBAAA;AAAA,wBACG,KAAKN,EAAK;AAAA,wBACV,WAAU;AAAA,sBAAA;AAAA,oBAAA,GAElB;AAAA,oBACA,gBAAAnB,EAAC,OAAA,EAAI,WAAU,WACX,UAAA;AAAA,sBAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,mCACV,UAAAkB,EAAK,OACV;AAAA,sBACA,gBAAAlB,EAAC,OAAA,EAAI,WAAU,oBACV,YAAK,YAAA,CACV;AAAA,oBAAA,EAAA,CACJ;AAAA,kBAAA,EAAA,CACJ;AAAA,gBAAA;AAAA,gBApBKkB,EAAK;AAAA,cAAA,CAsBjB,EAAA,CACL;AAAA,YAAA,EAAA,CACJ;AAAA,UAAA,EAAA,CACJ,EAAA,CACJ;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIhB;"}
|
|
1
|
+
{"version":3,"file":"ContactInfoDrawer.js","sources":["../../../../../../../lib/@ecme/views/concepts/chat/Chat/components/ContactInfoDrawer.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport Avatar from '@/components/ui/Avatar'\nimport CloseButton from '@/components/ui/CloseButton'\nimport Drawer from '@/components/ui/Drawer'\nimport ScrollBar from '@/components/ui/ScrollBar'\nimport Tabs from '@/components/ui/Tabs'\nimport ImageGallery from '@/components/shared/ImageGallery'\nimport FileIcon from '@/components/view/FileIcon'\nimport fileSizeUnit from '@/utils/fileSizeUnit'\nimport { useChatStore } from '../store/chatStore'\nimport { apiGetContactDetails } from '@/services/ChatService'\nimport useSWRMutation from 'swr/mutation'\nimport isEmpty from 'lodash/isEmpty'\nimport dayjs from 'dayjs'\nimport {\n TbMail,\n TbPhone,\n TbClock,\n TbArrowDown,\n TbChevronRight,\n} from 'react-icons/tb'\nimport type { ReactNode } from 'react'\nimport type { GetContactDetailResponse } from '../types'\n\ntype ContactInfoFieldProps = {\n title?: string\n value?: string\n icon?: ReactNode\n}\n\nconst { TabNav, TabList, TabContent } = Tabs\n\nconst ContactInfoField = ({ title, value, icon }: ContactInfoFieldProps) => {\n return (\n <div className=\"flex items-center gap-4\">\n <div className=\"text-2xl\">{icon}</div>\n <div>\n <small className=\"font-semibold\">{title}</small>\n <p className=\"heading-text font-semibold\">{value}</p>\n </div>\n </div>\n )\n}\n\nconst ContactInfoDrawer = () => {\n const contactInfoDrawer = useChatStore((state) => state.contactInfoDrawer)\n const setContactInfoDrawer = useChatStore(\n (state) => state.setContactInfoDrawer,\n )\n\n const [imageGalleryIndex, setImageGalleryIndex] = useState(-1)\n\n const { trigger, data } = useSWRMutation(\n [`/api/chats/contact/${contactInfoDrawer.userId}`, contactInfoDrawer],\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ([_, params]) =>\n apiGetContactDetails<GetContactDetailResponse>({\n id: params.userId,\n }),\n )\n\n const handleDrawerClose = () => {\n setContactInfoDrawer({\n userId: '',\n chatId: '',\n chatType: '',\n open: false,\n })\n }\n\n const handleDownload = () => {\n const blob = new Blob(\n [\n 'This text file is created to demonstrate how file downloading works in our template demo.',\n ],\n { type: 'text/plain;charset=utf-8' },\n )\n\n const link = document.createElement('a')\n link.href = window.URL.createObjectURL(blob)\n link.download = 'sample-dowoad-file'\n document.body.appendChild(link)\n\n link.click()\n\n document.body.removeChild(link)\n window.URL.revokeObjectURL(link.href)\n }\n\n useEffect(() => {\n if (contactInfoDrawer.userId) {\n trigger()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [contactInfoDrawer.userId])\n\n return (\n <Drawer\n title={null}\n closable={false}\n isOpen={contactInfoDrawer.open}\n showBackdrop={false}\n width={400}\n onClose={handleDrawerClose}\n onRequestClose={handleDrawerClose}\n >\n <div className=\"flex justify-end\">\n <CloseButton onClick={handleDrawerClose} />\n </div>\n {!isEmpty(data?.userDetails) && (\n <ScrollBar className=\"h-[calc(100%-30px)]\">\n <div className=\"mt-10 flex justify-center\">\n <Avatar src={data?.userDetails.img} size={90} />\n </div>\n <div className=\"mt-4 text-center\">\n <h5 className=\"font-bold\">{data?.userDetails.name}</h5>\n <span className=\"mt-1\">\n {contactInfoDrawer.chatType === 'personal'\n ? data?.userDetails.title\n : `Groups • ${data?.userDetails?.members?.length} members`}\n </span>\n </div>\n <div className=\"flex flex-col gap-y-7 mt-8\">\n {contactInfoDrawer.chatType === 'personal' ? (\n <>\n <ContactInfoField\n title=\"Email\"\n value={data.userDetails.email}\n icon={<TbMail />}\n />\n <ContactInfoField\n title=\"Phone\"\n value={\n data.userDetails?.personalInfo\n .phoneNumber\n }\n icon={<TbPhone />}\n />\n <ContactInfoField\n title=\"Last Online\"\n value={dayjs\n .unix(\n data.userDetails\n .lastOnline as number,\n )\n .format('DD MMM YYYY hh:mm A')}\n icon={<TbClock />}\n />\n </>\n ) : (\n <>\n <div>\n <div className=\"heading-text font-semibold\">\n Members\n </div>\n {data?.userDetails?.members?.map(\n (member) => (\n <div\n key={member.id}\n className=\"rounded-xl py-4 flex items-center justify-between gap-2 group\"\n >\n <div className=\"flex items-center gap-2\">\n <Avatar src={member.img} />\n <div>\n <div className=\"font-bold heading-text\">\n {member.name}\n </div>\n <span>\n {member.email}\n </span>\n </div>\n </div>\n {member.id !== '1' && (\n <button\n type=\"button\"\n className=\"close-button button-press-feedback opacity-0 group-hover:opacity-100\"\n >\n <TbChevronRight className=\"text-xl\" />\n </button>\n )}\n </div>\n ),\n )}\n </div>\n </>\n )}\n </div>\n <div className=\"mt-8\">\n <Tabs defaultValue=\"media\">\n <TabList>\n <TabNav value=\"media\" className=\"flex-1\">\n Media\n </TabNav>\n <TabNav value=\"files\" className=\"flex-1\">\n Files\n </TabNav>\n <TabNav value=\"tab3\" className=\"flex-1\">\n Links\n </TabNav>\n </TabList>\n <div className=\"py-4\">\n <TabContent value=\"media\">\n <ImageGallery\n index={imageGalleryIndex}\n slides={\n data.media.images?.map((img) => {\n return {\n src: img.url,\n }\n }) || []\n }\n onClose={() => setImageGalleryIndex(-1)}\n >\n <div className=\"grid grid-cols-3 gap-2\">\n {data.media.images?.map(\n (img, index) => (\n <div\n key={img.id}\n data-src={img.url}\n className=\"cursor-pointer\"\n role=\"button\"\n onClick={() =>\n setImageGalleryIndex(\n index,\n )\n }\n >\n <img\n className=\"rounded-xl\"\n src={img.url}\n />\n </div>\n ),\n )}\n </div>\n </ImageGallery>\n </TabContent>\n <TabContent value=\"files\">\n {data.media.files.map((file) => (\n <div\n key={file.id}\n className=\"rounded-xl py-4 flex items-center justify-between gap-2 group\"\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"text-3xl\">\n <FileIcon\n type={file.fileType}\n />\n </div>\n <div>\n <div className=\"font-bold heading-text\">\n {file.name}\n </div>\n <span className=\"text-xs\">\n {fileSizeUnit(\n file.size || 0,\n )}\n </span>\n </div>\n </div>\n <button\n type=\"button\"\n className=\"close-button button-press-feedback opacity-0 group-hover:opacity-100\"\n onClick={handleDownload}\n >\n <TbArrowDown className=\"text-xl\" />\n </button>\n </div>\n ))}\n </TabContent>\n <TabContent value=\"tab3\">\n {data.media.links.map((link) => (\n <a\n key={link.id}\n href={link.url}\n className=\"rounded-xl py-4 px-2 flex items-center justify-between gap-2 hover:bg-gray-100 dark:hover:bg-gray-700\"\n target='\"_blank'\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <div className=\"flex items-center\">\n <Avatar\n src={link.favicon}\n className=\"bg-transparent\"\n />\n </div>\n <div className=\"min-w-0\">\n <div className=\"font-bold heading-text truncate\">\n {link.title}\n </div>\n <div className=\"text-xs truncate\">\n {link.description}\n </div>\n </div>\n </div>\n </a>\n ))}\n </TabContent>\n </div>\n </Tabs>\n </div>\n </ScrollBar>\n )}\n </Drawer>\n )\n}\n\nexport default ContactInfoDrawer\n"],"names":["TabNav","TabList","TabContent","Tabs","ContactInfoField","title","value","icon","jsxs","jsx","ContactInfoDrawer","contactInfoDrawer","useChatStore","state","setContactInfoDrawer","imageGalleryIndex","setImageGalleryIndex","useState","trigger","data","useSWRMutation","_","params","apiGetContactDetails","handleDrawerClose","handleDownload","blob","link","useEffect","Drawer","CloseButton","isEmpty","ScrollBar","Avatar","_b","_a","Fragment","TbMail","_c","TbPhone","dayjs","TbClock","_e","_d","member","TbChevronRight","ImageGallery","_f","img","_g","index","file","FileIcon","fileSizeUnit","TbArrowDown"],"mappings":"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"}
|