@timardex/cluemart-shared 2.3.20 → 2.5.0
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/{ad-8hhGHx6J.d.mts → ad-BSyVGv8q.d.mts} +16 -23
- package/dist/{ad-6lcjOj3X.d.ts → ad-DRI2CIzV.d.ts} +16 -23
- package/dist/auth/index.mjs +1 -1
- package/dist/{chunk-ZZXSAQM6.mjs → chunk-2RHUGVV3.mjs} +114 -122
- package/dist/chunk-2RHUGVV3.mjs.map +1 -0
- package/dist/{chunk-HKTBJOB7.mjs → chunk-4CQLKIQ6.mjs} +13 -1
- package/dist/chunk-4CQLKIQ6.mjs.map +1 -0
- package/dist/{chunk-XGGFB7HY.mjs → chunk-A52C6JDT.mjs} +2 -2
- package/dist/chunk-A52C6JDT.mjs.map +1 -0
- package/dist/{chunk-KMS64DE2.mjs → chunk-CQ26N3W6.mjs} +2 -2
- package/dist/{chunk-DV3K3JDE.mjs → chunk-DEK7NF3O.mjs} +9 -7
- package/dist/chunk-DEK7NF3O.mjs.map +1 -0
- package/dist/{chunk-PBW5K54C.mjs → chunk-L4NHGGT7.mjs} +3 -3
- package/dist/{chunk-5AAYX364.mjs → chunk-WWAHS5R2.mjs} +1 -10
- package/dist/chunk-WWAHS5R2.mjs.map +1 -0
- package/dist/enums/index.cjs +1 -1
- package/dist/enums/index.cjs.map +1 -1
- package/dist/enums/index.d.mts +2 -2
- package/dist/enums/index.d.ts +2 -2
- package/dist/enums/index.mjs +1 -1
- package/dist/formFields/index.cjs +2 -1
- package/dist/formFields/index.cjs.map +1 -1
- package/dist/formFields/index.mjs +5 -5
- package/dist/graphql/index.cjs +122 -129
- package/dist/graphql/index.cjs.map +1 -1
- package/dist/graphql/index.d.mts +21 -4
- package/dist/graphql/index.d.ts +21 -4
- package/dist/graphql/index.mjs +8 -6
- package/dist/hooks/index.cjs +27 -52
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.mts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.mjs +7 -7
- package/dist/index.cjs +143 -143
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +58 -32
- package/dist/index.d.ts +58 -32
- package/dist/index.mjs +124 -128
- package/dist/index.mjs.map +1 -1
- package/dist/region/index.cjs.map +1 -1
- package/dist/region/index.mjs +1 -1
- package/dist/sharing/index.cjs.map +1 -1
- package/dist/sharing/index.mjs +3 -3
- package/dist/types/index.cjs +0 -10
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.mts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.mjs +2 -4
- package/dist/utils/index.cjs +21 -4
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.mts +22 -6
- package/dist/utils/index.d.ts +22 -6
- package/dist/utils/index.mjs +12 -4
- package/package.json +1 -1
- package/dist/chunk-5AAYX364.mjs.map +0 -1
- package/dist/chunk-DV3K3JDE.mjs.map +0 -1
- package/dist/chunk-HKTBJOB7.mjs.map +0 -1
- package/dist/chunk-XGGFB7HY.mjs.map +0 -1
- package/dist/chunk-ZZXSAQM6.mjs.map +0 -1
- /package/dist/{chunk-KMS64DE2.mjs.map → chunk-CQ26N3W6.mjs.map} +0 -0
- /package/dist/{chunk-PBW5K54C.mjs.map → chunk-L4NHGGT7.mjs.map} +0 -0
package/dist/utils/index.d.mts
CHANGED
|
@@ -67,10 +67,25 @@ declare function computeHasMore(pageLength: number, pageSize: number): boolean;
|
|
|
67
67
|
|
|
68
68
|
declare const dateFormat = "DD-MM-YYYY";
|
|
69
69
|
declare const timeFormat = "HH:mm";
|
|
70
|
+
/** ISO 8601 machine/sortable format: day keys, Date construction, strict parsing, HTML date inputs. */
|
|
71
|
+
declare const isoDateFormat = "YYYY-MM-DD";
|
|
70
72
|
|
|
73
|
+
declare const NZ_TZ = "Pacific/Auckland";
|
|
71
74
|
declare function toNZTime(date?: Date | string): dayjs.Dayjs;
|
|
72
75
|
/** Start of the calendar day in Pacific/Auckland (daily games, streaks, etc.). */
|
|
73
76
|
declare function nzStartOfDay(input?: Date | string | number | null): dayjs.Dayjs;
|
|
77
|
+
/**
|
|
78
|
+
* UTC-midnight of the given instant's NZ calendar day (today when omitted).
|
|
79
|
+
* This is the canonical "day key" encoding used by ad bookings and metrics:
|
|
80
|
+
* stored as a UTC Date, rendered with `.toISOString().slice(0, 10)`.
|
|
81
|
+
*/
|
|
82
|
+
declare function nzDayKey(input?: Date | string | number | null): Date;
|
|
83
|
+
/**
|
|
84
|
+
* Type guard for the canonical "day key" encoding: a valid Date that is
|
|
85
|
+
* exactly UTC midnight. Accepts `unknown` so it can validate untrusted values
|
|
86
|
+
* (GraphQL/JSON inputs) without a preceding cast.
|
|
87
|
+
*/
|
|
88
|
+
declare function isUtcMidnight(value: unknown): value is Date;
|
|
74
89
|
type DateFormat = "date" | "time" | "datetime";
|
|
75
90
|
/**
|
|
76
91
|
* Format a date string to a more readable format.
|
|
@@ -243,10 +258,10 @@ declare const MANUAL_DATE_STATUSES: ReadonlySet<EnumEventDateStatus>;
|
|
|
243
258
|
* the live `Event.dateTime` for visibility, but a relation date pointing at
|
|
244
259
|
* them is treated as removed. Archived (ended) slots are appended separately
|
|
245
260
|
* so relation dates for archived history still match instead of being wrongly
|
|
246
|
-
* marked
|
|
261
|
+
* marked canceled.
|
|
247
262
|
*
|
|
248
|
-
* Shared by the
|
|
249
|
-
*
|
|
263
|
+
* Shared by the event-update relation sync and the cron orphan-date cleanup so
|
|
264
|
+
* both use the same archive-aware schedule.
|
|
250
265
|
*/
|
|
251
266
|
declare function buildRelationEligibleEventSchedule<T extends {
|
|
252
267
|
dateStatus?: EnumEventDateStatus | null;
|
|
@@ -474,8 +489,9 @@ declare function getVendorEventsData({ events, selectedDate, }: GetVendorEventsD
|
|
|
474
489
|
/**
|
|
475
490
|
* Relation date statuses that must survive when their event slot is removed or
|
|
476
491
|
* a relation is overwritten. ACCEPTED/COMPLETED are historical or paid
|
|
477
|
-
* bookings;
|
|
478
|
-
*
|
|
492
|
+
* bookings; CANCELED is kept so history can report dates the event canceled;
|
|
493
|
+
* REJECTED is kept for the organizer's records. Dates with any other status
|
|
494
|
+
* may be deleted once their slot disappears from the event schedule.
|
|
479
495
|
*/
|
|
480
496
|
declare const PRESERVED_RELATION_DATE_STATUSES: ReadonlySet<EnumInviteStatus>;
|
|
481
497
|
|
|
@@ -490,4 +506,4 @@ declare function toUserFacingErrorMessage(error: string | null | undefined, fall
|
|
|
490
506
|
/** Extracts and sanitizes an unknown catch/Apollo error for toasts and alerts. */
|
|
491
507
|
declare function getErrorMessage(error: unknown, fallback?: string): string;
|
|
492
508
|
|
|
493
|
-
export { AFFILIATE_PARTICIPANT_TYPE_LABELS, AFFILIATE_REWARDS, ANDROID_URL, BILLING_CATALOG_CURRENCY, BILLING_CATALOG_DEFINITIONS, BILLING_CATALOG_KEYS, CLUEMART_MAIN_DOMAIN_URL, CM_AFFILIATE_PROMO_CODE, CM_SCHOOL_PROMO_CODE, type CalendarSheetContentData, DEFAULT_PAGE_SIZE, DEFAULT_RESOURCES_RETURN_LIMIT, DEFAULT_RESOURCES_RETURN_OFFSET, DEFAULT_USER_FACING_ERROR, EVENT_DATE_STATUS_LABELS, EVENT_DATE_STATUS_PERIOD_MAP, type EventScheduleStatusPresentation, type EventScheduleStatusTone, type EventStallholderDateOption, type EventStallholdersData, FUTURE_EVENT_DATE_STATUSES, type GetEventStallholdersDataInput, type GetVendorEventsDataInput, INITIAL_BILLING_CATALOG, IOS_URL, MANUAL_DATE_STATUSES, NETWORK_USER_FACING_ERROR, PRESERVED_RELATION_DATE_STATUSES, PostTypeLabels, SCHOOL_MAX_STUDENT_COUNT, SCHOOL_MIN_STUDENT_COUNT, type StallholderFilterOption, type VendorEventDateOption, type VendorEventsData, accumulateItems, availableRegionOptions, availableRegionTypes, billingCatalogDefinitionMatches, buildCalendarSheetContentData, buildRelationEligibleEventSchedule, capitalizeFirstLetter, cluemartSocialMedia, collectStallholderDateTimes, collectVendorEventRelationDateTimes, computeDailyClueState, computeHasMore, countLetterOccurrences, countLetterOccurrencesUpTo, createAffiliateReward, dateFormat, defaultGetId, eventHasSelectedDate, eventMatchesDateStatusPeriod, eventStartDatesSet, filterDatesByFutureStatus, filterEventsByDateStatusPeriod, filterRegisteredVendorsByEventDatesOnly, filterRegisteredVendorsForEvent, filterUnregisteredVendorsByEventDatesOnly, filterUnregisteredVendorsForEvent, filterVendorEventsBySelectedDate, findEventDateTimeByIsoDate, formatDate, formatDistance, formatIrdNumber, formatNZBankAccount, formatTimestamp, fromCalendarIsoDate, futureTimePeriods, getAllowedEventDateStatuses, getBillingCatalogKeyForSelection, getCurrentAndFutureDates, getDailyClueDayIndex, getDistanceInKilometers, getDistanceInMeters, getErrorMessage, getEventCalendarIsoDates, getEventScheduleStatusLabel, getEventScheduleStatusPresentation, getEventScheduleStatusTone, getEventStallholderEmptyMessage, getEventStallholdersData, getFutureEventStatus, getRegisteredVendorCategoryNames, getRegisteredVendorStartDates, getStallholderCategoryNames, getStallholderCategoryOptions, getUniqueStallholderStartDates, getUniqueStartDates, getUnregisteredVendorCategoryNames, getUnregisteredVendorStartDates, getVendorEventRelationDateOptions, getVendorEventRelationStartDates, getVendorEventsData, getVendorEventsEmptyMessage, hasMatchingEventDate, isFutureDatesBeforeThreshold, isFutureEventDateStatus, isFutureStartDate, isInternalErrorMessage, isIsoDateString, isResourceImageActive, isTransientNetworkError, isValidIrdNumber, licenseNiceNames, mapArrayToOptions, matchesCategory, matchesSelectedDate, normalizeIrdNumber, normalizeResourceImage, normalizeUrl, nzStartOfDay, paymentMethodOptions, relationHasSelectedDate, removeTypename, resolveResourceImageActive, rewardNiceNames, seededShuffle, shouldShowEventActionsWithWeather, sortDatesChronologically, statusOptions, sumUserOverallPoints, timeFormat, toCalendarIsoDate, toNZTime, toUserFacingErrorMessage, truncateText, updateSingleDateTimeStatus, vendorLicences };
|
|
509
|
+
export { AFFILIATE_PARTICIPANT_TYPE_LABELS, AFFILIATE_REWARDS, ANDROID_URL, BILLING_CATALOG_CURRENCY, BILLING_CATALOG_DEFINITIONS, BILLING_CATALOG_KEYS, CLUEMART_MAIN_DOMAIN_URL, CM_AFFILIATE_PROMO_CODE, CM_SCHOOL_PROMO_CODE, type CalendarSheetContentData, DEFAULT_PAGE_SIZE, DEFAULT_RESOURCES_RETURN_LIMIT, DEFAULT_RESOURCES_RETURN_OFFSET, DEFAULT_USER_FACING_ERROR, EVENT_DATE_STATUS_LABELS, EVENT_DATE_STATUS_PERIOD_MAP, type EventScheduleStatusPresentation, type EventScheduleStatusTone, type EventStallholderDateOption, type EventStallholdersData, FUTURE_EVENT_DATE_STATUSES, type GetEventStallholdersDataInput, type GetVendorEventsDataInput, INITIAL_BILLING_CATALOG, IOS_URL, MANUAL_DATE_STATUSES, NETWORK_USER_FACING_ERROR, NZ_TZ, PRESERVED_RELATION_DATE_STATUSES, PostTypeLabels, SCHOOL_MAX_STUDENT_COUNT, SCHOOL_MIN_STUDENT_COUNT, type StallholderFilterOption, type VendorEventDateOption, type VendorEventsData, accumulateItems, availableRegionOptions, availableRegionTypes, billingCatalogDefinitionMatches, buildCalendarSheetContentData, buildRelationEligibleEventSchedule, capitalizeFirstLetter, cluemartSocialMedia, collectStallholderDateTimes, collectVendorEventRelationDateTimes, computeDailyClueState, computeHasMore, countLetterOccurrences, countLetterOccurrencesUpTo, createAffiliateReward, dateFormat, defaultGetId, eventHasSelectedDate, eventMatchesDateStatusPeriod, eventStartDatesSet, filterDatesByFutureStatus, filterEventsByDateStatusPeriod, filterRegisteredVendorsByEventDatesOnly, filterRegisteredVendorsForEvent, filterUnregisteredVendorsByEventDatesOnly, filterUnregisteredVendorsForEvent, filterVendorEventsBySelectedDate, findEventDateTimeByIsoDate, formatDate, formatDistance, formatIrdNumber, formatNZBankAccount, formatTimestamp, fromCalendarIsoDate, futureTimePeriods, getAllowedEventDateStatuses, getBillingCatalogKeyForSelection, getCurrentAndFutureDates, getDailyClueDayIndex, getDistanceInKilometers, getDistanceInMeters, getErrorMessage, getEventCalendarIsoDates, getEventScheduleStatusLabel, getEventScheduleStatusPresentation, getEventScheduleStatusTone, getEventStallholderEmptyMessage, getEventStallholdersData, getFutureEventStatus, getRegisteredVendorCategoryNames, getRegisteredVendorStartDates, getStallholderCategoryNames, getStallholderCategoryOptions, getUniqueStallholderStartDates, getUniqueStartDates, getUnregisteredVendorCategoryNames, getUnregisteredVendorStartDates, getVendorEventRelationDateOptions, getVendorEventRelationStartDates, getVendorEventsData, getVendorEventsEmptyMessage, hasMatchingEventDate, isFutureDatesBeforeThreshold, isFutureEventDateStatus, isFutureStartDate, isInternalErrorMessage, isIsoDateString, isResourceImageActive, isTransientNetworkError, isUtcMidnight, isValidIrdNumber, isoDateFormat, licenseNiceNames, mapArrayToOptions, matchesCategory, matchesSelectedDate, normalizeIrdNumber, normalizeResourceImage, normalizeUrl, nzDayKey, nzStartOfDay, paymentMethodOptions, relationHasSelectedDate, removeTypename, resolveResourceImageActive, rewardNiceNames, seededShuffle, shouldShowEventActionsWithWeather, sortDatesChronologically, statusOptions, sumUserOverallPoints, timeFormat, toCalendarIsoDate, toNZTime, toUserFacingErrorMessage, truncateText, updateSingleDateTimeStatus, vendorLicences };
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -67,10 +67,25 @@ declare function computeHasMore(pageLength: number, pageSize: number): boolean;
|
|
|
67
67
|
|
|
68
68
|
declare const dateFormat = "DD-MM-YYYY";
|
|
69
69
|
declare const timeFormat = "HH:mm";
|
|
70
|
+
/** ISO 8601 machine/sortable format: day keys, Date construction, strict parsing, HTML date inputs. */
|
|
71
|
+
declare const isoDateFormat = "YYYY-MM-DD";
|
|
70
72
|
|
|
73
|
+
declare const NZ_TZ = "Pacific/Auckland";
|
|
71
74
|
declare function toNZTime(date?: Date | string): dayjs.Dayjs;
|
|
72
75
|
/** Start of the calendar day in Pacific/Auckland (daily games, streaks, etc.). */
|
|
73
76
|
declare function nzStartOfDay(input?: Date | string | number | null): dayjs.Dayjs;
|
|
77
|
+
/**
|
|
78
|
+
* UTC-midnight of the given instant's NZ calendar day (today when omitted).
|
|
79
|
+
* This is the canonical "day key" encoding used by ad bookings and metrics:
|
|
80
|
+
* stored as a UTC Date, rendered with `.toISOString().slice(0, 10)`.
|
|
81
|
+
*/
|
|
82
|
+
declare function nzDayKey(input?: Date | string | number | null): Date;
|
|
83
|
+
/**
|
|
84
|
+
* Type guard for the canonical "day key" encoding: a valid Date that is
|
|
85
|
+
* exactly UTC midnight. Accepts `unknown` so it can validate untrusted values
|
|
86
|
+
* (GraphQL/JSON inputs) without a preceding cast.
|
|
87
|
+
*/
|
|
88
|
+
declare function isUtcMidnight(value: unknown): value is Date;
|
|
74
89
|
type DateFormat = "date" | "time" | "datetime";
|
|
75
90
|
/**
|
|
76
91
|
* Format a date string to a more readable format.
|
|
@@ -243,10 +258,10 @@ declare const MANUAL_DATE_STATUSES: ReadonlySet<EnumEventDateStatus>;
|
|
|
243
258
|
* the live `Event.dateTime` for visibility, but a relation date pointing at
|
|
244
259
|
* them is treated as removed. Archived (ended) slots are appended separately
|
|
245
260
|
* so relation dates for archived history still match instead of being wrongly
|
|
246
|
-
* marked
|
|
261
|
+
* marked canceled.
|
|
247
262
|
*
|
|
248
|
-
* Shared by the
|
|
249
|
-
*
|
|
263
|
+
* Shared by the event-update relation sync and the cron orphan-date cleanup so
|
|
264
|
+
* both use the same archive-aware schedule.
|
|
250
265
|
*/
|
|
251
266
|
declare function buildRelationEligibleEventSchedule<T extends {
|
|
252
267
|
dateStatus?: EnumEventDateStatus | null;
|
|
@@ -474,8 +489,9 @@ declare function getVendorEventsData({ events, selectedDate, }: GetVendorEventsD
|
|
|
474
489
|
/**
|
|
475
490
|
* Relation date statuses that must survive when their event slot is removed or
|
|
476
491
|
* a relation is overwritten. ACCEPTED/COMPLETED are historical or paid
|
|
477
|
-
* bookings;
|
|
478
|
-
*
|
|
492
|
+
* bookings; CANCELED is kept so history can report dates the event canceled;
|
|
493
|
+
* REJECTED is kept for the organizer's records. Dates with any other status
|
|
494
|
+
* may be deleted once their slot disappears from the event schedule.
|
|
479
495
|
*/
|
|
480
496
|
declare const PRESERVED_RELATION_DATE_STATUSES: ReadonlySet<EnumInviteStatus>;
|
|
481
497
|
|
|
@@ -490,4 +506,4 @@ declare function toUserFacingErrorMessage(error: string | null | undefined, fall
|
|
|
490
506
|
/** Extracts and sanitizes an unknown catch/Apollo error for toasts and alerts. */
|
|
491
507
|
declare function getErrorMessage(error: unknown, fallback?: string): string;
|
|
492
508
|
|
|
493
|
-
export { AFFILIATE_PARTICIPANT_TYPE_LABELS, AFFILIATE_REWARDS, ANDROID_URL, BILLING_CATALOG_CURRENCY, BILLING_CATALOG_DEFINITIONS, BILLING_CATALOG_KEYS, CLUEMART_MAIN_DOMAIN_URL, CM_AFFILIATE_PROMO_CODE, CM_SCHOOL_PROMO_CODE, type CalendarSheetContentData, DEFAULT_PAGE_SIZE, DEFAULT_RESOURCES_RETURN_LIMIT, DEFAULT_RESOURCES_RETURN_OFFSET, DEFAULT_USER_FACING_ERROR, EVENT_DATE_STATUS_LABELS, EVENT_DATE_STATUS_PERIOD_MAP, type EventScheduleStatusPresentation, type EventScheduleStatusTone, type EventStallholderDateOption, type EventStallholdersData, FUTURE_EVENT_DATE_STATUSES, type GetEventStallholdersDataInput, type GetVendorEventsDataInput, INITIAL_BILLING_CATALOG, IOS_URL, MANUAL_DATE_STATUSES, NETWORK_USER_FACING_ERROR, PRESERVED_RELATION_DATE_STATUSES, PostTypeLabels, SCHOOL_MAX_STUDENT_COUNT, SCHOOL_MIN_STUDENT_COUNT, type StallholderFilterOption, type VendorEventDateOption, type VendorEventsData, accumulateItems, availableRegionOptions, availableRegionTypes, billingCatalogDefinitionMatches, buildCalendarSheetContentData, buildRelationEligibleEventSchedule, capitalizeFirstLetter, cluemartSocialMedia, collectStallholderDateTimes, collectVendorEventRelationDateTimes, computeDailyClueState, computeHasMore, countLetterOccurrences, countLetterOccurrencesUpTo, createAffiliateReward, dateFormat, defaultGetId, eventHasSelectedDate, eventMatchesDateStatusPeriod, eventStartDatesSet, filterDatesByFutureStatus, filterEventsByDateStatusPeriod, filterRegisteredVendorsByEventDatesOnly, filterRegisteredVendorsForEvent, filterUnregisteredVendorsByEventDatesOnly, filterUnregisteredVendorsForEvent, filterVendorEventsBySelectedDate, findEventDateTimeByIsoDate, formatDate, formatDistance, formatIrdNumber, formatNZBankAccount, formatTimestamp, fromCalendarIsoDate, futureTimePeriods, getAllowedEventDateStatuses, getBillingCatalogKeyForSelection, getCurrentAndFutureDates, getDailyClueDayIndex, getDistanceInKilometers, getDistanceInMeters, getErrorMessage, getEventCalendarIsoDates, getEventScheduleStatusLabel, getEventScheduleStatusPresentation, getEventScheduleStatusTone, getEventStallholderEmptyMessage, getEventStallholdersData, getFutureEventStatus, getRegisteredVendorCategoryNames, getRegisteredVendorStartDates, getStallholderCategoryNames, getStallholderCategoryOptions, getUniqueStallholderStartDates, getUniqueStartDates, getUnregisteredVendorCategoryNames, getUnregisteredVendorStartDates, getVendorEventRelationDateOptions, getVendorEventRelationStartDates, getVendorEventsData, getVendorEventsEmptyMessage, hasMatchingEventDate, isFutureDatesBeforeThreshold, isFutureEventDateStatus, isFutureStartDate, isInternalErrorMessage, isIsoDateString, isResourceImageActive, isTransientNetworkError, isValidIrdNumber, licenseNiceNames, mapArrayToOptions, matchesCategory, matchesSelectedDate, normalizeIrdNumber, normalizeResourceImage, normalizeUrl, nzStartOfDay, paymentMethodOptions, relationHasSelectedDate, removeTypename, resolveResourceImageActive, rewardNiceNames, seededShuffle, shouldShowEventActionsWithWeather, sortDatesChronologically, statusOptions, sumUserOverallPoints, timeFormat, toCalendarIsoDate, toNZTime, toUserFacingErrorMessage, truncateText, updateSingleDateTimeStatus, vendorLicences };
|
|
509
|
+
export { AFFILIATE_PARTICIPANT_TYPE_LABELS, AFFILIATE_REWARDS, ANDROID_URL, BILLING_CATALOG_CURRENCY, BILLING_CATALOG_DEFINITIONS, BILLING_CATALOG_KEYS, CLUEMART_MAIN_DOMAIN_URL, CM_AFFILIATE_PROMO_CODE, CM_SCHOOL_PROMO_CODE, type CalendarSheetContentData, DEFAULT_PAGE_SIZE, DEFAULT_RESOURCES_RETURN_LIMIT, DEFAULT_RESOURCES_RETURN_OFFSET, DEFAULT_USER_FACING_ERROR, EVENT_DATE_STATUS_LABELS, EVENT_DATE_STATUS_PERIOD_MAP, type EventScheduleStatusPresentation, type EventScheduleStatusTone, type EventStallholderDateOption, type EventStallholdersData, FUTURE_EVENT_DATE_STATUSES, type GetEventStallholdersDataInput, type GetVendorEventsDataInput, INITIAL_BILLING_CATALOG, IOS_URL, MANUAL_DATE_STATUSES, NETWORK_USER_FACING_ERROR, NZ_TZ, PRESERVED_RELATION_DATE_STATUSES, PostTypeLabels, SCHOOL_MAX_STUDENT_COUNT, SCHOOL_MIN_STUDENT_COUNT, type StallholderFilterOption, type VendorEventDateOption, type VendorEventsData, accumulateItems, availableRegionOptions, availableRegionTypes, billingCatalogDefinitionMatches, buildCalendarSheetContentData, buildRelationEligibleEventSchedule, capitalizeFirstLetter, cluemartSocialMedia, collectStallholderDateTimes, collectVendorEventRelationDateTimes, computeDailyClueState, computeHasMore, countLetterOccurrences, countLetterOccurrencesUpTo, createAffiliateReward, dateFormat, defaultGetId, eventHasSelectedDate, eventMatchesDateStatusPeriod, eventStartDatesSet, filterDatesByFutureStatus, filterEventsByDateStatusPeriod, filterRegisteredVendorsByEventDatesOnly, filterRegisteredVendorsForEvent, filterUnregisteredVendorsByEventDatesOnly, filterUnregisteredVendorsForEvent, filterVendorEventsBySelectedDate, findEventDateTimeByIsoDate, formatDate, formatDistance, formatIrdNumber, formatNZBankAccount, formatTimestamp, fromCalendarIsoDate, futureTimePeriods, getAllowedEventDateStatuses, getBillingCatalogKeyForSelection, getCurrentAndFutureDates, getDailyClueDayIndex, getDistanceInKilometers, getDistanceInMeters, getErrorMessage, getEventCalendarIsoDates, getEventScheduleStatusLabel, getEventScheduleStatusPresentation, getEventScheduleStatusTone, getEventStallholderEmptyMessage, getEventStallholdersData, getFutureEventStatus, getRegisteredVendorCategoryNames, getRegisteredVendorStartDates, getStallholderCategoryNames, getStallholderCategoryOptions, getUniqueStallholderStartDates, getUniqueStartDates, getUnregisteredVendorCategoryNames, getUnregisteredVendorStartDates, getVendorEventRelationDateOptions, getVendorEventRelationStartDates, getVendorEventsData, getVendorEventsEmptyMessage, hasMatchingEventDate, isFutureDatesBeforeThreshold, isFutureEventDateStatus, isFutureStartDate, isInternalErrorMessage, isIsoDateString, isResourceImageActive, isTransientNetworkError, isUtcMidnight, isValidIrdNumber, isoDateFormat, licenseNiceNames, mapArrayToOptions, matchesCategory, matchesSelectedDate, normalizeIrdNumber, normalizeResourceImage, normalizeUrl, nzDayKey, nzStartOfDay, paymentMethodOptions, relationHasSelectedDate, removeTypename, resolveResourceImageActive, rewardNiceNames, seededShuffle, shouldShowEventActionsWithWeather, sortDatesChronologically, statusOptions, sumUserOverallPoints, timeFormat, toCalendarIsoDate, toNZTime, toUserFacingErrorMessage, truncateText, updateSingleDateTimeStatus, vendorLicences };
|
package/dist/utils/index.mjs
CHANGED
|
@@ -85,7 +85,7 @@ import {
|
|
|
85
85
|
toUserFacingErrorMessage,
|
|
86
86
|
truncateText,
|
|
87
87
|
vendorLicences
|
|
88
|
-
} from "../chunk-
|
|
88
|
+
} from "../chunk-DEK7NF3O.mjs";
|
|
89
89
|
import {
|
|
90
90
|
formatDistance,
|
|
91
91
|
getDistanceInKilometers,
|
|
@@ -96,6 +96,7 @@ import {
|
|
|
96
96
|
EVENT_DATE_STATUS_PERIOD_MAP,
|
|
97
97
|
FUTURE_EVENT_DATE_STATUSES,
|
|
98
98
|
MANUAL_DATE_STATUSES,
|
|
99
|
+
NZ_TZ,
|
|
99
100
|
buildRelationEligibleEventSchedule,
|
|
100
101
|
dateFormat,
|
|
101
102
|
eventMatchesDateStatusPeriod,
|
|
@@ -112,13 +113,16 @@ import {
|
|
|
112
113
|
isFutureEventDateStatus,
|
|
113
114
|
isFutureStartDate,
|
|
114
115
|
isIsoDateString,
|
|
116
|
+
isUtcMidnight,
|
|
117
|
+
isoDateFormat,
|
|
118
|
+
nzDayKey,
|
|
115
119
|
nzStartOfDay,
|
|
116
120
|
sortDatesChronologically,
|
|
117
121
|
timeFormat,
|
|
118
122
|
toNZTime,
|
|
119
123
|
updateSingleDateTimeStatus
|
|
120
|
-
} from "../chunk-
|
|
121
|
-
import "../chunk-
|
|
124
|
+
} from "../chunk-4CQLKIQ6.mjs";
|
|
125
|
+
import "../chunk-WWAHS5R2.mjs";
|
|
122
126
|
import {
|
|
123
127
|
isTransientNetworkError
|
|
124
128
|
} from "../chunk-RAYUJODN.mjs";
|
|
@@ -129,7 +133,7 @@ import {
|
|
|
129
133
|
computeHasMore,
|
|
130
134
|
defaultGetId
|
|
131
135
|
} from "../chunk-7DQBUZXY.mjs";
|
|
132
|
-
import "../chunk-
|
|
136
|
+
import "../chunk-A52C6JDT.mjs";
|
|
133
137
|
export {
|
|
134
138
|
AFFILIATE_PARTICIPANT_TYPE_LABELS,
|
|
135
139
|
AFFILIATE_REWARDS,
|
|
@@ -151,6 +155,7 @@ export {
|
|
|
151
155
|
IOS_URL,
|
|
152
156
|
MANUAL_DATE_STATUSES,
|
|
153
157
|
NETWORK_USER_FACING_ERROR,
|
|
158
|
+
NZ_TZ,
|
|
154
159
|
PRESERVED_RELATION_DATE_STATUSES,
|
|
155
160
|
PostTypeLabels,
|
|
156
161
|
SCHOOL_MAX_STUDENT_COUNT,
|
|
@@ -224,7 +229,9 @@ export {
|
|
|
224
229
|
isIsoDateString,
|
|
225
230
|
isResourceImageActive,
|
|
226
231
|
isTransientNetworkError,
|
|
232
|
+
isUtcMidnight,
|
|
227
233
|
isValidIrdNumber,
|
|
234
|
+
isoDateFormat,
|
|
228
235
|
licenseNiceNames,
|
|
229
236
|
mapArrayToOptions,
|
|
230
237
|
matchesCategory,
|
|
@@ -232,6 +239,7 @@ export {
|
|
|
232
239
|
normalizeIrdNumber,
|
|
233
240
|
normalizeResourceImage,
|
|
234
241
|
normalizeUrl,
|
|
242
|
+
nzDayKey,
|
|
235
243
|
nzStartOfDay,
|
|
236
244
|
paymentMethodOptions,
|
|
237
245
|
relationHasSelectedDate,
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/auth.ts","../src/types/global.ts","../src/types/ad.ts","../src/types/resourceActivities.ts","../src/types/post.ts","../src/types/game/index.ts","../src/types/game/dailyClue.ts","../src/types/game/global.ts","../src/types/affiliate.ts","../src/types/coupon/index.ts"],"sourcesContent":["import {\n CreateFormData,\n EnumOSPlatform,\n EnumResourceType,\n PromoCodeType,\n TermsAgreement,\n} from \"src\";\n\nimport { MutationResponse } from \"./global\";\nimport { SafeUserType, UserFormData } from \"./user\";\n\nexport enum EnumVerificationType {\n REGISTER = \"register\",\n RESET_PASSWORD = \"resetPassword\",\n}\n\nexport type LoginFormData = {\n email: string;\n isAdminPage?: boolean;\n password: string;\n platform?: EnumOSPlatform;\n};\n\nexport type CreateLoginFormData = CreateFormData<LoginFormData>;\n\nexport type RegisterFormData = Pick<\n UserFormData,\n | \"email\"\n | \"firstName\"\n | \"lastName\"\n | \"nickName\"\n | \"platform\"\n | \"preferredRegion\"\n | \"termsAgreement\"\n> & {\n interests: EnumResourceType[];\n password: string;\n promoCode?: PromoCodeType | null;\n};\n\nexport type CreateRegisterFormData = CreateFormData<RegisterFormData>;\n\nexport type RequestPasswordResetFormData = {\n email: string;\n};\n\nexport type CreateRequestPasswordResetFormData =\n CreateFormData<RequestPasswordResetFormData>;\n\nexport type ResetPasswordFormData = {\n confirmPassword: string;\n email: string;\n password: string;\n};\n\nexport type CreateResetPasswordFormData = CreateFormData<ResetPasswordFormData>;\n\nexport type ValidateVerificationTokenFormData = {\n email: string;\n verificationToken: string;\n verificationType?: EnumVerificationType;\n};\n\nexport type CreateValidateVerificationTokenFormData =\n CreateFormData<ValidateVerificationTokenFormData>;\n\nexport type AuthPayloadType = {\n refreshToken: string | null;\n token: string;\n user: SafeUserType;\n};\n\nexport type AuthMutationResponse = MutationResponse<AuthPayloadType>;\n\nexport type RefreshTokenPayloadType = {\n refreshToken: string;\n token: string;\n};\n\nexport type RefreshTokenMutationResponse =\n MutationResponse<RefreshTokenPayloadType>;\n\nexport type StartImpersonationPayloadType = {\n expiresAt: Date;\n refreshToken: string;\n sessionId: string;\n token: string;\n user: SafeUserType;\n};\n\nexport type StartImpersonationMutationResponse =\n MutationResponse<StartImpersonationPayloadType>;\n\nexport type RefreshImpersonationMutationResponse =\n MutationResponse<RefreshTokenPayloadType>;\n","import {\n Control,\n FieldValues,\n FormState,\n UseFormGetValues,\n UseFormHandleSubmit,\n UseFormReset,\n UseFormSetValue,\n UseFormWatch,\n} from \"react-hook-form\";\n\nimport {\n EnumEventDateStatus,\n EnumEventType,\n EnumPartnerType,\n EnumRegions,\n EnumResourceType,\n EnumSocialMedia,\n EnumUserLicence,\n EnumUserRole,\n} from \"../enums\";\n\nimport { EventListItemType } from \"./event\";\nimport { EnumPostType } from \"./post\";\nimport { VendorType } from \"./vendor\";\n\nexport const PROMO_CODE_PREFIX = \"CM-\";\n\nexport type PromoCodeType = `${typeof PROMO_CODE_PREFIX}${string}`;\n\nexport type Nullable<T> = {\n [K in keyof T]: T[K] | null | undefined;\n};\n\n/** Uniform mutation response envelope used across GraphQL mutations. */\nexport type MutationResponse<T> = {\n data: T | null;\n message: string | null;\n};\n\nexport type DeviceInfo = {\n appBuildNumber: string;\n appId: string;\n appVersion: string;\n brand: string;\n deviceName: string;\n installationId: string;\n manufacturer: string;\n modelName: string;\n osName: string;\n osVersion: string;\n timestamp: Date;\n};\n\nexport type TermsAgreement = DeviceInfo & {\n termVersion: string;\n};\n\nexport type ResourceContactDetailsType = {\n email?: string | null;\n landlinePhone?: string | null;\n mobilePhone?: string | null;\n};\n\nexport type ResourceImageType = {\n active: boolean;\n source: string;\n title: string;\n};\n\nexport type SocialMediaType = {\n name?: EnumSocialMedia;\n link?: string;\n};\n\nexport type UserLicenceType = {\n expiryDate: Date;\n issuedDate: Date;\n licenceType: EnumUserLicence;\n prevLicenceType?: EnumUserLicence | null;\n};\n\nexport type OwnerType = {\n email: string;\n userId: string;\n};\n\nexport interface BaseResourceTypeFormData {\n _id?: string;\n active: boolean;\n contactDetails: ResourceContactDetailsType | null;\n cover: ResourceImageType;\n coverUpload?: ResourceImageType | null;\n description: string;\n images?: ResourceImageType[] | null;\n imagesUpload?: ResourceImageType[] | null;\n logo?: ResourceImageType | null;\n logoUpload?: ResourceImageType | null;\n name: string;\n promoCodes?: PromoCodeType[] | null;\n region: string;\n socialMedia: SocialMediaType[] | null;\n termsAgreement?: TermsAgreement | null;\n}\n\nexport type PosterUsageType = {\n month: string;\n count: number;\n};\n\nexport type RelatedPostType = {\n postActive: boolean;\n postId: string;\n postSlug: string;\n postType: EnumPostType;\n};\n\nexport type SocialShareResourceType = {\n qrCode: ResourceImageType;\n socialImage: ResourceImageType;\n};\n\nexport type BaseResourceType = Omit<\n BaseResourceTypeFormData,\n \"_id\" | \"coverUpload\" | \"imagesUpload\" | \"logoUpload\"\n> & {\n _id: string;\n adIds?: string[] | null;\n approvedAt?: Date | null;\n createdAt: Date;\n deletedAt: Date | null;\n owner: OwnerType;\n posterUsage?: PosterUsageType | null;\n rating?: number | null;\n relatedPost?: RelatedPostType | null;\n reviewCount?: number | null;\n sharePublic?: SocialShareResourceType | null;\n slug: string;\n updatedAt: Date | null;\n};\n\nexport type LocationGeoType = {\n coordinates: number[]; // [longitude, latitude]\n type: \"Point\"; // Mongoose GeoJSON type\n};\n\nexport type LocationType = {\n city: string;\n country: string;\n fullAddress: string;\n geo: LocationGeoType;\n latitude: number;\n longitude: number;\n region: string;\n};\n\nexport type DateTimeType = {\n dateStatus: EnumEventDateStatus;\n endDate: string;\n endTime: string;\n startDate: string;\n startTime: string;\n};\n\nexport type DateTimeFormValue = {\n dateStatus: EnumEventDateStatus;\n endDate?: string;\n endTime?: string;\n startDate?: string;\n startTime?: string;\n};\n\nexport type Region = {\n latitude: number;\n latitudeDelta: number;\n longitude: number;\n longitudeDelta: number;\n};\n\nexport type ResourceDetails = {\n dateTime: DateTimeType[] | null;\n description: string | null;\n eventStatus?: EventStatusType | null;\n location: LocationType | null;\n resourceCover: ResourceImageType | null;\n resourceId: string;\n resourceLogo: ResourceImageType | null;\n resourceName: string;\n resourceType: EnumResourceType;\n};\n\nexport type GeocodeLocation = Pick<LocationType, \"latitude\" | \"longitude\">;\n\nexport type EventStatusType = {\n claimed: boolean;\n eventType: EnumEventType;\n googlePlaceId?: string | null;\n};\n\nexport interface FormField {\n disabled?: boolean;\n helperText?: string;\n isTextArea?: boolean;\n keyboardType?:\n | \"default\"\n | \"email-address\"\n | \"number-pad\"\n | \"url\"\n | \"decimal-pad\"\n | \"phone-pad\";\n name: string;\n placeholder: string;\n required?: boolean;\n secureTextEntry?: boolean;\n}\n\nexport interface FormDateField {\n dateMode: \"date\" | \"time\";\n helperText?: string;\n name: \"endDate\" | \"endTime\" | \"startDate\" | \"startTime\";\n placeholder: string;\n}\n\nexport interface SubcategoryItems {\n id: string;\n name: string;\n description?: string | null;\n}\n\nexport interface Subcategory {\n id: string;\n name: string;\n items?: SubcategoryItems[] | null;\n}\n\nexport type CategoryColorType = {\n primary: string;\n secondary: string;\n};\n\nexport interface Category {\n color?: CategoryColorType | null;\n description?: string | null;\n id: string;\n name: string;\n subcategories: Subcategory[];\n}\n\nexport type OptionItem = {\n value: string;\n label: string;\n};\n\nexport type ImageObjectType = {\n uri: string;\n type: string;\n name: string;\n};\n\nexport interface ResourceConnectionsType {\n events: EventListItemType[] | null;\n vendors: VendorType[] | null;\n}\n\nexport interface CreateFormData<T extends FieldValues> {\n control: Control<T, any>;\n fields: T;\n formState: FormState<T>;\n handleSubmit: UseFormHandleSubmit<T, any>;\n reset: UseFormReset<T>;\n setValue: UseFormSetValue<T>;\n watch: UseFormWatch<T>;\n getValues: UseFormGetValues<T>;\n}\n\n/** Offset-pagination input for plain list fields (events/vendors/partners/posts/users). */\nexport interface PaginationOptions {\n limit?: number;\n offset?: number;\n}\n\n/** Server-side filter input for the super-admin users list query. */\nexport interface UserListFilter {\n active?: boolean | null;\n hasLicences?: boolean | null;\n role?: EnumUserRole | null;\n search?: string | null;\n}\n\n/** Server-side filter input for the admin partners list query. */\nexport interface PartnerListFilter {\n active?: boolean | null;\n partnerType?: EnumPartnerType | null;\n region?: EnumRegions | null;\n search?: string | null;\n}\n\n/** Server-side filter input for the admin vendors list query. */\nexport interface VendorListFilter {\n active?: boolean | null;\n region?: EnumRegions | null;\n search?: string | null;\n}\n\n/** Server-side filter input for the admin events list query. */\nexport interface EventListFilter {\n active?: boolean | null;\n claimed?: boolean | null;\n region?: EnumRegions | null;\n search?: string | null;\n}\n\n/** Server-side filter input for the admin posts list query. */\nexport interface PostListFilter {\n active?: boolean | null;\n postType?: EnumPostType | null;\n search?: string | null;\n}\n\nexport interface UseGetResourcesByRegionOptions extends PaginationOptions {\n onlyClaimed?: boolean;\n skip?: boolean;\n}\n","import { EnumResourceType } from \"src/enums\";\n\nimport { CreateFormData } from \"./global\";\n\nexport enum EnumAdShowOn {\n EVENTS_PAGE = \"Events_page\",\n FRONT_PAGE = \"Front_page\",\n MARKET_SEARCH = \"Market_search\",\n PARTNERS_PAGE = \"Partners_page\",\n VENDORS_PAGE = \"Vendors_page\",\n}\n\nexport enum EnumAdPlatform {\n MOBILE = \"mobile\",\n WEB = \"web\",\n}\n\nexport enum EnumAdStatus {\n ACTIVE = \"Active\",\n PAUSED = \"Paused\",\n EXPIRED = \"Expired\",\n}\n\nexport enum EnumAdType {\n SPONSORED = \"Sponsored\",\n FREE = \"Free\",\n}\n\nexport enum EnumAdStyle {\n BLOOM = \"Bloom\",\n RISE = \"Rise\",\n}\n\nexport enum EnumAdBookingSlotKind {\n PAID = \"paid\",\n RESERVED = \"reserved\",\n}\n\nexport enum EnumAdBookingState {\n HELD = \"held\",\n PENDING_APPROVAL = \"pending_approval\",\n APPROVED = \"approved\",\n FAILED = \"failed\",\n CANCELLED = \"cancelled\",\n REJECTED = \"rejected\",\n}\n\nexport enum EnumAdPaymentStatus {\n PENDING = \"pending\",\n PAID = \"paid\",\n FAILED = \"failed\",\n CANCELLED = \"cancelled\",\n}\n\nexport enum EnumAdEntitlementSource {\n PRO_PLUS = \"pro_plus\",\n ADMIN = \"admin\",\n ORGANIZER = \"organizer\",\n PARTNER = \"partner\",\n}\n\nexport enum EnumAdApprovalStatus {\n PENDING = \"pending\",\n APPROVED = \"approved\",\n REJECTED = \"rejected\",\n}\n\nexport type AdPlacement = EnumAdShowOn.FRONT_PAGE | EnumAdShowOn.MARKET_SEARCH;\n\nexport type AdDailyPriceKey = \"front_page_day\" | \"market_search_day\";\n\nexport type AdResource = {\n adDescription: string;\n adImage: string;\n adStyle: EnumAdStyle;\n adTitle: string;\n adType: EnumAdType;\n resourceId: string;\n resourceName: string;\n resourceRegion: string;\n resourceType: EnumResourceType;\n resourceSlug: string;\n};\n\nexport interface AdFormData {\n active: boolean;\n end: Date; // ISO date string\n resource: AdResource;\n showOn: EnumAdShowOn[];\n start?: Date; // ISO date string\n status: EnumAdStatus;\n targetRegion: string[];\n}\n\n// Form state matches the validation schema: all resource fields are present.\n// Use empty strings / explicit enum defaults in `defaultValues` for \"create\" flows.\nexport type AdFormState = AdFormData;\n\nexport type CreateAdFormData = CreateFormData<AdFormData>;\nexport type CreateAdFormState = CreateFormData<AdFormState>;\n\nexport interface AdType extends AdFormData {\n _id: string;\n adminManaged?: boolean;\n approvalStatus?: EnumAdApprovalStatus;\n bookingIds?: string[];\n bookingKind?: EnumAdBookingSlotKind;\n clicks?: number; // How many times the ad was clicked\n createdAt: Date;\n impressions?: number; // How often the ad was seen\n paymentStatus?: EnumAdPaymentStatus;\n start: Date; // ISO date string\n updatedAt: Date | null;\n}\n\nexport type AdBookingType = {\n _id: string;\n adId?: string | null;\n approvalStatus: EnumAdApprovalStatus;\n checkoutAttemptId?: string | null;\n currency?: string | null;\n dayKey: string;\n entitlementClaimKey?: string | null;\n entitlementSource?: EnumAdEntitlementSource | null;\n expiresAt?: Date | null;\n placement: AdPlacement;\n purchaseKey?: string | null;\n region: string;\n resource: AdResource;\n slotKind: EnumAdBookingSlotKind;\n slotNumber: number;\n state: EnumAdBookingState;\n stripeCheckoutSessionId?: string | null;\n stripePaymentIntentId?: string | null;\n unitAmount?: number | null;\n userId: string;\n};\n\nexport type AdDailyPriceType = {\n _id: string;\n active: boolean;\n currency: \"nzd\";\n key: AdDailyPriceKey;\n revision: number;\n unitAmount: number;\n};\n\nexport type AdSettingsType = {\n _id: \"default\";\n approvalRequired: boolean;\n minAppearancesPerHour: number;\n paidSlotsPerPlacement: number;\n reservedSlotsPerPlacement: number;\n rotationSeconds: number;\n};\n","import {\n EnumEventDateStatus,\n EnumOSPlatform,\n EnumResourceType,\n} from \"src/enums\";\n\nimport { LocationGeoType } from \"./global\";\n\nexport enum EnumActivity {\n FAVORITE = \"FAVORITE\",\n GOING = \"GOING\",\n INTERESTED = \"INTERESTED\",\n PRESENT = \"PRESENT\",\n VIEW = \"VIEW\",\n}\n\nexport type ResourceActivityEntry = {\n activityType: EnumActivity;\n location: LocationGeoType | null;\n dateStatus?: EnumEventDateStatus | null;\n startDate?: string | null;\n startTime?: string | null;\n timestamp: Date;\n userAgent: EnumOSPlatform;\n userId?: string | null;\n};\n\nexport type ResourceActivityType = {\n _id: string;\n resourceType: EnumResourceType;\n resourceId: string;\n activity: ResourceActivityEntry[];\n};\n\nexport type ResourceActivityInputType = {\n resourceId: string;\n resourceType: EnumResourceType;\n activity: Omit<ResourceActivityEntry, \"timestamp\" | \"userId\">;\n};\n","import { EnumResourceType } from \"src/enums\";\n\nimport { BaseGameType } from \"./game\";\nimport {\n CreateFormData,\n ResourceImageType,\n SocialShareResourceType,\n} from \"./global\";\n\nexport enum EnumPostType {\n CLUE_BITES = \"clue_bites\",\n //CLUE_GUIDES_FOR_ORGANISERS = \"clue_guides_for_organisers\",\n //CLUE_GUIDES_FOR_VENDORS = \"clue_guides_for_vendors\",\n MARKET_FACES = \"market_faces\",\n PLAY_AND_WIN = \"play_and_win\",\n}\n\nexport enum EnumPostContentType {\n GAME = \"game\",\n IMAGE = \"image\",\n LIST = \"list\",\n TEXTAREA = \"textarea\",\n VIDEO = \"video\",\n}\n\nexport type PostFileInput = {\n source: File;\n title?: string;\n};\n\nexport type PostContentTextarea = {\n textarea: {\n title?: string;\n data: string;\n };\n};\n\nexport type PostContentImage = {\n images: ResourceImageType[] | null;\n imagesUpload?: PostFileInput[] | null;\n};\n\nexport type PostContentVideo = {\n video: {\n source: string;\n title?: string;\n };\n};\n\nexport type PostContentList = {\n list: {\n title?: string;\n items: {\n text: string;\n }[];\n };\n};\n\nexport type PostContentGame = {\n game: BaseGameType;\n};\n\nexport type PostContentData =\n | PostContentGame\n | PostContentTextarea\n | PostContentImage\n | PostContentVideo\n | PostContentList;\n\nexport type PostContentFormData = {\n contentData?: PostContentData | null;\n contentOrder?: number | null;\n contentType?: EnumPostContentType | null;\n};\n\nexport type PostResource = {\n resourceSlug: string;\n resourceId: string;\n resourceType: EnumResourceType;\n resourceRegion: string;\n};\n\nexport interface PostFormData {\n active: boolean;\n caption: string;\n content: PostContentFormData[];\n cover?: ResourceImageType | null;\n coverUpload?: PostFileInput | null;\n postType: EnumPostType;\n resource?: PostResource | null;\n tags?: string[] | null;\n title: string;\n notifyUsers?: boolean | null;\n}\n\nexport type CreatePostFormData = CreateFormData<PostFormData>;\n\nexport type PostContentType = Omit<PostContentFormData, \"contentData\"> & {\n contentData: Omit<PostContentData, \"imagesUpload\">;\n};\n\nexport type PostType = Omit<\n PostFormData,\n \"content\" | \"coverUpload\" | \"resource\"\n> & {\n _id: string;\n approvedAt?: Date | null;\n content: PostContentType[];\n createdAt: Date;\n deletedAt: Date | null;\n resource?: PostResource | null;\n slug: string;\n sharePublic?: SocialShareResourceType | null;\n updatedAt: Date | null;\n};\n","import { OwnerType } from \"../global\";\n\nimport { DailyClueBaseGame, DailyClueGameData } from \"./dailyClue\";\nimport { EnumGameType, GameDate } from \"./global\";\nimport { PuzzleBaseGame, PuzzleGameData } from \"./puzzleGame\";\n\nexport type BaseGameMap = {\n [EnumGameType.DAILY_CLUE]: DailyClueBaseGame;\n [EnumGameType.MINI_QUIZ]: PuzzleBaseGame;\n [EnumGameType.ODD_ONE_OUT]: PuzzleBaseGame;\n};\n\nexport type BaseGameType = {\n gameType: EnumGameType;\n gameTypeId: string;\n gameTitle: string;\n} & {\n [K in keyof BaseGameMap]?: BaseGameMap[K] | null;\n};\n\nexport enum EnumGameStatus {\n GAME_COMPLETED = \"GAME_COMPLETED\",\n GAME_IN_PROGRESS = \"GAME_IN_PROGRESS\",\n GAME_LEFT = \"GAME_LEFT\",\n GAME_STARTED = \"GAME_STARTED\",\n}\n\nexport type GameHistory = Pick<\n BaseGameType,\n \"gameTitle\" | \"gameType\" | \"gameTypeId\"\n> & {\n createdAt: Date;\n gameDate: GameDate;\n gameStatus: EnumGameStatus;\n /** Per-event delta. Not persisted for overallGamePoints (computed at read time). */\n pointsEarned: number;\n /** Running total for this game instance; computed at read time, not stored in Mongo. */\n overallGamePoints?: number;\n};\n\ntype GameDataMap = {\n [EnumGameType.DAILY_CLUE]: DailyClueGameData;\n [EnumGameType.MINI_QUIZ]: PuzzleGameData;\n [EnumGameType.ODD_ONE_OUT]: PuzzleGameData;\n};\ntype GameDataType = {\n [K in keyof GameDataMap]?: GameDataMap[K] | null;\n};\n\nexport type GameType = Pick<\n BaseGameType,\n \"gameTitle\" | \"gameType\" | \"gameTypeId\"\n> & {\n _id: string;\n active: boolean;\n createdAt: Date;\n gameData: GameDataType;\n gameHistory: GameHistory[] | null;\n /**\n * Set by the resolver that completed this row.\n * - `false`: completed but the points award has not been confirmed yet, so a\n * retry may still need to credit it.\n * - `true`: points confirmed credited.\n * - absent: row completed before this marker existed, so its award was already\n * granted through the legacy path and must never be credited again.\n */\n pointsCredited?: boolean | null;\n updatedAt: Date | null;\n};\n\nexport type GameDocType = {\n _id: string;\n active: boolean;\n createdAt: Date;\n deletedAt: Date | null;\n games: GameType[] | null;\n owner: OwnerType;\n points: number;\n updatedAt: Date | null;\n};\n\nexport type GameLeaderboard = {\n gameHistory: GameHistory[] | null;\n nickName: string;\n overallPoints: number;\n userId: string;\n};\n","import { GameDate, GlobalGameData } from \"./global\";\n\nconst OBJECT_ID_PATH_SEGMENT = \"[a-f0-9]{24}\";\nconst OBJECT_ID_PATH_SEGMENT_END = `${OBJECT_ID_PATH_SEGMENT}$`;\n\nexport const gameScreenIdentifierList = [\n {\n clue: \"Where conversations happen without speaking.\",\n id: \"chat\",\n match: \"/chat\",\n },\n {\n clue: \"Where you can find your loyalties.\",\n id: \"coupons\",\n match: \"/profile/account/coupons\",\n },\n {\n clue: \"A single moment worth showing up for.\",\n id: \"single-event\",\n match: new RegExp(`^/events/${OBJECT_ID_PATH_SEGMENT_END}`),\n },\n {\n clue: \"What’s happening around you, right now.\",\n id: \"events-near-me\",\n match: \"/events/events-near-me\",\n },\n {\n clue: \"Where events appear as pins on a map.\",\n id: \"events-map\",\n match: \"/events/events-map\",\n },\n {\n clue: \"A collection of events worth attending.\",\n id: \"events\",\n match: \"/events\",\n },\n {\n clue: \"What’s happening in a wider area — not just nearby.\",\n id: \"events-region\",\n match: /^\\/events\\/region\\/[^/]+$/,\n },\n {\n clue: \"Where fun becomes a challenge.\",\n id: \"games\",\n match: \"/profile/account/games\",\n },\n {\n clue: \"Your starting point for everything.\",\n id: \"home\",\n match: \"/home\",\n },\n {\n clue: \"Where the app whispers what you shouldn’t miss.\",\n id: \"notifications\",\n match: \"/notifications\",\n },\n {\n clue: \"An organisation or creator supporting the community.\",\n id: \"single-partner\",\n match: new RegExp(`^/partners/${OBJECT_ID_PATH_SEGMENT_END}`),\n },\n {\n clue: \"Organisations and creators supporting the community.\",\n id: \"partners\",\n match: \"/partners\",\n },\n {\n clue: \"Where your actions turn into a timeline.\",\n id: \"activities\",\n match: \"/profile/account/favourites\",\n },\n {\n clue: \"The place to redefine who you are.\",\n id: \"edit-profile\",\n match: \"/profile/account\",\n },\n {\n clue: \"Your identity, on display.\",\n id: \"profile\",\n match: \"/profile\",\n },\n {\n clue: \"Where you can redeem your rewards.\",\n id: \"rewards\",\n match: \"/profile/account/rewards\",\n },\n {\n clue: \"A single published post in full view.\",\n id: \"single-visitor-post\",\n match: new RegExp(`^/visitors/post/${OBJECT_ID_PATH_SEGMENT_END}`),\n },\n {\n clue: \"One stallholder offering something valuable.\",\n id: \"single-vendor\",\n match: new RegExp(`^/vendors/${OBJECT_ID_PATH_SEGMENT_END}`),\n },\n {\n clue: \"Where every stallholder waits under the right category.\",\n id: \"vendors\",\n match: \"/vendors\",\n },\n {\n clue: \"Where you browse articles and posts from around the platform.\",\n id: \"visitors\",\n match: \"/visitors\",\n },\n {\n clue: \"Where you fine-tune your experience.\",\n id: \"options\",\n match: \"/options\",\n },\n] as const;\n\nexport type GamePlacement = (typeof gameScreenIdentifierList)[number][\"id\"];\nexport type GamePlacementClue =\n (typeof gameScreenIdentifierList)[number][\"clue\"];\n\nexport type DailyClueBaseGame = {\n gameDate: GameDate;\n gameSolution: string;\n};\n\nexport type DailyClueGameData = GlobalGameData & {\n gameFields: DailyClueBaseGame;\n lastFoundDate: Date | null;\n letterInfo: {\n // Multiset of found letters: one entry per collected occurrence, so a\n // duplicate letter (e.g. two \"E\"s in \"EXPLORE\") appears twice once both\n // are found. Consumers must count occurrences, not use `includes`.\n collected: string[] | null;\n solutionShuffled: string[]; // The letters of the solution, but shuffled, e.g. [\"L\", \"C\", \"U\"]\n todaysClue: GamePlacementClue | null; // The clue for user to find the letter, e.g. related to {todaysPlacement}\n todaysLetter: string | null; // The letter the user has to find today, e.g. \"C\"\n todaysPlacement: GamePlacement | null; // The screen where the user has to find the clue, e.g. \"HomeScreen\"\n };\n};\n","export enum EnumGameType {\n DAILY_CLUE = \"dailyClue\",\n MINI_QUIZ = \"miniQuiz\",\n ODD_ONE_OUT = \"oddOneOut\",\n}\n\nexport type GameDate = {\n startDate: Date;\n endDate: Date;\n};\n\nexport const gameTypeToDisplayName: Record<EnumGameType, string> = {\n [EnumGameType.DAILY_CLUE]: \"Daily Clue\",\n [EnumGameType.MINI_QUIZ]: \"Mini Quiz\",\n [EnumGameType.ODD_ONE_OUT]: \"Odd One Out\",\n};\n\nexport type GlobalGameData = {\n points: number;\n // User has found the clue 3 days in a row, this is incrementing if the user finds the clue and decrements if user misses a day\n streak: number;\n};\n","import { EnumResourceType } from \"src/enums\";\n\nimport {\n CreateFormData,\n LocationType,\n OwnerType,\n PromoCodeType,\n SocialMediaType,\n} from \"./global\";\nimport { UserFormData } from \"./user\";\n\nexport enum EnumAffiliateParticipantType {\n INDIVIDUAL = \"INDIVIDUAL\",\n SOLE_TRADER = \"SOLE_TRADER\",\n COMPANY = \"COMPANY\",\n}\n\nexport type AffiliateContactDetails = {\n mobilePhone: string;\n};\n\nexport type AffiliateBankAccountDetailsType = {\n accountHolderName: string;\n accountNumber: string;\n};\n\nexport type AffiliateUserDefaultFields = Pick<\n UserFormData,\n \"email\" | \"firstName\" | \"lastName\" | \"termsAgreement\"\n>;\n\nexport type AffiliateDetailsType = AffiliateUserDefaultFields & {\n bankAccountDetails: AffiliateBankAccountDetailsType;\n contactDetails: AffiliateContactDetails;\n irdNumber: string;\n location: LocationType;\n participantType: EnumAffiliateParticipantType;\n socialMedia: SocialMediaType[] | null;\n};\n\nexport enum EnumAffiliateRewardType {\n ACTIVE_EVENT_WITH_VENDOR_REGISTRATIONS = \"ACTIVE_EVENT_WITH_VENDOR_REGISTRATIONS\",\n ACTIVE_VENDOR_BONUS_REWARD = \"ACTIVE_VENDOR_BONUS_REWARD\",\n ACTIVE_VENDOR_PRO_SUBSCRIPTION = \"ACTIVE_VENDOR_PRO_SUBSCRIPTION\",\n ACTIVE_VENDOR_STANDARD_SUBSCRIPTION = \"ACTIVE_VENDOR_STANDARD_SUBSCRIPTION\",\n NEW_EVENT_REGISTRATION = \"NEW_EVENT_REGISTRATION\",\n NEW_VENDOR_REGISTRATION = \"NEW_VENDOR_REGISTRATION\",\n}\n\nexport type AffiliateRewardType = {\n createdAt: Date;\n redeemedAt: Date | null;\n rewardDescription: string;\n rewardType: EnumAffiliateRewardType;\n rewardValue: number;\n};\n\nexport type AffiliateResourceType = {\n resourceActive: boolean;\n resourceDeletedAt: Date | null;\n resourceId: string;\n resourceName: string;\n resourceOwner: OwnerType;\n resourceType: EnumResourceType;\n rewards: AffiliateRewardType[];\n};\n\nexport type RedeemHistoryType = {\n paidAt?: Date | null;\n redeemedAt: Date;\n rewardValue: number;\n};\n\nexport interface AffiliateType {\n _id: string;\n active: boolean;\n approvedAt?: Date | null;\n affiliateBonusRewards?: AffiliateRewardType[] | null;\n affiliateCode: PromoCodeType | null;\n affiliateDetails: AffiliateDetailsType | null;\n affiliateResources: AffiliateResourceType[];\n createdAt: Date;\n deletedAt: Date | null;\n overallPoints: number;\n owner: OwnerType;\n redeemHistory?: RedeemHistoryType[] | null;\n updatedAt: Date | null;\n}\n\nexport type AffiliateFormData = Omit<\n AffiliateDetailsType,\n \"email\" | \"firstName\" | \"lastName\"\n>;\n\nexport type CreateAffiliateFormData = CreateFormData<AffiliateFormData>;\n","import { EnumResourceType } from \"../../enums\";\nimport { CreateFormData, OwnerType, ResourceImageType } from \"../global\";\nimport { VendorProductList } from \"../vendor\";\n\nexport type ProductCoupon = {\n couponDocumentId: string;\n couponId: string;\n};\n\nexport enum EnumCouponQualificationType {\n PURCHASE = \"PURCHASE\",\n MARKET_VISIT = \"MARKET_VISIT\",\n MARKET_PASSPORT = \"MARKET_PASSPORT\",\n}\n\nexport type CouponPurchaseOption = {\n buy: number;\n get: number;\n maxRewardCount: number;\n type: EnumCouponQualificationType.PURCHASE;\n unit: string;\n};\n\nexport type CouponMarketVisitOption = {\n type: EnumCouponQualificationType.MARKET_VISIT;\n visits: number;\n};\n\nexport type CouponMarketPassportOption = {\n type: EnumCouponQualificationType.MARKET_PASSPORT;\n visits: number;\n};\n\nexport type CouponOption =\n CouponPurchaseOption | CouponMarketVisitOption | CouponMarketPassportOption;\n\nexport type CouponVendorProduct = {\n couponId: string;\n productId: string;\n vendorId: string;\n\n // Required only for MARKET_PASSPORT: which Vendor coupon contributes\n // progress when scanned.\n vendorCouponId?: string | null;\n};\n\nexport type CouponDefaultsFormData = {\n couponDescription: string;\n couponOption: CouponOption | null;\n couponVendorProducts?: CouponVendorProduct[];\n endDate: Date;\n resourceId: string;\n resourceType: EnumResourceType;\n startDate: Date;\n};\n\nexport type CreateCouponFormData = CreateFormData<CouponDefaultsFormData>;\n\nexport type CouponParticipantUserType = {\n couponCollectedCount: number;\n couponRedeemedAt: Date | null;\n couponRedeemedCount: number;\n couponCycleRedeemed: boolean;\n createdAt: Date;\n updatedAt: Date | null;\n userId: string;\n // Not persisted; resolved on read by `attachCouponDataProducts` from\n // `UserModel` via the participant's `userId`.\n nickName?: string | null;\n};\n\nexport type CouponCodeType = {\n code: string;\n qrCode: ResourceImageType;\n shareableQrCode: ResourceImageType;\n};\n\nexport type CouponDataProductsType = {\n active: boolean | null;\n couponId: string;\n productsList: VendorProductList[];\n vendorId: string;\n vendorLogo: ResourceImageType | null;\n vendorName: string;\n};\n\nexport type CouponDataType = CouponDefaultsFormData & {\n _id: string;\n active: boolean;\n couponCode: CouponCodeType | null;\n createdAt: Date;\n deletedAt: Date | null;\n participantUsers: CouponParticipantUserType[] | null;\n // products are not saved in the database, but are returned by the backend for convenience\n products?: CouponDataProductsType[] | null;\n updatedAt: Date | null;\n};\n\nexport interface CouponType {\n _id: string;\n active: boolean;\n couponData: CouponDataType[] | null;\n createdAt: Date;\n deletedAt: Date | null;\n owner: OwnerType;\n updatedAt: Date | null;\n}\n\nexport enum EnumCouponListType {\n ACTIVE = \"active\",\n OWNED = \"owned\",\n SCANNED = \"scanned\",\n}\n\nexport type CouponTypeList = {\n active: {\n data: CouponType[] | null;\n listName: EnumCouponListType.ACTIVE;\n };\n owned: {\n data: CouponType[] | null;\n listName: EnumCouponListType.OWNED;\n };\n scanned: {\n data: CouponType[] | null;\n listName: EnumCouponListType.SCANNED;\n };\n};\n"],"mappings":"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","names":["EnumVerificationType","EnumAdShowOn","EnumAdPlatform","EnumAdStatus","EnumAdType","EnumAdStyle","EnumAdBookingSlotKind","EnumAdBookingState","EnumAdPaymentStatus","EnumAdEntitlementSource","EnumAdApprovalStatus","EnumActivity","EnumPostType","EnumPostContentType","EnumGameStatus","EnumGameType","EnumAffiliateParticipantType","EnumAffiliateRewardType","EnumCouponQualificationType","EnumCouponListType"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/dailyClueGame.ts","../src/utils/mapArrayToOptions.ts","../src/utils/utils.ts","../src/utils/resourceImage.ts","../src/utils/school.ts","../src/utils/userPoints.ts","../src/calendar/eventCalendar.ts","../src/formFields/categories/clothingAndFashion.ts","../src/formFields/categories/electronicsAndTechnology.ts","../src/formFields/categories/foodAndBeverages.ts","../src/formFields/categories/handmadeAndLocalProducts.ts","../src/formFields/categories/healthAndWellness.ts","../src/formFields/categories/homeGardenHousehold.ts","../src/formFields/categories/petProductsAndAnimalGoods.ts","../src/formFields/categories/serviceAndExperience.ts","../src/formFields/categories/toysChildren.ts","../src/formFields/categories/vintageAndAntique.ts","../src/formFields/categories/index.ts","../src/eventStallholders/eventStallholderFilters.ts","../src/vendorEvents/vendorEventFilters.ts","../src/utils/affiliate.ts","../src/utils/irdNumber.ts","../src/utils/billingCatalog/index.ts","../src/utils/relations/eventStallholders.ts","../src/utils/relations/vendorEvents.ts","../src/utils/relations/preservedRelationDateStatuses.ts","../src/utils/toUserFacingErrorMessage.ts"],"sourcesContent":["import type { Dayjs } from \"dayjs\";\n\nimport {\n DailyClueGameData,\n GamePlacement,\n GamePlacementClue,\n gameScreenIdentifierList,\n} from \"../types/game/dailyClue\";\n\nimport { nzStartOfDay } from \"./date\";\n\nfunction createSeededRng(seed: number) {\n let t = seed >>> 0;\n\n return function random() {\n t += 0x6d2b79f5;\n let x = t;\n\n x = Math.imul(x ^ (x >>> 15), x | 1);\n x ^= x + Math.imul(x ^ (x >>> 7), x | 61);\n\n return ((x ^ (x >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nfunction hashStringToNumber(seed: string): number {\n let hash = 2166136261;\n\n for (let i = 0; i < seed.length; i++) {\n hash ^= seed.codePointAt(i) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n\n return hash >>> 0;\n}\n\n/** Seeded shuffle so all players see the same letter order / placements for a game. */\nexport function seededShuffle<T>(array: readonly T[], seed: string): T[] {\n const rng = createSeededRng(hashStringToNumber(seed));\n const result = [...array];\n\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1));\n [result[i], result[j]] = [result[j], result[i]];\n }\n\n return result;\n}\n\nfunction getDayIndex(start: Dayjs, today: Dayjs): number {\n return today.diff(start, \"day\");\n}\n\n/**\n * Number of whole days since `dailyClue`'s start date (NZ time), i.e. today's\n * slot index into the game's day-based arrays.\n *\n * Returns `0` on the start date and a positive value on later days up to and\n * including the end date. Returns `null` outside the game window (before the\n * start date or after the end date), so callers must handle `null` instead of\n * blindly indexing arrays — an out-of-window index would silently produce\n * `undefined` or, in the occurrence helpers, wrongly report a letter as\n * already collected.\n *\n * Extracted from `computeDailyClueState` so callers (e.g. the update mutation)\n * can resolve the same index without re-implementing the day-math.\n */\nexport function getDailyClueDayIndex(\n dailyClue: DailyClueGameData,\n): number | null {\n const today = nzStartOfDay();\n const start = nzStartOfDay(dailyClue.gameFields.gameDate.startDate);\n const end = nzStartOfDay(dailyClue.gameFields.gameDate.endDate);\n\n if (today.isBefore(start) || today.isAfter(end)) {\n return null;\n }\n\n return getDayIndex(start, today);\n}\n\n/**\n * Number of times `letter` appears in `letters`.\n *\n * `collected` is a multiset (duplicate letters are stored once per found\n * occurrence), so membership checks such as `includes` are not enough — callers\n * must count how many occurrences have actually been collected.\n */\nexport function countLetterOccurrences(\n letters: readonly string[],\n letter: string,\n): number {\n return letters.reduce(\n (count, candidate) => (candidate === letter ? count + 1 : count),\n 0,\n );\n}\n\n/**\n * Number of times `letter` appears at or before `index` in `letters`.\n *\n * This is the \"required\" count for today's slot: a duplicate letter must not be\n * considered already collected until every earlier occurrence of it in\n * `solutionShuffled` has also been found.\n */\nexport function countLetterOccurrencesUpTo(\n letters: readonly string[],\n letter: string,\n index: number,\n): number {\n let count = 0;\n const end = Math.min(index, letters.length - 1);\n\n for (let i = 0; i <= end; i++) {\n if (letters[i] === letter) {\n count++;\n }\n }\n\n return count;\n}\n\nexport function computeDailyClueState(dailyClue: DailyClueGameData): {\n todaysClue: GamePlacementClue | null;\n todaysLetter: string | null;\n todaysPlacement: GamePlacement | null;\n} | null {\n const { startDate, endDate } = dailyClue.gameFields.gameDate;\n const { solutionShuffled, collected } = dailyClue.letterInfo;\n\n const today = nzStartOfDay();\n const start = nzStartOfDay(startDate);\n const end = nzStartOfDay(endDate);\n\n // Before game starts\n if (today.isBefore(start)) {\n return null;\n }\n\n const shuffledPlacements = seededShuffle(\n gameScreenIdentifierList,\n start.toISOString(),\n );\n\n const index = getDayIndex(start, today);\n\n // After game ends\n if (today.isAfter(end)) {\n return {\n todaysClue: null,\n todaysLetter: null,\n todaysPlacement: null,\n };\n }\n\n // Safety: index must exist in BOTH arrays\n if (\n index < 0 ||\n index >= solutionShuffled.length ||\n index >= shuffledPlacements.length\n ) {\n return null;\n }\n\n const letterToday = solutionShuffled[index];\n const placement = shuffledPlacements[index];\n\n if (!letterToday || !placement) return null;\n\n const collectedLetters = collected ?? [];\n\n // Compare collected occurrences against how many of today's letter have\n // appeared at or before this day's slot. This fixes solutions with duplicate\n // letters (e.g. \"EXPLORE\" has two \"E\"s): one collected \"E\" must not hide the\n // second \"E\" day. Membership checks (`includes`) can't express that.\n const alreadyCollectedToday =\n countLetterOccurrences(collectedLetters, letterToday) >=\n countLetterOccurrencesUpTo(solutionShuffled, letterToday, index);\n\n // Already completed today\n if (alreadyCollectedToday) {\n return {\n todaysClue: null,\n todaysLetter: null,\n todaysPlacement: null,\n };\n }\n\n // Active state\n return {\n todaysClue: placement.clue,\n todaysLetter: letterToday,\n todaysPlacement: placement.id,\n };\n}\n","import { OptionItem } from \"src/types\";\n\n/**\n * Convert an array of strings to an array of objects with label and value properties.\n */\nexport const mapArrayToOptions = (items: string[]): OptionItem[] =>\n items.map((item) => ({\n label: item,\n value: item,\n }));\n","import {\n EnumInviteStatus,\n EnumPaymentMethod,\n EnumRegions,\n EnumReward,\n EnumSocialMedia,\n EnumUserLicence,\n} from \"src/enums\";\nimport { stripOverlaySubtitleSpecialChars } from \"src/sharing/normalizeShareDescription\";\nimport {\n EnumPostType,\n OptionItem,\n PROMO_CODE_PREFIX,\n SocialMediaType,\n} from \"src/types\";\n\nimport { isIsoDateString } from \"./date\";\nimport { mapArrayToOptions } from \"./mapArrayToOptions\";\n\nexport const removeTypename = (obj: any): any => {\n // Preserve Date objects\n if (obj instanceof Date) {\n return obj;\n }\n\n // Preserve File objects (for apollo-upload-client)\n if (obj instanceof File) {\n return obj;\n }\n\n // Preserve ISO date strings\n if (isIsoDateString(obj)) {\n return obj;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map(removeTypename);\n }\n\n // Handle plain objects only\n if (obj !== null && typeof obj === \"object\") {\n const { __typename, ...cleanedObj } = obj;\n\n return Object.keys(cleanedObj).reduce((acc: any, key) => {\n acc[key] = removeTypename(cleanedObj[key]);\n return acc;\n }, {});\n }\n\n // Primitives\n return obj;\n};\n\n/**\n * Truncate text to a specified length and append ellipsis if necessary.\n * @param text\n * @param maxLength\n * @returns\n */\nexport const truncateText = (text: string, maxLength: number = 30): string => {\n const result = stripOverlaySubtitleSpecialChars(text);\n return result.length > maxLength\n ? result.substring(0, maxLength) + \"...\"\n : result;\n};\n\nexport const capitalizeFirstLetter = (str: string): string => {\n return str\n .split(\" \")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n};\n\nexport const statusOptions = [\n ...Object.values(EnumInviteStatus)\n .map((status) => ({\n label: status,\n value: status,\n }))\n .sort((a, b) => a.label.localeCompare(b.label)), // Sort the options alphabetically\n];\n\nexport const availableRegionTypes = Object.values(EnumRegions);\nexport const availableRegionOptions: OptionItem[] =\n mapArrayToOptions(availableRegionTypes);\n\nexport const paymentMethodOptions: OptionItem[] = mapArrayToOptions(\n Object.values(EnumPaymentMethod),\n);\n\nexport function normalizeUrl(url: string): string {\n const withProtocol =\n !url.startsWith(\"http://\") && !url.startsWith(\"https://\")\n ? `https://${url}`\n : url;\n return withProtocol.replace(/\\/+$/, \"\");\n}\n\nexport const licenseNiceNames: Record<EnumUserLicence, string> = {\n [EnumUserLicence.PRO_EVENT]: \"Pro Event\",\n [EnumUserLicence.PRO_VENDOR]: \"Pro Stallholder\",\n [EnumUserLicence.STANDARD_EVENT]: \"Standard Event\",\n [EnumUserLicence.STANDARD_VENDOR]: \"Standard Stallholder\",\n [EnumUserLicence.PRO_PLUS_EVENT]: \"Pro+Ads Event\",\n [EnumUserLicence.PRO_PLUS_VENDOR]: \"Pro+Ads Stallholder\",\n [EnumUserLicence.STANDARD_PARTNER]: \"Partner\",\n [EnumUserLicence.STANDARD_AFFILIATE]: \"Affiliate\",\n [EnumUserLicence.STANDARD_SCHOOL]: \"School\",\n};\n\nexport const vendorLicences: EnumUserLicence[] = [\n EnumUserLicence.STANDARD_VENDOR,\n EnumUserLicence.PRO_VENDOR,\n EnumUserLicence.PRO_PLUS_VENDOR,\n];\n\nexport const cluemartSocialMedia: SocialMediaType[] = [\n {\n link: \"https://www.facebook.com/ClueMartApp\",\n name: EnumSocialMedia.FACEBOOK,\n },\n {\n link: \"https://www.instagram.com/cluemart_app\",\n name: EnumSocialMedia.INSTAGRAM,\n },\n {\n link: \"https://www.tiktok.com/@cluemart\",\n name: EnumSocialMedia.TIKTOK,\n },\n {\n link: \"https://www.youtube.com/@ClueMart-App-NZ\",\n name: EnumSocialMedia.YOUTUBE,\n },\n];\n\nexport const IOS_URL = \"https://apps.apple.com/nz/app/cluemart/id6747251008\";\nexport const ANDROID_URL =\n \"https://play.google.com/store/apps/details?id=com.timardex.cluemart\";\n\nexport const DEFAULT_RESOURCES_RETURN_LIMIT = 1000;\nexport const DEFAULT_RESOURCES_RETURN_OFFSET = 0;\nexport const CLUEMART_MAIN_DOMAIN_URL = \"https://cluemart.co.nz\";\n\nexport const rewardNiceNames: Record<\n EnumReward,\n { name: string; points: number }\n> = {\n [EnumReward.MYSTERY_JOY_BOX]: {\n name: \"Mystery Joy Box\",\n points: 250,\n },\n [EnumReward.MYSTERY_SQUEEZE_BOX]: {\n name: \"Mystery Squeeze Box\",\n points: 350,\n },\n [EnumReward.MYSTERY_DELUXE_BOX]: {\n name: \"Mystery Deluxe Box\",\n points: 500,\n },\n};\n\nexport const PostTypeLabels: Record<EnumPostType, string> = {\n [EnumPostType.MARKET_FACES]: \"Market Faces\",\n [EnumPostType.CLUE_BITES]: \"Clue Bites\",\n [EnumPostType.PLAY_AND_WIN]: \"Play & Win\",\n //[EnumPostType.CLUE_GUIDES_FOR_ORGANISERS]: \"Clue Guides for Organisers\",\n //[EnumPostType.CLUE_GUIDES_FOR_VENDORS]: \"Clue Guides for Stallholders\",\n};\n\n/** Hardcoded registration gateway code; only valid at sign-up (not a generated school referral code). */\nexport const CM_SCHOOL_PROMO_CODE = `${PROMO_CODE_PREFIX}SCHOOL`;\n\n/** Hardcoded registration gateway code; only valid at sign-up (not a generated affiliate referral code). */\nexport const CM_AFFILIATE_PROMO_CODE = `${PROMO_CODE_PREFIX}AFFILIATE`;\n\nexport function formatNZBankAccount(input: string): string {\n // Remove all non-digit characters\n const digitsOnly = input.replaceAll(/\\D/g, \"\");\n\n // Build the formatted string step-by-step\n const parts = [];\n if (digitsOnly.length > 0) parts.push(digitsOnly.slice(0, 2)); // bank\n if (digitsOnly.length > 2) parts.push(digitsOnly.slice(2, 6)); // branch\n if (digitsOnly.length > 6) parts.push(digitsOnly.slice(6, 13)); // account\n if (digitsOnly.length > 13) parts.push(digitsOnly.slice(13, 15)); // suffix\n\n return parts.join(\"-\");\n}\n","import { ResourceImageType } from \"../types/global\";\n\n/**\n * Loose input shape for normalization helpers. Callers often pass partial or legacy\n * data (e.g. Mongo docs without `active`, GraphQL input, empty placeholders) before\n * it becomes a strict `ResourceImageType`.\n */\ntype ResourceImageLike = {\n active?: boolean | null;\n source?: string | null;\n title?: string | null;\n};\n\n/**\n * Resolves whether a resource image is active.\n * Only an explicit `active: true` shows the image; missing `active` defaults to false\n * so licence downgrades (e.g. standard vendor gallery limit) are not overridden.\n */\nexport function resolveResourceImageActive(\n image: ResourceImageLike | null | undefined,\n): boolean {\n if (image?.active != null) {\n return image.active;\n }\n\n return false;\n}\n\nexport function normalizeResourceImage(\n image: ResourceImageLike | null | undefined,\n): ResourceImageType {\n return {\n active: resolveResourceImageActive(image),\n source: image?.source ?? \"\",\n title: image?.title ?? \"\",\n };\n}\n\nexport function isResourceImageActive(\n image: ResourceImageLike | null | undefined,\n): boolean {\n return resolveResourceImageActive(image);\n}\n","export const SCHOOL_MIN_STUDENT_COUNT = 300;\nexport const SCHOOL_MAX_STUDENT_COUNT = 0;\n","import type { UserOverallPointsEntry } from \"../types/user\";\n\n/**\n * Spendable points for a user.\n *\n * `overallPoints` is an append-only ledger (one entry per award), so the total\n * is always the sum of every entry rather than a single stored number.\n *\n * Nullish ledgers and nullish entries are skipped, so a partially written\n * document cannot throw while the total is computed.\n */\nexport function sumUserOverallPoints(\n points: (UserOverallPointsEntry | null | undefined)[] | null | undefined,\n): number {\n return (points ?? []).reduce(\n (total, entry) => total + (entry?.points ?? 0),\n 0,\n );\n}\n","import dayjs from \"dayjs\";\n\nimport { EnumEventDateStatus, EnumResourceType } from \"../enums\";\nimport type { DateTimeType, LocationType } from \"../types/global\";\nimport { dateFormat } from \"../utils/date\";\nimport { EVENT_DATE_STATUS_LABELS } from \"../utils/eventDateStatus\";\n\nexport type CalendarSheetContentData = {\n dateTime: DateTimeType;\n location: LocationType;\n resourceId: string;\n resourceType: EnumResourceType;\n};\n\nexport type EventScheduleStatusTone =\n | \"started\"\n | \"startingSoon\"\n | \"upcoming\"\n | \"ended\"\n | \"canceled\"\n | \"rescheduled\"\n | \"invalid\"\n | \"default\";\n\nexport type EventScheduleStatusPresentation = {\n status: EnumEventDateStatus;\n statusLabel: string;\n tone: EventScheduleStatusTone;\n};\n\nexport function toCalendarIsoDate(startDate: string): string | null {\n const formatted = dayjs(startDate, dateFormat).format(\"YYYY-MM-DD\");\n\n return dayjs(formatted, \"YYYY-MM-DD\", true).isValid() ? formatted : null;\n}\n\nexport function fromCalendarIsoDate(isoDate: string): string {\n return dayjs(isoDate, \"YYYY-MM-DD\").format(dateFormat);\n}\n\nexport function getEventCalendarIsoDates(\n dateTimes: Array<{ startDate?: string | null }> | null | undefined,\n): string[] {\n return (\n dateTimes\n ?.map((dateTime) =>\n dateTime.startDate ? toCalendarIsoDate(dateTime.startDate) : null,\n )\n .filter((date): date is string => Boolean(date)) ?? []\n );\n}\n\nexport function findEventDateTimeByIsoDate(\n dateTimes: DateTimeType[] | null | undefined,\n isoDate: string,\n): DateTimeType | null {\n const selected = fromCalendarIsoDate(isoDate);\n\n return dateTimes?.find((dateTime) => dateTime.startDate === selected) ?? null;\n}\n\nexport function buildCalendarSheetContentData(\n dateTimes: DateTimeType[],\n isoDate: string,\n location: LocationType,\n resourceId: string,\n resourceType: EnumResourceType,\n): CalendarSheetContentData | null {\n const dateTime = findEventDateTimeByIsoDate(dateTimes, isoDate);\n\n if (!dateTime) {\n return null;\n }\n\n return {\n dateTime,\n location,\n resourceId,\n resourceType,\n };\n}\n\nexport function getEventScheduleStatusTone(\n status: EnumEventDateStatus,\n): EventScheduleStatusTone {\n switch (status) {\n case EnumEventDateStatus.STARTED:\n return \"started\";\n case EnumEventDateStatus.STARTING_SOON:\n return \"startingSoon\";\n case EnumEventDateStatus.TODAY:\n case EnumEventDateStatus.TOMORROW:\n case EnumEventDateStatus.THIS_WEEK:\n case EnumEventDateStatus.NEXT_WEEK:\n case EnumEventDateStatus.UPCOMING:\n return \"upcoming\";\n case EnumEventDateStatus.ENDED:\n return \"ended\";\n case EnumEventDateStatus.CANCELED:\n return \"canceled\";\n case EnumEventDateStatus.RE_SCHEDULED:\n return \"rescheduled\";\n case EnumEventDateStatus.INVALID:\n return \"invalid\";\n default:\n return \"default\";\n }\n}\n\nexport function getEventScheduleStatusPresentation(\n dateTime: DateTimeType,\n): EventScheduleStatusPresentation {\n return {\n status: dateTime.dateStatus,\n statusLabel: EVENT_DATE_STATUS_LABELS[dateTime.dateStatus],\n tone: getEventScheduleStatusTone(dateTime.dateStatus),\n };\n}\n\nexport function getEventScheduleStatusLabel(\n dateTime: DateTimeType,\n): string | null {\n const { dateStatus: status } = dateTime;\n\n if (!status) {\n return null;\n }\n\n return EVENT_DATE_STATUS_LABELS[status];\n}\n\nexport function shouldShowEventActionsWithWeather(\n resourceType: EnumResourceType,\n dateTime: DateTimeType,\n location: LocationType | null | undefined,\n): boolean {\n return (\n resourceType === EnumResourceType.EVENT &&\n Boolean(location) &&\n Boolean(dateTime?.dateStatus) &&\n ![EnumEventDateStatus.ENDED, EnumEventDateStatus.CANCELED].includes(\n dateTime.dateStatus,\n )\n );\n}\n","/* eslint-disable sort-keys */\nimport { Category } from \"src/types\";\n\nexport const clothingAndFashion: Category[] = [\n {\n id: \"clothing-fashion\",\n name: \"Clothing & Fashion\",\n description:\n \"New, handmade, or upcycled clothing and accessories with a creative twist.\",\n subcategories: [\n {\n id: \"apparel-babywear\",\n name: \"Apparel & Babywear\",\n items: [\n {\n id: \"apparel\",\n name: \"Apparel\",\n description: \"Dresses, t-shirts, jumpers, rompers, sets, kidswear.\",\n },\n {\n id: \"baby-toddler-apparel\",\n name: \"Baby & Toddler Apparel\",\n description:\n \"Handmade baby clothes, soft shoes, bibs, hats, knitted sets.\",\n },\n {\n id: \"upcycled-fashion\",\n name: \"Upcycled Fashion\",\n description:\n \"Reworked garments, patchwork pieces, restyled vintage.\",\n },\n {\n id: \"other-wearable-items\",\n name: \"Other wearable items\",\n description: \"Unique clothing not listed above.\",\n },\n ],\n },\n {\n id: \"fashion-accessories\",\n name: \"Fashion Accessories\",\n items: [\n {\n id: \"accessories\",\n name: \"Accessories\",\n description: \"Scarves, belts, gloves, hats, headbands, caps.\",\n },\n {\n id: \"shoes\",\n name: \"Shoes\",\n description: \"Handmade shoes, baby booties, sandals, slippers.\",\n },\n {\n id: \"bags-wallets\",\n name: \"Bags & Wallets\",\n description:\n \"Leather bags, fabric purses, wallets, backpacks, totes.\",\n },\n {\n id: \"other-accessories\",\n name: \"Other accessories\",\n description: \"Brooches, pins, or hybrid functional items.\",\n },\n ],\n },\n {\n id: \"jewelry-creative-wearables\",\n name: \"Jewelry & Creative Wearables\",\n items: [\n {\n id: \"jewelry\",\n name: \"Jewelry\",\n description: \"Necklaces, earrings, bracelets, rings, anklets.\",\n },\n {\n id: \"other-creative-wearables\",\n name: \"Other creative wearables\",\n description:\n \"Wearable art, statement pieces, bold handmade designs.\",\n },\n ],\n },\n {\n id: \"traditional-cultural-clothing-accessories\",\n name: \"Traditional & Cultural Clothing and Accessories\",\n items: [\n {\n id: \"traditional-clothing-accessories\",\n name: \"Traditional Clothing & Accessories \",\n description:\n \"raditional clothing, jewellery, accessories and footwear from around the world, including both handmade and non-handmade items.\",\n },\n {\n id: \"other-traditional-cultural-items\",\n name: \"Other Traditional & Cultural Items\",\n description:\n \"traditional or culturally inspired wearables and decorative cultural pieces such as plates, table linens and similar items.\",\n },\n ],\n },\n ],\n },\n];\n","/* eslint-disable sort-keys */\nimport { Category } from \"src/types\";\n\nexport const electronicsAndTechnology: Category[] = [\n {\n id: \"electronics-technology\",\n name: \"Electronics & Technology\",\n description:\n \"New, second-hand, or handmade tech and digital items commonly found at markets.\",\n subcategories: [\n {\n id: \"mobile-everyday-tech\",\n name: \"Mobile & Everyday Tech\",\n items: [\n {\n id: \"mobile-phone-accessories\",\n name: \"Mobile & Phone Accessories\",\n description:\n \"Phone cases, holders, screen protectors, charging cables, power banks, grips.\",\n },\n {\n id: \"other-mobile-gadgets\",\n name: \"Other mobile gadgets\",\n description:\n \"Stands, styluses, SIM tools, cleaning kits, wallet accessories.\",\n },\n ],\n },\n {\n id: \"audio-music-creative-tech\",\n name: \"Audio, Music & Creative Tech\",\n items: [\n {\n id: \"audio-music-tech\",\n name: \"Audio & Music Tech\",\n description:\n \"Portable speakers, headphones, mini radios, Bluetooth adapters, sound accessories.\",\n },\n {\n id: \"instruments-music-gear\",\n name: \"Instruments & Music Gear\",\n description:\n \"Small electronic instruments, DIY synth kits, drum pads, loop machines.\",\n },\n {\n id: \"recording-creative-devices\",\n name: \"Recording & Creative Devices\",\n description:\n \"USB microphones, podcast tools, voice recorders, mobile lighting, content tools.\",\n },\n {\n id: \"other-audio-music-items\",\n name: \"Other audio or music-related items\",\n description: \"Musical gadgets or creative gear not listed above.\",\n },\n ],\n },\n {\n id: \"diy-gadgets-secondhand-finds\",\n name: \"DIY, Gadgets & Second-Hand Finds\",\n items: [\n {\n id: \"diy-electronics-tools\",\n name: \"DIY Electronics & Tools\",\n description:\n \"LED lights, USB gadgets, circuit boards, repair kits, tech-themed toys, novelty items.\",\n },\n {\n id: \"other-tech-finds\",\n name: \"Other Tech Finds\",\n description:\n \"Used electronics, smart gadgets, wearable tech, calculators, tablet stands, e-waste upcycles.\",\n },\n {\n id: \"other-technology-innovation-items\",\n name: \"Other technology or innovation-related items\",\n description: \"Anything not covered but clearly tech-driven.\",\n },\n ],\n },\n ],\n },\n];\n","/* eslint-disable sort-keys */\nimport { Category } from \"src/types\";\n\nexport const foodAndBeverages: Category[] = [\n {\n id: \"food-beverages\",\n name: \"Food & Beverages\",\n description:\n \"Fresh produce, drinks, sweet and savoury street food, ready-to-eat meals, and packaged goods.\",\n subcategories: [\n {\n id: \"fresh-food-groceries\",\n name: \"Fresh Food & Groceries\",\n items: [\n {\n id: \"fruits-vegetables\",\n name: \"Fruits & Vegetables\",\n description:\n \"Fresh seasonal fruit, organic vegetables, specialty produce, berries, tropical fruit, heritage varieties.\",\n },\n {\n id: \"meat-seafood\",\n name: \"Meat & Seafood\",\n description:\n \"Butcher cuts, fresh fish, smoked meats, sausages, seafood platters, artisanal jerky.\",\n },\n {\n id: \"dairy-eggs\",\n name: \"Dairy & Eggs\",\n description:\n \"Farm eggs, handmade cheeses, yoghurt, fresh milk, goat’s milk products.\",\n },\n {\n id: \"bakery-pastries\",\n name: \"Bakery & Pastries\",\n description:\n \"Freshly baked bread, sourdough, bagels, croissants, focaccia, traditional baked goods.\",\n },\n {\n id: \"spices-condiments\",\n name: \"Spices & Condiments\",\n description:\n \"Dried herbs, spice blends, specialty salts, hot sauces, infused oils, chutneys.\",\n },\n {\n id: \"packaged-specialty-foods\",\n name: \"Packaged & Specialty Foods\",\n description:\n \"Honey, jams, preserves, pickles, nut butters, sauces, pre-packaged snacks.\",\n },\n {\n id: \"other-fresh-food-items\",\n name: \"Other fresh food items\",\n description:\n \"Items that don’t fit above, e.g. fermented foods, plant-based substitutes.\",\n },\n ],\n },\n {\n id: \"beverages-specialty-drinks\",\n name: \"Beverages & Specialty Drinks\",\n items: [\n {\n id: \"fresh-juices-smoothies\",\n name: \"Fresh Juices & Smoothies\",\n description:\n \"Cold-pressed juices, detox blends, fruit smoothies, tropical mixes.\",\n },\n {\n id: \"coffee-teas\",\n name: \"Coffee & Teas\",\n description:\n \"Espresso, pour-over coffee, herbal teas, matcha, bubble tea, locally blended tea.\",\n },\n {\n id: \"dairy-plant-based-drinks\",\n name: \"Dairy & Plant-Based Drinks\",\n description:\n \"Milkshakes, lassis, almond/oat milk drinks, coconut water.\",\n },\n {\n id: \"alcoholic-beverages\",\n name: \"Alcoholic Beverages\",\n description:\n \"Local wines, craft beer, mead, cider, infused spirits, cocktail kits.\",\n },\n {\n id: \"other-beverages\",\n name: \"Other beverages\",\n description:\n \"Kombucha, kefir, energy drinks, non-alcoholic wines or beers.\",\n },\n ],\n },\n {\n id: \"savoury-prepared-foods-street-food\",\n name: \"Savoury Prepared Foods & Street Food\",\n items: [\n {\n id: \"local-specialties\",\n name: \"Local Specialties\",\n description:\n \"Meat pies, hangi, seafood chowder, fry bread, traditional NZ dishes.\",\n },\n {\n id: \"asian-cuisine\",\n name: \"Asian Cuisine\",\n description:\n \"Sushi, bao buns, dumplings, ramen, satay, spring rolls, fried rice.\",\n },\n {\n id: \"mediterranean-cuisine\",\n name: \"Mediterranean Cuisine\",\n description: \"Falafel, hummus wraps, souvlaki, Greek salad, dolma.\",\n },\n {\n id: \"italian-delights\",\n name: \"Italian Delights\",\n description: \"Pizza, calzone, focaccia, fresh pasta, arancini.\",\n },\n {\n id: \"bbq-grilled-foods\",\n name: \"BBQ & Grilled Foods\",\n description: \"Kebabs, grilled chicken, ribs, burgers, sausages.\",\n },\n {\n id: \"savoury-crepes-pancakes\",\n name: \"Savoury Crepes & Pancakes\",\n description: \"Filled savoury crepes, mini savoury pancakes.\",\n },\n {\n id: \"savoury-baked-goods-pastries\",\n name: \"Savoury Baked Goods & Pastries\",\n description:\n \"Quiches, savoury muffins, filled savoury pastries, empanadas.\",\n },\n {\n id: \"vegan-vegetarian-dishes\",\n name: \"Vegan & Vegetarian Dishes\",\n description:\n \"Buddha bowls, plant-based burgers, salads, vegan sushi.\",\n },\n {\n id: \"other-savoury-foods\",\n name: \"Other Savoury Foods\",\n description: \"Fusion dishes, mixed platters, savoury meal kits.\",\n },\n ],\n },\n {\n id: \"sweet-prepared-foods\",\n name: \"Sweet Prepared Foods\",\n items: [\n {\n id: \"sweet-crepes-pancakes-fried-treats\",\n name: \"Sweet Crepes, Pancakes & Fried Treats\",\n description: \"Crepes, waffles, mini pancakes, muffins, doughnuts.\",\n },\n {\n id: \"sweet-baked-goods-desserts\",\n name: \"Sweet Baked Goods & Desserts\",\n description: \"Cakes, pastries, slices, trifles, layered desserts.\",\n },\n {\n id: \"fruit-based-snacks\",\n name: \"Fruit-Based Snacks\",\n description:\n \"Fruit skewers, dried fruit packs, chocolate-dipped fruit.\",\n },\n {\n id: \"candy-confectionery\",\n name: \"Candy & Confectionery\",\n description: \"Fudge, handmade candies, toffee, nougat, brittle.\",\n },\n {\n id: \"other-sweet-foods\",\n name: \"Other Sweet Foods\",\n description: \"Fusion desserts, sweet platters, sweet meal kits.\",\n },\n ],\n },\n ],\n },\n];\n","/* eslint-disable sort-keys */\nimport { Category } from \"src/types\";\n\nexport const handmadeAndLocalProducts: Category[] = [\n {\n id: \"handmade-local-products\",\n name: \"Handmade & Local Products\",\n description: \"Unique, handmade, or locally produced artisan goods.\",\n subcategories: [\n {\n id: \"home-living\",\n name: \"Home & Living\",\n items: [\n {\n id: \"ceramics-pottery\",\n name: \"Ceramics & Pottery\",\n description:\n \"Handmade mugs, vases, bowls, decorative plates, plant pots.\",\n },\n {\n id: \"candles-home-scents\",\n name: \"Candles & Home Scents\",\n description:\n \"Soy candles, beeswax candles, wax melts, incense sticks, room sprays and herbal sachets.\",\n },\n {\n id: \"botanical-crafts\",\n name: \"Botanical Crafts\",\n description: \"Dried-flower décor and pressed-flower crafts\",\n },\n {\n id: \"textiles-embroidery\",\n name: \"Textiles & Embroidery\",\n description:\n \"Handsewn items, embroidered napkins, home linens, aprons, fabric gift wraps, handmade fabric bags, quilted goods, personalized textile gifts.\",\n },\n {\n id: \"woodcraft-metalcraft\",\n name: \"Woodcraft & Metalcraft\",\n description:\n \"Wooden boards, handmade frames, sculptures, metal signs, furniture.\",\n },\n {\n id: \"handmade-soaps-natural-body-goods\",\n name: \"Handmade Soaps & Natural Body Goods\",\n description: \"Handmade soaps, balms, oils, bath items\",\n },\n {\n id: \"seasonal-festive-crafts\",\n name: \"Seasonal & Festive Crafts\",\n description: \"Christmas, Easter and seasonal handmade decor\",\n },\n {\n id: \"other-home-living-products\",\n name: \"Other home & living products\",\n description:\n \"Items that don't fit above but serve home-related purposes.\",\n },\n ],\n },\n {\n id: \"art-personal-expression\",\n name: \"Art & Personal Expression\",\n items: [\n {\n id: \"paintings-illustrations\",\n name: \"Paintings & Illustrations\",\n description:\n \"Paintings, canvas art, hand-drawn illustrations, digital prints, graphic art and calligraphy pieces.\",\n },\n {\n id: \"sculptures-carvings\",\n name: \"Sculptures & Carvings \",\n description:\n \"Sculptures made from wood, stone, metal, clay or resin, carved decorative pieces and artistic 3D works.\",\n },\n {\n id: \"creative-handmade-alternative-art\",\n name: \"Creative Handmade & Alternative Art\",\n description:\n \"Handmade textile décor, fabric ornaments, mixed-media art, creative craft pieces and modern handmade artworks.\",\n },\n {\n id: \"handmade-mini-figures-decor\",\n name: \"Handmade Mini Figures & Décor\",\n description:\n \"Small handmade figures, tiny houses and crafted mini decorative items.\",\n },\n {\n id: \"other-artistic-expressive-products\",\n name: \"Other Artistic or Expressive Products\",\n description:\n \"Custom artworks, specialty handmade décor, unique crafts.\",\n },\n ],\n },\n {\n id: \"handmade-jewellery-accessories-cultural-crafts\",\n name: \"Handmade Jewellery, Accessories & Cultural Crafts\",\n items: [\n {\n id: \"jewellery-handmade-items-nz-traditional-materials\",\n name: \"Jewellery & Handmade Items from NZ Traditional Materials\",\n description:\n \"Handmade jewellery and decorative or functional items crafted from pounamu, bone, wood and other traditional New Zealand materials.\",\n },\n {\n id: \"maori-pasifika-cultural-crafts-clothing\",\n name: \"Māori & Pasifika Cultural Crafts and Clothing\",\n description:\n \"Culturally inspired handmade items, accessories and garments featuring Māori or Pasifika motifs, traditional patterns and regional craftsmanship.\",\n },\n {\n id: \"traditional-handmade-clothing-jewellery-crafts-global-cultures\",\n name: \"Traditional Handmade Clothing, Jewellery & Crafts from Global Cultures\",\n description:\n \"Handcrafted clothing, jewellery and cultural items from diverse traditions — including Asian, African, European, Middle Eastern, Indian, Chinese, Japanese, Pacific, and other culturally significant handmade pieces.\",\n },\n {\n id: \"other-handmade-cultural-items\",\n name: \"Other Handmade Cultural Items\",\n description:\n \"Unique or culturally inspired handmade pieces not specifically covered in the categories above.\",\n },\n ],\n },\n {\n id: \"gift-ideas-accessories\",\n name: \"Gift Ideas & Accessories\",\n items: [\n {\n id: \"handmade-pens-keychains-fridge-magnets\",\n name: \"Handmade Pens, Keychains and Fridge Magnets\",\n description: null,\n },\n {\n id: \"gift-packaging-wrapping-accessories\",\n name: \"Gift Packaging & Wrapping Accessories\",\n description: null,\n },\n {\n id: \"handmade-crochet-knitting-fibre-crafts\",\n name: \"Handmade Crochet, Knitting & Fibre Crafts\",\n description:\n \"Handmade crochet and knitted items, fabric-based crafts, small decorative pieces, creative fibre artworks and unique handcrafted accessories.\",\n },\n {\n id: \"handmade-toys-mini-play-items\",\n name: \"Handmade Toys & Mini Play Items\",\n description:\n \"small handmade toys, soft toys, wooden miniatures, crochet or felt play pieces\",\n },\n {\n id: \"other-small-handmade-gifts-accessories\",\n name: \"Other small handmade gifts or accessories\",\n description: \"Compact creative items made to surprise or delight.\",\n },\n ],\n },\n ],\n },\n];\n","/* eslint-disable sort-keys */\nimport { Category } from \"src/types\";\n\nexport const healthAndWellness: Category[] = [\n {\n id: \"health-wellness\",\n name: \"Health & Wellness\",\n description:\n \"Natural products and services that promote wellbeing, body care, and holistic health.\",\n subcategories: [\n {\n id: \"body-skincare\",\n name: \"Body & Skincare\",\n items: [\n {\n id: \"skincare-body-products\",\n name: \"Skincare & Body Products\",\n description:\n \"Soaps, creams, lip balms, bath salts, bath bombs, body oils, natural deodorants.\",\n },\n {\n id: \"other-body-care-items\",\n name: \"Other body care items\",\n description:\n \"Additional handmade or eco-conscious personal care goods.\",\n },\n ],\n },\n {\n id: \"aromatherapy-herbal-wellness\",\n name: \"Aromatherapy & Herbal Wellness\",\n items: [\n {\n id: \"aromatherapy-herbal-remedies\",\n name: \"Aromatherapy & Herbal Remedies\",\n description:\n \"Essential oils, herbal balms, massage oils, salves, natural teas, rollers.\",\n },\n {\n id: \"other-herbal-aroma-products\",\n name: \"Other herbal or aroma-based products\",\n description: \"Wellness blends, herb sachets, custom infusions.\",\n },\n ],\n },\n {\n id: \"wellness-tools-accessories\",\n name: \"Wellness Tools & Accessories\",\n items: [\n {\n id: \"wellness-accessories\",\n name: \"Wellness Accessories\",\n description:\n \"Yoga mats, meditation cushions, eye pillows, incense, smudging sticks, eco water bottles, wellness journals.\",\n },\n {\n id: \"spiritual-tools-crystals\",\n name: \"Spiritual Tools & Crystals\",\n description:\n \"Healing crystals, gemstone bracelets, pendulums, sprays, spiritual kits, altar decor.\",\n },\n {\n id: \"other-wellness-spiritual-items\",\n name: \"Other wellness or spiritual items\",\n description: \"Items that aid relaxation, focus, or inner work.\",\n },\n ],\n },\n ],\n },\n];\n","/* eslint-disable sort-keys */\nimport { Category } from \"src/types\";\n\nexport const homeGardenHousehold: Category[] = [\n {\n id: \"home-garden-household-goods\",\n name: \"Home, Garden & Household Goods\",\n description:\n \"Functional, decorative, and eco-conscious products designed for everyday use indoors and outdoors.\",\n subcategories: [\n {\n id: \"home-decor-living\",\n name: \"Home Decor & Living\",\n items: [\n {\n id: \"home-decor\",\n name: \"Home Decor\",\n description:\n \"Cushions, wall art, table runners, vases, trays, mirrors, handmade centerpieces.\",\n },\n {\n id: \"kitchenware-dining\",\n name: \"Kitchenware & Dining\",\n description:\n \"Mugs, bowls, cutting boards, utensils, jars, coasters, kitchen textiles.\",\n },\n {\n id: \"mini-figures-decor\",\n name: \"Mini Figures & Décor\",\n description:\n \"handmade or non-handmade small figures, tiny houses and miniature decorative items.\",\n },\n {\n id: \"other-indoor-home-items\",\n name: \"Other indoor home items\",\n description:\n \"Any decorative or practical household items not listed above.\",\n },\n ],\n },\n {\n id: \"cleaning-eco-essentials\",\n name: \"Cleaning & Eco Essentials\",\n items: [\n {\n id: \"cleaning-eco-supplies\",\n name: \"Cleaning & Eco Supplies\",\n description:\n \"Beeswax wraps, reusable cloths, brushes, natural soaps, detergent bars, eco sponges.\",\n },\n {\n id: \"other-eco-cleaning-items\",\n name: \"Other eco or cleaning items\",\n description: \"Environmentally friendly goods not listed above.\",\n },\n ],\n },\n {\n id: \"garden-outdoor-living\",\n name: \"Garden & Outdoor Living\",\n items: [\n {\n id: \"plants-botanical-decor\",\n name: \"Plants & Botanical Decor\",\n description:\n \"Potted herbs, succulents, dried flowers, terrariums, plant-based ornaments.\",\n },\n {\n id: \"fresh-flowers-botanical-bouquets\",\n name: \"Fresh Flowers & Botanical Bouquets\",\n description:\n \"Cut flowers, seasonal bouquets, simple floral arrangements, native flower selections, and other fresh botanical items.\",\n },\n {\n id: \"natural-decor-nature-inspired-elements\",\n name: \"Natural Decor & Nature-Inspired Elements\",\n description:\n \"Seashell décor, driftwood pieces, sand ornaments, natural wood accents, stone or mineral decorations, and other nature-based decorative items.\",\n },\n {\n id: \"garden-tools-outdoor-items\",\n name: \"Garden Tools & Outdoor Items\",\n description:\n \"Plant markers, garden signs, stakes, small tools, wind chimes, gifts.\",\n },\n {\n id: \"other-outdoor-garden-products\",\n name: \"Other outdoor or garden products\",\n description: \"Functional or decorative items for outside use.\",\n },\n ],\n },\n ],\n },\n];\n","/* eslint-disable sort-keys */\nimport { Category } from \"src/types\";\n\nexport const petProductsAndAnimalGoods: Category[] = [\n {\n id: \"pet-products-animal-goods\",\n name: \"Pet Products & Animal Goods\",\n description: \"Items for pets, pet lovers, or animal-themed market stalls.\",\n subcategories: [\n {\n id: \"products-for-pets\",\n name: \"Products for Pets\",\n items: [\n {\n id: \"pet-food-treats\",\n name: \"Pet Food & Treats\",\n description:\n \"Homemade dog biscuits, cat snacks, natural chews, pet-safe cakes, training treats.\",\n },\n {\n id: \"apparel-toys-accessories\",\n name: \"Apparel, Toys & Accessories\",\n description:\n \"Leashes, collars, harnesses, toys, grooming tools, beds, travel gear, jumpers, bandanas.\",\n },\n {\n id: \"other-pet-products\",\n name: \"Other pet products\",\n description: \"Any pet-related items not listed above.\",\n },\n ],\n },\n {\n id: \"small-pets-birds-exotic-animals\",\n name: \"Small Pets, Birds & Exotic Animals\",\n items: [\n {\n id: \"products-small-pets-birds-exotics\",\n name: \"Products for Small Pets, Birds & Exotics\",\n description:\n \"Toys, enclosures, perches, feeding bowls, bedding, habitat decor, transport gear, and care items for birds, rabbits, hamsters, reptiles, turtles, aquarium pets, and other exotic species.\",\n },\n {\n id: \"other-small-exotic-animal-items\",\n name: \"Other small or exotic animal items\",\n description: \"Unusual accessories for non-mainstream pets.\",\n },\n ],\n },\n {\n id: \"farm-working-animals\",\n name: \"Farm & Working Animals\",\n items: [\n {\n id: \"goods-for-farm-working-animals\",\n name: \"Goods for Farm & Working Animals\",\n description:\n \"Treats, care products, equipment, signage and accessories for chickens, goats, alpacas, horses, and other livestock.\",\n },\n {\n id: \"other-farm-animal-items\",\n name: \"Other farm animal-related items\",\n description:\n \"Rural, barnyard, or utility-specific gear not listed above.\",\n },\n ],\n },\n {\n id: \"animal-themed-gifts-custom-items\",\n name: \"Animal-Themed Gifts & Custom Items\",\n items: [\n {\n id: \"pet-art-custom-gifts\",\n name: \"Pet Art & Custom Gifts\",\n description:\n \"Pet portraits, name tags, personalized bowls, breed-specific items, pet-themed home decor and stationery.\",\n },\n {\n id: \"other-animal-themed-gifts\",\n name: \"Other animal-themed gifts\",\n description:\n \"Artistic or sentimental items made for animal lovers.\",\n },\n ],\n },\n ],\n },\n];\n","import { Category } from \"src/types\";\n\n/* eslint-disable sort-keys */\nexport const serviceAndExperience: Category[] = [\n {\n id: \"services-experiences\",\n name: \"Services & Experiences\",\n description:\n \"On-site offerings that provide entertainment, personal care, learning, or interactive activities beyond products.\",\n subcategories: [\n {\n id: \"personal-care-body-art\",\n name: \"Personal Care & Body Art\",\n items: [\n {\n id: \"nails-handcare\",\n name: \"Nails & Handcare\",\n description:\n \"Nail painting, decoration, quick manicures, temporary nail extensions.\",\n },\n {\n id: \"hair-styling-braiding\",\n name: \"Hair Styling & Braiding\",\n description:\n \"Hair braiding, plaits, child-friendly festival hairstyles.\",\n },\n {\n id: \"face-body-decoration\",\n name: \"Face & Body Decoration\",\n description:\n \"Henna, glitter tattoos, face painting, light makeup, eyelash styling, professional tattooing (where permitted).\",\n },\n {\n id: \"other-beauty-grooming-services\",\n name: \"Other beauty or grooming services\",\n description: \"Small-scale personal care options offered on-site.\",\n },\n ],\n },\n {\n id: \"practical-wellness-services\",\n name: \"Practical & Wellness Services\",\n items: [\n {\n id: \"mobile-practical-services\",\n name: \"Mobile & Practical Services\",\n description:\n \"Shoe repair, phone repairs, knife sharpening, key cutting, battery replacement, bike repairs, engraving.\",\n },\n {\n id: \"wellness-alternative-therapies\",\n name: \"Wellness & Alternative Therapies\",\n description:\n \"Massage, aromatherapy, reflexology, energy healing (e.g. Reiki), natural consultations.\",\n },\n {\n id: \"other-service-based-offerings\",\n name: \"Other service-based offerings\",\n description: \"Wellness or functional services not listed above.\",\n },\n ],\n },\n {\n id: \"creative-educational-experiences\",\n name: \"Creative & Educational Experiences\",\n items: [\n {\n id: \"creative-workshops-maker-services\",\n name: \"Creative Workshops & Maker Services\",\n description:\n \"Candle making, pottery, jewelry crafting, soap or balm workshops, calligraphy, seasonal crafts.\",\n },\n {\n id: \"education-awareness-stalls\",\n name: \"Education & Awareness Stalls\",\n description:\n \"Eco awareness, cultural storytelling, local history, first aid demos, health booths, sustainability education, kids’ science displays.\",\n },\n {\n id: \"other-creative-educational-services\",\n name: \"Other creative or educational services\",\n description:\n \"Informal learning, demonstrations, or community-focused sessions.\",\n },\n ],\n },\n {\n id: \"kids-activities-family-fun\",\n name: \"Kids’ Activities & Family Fun\",\n items: [\n {\n id: \"kids-activities-fun\",\n name: \"Kids’ Activities & Fun\",\n description:\n \"Face painting, glitter tattoos, pony rides, bouncy castles, small amusement rides, balloon twisting, animal petting zones.\",\n },\n {\n id: \"other-family-oriented-activities\",\n name: \"Other family-oriented activities\",\n description:\n \"On-site entertainment that engages children or family groups.\",\n },\n ],\n },\n ],\n },\n];\n","import { Category } from \"src/types\";\n\n/* eslint-disable sort-keys */\nexport const toysChildren: Category[] = [\n {\n id: \"toys-childrens-items\",\n name: \"Toys & Children’s Items\",\n description: \"Products and services made for or inspired by children.\",\n subcategories: [\n {\n id: \"toys-playthings\",\n name: \"Toys & Playthings\",\n items: [\n {\n id: \"toys-classic-electric-character\",\n name: \"Toys – Classic, Electric & Character-Based\",\n description:\n \"Building blocks, dolls, puzzles, plush animals, toy vehicles, remote-control toys, light-up gadgets, character figurines, themed playsets.\",\n },\n {\n id: \"handmade-toys-crafty-playthings\",\n name: \"Handmade Toys & Crafty Playthings\",\n description:\n \"Wooden puzzles, crocheted animals, felt toys, fabric dolls, DIY kits, nature-inspired games, sensory toys.\",\n },\n {\n id: \"other-play-items\",\n name: \"Other play items\",\n description:\n \"Toys not listed above, including limited-edition or hybrid items.\",\n },\n ],\n },\n {\n id: \"educational-developmental\",\n name: \"Educational & Developmental\",\n items: [\n {\n id: \"educational-developmental-tools\",\n name: \"Educational & Developmental Tools\",\n description:\n \"STEM kits, Montessori toys, storybooks, picture books, flashcards, early learning games, language tools.\",\n },\n {\n id: \"other-educational-experience-based-items\",\n name: \"Other educational or experience-based items\",\n description:\n \"Creative experiences or learning aids not listed above.\",\n },\n ],\n },\n {\n id: \"baby-kidswear-accessories\",\n name: \"Baby & Kidswear + Accessories\",\n items: [\n {\n id: \"baby-kidswear-accessories\",\n name: \"Baby & Kidswear + Accessories\",\n description:\n \"Handmade baby clothes, toddler outfits, bibs, hats, headbands, bags, pacifier clips, soft shoes.\",\n },\n {\n id: \"baby-developmental-soft-toys\",\n name: \"Baby Developmental Soft Toys\",\n description:\n \"Sensory toys, rattles, fabric books, teething items, high-contrast cards, and early-skill. Montessori materials designed to support infants’ cognitive and motor development.\",\n },\n {\n id: \"other-childrens-clothing-accessories\",\n name: \"Other children’s clothing or accessories\",\n description: \"Unique fashion or functional pieces for kids.\",\n },\n ],\n },\n ],\n },\n];\n","/* eslint-disable sort-keys */\nimport { Category } from \"src/types\";\n\nexport const vintageAndAntique: Category[] = [\n {\n id: \"vintage-antique\",\n name: \"Vintage & Antique\",\n description:\n \"Unique, historic, or nostalgic items with collectible or decorative value.\",\n subcategories: [\n {\n id: \"vintage-antique-clothing-accessories\",\n name: \"Vintage & Antique Clothing & Accessories\",\n items: [\n {\n id: \"clothing-vintage-fashion\",\n name: \"Clothing and wearable items from past eras\",\n description:\n \"Vintage dresses, jackets, hats, gloves, belts, bags, shoes, jewellery.\",\n },\n {\n id: \"other-clothing-accessory-items\",\n name: \"Other clothing-related items\",\n description:\n \"Hair clips, brooches, pins, scarf rings, small fashion accessories.\",\n },\n ],\n },\n {\n id: \"collectibles-memorabilia\",\n name: \"Collectibles & Memorabilia\",\n items: [\n {\n id: \"small-collectible-items\",\n name: \"Small collectible items with historical or nostalgic significance\",\n description:\n \"Coins, stamps, toys, postcards, comics, sports cards, vintage packaging.\",\n },\n {\n id: \"other-collectible-items\",\n name: \"Other collectible items\",\n description:\n \"Rare small objects, miniature figurines, special-edition items.\",\n },\n ],\n },\n {\n id: \"homewares-decor-curiosities\",\n name: \"Homewares, Decor & Curiosities\",\n items: [\n {\n id: \"decorative-functional-vintage-items\",\n name: \"Decorative or functional items with a vintage or antique aesthetic\",\n description:\n \"Teacups, plates, vases, mirrors, clocks, furniture, old tools, lanterns, typewriters, curiosities.\",\n },\n {\n id: \"handmade-vintage-art\",\n name: \"Handmade vintage art\",\n description: \"Paintings, sculptures, crafted pieces.\",\n },\n {\n id: \"other-home-decor-items\",\n name: \"Other home or decor items\",\n description:\n \"Decorative pieces not listed above, unique household objects.\",\n },\n ],\n },\n {\n id: \"vintage-media-printed-nostalgia\",\n name: \"Vintage Media & Printed Nostalgia\",\n items: [\n {\n id: \"older-media-printed-works\",\n name: \"Older media formats and printed works\",\n description:\n \"Vinyl records, cassette tapes, CDs, DVDs, books, magazines, board games, posters.\",\n },\n {\n id: \"other-media-printed-items\",\n name: \"Other media or printed items\",\n description: \"Maps, manuals, leaflets, out-of-print materials.\",\n },\n ],\n },\n {\n id: \"other-vintage-antique-items\",\n name: \"Other Vintage & Antique Items\",\n items: [\n {\n id: \"any-vintage-antique-items-not-listed\",\n name: \"Any vintage or antique items not listed above\",\n description: \"Unique, rare or uncategorised pieces.\",\n },\n ],\n },\n ],\n },\n];\n","import { Category, CategoryColorType } from \"../../types/global\";\n\nimport { clothingAndFashion } from \"./clothingAndFashion\";\nimport { electronicsAndTechnology } from \"./electronicsAndTechnology\";\nimport { foodAndBeverages } from \"./foodAndBeverages\";\nimport { handmadeAndLocalProducts } from \"./handmadeAndLocalProducts\";\nimport { healthAndWellness } from \"./healthAndWellness\";\nimport { homeGardenHousehold } from \"./homeGardenHousehold\";\nimport { petProductsAndAnimalGoods } from \"./petProductsAndAnimalGoods\";\nimport { serviceAndExperience } from \"./serviceAndExperience\";\nimport { toysChildren } from \"./toysChildren\";\nimport { vintageAndAntique } from \"./vintageAndAntique\";\n\nexport const categoryColors: Record<string, CategoryColorType> = {\n \"clothing-fashion\": {\n primary: \"#9D4EDD\",\n secondary: \"#fff\",\n },\n \"electronics-technology\": {\n primary: \"#3AF3FF\",\n secondary: \"#000\",\n },\n \"food-beverages\": {\n primary: \"#FF0D1F\",\n secondary: \"#fff\",\n },\n \"handmade-local-products\": {\n primary: \"#EE7E54\",\n secondary: \"#fff\",\n },\n \"health-wellness\": {\n primary: \"#E23794\",\n secondary: \"#fff\",\n },\n \"home-garden-household-goods\": {\n primary: \"#067325\",\n secondary: \"#fff\",\n },\n \"pet-products-animal-goods\": {\n primary: \"#68E788\",\n secondary: \"#000\",\n },\n \"services-experiences\": {\n primary: \"#2E16A5\",\n secondary: \"#fff\",\n },\n \"toys-childrens-items\": {\n primary: \"#FFF966\",\n secondary: \"#000\",\n },\n \"vintage-antique\": {\n primary: \"#8D6748\",\n secondary: \"#fff\",\n },\n};\n\nconst assignColorToCategories = (categories: Category[]): Category[] => {\n const result = categories.map((category) => ({\n ...category,\n color: categoryColors[category.id],\n }));\n return result;\n};\n\nexport const availableCategories = assignColorToCategories([\n ...foodAndBeverages,\n ...handmadeAndLocalProducts,\n ...clothingAndFashion,\n ...homeGardenHousehold,\n ...toysChildren,\n ...healthAndWellness,\n ...electronicsAndTechnology,\n ...vintageAndAntique,\n ...petProductsAndAnimalGoods,\n ...serviceAndExperience,\n]);\n","import { availableCategories } from \"../formFields/categories\";\nimport type { UnregisteredVendorType, VendorType } from \"../types/vendor\";\nimport { getUniqueStartDates } from \"../utils/date\";\n\ntype RelationType = NonNullable<VendorType[\"relations\"]>[number];\ntype RelationDateType = NonNullable<RelationType[\"relationDates\"]>[number];\n\nexport type StallholderFilterOption = {\n label: string;\n value: string;\n};\n\nexport function eventStartDatesSet(\n dateTime: Array<{ startDate?: string | null }> | undefined,\n): Set<string> {\n return new Set(\n (dateTime ?? [])\n .map((date) => date.startDate)\n .filter((date): date is string => Boolean(date)),\n );\n}\n\nexport function hasMatchingEventDate(\n vendorStartDates: string[],\n eventStartDates: Set<string>,\n): boolean {\n return vendorStartDates.some((startDate) => eventStartDates.has(startDate));\n}\n\nexport function matchesSelectedDate(\n vendorStartDates: string[],\n selectedDate: string | null,\n): boolean {\n if (!selectedDate) {\n return true;\n }\n\n return vendorStartDates.includes(selectedDate);\n}\n\nexport function matchesCategory(\n categoryNames: string[],\n selectedCategory: string | null,\n): boolean {\n if (!selectedCategory) {\n return true;\n }\n\n return categoryNames.includes(selectedCategory);\n}\n\nexport function getRegisteredVendorStartDates(vendor: VendorType): string[] {\n const relations = vendor.relations ?? [];\n\n return relations.flatMap((relation) =>\n (relation.relationDates ?? [])\n .map((relationDate: RelationDateType) => relationDate.dateTime.startDate)\n .filter((date): date is string => Boolean(date)),\n );\n}\n\nexport function getRegisteredVendorCategoryNames(vendor: VendorType): string[] {\n return (vendor.categories ?? []).map((category) => category.name);\n}\n\nexport function getUnregisteredVendorStartDates(\n vendor: UnregisteredVendorType,\n): string[] {\n return (vendor.invitations ?? []).flatMap((invitation) =>\n invitation.dateTime\n .map((date) => date.startDate)\n .filter((date): date is string => Boolean(date)),\n );\n}\n\nexport function getUnregisteredVendorCategoryNames(\n vendor: UnregisteredVendorType,\n): string[] {\n return availableCategories\n .filter(\n (category) => category.id && vendor.categoryIds.includes(category.id),\n )\n .map((category) => category.name);\n}\n\nexport function filterRegisteredVendorsForEvent(\n vendors: VendorType[] | null | undefined,\n eventStartDates: Set<string>,\n selectedDate: string | null,\n selectedCategory: string | null,\n): VendorType[] {\n if (!vendors) {\n return [];\n }\n\n return vendors.filter((vendor) => {\n const startDates = getRegisteredVendorStartDates(vendor);\n\n return (\n hasMatchingEventDate(startDates, eventStartDates) &&\n matchesSelectedDate(startDates, selectedDate) &&\n matchesCategory(\n getRegisteredVendorCategoryNames(vendor),\n selectedCategory,\n )\n );\n });\n}\n\nexport function filterUnregisteredVendorsForEvent(\n vendors: UnregisteredVendorType[],\n eventStartDates: Set<string>,\n selectedDate: string | null,\n selectedCategory: string | null,\n): UnregisteredVendorType[] {\n return vendors.filter((vendor) => {\n const startDates = getUnregisteredVendorStartDates(vendor);\n\n return (\n hasMatchingEventDate(startDates, eventStartDates) &&\n matchesSelectedDate(startDates, selectedDate) &&\n matchesCategory(\n getUnregisteredVendorCategoryNames(vendor),\n selectedCategory,\n )\n );\n });\n}\n\nexport function filterRegisteredVendorsByEventDatesOnly(\n vendors: VendorType[] | null | undefined,\n eventStartDates: Set<string>,\n): VendorType[] {\n if (!vendors) {\n return [];\n }\n\n return vendors.filter((vendor) =>\n hasMatchingEventDate(\n getRegisteredVendorStartDates(vendor),\n eventStartDates,\n ),\n );\n}\n\nexport function filterUnregisteredVendorsByEventDatesOnly(\n vendors: UnregisteredVendorType[],\n eventStartDates: Set<string>,\n): UnregisteredVendorType[] {\n return vendors.filter((vendor) =>\n hasMatchingEventDate(\n getUnregisteredVendorStartDates(vendor),\n eventStartDates,\n ),\n );\n}\n\nexport function collectStallholderDateTimes(\n registeredVendors: VendorType[],\n unregisteredVendors: UnregisteredVendorType[] = [],\n): Array<{ startDate?: string; startTime?: string }> {\n return [\n ...registeredVendors.flatMap((vendor) =>\n (vendor.relations ?? []).flatMap((relation) =>\n (relation.relationDates ?? []).map(\n (relationDate: RelationDateType) => relationDate.dateTime,\n ),\n ),\n ),\n ...unregisteredVendors.flatMap((vendor) =>\n (vendor.invitations ?? []).flatMap((invitation) => invitation.dateTime),\n ),\n ];\n}\n\nexport function getUniqueStallholderStartDates(\n registeredVendors: VendorType[],\n unregisteredVendors: UnregisteredVendorType[] = [],\n): string[] {\n return getUniqueStartDates(\n collectStallholderDateTimes(registeredVendors, unregisteredVendors),\n );\n}\n\nexport function getStallholderCategoryNames(\n registeredVendors: VendorType[],\n unregisteredVendors: UnregisteredVendorType[] = [],\n): string[] {\n const names = [\n ...registeredVendors.flatMap(getRegisteredVendorCategoryNames),\n ...unregisteredVendors.flatMap(getUnregisteredVendorCategoryNames),\n ];\n\n return Array.from(new Set(names));\n}\n\nexport function getStallholderCategoryOptions(\n registeredVendors: VendorType[],\n unregisteredVendors: UnregisteredVendorType[] = [],\n): StallholderFilterOption[] {\n return getStallholderCategoryNames(\n registeredVendors,\n unregisteredVendors,\n ).map((name) => ({\n label: name,\n value: name,\n }));\n}\n\nexport function getEventStallholderEmptyMessage(\n hasAnyStallholdersForEvent: boolean,\n selectedDate: string | null,\n): string {\n return hasAnyStallholdersForEvent && selectedDate\n ? \"No stallholders found for this event date.\"\n : \"No stallholders found for this event.\";\n}\n","import type { StallholderFilterOption } from \"../eventStallholders/eventStallholderFilters\";\nimport type { EventListItemType } from \"../types/event\";\nimport type { DateTimeType } from \"../types/global\";\nimport { getUniqueStartDates } from \"../utils/date\";\n\ntype RelationType = NonNullable<EventListItemType[\"relations\"]>[number];\ntype RelationDateType = NonNullable<RelationType[\"relationDates\"]>[number];\n\nexport function relationHasSelectedDate(\n relation: RelationType,\n selectedDate: string,\n): boolean {\n return (\n relation.relationDates?.some(\n (date: RelationDateType) => date.dateTime.startDate === selectedDate,\n ) ?? false\n );\n}\n\nexport function eventHasSelectedDate(\n event: EventListItemType,\n selectedDate: string,\n): boolean {\n return (\n event.relations?.some((relation) =>\n relationHasSelectedDate(relation, selectedDate),\n ) ?? false\n );\n}\n\nexport function filterVendorEventsBySelectedDate(\n events: EventListItemType[] | null | undefined,\n selectedDate: string | null,\n): EventListItemType[] {\n if (!events) {\n return [];\n }\n\n if (!selectedDate) {\n return events;\n }\n\n return events.filter((event) => eventHasSelectedDate(event, selectedDate));\n}\n\nexport function collectVendorEventRelationDateTimes(\n events: EventListItemType[] | null | undefined,\n): DateTimeType[] {\n if (!events?.length) {\n return [];\n }\n\n return events.flatMap((event) =>\n (event.relations ?? []).flatMap((relation) =>\n (relation.relationDates ?? []).map(\n (relationDate) => relationDate.dateTime,\n ),\n ),\n );\n}\n\nexport function getVendorEventRelationStartDates(\n events: EventListItemType[] | null | undefined,\n): string[] {\n return getUniqueStartDates(collectVendorEventRelationDateTimes(events));\n}\n\nexport function getVendorEventRelationDateOptions(\n events: EventListItemType[] | null | undefined,\n): StallholderFilterOption[] {\n return getVendorEventRelationStartDates(events).map((startDate) => ({\n label: startDate,\n value: startDate,\n }));\n}\n\nexport function getVendorEventsEmptyMessage(): string {\n return \"No events found.\";\n}\n","import {\n AffiliateRewardType,\n EnumAffiliateParticipantType,\n EnumAffiliateRewardType,\n} from \"src/types/affiliate\";\n\nexport const AFFILIATE_PARTICIPANT_TYPE_LABELS = {\n [EnumAffiliateParticipantType.INDIVIDUAL]: \"Individual\",\n [EnumAffiliateParticipantType.SOLE_TRADER]: \"Sole Trader\",\n [EnumAffiliateParticipantType.COMPANY]: \"Company\",\n} as const satisfies Record<EnumAffiliateParticipantType, string>;\n\ntype AffiliateRewardConfig = {\n description: string;\n value: number;\n};\n\nexport const AFFILIATE_REWARDS = {\n [EnumAffiliateRewardType.NEW_EVENT_REGISTRATION]: {\n description: \"10 points for new event registration (one-time reward)\",\n value: 10,\n },\n [EnumAffiliateRewardType.NEW_VENDOR_REGISTRATION]: {\n description: \"5 points for new vendor registration (one-time reward)\",\n value: 5,\n },\n [EnumAffiliateRewardType.ACTIVE_VENDOR_PRO_SUBSCRIPTION]: {\n description: \"3 points for active vendor pro subscription (monthly reward)\",\n value: 3,\n },\n [EnumAffiliateRewardType.ACTIVE_VENDOR_STANDARD_SUBSCRIPTION]: {\n description:\n \"1 point for active vendor standard subscription (monthly reward)\",\n value: 1,\n },\n [EnumAffiliateRewardType.ACTIVE_VENDOR_BONUS_REWARD]: {\n description:\n \"5 bonus points for every 10th active vendor (one-time reward)\",\n value: 5,\n },\n [EnumAffiliateRewardType.ACTIVE_EVENT_WITH_VENDOR_REGISTRATIONS]: {\n description:\n \"40 points for active event with vendor registrations (one-time reward)\",\n value: 40,\n },\n} satisfies Record<EnumAffiliateRewardType, AffiliateRewardConfig>;\n\n/**\n * Create an affiliate reward\n * @param rewardType - The type of reward\n * @param createdAt - The date the reward was received\n * @returns The affiliate reward\n * @example\n * const reward = createAffiliateReward(EnumAffiliateRewardType.NEW_EVENT_REGISTRATION, new Date());\n * console.log(reward);\n */\nexport function createAffiliateReward(\n rewardType: EnumAffiliateRewardType,\n createdAt: Date,\n): AffiliateRewardType {\n const reward = AFFILIATE_REWARDS[rewardType];\n\n return {\n createdAt,\n redeemedAt: null,\n rewardDescription: reward.description,\n rewardType,\n rewardValue: reward.value,\n };\n}\n","/**\n * NZ IRD number validation (Inland Revenue modulus-11 check digit).\n *\n * Valid range: 10,000,000 – 200,000,000 (upper limit raised Feb 2026; length stays\n * 8–9 digits). See IRD file-upload / payday filing specifications.\n */\n\nconst PRIMARY_WEIGHTS = [3, 2, 7, 6, 5, 4, 3, 2] as const;\nconst SECONDARY_WEIGHTS = [7, 4, 3, 2, 5, 2, 7, 6] as const;\n\nconst IRD_MIN = 10_000_000;\n/** Raised from 150_000_000 as of IRD's Feb 2026 annual update. */\nconst IRD_MAX = 200_000_000;\n\nfunction calculateCheckDigit(\n baseDigits: string,\n weights: readonly number[],\n): number {\n const sum = [...baseDigits].reduce(\n (acc, digit, index) => acc + Number(digit) * weights[index],\n 0,\n );\n const remainder = sum % 11;\n return remainder === 0 ? 0 : 11 - remainder;\n}\n\n/** Digits only; strips spaces/hyphens and other non-digits. */\nexport function normalizeIrdNumber(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/**\n * Formats an IRD number as groups of three digits separated by hyphens\n * (e.g. `490-918-50` / `049-091-850`), capping at 9 digits.\n */\nexport function formatIrdNumber(input: string): string {\n const digitsOnly = normalizeIrdNumber(input).slice(0, 9);\n\n const parts = [];\n if (digitsOnly.length > 0) parts.push(digitsOnly.slice(0, 3));\n if (digitsOnly.length > 3) parts.push(digitsOnly.slice(3, 6));\n if (digitsOnly.length > 6) parts.push(digitsOnly.slice(6, 9));\n\n return parts.join(\"-\");\n}\n\n/**\n * Returns true when `value` is a valid NZ IRD number (8–9 digits, in issued\n * range, and modulus-11 check digit matches).\n */\nexport function isValidIrdNumber(value: string): boolean {\n const digits = normalizeIrdNumber(value);\n\n if (!/^\\d{8,9}$/.test(digits)) {\n return false;\n }\n\n const ird = Number(digits);\n if (ird < IRD_MIN || ird > IRD_MAX) {\n return false;\n }\n\n const padded = digits.padStart(9, \"0\");\n const baseDigits = padded.slice(0, -1);\n const checkDigit = Number(padded.slice(-1));\n\n let calculated = calculateCheckDigit(baseDigits, PRIMARY_WEIGHTS);\n if (calculated === 10) {\n calculated = calculateCheckDigit(baseDigits, SECONDARY_WEIGHTS);\n if (calculated === 10) {\n return false;\n }\n }\n\n return calculated === checkDigit;\n}\n","/* eslint-disable camelcase -- Catalogue keys match persisted database identifiers. */\nimport { EnumBillingPeriod, EnumUserLicence } from \"../../enums\";\nimport type {\n BillingCatalogDefinition,\n BillingCatalogEntryType,\n BillingCatalogInitialEntry,\n BillingCatalogKey,\n} from \"../../types/billingCatalog\";\n\nexport const BILLING_CATALOG_KEYS = [\n \"pro_vendor_monthly\",\n \"pro_vendor_yearly\",\n \"pro_plus_vendor_monthly\",\n \"pro_plus_vendor_yearly\",\n] as const satisfies readonly BillingCatalogKey[];\n\nexport const BILLING_CATALOG_CURRENCY = \"nzd\" as const;\n\n/**\n * The only four licence/billing combinations that can be sold through Stripe.\n * Standard vendor access and all event licences intentionally stay outside the\n * paid billing catalogue.\n */\nexport const BILLING_CATALOG_DEFINITIONS: Record<\n BillingCatalogKey,\n BillingCatalogDefinition\n> = {\n pro_plus_vendor_monthly: {\n billingPeriod: EnumBillingPeriod.MONTHLY_CANCEL_ANYTIME,\n licenceType: EnumUserLicence.PRO_PLUS_VENDOR,\n },\n pro_plus_vendor_yearly: {\n billingPeriod: EnumBillingPeriod.YEARLY_ANNUAL_BILLED,\n licenceType: EnumUserLicence.PRO_PLUS_VENDOR,\n },\n pro_vendor_monthly: {\n billingPeriod: EnumBillingPeriod.MONTHLY_CANCEL_ANYTIME,\n licenceType: EnumUserLicence.PRO_VENDOR,\n },\n pro_vendor_yearly: {\n billingPeriod: EnumBillingPeriod.YEARLY_ANNUAL_BILLED,\n licenceType: EnumUserLicence.PRO_VENDOR,\n },\n};\n\n/**\n * Resolves a client selection to the single canonical billing catalogue key.\n * Returning null is intentional: GraphQL resolvers can reject every free or\n * event licence without maintaining another parallel allow-list.\n */\nexport function getBillingCatalogKeyForSelection(\n licenceType: EnumUserLicence,\n billingPeriod: EnumBillingPeriod,\n): BillingCatalogKey | null {\n const match = Object.entries(BILLING_CATALOG_DEFINITIONS).find(\n ([, definition]) =>\n definition.licenceType === licenceType &&\n definition.billingPeriod === billingPeriod,\n );\n\n return (match?.[0] as BillingCatalogKey | undefined) ?? null;\n}\n\n/**\n * Initial test prices copied from the current public pricing page. They become\n * database records during catalogue initialisation and can later be changed by\n * a Super Admin; checkout must never read these constants directly.\n */\nexport const INITIAL_BILLING_CATALOG: readonly BillingCatalogInitialEntry[] = [\n {\n active: true,\n billingPeriod: EnumBillingPeriod.MONTHLY_CANCEL_ANYTIME,\n currency: BILLING_CATALOG_CURRENCY,\n key: \"pro_vendor_monthly\",\n licenceType: EnumUserLicence.PRO_VENDOR,\n taxInclusive: true,\n unitAmount: 3_999,\n },\n {\n active: true,\n billingPeriod: EnumBillingPeriod.YEARLY_ANNUAL_BILLED,\n currency: BILLING_CATALOG_CURRENCY,\n key: \"pro_vendor_yearly\",\n licenceType: EnumUserLicence.PRO_VENDOR,\n taxInclusive: true,\n unitAmount: 40_788,\n },\n {\n active: true,\n billingPeriod: EnumBillingPeriod.MONTHLY_CANCEL_ANYTIME,\n currency: BILLING_CATALOG_CURRENCY,\n key: \"pro_plus_vendor_monthly\",\n licenceType: EnumUserLicence.PRO_PLUS_VENDOR,\n taxInclusive: true,\n unitAmount: 6_499,\n },\n {\n active: true,\n billingPeriod: EnumBillingPeriod.YEARLY_ANNUAL_BILLED,\n currency: BILLING_CATALOG_CURRENCY,\n key: \"pro_plus_vendor_yearly\",\n licenceType: EnumUserLicence.PRO_PLUS_VENDOR,\n taxInclusive: true,\n unitAmount: 62_388,\n },\n] as const;\n\nexport function billingCatalogDefinitionMatches(\n entry: Pick<BillingCatalogEntryType, \"billingPeriod\" | \"key\" | \"licenceType\">,\n): boolean {\n const definition = BILLING_CATALOG_DEFINITIONS[entry.key];\n\n if (!definition) {\n return false;\n }\n\n return (\n definition.billingPeriod === entry.billingPeriod &&\n definition.licenceType === entry.licenceType\n );\n}\n","import {\n eventStartDatesSet,\n filterRegisteredVendorsByEventDatesOnly,\n filterRegisteredVendorsForEvent,\n filterUnregisteredVendorsByEventDatesOnly,\n filterUnregisteredVendorsForEvent,\n getEventStallholderEmptyMessage,\n getStallholderCategoryOptions,\n getUniqueStallholderStartDates,\n type StallholderFilterOption,\n} from \"../../eventStallholders\";\nimport type { DateTimeType } from \"../../types/global\";\nimport type { UnregisteredVendorType, VendorType } from \"../../types/vendor\";\nimport { formatDate } from \"../date\";\n\nexport type EventStallholderDateOption = {\n label: string;\n value: string;\n};\n\nexport type EventStallholdersData = {\n emptyMessage: string;\n futureEventStartDates: EventStallholderDateOption[];\n hasDatePills: boolean;\n hasStallholders: boolean;\n stallholderCategories: StallholderFilterOption[];\n unregisteredVendorList: UnregisteredVendorType[];\n vendorList: VendorType[];\n};\n\nexport type GetEventStallholdersDataInput = {\n eventDateTime: DateTimeType[];\n selectedCategory: string | null;\n selectedDate: string | null;\n unregisteredVendors?: UnregisteredVendorType[];\n vendors: VendorType[] | null;\n};\n\n/**\n * Derives every stallholder-list value an event detail screen needs from the\n * event dates, registered vendors, and unregistered vendors.\n *\n * Date pills come from the relations, not the event schedule: they are the\n * `startDate`s of the stallholders' relation dates / invitations (chronological\n * and de-duplicated). `eventDateTime` is only used to decide which vendors and\n * invitations actually belong to the event, mirroring the vendor screen where\n * pills are also relation-sourced.\n *\n * Shared by the mobile event page and the admin market event page so the two\n * keep identical filtering / date-pill / empty-message behaviour.\n */\nexport function getEventStallholdersData({\n eventDateTime,\n selectedCategory,\n selectedDate,\n unregisteredVendors = [],\n vendors,\n}: GetEventStallholdersDataInput): EventStallholdersData {\n const eventStartDates = eventStartDatesSet(eventDateTime);\n\n const registeredForEvent = filterRegisteredVendorsByEventDatesOnly(\n vendors,\n eventStartDates,\n );\n const unregisteredForEvent = filterUnregisteredVendorsByEventDatesOnly(\n unregisteredVendors,\n eventStartDates,\n );\n\n const vendorList = filterRegisteredVendorsForEvent(\n vendors,\n eventStartDates,\n selectedDate,\n selectedCategory,\n );\n const unregisteredVendorList = filterUnregisteredVendorsForEvent(\n unregisteredVendors,\n eventStartDates,\n selectedDate,\n selectedCategory,\n );\n\n const registeredForSelectedDate = filterRegisteredVendorsForEvent(\n vendors,\n eventStartDates,\n selectedDate,\n null,\n );\n const unregisteredForSelectedDate = filterUnregisteredVendorsForEvent(\n unregisteredVendors,\n eventStartDates,\n selectedDate,\n null,\n );\n\n const stallholderCategories = getStallholderCategoryOptions(\n registeredForSelectedDate,\n unregisteredForSelectedDate,\n );\n\n const futureEventStartDates = getUniqueStallholderStartDates(\n registeredForEvent,\n unregisteredForEvent,\n ).map((startDate) => ({\n label: formatDate(startDate, \"date\"),\n value: startDate,\n }));\n\n const hasDatePills = futureEventStartDates.length > 0;\n const hasStallholders =\n vendorList.length > 0 || unregisteredVendorList.length > 0;\n const hasAnyStallholdersForEvent =\n registeredForEvent.length > 0 || unregisteredForEvent.length > 0;\n\n return {\n emptyMessage: getEventStallholderEmptyMessage(\n hasAnyStallholdersForEvent,\n selectedDate,\n ),\n futureEventStartDates,\n hasDatePills,\n hasStallholders,\n stallholderCategories,\n unregisteredVendorList,\n vendorList,\n };\n}\n","import type { EventListItemType } from \"../../types/event\";\nimport {\n filterVendorEventsBySelectedDate,\n getVendorEventRelationDateOptions,\n getVendorEventsEmptyMessage,\n} from \"../../vendorEvents\";\nimport { formatDate } from \"../date\";\n\nexport type VendorEventDateOption = {\n label: string;\n value: string;\n};\n\nexport type VendorEventsData = {\n emptyMessage: string;\n eventDateOptions: VendorEventDateOption[];\n eventsByDate: EventListItemType[];\n hasDatePills: boolean;\n};\n\nexport type GetVendorEventsDataInput = {\n events: EventListItemType[] | null;\n selectedDate: string | null;\n};\n\n/**\n * Derives every event-list value a vendor detail screen needs from the raw\n * event connections and the selected date filter.\n *\n * Shared by the mobile vendor page and the admin stallholder page so the two\n * keep identical filtering / date-pill / empty-message behaviour.\n */\nexport function getVendorEventsData({\n events,\n selectedDate,\n}: GetVendorEventsDataInput): VendorEventsData {\n const eventDateOptions = getVendorEventRelationDateOptions(events).map(\n (option) => ({\n ...option,\n label: formatDate(option.value, \"date\"),\n }),\n );\n\n return {\n emptyMessage: getVendorEventsEmptyMessage(),\n eventDateOptions,\n eventsByDate: filterVendorEventsBySelectedDate(events, selectedDate),\n hasDatePills: eventDateOptions.length > 0,\n };\n}\n","import { EnumInviteStatus } from \"../../enums\";\n\n/**\n * Relation date statuses that must survive when their event slot is removed or\n * a relation is overwritten. ACCEPTED/COMPLETED are historical or paid\n * bookings; REJECTED is kept for the organizer's records. Dates with any other\n * status may be deleted once their slot disappears from the event schedule.\n */\nexport const PRESERVED_RELATION_DATE_STATUSES: ReadonlySet<EnumInviteStatus> =\n new Set([\n EnumInviteStatus.ACCEPTED,\n EnumInviteStatus.COMPLETED,\n EnumInviteStatus.REJECTED,\n ]);\n","import { isTransientNetworkError } from \"./isTransientNetworkError\";\n\nexport const DEFAULT_USER_FACING_ERROR =\n \"Something went wrong. Please try again.\";\n\nexport const NETWORK_USER_FACING_ERROR =\n \"Unable to connect. Please check your internet connection and try again.\";\n\n/** Backend/infra messages that must never be shown to end users. */\nconst INTERNAL_ERROR_PATTERNS = [\n /connection\\s*<monitor>/i,\n /\\bmongo/i,\n /\\b\\d{1,3}(?:\\.\\d{1,3}){3}(?::\\d+)?\\b/,\n /\\beconn(?:refused|reset|aborted)\\b/i,\n /\\betimedout\\b/i,\n /\\benotfound\\b/i,\n /\\bsocket hang up\\b/i,\n /\\binternal server error\\b/i,\n /received status code 5\\d\\d/i,\n /\\bat\\s+\\S+\\s+\\([^)]+:\\d+:\\d+\\)/,\n] as const;\n\nexport function isInternalErrorMessage(message: string): boolean {\n return INTERNAL_ERROR_PATTERNS.some((pattern) => pattern.test(message));\n}\n\n/**\n * Maps raw API/client errors to a safe message for UI surfaces.\n * Keeps intentional product copy (e.g. \"Vendor not found\"); hides infra details.\n */\nexport function toUserFacingErrorMessage(\n error: string | null | undefined,\n fallback = DEFAULT_USER_FACING_ERROR,\n): string {\n const message = (error ?? \"\").trim();\n if (!message) return fallback;\n\n if (isTransientNetworkError(message)) {\n return NETWORK_USER_FACING_ERROR;\n }\n\n if (isInternalErrorMessage(message)) {\n return fallback;\n }\n\n return message;\n}\n\n/** Extracts and sanitizes an unknown catch/Apollo error for toasts and alerts. */\nexport function getErrorMessage(\n error: unknown,\n fallback = DEFAULT_USER_FACING_ERROR,\n): string {\n let raw: string | undefined;\n if (error instanceof Error) {\n raw = error.message;\n } else if (typeof error === \"string\") {\n raw = error;\n }\n\n return toUserFacingErrorMessage(raw, fallback);\n}\n"],"mappings":"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","names":[]}
|