@myrjfa/ui 0.3.1
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/LICENSE +201 -0
- package/README.md +19 -0
- package/dist/chat/ChatMain.d.ts +12 -0
- package/dist/chat/ChatMain.d.ts.map +1 -0
- package/dist/chat/ChatMain.js +390 -0
- package/dist/chat/ChatSidebar.d.ts +15 -0
- package/dist/chat/ChatSidebar.d.ts.map +1 -0
- package/dist/chat/ChatSidebar.js +32 -0
- package/dist/chat/ConversationList.d.ts +20 -0
- package/dist/chat/ConversationList.d.ts.map +1 -0
- package/dist/chat/ConversationList.js +95 -0
- package/dist/chat/EventPanel.d.ts +11 -0
- package/dist/chat/EventPanel.d.ts.map +1 -0
- package/dist/chat/EventPanel.js +76 -0
- package/dist/chat/ExpensePanel.d.ts +14 -0
- package/dist/chat/ExpensePanel.d.ts.map +1 -0
- package/dist/chat/ExpensePanel.js +282 -0
- package/dist/chat/MessageBubble.d.ts +29 -0
- package/dist/chat/MessageBubble.d.ts.map +1 -0
- package/dist/chat/MessageBubble.js +425 -0
- package/dist/chat/MessageInput.d.ts +34 -0
- package/dist/chat/MessageInput.d.ts.map +1 -0
- package/dist/chat/MessageInput.js +330 -0
- package/dist/chat/MilestonePanel.d.ts +14 -0
- package/dist/chat/MilestonePanel.d.ts.map +1 -0
- package/dist/chat/MilestonePanel.js +209 -0
- package/dist/chat/components/ParticipantSelector.d.ts +11 -0
- package/dist/chat/components/ParticipantSelector.d.ts.map +1 -0
- package/dist/chat/components/ParticipantSelector.js +26 -0
- package/dist/chat/components/SplitInputs.d.ts +12 -0
- package/dist/chat/components/SplitInputs.d.ts.map +1 -0
- package/dist/chat/components/SplitInputs.js +84 -0
- package/dist/chat/components/SplitTypeSelector.d.ts +8 -0
- package/dist/chat/components/SplitTypeSelector.d.ts.map +1 -0
- package/dist/chat/components/SplitTypeSelector.js +13 -0
- package/dist/chat/dialogs/AddMemberDialog.d.ts +15 -0
- package/dist/chat/dialogs/AddMemberDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/AddMemberDialog.js +43 -0
- package/dist/chat/dialogs/CameraDialog.d.ts +8 -0
- package/dist/chat/dialogs/CameraDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/CameraDialog.js +81 -0
- package/dist/chat/dialogs/ChatInfoDialog.d.ts +10 -0
- package/dist/chat/dialogs/ChatInfoDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/ChatInfoDialog.js +75 -0
- package/dist/chat/dialogs/ConversationSearchDialog.d.ts +8 -0
- package/dist/chat/dialogs/ConversationSearchDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/ConversationSearchDialog.js +53 -0
- package/dist/chat/dialogs/CreateEventDialog.d.ts +22 -0
- package/dist/chat/dialogs/CreateEventDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/CreateEventDialog.js +51 -0
- package/dist/chat/dialogs/CreatePollDialog.d.ts +8 -0
- package/dist/chat/dialogs/CreatePollDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/CreatePollDialog.js +38 -0
- package/dist/chat/dialogs/EditPollDialog.d.ts +14 -0
- package/dist/chat/dialogs/EditPollDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/EditPollDialog.js +33 -0
- package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts +20 -0
- package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/ExpenseAnalyticsDialog.js +58 -0
- package/dist/chat/dialogs/GroupInfoDialog.d.ts +10 -0
- package/dist/chat/dialogs/GroupInfoDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/GroupInfoDialog.js +81 -0
- package/dist/chat/dialogs/GroupInfoViewDialog.d.ts +9 -0
- package/dist/chat/dialogs/GroupInfoViewDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/GroupInfoViewDialog.js +15 -0
- package/dist/chat/dialogs/HostWorkspaceDialog.d.ts +9 -0
- package/dist/chat/dialogs/HostWorkspaceDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/HostWorkspaceDialog.js +90 -0
- package/dist/chat/dialogs/MediaComposerDialog.d.ts +9 -0
- package/dist/chat/dialogs/MediaComposerDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/MediaComposerDialog.js +41 -0
- package/dist/chat/dialogs/NewChatDialog.d.ts +2 -0
- package/dist/chat/dialogs/NewChatDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/NewChatDialog.js +48 -0
- package/dist/chat/dialogs/NewGroupDialog.d.ts +2 -0
- package/dist/chat/dialogs/NewGroupDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/NewGroupDialog.js +44 -0
- package/dist/chat/dialogs/ParticipantsDialog.d.ts +12 -0
- package/dist/chat/dialogs/ParticipantsDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/ParticipantsDialog.js +134 -0
- package/dist/chat/dialogs/PayAndSplitDialog.d.ts +12 -0
- package/dist/chat/dialogs/PayAndSplitDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/PayAndSplitDialog.js +124 -0
- package/dist/chat/dialogs/PaymentProfileDialog.d.ts +5 -0
- package/dist/chat/dialogs/PaymentProfileDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/PaymentProfileDialog.js +45 -0
- package/dist/chat/dialogs/PollVotersDialog.d.ts +10 -0
- package/dist/chat/dialogs/PollVotersDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/PollVotersDialog.js +11 -0
- package/dist/chat/dialogs/ShareLocationDialog.d.ts +8 -0
- package/dist/chat/dialogs/ShareLocationDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/ShareLocationDialog.js +47 -0
- package/dist/chat/index.d.ts +8 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +7 -0
- package/dist/components/CityAutocomplete.d.ts +5 -0
- package/dist/components/CityAutocomplete.d.ts.map +1 -0
- package/dist/components/CityAutocomplete.js +112 -0
- package/dist/components/CreateListingDropdown.d.ts +5 -0
- package/dist/components/CreateListingDropdown.d.ts.map +1 -0
- package/dist/components/CreateListingDropdown.js +21 -0
- package/dist/components/DestinationAutocomplete.d.ts +11 -0
- package/dist/components/DestinationAutocomplete.d.ts.map +1 -0
- package/dist/components/DestinationAutocomplete.js +24 -0
- package/dist/components/StateAutocomplete.d.ts +10 -0
- package/dist/components/StateAutocomplete.d.ts.map +1 -0
- package/dist/components/StateAutocomplete.js +34 -0
- package/dist/components/admin/AdminBookingRegistrationsList.d.ts +5 -0
- package/dist/components/admin/AdminBookingRegistrationsList.d.ts.map +1 -0
- package/dist/components/admin/AdminBookingRegistrationsList.js +69 -0
- package/dist/components/admin/AdminListingActionsWrapper.d.ts +9 -0
- package/dist/components/admin/AdminListingActionsWrapper.d.ts.map +1 -0
- package/dist/components/admin/AdminListingActionsWrapper.js +200 -0
- package/dist/components/ads/ActivateAdPlacementButton.d.ts +6 -0
- package/dist/components/ads/ActivateAdPlacementButton.d.ts.map +1 -0
- package/dist/components/ads/ActivateAdPlacementButton.js +27 -0
- package/dist/components/ads/AdOfferCard.d.ts +6 -0
- package/dist/components/ads/AdOfferCard.d.ts.map +1 -0
- package/dist/components/ads/AdOfferCard.js +15 -0
- package/dist/components/adventure/AdventureAvailabilityPlanner.d.ts +17 -0
- package/dist/components/adventure/AdventureAvailabilityPlanner.d.ts.map +1 -0
- package/dist/components/adventure/AdventureAvailabilityPlanner.js +106 -0
- package/dist/components/adventure/AdventureQueryCard.d.ts +5 -0
- package/dist/components/adventure/AdventureQueryCard.d.ts.map +1 -0
- package/dist/components/adventure/AdventureQueryCard.js +65 -0
- package/dist/components/adventure/AdventureSlotBuilder.d.ts +41 -0
- package/dist/components/adventure/AdventureSlotBuilder.d.ts.map +1 -0
- package/dist/components/adventure/AdventureSlotBuilder.js +146 -0
- package/dist/components/booking/booking-form.d.ts +39 -0
- package/dist/components/booking/booking-form.d.ts.map +1 -0
- package/dist/components/booking/booking-form.js +847 -0
- package/dist/components/brand/BrandPageView.d.ts +8 -0
- package/dist/components/brand/BrandPageView.d.ts.map +1 -0
- package/dist/components/brand/BrandPageView.js +97 -0
- package/dist/components/companion/AnonymousChat.d.ts +22 -0
- package/dist/components/companion/AnonymousChat.d.ts.map +1 -0
- package/dist/components/companion/AnonymousChat.js +24 -0
- package/dist/components/companion/SwipeCard.d.ts +25 -0
- package/dist/components/companion/SwipeCard.d.ts.map +1 -0
- package/dist/components/companion/SwipeCard.js +58 -0
- package/dist/components/create-flow/ConfirmDiscardDialog.d.ts +11 -0
- package/dist/components/create-flow/ConfirmDiscardDialog.d.ts.map +1 -0
- package/dist/components/create-flow/ConfirmDiscardDialog.js +14 -0
- package/dist/components/create-flow/EntityEditLoadingState.d.ts +2 -0
- package/dist/components/create-flow/EntityEditLoadingState.d.ts.map +1 -0
- package/dist/components/create-flow/EntityEditLoadingState.js +6 -0
- package/dist/components/create-flow/EntityFormCompletionState.d.ts +12 -0
- package/dist/components/create-flow/EntityFormCompletionState.d.ts.map +1 -0
- package/dist/components/create-flow/EntityFormCompletionState.js +10 -0
- package/dist/components/create-flow/EntityFormHeader.d.ts +9 -0
- package/dist/components/create-flow/EntityFormHeader.d.ts.map +1 -0
- package/dist/components/create-flow/EntityFormHeader.js +7 -0
- package/dist/components/create-flow/EntityFormPageFrame.d.ts +10 -0
- package/dist/components/create-flow/EntityFormPageFrame.d.ts.map +1 -0
- package/dist/components/create-flow/EntityFormPageFrame.js +10 -0
- package/dist/components/create-flow/ImageUploader.d.ts +30 -0
- package/dist/components/create-flow/ImageUploader.d.ts.map +1 -0
- package/dist/components/create-flow/ImageUploader.js +193 -0
- package/dist/components/create-flow/MultiStepWizard.d.ts +25 -0
- package/dist/components/create-flow/MultiStepWizard.d.ts.map +1 -0
- package/dist/components/create-flow/MultiStepWizard.js +31 -0
- package/dist/components/create-flow/ReviewConfirmationCard.d.ts +8 -0
- package/dist/components/create-flow/ReviewConfirmationCard.d.ts.map +1 -0
- package/dist/components/create-flow/ReviewConfirmationCard.js +5 -0
- package/dist/components/create-flow/ReviewMetricGrid.d.ts +15 -0
- package/dist/components/create-flow/ReviewMetricGrid.d.ts.map +1 -0
- package/dist/components/create-flow/ReviewMetricGrid.js +8 -0
- package/dist/components/create-flow/TemplateSelectionDialog.d.ts +17 -0
- package/dist/components/create-flow/TemplateSelectionDialog.d.ts.map +1 -0
- package/dist/components/create-flow/TemplateSelectionDialog.js +7 -0
- package/dist/components/discounts/OffersAndCouponsSheet.d.ts +13 -0
- package/dist/components/discounts/OffersAndCouponsSheet.d.ts.map +1 -0
- package/dist/components/discounts/OffersAndCouponsSheet.js +81 -0
- package/dist/components/enquiry/EnquiryFormParts.d.ts +40 -0
- package/dist/components/enquiry/EnquiryFormParts.d.ts.map +1 -0
- package/dist/components/enquiry/EnquiryFormParts.js +29 -0
- package/dist/components/form-sections/FaqSection.d.ts +24 -0
- package/dist/components/form-sections/FaqSection.d.ts.map +1 -0
- package/dist/components/form-sections/FaqSection.js +17 -0
- package/dist/components/form-sections/OpportunityBasicsSection.d.ts +8 -0
- package/dist/components/form-sections/OpportunityBasicsSection.d.ts.map +1 -0
- package/dist/components/form-sections/OpportunityBasicsSection.js +26 -0
- package/dist/components/form-sections/OpportunityDetailsSection.d.ts +18 -0
- package/dist/components/form-sections/OpportunityDetailsSection.d.ts.map +1 -0
- package/dist/components/form-sections/OpportunityDetailsSection.js +10 -0
- package/dist/components/form-sections/OpportunityTypeSection.d.ts +7 -0
- package/dist/components/form-sections/OpportunityTypeSection.d.ts.map +1 -0
- package/dist/components/form-sections/OpportunityTypeSection.js +15 -0
- package/dist/components/form-sections/PackageDetailsSection.d.ts +22 -0
- package/dist/components/form-sections/PackageDetailsSection.d.ts.map +1 -0
- package/dist/components/form-sections/PackageDetailsSection.js +20 -0
- package/dist/components/form-sections/PackageItinerarySection.d.ts +21 -0
- package/dist/components/form-sections/PackageItinerarySection.d.ts.map +1 -0
- package/dist/components/form-sections/PackageItinerarySection.js +112 -0
- package/dist/components/form-sections/PackagePricingSection.d.ts +8 -0
- package/dist/components/form-sections/PackagePricingSection.d.ts.map +1 -0
- package/dist/components/form-sections/PackagePricingSection.js +11 -0
- package/dist/components/form-sections/PackageReviewSection.d.ts +12 -0
- package/dist/components/form-sections/PackageReviewSection.d.ts.map +1 -0
- package/dist/components/form-sections/PackageReviewSection.js +26 -0
- package/dist/components/form-sections/RentalBasicsSection.d.ts +12 -0
- package/dist/components/form-sections/RentalBasicsSection.d.ts.map +1 -0
- package/dist/components/form-sections/RentalBasicsSection.js +91 -0
- package/dist/components/form-sections/RentalCapacitySection.d.ts +9 -0
- package/dist/components/form-sections/RentalCapacitySection.d.ts.map +1 -0
- package/dist/components/form-sections/RentalCapacitySection.js +23 -0
- package/dist/components/form-sections/RentalLocationSection.d.ts +10 -0
- package/dist/components/form-sections/RentalLocationSection.d.ts.map +1 -0
- package/dist/components/form-sections/RentalLocationSection.js +41 -0
- package/dist/components/form-sections/RentalReviewSection.d.ts +10 -0
- package/dist/components/form-sections/RentalReviewSection.d.ts.map +1 -0
- package/dist/components/form-sections/RentalReviewSection.js +27 -0
- package/dist/components/form-sections/RentalRulesSection.d.ts +7 -0
- package/dist/components/form-sections/RentalRulesSection.d.ts.map +1 -0
- package/dist/components/form-sections/RentalRulesSection.js +10 -0
- package/dist/components/form-sections/RentalSpecsSection.d.ts +7 -0
- package/dist/components/form-sections/RentalSpecsSection.d.ts.map +1 -0
- package/dist/components/form-sections/RentalSpecsSection.js +10 -0
- package/dist/components/host-dashboard/HostCalendar.d.ts +8 -0
- package/dist/components/host-dashboard/HostCalendar.d.ts.map +1 -0
- package/dist/components/host-dashboard/HostCalendar.js +43 -0
- package/dist/components/host-dashboard/HostCalendarGrid.d.ts +34 -0
- package/dist/components/host-dashboard/HostCalendarGrid.d.ts.map +1 -0
- package/dist/components/host-dashboard/HostCalendarGrid.js +30 -0
- package/dist/components/host-dashboard/HostListingMultiSelect.d.ts +12 -0
- package/dist/components/host-dashboard/HostListingMultiSelect.d.ts.map +1 -0
- package/dist/components/host-dashboard/HostListingMultiSelect.js +24 -0
- package/dist/components/host-dashboard/HostManageCalendarShell.d.ts +17 -0
- package/dist/components/host-dashboard/HostManageCalendarShell.d.ts.map +1 -0
- package/dist/components/host-dashboard/HostManageCalendarShell.js +5 -0
- package/dist/components/host-dashboard/HostSidebarNavigation.d.ts +2 -0
- package/dist/components/host-dashboard/HostSidebarNavigation.d.ts.map +1 -0
- package/dist/components/host-dashboard/HostSidebarNavigation.js +299 -0
- package/dist/components/host-dashboard/ManageFeatureSwitcher.d.ts +15 -0
- package/dist/components/host-dashboard/ManageFeatureSwitcher.d.ts.map +1 -0
- package/dist/components/host-dashboard/ManageFeatureSwitcher.js +43 -0
- package/dist/components/host-dashboard/PageHeader.d.ts +14 -0
- package/dist/components/host-dashboard/PageHeader.d.ts.map +1 -0
- package/dist/components/host-dashboard/PageHeader.js +8 -0
- package/dist/components/host-dashboard/PlaceholderPage.d.ts +4 -0
- package/dist/components/host-dashboard/PlaceholderPage.d.ts.map +1 -0
- package/dist/components/host-dashboard/PlaceholderPage.js +9 -0
- package/dist/components/host-dashboard/StatCard.d.ts +15 -0
- package/dist/components/host-dashboard/StatCard.d.ts.map +1 -0
- package/dist/components/host-dashboard/StatCard.js +38 -0
- package/dist/components/layout/AppProviders.d.ts +5 -0
- package/dist/components/layout/AppProviders.d.ts.map +1 -0
- package/dist/components/layout/AppProviders.js +11 -0
- package/dist/components/layout/PublicRouteLayout.d.ts +5 -0
- package/dist/components/layout/PublicRouteLayout.d.ts.map +1 -0
- package/dist/components/layout/PublicRouteLayout.js +5 -0
- package/dist/components/layout/PublicShell.d.ts +5 -0
- package/dist/components/layout/PublicShell.d.ts.map +1 -0
- package/dist/components/layout/PublicShell.js +5 -0
- package/dist/components/location/LocationPicker.d.ts +27 -0
- package/dist/components/location/LocationPicker.d.ts.map +1 -0
- package/dist/components/location/LocationPicker.js +415 -0
- package/dist/components/location/LocationPreview.d.ts +11 -0
- package/dist/components/location/LocationPreview.d.ts.map +1 -0
- package/dist/components/location/LocationPreview.js +12 -0
- package/dist/components/location/MapPicker.d.ts +9 -0
- package/dist/components/location/MapPicker.d.ts.map +1 -0
- package/dist/components/location/MapPicker.js +40 -0
- package/dist/components/location/MapPreview.d.ts +8 -0
- package/dist/components/location/MapPreview.d.ts.map +1 -0
- package/dist/components/location/MapPreview.js +17 -0
- package/dist/components/location/PlaceLinkInline.d.ts +14 -0
- package/dist/components/location/PlaceLinkInline.d.ts.map +1 -0
- package/dist/components/location/PlaceLinkInline.js +30 -0
- package/dist/components/location/leafletMap.d.ts +8 -0
- package/dist/components/location/leafletMap.d.ts.map +1 -0
- package/dist/components/location/leafletMap.js +74 -0
- package/dist/components/ui/GuestOrLoginDialog.d.ts +11 -0
- package/dist/components/ui/GuestOrLoginDialog.d.ts.map +1 -0
- package/dist/components/ui/GuestOrLoginDialog.js +19 -0
- package/dist/components/ui/ImageGalleryViewer.d.ts +10 -0
- package/dist/components/ui/ImageGalleryViewer.d.ts.map +1 -0
- package/dist/components/ui/ImageGalleryViewer.js +59 -0
- package/dist/components/ui/LocationInput.d.ts +12 -0
- package/dist/components/ui/LocationInput.d.ts.map +1 -0
- package/dist/components/ui/LocationInput.js +39 -0
- package/dist/components/ui/PropertyGalleryClient.d.ts +8 -0
- package/dist/components/ui/PropertyGalleryClient.d.ts.map +1 -0
- package/dist/components/ui/PropertyGalleryClient.js +22 -0
- package/dist/components/ui/calendar.d.ts +9 -0
- package/dist/components/ui/calendar.d.ts.map +1 -0
- package/dist/components/ui/calendar.js +75 -0
- package/dist/components/ui/dashboard/admin-adventures-table.d.ts +12 -0
- package/dist/components/ui/dashboard/admin-adventures-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/admin-adventures-table.js +94 -0
- package/dist/components/ui/dashboard/admin-blogs-table.d.ts +11 -0
- package/dist/components/ui/dashboard/admin-blogs-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/admin-blogs-table.js +58 -0
- package/dist/components/ui/dashboard/admin-opportunities-table.d.ts +20 -0
- package/dist/components/ui/dashboard/admin-opportunities-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/admin-opportunities-table.js +139 -0
- package/dist/components/ui/dashboard/admin-rentals-table.d.ts +12 -0
- package/dist/components/ui/dashboard/admin-rentals-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/admin-rentals-table.js +85 -0
- package/dist/components/ui/dashboard/admin-travel-package-table.d.ts +16 -0
- package/dist/components/ui/dashboard/admin-travel-package-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/admin-travel-package-table.js +103 -0
- package/dist/components/ui/dashboard/adventures-table.d.ts +16 -0
- package/dist/components/ui/dashboard/adventures-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/adventures-table.js +151 -0
- package/dist/components/ui/dashboard/approver-applications-table.d.ts +13 -0
- package/dist/components/ui/dashboard/approver-applications-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/approver-applications-table.js +85 -0
- package/dist/components/ui/dashboard/approver-package-enquiries-table.d.ts +11 -0
- package/dist/components/ui/dashboard/approver-package-enquiries-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/approver-package-enquiries-table.js +102 -0
- package/dist/components/ui/dashboard/archive-confirm-modal.d.ts +9 -0
- package/dist/components/ui/dashboard/archive-confirm-modal.d.ts.map +1 -0
- package/dist/components/ui/dashboard/archive-confirm-modal.js +6 -0
- package/dist/components/ui/dashboard/blogs-table.d.ts +10 -0
- package/dist/components/ui/dashboard/blogs-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/blogs-table.js +62 -0
- package/dist/components/ui/dashboard/bookings-table.d.ts +13 -0
- package/dist/components/ui/dashboard/bookings-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/bookings-table.js +165 -0
- package/dist/components/ui/dashboard/dashboard-page-shell.d.ts +7 -0
- package/dist/components/ui/dashboard/dashboard-page-shell.d.ts.map +1 -0
- package/dist/components/ui/dashboard/dashboard-page-shell.js +5 -0
- package/dist/components/ui/dashboard/data-table-shell.d.ts +18 -0
- package/dist/components/ui/dashboard/data-table-shell.d.ts.map +1 -0
- package/dist/components/ui/dashboard/data-table-shell.js +6 -0
- package/dist/components/ui/dashboard/delete-confirm-modal.d.ts +9 -0
- package/dist/components/ui/dashboard/delete-confirm-modal.d.ts.map +1 -0
- package/dist/components/ui/dashboard/delete-confirm-modal.js +6 -0
- package/dist/components/ui/dashboard/entity-list-page-state.d.ts +25 -0
- package/dist/components/ui/dashboard/entity-list-page-state.d.ts.map +1 -0
- package/dist/components/ui/dashboard/entity-list-page-state.js +17 -0
- package/dist/components/ui/dashboard/generic-entity-table.d.ts +36 -0
- package/dist/components/ui/dashboard/generic-entity-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/generic-entity-table.js +203 -0
- package/dist/components/ui/dashboard/opportunities-table.d.ts +17 -0
- package/dist/components/ui/dashboard/opportunities-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/opportunities-table.js +143 -0
- package/dist/components/ui/dashboard/rentals-table.d.ts +17 -0
- package/dist/components/ui/dashboard/rentals-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/rentals-table.js +155 -0
- package/dist/components/ui/dashboard/restore-confirm-modal.d.ts +9 -0
- package/dist/components/ui/dashboard/restore-confirm-modal.d.ts.map +1 -0
- package/dist/components/ui/dashboard/restore-confirm-modal.js +6 -0
- package/dist/components/ui/dashboard/stats-card.d.ts +6 -0
- package/dist/components/ui/dashboard/stats-card.d.ts.map +1 -0
- package/dist/components/ui/dashboard/stats-card.js +5 -0
- package/dist/components/ui/dashboard/travel-packages-table.d.ts +16 -0
- package/dist/components/ui/dashboard/travel-packages-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/travel-packages-table.js +134 -0
- package/dist/components/ui/dashboard/user-applications-table.d.ts +12 -0
- package/dist/components/ui/dashboard/user-applications-table.d.ts.map +1 -0
- package/dist/components/ui/dashboard/user-applications-table.js +79 -0
- package/dist/components/ui/loading-skeleton.d.ts +10 -0
- package/dist/components/ui/loading-skeleton.d.ts.map +1 -0
- package/dist/components/ui/loading-skeleton.js +49 -0
- package/dist/components/ui/misc/IosPwaNavBar.d.ts +8 -0
- package/dist/components/ui/misc/IosPwaNavBar.d.ts.map +1 -0
- package/dist/components/ui/misc/IosPwaNavBar.js +25 -0
- package/dist/components/ui/misc/document-upload-button.d.ts +10 -0
- package/dist/components/ui/misc/document-upload-button.d.ts.map +1 -0
- package/dist/components/ui/misc/document-upload-button.js +12 -0
- package/dist/components/ui/misc/empty-state.d.ts +9 -0
- package/dist/components/ui/misc/empty-state.d.ts.map +1 -0
- package/dist/components/ui/misc/empty-state.js +4 -0
- package/dist/components/ui/misc/image-cropper.d.ts +9 -0
- package/dist/components/ui/misc/image-cropper.d.ts.map +1 -0
- package/dist/components/ui/misc/image-cropper.js +28 -0
- package/dist/components/ui/misc/pwa-install-button.d.ts +2 -0
- package/dist/components/ui/misc/pwa-install-button.d.ts.map +1 -0
- package/dist/components/ui/misc/pwa-install-button.js +17 -0
- package/dist/components/ui/misc/rental-tile.d.ts +6 -0
- package/dist/components/ui/misc/rental-tile.d.ts.map +1 -0
- package/dist/components/ui/misc/rental-tile.js +56 -0
- package/dist/components/ui/misc/skeleton-extras.d.ts +32 -0
- package/dist/components/ui/misc/skeleton-extras.d.ts.map +1 -0
- package/dist/components/ui/misc/skeleton-extras.js +58 -0
- package/dist/components/ui/misc/tile.d.ts +4 -0
- package/dist/components/ui/misc/tile.d.ts.map +1 -0
- package/dist/components/ui/misc/tile.js +45 -0
- package/dist/components/ui/misc/whatsapp-help.d.ts +7 -0
- package/dist/components/ui/misc/whatsapp-help.d.ts.map +1 -0
- package/dist/components/ui/misc/whatsapp-help.js +6 -0
- package/dist/components/ui/motion.d.ts +14 -0
- package/dist/components/ui/motion.d.ts.map +1 -0
- package/dist/components/ui/motion.js +17 -0
- package/dist/components/ui/trippeaze/breadcrumb-trail.d.ts +10 -0
- package/dist/components/ui/trippeaze/breadcrumb-trail.d.ts.map +1 -0
- package/dist/components/ui/trippeaze/breadcrumb-trail.js +15 -0
- package/dist/components/ui/trippeaze/chip-tabs.d.ts +13 -0
- package/dist/components/ui/trippeaze/chip-tabs.d.ts.map +1 -0
- package/dist/components/ui/trippeaze/chip-tabs.js +6 -0
- package/dist/components/ui/trippeaze/page-shell.d.ts +22 -0
- package/dist/components/ui/trippeaze/page-shell.d.ts.map +1 -0
- package/dist/components/ui/trippeaze/page-shell.js +15 -0
- package/dist/components/ui/trippeaze/search-input.d.ts +5 -0
- package/dist/components/ui/trippeaze/search-input.d.ts.map +1 -0
- package/dist/components/ui/trippeaze/search-input.js +7 -0
- package/dist/components/user-dashboard/UserDashboardShellSidebar.d.ts +2 -0
- package/dist/components/user-dashboard/UserDashboardShellSidebar.d.ts.map +1 -0
- package/dist/components/user-dashboard/UserDashboardShellSidebar.js +17 -0
- package/dist/components/user-dashboard/UserSidebarNav.d.ts +2 -0
- package/dist/components/user-dashboard/UserSidebarNav.d.ts.map +1 -0
- package/dist/components/user-dashboard/UserSidebarNav.js +68 -0
- package/dist/dashboard/action-buttons.d.ts +17 -0
- package/dist/dashboard/action-buttons.d.ts.map +1 -0
- package/dist/dashboard/action-buttons.js +22 -0
- package/dist/dashboard/app-sidebar.d.ts +3 -0
- package/dist/dashboard/app-sidebar.d.ts.map +1 -0
- package/dist/dashboard/app-sidebar.js +61 -0
- package/dist/dashboard/card-header.d.ts +11 -0
- package/dist/dashboard/card-header.d.ts.map +1 -0
- package/dist/dashboard/card-header.js +7 -0
- package/dist/dashboard/dashboard-components.d.ts +13 -0
- package/dist/dashboard/dashboard-components.d.ts.map +1 -0
- package/dist/dashboard/dashboard-components.js +10 -0
- package/dist/dashboard/data-table.d.ts +24 -0
- package/dist/dashboard/data-table.d.ts.map +1 -0
- package/dist/dashboard/data-table.js +88 -0
- package/dist/dashboard/nav-main.d.ts +9 -0
- package/dist/dashboard/nav-main.d.ts.map +1 -0
- package/dist/dashboard/nav-main.js +9 -0
- package/dist/dashboard/nav-secondary.d.ts +10 -0
- package/dist/dashboard/nav-secondary.d.ts.map +1 -0
- package/dist/dashboard/nav-secondary.js +6 -0
- package/dist/dashboard/stats-card.d.ts +6 -0
- package/dist/dashboard/stats-card.d.ts.map +1 -0
- package/dist/dashboard/stats-card.js +5 -0
- package/dist/dashboard/table.d.ts +11 -0
- package/dist/dashboard/table.d.ts.map +1 -0
- package/dist/dashboard/table.js +21 -0
- package/dist/header/mobile-nav-item.d.ts +9 -0
- package/dist/header/mobile-nav-item.d.ts.map +1 -0
- package/dist/header/mobile-nav-item.js +6 -0
- package/dist/header/mobile-navbar.d.ts +5 -0
- package/dist/header/mobile-navbar.d.ts.map +1 -0
- package/dist/header/mobile-navbar.js +30 -0
- package/dist/header/nav-item.d.ts +10 -0
- package/dist/header/nav-item.d.ts.map +1 -0
- package/dist/header/nav-item.js +6 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/layout/AppProviders.d.ts +5 -0
- package/dist/layout/AppProviders.d.ts.map +1 -0
- package/dist/layout/AppProviders.js +11 -0
- package/dist/layout/PublicShell.d.ts +5 -0
- package/dist/layout/PublicShell.d.ts.map +1 -0
- package/dist/layout/PublicShell.js +5 -0
- package/dist/main/footer.d.ts +6 -0
- package/dist/main/footer.d.ts.map +1 -0
- package/dist/main/footer.js +58 -0
- package/dist/main/navbar.d.ts +6 -0
- package/dist/main/navbar.d.ts.map +1 -0
- package/dist/main/navbar.js +130 -0
- package/dist/main/paginationBar.d.ts +5 -0
- package/dist/main/paginationBar.d.ts.map +1 -0
- package/dist/main/paginationBar.js +28 -0
- package/dist/main/portfolio/portfolioItem.d.ts +7 -0
- package/dist/main/portfolio/portfolioItem.d.ts.map +1 -0
- package/dist/main/portfolio/portfolioItem.js +7 -0
- package/dist/main/portfolio/portfolioPopup.d.ts +8 -0
- package/dist/main/portfolio/portfolioPopup.d.ts.map +1 -0
- package/dist/main/portfolio/portfolioPopup.js +71 -0
- package/dist/main/review-page.d.ts +14 -0
- package/dist/main/review-page.d.ts.map +1 -0
- package/dist/main/review-page.js +209 -0
- package/dist/misc/IosPwaNavBar.d.ts +8 -0
- package/dist/misc/IosPwaNavBar.d.ts.map +1 -0
- package/dist/misc/IosPwaNavBar.js +25 -0
- package/dist/misc/accordion.d.ts +7 -0
- package/dist/misc/accordion.d.ts.map +1 -0
- package/dist/misc/accordion.js +18 -0
- package/dist/misc/alert-dialog.d.ts +14 -0
- package/dist/misc/alert-dialog.d.ts.map +1 -0
- package/dist/misc/alert-dialog.js +39 -0
- package/dist/misc/alert.d.ts +9 -0
- package/dist/misc/alert.d.ts.map +1 -0
- package/dist/misc/alert.js +24 -0
- package/dist/misc/alertdialogclaude.d.ts +15 -0
- package/dist/misc/alertdialogclaude.d.ts.map +1 -0
- package/dist/misc/alertdialogclaude.js +151 -0
- package/dist/misc/avatar.d.ts +6 -0
- package/dist/misc/avatar.d.ts.map +1 -0
- package/dist/misc/avatar.js +14 -0
- package/dist/misc/badge.d.ts +9 -0
- package/dist/misc/badge.d.ts.map +1 -0
- package/dist/misc/badge.js +22 -0
- package/dist/misc/button.d.ts +13 -0
- package/dist/misc/button.d.ts.map +1 -0
- package/dist/misc/button.js +59 -0
- package/dist/misc/card.d.ts +9 -0
- package/dist/misc/card.d.ts.map +1 -0
- package/dist/misc/card.js +21 -0
- package/dist/misc/carousel.d.ts +20 -0
- package/dist/misc/carousel.d.ts.map +1 -0
- package/dist/misc/carousel.js +99 -0
- package/dist/misc/checkbox.d.ts +4 -0
- package/dist/misc/checkbox.d.ts.map +1 -0
- package/dist/misc/checkbox.js +9 -0
- package/dist/misc/command.d.ts +18 -0
- package/dist/misc/command.d.ts.map +1 -0
- package/dist/misc/command.js +34 -0
- package/dist/misc/datepicker.d.ts +15 -0
- package/dist/misc/datepicker.d.ts.map +1 -0
- package/dist/misc/datepicker.js +221 -0
- package/dist/misc/dialog.d.ts +13 -0
- package/dist/misc/dialog.d.ts.map +1 -0
- package/dist/misc/dialog.js +36 -0
- package/dist/misc/discount-strategy-editor.d.ts +22 -0
- package/dist/misc/discount-strategy-editor.d.ts.map +1 -0
- package/dist/misc/discount-strategy-editor.js +61 -0
- package/dist/misc/document-upload-button.d.ts +12 -0
- package/dist/misc/document-upload-button.d.ts.map +1 -0
- package/dist/misc/document-upload-button.js +27 -0
- package/dist/misc/dropdown-menu.d.ts +25 -0
- package/dist/misc/dropdown-menu.d.ts.map +1 -0
- package/dist/misc/dropdown-menu.js +51 -0
- package/dist/misc/empty-state.d.ts +10 -0
- package/dist/misc/empty-state.d.ts.map +1 -0
- package/dist/misc/empty-state.js +5 -0
- package/dist/misc/faq.d.ts +5 -0
- package/dist/misc/faq.d.ts.map +1 -0
- package/dist/misc/faq.js +5 -0
- package/dist/misc/file-preview.d.ts +9 -0
- package/dist/misc/file-preview.d.ts.map +1 -0
- package/dist/misc/file-preview.js +76 -0
- package/dist/misc/filter.d.ts +12 -0
- package/dist/misc/filter.d.ts.map +1 -0
- package/dist/misc/filter.js +44 -0
- package/dist/misc/filterBar.d.ts +39 -0
- package/dist/misc/filterBar.d.ts.map +1 -0
- package/dist/misc/filterBar.js +384 -0
- package/dist/misc/form.d.ts +25 -0
- package/dist/misc/form.d.ts.map +1 -0
- package/dist/misc/form.js +60 -0
- package/dist/misc/image-compressor.d.ts +29 -0
- package/dist/misc/image-compressor.d.ts.map +1 -0
- package/dist/misc/image-compressor.js +70 -0
- package/dist/misc/image-cropper.d.ts +10 -0
- package/dist/misc/image-cropper.d.ts.map +1 -0
- package/dist/misc/image-cropper.js +44 -0
- package/dist/misc/input.d.ts +7 -0
- package/dist/misc/input.d.ts.map +1 -0
- package/dist/misc/input.js +11 -0
- package/dist/misc/label.d.ts +4 -0
- package/dist/misc/label.d.ts.map +1 -0
- package/dist/misc/label.js +8 -0
- package/dist/misc/line-carousel.d.ts +9 -0
- package/dist/misc/line-carousel.d.ts.map +1 -0
- package/dist/misc/line-carousel.js +5 -0
- package/dist/misc/listing-wishlist-button.d.ts +13 -0
- package/dist/misc/listing-wishlist-button.d.ts.map +1 -0
- package/dist/misc/listing-wishlist-button.js +42 -0
- package/dist/misc/location/leafletMap.d.ts +8 -0
- package/dist/misc/location/leafletMap.d.ts.map +1 -0
- package/dist/misc/location/leafletMap.js +62 -0
- package/dist/misc/location/locationPicker.d.ts +5 -0
- package/dist/misc/location/locationPicker.d.ts.map +1 -0
- package/dist/misc/location/locationPicker.js +95 -0
- package/dist/misc/location-autocomplete.d.ts +28 -0
- package/dist/misc/location-autocomplete.d.ts.map +1 -0
- package/dist/misc/location-autocomplete.js +121 -0
- package/dist/misc/newsLetter.d.ts +3 -0
- package/dist/misc/newsLetter.d.ts.map +1 -0
- package/dist/misc/newsLetter.js +41 -0
- package/dist/misc/non-modal-multi-select.d.ts +21 -0
- package/dist/misc/non-modal-multi-select.d.ts.map +1 -0
- package/dist/misc/non-modal-multi-select.js +25 -0
- package/dist/misc/non-modal-select.d.ts +22 -0
- package/dist/misc/non-modal-select.d.ts.map +1 -0
- package/dist/misc/non-modal-select.js +23 -0
- package/dist/misc/notification.d.ts +7 -0
- package/dist/misc/notification.d.ts.map +1 -0
- package/dist/misc/notification.js +157 -0
- package/dist/misc/pagination.d.ts +15 -0
- package/dist/misc/pagination.d.ts.map +1 -0
- package/dist/misc/pagination.js +30 -0
- package/dist/misc/password-eye.d.ts +7 -0
- package/dist/misc/password-eye.d.ts.map +1 -0
- package/dist/misc/password-eye.js +7 -0
- package/dist/misc/popover.d.ts +7 -0
- package/dist/misc/popover.d.ts.map +1 -0
- package/dist/misc/popover.js +17 -0
- package/dist/misc/pricing-strategy-editor.d.ts +17 -0
- package/dist/misc/pricing-strategy-editor.d.ts.map +1 -0
- package/dist/misc/pricing-strategy-editor.js +80 -0
- package/dist/misc/progress.d.ts +4 -0
- package/dist/misc/progress.d.ts.map +1 -0
- package/dist/misc/progress.js +8 -0
- package/dist/misc/pwa-install-button.d.ts +9 -0
- package/dist/misc/pwa-install-button.d.ts.map +1 -0
- package/dist/misc/pwa-install-button.js +160 -0
- package/dist/misc/rental-tile.d.ts +6 -0
- package/dist/misc/rental-tile.d.ts.map +1 -0
- package/dist/misc/rental-tile.js +33 -0
- package/dist/misc/scroll-area.d.ts +5 -0
- package/dist/misc/scroll-area.d.ts.map +1 -0
- package/dist/misc/scroll-area.js +13 -0
- package/dist/misc/searchBar.d.ts +6 -0
- package/dist/misc/searchBar.d.ts.map +1 -0
- package/dist/misc/searchBar.js +89 -0
- package/dist/misc/searchBox.d.ts +13 -0
- package/dist/misc/searchBox.d.ts.map +1 -0
- package/dist/misc/searchBox.js +63 -0
- package/dist/misc/select.d.ts +13 -0
- package/dist/misc/select.d.ts.map +1 -0
- package/dist/misc/select.js +38 -0
- package/dist/misc/separator.d.ts +4 -0
- package/dist/misc/separator.d.ts.map +1 -0
- package/dist/misc/separator.js +8 -0
- package/dist/misc/share.d.ts +5 -0
- package/dist/misc/share.d.ts.map +1 -0
- package/dist/misc/share.js +157 -0
- package/dist/misc/sheet.d.ts +13 -0
- package/dist/misc/sheet.d.ts.map +1 -0
- package/dist/misc/sheet.js +40 -0
- package/dist/misc/sidebar.d.ts +70 -0
- package/dist/misc/sidebar.d.ts.map +1 -0
- package/dist/misc/sidebar.js +212 -0
- package/dist/misc/skeleton.d.ts +38 -0
- package/dist/misc/skeleton.d.ts.map +1 -0
- package/dist/misc/skeleton.js +43 -0
- package/dist/misc/slider.d.ts +5 -0
- package/dist/misc/slider.d.ts.map +1 -0
- package/dist/misc/slider.js +11 -0
- package/dist/misc/starRating.d.ts +4 -0
- package/dist/misc/starRating.d.ts.map +1 -0
- package/dist/misc/starRating.js +11 -0
- package/dist/misc/stateCard.d.ts +7 -0
- package/dist/misc/stateCard.d.ts.map +1 -0
- package/dist/misc/stateCard.js +21 -0
- package/dist/misc/step-progress.d.ts +16 -0
- package/dist/misc/step-progress.d.ts.map +1 -0
- package/dist/misc/step-progress.js +40 -0
- package/dist/misc/switch.d.ts +5 -0
- package/dist/misc/switch.d.ts.map +1 -0
- package/dist/misc/switch.js +8 -0
- package/dist/misc/tabs.d.ts +8 -0
- package/dist/misc/tabs.d.ts.map +1 -0
- package/dist/misc/tabs.js +17 -0
- package/dist/misc/tag-filter-input.d.ts +16 -0
- package/dist/misc/tag-filter-input.d.ts.map +1 -0
- package/dist/misc/tag-filter-input.js +26 -0
- package/dist/misc/textarea.d.ts +4 -0
- package/dist/misc/textarea.d.ts.map +1 -0
- package/dist/misc/textarea.js +6 -0
- package/dist/misc/tile.d.ts +4 -0
- package/dist/misc/tile.d.ts.map +1 -0
- package/dist/misc/tile.js +45 -0
- package/dist/misc/time-select.d.ts +14 -0
- package/dist/misc/time-select.d.ts.map +1 -0
- package/dist/misc/time-select.js +13 -0
- package/dist/misc/tooltip.d.ts +8 -0
- package/dist/misc/tooltip.d.ts.map +1 -0
- package/dist/misc/tooltip.js +17 -0
- package/dist/misc/whatsapp-help.d.ts +9 -0
- package/dist/misc/whatsapp-help.d.ts.map +1 -0
- package/dist/misc/whatsapp-help.js +13 -0
- package/dist/misc/wizard-footer.d.ts +18 -0
- package/dist/misc/wizard-footer.d.ts.map +1 -0
- package/dist/misc/wizard-footer.js +11 -0
- package/dist/profile/socialLink.d.ts +10 -0
- package/dist/profile/socialLink.d.ts.map +1 -0
- package/dist/profile/socialLink.js +66 -0
- package/dist/utils/permissions.d.ts +7 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +38 -0
- package/package.json +93 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useRef, useEffect } from "react";
|
|
4
|
+
import { Send, Smile, Image as ImageIcon, FileText, Camera, MapPin, Mic, X, CircleStopIcon, VideoIcon, PlusCircleIcon, ListTodo, ReceiptText, ChartBar, CalendarPlus, Pause, Play, ChevronLeft, ChevronRight, Megaphone, WalletCards, BadgeIndianRupee } from "lucide-react";
|
|
5
|
+
import { Button } from "../misc/button";
|
|
6
|
+
import { Textarea } from "../misc/textarea";
|
|
7
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../misc/popover";
|
|
8
|
+
import { Progress } from "../misc/progress";
|
|
9
|
+
import { CameraDialog } from "./dialogs/CameraDialog";
|
|
10
|
+
import { CreatePollDialog } from "./dialogs/CreatePollDialog";
|
|
11
|
+
import { ShareLocationDialog } from "./dialogs/ShareLocationDialog";
|
|
12
|
+
import { MediaComposerDialog } from "./dialogs/MediaComposerDialog";
|
|
13
|
+
import { showAlert } from "../misc/alertdialogclaude";
|
|
14
|
+
import { isCompressibleImage, compressImage } from "@myrjfa/state/dist/lib/utils/fileCompression";
|
|
15
|
+
import EmojiPicker from 'emoji-picker-react';
|
|
16
|
+
export function MessageInput({ onSend, onTypingStart, onTypingStop, disabled, replyTo, editMessage, onEdit, onCancelEdit, onCancelReply, onAddMilestone, onAddExpense, onAddEvent, onPayAndSplit, onPaymentDetails, onCreatePoll, participants = [], // Added
|
|
17
|
+
activePanel = "chat", allowAdvancedActions = false, enableAttachments = false, allowCollaborationActions = false, allowAnnouncements = false, initialText = "", externalText, onDraftChange, }) {
|
|
18
|
+
var _a, _b, _c;
|
|
19
|
+
const [text, setText] = useState(editMessage ? (_b = (_a = editMessage === null || editMessage === void 0 ? void 0 : editMessage.content) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : "" : initialText);
|
|
20
|
+
const [mentionSearch, setMentionSearch] = useState(null);
|
|
21
|
+
const [mentionIndex, setMentionIndex] = useState(-1);
|
|
22
|
+
const [selectedFiles, setSelectedFiles] = useState([]);
|
|
23
|
+
const [selectedMentions, setSelectedMentions] = useState([]);
|
|
24
|
+
const [uploadProgress, setUploadProgress] = useState(null);
|
|
25
|
+
const [isSending, setIsSending] = useState(false);
|
|
26
|
+
const textareaRef = useRef(null);
|
|
27
|
+
const fileInputRef = useRef(null);
|
|
28
|
+
const [fileAcceptType, setFileAcceptType] = useState("");
|
|
29
|
+
const typingTimeoutRef = useRef(null);
|
|
30
|
+
const isTypingRef = useRef(false);
|
|
31
|
+
const wasEditingRef = useRef(false);
|
|
32
|
+
const [showEmojiPicker, setShowEmojiPicker] = useState(false);
|
|
33
|
+
const [isCameraOpen, setIsCameraOpen] = useState(false);
|
|
34
|
+
const [isPollOpen, setIsPollOpen] = useState(false);
|
|
35
|
+
const [isLocationDialogOpen, setIsLocationDialogOpen] = useState(false);
|
|
36
|
+
const [isAttachmentMenuOpen, setIsAttachmentMenuOpen] = useState(false);
|
|
37
|
+
const [composerFile, setComposerFile] = useState(null);
|
|
38
|
+
const [isMediaComposerOpen, setIsMediaComposerOpen] = useState(false);
|
|
39
|
+
const [isRecording, setIsRecording] = useState(false);
|
|
40
|
+
const [isRecordingPaused, setIsRecordingPaused] = useState(false);
|
|
41
|
+
const [announcementMode, setAnnouncementMode] = useState(false);
|
|
42
|
+
const mediaRecorderRef = useRef(null);
|
|
43
|
+
const audioChunksRef = useRef([]);
|
|
44
|
+
const [mentionCoords, setMentionCoords] = useState({ top: 0, left: 0 }); // Added
|
|
45
|
+
const participantLabel = (participant) => participant.displayName || participant.username || "Trippeaze member";
|
|
46
|
+
// Auto-resize textarea
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
const el = textareaRef.current;
|
|
49
|
+
if (el) {
|
|
50
|
+
el.style.height = "auto";
|
|
51
|
+
el.style.height = Math.min(el.scrollHeight, 120) + "px";
|
|
52
|
+
}
|
|
53
|
+
}, [text]);
|
|
54
|
+
// Focus input when replyTo message is set
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
var _a;
|
|
57
|
+
if (replyTo) {
|
|
58
|
+
(_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
59
|
+
}
|
|
60
|
+
}, [replyTo]);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (!editMessage)
|
|
63
|
+
onDraftChange === null || onDraftChange === void 0 ? void 0 : onDraftChange(text);
|
|
64
|
+
}, [editMessage, onDraftChange, text]);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (editMessage) {
|
|
67
|
+
wasEditingRef.current = true;
|
|
68
|
+
setText(editMessage.content.text || "");
|
|
69
|
+
}
|
|
70
|
+
else if (wasEditingRef.current) {
|
|
71
|
+
wasEditingRef.current = false;
|
|
72
|
+
setText(initialText);
|
|
73
|
+
}
|
|
74
|
+
}, [editMessage === null || editMessage === void 0 ? void 0 : editMessage._id]);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
if (externalText !== undefined && !editMessage) {
|
|
77
|
+
setText(externalText);
|
|
78
|
+
requestAnimationFrame(() => { var _a; return (_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.focus(); });
|
|
79
|
+
}
|
|
80
|
+
}, [externalText]);
|
|
81
|
+
const handleTextChange = (e) => {
|
|
82
|
+
const value = e.target.value;
|
|
83
|
+
const cursorPosition = e.target.selectionStart;
|
|
84
|
+
setText(value);
|
|
85
|
+
// Mention detection
|
|
86
|
+
const textBeforeCursor = value.substring(0, cursorPosition);
|
|
87
|
+
const lastAtChar = textBeforeCursor.lastIndexOf("@");
|
|
88
|
+
if (lastAtChar !== -1 && (lastAtChar === 0 || textBeforeCursor[lastAtChar - 1] === " ")) {
|
|
89
|
+
const search = textBeforeCursor.substring(lastAtChar + 1);
|
|
90
|
+
if (!search.includes(" ")) {
|
|
91
|
+
setMentionSearch(search);
|
|
92
|
+
setMentionIndex(lastAtChar);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
setMentionSearch(null);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
setMentionSearch(null);
|
|
100
|
+
}
|
|
101
|
+
// Typing indicator
|
|
102
|
+
if (!isTypingRef.current && e.target.value.length > 0) {
|
|
103
|
+
isTypingRef.current = true;
|
|
104
|
+
onTypingStart === null || onTypingStart === void 0 ? void 0 : onTypingStart();
|
|
105
|
+
}
|
|
106
|
+
// Reset typing timeout
|
|
107
|
+
if (typingTimeoutRef.current)
|
|
108
|
+
clearTimeout(typingTimeoutRef.current);
|
|
109
|
+
typingTimeoutRef.current = setTimeout(() => {
|
|
110
|
+
isTypingRef.current = false;
|
|
111
|
+
onTypingStop === null || onTypingStop === void 0 ? void 0 : onTypingStop();
|
|
112
|
+
}, 2000);
|
|
113
|
+
};
|
|
114
|
+
const insertMention = (participant) => {
|
|
115
|
+
var _a;
|
|
116
|
+
if (mentionIndex === -1)
|
|
117
|
+
return;
|
|
118
|
+
const username = participant.username || participantLabel(participant);
|
|
119
|
+
const before = text.substring(0, mentionIndex);
|
|
120
|
+
const after = text.substring(((_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.selectionStart) || text.length);
|
|
121
|
+
const newText = `${before}@${username} ${after}`;
|
|
122
|
+
setText(newText);
|
|
123
|
+
setMentionSearch(null);
|
|
124
|
+
setSelectedMentions((current) => current.some((item) => item.actorId === participant.actorId && item.actorModel === participant.actorModel) ? current : [...current, {
|
|
125
|
+
actorId: participant.actorId,
|
|
126
|
+
actorModel: participant.actorModel,
|
|
127
|
+
username,
|
|
128
|
+
}]);
|
|
129
|
+
// Set cursor after the inserted mention
|
|
130
|
+
setTimeout(() => {
|
|
131
|
+
if (textareaRef.current) {
|
|
132
|
+
const newCursorPos = before.length + `@${username} `.length;
|
|
133
|
+
textareaRef.current.selectionStart = newCursorPos;
|
|
134
|
+
textareaRef.current.selectionEnd = newCursorPos;
|
|
135
|
+
textareaRef.current.focus();
|
|
136
|
+
}
|
|
137
|
+
}, 0);
|
|
138
|
+
};
|
|
139
|
+
async function handleSend() {
|
|
140
|
+
var _a;
|
|
141
|
+
const trimmed = text.trim();
|
|
142
|
+
if ((!trimmed && selectedFiles.length === 0) || disabled)
|
|
143
|
+
return;
|
|
144
|
+
setIsSending(true);
|
|
145
|
+
setUploadProgress(0);
|
|
146
|
+
try {
|
|
147
|
+
let filesToSend = [...selectedFiles];
|
|
148
|
+
// Compress images
|
|
149
|
+
setUploadProgress(10); // Start progress for compression
|
|
150
|
+
const compressed = await Promise.all(filesToSend.map(async (file) => {
|
|
151
|
+
if (isCompressibleImage(file)) {
|
|
152
|
+
try {
|
|
153
|
+
return await compressImage(file);
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
console.error("Compression failed for", file.name, e);
|
|
157
|
+
return file;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return file;
|
|
161
|
+
}));
|
|
162
|
+
setUploadProgress(30); // Compression done, starting upload
|
|
163
|
+
// Note: sendMessage doesn't currently support progress callback.
|
|
164
|
+
// We'll simulate progress or update it if chatApi supports it.
|
|
165
|
+
// For now, call sendMessage.
|
|
166
|
+
if (editMessage) {
|
|
167
|
+
await (onEdit === null || onEdit === void 0 ? void 0 : onEdit(editMessage._id, trimmed));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
await onSend(trimmed, compressed, selectedMentions
|
|
171
|
+
.filter((mention) => trimmed.includes(`@${mention.username}`))
|
|
172
|
+
.map(({ actorId, actorModel }) => ({ actorId, actorModel })), announcementMode ? "announcement" : compressed.length ? "media" : "text");
|
|
173
|
+
}
|
|
174
|
+
setUploadProgress(100);
|
|
175
|
+
setText("");
|
|
176
|
+
setSelectedFiles([]);
|
|
177
|
+
setSelectedMentions([]);
|
|
178
|
+
setAnnouncementMode(false);
|
|
179
|
+
// Clear typing
|
|
180
|
+
if (typingTimeoutRef.current)
|
|
181
|
+
clearTimeout(typingTimeoutRef.current);
|
|
182
|
+
isTypingRef.current = false;
|
|
183
|
+
onTypingStop === null || onTypingStop === void 0 ? void 0 : onTypingStop();
|
|
184
|
+
// Refocus
|
|
185
|
+
(_a = textareaRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
console.error(error);
|
|
189
|
+
showAlert("Failed to send message", "Error");
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
setIsSending(false);
|
|
193
|
+
setUploadProgress(null);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function handleKeyDown(e) {
|
|
197
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
198
|
+
e.preventDefault();
|
|
199
|
+
handleSend();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const handleFileChange = (e) => {
|
|
203
|
+
var _a;
|
|
204
|
+
if (e.target.files) {
|
|
205
|
+
const files = Array.from(e.target.files);
|
|
206
|
+
const firstImage = files.length === 1 && ((_a = files[0]) === null || _a === void 0 ? void 0 : _a.type.startsWith("image/")) ? files[0] : null;
|
|
207
|
+
if (firstImage) {
|
|
208
|
+
setComposerFile(firstImage);
|
|
209
|
+
setIsMediaComposerOpen(true);
|
|
210
|
+
}
|
|
211
|
+
else
|
|
212
|
+
setSelectedFiles(prev => [...prev, ...files]);
|
|
213
|
+
}
|
|
214
|
+
e.target.value = "";
|
|
215
|
+
};
|
|
216
|
+
const chooseFiles = (accept) => {
|
|
217
|
+
setIsAttachmentMenuOpen(false);
|
|
218
|
+
setFileAcceptType(accept);
|
|
219
|
+
window.setTimeout(() => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, 0);
|
|
220
|
+
};
|
|
221
|
+
const removeFile = (index) => {
|
|
222
|
+
setSelectedFiles(prev => prev.filter((_, i) => i !== index));
|
|
223
|
+
};
|
|
224
|
+
const handleCameraCapture = (file) => {
|
|
225
|
+
setSelectedFiles(prev => [...prev, file]);
|
|
226
|
+
};
|
|
227
|
+
const startRecording = async () => {
|
|
228
|
+
try {
|
|
229
|
+
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
230
|
+
const mediaRecorder = new MediaRecorder(stream);
|
|
231
|
+
mediaRecorderRef.current = mediaRecorder;
|
|
232
|
+
audioChunksRef.current = [];
|
|
233
|
+
mediaRecorder.ondataavailable = (event) => {
|
|
234
|
+
if (event.data.size > 0) {
|
|
235
|
+
audioChunksRef.current.push(event.data);
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
mediaRecorder.onstop = () => {
|
|
239
|
+
const audioBlob = new Blob(audioChunksRef.current, { type: "audio/webm" });
|
|
240
|
+
const audioFile = new File([audioBlob], `voice_${Date.now()}.webm`, { type: "audio/webm" });
|
|
241
|
+
setSelectedFiles(prev => [...prev, audioFile]);
|
|
242
|
+
stream.getTracks().forEach(track => track.stop());
|
|
243
|
+
};
|
|
244
|
+
mediaRecorder.start();
|
|
245
|
+
setIsRecording(true);
|
|
246
|
+
setIsRecordingPaused(false);
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
console.error("Error accessing microphone:", err);
|
|
250
|
+
void showAlert("Could not access the microphone. Check your browser permission and try again.", "Microphone unavailable");
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
const stopRecording = () => {
|
|
254
|
+
if (mediaRecorderRef.current && isRecording) {
|
|
255
|
+
mediaRecorderRef.current.stop();
|
|
256
|
+
setIsRecording(false);
|
|
257
|
+
setIsRecordingPaused(false);
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
const toggleRecordingPause = () => {
|
|
261
|
+
const recorder = mediaRecorderRef.current;
|
|
262
|
+
if (!recorder || !isRecording)
|
|
263
|
+
return;
|
|
264
|
+
if (recorder.state === "recording") {
|
|
265
|
+
recorder.pause();
|
|
266
|
+
setIsRecordingPaused(true);
|
|
267
|
+
}
|
|
268
|
+
else if (recorder.state === "paused") {
|
|
269
|
+
recorder.resume();
|
|
270
|
+
setIsRecordingPaused(false);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
const moveFile = (index, direction) => {
|
|
274
|
+
setSelectedFiles((current) => {
|
|
275
|
+
const nextIndex = index + direction;
|
|
276
|
+
if (nextIndex < 0 || nextIndex >= current.length)
|
|
277
|
+
return current;
|
|
278
|
+
const next = [...current];
|
|
279
|
+
const currentFile = next[index];
|
|
280
|
+
const adjacentFile = next[nextIndex];
|
|
281
|
+
if (!currentFile || !adjacentFile)
|
|
282
|
+
return current;
|
|
283
|
+
next[index] = adjacentFile;
|
|
284
|
+
next[nextIndex] = currentFile;
|
|
285
|
+
return next;
|
|
286
|
+
});
|
|
287
|
+
};
|
|
288
|
+
const handleEmojiSelect = (emojiObject) => {
|
|
289
|
+
if (textareaRef.current) {
|
|
290
|
+
const cursorPos = textareaRef.current.selectionStart;
|
|
291
|
+
const newText = text.slice(0, cursorPos) + emojiObject.emoji + text.slice(cursorPos);
|
|
292
|
+
setText(newText);
|
|
293
|
+
setShowEmojiPicker(false);
|
|
294
|
+
textareaRef.current.focus();
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
// Only show message input for chat panel
|
|
298
|
+
const showMessageInput = activePanel === "chat";
|
|
299
|
+
return (_jsxs("div", { className: "border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 p-3 relative", children: [allowAdvancedActions && (_jsxs(_Fragment, { children: [enableAttachments && _jsx(CameraDialog, { open: isCameraOpen, onOpenChange: setIsCameraOpen, onCapture: handleCameraCapture }), allowCollaborationActions && _jsx(CreatePollDialog, { open: isPollOpen, onOpenChange: setIsPollOpen, onCreate: (q, opts, multi) => {
|
|
300
|
+
onCreatePoll === null || onCreatePoll === void 0 ? void 0 : onCreatePoll(q, opts, multi);
|
|
301
|
+
} })] })), mentionSearch !== null && participants.length > 0 && (_jsxs("div", { className: "absolute bottom-full left-4 mb-2 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-xl w-48 py-1 z-50 overflow-y-auto max-h-48", children: [participants
|
|
302
|
+
.filter((p) => {
|
|
303
|
+
const searchable = `${p.username || ""} ${p.displayName || ""}`.toLowerCase();
|
|
304
|
+
return !mentionSearch || searchable.includes(mentionSearch.toLowerCase());
|
|
305
|
+
})
|
|
306
|
+
.map(p => (_jsx("button", { onClick: () => insertMention(p), className: "w-full text-left px-3 py-2 text-sm hover:bg-indigo-50 dark:hover:bg-indigo-900/40 flex items-center gap-2", children: _jsxs("span", { className: "truncate", children: ["@", p.username || participantLabel(p)] }) }, p.actorId))), participants.filter((p) => {
|
|
307
|
+
const searchable = `${p.username || ""} ${p.displayName || ""}`.toLowerCase();
|
|
308
|
+
return !mentionSearch || searchable.includes(mentionSearch.toLowerCase());
|
|
309
|
+
}).length === 0 && (_jsx("div", { className: "px-3 py-2 text-xs text-gray-500 italic", children: "No members found" }))] })), allowAdvancedActions && enableAttachments && selectedFiles.length > 0 && !editMessage && (_jsx("div", { className: "max-w-4xl mx-auto mb-2 flex flex-wrap gap-2", children: selectedFiles.map((file, i) => (_jsxs("div", { className: "flex items-center gap-1 bg-gray-100 dark:bg-gray-800 rounded-lg px-2 py-1 text-xs text-gray-600 dark:text-gray-300", children: [file.type.startsWith("image/") && _jsx("img", { src: URL.createObjectURL(file), alt: "", className: "h-9 w-9 rounded object-cover" }), file.type.startsWith("audio/") && _jsx("audio", { src: URL.createObjectURL(file), controls: true, className: "h-8 max-w-44" }), _jsx("span", { className: "truncate max-w-[150px]", children: file.name }), selectedFiles.length > 1 && _jsxs(_Fragment, { children: [_jsx("button", { type: "button", disabled: i === 0, onClick: () => moveFile(i, -1), "aria-label": "Move attachment left", children: _jsx(ChevronLeft, { className: "h-3.5 w-3.5" }) }), _jsx("button", { type: "button", disabled: i === selectedFiles.length - 1, onClick: () => moveFile(i, 1), "aria-label": "Move attachment right", children: _jsx(ChevronRight, { className: "h-3.5 w-3.5" }) })] }), _jsx("button", { onClick: () => removeFile(i), className: "ml-2 text-red-500 hover:text-red-700 font-bold", children: "\u00D7" })] }, `${file.name}-${i}`))) })), announcementMode && !editMessage && (_jsxs("div", { className: "mx-auto mb-2 flex max-w-4xl items-center justify-between rounded-xl border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900", children: [_jsxs("span", { className: "flex items-center gap-2 font-medium", children: [_jsx(Megaphone, { className: "h-4 w-4" }), "Sending as a group announcement"] }), _jsx("button", { type: "button", onClick: () => setAnnouncementMode(false), "aria-label": "Cancel announcement", children: _jsx(X, { className: "h-4 w-4" }) })] })), replyTo && (_jsxs("div", { className: "max-w-4xl mx-auto mb-2 flex items-center gap-2 bg-gray-100 dark:bg-gray-800 px-3 py-2 rounded-lg border-l-2 border-teal-500", children: [_jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "text-xs font-semibold text-teal-600 dark:text-teal-400", children: editMessage ? "Editing" : `Replying to ${participantLabel(participants.find((participant) => participant.actorId === replyTo.senderId) || {})}` }), _jsx("div", { className: "text-xs text-gray-600 dark:text-gray-400 truncate", children: (_c = replyTo.content.text) === null || _c === void 0 ? void 0 : _c.substring(0, 60) })] }), _jsx("button", { onClick: onCancelReply, className: "text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 flex-shrink-0", children: _jsx(X, { className: "w-4 h-4" }) })] })), _jsxs("div", { className: `${showMessageInput ? "flex" : "hidden md:flex"} items-end gap-2 max-w-4xl mx-auto`, children: [allowAdvancedActions && enableAttachments && (_jsx("input", { type: "file", ref: fileInputRef, onChange: handleFileChange, accept: fileAcceptType, multiple: true, className: "hidden" })), allowAdvancedActions && !editMessage && _jsxs(Popover, { open: isAttachmentMenuOpen, onOpenChange: setIsAttachmentMenuOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", className: "text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full h-10 w-10 shrink-0", children: _jsx(PlusCircleIcon, { className: "w-5 h-5" }) }) }), _jsxs(PopoverContent, { side: "top", align: "start", className: "w-48 p-2 flex flex-col gap-1", children: [enableAttachments && _jsxs(_Fragment, { children: [_jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full", onClick: () => chooseFiles(".pdf,.doc,.docx,.txt,.xlsx,.pptx"), children: [_jsx(FileText, { className: "w-4 h-4 text-purple-500" }), "Document"] }), _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full", onClick: () => chooseFiles("image/*"), children: [_jsx(ImageIcon, { className: "w-4 h-4 text-blue-500" }), "Photos"] }), _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full", onClick: () => chooseFiles("video/*"), children: [_jsx(VideoIcon, { className: "w-4 h-4 text-rose-500" }), "Videos"] }), _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full", onClick: () => { setIsAttachmentMenuOpen(false); setIsLocationDialogOpen(true); }, children: [_jsx(MapPin, { className: "w-4 h-4 text-green-500" }), "Location"] })] }), allowCollaborationActions && _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full", onClick: () => { setIsAttachmentMenuOpen(false); setIsPollOpen(true); }, children: [_jsx(ChartBar, { className: "w-4 h-4 text-orange-500" }), "Poll"] }), allowCollaborationActions && _jsx("div", { className: "border-t border-gray-200 dark:border-gray-700 my-1" }), allowCollaborationActions && _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full text-teal-600 dark:text-teal-400", onClick: () => {
|
|
310
|
+
setIsAttachmentMenuOpen(false);
|
|
311
|
+
onAddMilestone === null || onAddMilestone === void 0 ? void 0 : onAddMilestone();
|
|
312
|
+
}, children: [_jsx(ListTodo, { className: "w-4 h-4" }), "Add Milestone"] }), allowCollaborationActions && _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full text-teal-600 dark:text-teal-400", onClick: () => {
|
|
313
|
+
setIsAttachmentMenuOpen(false);
|
|
314
|
+
onAddExpense === null || onAddExpense === void 0 ? void 0 : onAddExpense();
|
|
315
|
+
}, children: [_jsx(ReceiptText, { className: "w-4 h-4" }), "Add Expense"] }), allowCollaborationActions && _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full text-teal-600 dark:text-teal-400", onClick: () => {
|
|
316
|
+
setIsAttachmentMenuOpen(false);
|
|
317
|
+
onAddEvent === null || onAddEvent === void 0 ? void 0 : onAddEvent();
|
|
318
|
+
}, children: [_jsx(CalendarPlus, { className: "w-4 h-4" }), "Add Event"] }), allowAnnouncements && _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full text-amber-700", onClick: () => {
|
|
319
|
+
setIsAttachmentMenuOpen(false);
|
|
320
|
+
setAnnouncementMode(true);
|
|
321
|
+
}, children: [_jsx(Megaphone, { className: "w-4 h-4" }), "Announcement"] }), allowCollaborationActions && _jsx("div", { className: "border-t border-gray-200 dark:border-gray-700 my-1" }), allowCollaborationActions && _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full text-emerald-700", onClick: () => {
|
|
322
|
+
setIsAttachmentMenuOpen(false);
|
|
323
|
+
onPayAndSplit === null || onPayAndSplit === void 0 ? void 0 : onPayAndSplit();
|
|
324
|
+
}, children: [_jsx(BadgeIndianRupee, { className: "w-4 h-4" }), "Pay & Split"] }), _jsxs(Button, { variant: "ghost", className: "justify-start gap-2 w-full text-slate-700", onClick: () => {
|
|
325
|
+
setIsAttachmentMenuOpen(false);
|
|
326
|
+
onPaymentDetails === null || onPaymentDetails === void 0 ? void 0 : onPaymentDetails();
|
|
327
|
+
}, children: [_jsx(WalletCards, { className: "w-4 h-4" }), "Payment details"] })] })] }), _jsxs("div", { className: "flex-1 bg-gray-100 dark:bg-gray-800 rounded-2xl flex items-end relative", children: [_jsx(Textarea, { ref: textareaRef, value: text, onChange: handleTextChange, onKeyDown: handleKeyDown, placeholder: "Type a message...", disabled: disabled || isSending, rows: 1, className: "flex-1 bg-transparent border-none focus-visible:ring-0 px-4 py-3 text-[15px] resize-none text-gray-900 dark:text-white placeholder-gray-400 max-h-[120px] min-h-[48px]" }), uploadProgress !== null && (_jsx("div", { className: "absolute left-0 bottom-full w-full px-4 mb-2", children: _jsxs("div", { className: "bg-white dark:bg-gray-800 p-2 rounded-lg shadow-lg border border-gray-100 dark:border-gray-700", children: [_jsxs("div", { className: "flex justify-between items-center mb-1", children: [_jsx("span", { className: "text-[10px] text-gray-500 font-medium", children: "Uploading..." }), _jsxs("span", { className: "text-[10px] text-indigo-500 font-bold", children: [uploadProgress, "%"] })] }), _jsx(Progress, { value: uploadProgress, className: "h-1" })] }) })), _jsx(Button, { variant: "ghost", size: "icon", className: "mr-1 mb-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full hidden sm:inline-flex", onClick: () => setShowEmojiPicker(!showEmojiPicker), children: _jsx(Smile, { className: "w-5 h-5" }) }), allowAdvancedActions && enableAttachments && !editMessage && _jsx(Button, { variant: "ghost", size: "icon", className: "mr-1 mb-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full", onClick: () => setIsCameraOpen(true), children: _jsx(Camera, { className: "w-5 h-5" }) })] }), isRecording && (_jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "h-11 w-11 rounded-full text-slate-600", onClick: toggleRecordingPause, "aria-label": isRecordingPaused ? "Resume recording" : "Pause recording", children: isRecordingPaused ? _jsx(Play, { className: "h-5 w-5" }) : _jsx(Pause, { className: "h-5 w-5" }) })), text.trim() || (allowAdvancedActions && enableAttachments && selectedFiles.length > 0) || editMessage ? (_jsx(Button, { onClick: handleSend, disabled: disabled, className: "rounded-full h-11 w-11 p-0 bg-gradient-to-r from-teal-500 to-cyan-600 hover:from-teal-600 hover:to-cyan-700 shadow-lg shadow-teal-500/25 shrink-0", children: _jsx(Send, { className: "w-5 h-5" }) })) : allowAdvancedActions ? (_jsx(Button, { variant: "ghost", size: "icon", className: `rounded-full h-11 w-11 shrink-0 transition-all ${isRecording
|
|
328
|
+
? "bg-red-500 hover:bg-red-600 animate-pulse text-white"
|
|
329
|
+
: "text-teal-400 hover:bg-teal-100 dark:hover:bg-teal-800"}`, onClick: () => isRecording ? stopRecording() : startRecording(), children: isRecording ? _jsx(CircleStopIcon, { className: "w-6 h-6" }) : _jsx(Mic, { className: "w-6 h-6" }) })) : (_jsx(Button, { disabled: true, className: "rounded-full h-11 w-11 p-0 bg-gray-300 dark:bg-gray-700 shrink-0", "aria-label": "Enter a message to send", children: _jsx(Send, { className: "w-5 h-5" }) })), editMessage && _jsx(Button, { variant: "ghost", size: "icon", className: "rounded-full h-11 w-11 shrink-0", onClick: onCancelEdit, children: _jsx(X, { className: "w-5 h-5" }) }), showEmojiPicker && _jsx(EmojiPicker, { onEmojiClick: handleEmojiSelect })] }), _jsx(ShareLocationDialog, { open: isLocationDialogOpen, onOpenChange: setIsLocationDialogOpen, onSend: onSend }), _jsx(MediaComposerDialog, { file: composerFile, open: isMediaComposerOpen, onOpenChange: setIsMediaComposerOpen, onConfirm: (file) => setSelectedFiles((current) => [...current, file]) })] }));
|
|
330
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ChatActorModel, type Conversation } from "@myrjfa/state/dist/lib/models/chat";
|
|
2
|
+
interface MilestonePanelProps {
|
|
3
|
+
conversationId: string;
|
|
4
|
+
currentUserId: string;
|
|
5
|
+
currentActorModel: ChatActorModel;
|
|
6
|
+
participants: Conversation["participants"];
|
|
7
|
+
isFullScreen?: boolean;
|
|
8
|
+
isFeatureEnabled?: boolean;
|
|
9
|
+
isAdmin?: boolean;
|
|
10
|
+
onEnableFeature?: () => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function MilestonePanel({ conversationId, currentUserId, currentActorModel, participants, isFullScreen, isFeatureEnabled, isAdmin, onEnableFeature }: MilestonePanelProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=MilestonePanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MilestonePanel.d.ts","sourceRoot":"","sources":["../../src/chat/MilestonePanel.tsx"],"names":[],"mappings":"AAIA,OAAO,EAGH,KAAK,cAAc,EAEnB,KAAK,YAAY,EAEpB,MAAM,oCAAoC,CAAC;AAU5C,UAAU,mBAAmB;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,cAAc,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC;AAED,wBAAgB,cAAc,CAAC,EAC3B,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAoB,EACpB,gBAAuB,EACvB,OAAe,EACf,eAAe,EAClB,EAAE,mBAAmB,2CAqgBrB"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useEffect } from "react";
|
|
4
|
+
import { chatApi } from "@myrjfa/state/dist/lib/actions/chat";
|
|
5
|
+
import { chatActorKey, isSameChatActor, } from "@myrjfa/state/dist/lib/models/chat";
|
|
6
|
+
import { CheckCircle2, Circle, Plus, Trash2, Pencil, MoreVertical, Lock, Unlock, ListTodo, ChevronDown, AlertCircle, SlidersHorizontal } from "lucide-react";
|
|
7
|
+
import { Button } from "../misc/button";
|
|
8
|
+
import { Input } from "../misc/input";
|
|
9
|
+
import { Textarea } from "../misc/textarea";
|
|
10
|
+
import { DatePicker } from "../misc/datepicker";
|
|
11
|
+
import { SearchBox } from "../misc/searchBox";
|
|
12
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "../misc/dropdown-menu";
|
|
13
|
+
import { deleteActions, showAlert } from "../misc/alertdialogclaude";
|
|
14
|
+
export function MilestonePanel({ conversationId, currentUserId, currentActorModel, participants, isFullScreen = false, isFeatureEnabled = true, isAdmin = false, onEnableFeature }) {
|
|
15
|
+
const [milestones, setMilestones] = useState([]);
|
|
16
|
+
const [loading, setLoading] = useState(true);
|
|
17
|
+
const [isAdding, setIsAdding] = useState(false);
|
|
18
|
+
const [milestoneId, setMilestoneId] = useState(null);
|
|
19
|
+
const [newTitle, setNewTitle] = useState("");
|
|
20
|
+
const [newSection, setNewSection] = useState("");
|
|
21
|
+
const [newDescription, setNewDescription] = useState("");
|
|
22
|
+
const [newDueDate, setNewDueDate] = useState(null);
|
|
23
|
+
const [showMoreOptions, setShowMoreOptions] = useState(false);
|
|
24
|
+
const [sections, setSections] = useState([]);
|
|
25
|
+
const [expandedSections, setExpandedSections] = useState(new Set());
|
|
26
|
+
const [expandedMilestones, setExpandedMilestones] = useState(new Set());
|
|
27
|
+
const currentActor = { actorId: currentUserId, actorModel: currentActorModel };
|
|
28
|
+
const [openMilestoneMenuId, setOpenMilestoneMenuId] = useState(null);
|
|
29
|
+
const fetchMilestones = async () => {
|
|
30
|
+
setLoading(true);
|
|
31
|
+
const data = await chatApi.getMilestones(conversationId);
|
|
32
|
+
setMilestones(data);
|
|
33
|
+
setLoading(false);
|
|
34
|
+
};
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
fetchMilestones();
|
|
37
|
+
}, [conversationId]);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
// Extract unique sections from existing milestones
|
|
40
|
+
const uniqueSections = Array.from(new Set(milestones.map(m => m.section).filter(Boolean)));
|
|
41
|
+
setSections(uniqueSections);
|
|
42
|
+
}, [milestones]);
|
|
43
|
+
const resetForm = () => {
|
|
44
|
+
setNewTitle("");
|
|
45
|
+
setNewSection("");
|
|
46
|
+
setNewDescription("");
|
|
47
|
+
setNewDueDate(null);
|
|
48
|
+
setShowMoreOptions(false);
|
|
49
|
+
setIsAdding(false);
|
|
50
|
+
setMilestoneId(null);
|
|
51
|
+
};
|
|
52
|
+
const toggleSection = (section) => {
|
|
53
|
+
setExpandedSections(prev => {
|
|
54
|
+
const newSet = new Set(prev);
|
|
55
|
+
if (newSet.has(section)) {
|
|
56
|
+
newSet.delete(section);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
newSet.add(section);
|
|
60
|
+
}
|
|
61
|
+
return newSet;
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
const toggleMilestoneExpand = (id) => {
|
|
65
|
+
setExpandedMilestones(prev => {
|
|
66
|
+
const newSet = new Set(prev);
|
|
67
|
+
if (newSet.has(id)) {
|
|
68
|
+
newSet.delete(id);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
newSet.add(id);
|
|
72
|
+
}
|
|
73
|
+
return newSet;
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
const handleCreate = async () => {
|
|
77
|
+
if (!newTitle.trim())
|
|
78
|
+
return;
|
|
79
|
+
try {
|
|
80
|
+
const milestoneData = {
|
|
81
|
+
title: newTitle.trim(),
|
|
82
|
+
section: newSection.trim() || "General",
|
|
83
|
+
description: newDescription.trim() || undefined,
|
|
84
|
+
dueDate: (newDueDate === null || newDueDate === void 0 ? void 0 : newDueDate.toISOString()) || undefined
|
|
85
|
+
};
|
|
86
|
+
const milestoneResponse = milestoneId
|
|
87
|
+
? await chatApi.updateMilestone(milestoneId, milestoneData)
|
|
88
|
+
: await chatApi.createMilestone(conversationId, milestoneData);
|
|
89
|
+
if (milestoneResponse.error) {
|
|
90
|
+
console.error("Failed to create milestone:", milestoneResponse.error);
|
|
91
|
+
showAlert(milestoneResponse.error, "Failed to create milestone");
|
|
92
|
+
}
|
|
93
|
+
else if (milestoneResponse.data) {
|
|
94
|
+
await fetchMilestones();
|
|
95
|
+
resetForm();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
console.error("Failed to create milestone:", err);
|
|
100
|
+
showAlert(err, "Failed to create milestone");
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const handleToggle = async (id) => {
|
|
104
|
+
const response = await chatApi.toggleMilestone(id);
|
|
105
|
+
if (response.error) {
|
|
106
|
+
console.log("error toggling milestone " + id + "Error: " + response.error);
|
|
107
|
+
await showAlert("Error checking/unchecking milestone");
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
else if (response.data) {
|
|
111
|
+
setMilestones(prev => prev.map(m => m._id === id ? response.data : m));
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const handleDelete = async (id) => {
|
|
115
|
+
let confirmDelete = true;
|
|
116
|
+
await showAlert("Are you sure you want to delete this milestone?", undefined, deleteActions(() => confirmDelete = false));
|
|
117
|
+
if (confirmDelete) {
|
|
118
|
+
const response = await chatApi.deleteMilestone(id);
|
|
119
|
+
if (response.error) {
|
|
120
|
+
console.log("Unable to delete milestone:" + id + "Error: " + response.error);
|
|
121
|
+
await showAlert("Unable to delete milestone");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
setMilestones(prev => prev.filter(m => m._id !== id));
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
const handleEdit = async (milestone) => {
|
|
128
|
+
var _a, _b;
|
|
129
|
+
setNewTitle(milestone.title);
|
|
130
|
+
setNewSection((_a = milestone.section) !== null && _a !== void 0 ? _a : "");
|
|
131
|
+
setNewDescription((_b = milestone.description) !== null && _b !== void 0 ? _b : "");
|
|
132
|
+
setNewDueDate(milestone.dueDate ? new Date(milestone.dueDate) : null);
|
|
133
|
+
setMilestoneId(milestone._id);
|
|
134
|
+
setIsAdding(true);
|
|
135
|
+
};
|
|
136
|
+
// Check if current user has checked this milestone
|
|
137
|
+
const hasUserChecked = (milestone) => {
|
|
138
|
+
return milestone.checks.some((check) => isSameChatActor(check, currentActor));
|
|
139
|
+
};
|
|
140
|
+
// Get users who haven't checked the milestone
|
|
141
|
+
const participantLabel = (actor) => {
|
|
142
|
+
const participant = participants.find((item) => actor.actorModel
|
|
143
|
+
? isSameChatActor(item, actor)
|
|
144
|
+
: item.actorId === actor.actorId);
|
|
145
|
+
return (participant === null || participant === void 0 ? void 0 : participant.displayName) || (participant === null || participant === void 0 ? void 0 : participant.username) || "Trippeaze member";
|
|
146
|
+
};
|
|
147
|
+
const showMemberProgress = (id) => {
|
|
148
|
+
setExpandedMilestones((current) => current.has(id) ? current : new Set(current).add(id));
|
|
149
|
+
setOpenMilestoneMenuId(null);
|
|
150
|
+
};
|
|
151
|
+
const getUncheckedUsers = (milestone) => {
|
|
152
|
+
const checkedActors = new Set(milestone.checks.map(chatActorKey));
|
|
153
|
+
return participants.filter((participant) => !checkedActors.has(chatActorKey(participant)));
|
|
154
|
+
};
|
|
155
|
+
const getCheckedUsers = (milestone) => {
|
|
156
|
+
const checkedActors = new Set(milestone.checks.map(chatActorKey));
|
|
157
|
+
return participants.filter((participant) => checkedActors.has(chatActorKey(participant)));
|
|
158
|
+
};
|
|
159
|
+
const groupedMilestones = milestones.reduce((acc, m) => {
|
|
160
|
+
const section = m.section || "General";
|
|
161
|
+
if (!acc[section])
|
|
162
|
+
acc[section] = [];
|
|
163
|
+
acc[section].push(m);
|
|
164
|
+
return acc;
|
|
165
|
+
}, {});
|
|
166
|
+
const panelClasses = isFullScreen
|
|
167
|
+
? "w-full h-full flex flex-col"
|
|
168
|
+
: "flex flex-col h-full w-full md:w-80 border-l border-gray-200 dark:border-gray-700";
|
|
169
|
+
return (_jsxs("div", { className: `bg-white dark:bg-gray-900 ${panelClasses}`, children: [_jsx("div", { className: "p-4 border-b border-gray-200 dark:border-gray-700 flex-shrink-0", children: _jsx("h3", { className: "font-semibold text-gray-900 dark:text-white", children: "Milestones" }) }), _jsx("div", { className: "flex-1 overflow-y-auto p-4 space-y-4", children: !isFeatureEnabled ? (_jsxs("div", { className: "flex flex-col items-center justify-center h-full py-12 px-6 text-center", children: [_jsx("div", { className: "mb-4 p-4 bg-teal-50 dark:bg-teal-900/20 rounded-full", children: _jsx(ListTodo, { className: "w-12 h-12 text-teal-500" }) }), _jsx("h3", { className: "text-lg font-semibold text-gray-900 dark:text-white mb-2", children: "Milestones Feature" }), _jsx("p", { className: "text-sm text-gray-600 dark:text-gray-400 mb-4 max-w-sm", children: "Track group tasks, organize by sections, and monitor progress together. Perfect for trip planning and group coordination." }), isAdmin ? (_jsxs(Button, { onClick: onEnableFeature, className: "bg-gradient-to-r from-teal-500 to-cyan-600 hover:from-teal-600 hover:to-cyan-700 text-white", children: [_jsx(Unlock, { className: "w-4 h-4 mr-2" }), "Enable Feature"] })) : (_jsxs("div", { className: "flex items-center gap-2 text-sm text-gray-500", children: [_jsx(Lock, { className: "w-4 h-4" }), "Ask admin to enable this feature"] }))] })) : loading ? (_jsx("div", { className: "flex justify-center py-8", children: _jsx("div", { className: "animate-spin w-5 h-5 border-2 border-teal-500 border-t-transparent rounded-full" }) })) : milestones.length === 0 && !isAdding ? (_jsx("div", { className: "text-center py-8 text-gray-400 text-sm", children: "No milestones yet" })) : (_jsxs(_Fragment, { children: [isAdding && (_jsxs("div", { className: "p-4 bg-gray-50 dark:bg-gray-800 rounded-lg space-y-3", children: [_jsx(SearchBox, { titles: sections, id: "milestone-section", placeholder: "Section (e.g., Day 1, Transport)", searchQuery: newSection, setSearchQuery: setNewSection, handleAdd: setNewSection, clearOnSubmit: false }), _jsx(Input, { placeholder: "Milestone title *", value: newTitle, onChange: (e) => setNewTitle(e.target.value), onKeyDown: (e) => e.key === "Enter" && !showMoreOptions && handleCreate(), className: "text-sm font-medium", autoFocus: true }), _jsxs("button", { type: "button", onClick: () => setShowMoreOptions((current) => !current), "aria-expanded": showMoreOptions, className: "flex w-full items-center justify-between rounded-xl border border-slate-200 bg-white px-3 py-2.5 text-left shadow-sm transition-colors hover:border-teal-300 hover:bg-teal-50/40 dark:border-slate-700 dark:bg-slate-900 dark:hover:border-teal-700 dark:hover:bg-teal-950/20", children: [_jsxs("span", { className: "flex items-center gap-2.5", children: [_jsx("span", { className: "rounded-lg bg-teal-100 p-1.5 text-teal-700 dark:bg-teal-900/40 dark:text-teal-300", children: _jsx(SlidersHorizontal, { className: "h-4 w-4" }) }), _jsxs("span", { children: [_jsx("span", { className: "block text-sm font-medium text-slate-800 dark:text-slate-100", children: "More options" }), _jsx("span", { className: "block text-xs text-slate-500 dark:text-slate-400", children: "Description and due date" })] })] }), _jsx(ChevronDown, { className: `h-4 w-4 text-slate-500 transition-transform ${showMoreOptions ? "rotate-180" : ""}` })] }), showMoreOptions && (_jsxs("div", { className: "space-y-3 rounded-xl border border-teal-100 bg-white p-3 shadow-sm dark:border-teal-900/60 dark:bg-slate-900", children: [_jsx(Textarea, { placeholder: "Description (optional)", value: newDescription, onChange: (e) => setNewDescription(e.target.value), className: "text-sm resize-none", rows: 2 }), _jsx(DatePicker, { label: "Due date (optional)", field: { value: newDueDate, onChange: setNewDueDate }, onClear: () => setNewDueDate(null) })] })), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { onClick: handleCreate, size: "sm", className: "flex-1 bg-gradient-to-r from-teal-500 to-cyan-600 hover:from-teal-600 hover:to-cyan-700", children: "Add" }), _jsx(Button, { onClick: resetForm, size: "sm", variant: "outline", children: "Cancel" })] })] })), milestones.length > 0 && (Object.entries(groupedMilestones).map(([section, items]) => {
|
|
170
|
+
const isExpanded = expandedSections.has(section);
|
|
171
|
+
const completedCount = items.filter(m => m.isCompleted).length;
|
|
172
|
+
const totalCount = items.length;
|
|
173
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsxs("button", { onClick: () => toggleSection(section), className: "w-full flex items-center justify-between p-3 bg-gradient-to-r from-teal-50 to-cyan-50 dark:from-teal-900/20 dark:to-cyan-900/20 hover:from-teal-100 hover:to-cyan-100 dark:hover:from-teal-900/30 dark:hover:to-cyan-900/30 rounded-lg border border-teal-100 dark:border-teal-800 transition-colors", children: [_jsxs("div", { className: "flex items-center gap-3 flex-1 text-left", children: [_jsx(ChevronDown, { className: `w-4 h-4 text-teal-600 dark:text-teal-400 transition-transform flex-shrink-0 ${isExpanded ? "" : "-rotate-90"}` }), _jsx("h4", { className: "text-sm font-semibold text-teal-900 dark:text-teal-100 uppercase tracking-widest", children: section })] }), _jsxs("span", { className: "text-xs font-semibold text-teal-700 dark:text-teal-300 bg-white dark:bg-gray-800 px-2.5 py-1 rounded-full flex-shrink-0", children: [completedCount, "/", totalCount] })] }), isExpanded && (_jsx("div", { className: "space-y-2 pl-4", children: items.map((milestone) => {
|
|
174
|
+
const userChecked = hasUserChecked(milestone);
|
|
175
|
+
const uncheckedUsers = getUncheckedUsers(milestone);
|
|
176
|
+
const checkedUsers = getCheckedUsers(milestone);
|
|
177
|
+
const isExpanded = expandedMilestones.has(milestone._id);
|
|
178
|
+
return (_jsxs("div", { className: "space-y-0", children: [_jsxs("div", { role: "button", tabIndex: 0, onClick: () => toggleMilestoneExpand(milestone._id), onContextMenu: (event) => {
|
|
179
|
+
event.preventDefault();
|
|
180
|
+
setOpenMilestoneMenuId(milestone._id);
|
|
181
|
+
}, onKeyDown: (event) => {
|
|
182
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
183
|
+
event.preventDefault();
|
|
184
|
+
toggleMilestoneExpand(milestone._id);
|
|
185
|
+
}
|
|
186
|
+
}, className: "w-full flex items-start gap-3 p-3 bg-gray-50 dark:bg-gray-800/30 hover:bg-gray-100 dark:hover:bg-gray-800/50 rounded-lg border border-gray-100 dark:border-gray-800 transition-colors group text-left", children: [_jsx("button", { onClick: (e) => {
|
|
187
|
+
e.stopPropagation();
|
|
188
|
+
handleToggle(milestone._id);
|
|
189
|
+
}, className: `mt-0.5 transition-colors flex-shrink-0 ${userChecked ? "text-green-500" : "text-gray-300 hover:text-teal-400"}`, children: userChecked ? _jsx(CheckCircle2, { className: "w-5 h-5" }) : _jsx(Circle, { className: "w-5 h-5" }) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("p", { className: `text-sm font-medium transition-all ${userChecked ? "text-gray-400 line-through" : "text-gray-700 dark:text-gray-200"}`, children: milestone.title }), milestone.dueDate && (_jsxs("p", { className: "text-[10px] text-gray-500 dark:text-gray-400 mt-1", children: ["Due: ", new Date(milestone.dueDate).toLocaleDateString()] }))] }), _jsxs("div", { className: "flex items-center gap-2 flex-shrink-0", children: [_jsxs("span", { className: `text-xs font-semibold px-2 py-1 rounded-full ${milestone.isCompleted
|
|
190
|
+
? "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400"
|
|
191
|
+
: "bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300"}`, children: [milestone.checks.length, "/", participants.length] }), _jsx(ChevronDown, { className: `w-4 h-4 text-gray-400 transition-transform flex-shrink-0 ${isExpanded ? "" : "-rotate-90"}` })] }), _jsxs(DropdownMenu, { open: openMilestoneMenuId === milestone._id, onOpenChange: (open) => setOpenMilestoneMenuId(open ? milestone._id : null), children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { onClick: (e) => e.stopPropagation(), className: "p-1 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-md transition-all flex-shrink-0", children: _jsx(MoreVertical, { className: "w-4 h-4 text-gray-400" }) }) }), _jsxs(DropdownMenuContent, { align: "end", children: [_jsxs(DropdownMenuItem, { onClick: (event) => {
|
|
192
|
+
event.stopPropagation();
|
|
193
|
+
setOpenMilestoneMenuId(null);
|
|
194
|
+
void handleToggle(milestone._id);
|
|
195
|
+
}, children: [userChecked ? _jsx(Circle, { className: "w-4 h-4 mr-2" }) : _jsx(CheckCircle2, { className: "w-4 h-4 mr-2" }), userChecked ? "Uncheck milestone" : "Check milestone"] }), _jsxs(DropdownMenuItem, { onClick: (event) => {
|
|
196
|
+
event.stopPropagation();
|
|
197
|
+
showMemberProgress(milestone._id);
|
|
198
|
+
}, children: [_jsx(ListTodo, { className: "w-4 h-4 mr-2" }), "View member progress"] }), (isSameChatActor(milestone.createdBy, currentActor) || isAdmin) && _jsxs(DropdownMenuItem, { onClick: (event) => {
|
|
199
|
+
event.stopPropagation();
|
|
200
|
+
setOpenMilestoneMenuId(null);
|
|
201
|
+
handleEdit(milestone);
|
|
202
|
+
}, children: [_jsx(Pencil, { className: "w-4 h-4 mr-2" }), "Edit"] }), (isSameChatActor(milestone.createdBy, currentActor) || isAdmin) && _jsxs(DropdownMenuItem, { className: "text-red-500", onClick: (event) => {
|
|
203
|
+
event.stopPropagation();
|
|
204
|
+
setOpenMilestoneMenuId(null);
|
|
205
|
+
void handleDelete(milestone._id);
|
|
206
|
+
}, children: [_jsx(Trash2, { className: "w-4 h-4 mr-2" }), "Delete"] })] })] })] }), isExpanded && (_jsxs("div", { className: "w-full rounded-xl border border-slate-200 bg-white p-4 shadow-sm dark:border-slate-700 dark:bg-slate-800/50 space-y-4", children: [milestone.description && (_jsxs("div", { className: "rounded-lg bg-slate-50 px-3 py-2.5 dark:bg-slate-900/40", children: [_jsx("p", { className: "text-[10px] font-semibold text-slate-500 uppercase tracking-wider mb-1", children: "Description" }), _jsx("p", { className: "text-sm text-slate-700 dark:text-slate-300", children: milestone.description })] })), _jsxs("div", { className: "flex items-center justify-between border-b border-slate-100 pb-2 dark:border-slate-700", children: [_jsx("p", { className: "text-xs font-semibold uppercase tracking-wider text-slate-600 dark:text-slate-300", children: "Member progress" }), _jsxs("span", { className: "rounded-full bg-teal-50 px-2 py-1 text-xs font-semibold text-teal-700 dark:bg-teal-900/30 dark:text-teal-300", children: [checkedUsers.length, " of ", participants.length, " checked"] })] }), checkedUsers.length > 0 && (_jsxs("div", { children: [_jsxs("p", { className: "mb-2 text-[10px] font-semibold uppercase tracking-wider text-emerald-700 dark:text-emerald-300", children: ["Completed (", checkedUsers.length, ")"] }), _jsx("div", { className: "flex flex-wrap gap-2", children: checkedUsers.map((participant) => (_jsxs("div", { className: "flex items-center gap-1.5 rounded-full bg-emerald-50 py-1 pl-1 pr-2.5 text-xs font-medium text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-200", children: [_jsx(CheckCircle2, { className: "h-3.5 w-3.5" }), participantLabel(participant)] }, participant.actorId))) })] })), uncheckedUsers.length > 0 && (_jsxs("div", { children: [_jsxs("p", { className: "mb-2 text-[10px] font-semibold text-amber-700 dark:text-amber-300 uppercase tracking-wider", children: ["Pending (", uncheckedUsers.length, ")"] }), _jsx("div", { className: "flex flex-wrap gap-2", children: uncheckedUsers.map((participant) => (_jsxs("div", { className: "flex items-center gap-1.5 rounded-full bg-amber-50 py-1 pl-1 pr-2.5 text-xs font-medium text-amber-800 dark:bg-amber-900/20 dark:text-amber-200", children: [_jsx(AlertCircle, { className: "w-3.5 h-3.5 flex-shrink-0" }), _jsx("span", { children: participantLabel(participant) })] }, participant.actorId))) })] })), milestone.isCompleted && (_jsxs("div", { className: "flex items-center gap-2 p-2 bg-green-50 dark:bg-green-900/20 rounded border border-green-200 dark:border-green-800/30", children: [_jsx(CheckCircle2, { className: "w-4 h-4 text-green-600 dark:text-green-400 flex-shrink-0" }), _jsx("p", { className: "text-xs text-green-700 dark:text-green-400 font-medium", children: "All participants have checked this milestone" })] }))] }))] }, milestone._id));
|
|
207
|
+
}) }))] }, section));
|
|
208
|
+
}))] })) }), isFeatureEnabled && !isAdding && (_jsx("div", { className: "p-4 border-t border-gray-200 dark:border-gray-700 flex-shrink-0", children: _jsxs(Button, { onClick: () => setIsAdding(true), className: "w-full bg-gradient-to-r from-teal-500 to-cyan-600 hover:from-teal-600 hover:to-cyan-700 text-white rounded-lg flex items-center justify-center gap-2", children: [_jsx(Plus, { className: "w-4 h-4" }), "Add Milestone"] }) }))] }));
|
|
209
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ChatActorRef, type Conversation, type ExpenseSplit } from "@myrjfa/state/dist/lib/models/chat";
|
|
2
|
+
import { Dispatch, SetStateAction } from "react";
|
|
3
|
+
interface ParticipantSelectorProps {
|
|
4
|
+
participants: ChatActorRef[];
|
|
5
|
+
onChange: (participants: ChatActorRef[]) => void;
|
|
6
|
+
onSplitsChange: Dispatch<SetStateAction<ExpenseSplit[]>>;
|
|
7
|
+
availableUsers: Conversation["participants"];
|
|
8
|
+
}
|
|
9
|
+
export declare function ParticipantSelector({ participants, onChange, onSplitsChange, availableUsers }: ParticipantSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=ParticipantSelector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParticipantSelector.d.ts","sourceRoot":"","sources":["../../../src/chat/components/ParticipantSelector.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGH,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjD,UAAU,wBAAwB;IAC9B,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IACjD,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACzD,cAAc,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;CAChD;AAED,wBAAgB,mBAAmB,CAAC,EAChC,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,cAAc,EACjB,EAAE,wBAAwB,2CAuE1B"}
|