@getmicdrop/svelte-components 5.6.1 → 5.7.2
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/calendar/AboutShow/AboutShow.svelte +172 -172
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
- package/dist/calendar/FAQs/FAQs.svelte +75 -75
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
- package/dist/calendar/OrderSummary/OrderSummary.svelte +367 -367
- package/dist/calendar/PublicCard/PublicCard.svelte +134 -134
- package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
- package/dist/components/Heading.svelte +58 -0
- package/dist/components/Heading.svelte.d.ts +12 -0
- package/dist/components/Heading.svelte.d.ts.map +1 -0
- package/dist/components/Layout/AppShell.svelte +104 -104
- package/dist/components/Layout/ContentSection.svelte +80 -80
- package/dist/components/Layout/Grid.svelte +4 -4
- package/dist/components/Layout/Heading.svelte +81 -81
- package/dist/components/Layout/PageContainer.svelte +69 -69
- package/dist/components/Layout/Responsive.svelte +75 -75
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/ShowOnDesktop.svelte +37 -37
- package/dist/components/Layout/ShowOnMobile.svelte +37 -37
- package/dist/components/Layout/Sidebar.svelte +108 -108
- package/dist/components/Layout/Stack.spec.js +1 -1
- package/dist/components/Layout/Stack.svelte +6 -6
- package/dist/components/Layout/Text.svelte +87 -87
- package/dist/components/Layout/TwoColumn.svelte +108 -108
- package/dist/components/Layout/index.d.ts +10 -0
- package/dist/components/Layout/index.d.ts.map +1 -0
- package/dist/components/Layout/index.js +14 -0
- package/dist/components/Text.svelte +53 -0
- package/dist/components/Text.svelte.d.ts +12 -0
- package/dist/components/Text.svelte.d.ts.map +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +12 -0
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/datetime/__tests__/format.test.js +1 -1
- package/dist/datetime/__tests__/parse.test.js +1 -1
- package/dist/datetime/__tests__/timezone.test.js +1 -1
- package/dist/datetime/parse.js +1 -1
- package/dist/forms/createFormStore.svelte.js +0 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +10 -1
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.svelte +24 -24
- package/dist/patterns/data/DataTable.svelte +36 -36
- package/dist/patterns/forms/FormActions.spec.js +95 -95
- package/dist/patterns/forms/FormActions.stories.svelte +97 -97
- package/dist/patterns/forms/FormActions.svelte +46 -46
- package/dist/patterns/forms/FormGrid.svelte +33 -33
- package/dist/patterns/forms/FormSection.svelte +32 -32
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
- package/dist/patterns/forms/FormValidationSummary.svelte +74 -74
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/layout/index.d.ts +0 -2
- package/dist/patterns/layout/index.js +3 -2
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +74 -74
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +193 -193
- package/dist/patterns/page/PageHeader.svelte +18 -18
- package/dist/patterns/page/PageLayout.svelte +40 -40
- package/dist/patterns/page/PageLoader.spec.js +57 -57
- package/dist/patterns/page/PageLoader.stories.svelte +137 -137
- package/dist/patterns/page/PageLoader.svelte +24 -24
- package/dist/patterns/page/SectionHeader.svelte +29 -29
- package/dist/presets/badges.js +112 -112
- package/dist/presets/buttons.js +76 -76
- package/dist/presets/index.js +9 -9
- package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
- package/dist/primitives/Accordion/Accordion.svelte +42 -42
- package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
- package/dist/primitives/Alert/Alert.spec.js +173 -173
- package/dist/primitives/Alert/Alert.stories.svelte +88 -88
- package/dist/primitives/Alert/Alert.svelte +27 -27
- package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
- package/dist/primitives/Avatar/Avatar.svelte +66 -66
- package/dist/primitives/Badges/Badge.spec.js +144 -144
- package/dist/primitives/Badges/Badge.stories.svelte +86 -86
- package/dist/primitives/Badges/Badge.svelte +79 -79
- package/dist/primitives/BottomSheet/BottomSheet.spec.js +136 -136
- package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
- package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +122 -122
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
- package/dist/primitives/Button/Button.spec.js +223 -223
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +270 -270
- package/dist/primitives/Button/ButtonSaveDemo.spec.js +146 -146
- package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
- package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
- package/dist/primitives/Card.spec.js +49 -49
- package/dist/primitives/Card.stories.svelte +22 -22
- package/dist/primitives/Card.svelte +28 -28
- package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
- package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
- package/dist/primitives/DarkModeToggle.spec.js +390 -390
- package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
- package/dist/primitives/DarkModeToggle.svelte +136 -136
- package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
- package/dist/primitives/Drawer/Drawer.svelte +120 -120
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
- package/dist/primitives/Dropdown/DropdownDivider.svelte +9 -9
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- package/dist/primitives/Helper/Helper.svelte +33 -33
- package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
- package/dist/primitives/Icons/ArrowRight.svelte +8 -8
- package/dist/primitives/Icons/Availability.svelte +14 -14
- package/dist/primitives/Icons/Back.svelte +14 -14
- package/dist/primitives/Icons/CheckCircle.svelte +6 -6
- package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
- package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
- package/dist/primitives/Icons/ChevronRight.svelte +4 -4
- package/dist/primitives/Icons/Copy.svelte +15 -15
- package/dist/primitives/Icons/Cross.svelte +5 -5
- package/dist/primitives/Icons/DownArrow.svelte +8 -8
- package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
- package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
- package/dist/primitives/Icons/Home.svelte +15 -15
- package/dist/primitives/Icons/Icon.spec.js +169 -169
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +52 -52
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/Info.svelte +7 -7
- package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
- package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
- package/dist/primitives/Icons/Message.svelte +15 -15
- package/dist/primitives/Icons/MoonIcon.svelte +5 -5
- package/dist/primitives/Icons/More.svelte +21 -21
- package/dist/primitives/Icons/MoreHori.spec.js +61 -61
- package/dist/primitives/Icons/MoreHori.svelte +22 -22
- package/dist/primitives/Icons/Notification.svelte +14 -14
- package/dist/primitives/Icons/Payment.svelte +14 -14
- package/dist/primitives/Icons/Profile.svelte +21 -21
- package/dist/primitives/Icons/Reload.svelte +29 -29
- package/dist/primitives/Icons/Shows.svelte +21 -21
- package/dist/primitives/Icons/Signout.svelte +21 -21
- package/dist/primitives/Icons/SunIcon.svelte +8 -8
- package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
- package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
- package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
- package/dist/primitives/Icons/WarningIcon.svelte +5 -5
- package/dist/primitives/Input/Input.spec.js +573 -573
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/Select.spec.js +212 -212
- package/dist/primitives/Input/Select.stories.svelte +112 -112
- package/dist/primitives/Input/Select.svelte +128 -128
- package/dist/primitives/Input/Textarea.stories.svelte +137 -137
- package/dist/primitives/Input/Textarea.svelte +35 -35
- package/dist/primitives/Label/Label.svelte +37 -37
- package/dist/primitives/Modal/Modal.spec.js +99 -99
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
- package/dist/primitives/Pagination/Pagination.svelte +261 -261
- package/dist/primitives/Radio/Radio.stories.svelte +80 -80
- package/dist/primitives/Radio/Radio.svelte +67 -67
- package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
- package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
- package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
- package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
- package/dist/primitives/Spinner/Spinner.spec.js +71 -71
- package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
- package/dist/primitives/Spinner/Spinner.svelte +20 -20
- package/dist/primitives/Tabs/TabItem.svelte +49 -49
- package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
- package/dist/primitives/Tabs/Tabs.svelte +123 -123
- package/dist/primitives/Toggle.spec.js +143 -143
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Tooltip/Tooltip.svelte +83 -83
- package/dist/primitives/Typography/Typography.svelte +53 -53
- package/dist/primitives/ValidationError.spec.js +103 -103
- package/dist/primitives/ValidationError.stories.svelte +69 -69
- package/dist/primitives/ValidationError.svelte +29 -29
- package/dist/primitives/index.js +91 -91
- package/dist/recipes/CropImage/CropImage.spec.js +208 -208
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +238 -238
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
- package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
- package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
- package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +133 -133
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
- package/dist/recipes/fields/CheckboxField.svelte +85 -85
- package/dist/recipes/fields/FormField.svelte +58 -58
- package/dist/recipes/fields/RadioGroup.svelte +95 -95
- package/dist/recipes/fields/SelectField.svelte +80 -80
- package/dist/recipes/fields/TextareaField.svelte +97 -97
- package/dist/recipes/fields/ToggleField.svelte +60 -60
- package/dist/recipes/fields/index.js +7 -7
- package/dist/recipes/inputs/MultiSelect.spec.js +258 -258
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/OTPInput.spec.js +251 -251
- package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
- package/dist/recipes/inputs/OTPInput.svelte +29 -29
- package/dist/recipes/inputs/PasswordInput.svelte +22 -22
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +117 -117
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
- package/dist/recipes/inputs/Search.svelte +37 -37
- package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
- package/dist/recipes/modals/AlertModal.svelte +130 -130
- package/dist/recipes/modals/ConfirmationModal.spec.js +206 -206
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
- package/dist/recipes/modals/InputModal.svelte +182 -182
- package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
- package/dist/recipes/modals/ModalStateManager.svelte +77 -77
- package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
- package/dist/recipes/modals/StatusModal.svelte +206 -206
- package/dist/services/EventService.js +75 -75
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.spec.js +345 -345
- package/dist/stores/auth.js +36 -44
- package/dist/stores/auth.spec.js +139 -139
- package/dist/stores/formDataStore.d.ts.map +1 -1
- package/dist/stores/formDataStore.js +0 -8
- package/dist/stores/formSave.d.ts.map +1 -1
- package/dist/stores/formSave.js +0 -8
- package/dist/stores/navigation.d.ts.map +1 -1
- package/dist/stores/navigation.js +0 -8
- package/dist/stores/toaster.js +13 -13
- package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
- package/dist/stories/ButtonAuditReview.svelte +427 -427
- package/dist/stories/PatternsGallery.stories.svelte +19 -19
- package/dist/stories/PatternsGallery.svelte +206 -206
- package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
- package/dist/stories/PrimitivesGallery.svelte +725 -725
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +271 -271
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/telemetry.js +405 -405
- package/dist/telemetry.spec.js +1169 -1169
- package/dist/tokens/tokens.css +87 -87
- package/dist/tokens/typography-base.css +163 -163
- package/dist/utils/apiConfig.spec.js +219 -219
- package/dist/utils/transitions.js +62 -62
- package/dist/utils/utils.js +354 -354
- package/package.json +1 -1
- package/dist/stores/auth.svelte.d.ts +0 -39
- package/dist/stores/auth.svelte.d.ts.map +0 -1
- package/dist/stores/auth.svelte.js +0 -60
- package/dist/stores/formDataStore.svelte.d.ts +0 -47
- package/dist/stores/formDataStore.svelte.d.ts.map +0 -1
- package/dist/stores/formDataStore.svelte.js +0 -84
- package/dist/stores/formSave.svelte.d.ts +0 -33
- package/dist/stores/formSave.svelte.d.ts.map +0 -1
- package/dist/stores/formSave.svelte.js +0 -113
- package/dist/stores/navigation.svelte.d.ts +0 -35
- package/dist/stores/navigation.svelte.d.ts.map +0 -1
- package/dist/stores/navigation.svelte.js +0 -69
package/dist/utils/utils.js
CHANGED
|
@@ -1,357 +1,357 @@
|
|
|
1
|
-
import { twMerge } from "tailwind-merge";
|
|
2
|
-
import clsx from "clsx";
|
|
3
|
-
import EventIcon from "../assets/svg/role/event.svg";
|
|
4
|
-
import BookingIcon from "../assets/svg/role/booking.svg";
|
|
5
|
-
import EmailIcon from "../assets/svg/role/emails.svg";
|
|
6
|
-
import VenueIcon from "../assets/svg/role/venue.svg";
|
|
7
|
-
import PayoutIcon from "../assets/svg/role/payout.svg";
|
|
8
|
-
import MarketingIcon from "../assets/svg/role/marketing.svg";
|
|
9
|
-
import OrdersIcon from "../assets/svg/role/orders.svg";
|
|
10
|
-
import OrganisationIcon from "../assets/svg/role/organisation.svg";
|
|
11
|
-
import ReportingIcon from "../assets/svg/role/reporting.svg";
|
|
12
|
-
import microphonePlaceholder from "../assets/images/microphone.png";
|
|
13
|
-
|
|
14
|
-
export function classNames(...classes) {
|
|
15
|
-
return classes.filter(Boolean).join(" ");
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function truncateTitle(title, maxLength) {
|
|
19
|
-
if (title.length > maxLength) {
|
|
20
|
-
return title.slice(0, maxLength) + "...";
|
|
21
|
-
}
|
|
22
|
-
return title;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function convertToCustomDateFormat(isoString) {
|
|
26
|
-
const date = new Date(isoString);
|
|
27
|
-
|
|
28
|
-
const year = date.getUTCFullYear();
|
|
29
|
-
const month = date.getUTCMonth();
|
|
30
|
-
const day = date.getUTCDate();
|
|
31
|
-
|
|
32
|
-
const customDate = new Date(year, month, day);
|
|
33
|
-
|
|
34
|
-
return customDate;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function cn(...inputs) {
|
|
38
|
-
return twMerge(clsx(inputs));
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function getDays(params) {
|
|
42
|
-
if (params === "weeks") {
|
|
43
|
-
return [
|
|
44
|
-
{ value: "monday", label: "Monday" },
|
|
45
|
-
{ value: "tuesday", label: "Tuesday" },
|
|
46
|
-
{ value: "wednesday", label: "Wednesday" },
|
|
47
|
-
{ value: "thursday", label: "Thursday" },
|
|
48
|
-
{ value: "friday", label: "Friday" },
|
|
49
|
-
];
|
|
50
|
-
} else {
|
|
51
|
-
return Array.from({ length: 31 }, (_, i) => {
|
|
52
|
-
const day = i + 1;
|
|
53
|
-
const suffix =
|
|
54
|
-
day % 10 === 1 && day !== 11
|
|
55
|
-
? "st"
|
|
56
|
-
: day % 10 === 2 && day !== 12
|
|
57
|
-
? "nd"
|
|
58
|
-
: day % 10 === 3 && day !== 13
|
|
59
|
-
? "rd"
|
|
60
|
-
: "th";
|
|
61
|
-
return {
|
|
62
|
-
value: day.toString(),
|
|
63
|
-
label: day + suffix,
|
|
64
|
-
};
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Function to get days number options based on selected time unit
|
|
70
|
-
export function getDaysNumberOptions(timeUnit) {
|
|
71
|
-
if (timeUnit === "months") {
|
|
72
|
-
return Array.from({ length: 12 }, (_, i) => ({
|
|
73
|
-
value: (i + 1).toString(),
|
|
74
|
-
label: (i + 1).toString(),
|
|
75
|
-
}));
|
|
76
|
-
} else if (timeUnit === "weeks") {
|
|
77
|
-
return Array.from({ length: 10 }, (_, i) => ({
|
|
78
|
-
value: (i + 1).toString(),
|
|
79
|
-
label: (i + 1).toString(),
|
|
80
|
-
}));
|
|
81
|
-
} else {
|
|
82
|
-
return Array.from({ length: 31 }, (_, i) => ({
|
|
83
|
-
value: (i + 1).toString(),
|
|
84
|
-
label: (i + 1).toString(),
|
|
85
|
-
}));
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export const ROLE_PERMISSION_LIST = [
|
|
90
|
-
{
|
|
91
|
-
icon: EventIcon,
|
|
92
|
-
title: "Event creation",
|
|
93
|
-
description:
|
|
94
|
-
"Allow users to enter event info, create tickets & customize order forms",
|
|
95
|
-
checkbox: [
|
|
96
|
-
"Create Events",
|
|
97
|
-
"Edit Event Details",
|
|
98
|
-
"Manage event status",
|
|
99
|
-
"Manage tickets",
|
|
100
|
-
"Manage Collections",
|
|
101
|
-
],
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
icon: BookingIcon,
|
|
105
|
-
title: "Booking",
|
|
106
|
-
description:
|
|
107
|
-
"Allow users to manage performers, their invitations and statuses",
|
|
108
|
-
checkbox: [
|
|
109
|
-
"Access the roster page and view performer profiles",
|
|
110
|
-
"Edit performer profiles",
|
|
111
|
-
"Send booking invitations",
|
|
112
|
-
"Manually confirm/decline performers to spots",
|
|
113
|
-
"Send avails requests",
|
|
114
|
-
],
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
icon: VenueIcon,
|
|
118
|
-
title: "Venue creation",
|
|
119
|
-
description: "Allow users to create new venues",
|
|
120
|
-
checkbox: ["Add/edit/delete venues"],
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
icon: MarketingIcon,
|
|
124
|
-
title: "Marketing",
|
|
125
|
-
description:
|
|
126
|
-
"Sell more tickets by creating campaigns, tracking engagements, etc.",
|
|
127
|
-
checkbox: [
|
|
128
|
-
"Access social media posts",
|
|
129
|
-
"Manage tracking links",
|
|
130
|
-
"Manage promo codes",
|
|
131
|
-
],
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
icon: OrdersIcon,
|
|
135
|
-
title: "Orders & attendees",
|
|
136
|
-
description:
|
|
137
|
-
"Allow users to view, update & refund orders, manage attendee guest or waitlists & release tickets",
|
|
138
|
-
checkbox: [
|
|
139
|
-
"Add attendees",
|
|
140
|
-
"Manage orders, refunds, transfers and attendees",
|
|
141
|
-
"View list of attendees",
|
|
142
|
-
"Check in attendees",
|
|
143
|
-
"Resend confirmation emails",
|
|
144
|
-
"Override ticket restrictions",
|
|
145
|
-
"Sell tickets at the door",
|
|
146
|
-
"Revoke and reissue barcodes",
|
|
147
|
-
],
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
icon: OrganisationIcon,
|
|
151
|
-
title: "Organization",
|
|
152
|
-
description:
|
|
153
|
-
"Keep your users organized with assigned permissions per user, enable access to APIs & extensions",
|
|
154
|
-
checkbox: [
|
|
155
|
-
"Manage organization members & permissions",
|
|
156
|
-
"Edit organization infomation",
|
|
157
|
-
],
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
icon: EmailIcon,
|
|
161
|
-
title: "Contacts",
|
|
162
|
-
description:
|
|
163
|
-
"Keep our users in the loop, select which emails you would like them to receive",
|
|
164
|
-
checkbox: ["Email attendees", "Email/SMS performers"],
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
icon: ReportingIcon,
|
|
168
|
-
title: "Reporting",
|
|
169
|
-
description:
|
|
170
|
-
"Allow users to access, filter & export data across your organization",
|
|
171
|
-
checkbox: ["Access reports pages"],
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
icon: PayoutIcon,
|
|
175
|
-
title: "Payouts & billing",
|
|
176
|
-
description:
|
|
177
|
-
"Users can configure payout methods, manage event payment options & track financials with reporting",
|
|
178
|
-
checkbox: ["Manage financial accounts (Stripe)"],
|
|
179
|
-
},
|
|
180
|
-
];
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Parse a location string into street address and city/state/zip components
|
|
184
|
-
* @param {string} locationString - Full location string (e.g., "3400 Warner Blvd, Burbank, CA 91505")
|
|
185
|
-
* @returns {{street: string, cityStateZip: string}} Parsed location object
|
|
186
|
-
*/
|
|
187
|
-
export function parseLocation(locationString) {
|
|
188
|
-
if (!locationString) return { street: '', cityStateZip: '' };
|
|
189
|
-
|
|
190
|
-
// Split by comma to separate components
|
|
191
|
-
const parts = locationString.split(',').map(part => part.trim());
|
|
192
|
-
|
|
193
|
-
if (parts.length >= 3) {
|
|
194
|
-
// Format: "3400 Warner Blvd, Burbank, CA 91505"
|
|
195
|
-
const street = parts[0];
|
|
196
|
-
const cityStateZip = parts.slice(1).join(', ');
|
|
197
|
-
return { street, cityStateZip };
|
|
198
|
-
} else if (parts.length === 2) {
|
|
199
|
-
// Format: "Street, City State Zip"
|
|
200
|
-
return { street: parts[0], cityStateZip: parts[1] };
|
|
201
|
-
} else {
|
|
202
|
-
// Single part or unexpected format
|
|
203
|
-
return { street: locationString, cityStateZip: '' };
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Set authentication cookies with proper domain and security settings
|
|
209
|
-
* @param {string} token - Authentication token
|
|
210
|
-
* @param {Object} userDetails - User details object
|
|
211
|
-
*/
|
|
212
|
-
export function setAuthCookies(token, userDetails, rememberMe = true) {
|
|
213
|
-
const isProd = window.location.hostname.includes("get-micdrop.com");
|
|
214
|
-
const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
|
|
215
|
-
const secureAttr = window.location.protocol === "https:" ? "secure;" : "";
|
|
216
|
-
const maxAge = rememberMe ? "max-age=2592000;" : ""; // 30 days or session
|
|
217
|
-
|
|
218
|
-
document.cookie = `performer_token=${token}; path=/; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
|
|
219
|
-
document.cookie = `userDetails=${encodeURIComponent(
|
|
220
|
-
JSON.stringify(userDetails),
|
|
221
|
-
)}; path=/; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Clear authentication cookies
|
|
226
|
-
*/
|
|
227
|
-
export function clearAuthCookies() {
|
|
228
|
-
const isProd = window.location.hostname.includes("get-micdrop.com");
|
|
229
|
-
const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
|
|
230
|
-
|
|
231
|
-
document.cookie = `userDetails=; path=/; max-age=0; ${domainAttr}`;
|
|
232
|
-
document.cookie = `performer_token=; path=/; max-age=0; ${domainAttr}`;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// Export microphone placeholder for universal event image fallback
|
|
236
|
-
export { microphonePlaceholder };
|
|
237
|
-
|
|
238
|
-
// ============================================
|
|
239
|
-
// COOKIE UTILITIES
|
|
240
|
-
// ============================================
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Parse all cookies into an object
|
|
244
|
-
* @returns {Record<string, string>} Cookie key-value pairs
|
|
245
|
-
*/
|
|
246
|
-
export function parseCookies() {
|
|
247
|
-
if (typeof document === "undefined") return {};
|
|
248
|
-
return document.cookie.split("; ").reduce((acc, cookie) => {
|
|
249
|
-
if (!cookie) return acc;
|
|
250
|
-
const [name, ...valueParts] = cookie.split("=");
|
|
251
|
-
acc[name] = decodeURIComponent(valueParts.join("="));
|
|
252
|
-
return acc;
|
|
253
|
-
}, {});
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Get a specific cookie value
|
|
258
|
-
* @param {string} name - Cookie name
|
|
259
|
-
* @returns {string|null} Cookie value or null
|
|
260
|
-
*/
|
|
261
|
-
export function getCookie(name) {
|
|
262
|
-
const cookies = parseCookies();
|
|
263
|
-
return cookies[name] || null;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Set a cookie with options
|
|
268
|
-
* @param {string} name - Cookie name
|
|
269
|
-
* @param {string} value - Cookie value
|
|
270
|
-
* @param {Object} options - Cookie options
|
|
271
|
-
*/
|
|
272
|
-
export function setCookie(name, value, options = {}) {
|
|
273
|
-
const isProd = typeof window !== "undefined" && window.location.hostname.includes("get-micdrop.com");
|
|
274
|
-
const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
|
|
275
|
-
const secureAttr = typeof window !== "undefined" && window.location.protocol === "https:" ? "secure;" : "";
|
|
276
|
-
const maxAge = options.maxAge ? `max-age=${options.maxAge};` : "";
|
|
277
|
-
const path = options.path || "/";
|
|
278
|
-
|
|
279
|
-
document.cookie = `${name}=${encodeURIComponent(value)}; path=${path}; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Get the performer token from cookies
|
|
284
|
-
* @returns {string|null} Token or null
|
|
285
|
-
*/
|
|
286
|
-
export function getPerformerToken() {
|
|
287
|
-
return getCookie("performer_token");
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Get user details from cookies
|
|
292
|
-
* @returns {Object|null} User details or null
|
|
293
|
-
*/
|
|
294
|
-
export function getUserDetails() {
|
|
295
|
-
const details = getCookie("userDetails");
|
|
296
|
-
if (!details) return null;
|
|
297
|
-
try {
|
|
298
|
-
return JSON.parse(details);
|
|
299
|
-
} catch {
|
|
300
|
-
return null;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Get suppressed alerts from cookies
|
|
306
|
-
* @returns {string[]} Array of suppressed alert IDs
|
|
307
|
-
*/
|
|
308
|
-
export function getSuppressedAlerts() {
|
|
309
|
-
const alerts = getCookie("suppressedAlerts");
|
|
310
|
-
if (!alerts) return [];
|
|
311
|
-
try {
|
|
312
|
-
return JSON.parse(alerts);
|
|
313
|
-
} catch {
|
|
314
|
-
return [];
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Save suppressed alerts to cookies
|
|
320
|
-
* @param {string[]} alertIds - Array of alert IDs to suppress
|
|
321
|
-
*/
|
|
322
|
-
export function saveSuppressedAlerts(alertIds) {
|
|
323
|
-
setCookie("suppressedAlerts", JSON.stringify(alertIds), { maxAge: 31536000 }); // 1 year
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// ============================================
|
|
327
|
-
// DATA FETCHING UTILITIES
|
|
328
|
-
// ============================================
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* Fetch data from an API endpoint with error handling
|
|
332
|
-
* @param {string} endpoint - API endpoint
|
|
333
|
-
* @param {Object} options - Fetch options
|
|
334
|
-
* @returns {Promise<{data: any, error: string|null}>}
|
|
335
|
-
*/
|
|
336
|
-
export async function fetchData(endpoint, options = {}) {
|
|
337
|
-
try {
|
|
338
|
-
const res = await fetch(endpoint, {
|
|
339
|
-
headers: { "Content-Type": "application/json", ...options.headers },
|
|
340
|
-
...options,
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
if (!res.ok) {
|
|
344
|
-
const errorText = await res.text().catch(() => "Unknown error");
|
|
345
|
-
throw new Error(errorText || `Request failed with status ${res.status}`);
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const data = await res.json();
|
|
349
|
-
return { data, error: null };
|
|
350
|
-
} catch (err) {
|
|
351
|
-
return { data: null, error: err.message };
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
1
|
+
import { twMerge } from "tailwind-merge";
|
|
2
|
+
import clsx from "clsx";
|
|
3
|
+
import EventIcon from "../assets/svg/role/event.svg";
|
|
4
|
+
import BookingIcon from "../assets/svg/role/booking.svg";
|
|
5
|
+
import EmailIcon from "../assets/svg/role/emails.svg";
|
|
6
|
+
import VenueIcon from "../assets/svg/role/venue.svg";
|
|
7
|
+
import PayoutIcon from "../assets/svg/role/payout.svg";
|
|
8
|
+
import MarketingIcon from "../assets/svg/role/marketing.svg";
|
|
9
|
+
import OrdersIcon from "../assets/svg/role/orders.svg";
|
|
10
|
+
import OrganisationIcon from "../assets/svg/role/organisation.svg";
|
|
11
|
+
import ReportingIcon from "../assets/svg/role/reporting.svg";
|
|
12
|
+
import microphonePlaceholder from "../assets/images/microphone.png";
|
|
13
|
+
|
|
14
|
+
export function classNames(...classes) {
|
|
15
|
+
return classes.filter(Boolean).join(" ");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function truncateTitle(title, maxLength) {
|
|
19
|
+
if (title.length > maxLength) {
|
|
20
|
+
return title.slice(0, maxLength) + "...";
|
|
21
|
+
}
|
|
22
|
+
return title;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function convertToCustomDateFormat(isoString) {
|
|
26
|
+
const date = new Date(isoString);
|
|
27
|
+
|
|
28
|
+
const year = date.getUTCFullYear();
|
|
29
|
+
const month = date.getUTCMonth();
|
|
30
|
+
const day = date.getUTCDate();
|
|
31
|
+
|
|
32
|
+
const customDate = new Date(year, month, day);
|
|
33
|
+
|
|
34
|
+
return customDate;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function cn(...inputs) {
|
|
38
|
+
return twMerge(clsx(inputs));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function getDays(params) {
|
|
42
|
+
if (params === "weeks") {
|
|
43
|
+
return [
|
|
44
|
+
{ value: "monday", label: "Monday" },
|
|
45
|
+
{ value: "tuesday", label: "Tuesday" },
|
|
46
|
+
{ value: "wednesday", label: "Wednesday" },
|
|
47
|
+
{ value: "thursday", label: "Thursday" },
|
|
48
|
+
{ value: "friday", label: "Friday" },
|
|
49
|
+
];
|
|
50
|
+
} else {
|
|
51
|
+
return Array.from({ length: 31 }, (_, i) => {
|
|
52
|
+
const day = i + 1;
|
|
53
|
+
const suffix =
|
|
54
|
+
day % 10 === 1 && day !== 11
|
|
55
|
+
? "st"
|
|
56
|
+
: day % 10 === 2 && day !== 12
|
|
57
|
+
? "nd"
|
|
58
|
+
: day % 10 === 3 && day !== 13
|
|
59
|
+
? "rd"
|
|
60
|
+
: "th";
|
|
61
|
+
return {
|
|
62
|
+
value: day.toString(),
|
|
63
|
+
label: day + suffix,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Function to get days number options based on selected time unit
|
|
70
|
+
export function getDaysNumberOptions(timeUnit) {
|
|
71
|
+
if (timeUnit === "months") {
|
|
72
|
+
return Array.from({ length: 12 }, (_, i) => ({
|
|
73
|
+
value: (i + 1).toString(),
|
|
74
|
+
label: (i + 1).toString(),
|
|
75
|
+
}));
|
|
76
|
+
} else if (timeUnit === "weeks") {
|
|
77
|
+
return Array.from({ length: 10 }, (_, i) => ({
|
|
78
|
+
value: (i + 1).toString(),
|
|
79
|
+
label: (i + 1).toString(),
|
|
80
|
+
}));
|
|
81
|
+
} else {
|
|
82
|
+
return Array.from({ length: 31 }, (_, i) => ({
|
|
83
|
+
value: (i + 1).toString(),
|
|
84
|
+
label: (i + 1).toString(),
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const ROLE_PERMISSION_LIST = [
|
|
90
|
+
{
|
|
91
|
+
icon: EventIcon,
|
|
92
|
+
title: "Event creation",
|
|
93
|
+
description:
|
|
94
|
+
"Allow users to enter event info, create tickets & customize order forms",
|
|
95
|
+
checkbox: [
|
|
96
|
+
"Create Events",
|
|
97
|
+
"Edit Event Details",
|
|
98
|
+
"Manage event status",
|
|
99
|
+
"Manage tickets",
|
|
100
|
+
"Manage Collections",
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
icon: BookingIcon,
|
|
105
|
+
title: "Booking",
|
|
106
|
+
description:
|
|
107
|
+
"Allow users to manage performers, their invitations and statuses",
|
|
108
|
+
checkbox: [
|
|
109
|
+
"Access the roster page and view performer profiles",
|
|
110
|
+
"Edit performer profiles",
|
|
111
|
+
"Send booking invitations",
|
|
112
|
+
"Manually confirm/decline performers to spots",
|
|
113
|
+
"Send avails requests",
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
icon: VenueIcon,
|
|
118
|
+
title: "Venue creation",
|
|
119
|
+
description: "Allow users to create new venues",
|
|
120
|
+
checkbox: ["Add/edit/delete venues"],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
icon: MarketingIcon,
|
|
124
|
+
title: "Marketing",
|
|
125
|
+
description:
|
|
126
|
+
"Sell more tickets by creating campaigns, tracking engagements, etc.",
|
|
127
|
+
checkbox: [
|
|
128
|
+
"Access social media posts",
|
|
129
|
+
"Manage tracking links",
|
|
130
|
+
"Manage promo codes",
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
icon: OrdersIcon,
|
|
135
|
+
title: "Orders & attendees",
|
|
136
|
+
description:
|
|
137
|
+
"Allow users to view, update & refund orders, manage attendee guest or waitlists & release tickets",
|
|
138
|
+
checkbox: [
|
|
139
|
+
"Add attendees",
|
|
140
|
+
"Manage orders, refunds, transfers and attendees",
|
|
141
|
+
"View list of attendees",
|
|
142
|
+
"Check in attendees",
|
|
143
|
+
"Resend confirmation emails",
|
|
144
|
+
"Override ticket restrictions",
|
|
145
|
+
"Sell tickets at the door",
|
|
146
|
+
"Revoke and reissue barcodes",
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
icon: OrganisationIcon,
|
|
151
|
+
title: "Organization",
|
|
152
|
+
description:
|
|
153
|
+
"Keep your users organized with assigned permissions per user, enable access to APIs & extensions",
|
|
154
|
+
checkbox: [
|
|
155
|
+
"Manage organization members & permissions",
|
|
156
|
+
"Edit organization infomation",
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
icon: EmailIcon,
|
|
161
|
+
title: "Contacts",
|
|
162
|
+
description:
|
|
163
|
+
"Keep our users in the loop, select which emails you would like them to receive",
|
|
164
|
+
checkbox: ["Email attendees", "Email/SMS performers"],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
icon: ReportingIcon,
|
|
168
|
+
title: "Reporting",
|
|
169
|
+
description:
|
|
170
|
+
"Allow users to access, filter & export data across your organization",
|
|
171
|
+
checkbox: ["Access reports pages"],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
icon: PayoutIcon,
|
|
175
|
+
title: "Payouts & billing",
|
|
176
|
+
description:
|
|
177
|
+
"Users can configure payout methods, manage event payment options & track financials with reporting",
|
|
178
|
+
checkbox: ["Manage financial accounts (Stripe)"],
|
|
179
|
+
},
|
|
180
|
+
];
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Parse a location string into street address and city/state/zip components
|
|
184
|
+
* @param {string} locationString - Full location string (e.g., "3400 Warner Blvd, Burbank, CA 91505")
|
|
185
|
+
* @returns {{street: string, cityStateZip: string}} Parsed location object
|
|
186
|
+
*/
|
|
187
|
+
export function parseLocation(locationString) {
|
|
188
|
+
if (!locationString) return { street: '', cityStateZip: '' };
|
|
189
|
+
|
|
190
|
+
// Split by comma to separate components
|
|
191
|
+
const parts = locationString.split(',').map(part => part.trim());
|
|
192
|
+
|
|
193
|
+
if (parts.length >= 3) {
|
|
194
|
+
// Format: "3400 Warner Blvd, Burbank, CA 91505"
|
|
195
|
+
const street = parts[0];
|
|
196
|
+
const cityStateZip = parts.slice(1).join(', ');
|
|
197
|
+
return { street, cityStateZip };
|
|
198
|
+
} else if (parts.length === 2) {
|
|
199
|
+
// Format: "Street, City State Zip"
|
|
200
|
+
return { street: parts[0], cityStateZip: parts[1] };
|
|
201
|
+
} else {
|
|
202
|
+
// Single part or unexpected format
|
|
203
|
+
return { street: locationString, cityStateZip: '' };
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Set authentication cookies with proper domain and security settings
|
|
209
|
+
* @param {string} token - Authentication token
|
|
210
|
+
* @param {Object} userDetails - User details object
|
|
211
|
+
*/
|
|
212
|
+
export function setAuthCookies(token, userDetails, rememberMe = true) {
|
|
213
|
+
const isProd = window.location.hostname.includes("get-micdrop.com");
|
|
214
|
+
const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
|
|
215
|
+
const secureAttr = window.location.protocol === "https:" ? "secure;" : "";
|
|
216
|
+
const maxAge = rememberMe ? "max-age=2592000;" : ""; // 30 days or session
|
|
217
|
+
|
|
218
|
+
document.cookie = `performer_token=${token}; path=/; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
|
|
219
|
+
document.cookie = `userDetails=${encodeURIComponent(
|
|
220
|
+
JSON.stringify(userDetails),
|
|
221
|
+
)}; path=/; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Clear authentication cookies
|
|
226
|
+
*/
|
|
227
|
+
export function clearAuthCookies() {
|
|
228
|
+
const isProd = window.location.hostname.includes("get-micdrop.com");
|
|
229
|
+
const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
|
|
230
|
+
|
|
231
|
+
document.cookie = `userDetails=; path=/; max-age=0; ${domainAttr}`;
|
|
232
|
+
document.cookie = `performer_token=; path=/; max-age=0; ${domainAttr}`;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Export microphone placeholder for universal event image fallback
|
|
236
|
+
export { microphonePlaceholder };
|
|
237
|
+
|
|
238
|
+
// ============================================
|
|
239
|
+
// COOKIE UTILITIES
|
|
240
|
+
// ============================================
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Parse all cookies into an object
|
|
244
|
+
* @returns {Record<string, string>} Cookie key-value pairs
|
|
245
|
+
*/
|
|
246
|
+
export function parseCookies() {
|
|
247
|
+
if (typeof document === "undefined") return {};
|
|
248
|
+
return document.cookie.split("; ").reduce((acc, cookie) => {
|
|
249
|
+
if (!cookie) return acc;
|
|
250
|
+
const [name, ...valueParts] = cookie.split("=");
|
|
251
|
+
acc[name] = decodeURIComponent(valueParts.join("="));
|
|
252
|
+
return acc;
|
|
253
|
+
}, {});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Get a specific cookie value
|
|
258
|
+
* @param {string} name - Cookie name
|
|
259
|
+
* @returns {string|null} Cookie value or null
|
|
260
|
+
*/
|
|
261
|
+
export function getCookie(name) {
|
|
262
|
+
const cookies = parseCookies();
|
|
263
|
+
return cookies[name] || null;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Set a cookie with options
|
|
268
|
+
* @param {string} name - Cookie name
|
|
269
|
+
* @param {string} value - Cookie value
|
|
270
|
+
* @param {Object} options - Cookie options
|
|
271
|
+
*/
|
|
272
|
+
export function setCookie(name, value, options = {}) {
|
|
273
|
+
const isProd = typeof window !== "undefined" && window.location.hostname.includes("get-micdrop.com");
|
|
274
|
+
const domainAttr = isProd ? "domain=.get-micdrop.com;" : "";
|
|
275
|
+
const secureAttr = typeof window !== "undefined" && window.location.protocol === "https:" ? "secure;" : "";
|
|
276
|
+
const maxAge = options.maxAge ? `max-age=${options.maxAge};` : "";
|
|
277
|
+
const path = options.path || "/";
|
|
278
|
+
|
|
279
|
+
document.cookie = `${name}=${encodeURIComponent(value)}; path=${path}; ${maxAge} ${domainAttr} ${secureAttr} samesite=lax`;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Get the performer token from cookies
|
|
284
|
+
* @returns {string|null} Token or null
|
|
285
|
+
*/
|
|
286
|
+
export function getPerformerToken() {
|
|
287
|
+
return getCookie("performer_token");
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Get user details from cookies
|
|
292
|
+
* @returns {Object|null} User details or null
|
|
293
|
+
*/
|
|
294
|
+
export function getUserDetails() {
|
|
295
|
+
const details = getCookie("userDetails");
|
|
296
|
+
if (!details) return null;
|
|
297
|
+
try {
|
|
298
|
+
return JSON.parse(details);
|
|
299
|
+
} catch {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Get suppressed alerts from cookies
|
|
306
|
+
* @returns {string[]} Array of suppressed alert IDs
|
|
307
|
+
*/
|
|
308
|
+
export function getSuppressedAlerts() {
|
|
309
|
+
const alerts = getCookie("suppressedAlerts");
|
|
310
|
+
if (!alerts) return [];
|
|
311
|
+
try {
|
|
312
|
+
return JSON.parse(alerts);
|
|
313
|
+
} catch {
|
|
314
|
+
return [];
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Save suppressed alerts to cookies
|
|
320
|
+
* @param {string[]} alertIds - Array of alert IDs to suppress
|
|
321
|
+
*/
|
|
322
|
+
export function saveSuppressedAlerts(alertIds) {
|
|
323
|
+
setCookie("suppressedAlerts", JSON.stringify(alertIds), { maxAge: 31536000 }); // 1 year
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// ============================================
|
|
327
|
+
// DATA FETCHING UTILITIES
|
|
328
|
+
// ============================================
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Fetch data from an API endpoint with error handling
|
|
332
|
+
* @param {string} endpoint - API endpoint
|
|
333
|
+
* @param {Object} options - Fetch options
|
|
334
|
+
* @returns {Promise<{data: any, error: string|null}>}
|
|
335
|
+
*/
|
|
336
|
+
export async function fetchData(endpoint, options = {}) {
|
|
337
|
+
try {
|
|
338
|
+
const res = await fetch(endpoint, {
|
|
339
|
+
headers: { "Content-Type": "application/json", ...options.headers },
|
|
340
|
+
...options,
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
if (!res.ok) {
|
|
344
|
+
const errorText = await res.text().catch(() => "Unknown error");
|
|
345
|
+
throw new Error(errorText || `Request failed with status ${res.status}`);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
const data = await res.json();
|
|
349
|
+
return { data, error: null };
|
|
350
|
+
} catch (err) {
|
|
351
|
+
return { data: null, error: err.message };
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
355
|
/**
|
|
356
356
|
* Post data to an API endpoint
|
|
357
357
|
* @param {string} endpoint - API endpoint
|