@retinalabsllc/zairusjs 16.2.0 → 16.2.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/dist/index.d.mts +29 -3
- package/dist/index.d.ts +29 -3
- package/dist/index.js +375 -0
- package/dist/index.mjs +389 -0
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1071,7 +1071,7 @@ interface UniversalHome2Props {
|
|
|
1071
1071
|
}
|
|
1072
1072
|
declare const UniversalHome2: React.FC<UniversalHome2Props>;
|
|
1073
1073
|
|
|
1074
|
-
interface UniversalMember2 {
|
|
1074
|
+
interface UniversalMember2$1 {
|
|
1075
1075
|
id: string;
|
|
1076
1076
|
userId: string;
|
|
1077
1077
|
fullName: string;
|
|
@@ -1082,7 +1082,7 @@ interface UniversalMember2 {
|
|
|
1082
1082
|
interface UniversalSettingsProps {
|
|
1083
1083
|
accountType: 'INDIVIDUAL' | 'ORGANIZATION';
|
|
1084
1084
|
userRole?: 'ADMIN' | 'MANAGER' | 'MEMBER' | 'GUEST' | string;
|
|
1085
|
-
members?: UniversalMember2[];
|
|
1085
|
+
members?: UniversalMember2$1[];
|
|
1086
1086
|
isMembersLoading?: boolean;
|
|
1087
1087
|
membersCurrentPage?: number;
|
|
1088
1088
|
membersTotalPages?: number;
|
|
@@ -1115,4 +1115,30 @@ interface UniversalSettingsProps {
|
|
|
1115
1115
|
}
|
|
1116
1116
|
declare const UniversalSettings: React.FC<UniversalSettingsProps>;
|
|
1117
1117
|
|
|
1118
|
-
|
|
1118
|
+
interface UniversalMember2 {
|
|
1119
|
+
id: string;
|
|
1120
|
+
userId: string;
|
|
1121
|
+
fullName: string;
|
|
1122
|
+
avatarUrl?: string | null;
|
|
1123
|
+
role: string;
|
|
1124
|
+
}
|
|
1125
|
+
interface UniversalCreateHuddleProps {
|
|
1126
|
+
onBackHref: string;
|
|
1127
|
+
members: UniversalMember2[];
|
|
1128
|
+
isMembersLoading: boolean;
|
|
1129
|
+
membersCurrentPage: number;
|
|
1130
|
+
membersTotalPages: number;
|
|
1131
|
+
onMembersPageChange: (page: number) => void;
|
|
1132
|
+
membersSearchQuery: string;
|
|
1133
|
+
onMembersSearchChange: (query: string) => void;
|
|
1134
|
+
onCreateSubmit: (payload: {
|
|
1135
|
+
title: string;
|
|
1136
|
+
huddleType: 'PUBLIC' | 'PRIVATE';
|
|
1137
|
+
startTime: string;
|
|
1138
|
+
timezone: string;
|
|
1139
|
+
participantIds: string[];
|
|
1140
|
+
}) => Promise<void>;
|
|
1141
|
+
}
|
|
1142
|
+
declare const UniversalCreateHuddle: React.FC<UniversalCreateHuddleProps>;
|
|
1143
|
+
|
|
1144
|
+
export { AppBento2, type AppBento2Props, type BannerProps, type BarIconProps, type BentoFeature, type BoardMember, type CardData, CardInfoDialog, type CardInfoDialogProps, type CompanyDetails, type ConsultantProfile, ConsultantShowcase, type ConsultantShowcaseProps, ContentGridBlock, type ContentGridBlockProps, type CryptoOption, type DocumentSectionData, type EmailContact, Faq, type FaqItem, type FaqProps, FeatureScroll, type FeatureScrollProps, type FiatCurrencyOption, Footer, type FooterColumn, type FooterLink, type FooterProps, FundCardDialog, type FundCardDialogProps, GifFeatureCard, type GifFeatureCardProps, Header, type HeaderLink, type HeaderProps, type AppLogo$1 as HeroAppLogo, HeroSection, type HeroSectionProps, type HomeActionBtn, type HomeActionBtn2, type LeaderboardItem, ManagedBoardBlock, type ManagedBoardBlockProps, ManagedContactBlock, type ManagedContactBlockProps, ManagedDocument, type ManagedDocumentProps, ManagedNewsletterSplitBlock, type ManagedNewsletterSplitBlockProps, ManagedNotFoundBlock, type ManagedNotFoundBlockProps, ManagedPricingBlock, type ManagedPricingBlockProps, ManagedProjectsBlock, type ManagedProjectsBlockProps, ManagedToaster, MedicalFeatureStatsBlock, MobileNav, type MobileNavItem, type MobileNavProps, type NavItem, type NetworkOption, type NotificationItem, type NotificationItem2, NumberInput, type NumberInputProps, PageSpinner, type PageSpinnerProps, PinDialerBottomSheet, type PinDialerBottomSheetProps, PipleAuth, type PipleAuthProps, type PlatformFeatureItem, PlatformFeatures, type PlatformFeaturesProps, PortfolioHero, type PortfolioHeroProps, type AppLogo as PricingAppLogo, type PricingFeature, type PricingFeature2, type PricingPlan, type PricingTab, type ProjectItem, type RateCalculationPayload, type ReferralProfile, type RewardItem, type RewardProfile, type ScrollFeature, type SocialContact, type SocialLink, type StatItem, TextInput, type TextInputProps, ThreeDActionButton, type ThreeDActionButtonProps, ThreeDButton, type ThreeDButtonProps, type TierOption, UniversalBuyCryptoPage, type UniversalBuyCryptoPageProps, UniversalCardActionPage, type UniversalCardActionPageProps, UniversalCardPage, type UniversalCardPageProps, UniversalCreateHuddle, type UniversalCreateHuddleProps, UniversalErrorView, type UniversalErrorViewProps, UniversalHome2, type UniversalHome2Props, UniversalHomeView, type UniversalHomeViewProps, type UniversalHuddle, UniversalHuddlesPage, type UniversalHuddlesPageProps, type UniversalMember, type UniversalMember2$1 as UniversalMember2, UniversalMembersPage, type UniversalMembersPageProps, UniversalOrganizationPage, type UniversalOrganizationPageProps, UniversalProfilePage, type UniversalProfilePageProps, UniversalProfileSettings, type UniversalProfileSettingsProps, type UniversalReferralItem, UniversalReferralPage, type UniversalReferralPageProps, UniversalRewardPage, type UniversalRewardPageProps, UniversalSecurityPage, type UniversalSecurityPageProps, UniversalSettings, type UniversalSettingsProps, UniversalSidebar, type UniversalSidebarProps, type UniversalTransaction, UniversalTransactionPage, type UniversalTransactionPageProps, UniversalVerificationPage, type UniversalVerificationPageProps, type UniversalWallet, UniversalWalletPage, type UniversalWalletPageProps, type VerificationStatus, WaitlistDialog, type WaitlistDialogProps };
|
package/dist/index.d.ts
CHANGED
|
@@ -1071,7 +1071,7 @@ interface UniversalHome2Props {
|
|
|
1071
1071
|
}
|
|
1072
1072
|
declare const UniversalHome2: React.FC<UniversalHome2Props>;
|
|
1073
1073
|
|
|
1074
|
-
interface UniversalMember2 {
|
|
1074
|
+
interface UniversalMember2$1 {
|
|
1075
1075
|
id: string;
|
|
1076
1076
|
userId: string;
|
|
1077
1077
|
fullName: string;
|
|
@@ -1082,7 +1082,7 @@ interface UniversalMember2 {
|
|
|
1082
1082
|
interface UniversalSettingsProps {
|
|
1083
1083
|
accountType: 'INDIVIDUAL' | 'ORGANIZATION';
|
|
1084
1084
|
userRole?: 'ADMIN' | 'MANAGER' | 'MEMBER' | 'GUEST' | string;
|
|
1085
|
-
members?: UniversalMember2[];
|
|
1085
|
+
members?: UniversalMember2$1[];
|
|
1086
1086
|
isMembersLoading?: boolean;
|
|
1087
1087
|
membersCurrentPage?: number;
|
|
1088
1088
|
membersTotalPages?: number;
|
|
@@ -1115,4 +1115,30 @@ interface UniversalSettingsProps {
|
|
|
1115
1115
|
}
|
|
1116
1116
|
declare const UniversalSettings: React.FC<UniversalSettingsProps>;
|
|
1117
1117
|
|
|
1118
|
-
|
|
1118
|
+
interface UniversalMember2 {
|
|
1119
|
+
id: string;
|
|
1120
|
+
userId: string;
|
|
1121
|
+
fullName: string;
|
|
1122
|
+
avatarUrl?: string | null;
|
|
1123
|
+
role: string;
|
|
1124
|
+
}
|
|
1125
|
+
interface UniversalCreateHuddleProps {
|
|
1126
|
+
onBackHref: string;
|
|
1127
|
+
members: UniversalMember2[];
|
|
1128
|
+
isMembersLoading: boolean;
|
|
1129
|
+
membersCurrentPage: number;
|
|
1130
|
+
membersTotalPages: number;
|
|
1131
|
+
onMembersPageChange: (page: number) => void;
|
|
1132
|
+
membersSearchQuery: string;
|
|
1133
|
+
onMembersSearchChange: (query: string) => void;
|
|
1134
|
+
onCreateSubmit: (payload: {
|
|
1135
|
+
title: string;
|
|
1136
|
+
huddleType: 'PUBLIC' | 'PRIVATE';
|
|
1137
|
+
startTime: string;
|
|
1138
|
+
timezone: string;
|
|
1139
|
+
participantIds: string[];
|
|
1140
|
+
}) => Promise<void>;
|
|
1141
|
+
}
|
|
1142
|
+
declare const UniversalCreateHuddle: React.FC<UniversalCreateHuddleProps>;
|
|
1143
|
+
|
|
1144
|
+
export { AppBento2, type AppBento2Props, type BannerProps, type BarIconProps, type BentoFeature, type BoardMember, type CardData, CardInfoDialog, type CardInfoDialogProps, type CompanyDetails, type ConsultantProfile, ConsultantShowcase, type ConsultantShowcaseProps, ContentGridBlock, type ContentGridBlockProps, type CryptoOption, type DocumentSectionData, type EmailContact, Faq, type FaqItem, type FaqProps, FeatureScroll, type FeatureScrollProps, type FiatCurrencyOption, Footer, type FooterColumn, type FooterLink, type FooterProps, FundCardDialog, type FundCardDialogProps, GifFeatureCard, type GifFeatureCardProps, Header, type HeaderLink, type HeaderProps, type AppLogo$1 as HeroAppLogo, HeroSection, type HeroSectionProps, type HomeActionBtn, type HomeActionBtn2, type LeaderboardItem, ManagedBoardBlock, type ManagedBoardBlockProps, ManagedContactBlock, type ManagedContactBlockProps, ManagedDocument, type ManagedDocumentProps, ManagedNewsletterSplitBlock, type ManagedNewsletterSplitBlockProps, ManagedNotFoundBlock, type ManagedNotFoundBlockProps, ManagedPricingBlock, type ManagedPricingBlockProps, ManagedProjectsBlock, type ManagedProjectsBlockProps, ManagedToaster, MedicalFeatureStatsBlock, MobileNav, type MobileNavItem, type MobileNavProps, type NavItem, type NetworkOption, type NotificationItem, type NotificationItem2, NumberInput, type NumberInputProps, PageSpinner, type PageSpinnerProps, PinDialerBottomSheet, type PinDialerBottomSheetProps, PipleAuth, type PipleAuthProps, type PlatformFeatureItem, PlatformFeatures, type PlatformFeaturesProps, PortfolioHero, type PortfolioHeroProps, type AppLogo as PricingAppLogo, type PricingFeature, type PricingFeature2, type PricingPlan, type PricingTab, type ProjectItem, type RateCalculationPayload, type ReferralProfile, type RewardItem, type RewardProfile, type ScrollFeature, type SocialContact, type SocialLink, type StatItem, TextInput, type TextInputProps, ThreeDActionButton, type ThreeDActionButtonProps, ThreeDButton, type ThreeDButtonProps, type TierOption, UniversalBuyCryptoPage, type UniversalBuyCryptoPageProps, UniversalCardActionPage, type UniversalCardActionPageProps, UniversalCardPage, type UniversalCardPageProps, UniversalCreateHuddle, type UniversalCreateHuddleProps, UniversalErrorView, type UniversalErrorViewProps, UniversalHome2, type UniversalHome2Props, UniversalHomeView, type UniversalHomeViewProps, type UniversalHuddle, UniversalHuddlesPage, type UniversalHuddlesPageProps, type UniversalMember, type UniversalMember2$1 as UniversalMember2, UniversalMembersPage, type UniversalMembersPageProps, UniversalOrganizationPage, type UniversalOrganizationPageProps, UniversalProfilePage, type UniversalProfilePageProps, UniversalProfileSettings, type UniversalProfileSettingsProps, type UniversalReferralItem, UniversalReferralPage, type UniversalReferralPageProps, UniversalRewardPage, type UniversalRewardPageProps, UniversalSecurityPage, type UniversalSecurityPageProps, UniversalSettings, type UniversalSettingsProps, UniversalSidebar, type UniversalSidebarProps, type UniversalTransaction, UniversalTransactionPage, type UniversalTransactionPageProps, UniversalVerificationPage, type UniversalVerificationPageProps, type UniversalWallet, UniversalWalletPage, type UniversalWalletPageProps, type VerificationStatus, WaitlistDialog, type WaitlistDialogProps };
|
package/dist/index.js
CHANGED
|
@@ -64,6 +64,7 @@ __export(index_exports, {
|
|
|
64
64
|
UniversalBuyCryptoPage: () => UniversalBuyCryptoPage,
|
|
65
65
|
UniversalCardActionPage: () => UniversalCardActionPage,
|
|
66
66
|
UniversalCardPage: () => UniversalCardPage,
|
|
67
|
+
UniversalCreateHuddle: () => UniversalCreateHuddle,
|
|
67
68
|
UniversalErrorView: () => UniversalErrorView,
|
|
68
69
|
UniversalHome2: () => UniversalHome2,
|
|
69
70
|
UniversalHomeView: () => UniversalHomeView,
|
|
@@ -5529,6 +5530,379 @@ var UniversalSettings = ({
|
|
|
5529
5530
|
/* @__PURE__ */ import_react85.default.createElement(import_react86.HugeiconsIcon, { icon: import_core_free_icons31.PlusSignIcon, size: 16 })
|
|
5530
5531
|
)), /* @__PURE__ */ import_react85.default.createElement("div", { className: "mt-4 px-1" }, /* @__PURE__ */ import_react85.default.createElement("p", { className: "text-[11px] text-neutral-500 leading-relaxed max-w-lg" }, "AI credits are consumed when generating intelligent summaries, transcriptions, and automated huddle insights. Additional credits are billed dynamically to your primary payment method."))));
|
|
5531
5532
|
};
|
|
5533
|
+
|
|
5534
|
+
// src/components/UniversalCreateHuddle.tsx
|
|
5535
|
+
var import_react89 = __toESM(require("react"));
|
|
5536
|
+
var import_react_hot_toast16 = __toESM(require("react-hot-toast"));
|
|
5537
|
+
var import_react90 = require("@hugeicons/react");
|
|
5538
|
+
var import_core_free_icons33 = require("@hugeicons/core-free-icons");
|
|
5539
|
+
|
|
5540
|
+
// src/components/CalendarPicker.tsx
|
|
5541
|
+
var import_react87 = __toESM(require("react"));
|
|
5542
|
+
var import_react88 = require("@hugeicons/react");
|
|
5543
|
+
var import_core_free_icons32 = require("@hugeicons/core-free-icons");
|
|
5544
|
+
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
5545
|
+
var DAYS_OF_WEEK = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
|
|
5546
|
+
var CalendarPicker = ({
|
|
5547
|
+
isOpen,
|
|
5548
|
+
onClose,
|
|
5549
|
+
initialDate,
|
|
5550
|
+
defaultMode,
|
|
5551
|
+
onConfirm
|
|
5552
|
+
}) => {
|
|
5553
|
+
const [mode, setMode] = (0, import_react87.useState)(defaultMode);
|
|
5554
|
+
const today = /* @__PURE__ */ new Date();
|
|
5555
|
+
today.setHours(0, 0, 0, 0);
|
|
5556
|
+
const maxDate = new Date(today.getFullYear() + 1, 11, 31);
|
|
5557
|
+
maxDate.setHours(23, 59, 59, 999);
|
|
5558
|
+
const [viewMonth, setViewMonth] = (0, import_react87.useState)(initialDate.getMonth());
|
|
5559
|
+
const [viewYear, setViewYear] = (0, import_react87.useState)(initialDate.getFullYear());
|
|
5560
|
+
const [selectedDate, setSelectedDate] = (0, import_react87.useState)(new Date(initialDate.getFullYear(), initialDate.getMonth(), initialDate.getDate()));
|
|
5561
|
+
const [hour, setHour] = (0, import_react87.useState)(initialDate.getHours() % 12 || 12);
|
|
5562
|
+
const [minute, setMinute] = (0, import_react87.useState)(initialDate.getMinutes());
|
|
5563
|
+
const [ampm, setAmpm] = (0, import_react87.useState)(initialDate.getHours() >= 12 ? "PM" : "AM");
|
|
5564
|
+
(0, import_react87.useEffect)(() => {
|
|
5565
|
+
if (isOpen) {
|
|
5566
|
+
setMode(defaultMode);
|
|
5567
|
+
setViewMonth(initialDate.getMonth());
|
|
5568
|
+
setViewYear(initialDate.getFullYear());
|
|
5569
|
+
setSelectedDate(new Date(initialDate.getFullYear(), initialDate.getMonth(), initialDate.getDate()));
|
|
5570
|
+
setHour(initialDate.getHours() % 12 || 12);
|
|
5571
|
+
setMinute(initialDate.getMinutes());
|
|
5572
|
+
setAmpm(initialDate.getHours() >= 12 ? "PM" : "AM");
|
|
5573
|
+
}
|
|
5574
|
+
}, [isOpen, initialDate, defaultMode]);
|
|
5575
|
+
if (!isOpen) return null;
|
|
5576
|
+
const handlePrevMonth = () => {
|
|
5577
|
+
if (viewYear === today.getFullYear() && viewMonth === today.getMonth()) return;
|
|
5578
|
+
if (viewMonth === 0) {
|
|
5579
|
+
setViewMonth(11);
|
|
5580
|
+
setViewYear((y) => y - 1);
|
|
5581
|
+
} else {
|
|
5582
|
+
setViewMonth((m) => m - 1);
|
|
5583
|
+
}
|
|
5584
|
+
};
|
|
5585
|
+
const handleNextMonth = () => {
|
|
5586
|
+
if (viewYear === maxDate.getFullYear() && viewMonth === 11) return;
|
|
5587
|
+
if (viewMonth === 11) {
|
|
5588
|
+
setViewMonth(0);
|
|
5589
|
+
setViewYear((y) => y + 1);
|
|
5590
|
+
} else {
|
|
5591
|
+
setViewMonth((m) => m + 1);
|
|
5592
|
+
}
|
|
5593
|
+
};
|
|
5594
|
+
const isDateDisabled = (year, month, day) => {
|
|
5595
|
+
const d = new Date(year, month, day);
|
|
5596
|
+
return d < today || d > maxDate;
|
|
5597
|
+
};
|
|
5598
|
+
const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();
|
|
5599
|
+
const firstDayOffset = new Date(viewYear, viewMonth, 1).getDay();
|
|
5600
|
+
const adjustTime = (type, dir) => {
|
|
5601
|
+
if (type === "H") {
|
|
5602
|
+
setHour((h) => {
|
|
5603
|
+
let next = h + dir;
|
|
5604
|
+
if (next > 12) return 1;
|
|
5605
|
+
if (next < 1) return 12;
|
|
5606
|
+
return next;
|
|
5607
|
+
});
|
|
5608
|
+
}
|
|
5609
|
+
if (type === "M") {
|
|
5610
|
+
setMinute((m) => {
|
|
5611
|
+
let next = m + dir;
|
|
5612
|
+
if (next > 59) return 0;
|
|
5613
|
+
if (next < 0) return 59;
|
|
5614
|
+
return next;
|
|
5615
|
+
});
|
|
5616
|
+
}
|
|
5617
|
+
if (type === "A") {
|
|
5618
|
+
setAmpm((a) => a === "AM" ? "PM" : "AM");
|
|
5619
|
+
}
|
|
5620
|
+
};
|
|
5621
|
+
const handleSave = () => {
|
|
5622
|
+
const final = new Date(selectedDate);
|
|
5623
|
+
let h24 = hour;
|
|
5624
|
+
if (ampm === "PM" && hour < 12) h24 += 12;
|
|
5625
|
+
if (ampm === "AM" && hour === 12) h24 = 0;
|
|
5626
|
+
final.setHours(h24, minute, 0, 0);
|
|
5627
|
+
onConfirm(final);
|
|
5628
|
+
onClose();
|
|
5629
|
+
};
|
|
5630
|
+
return /* @__PURE__ */ import_react87.default.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react87.default.createElement("div", { className: "absolute inset-0 bg-black/40", onClick: onClose }), /* @__PURE__ */ import_react87.default.createElement("div", { className: "relative w-full max-w-sm bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react87.default.createElement("div", { className: "p-4 pb-0 flex flex-col gap-4" }, /* @__PURE__ */ import_react87.default.createElement("div", { className: "flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react87.default.createElement("h3", { className: "text-[15px] text-black tracking-tight " }, "Select Date & Time"), /* @__PURE__ */ import_react87.default.createElement("button", { onClick: onClose, className: "text-neutral-400 hover:text-black transition-colors outline-none" }, /* @__PURE__ */ import_react87.default.createElement(import_react88.HugeiconsIcon, { icon: import_core_free_icons32.CancelCircleIcon, size: 18 }))), /* @__PURE__ */ import_react87.default.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ import_react87.default.createElement(
|
|
5631
|
+
"button",
|
|
5632
|
+
{
|
|
5633
|
+
onClick: () => setMode("DATE"),
|
|
5634
|
+
className: `pb-2 text-[12px] tracking-wide outline-none border-b-2 transition-colors ${mode === "DATE" ? "border-[#068afe] text-[#068afe]" : "border-transparent text-neutral-500 hover:text-black"}`
|
|
5635
|
+
},
|
|
5636
|
+
"Date"
|
|
5637
|
+
), /* @__PURE__ */ import_react87.default.createElement(
|
|
5638
|
+
"button",
|
|
5639
|
+
{
|
|
5640
|
+
onClick: () => setMode("TIME"),
|
|
5641
|
+
className: `pb-2 text-[12px] tracking-wide outline-none border-b-2 transition-colors ${mode === "TIME" ? "border-[#068afe] text-[#068afe]" : "border-transparent text-neutral-500 hover:text-black"}`
|
|
5642
|
+
},
|
|
5643
|
+
"Time"
|
|
5644
|
+
))), /* @__PURE__ */ import_react87.default.createElement("div", { className: "p-5" }, mode === "DATE" && /* @__PURE__ */ import_react87.default.createElement("div", { className: "flex flex-col gap-4 animate-in fade-in duration-200" }, /* @__PURE__ */ import_react87.default.createElement("div", { className: "flex items-center justify-between px-2" }, /* @__PURE__ */ import_react87.default.createElement("span", { className: "text-[13px] text-black" }, MONTHS[viewMonth], " ", viewYear), /* @__PURE__ */ import_react87.default.createElement("div", { className: "flex gap-1" }, /* @__PURE__ */ import_react87.default.createElement(
|
|
5645
|
+
"button",
|
|
5646
|
+
{
|
|
5647
|
+
onClick: handlePrevMonth,
|
|
5648
|
+
disabled: viewYear === today.getFullYear() && viewMonth === today.getMonth(),
|
|
5649
|
+
className: "w-8 h-8 flex items-center justify-center rounded-full hover:bg-neutral-100 disabled:opacity-30 disabled:cursor-not-allowed outline-none transition-colors"
|
|
5650
|
+
},
|
|
5651
|
+
/* @__PURE__ */ import_react87.default.createElement(import_react88.HugeiconsIcon, { icon: import_core_free_icons32.ArrowLeft01Icon, size: 16, className: "text-black" })
|
|
5652
|
+
), /* @__PURE__ */ import_react87.default.createElement(
|
|
5653
|
+
"button",
|
|
5654
|
+
{
|
|
5655
|
+
onClick: handleNextMonth,
|
|
5656
|
+
disabled: viewYear === maxDate.getFullYear() && viewMonth === 11,
|
|
5657
|
+
className: "w-8 h-8 flex items-center justify-center rounded-full hover:bg-neutral-100 disabled:opacity-30 disabled:cursor-not-allowed outline-none transition-colors"
|
|
5658
|
+
},
|
|
5659
|
+
/* @__PURE__ */ import_react87.default.createElement(import_react88.HugeiconsIcon, { icon: import_core_free_icons32.ArrowRight01Icon, size: 16, className: "text-black" })
|
|
5660
|
+
))), /* @__PURE__ */ import_react87.default.createElement("div", { className: "grid grid-cols-7 gap-1" }, DAYS_OF_WEEK.map((d) => /* @__PURE__ */ import_react87.default.createElement("div", { key: d, className: "text-center text-[10px] text-neutral-400 py-2" }, d)), Array.from({ length: firstDayOffset }).map((_, i) => /* @__PURE__ */ import_react87.default.createElement("div", { key: `empty-${i}` })), Array.from({ length: daysInMonth }).map((_, i) => {
|
|
5661
|
+
const day = i + 1;
|
|
5662
|
+
const isDisabled = isDateDisabled(viewYear, viewMonth, day);
|
|
5663
|
+
const isSelected = selectedDate.getFullYear() === viewYear && selectedDate.getMonth() === viewMonth && selectedDate.getDate() === day;
|
|
5664
|
+
return /* @__PURE__ */ import_react87.default.createElement(
|
|
5665
|
+
"button",
|
|
5666
|
+
{
|
|
5667
|
+
key: day,
|
|
5668
|
+
disabled: isDisabled,
|
|
5669
|
+
onClick: () => setSelectedDate(new Date(viewYear, viewMonth, day)),
|
|
5670
|
+
className: `h-9 w-9 rounded-full flex items-center justify-center text-[12px] transition-colors outline-none
|
|
5671
|
+
${isDisabled ? "text-neutral-300 cursor-not-allowed" : isSelected ? "bg-[#068afe] text-white" : "text-black hover:bg-neutral-100"}`
|
|
5672
|
+
},
|
|
5673
|
+
day
|
|
5674
|
+
);
|
|
5675
|
+
}))), mode === "TIME" && /* @__PURE__ */ import_react87.default.createElement("div", { className: "flex items-center justify-center gap-6 py-6 animate-in fade-in duration-200" }, /* @__PURE__ */ import_react87.default.createElement("div", { className: "flex flex-col items-center gap-4" }, /* @__PURE__ */ import_react87.default.createElement("button", { onClick: () => adjustTime("H", 1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ import_react87.default.createElement(import_react88.HugeiconsIcon, { icon: import_core_free_icons32.ArrowUp01Icon, size: 20, className: "text-neutral-500" })), /* @__PURE__ */ import_react87.default.createElement("span", { className: "text-3xl text-black w-12 text-center" }, hour.toString().padStart(2, "0")), /* @__PURE__ */ import_react87.default.createElement("button", { onClick: () => adjustTime("H", -1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ import_react87.default.createElement(import_react88.HugeiconsIcon, { icon: import_core_free_icons32.ArrowDown01Icon, size: 20, className: "text-neutral-500" }))), /* @__PURE__ */ import_react87.default.createElement("span", { className: "text-3xl text-neutral-300 pb-2" }, ":"), /* @__PURE__ */ import_react87.default.createElement("div", { className: "flex flex-col items-center gap-4" }, /* @__PURE__ */ import_react87.default.createElement("button", { onClick: () => adjustTime("M", 1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ import_react87.default.createElement(import_react88.HugeiconsIcon, { icon: import_core_free_icons32.ArrowUp01Icon, size: 20, className: "text-neutral-500" })), /* @__PURE__ */ import_react87.default.createElement("span", { className: "text-3xl text-black w-12 text-center" }, minute.toString().padStart(2, "0")), /* @__PURE__ */ import_react87.default.createElement("button", { onClick: () => adjustTime("M", -1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ import_react87.default.createElement(import_react88.HugeiconsIcon, { icon: import_core_free_icons32.ArrowDown01Icon, size: 20, className: "text-neutral-500" }))), /* @__PURE__ */ import_react87.default.createElement("div", { className: "flex flex-col items-center gap-4 ml-2" }, /* @__PURE__ */ import_react87.default.createElement("button", { onClick: () => adjustTime("A", 1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ import_react87.default.createElement(import_react88.HugeiconsIcon, { icon: import_core_free_icons32.ArrowUp01Icon, size: 20, className: "text-neutral-500" })), /* @__PURE__ */ import_react87.default.createElement("span", { className: "text-xl text-[#068afe] w-12 text-center" }, ampm), /* @__PURE__ */ import_react87.default.createElement("button", { onClick: () => adjustTime("A", -1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ import_react87.default.createElement(import_react88.HugeiconsIcon, { icon: import_core_free_icons32.ArrowDown01Icon, size: 20, className: "text-neutral-500" }))))), /* @__PURE__ */ import_react87.default.createElement("div", { className: "p-5 flex justify-end shrink-0" }, /* @__PURE__ */ import_react87.default.createElement(
|
|
5676
|
+
"button",
|
|
5677
|
+
{
|
|
5678
|
+
onClick: handleSave,
|
|
5679
|
+
className: "text-[#068afe] hover:text-[#0573d6] transition-colors outline-none text-[13px] tracking-wide"
|
|
5680
|
+
},
|
|
5681
|
+
"Done"
|
|
5682
|
+
))));
|
|
5683
|
+
};
|
|
5684
|
+
|
|
5685
|
+
// src/components/UniversalCreateHuddle.tsx
|
|
5686
|
+
var MemberAvatar3 = ({ src, sizeClass = "w-10 h-10" }) => {
|
|
5687
|
+
const [loaded, setLoaded] = (0, import_react89.useState)(false);
|
|
5688
|
+
const [error, setError] = (0, import_react89.useState)(false);
|
|
5689
|
+
const defaultAvatar = "https://storage.googleapis.com/retina-cloud-v2/assets/images/avatar.avif";
|
|
5690
|
+
return /* @__PURE__ */ import_react89.default.createElement("div", { className: `relative shrink-0 ${sizeClass}` }, /* @__PURE__ */ import_react89.default.createElement("div", { className: "w-full h-full rounded-lg bg-neutral-100 flex items-center justify-center overflow-hidden" }, !loaded && !error && /* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.Loading03Icon, className: "animate-spin text-neutral-400 absolute", size: 14 }), /* @__PURE__ */ import_react89.default.createElement(
|
|
5691
|
+
"img",
|
|
5692
|
+
{
|
|
5693
|
+
src: error || !src ? defaultAvatar : src,
|
|
5694
|
+
alt: "Avatar",
|
|
5695
|
+
className: `w-full h-full object-cover transition-opacity duration-300 ${loaded || error ? "opacity-100" : "opacity-0"}`,
|
|
5696
|
+
onLoad: () => setLoaded(true),
|
|
5697
|
+
onError: () => setError(true)
|
|
5698
|
+
}
|
|
5699
|
+
)));
|
|
5700
|
+
};
|
|
5701
|
+
var STANDARD_TIMEZONES = [
|
|
5702
|
+
"UTC",
|
|
5703
|
+
"America/New_York",
|
|
5704
|
+
"America/Chicago",
|
|
5705
|
+
"America/Denver",
|
|
5706
|
+
"America/Los_Angeles",
|
|
5707
|
+
"Europe/London",
|
|
5708
|
+
"Europe/Paris",
|
|
5709
|
+
"Europe/Berlin",
|
|
5710
|
+
"Africa/Lagos",
|
|
5711
|
+
"Africa/Johannesburg",
|
|
5712
|
+
"Asia/Dubai",
|
|
5713
|
+
"Asia/Kolkata",
|
|
5714
|
+
"Asia/Singapore",
|
|
5715
|
+
"Asia/Tokyo",
|
|
5716
|
+
"Australia/Sydney"
|
|
5717
|
+
];
|
|
5718
|
+
var UniversalCreateHuddle = ({
|
|
5719
|
+
onBackHref,
|
|
5720
|
+
members,
|
|
5721
|
+
isMembersLoading,
|
|
5722
|
+
membersCurrentPage,
|
|
5723
|
+
membersTotalPages,
|
|
5724
|
+
onMembersPageChange,
|
|
5725
|
+
membersSearchQuery,
|
|
5726
|
+
onMembersSearchChange,
|
|
5727
|
+
onCreateSubmit
|
|
5728
|
+
}) => {
|
|
5729
|
+
const [huddleDate, setHuddleDate] = (0, import_react89.useState)(() => {
|
|
5730
|
+
const d = /* @__PURE__ */ new Date();
|
|
5731
|
+
d.setHours(d.getHours() + 1, 0, 0, 0);
|
|
5732
|
+
return d;
|
|
5733
|
+
});
|
|
5734
|
+
const [title, setTitle] = (0, import_react89.useState)("");
|
|
5735
|
+
const [isPrivate, setIsPrivate] = (0, import_react89.useState)(false);
|
|
5736
|
+
const [timezone, setTimezone] = (0, import_react89.useState)("UTC");
|
|
5737
|
+
(0, import_react89.useEffect)(() => {
|
|
5738
|
+
try {
|
|
5739
|
+
setTimezone(Intl.DateTimeFormat().resolvedOptions().timeZone);
|
|
5740
|
+
} catch (e) {
|
|
5741
|
+
}
|
|
5742
|
+
}, []);
|
|
5743
|
+
const [calendarMode, setCalendarMode] = (0, import_react89.useState)(null);
|
|
5744
|
+
const [showTimezoneModal, setShowTimezoneModal] = (0, import_react89.useState)(false);
|
|
5745
|
+
const [showMembersModal, setShowMembersModal] = (0, import_react89.useState)(false);
|
|
5746
|
+
const [selectedParticipants, setSelectedParticipants] = (0, import_react89.useState)(/* @__PURE__ */ new Set());
|
|
5747
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react89.useState)(false);
|
|
5748
|
+
const [localSearchQuery, setLocalSearchQuery] = (0, import_react89.useState)(membersSearchQuery);
|
|
5749
|
+
const [isTyping, setIsTyping] = (0, import_react89.useState)(false);
|
|
5750
|
+
const typingTimer = (0, import_react89.useRef)(null);
|
|
5751
|
+
const handleSearchInput = (e) => {
|
|
5752
|
+
const val = e.target.value;
|
|
5753
|
+
setLocalSearchQuery(val);
|
|
5754
|
+
setIsTyping(true);
|
|
5755
|
+
if (typingTimer.current) clearTimeout(typingTimer.current);
|
|
5756
|
+
typingTimer.current = setTimeout(() => {
|
|
5757
|
+
onMembersSearchChange(val);
|
|
5758
|
+
setTimeout(() => setIsTyping(false), 150);
|
|
5759
|
+
}, 600);
|
|
5760
|
+
};
|
|
5761
|
+
const toggleParticipant = (userId) => {
|
|
5762
|
+
const newSet = new Set(selectedParticipants);
|
|
5763
|
+
if (newSet.has(userId)) newSet.delete(userId);
|
|
5764
|
+
else newSet.add(userId);
|
|
5765
|
+
setSelectedParticipants(newSet);
|
|
5766
|
+
};
|
|
5767
|
+
const handleSubmit = async (e) => {
|
|
5768
|
+
e.preventDefault();
|
|
5769
|
+
const cleanTitle = title.trim();
|
|
5770
|
+
if (cleanTitle.length < 2) return import_react_hot_toast16.default.error("Please enter a valid huddle name.");
|
|
5771
|
+
if (isPrivate && selectedParticipants.size === 0) return import_react_hot_toast16.default.error("Private huddles require at least one participant.");
|
|
5772
|
+
setIsSubmitting(true);
|
|
5773
|
+
try {
|
|
5774
|
+
await onCreateSubmit({
|
|
5775
|
+
title: cleanTitle,
|
|
5776
|
+
huddleType: isPrivate ? "PRIVATE" : "PUBLIC",
|
|
5777
|
+
startTime: huddleDate.toISOString(),
|
|
5778
|
+
timezone,
|
|
5779
|
+
participantIds: isPrivate ? Array.from(selectedParticipants) : []
|
|
5780
|
+
});
|
|
5781
|
+
} catch (error) {
|
|
5782
|
+
import_react_hot_toast16.default.error(error.message || "Failed to schedule huddle.");
|
|
5783
|
+
setIsSubmitting(false);
|
|
5784
|
+
}
|
|
5785
|
+
};
|
|
5786
|
+
return /* @__PURE__ */ import_react89.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react89.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react89.default.createElement("div", { className: "mb-6 flex w-full items-center px-1" }, /* @__PURE__ */ import_react89.default.createElement("a", { href: onBackHref, className: "flex items-center gap-2 text-[#068afe] hover:text-[#068afe] transition-colors text-[13px] outline-none" }, /* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.ArrowLeft01Icon, size: 16 }), " Back")), /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex flex-col gap-1 mb-8 px-1" }, /* @__PURE__ */ import_react89.default.createElement("h1", { className: "text-black text-xl tracking-tight" }, "Create Huddle"), /* @__PURE__ */ import_react89.default.createElement("p", { className: "text-xs text-neutral-500" }, "Schedule a new workspace huddle and manage participant access.")), /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex flex-col gap-8 animate-in rounded-2xl p-6 bg-white fade-in duration-300" }, /* @__PURE__ */ import_react89.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSubmit, autoComplete: "off" }, /* @__PURE__ */ import_react89.default.createElement(
|
|
5787
|
+
TextInput,
|
|
5788
|
+
{
|
|
5789
|
+
label: "Huddle Subject",
|
|
5790
|
+
value: title,
|
|
5791
|
+
onChange: (val) => setTitle(val.substring(0, 80)),
|
|
5792
|
+
disabled: isSubmitting,
|
|
5793
|
+
placeholder: "e.g. Q4 Engineering Sync",
|
|
5794
|
+
maxLength: 80
|
|
5795
|
+
}
|
|
5796
|
+
), /* @__PURE__ */ import_react89.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-6" }, /* @__PURE__ */ import_react89.default.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ import_react89.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, "Date"), /* @__PURE__ */ import_react89.default.createElement(
|
|
5797
|
+
"div",
|
|
5798
|
+
{
|
|
5799
|
+
onClick: () => !isSubmitting && setCalendarMode("DATE"),
|
|
5800
|
+
className: `flex items-center relative w-full border-b border-neutral-200 transition-all duration-300 pb-3 pt-3 cursor-pointer ${isSubmitting ? "opacity-50 pointer-events-none" : "hover:border-black"}`
|
|
5801
|
+
},
|
|
5802
|
+
/* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.Calendar01Icon, size: 16, className: "text-neutral-400 absolute left-0" }),
|
|
5803
|
+
/* @__PURE__ */ import_react89.default.createElement("span", { className: "w-full pl-8 text-sm text-black truncate block" }, huddleDate.toLocaleDateString("en-GB", { day: "2-digit", month: "short", year: "numeric" }))
|
|
5804
|
+
)), /* @__PURE__ */ import_react89.default.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ import_react89.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, "Time"), /* @__PURE__ */ import_react89.default.createElement(
|
|
5805
|
+
"div",
|
|
5806
|
+
{
|
|
5807
|
+
onClick: () => !isSubmitting && setCalendarMode("TIME"),
|
|
5808
|
+
className: `flex items-center relative w-full border-b border-neutral-200 transition-all duration-300 pb-3 pt-3 cursor-pointer ${isSubmitting ? "opacity-50 pointer-events-none" : "hover:border-black"}`
|
|
5809
|
+
},
|
|
5810
|
+
/* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.Clock01Icon, size: 16, className: "text-neutral-400 absolute left-0" }),
|
|
5811
|
+
/* @__PURE__ */ import_react89.default.createElement("span", { className: "w-full pl-8 text-sm text-black truncate block" }, huddleDate.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }))
|
|
5812
|
+
)), /* @__PURE__ */ import_react89.default.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ import_react89.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, "Timezone"), /* @__PURE__ */ import_react89.default.createElement(
|
|
5813
|
+
"div",
|
|
5814
|
+
{
|
|
5815
|
+
onClick: () => !isSubmitting && setShowTimezoneModal(true),
|
|
5816
|
+
className: `flex items-center relative w-full border-b border-neutral-200 transition-all duration-300 pb-3 pt-3 cursor-pointer ${isSubmitting ? "opacity-50 pointer-events-none" : "hover:border-black"}`
|
|
5817
|
+
},
|
|
5818
|
+
/* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.Globe02Icon, size: 16, className: "text-neutral-400 absolute left-0" }),
|
|
5819
|
+
/* @__PURE__ */ import_react89.default.createElement("span", { className: "w-full pl-8 text-sm text-black truncate block" }, timezone)
|
|
5820
|
+
))), /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex items-center justify-between py-2 border-t border-b border-neutral-100 mt-2" }, /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ import_react89.default.createElement("span", { className: "text-[13px] text-black tracking-tight" }, "Private Huddle"), /* @__PURE__ */ import_react89.default.createElement("span", { className: "text-[11px] text-neutral-500" }, "Only invited members can join.")), /* @__PURE__ */ import_react89.default.createElement(
|
|
5821
|
+
"button",
|
|
5822
|
+
{
|
|
5823
|
+
type: "button",
|
|
5824
|
+
onClick: () => setIsPrivate(!isPrivate),
|
|
5825
|
+
disabled: isSubmitting,
|
|
5826
|
+
className: `relative w-11 h-6 rounded-full transition-colors outline-none shrink-0 ${isPrivate ? "bg-[#068afe]" : "bg-neutral-200"}`
|
|
5827
|
+
},
|
|
5828
|
+
/* @__PURE__ */ import_react89.default.createElement("div", { className: `absolute top-1 left-1 bg-white w-4 h-4 rounded-full transition-transform ${isPrivate ? "translate-x-5" : "translate-x-0"}` })
|
|
5829
|
+
)), isPrivate && /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex items-center justify-between animate-in fade-in zoom-in-95 duration-200 bg-neutral-50 p-4 rounded-xl" }, /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ import_react89.default.createElement("span", { className: "text-[12px] text-black tracking-tight" }, "Participants"), /* @__PURE__ */ import_react89.default.createElement("span", { className: "text-[11px] text-[#068afe] " }, selectedParticipants.size === 0 ? "0 added" : selectedParticipants.size >= 1e3 ? `${(selectedParticipants.size / 1e3).toFixed(1)}k+ added` : `${selectedParticipants.size} added`)), /* @__PURE__ */ import_react89.default.createElement(
|
|
5830
|
+
"button",
|
|
5831
|
+
{
|
|
5832
|
+
type: "button",
|
|
5833
|
+
onClick: () => setShowMembersModal(true),
|
|
5834
|
+
disabled: isSubmitting,
|
|
5835
|
+
className: "px-4 py-2 border border-neutral-200 text-black text-[11px] tracking-wide rounded-full hover:bg-white transition-colors outline-none bg-transparent"
|
|
5836
|
+
},
|
|
5837
|
+
"Manage Access"
|
|
5838
|
+
)), /* @__PURE__ */ import_react89.default.createElement("div", { className: "pt-6" }, /* @__PURE__ */ import_react89.default.createElement(
|
|
5839
|
+
ThreeDActionButton,
|
|
5840
|
+
{
|
|
5841
|
+
type: "submit",
|
|
5842
|
+
disabled: isSubmitting || title.trim().length < 2 || isPrivate && selectedParticipants.size === 0,
|
|
5843
|
+
isLoading: isSubmitting,
|
|
5844
|
+
className: "w-full sm:w-auto min-w-40"
|
|
5845
|
+
},
|
|
5846
|
+
"Schedule Huddle"
|
|
5847
|
+
)))), /* @__PURE__ */ import_react89.default.createElement(
|
|
5848
|
+
CalendarPicker,
|
|
5849
|
+
{
|
|
5850
|
+
isOpen: calendarMode !== null,
|
|
5851
|
+
onClose: () => setCalendarMode(null),
|
|
5852
|
+
initialDate: huddleDate,
|
|
5853
|
+
defaultMode: calendarMode || "DATE",
|
|
5854
|
+
onConfirm: (d) => setHuddleDate(d)
|
|
5855
|
+
}
|
|
5856
|
+
), /* @__PURE__ */ import_react89.default.createElement(
|
|
5857
|
+
ReusableOptions,
|
|
5858
|
+
{
|
|
5859
|
+
isOpen: showTimezoneModal,
|
|
5860
|
+
onClose: () => setShowTimezoneModal(false),
|
|
5861
|
+
title: "Select Timezone",
|
|
5862
|
+
options: STANDARD_TIMEZONES,
|
|
5863
|
+
selectedOption: timezone,
|
|
5864
|
+
onSelect: (tz) => setTimezone(tz),
|
|
5865
|
+
showSearch: true
|
|
5866
|
+
}
|
|
5867
|
+
), showMembersModal && /* @__PURE__ */ import_react89.default.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react89.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setShowMembersModal(false) }), /* @__PURE__ */ import_react89.default.createElement("div", { className: "relative w-full max-w-md bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200 h-[80vh]" }, /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex items-center justify-between p-5 shrink-0 " }, /* @__PURE__ */ import_react89.default.createElement("h3", { className: "text-[15px] text-black tracking-tight" }, "Select Participants"), /* @__PURE__ */ import_react89.default.createElement("button", { onClick: () => setShowMembersModal(false), className: "text-[#068afe] hover:text-[#068afe] transition-colors outline-none text-[13px] " }, "Done")), /* @__PURE__ */ import_react89.default.createElement("div", { className: "p-4 shrink-0 " }, /* @__PURE__ */ import_react89.default.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ import_react89.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.Search01Icon, size: 16, className: "text-neutral-400" })), /* @__PURE__ */ import_react89.default.createElement(
|
|
5868
|
+
"input",
|
|
5869
|
+
{
|
|
5870
|
+
type: "text",
|
|
5871
|
+
placeholder: "Search team...",
|
|
5872
|
+
value: localSearchQuery,
|
|
5873
|
+
onChange: handleSearchInput,
|
|
5874
|
+
className: "w-full pl-10 pr-4 py-2.5 bg-neutral-100 rounded-full text-[13px] text-black placeholder-neutral-400 outline-none focus:bg-neutral-200 transition-colors"
|
|
5875
|
+
}
|
|
5876
|
+
))), /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-2 relative" }, isMembersLoading || isTyping ? /* @__PURE__ */ import_react89.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center" }, /* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.Loading03Icon, size: 28, className: "animate-spin text-black" })) : members.length === 0 ? /* @__PURE__ */ import_react89.default.createElement("div", { className: "p-8 text-center text-xs text-neutral-400" }, "No members found.") : members.map((member) => {
|
|
5877
|
+
const isChecked = selectedParticipants.has(member.userId);
|
|
5878
|
+
return /* @__PURE__ */ import_react89.default.createElement(
|
|
5879
|
+
"div",
|
|
5880
|
+
{
|
|
5881
|
+
key: member.id,
|
|
5882
|
+
onClick: () => toggleParticipant(member.userId),
|
|
5883
|
+
className: "flex items-center justify-between p-3 rounded-xl cursor-pointer hover:bg-neutral-50 transition-colors select-none"
|
|
5884
|
+
},
|
|
5885
|
+
/* @__PURE__ */ import_react89.default.createElement("div", { className: "flex items-center gap-3 min-w-0 flex-1" }, /* @__PURE__ */ import_react89.default.createElement(MemberAvatar3, { src: member.avatarUrl, sizeClass: "w-9 h-9" }), /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex flex-col min-w-0 flex-1" }, /* @__PURE__ */ import_react89.default.createElement("span", { className: "text-[13px] text-black truncate" }, member.fullName), /* @__PURE__ */ import_react89.default.createElement("span", { className: "text-[11px] text-neutral-400 capitalize truncate" }, member.role.toLowerCase()))),
|
|
5886
|
+
/* @__PURE__ */ import_react89.default.createElement("div", { className: "shrink-0 pl-3" }, /* @__PURE__ */ import_react89.default.createElement("div", { className: `w-5 h-5 rounded-full flex items-center justify-center transition-colors ${isChecked ? "bg-[#068afe]" : "border border-neutral-300 bg-white"}` }, isChecked && /* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.Tick02Icon, size: 14, className: "text-white" })))
|
|
5887
|
+
);
|
|
5888
|
+
})), /* @__PURE__ */ import_react89.default.createElement("div", { className: "p-4 flex items-center justify-between shrink-0 bg-white" }, /* @__PURE__ */ import_react89.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-widest" }, "Page ", membersCurrentPage, " of ", membersTotalPages === 0 ? 1 : membersTotalPages), /* @__PURE__ */ import_react89.default.createElement("div", { className: "flex gap-1" }, /* @__PURE__ */ import_react89.default.createElement(
|
|
5889
|
+
"button",
|
|
5890
|
+
{
|
|
5891
|
+
disabled: membersCurrentPage <= 1 || isMembersLoading,
|
|
5892
|
+
onClick: () => onMembersPageChange(membersCurrentPage - 1),
|
|
5893
|
+
className: "w-7 h-7 flex items-center justify-center rounded-full bg-white border border-neutral-200 text-neutral-600 disabled:opacity-30 outline-none hover:bg-neutral-50 transition-colors"
|
|
5894
|
+
},
|
|
5895
|
+
/* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.ArrowLeft01Icon, size: 12 })
|
|
5896
|
+
), /* @__PURE__ */ import_react89.default.createElement(
|
|
5897
|
+
"button",
|
|
5898
|
+
{
|
|
5899
|
+
disabled: membersCurrentPage >= membersTotalPages || membersTotalPages === 0 || isMembersLoading,
|
|
5900
|
+
onClick: () => onMembersPageChange(membersCurrentPage + 1),
|
|
5901
|
+
className: "w-7 h-7 flex items-center justify-center rounded-full bg-white border border-neutral-200 text-neutral-600 disabled:opacity-30 outline-none hover:bg-neutral-50 transition-colors"
|
|
5902
|
+
},
|
|
5903
|
+
/* @__PURE__ */ import_react89.default.createElement(import_react90.HugeiconsIcon, { icon: import_core_free_icons33.ArrowRight01Icon, size: 12 })
|
|
5904
|
+
))))));
|
|
5905
|
+
};
|
|
5532
5906
|
// Annotate the CommonJS export names for ESM import in node:
|
|
5533
5907
|
0 && (module.exports = {
|
|
5534
5908
|
AppBento2,
|
|
@@ -5564,6 +5938,7 @@ var UniversalSettings = ({
|
|
|
5564
5938
|
UniversalBuyCryptoPage,
|
|
5565
5939
|
UniversalCardActionPage,
|
|
5566
5940
|
UniversalCardPage,
|
|
5941
|
+
UniversalCreateHuddle,
|
|
5567
5942
|
UniversalErrorView,
|
|
5568
5943
|
UniversalHome2,
|
|
5569
5944
|
UniversalHomeView,
|
package/dist/index.mjs
CHANGED
|
@@ -5571,6 +5571,394 @@ var UniversalSettings = ({
|
|
|
5571
5571
|
/* @__PURE__ */ React50.createElement(HugeiconsIcon36, { icon: PlusSignIcon3, size: 16 })
|
|
5572
5572
|
)), /* @__PURE__ */ React50.createElement("div", { className: "mt-4 px-1" }, /* @__PURE__ */ React50.createElement("p", { className: "text-[11px] text-neutral-500 leading-relaxed max-w-lg" }, "AI credits are consumed when generating intelligent summaries, transcriptions, and automated huddle insights. Additional credits are billed dynamically to your primary payment method."))));
|
|
5573
5573
|
};
|
|
5574
|
+
|
|
5575
|
+
// src/components/UniversalCreateHuddle.tsx
|
|
5576
|
+
import React52, { useState as useState38, useEffect as useEffect21, useRef as useRef14 } from "react";
|
|
5577
|
+
import toast15 from "react-hot-toast";
|
|
5578
|
+
import { HugeiconsIcon as HugeiconsIcon38 } from "@hugeicons/react";
|
|
5579
|
+
import {
|
|
5580
|
+
ArrowLeft01Icon as ArrowLeft01Icon18,
|
|
5581
|
+
ArrowRight01Icon as ArrowRight01Icon14,
|
|
5582
|
+
Loading03Icon as Loading03Icon24,
|
|
5583
|
+
Search01Icon as Search01Icon6,
|
|
5584
|
+
Calendar01Icon,
|
|
5585
|
+
Clock01Icon,
|
|
5586
|
+
Globe02Icon,
|
|
5587
|
+
Tick02Icon
|
|
5588
|
+
} from "@hugeicons/core-free-icons";
|
|
5589
|
+
|
|
5590
|
+
// src/components/CalendarPicker.tsx
|
|
5591
|
+
import React51, { useState as useState37, useEffect as useEffect20 } from "react";
|
|
5592
|
+
import { HugeiconsIcon as HugeiconsIcon37 } from "@hugeicons/react";
|
|
5593
|
+
import {
|
|
5594
|
+
CancelCircleIcon as CancelCircleIcon11,
|
|
5595
|
+
ArrowLeft01Icon as ArrowLeft01Icon17,
|
|
5596
|
+
ArrowRight01Icon as ArrowRight01Icon13,
|
|
5597
|
+
ArrowUp01Icon,
|
|
5598
|
+
ArrowDown01Icon
|
|
5599
|
+
} from "@hugeicons/core-free-icons";
|
|
5600
|
+
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
5601
|
+
var DAYS_OF_WEEK = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
|
|
5602
|
+
var CalendarPicker = ({
|
|
5603
|
+
isOpen,
|
|
5604
|
+
onClose,
|
|
5605
|
+
initialDate,
|
|
5606
|
+
defaultMode,
|
|
5607
|
+
onConfirm
|
|
5608
|
+
}) => {
|
|
5609
|
+
const [mode, setMode] = useState37(defaultMode);
|
|
5610
|
+
const today = /* @__PURE__ */ new Date();
|
|
5611
|
+
today.setHours(0, 0, 0, 0);
|
|
5612
|
+
const maxDate = new Date(today.getFullYear() + 1, 11, 31);
|
|
5613
|
+
maxDate.setHours(23, 59, 59, 999);
|
|
5614
|
+
const [viewMonth, setViewMonth] = useState37(initialDate.getMonth());
|
|
5615
|
+
const [viewYear, setViewYear] = useState37(initialDate.getFullYear());
|
|
5616
|
+
const [selectedDate, setSelectedDate] = useState37(new Date(initialDate.getFullYear(), initialDate.getMonth(), initialDate.getDate()));
|
|
5617
|
+
const [hour, setHour] = useState37(initialDate.getHours() % 12 || 12);
|
|
5618
|
+
const [minute, setMinute] = useState37(initialDate.getMinutes());
|
|
5619
|
+
const [ampm, setAmpm] = useState37(initialDate.getHours() >= 12 ? "PM" : "AM");
|
|
5620
|
+
useEffect20(() => {
|
|
5621
|
+
if (isOpen) {
|
|
5622
|
+
setMode(defaultMode);
|
|
5623
|
+
setViewMonth(initialDate.getMonth());
|
|
5624
|
+
setViewYear(initialDate.getFullYear());
|
|
5625
|
+
setSelectedDate(new Date(initialDate.getFullYear(), initialDate.getMonth(), initialDate.getDate()));
|
|
5626
|
+
setHour(initialDate.getHours() % 12 || 12);
|
|
5627
|
+
setMinute(initialDate.getMinutes());
|
|
5628
|
+
setAmpm(initialDate.getHours() >= 12 ? "PM" : "AM");
|
|
5629
|
+
}
|
|
5630
|
+
}, [isOpen, initialDate, defaultMode]);
|
|
5631
|
+
if (!isOpen) return null;
|
|
5632
|
+
const handlePrevMonth = () => {
|
|
5633
|
+
if (viewYear === today.getFullYear() && viewMonth === today.getMonth()) return;
|
|
5634
|
+
if (viewMonth === 0) {
|
|
5635
|
+
setViewMonth(11);
|
|
5636
|
+
setViewYear((y) => y - 1);
|
|
5637
|
+
} else {
|
|
5638
|
+
setViewMonth((m) => m - 1);
|
|
5639
|
+
}
|
|
5640
|
+
};
|
|
5641
|
+
const handleNextMonth = () => {
|
|
5642
|
+
if (viewYear === maxDate.getFullYear() && viewMonth === 11) return;
|
|
5643
|
+
if (viewMonth === 11) {
|
|
5644
|
+
setViewMonth(0);
|
|
5645
|
+
setViewYear((y) => y + 1);
|
|
5646
|
+
} else {
|
|
5647
|
+
setViewMonth((m) => m + 1);
|
|
5648
|
+
}
|
|
5649
|
+
};
|
|
5650
|
+
const isDateDisabled = (year, month, day) => {
|
|
5651
|
+
const d = new Date(year, month, day);
|
|
5652
|
+
return d < today || d > maxDate;
|
|
5653
|
+
};
|
|
5654
|
+
const daysInMonth = new Date(viewYear, viewMonth + 1, 0).getDate();
|
|
5655
|
+
const firstDayOffset = new Date(viewYear, viewMonth, 1).getDay();
|
|
5656
|
+
const adjustTime = (type, dir) => {
|
|
5657
|
+
if (type === "H") {
|
|
5658
|
+
setHour((h) => {
|
|
5659
|
+
let next = h + dir;
|
|
5660
|
+
if (next > 12) return 1;
|
|
5661
|
+
if (next < 1) return 12;
|
|
5662
|
+
return next;
|
|
5663
|
+
});
|
|
5664
|
+
}
|
|
5665
|
+
if (type === "M") {
|
|
5666
|
+
setMinute((m) => {
|
|
5667
|
+
let next = m + dir;
|
|
5668
|
+
if (next > 59) return 0;
|
|
5669
|
+
if (next < 0) return 59;
|
|
5670
|
+
return next;
|
|
5671
|
+
});
|
|
5672
|
+
}
|
|
5673
|
+
if (type === "A") {
|
|
5674
|
+
setAmpm((a) => a === "AM" ? "PM" : "AM");
|
|
5675
|
+
}
|
|
5676
|
+
};
|
|
5677
|
+
const handleSave = () => {
|
|
5678
|
+
const final = new Date(selectedDate);
|
|
5679
|
+
let h24 = hour;
|
|
5680
|
+
if (ampm === "PM" && hour < 12) h24 += 12;
|
|
5681
|
+
if (ampm === "AM" && hour === 12) h24 = 0;
|
|
5682
|
+
final.setHours(h24, minute, 0, 0);
|
|
5683
|
+
onConfirm(final);
|
|
5684
|
+
onClose();
|
|
5685
|
+
};
|
|
5686
|
+
return /* @__PURE__ */ React51.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React51.createElement("div", { className: "absolute inset-0 bg-black/40", onClick: onClose }), /* @__PURE__ */ React51.createElement("div", { className: "relative w-full max-w-sm bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ React51.createElement("div", { className: "p-4 pb-0 flex flex-col gap-4" }, /* @__PURE__ */ React51.createElement("div", { className: "flex items-center justify-between shrink-0" }, /* @__PURE__ */ React51.createElement("h3", { className: "text-[15px] text-black tracking-tight " }, "Select Date & Time"), /* @__PURE__ */ React51.createElement("button", { onClick: onClose, className: "text-neutral-400 hover:text-black transition-colors outline-none" }, /* @__PURE__ */ React51.createElement(HugeiconsIcon37, { icon: CancelCircleIcon11, size: 18 }))), /* @__PURE__ */ React51.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ React51.createElement(
|
|
5687
|
+
"button",
|
|
5688
|
+
{
|
|
5689
|
+
onClick: () => setMode("DATE"),
|
|
5690
|
+
className: `pb-2 text-[12px] tracking-wide outline-none border-b-2 transition-colors ${mode === "DATE" ? "border-[#068afe] text-[#068afe]" : "border-transparent text-neutral-500 hover:text-black"}`
|
|
5691
|
+
},
|
|
5692
|
+
"Date"
|
|
5693
|
+
), /* @__PURE__ */ React51.createElement(
|
|
5694
|
+
"button",
|
|
5695
|
+
{
|
|
5696
|
+
onClick: () => setMode("TIME"),
|
|
5697
|
+
className: `pb-2 text-[12px] tracking-wide outline-none border-b-2 transition-colors ${mode === "TIME" ? "border-[#068afe] text-[#068afe]" : "border-transparent text-neutral-500 hover:text-black"}`
|
|
5698
|
+
},
|
|
5699
|
+
"Time"
|
|
5700
|
+
))), /* @__PURE__ */ React51.createElement("div", { className: "p-5" }, mode === "DATE" && /* @__PURE__ */ React51.createElement("div", { className: "flex flex-col gap-4 animate-in fade-in duration-200" }, /* @__PURE__ */ React51.createElement("div", { className: "flex items-center justify-between px-2" }, /* @__PURE__ */ React51.createElement("span", { className: "text-[13px] text-black" }, MONTHS[viewMonth], " ", viewYear), /* @__PURE__ */ React51.createElement("div", { className: "flex gap-1" }, /* @__PURE__ */ React51.createElement(
|
|
5701
|
+
"button",
|
|
5702
|
+
{
|
|
5703
|
+
onClick: handlePrevMonth,
|
|
5704
|
+
disabled: viewYear === today.getFullYear() && viewMonth === today.getMonth(),
|
|
5705
|
+
className: "w-8 h-8 flex items-center justify-center rounded-full hover:bg-neutral-100 disabled:opacity-30 disabled:cursor-not-allowed outline-none transition-colors"
|
|
5706
|
+
},
|
|
5707
|
+
/* @__PURE__ */ React51.createElement(HugeiconsIcon37, { icon: ArrowLeft01Icon17, size: 16, className: "text-black" })
|
|
5708
|
+
), /* @__PURE__ */ React51.createElement(
|
|
5709
|
+
"button",
|
|
5710
|
+
{
|
|
5711
|
+
onClick: handleNextMonth,
|
|
5712
|
+
disabled: viewYear === maxDate.getFullYear() && viewMonth === 11,
|
|
5713
|
+
className: "w-8 h-8 flex items-center justify-center rounded-full hover:bg-neutral-100 disabled:opacity-30 disabled:cursor-not-allowed outline-none transition-colors"
|
|
5714
|
+
},
|
|
5715
|
+
/* @__PURE__ */ React51.createElement(HugeiconsIcon37, { icon: ArrowRight01Icon13, size: 16, className: "text-black" })
|
|
5716
|
+
))), /* @__PURE__ */ React51.createElement("div", { className: "grid grid-cols-7 gap-1" }, DAYS_OF_WEEK.map((d) => /* @__PURE__ */ React51.createElement("div", { key: d, className: "text-center text-[10px] text-neutral-400 py-2" }, d)), Array.from({ length: firstDayOffset }).map((_, i) => /* @__PURE__ */ React51.createElement("div", { key: `empty-${i}` })), Array.from({ length: daysInMonth }).map((_, i) => {
|
|
5717
|
+
const day = i + 1;
|
|
5718
|
+
const isDisabled = isDateDisabled(viewYear, viewMonth, day);
|
|
5719
|
+
const isSelected = selectedDate.getFullYear() === viewYear && selectedDate.getMonth() === viewMonth && selectedDate.getDate() === day;
|
|
5720
|
+
return /* @__PURE__ */ React51.createElement(
|
|
5721
|
+
"button",
|
|
5722
|
+
{
|
|
5723
|
+
key: day,
|
|
5724
|
+
disabled: isDisabled,
|
|
5725
|
+
onClick: () => setSelectedDate(new Date(viewYear, viewMonth, day)),
|
|
5726
|
+
className: `h-9 w-9 rounded-full flex items-center justify-center text-[12px] transition-colors outline-none
|
|
5727
|
+
${isDisabled ? "text-neutral-300 cursor-not-allowed" : isSelected ? "bg-[#068afe] text-white" : "text-black hover:bg-neutral-100"}`
|
|
5728
|
+
},
|
|
5729
|
+
day
|
|
5730
|
+
);
|
|
5731
|
+
}))), mode === "TIME" && /* @__PURE__ */ React51.createElement("div", { className: "flex items-center justify-center gap-6 py-6 animate-in fade-in duration-200" }, /* @__PURE__ */ React51.createElement("div", { className: "flex flex-col items-center gap-4" }, /* @__PURE__ */ React51.createElement("button", { onClick: () => adjustTime("H", 1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ React51.createElement(HugeiconsIcon37, { icon: ArrowUp01Icon, size: 20, className: "text-neutral-500" })), /* @__PURE__ */ React51.createElement("span", { className: "text-3xl text-black w-12 text-center" }, hour.toString().padStart(2, "0")), /* @__PURE__ */ React51.createElement("button", { onClick: () => adjustTime("H", -1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ React51.createElement(HugeiconsIcon37, { icon: ArrowDown01Icon, size: 20, className: "text-neutral-500" }))), /* @__PURE__ */ React51.createElement("span", { className: "text-3xl text-neutral-300 pb-2" }, ":"), /* @__PURE__ */ React51.createElement("div", { className: "flex flex-col items-center gap-4" }, /* @__PURE__ */ React51.createElement("button", { onClick: () => adjustTime("M", 1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ React51.createElement(HugeiconsIcon37, { icon: ArrowUp01Icon, size: 20, className: "text-neutral-500" })), /* @__PURE__ */ React51.createElement("span", { className: "text-3xl text-black w-12 text-center" }, minute.toString().padStart(2, "0")), /* @__PURE__ */ React51.createElement("button", { onClick: () => adjustTime("M", -1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ React51.createElement(HugeiconsIcon37, { icon: ArrowDown01Icon, size: 20, className: "text-neutral-500" }))), /* @__PURE__ */ React51.createElement("div", { className: "flex flex-col items-center gap-4 ml-2" }, /* @__PURE__ */ React51.createElement("button", { onClick: () => adjustTime("A", 1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ React51.createElement(HugeiconsIcon37, { icon: ArrowUp01Icon, size: 20, className: "text-neutral-500" })), /* @__PURE__ */ React51.createElement("span", { className: "text-xl text-[#068afe] w-12 text-center" }, ampm), /* @__PURE__ */ React51.createElement("button", { onClick: () => adjustTime("A", -1), className: "p-2 rounded-full hover:bg-neutral-100 outline-none" }, /* @__PURE__ */ React51.createElement(HugeiconsIcon37, { icon: ArrowDown01Icon, size: 20, className: "text-neutral-500" }))))), /* @__PURE__ */ React51.createElement("div", { className: "p-5 flex justify-end shrink-0" }, /* @__PURE__ */ React51.createElement(
|
|
5732
|
+
"button",
|
|
5733
|
+
{
|
|
5734
|
+
onClick: handleSave,
|
|
5735
|
+
className: "text-[#068afe] hover:text-[#0573d6] transition-colors outline-none text-[13px] tracking-wide"
|
|
5736
|
+
},
|
|
5737
|
+
"Done"
|
|
5738
|
+
))));
|
|
5739
|
+
};
|
|
5740
|
+
|
|
5741
|
+
// src/components/UniversalCreateHuddle.tsx
|
|
5742
|
+
var MemberAvatar3 = ({ src, sizeClass = "w-10 h-10" }) => {
|
|
5743
|
+
const [loaded, setLoaded] = useState38(false);
|
|
5744
|
+
const [error, setError] = useState38(false);
|
|
5745
|
+
const defaultAvatar = "https://storage.googleapis.com/retina-cloud-v2/assets/images/avatar.avif";
|
|
5746
|
+
return /* @__PURE__ */ React52.createElement("div", { className: `relative shrink-0 ${sizeClass}` }, /* @__PURE__ */ React52.createElement("div", { className: "w-full h-full rounded-lg bg-neutral-100 flex items-center justify-center overflow-hidden" }, !loaded && !error && /* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: Loading03Icon24, className: "animate-spin text-neutral-400 absolute", size: 14 }), /* @__PURE__ */ React52.createElement(
|
|
5747
|
+
"img",
|
|
5748
|
+
{
|
|
5749
|
+
src: error || !src ? defaultAvatar : src,
|
|
5750
|
+
alt: "Avatar",
|
|
5751
|
+
className: `w-full h-full object-cover transition-opacity duration-300 ${loaded || error ? "opacity-100" : "opacity-0"}`,
|
|
5752
|
+
onLoad: () => setLoaded(true),
|
|
5753
|
+
onError: () => setError(true)
|
|
5754
|
+
}
|
|
5755
|
+
)));
|
|
5756
|
+
};
|
|
5757
|
+
var STANDARD_TIMEZONES = [
|
|
5758
|
+
"UTC",
|
|
5759
|
+
"America/New_York",
|
|
5760
|
+
"America/Chicago",
|
|
5761
|
+
"America/Denver",
|
|
5762
|
+
"America/Los_Angeles",
|
|
5763
|
+
"Europe/London",
|
|
5764
|
+
"Europe/Paris",
|
|
5765
|
+
"Europe/Berlin",
|
|
5766
|
+
"Africa/Lagos",
|
|
5767
|
+
"Africa/Johannesburg",
|
|
5768
|
+
"Asia/Dubai",
|
|
5769
|
+
"Asia/Kolkata",
|
|
5770
|
+
"Asia/Singapore",
|
|
5771
|
+
"Asia/Tokyo",
|
|
5772
|
+
"Australia/Sydney"
|
|
5773
|
+
];
|
|
5774
|
+
var UniversalCreateHuddle = ({
|
|
5775
|
+
onBackHref,
|
|
5776
|
+
members,
|
|
5777
|
+
isMembersLoading,
|
|
5778
|
+
membersCurrentPage,
|
|
5779
|
+
membersTotalPages,
|
|
5780
|
+
onMembersPageChange,
|
|
5781
|
+
membersSearchQuery,
|
|
5782
|
+
onMembersSearchChange,
|
|
5783
|
+
onCreateSubmit
|
|
5784
|
+
}) => {
|
|
5785
|
+
const [huddleDate, setHuddleDate] = useState38(() => {
|
|
5786
|
+
const d = /* @__PURE__ */ new Date();
|
|
5787
|
+
d.setHours(d.getHours() + 1, 0, 0, 0);
|
|
5788
|
+
return d;
|
|
5789
|
+
});
|
|
5790
|
+
const [title, setTitle] = useState38("");
|
|
5791
|
+
const [isPrivate, setIsPrivate] = useState38(false);
|
|
5792
|
+
const [timezone, setTimezone] = useState38("UTC");
|
|
5793
|
+
useEffect21(() => {
|
|
5794
|
+
try {
|
|
5795
|
+
setTimezone(Intl.DateTimeFormat().resolvedOptions().timeZone);
|
|
5796
|
+
} catch (e) {
|
|
5797
|
+
}
|
|
5798
|
+
}, []);
|
|
5799
|
+
const [calendarMode, setCalendarMode] = useState38(null);
|
|
5800
|
+
const [showTimezoneModal, setShowTimezoneModal] = useState38(false);
|
|
5801
|
+
const [showMembersModal, setShowMembersModal] = useState38(false);
|
|
5802
|
+
const [selectedParticipants, setSelectedParticipants] = useState38(/* @__PURE__ */ new Set());
|
|
5803
|
+
const [isSubmitting, setIsSubmitting] = useState38(false);
|
|
5804
|
+
const [localSearchQuery, setLocalSearchQuery] = useState38(membersSearchQuery);
|
|
5805
|
+
const [isTyping, setIsTyping] = useState38(false);
|
|
5806
|
+
const typingTimer = useRef14(null);
|
|
5807
|
+
const handleSearchInput = (e) => {
|
|
5808
|
+
const val = e.target.value;
|
|
5809
|
+
setLocalSearchQuery(val);
|
|
5810
|
+
setIsTyping(true);
|
|
5811
|
+
if (typingTimer.current) clearTimeout(typingTimer.current);
|
|
5812
|
+
typingTimer.current = setTimeout(() => {
|
|
5813
|
+
onMembersSearchChange(val);
|
|
5814
|
+
setTimeout(() => setIsTyping(false), 150);
|
|
5815
|
+
}, 600);
|
|
5816
|
+
};
|
|
5817
|
+
const toggleParticipant = (userId) => {
|
|
5818
|
+
const newSet = new Set(selectedParticipants);
|
|
5819
|
+
if (newSet.has(userId)) newSet.delete(userId);
|
|
5820
|
+
else newSet.add(userId);
|
|
5821
|
+
setSelectedParticipants(newSet);
|
|
5822
|
+
};
|
|
5823
|
+
const handleSubmit = async (e) => {
|
|
5824
|
+
e.preventDefault();
|
|
5825
|
+
const cleanTitle = title.trim();
|
|
5826
|
+
if (cleanTitle.length < 2) return toast15.error("Please enter a valid huddle name.");
|
|
5827
|
+
if (isPrivate && selectedParticipants.size === 0) return toast15.error("Private huddles require at least one participant.");
|
|
5828
|
+
setIsSubmitting(true);
|
|
5829
|
+
try {
|
|
5830
|
+
await onCreateSubmit({
|
|
5831
|
+
title: cleanTitle,
|
|
5832
|
+
huddleType: isPrivate ? "PRIVATE" : "PUBLIC",
|
|
5833
|
+
startTime: huddleDate.toISOString(),
|
|
5834
|
+
timezone,
|
|
5835
|
+
participantIds: isPrivate ? Array.from(selectedParticipants) : []
|
|
5836
|
+
});
|
|
5837
|
+
} catch (error) {
|
|
5838
|
+
toast15.error(error.message || "Failed to schedule huddle.");
|
|
5839
|
+
setIsSubmitting(false);
|
|
5840
|
+
}
|
|
5841
|
+
};
|
|
5842
|
+
return /* @__PURE__ */ React52.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ React52.createElement(ManagedToaster, null), /* @__PURE__ */ React52.createElement("div", { className: "mb-6 flex w-full items-center px-1" }, /* @__PURE__ */ React52.createElement("a", { href: onBackHref, className: "flex items-center gap-2 text-[#068afe] hover:text-[#068afe] transition-colors text-[13px] outline-none" }, /* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: ArrowLeft01Icon18, size: 16 }), " Back")), /* @__PURE__ */ React52.createElement("div", { className: "flex flex-col gap-1 mb-8 px-1" }, /* @__PURE__ */ React52.createElement("h1", { className: "text-black text-xl tracking-tight" }, "Create Huddle"), /* @__PURE__ */ React52.createElement("p", { className: "text-xs text-neutral-500" }, "Schedule a new workspace huddle and manage participant access.")), /* @__PURE__ */ React52.createElement("div", { className: "flex flex-col gap-8 animate-in rounded-2xl p-6 bg-white fade-in duration-300" }, /* @__PURE__ */ React52.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSubmit, autoComplete: "off" }, /* @__PURE__ */ React52.createElement(
|
|
5843
|
+
TextInput,
|
|
5844
|
+
{
|
|
5845
|
+
label: "Huddle Subject",
|
|
5846
|
+
value: title,
|
|
5847
|
+
onChange: (val) => setTitle(val.substring(0, 80)),
|
|
5848
|
+
disabled: isSubmitting,
|
|
5849
|
+
placeholder: "e.g. Q4 Engineering Sync",
|
|
5850
|
+
maxLength: 80
|
|
5851
|
+
}
|
|
5852
|
+
), /* @__PURE__ */ React52.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-6" }, /* @__PURE__ */ React52.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ React52.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, "Date"), /* @__PURE__ */ React52.createElement(
|
|
5853
|
+
"div",
|
|
5854
|
+
{
|
|
5855
|
+
onClick: () => !isSubmitting && setCalendarMode("DATE"),
|
|
5856
|
+
className: `flex items-center relative w-full border-b border-neutral-200 transition-all duration-300 pb-3 pt-3 cursor-pointer ${isSubmitting ? "opacity-50 pointer-events-none" : "hover:border-black"}`
|
|
5857
|
+
},
|
|
5858
|
+
/* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: Calendar01Icon, size: 16, className: "text-neutral-400 absolute left-0" }),
|
|
5859
|
+
/* @__PURE__ */ React52.createElement("span", { className: "w-full pl-8 text-sm text-black truncate block" }, huddleDate.toLocaleDateString("en-GB", { day: "2-digit", month: "short", year: "numeric" }))
|
|
5860
|
+
)), /* @__PURE__ */ React52.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ React52.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, "Time"), /* @__PURE__ */ React52.createElement(
|
|
5861
|
+
"div",
|
|
5862
|
+
{
|
|
5863
|
+
onClick: () => !isSubmitting && setCalendarMode("TIME"),
|
|
5864
|
+
className: `flex items-center relative w-full border-b border-neutral-200 transition-all duration-300 pb-3 pt-3 cursor-pointer ${isSubmitting ? "opacity-50 pointer-events-none" : "hover:border-black"}`
|
|
5865
|
+
},
|
|
5866
|
+
/* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: Clock01Icon, size: 16, className: "text-neutral-400 absolute left-0" }),
|
|
5867
|
+
/* @__PURE__ */ React52.createElement("span", { className: "w-full pl-8 text-sm text-black truncate block" }, huddleDate.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }))
|
|
5868
|
+
)), /* @__PURE__ */ React52.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ React52.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, "Timezone"), /* @__PURE__ */ React52.createElement(
|
|
5869
|
+
"div",
|
|
5870
|
+
{
|
|
5871
|
+
onClick: () => !isSubmitting && setShowTimezoneModal(true),
|
|
5872
|
+
className: `flex items-center relative w-full border-b border-neutral-200 transition-all duration-300 pb-3 pt-3 cursor-pointer ${isSubmitting ? "opacity-50 pointer-events-none" : "hover:border-black"}`
|
|
5873
|
+
},
|
|
5874
|
+
/* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: Globe02Icon, size: 16, className: "text-neutral-400 absolute left-0" }),
|
|
5875
|
+
/* @__PURE__ */ React52.createElement("span", { className: "w-full pl-8 text-sm text-black truncate block" }, timezone)
|
|
5876
|
+
))), /* @__PURE__ */ React52.createElement("div", { className: "flex items-center justify-between py-2 border-t border-b border-neutral-100 mt-2" }, /* @__PURE__ */ React52.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React52.createElement("span", { className: "text-[13px] text-black tracking-tight" }, "Private Huddle"), /* @__PURE__ */ React52.createElement("span", { className: "text-[11px] text-neutral-500" }, "Only invited members can join.")), /* @__PURE__ */ React52.createElement(
|
|
5877
|
+
"button",
|
|
5878
|
+
{
|
|
5879
|
+
type: "button",
|
|
5880
|
+
onClick: () => setIsPrivate(!isPrivate),
|
|
5881
|
+
disabled: isSubmitting,
|
|
5882
|
+
className: `relative w-11 h-6 rounded-full transition-colors outline-none shrink-0 ${isPrivate ? "bg-[#068afe]" : "bg-neutral-200"}`
|
|
5883
|
+
},
|
|
5884
|
+
/* @__PURE__ */ React52.createElement("div", { className: `absolute top-1 left-1 bg-white w-4 h-4 rounded-full transition-transform ${isPrivate ? "translate-x-5" : "translate-x-0"}` })
|
|
5885
|
+
)), isPrivate && /* @__PURE__ */ React52.createElement("div", { className: "flex items-center justify-between animate-in fade-in zoom-in-95 duration-200 bg-neutral-50 p-4 rounded-xl" }, /* @__PURE__ */ React52.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React52.createElement("span", { className: "text-[12px] text-black tracking-tight" }, "Participants"), /* @__PURE__ */ React52.createElement("span", { className: "text-[11px] text-[#068afe] " }, selectedParticipants.size === 0 ? "0 added" : selectedParticipants.size >= 1e3 ? `${(selectedParticipants.size / 1e3).toFixed(1)}k+ added` : `${selectedParticipants.size} added`)), /* @__PURE__ */ React52.createElement(
|
|
5886
|
+
"button",
|
|
5887
|
+
{
|
|
5888
|
+
type: "button",
|
|
5889
|
+
onClick: () => setShowMembersModal(true),
|
|
5890
|
+
disabled: isSubmitting,
|
|
5891
|
+
className: "px-4 py-2 border border-neutral-200 text-black text-[11px] tracking-wide rounded-full hover:bg-white transition-colors outline-none bg-transparent"
|
|
5892
|
+
},
|
|
5893
|
+
"Manage Access"
|
|
5894
|
+
)), /* @__PURE__ */ React52.createElement("div", { className: "pt-6" }, /* @__PURE__ */ React52.createElement(
|
|
5895
|
+
ThreeDActionButton,
|
|
5896
|
+
{
|
|
5897
|
+
type: "submit",
|
|
5898
|
+
disabled: isSubmitting || title.trim().length < 2 || isPrivate && selectedParticipants.size === 0,
|
|
5899
|
+
isLoading: isSubmitting,
|
|
5900
|
+
className: "w-full sm:w-auto min-w-40"
|
|
5901
|
+
},
|
|
5902
|
+
"Schedule Huddle"
|
|
5903
|
+
)))), /* @__PURE__ */ React52.createElement(
|
|
5904
|
+
CalendarPicker,
|
|
5905
|
+
{
|
|
5906
|
+
isOpen: calendarMode !== null,
|
|
5907
|
+
onClose: () => setCalendarMode(null),
|
|
5908
|
+
initialDate: huddleDate,
|
|
5909
|
+
defaultMode: calendarMode || "DATE",
|
|
5910
|
+
onConfirm: (d) => setHuddleDate(d)
|
|
5911
|
+
}
|
|
5912
|
+
), /* @__PURE__ */ React52.createElement(
|
|
5913
|
+
ReusableOptions,
|
|
5914
|
+
{
|
|
5915
|
+
isOpen: showTimezoneModal,
|
|
5916
|
+
onClose: () => setShowTimezoneModal(false),
|
|
5917
|
+
title: "Select Timezone",
|
|
5918
|
+
options: STANDARD_TIMEZONES,
|
|
5919
|
+
selectedOption: timezone,
|
|
5920
|
+
onSelect: (tz) => setTimezone(tz),
|
|
5921
|
+
showSearch: true
|
|
5922
|
+
}
|
|
5923
|
+
), showMembersModal && /* @__PURE__ */ React52.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React52.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setShowMembersModal(false) }), /* @__PURE__ */ React52.createElement("div", { className: "relative w-full max-w-md bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200 h-[80vh]" }, /* @__PURE__ */ React52.createElement("div", { className: "flex items-center justify-between p-5 shrink-0 " }, /* @__PURE__ */ React52.createElement("h3", { className: "text-[15px] text-black tracking-tight" }, "Select Participants"), /* @__PURE__ */ React52.createElement("button", { onClick: () => setShowMembersModal(false), className: "text-[#068afe] hover:text-[#068afe] transition-colors outline-none text-[13px] " }, "Done")), /* @__PURE__ */ React52.createElement("div", { className: "p-4 shrink-0 " }, /* @__PURE__ */ React52.createElement("div", { className: "relative w-full" }, /* @__PURE__ */ React52.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: Search01Icon6, size: 16, className: "text-neutral-400" })), /* @__PURE__ */ React52.createElement(
|
|
5924
|
+
"input",
|
|
5925
|
+
{
|
|
5926
|
+
type: "text",
|
|
5927
|
+
placeholder: "Search team...",
|
|
5928
|
+
value: localSearchQuery,
|
|
5929
|
+
onChange: handleSearchInput,
|
|
5930
|
+
className: "w-full pl-10 pr-4 py-2.5 bg-neutral-100 rounded-full text-[13px] text-black placeholder-neutral-400 outline-none focus:bg-neutral-200 transition-colors"
|
|
5931
|
+
}
|
|
5932
|
+
))), /* @__PURE__ */ React52.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-2 relative" }, isMembersLoading || isTyping ? /* @__PURE__ */ React52.createElement("div", { className: "absolute inset-0 flex items-center justify-center" }, /* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: Loading03Icon24, size: 28, className: "animate-spin text-black" })) : members.length === 0 ? /* @__PURE__ */ React52.createElement("div", { className: "p-8 text-center text-xs text-neutral-400" }, "No members found.") : members.map((member) => {
|
|
5933
|
+
const isChecked = selectedParticipants.has(member.userId);
|
|
5934
|
+
return /* @__PURE__ */ React52.createElement(
|
|
5935
|
+
"div",
|
|
5936
|
+
{
|
|
5937
|
+
key: member.id,
|
|
5938
|
+
onClick: () => toggleParticipant(member.userId),
|
|
5939
|
+
className: "flex items-center justify-between p-3 rounded-xl cursor-pointer hover:bg-neutral-50 transition-colors select-none"
|
|
5940
|
+
},
|
|
5941
|
+
/* @__PURE__ */ React52.createElement("div", { className: "flex items-center gap-3 min-w-0 flex-1" }, /* @__PURE__ */ React52.createElement(MemberAvatar3, { src: member.avatarUrl, sizeClass: "w-9 h-9" }), /* @__PURE__ */ React52.createElement("div", { className: "flex flex-col min-w-0 flex-1" }, /* @__PURE__ */ React52.createElement("span", { className: "text-[13px] text-black truncate" }, member.fullName), /* @__PURE__ */ React52.createElement("span", { className: "text-[11px] text-neutral-400 capitalize truncate" }, member.role.toLowerCase()))),
|
|
5942
|
+
/* @__PURE__ */ React52.createElement("div", { className: "shrink-0 pl-3" }, /* @__PURE__ */ React52.createElement("div", { className: `w-5 h-5 rounded-full flex items-center justify-center transition-colors ${isChecked ? "bg-[#068afe]" : "border border-neutral-300 bg-white"}` }, isChecked && /* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: Tick02Icon, size: 14, className: "text-white" })))
|
|
5943
|
+
);
|
|
5944
|
+
})), /* @__PURE__ */ React52.createElement("div", { className: "p-4 flex items-center justify-between shrink-0 bg-white" }, /* @__PURE__ */ React52.createElement("span", { className: "text-[10px] text-neutral-400 tracking-widest" }, "Page ", membersCurrentPage, " of ", membersTotalPages === 0 ? 1 : membersTotalPages), /* @__PURE__ */ React52.createElement("div", { className: "flex gap-1" }, /* @__PURE__ */ React52.createElement(
|
|
5945
|
+
"button",
|
|
5946
|
+
{
|
|
5947
|
+
disabled: membersCurrentPage <= 1 || isMembersLoading,
|
|
5948
|
+
onClick: () => onMembersPageChange(membersCurrentPage - 1),
|
|
5949
|
+
className: "w-7 h-7 flex items-center justify-center rounded-full bg-white border border-neutral-200 text-neutral-600 disabled:opacity-30 outline-none hover:bg-neutral-50 transition-colors"
|
|
5950
|
+
},
|
|
5951
|
+
/* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: ArrowLeft01Icon18, size: 12 })
|
|
5952
|
+
), /* @__PURE__ */ React52.createElement(
|
|
5953
|
+
"button",
|
|
5954
|
+
{
|
|
5955
|
+
disabled: membersCurrentPage >= membersTotalPages || membersTotalPages === 0 || isMembersLoading,
|
|
5956
|
+
onClick: () => onMembersPageChange(membersCurrentPage + 1),
|
|
5957
|
+
className: "w-7 h-7 flex items-center justify-center rounded-full bg-white border border-neutral-200 text-neutral-600 disabled:opacity-30 outline-none hover:bg-neutral-50 transition-colors"
|
|
5958
|
+
},
|
|
5959
|
+
/* @__PURE__ */ React52.createElement(HugeiconsIcon38, { icon: ArrowRight01Icon14, size: 12 })
|
|
5960
|
+
))))));
|
|
5961
|
+
};
|
|
5574
5962
|
export {
|
|
5575
5963
|
AppBento2,
|
|
5576
5964
|
CardInfoDialog,
|
|
@@ -5605,6 +5993,7 @@ export {
|
|
|
5605
5993
|
UniversalBuyCryptoPage,
|
|
5606
5994
|
UniversalCardActionPage,
|
|
5607
5995
|
UniversalCardPage,
|
|
5996
|
+
UniversalCreateHuddle,
|
|
5608
5997
|
UniversalErrorView,
|
|
5609
5998
|
UniversalHome2,
|
|
5610
5999
|
UniversalHomeView,
|