@timardex/cluemart-shared 1.5.600 → 1.5.601
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/{chunk-GSOSJNID.mjs → chunk-Y6OS3HDB.mjs} +102 -64
- package/dist/chunk-Y6OS3HDB.mjs.map +1 -0
- package/dist/hooks/index.cjs +6 -0
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.mjs +1 -1
- package/dist/index.cjs +100 -53
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +17 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.mjs +91 -53
- package/dist/index.mjs.map +1 -1
- package/dist/sharing/index.cjs +100 -53
- package/dist/sharing/index.cjs.map +1 -1
- package/dist/sharing/index.d.mts +17 -1
- package/dist/sharing/index.d.ts +17 -1
- package/dist/sharing/index.mjs +19 -1
- package/package.json +1 -1
- package/dist/chunk-GSOSJNID.mjs.map +0 -1
|
@@ -2,6 +2,54 @@ import {
|
|
|
2
2
|
formatDate
|
|
3
3
|
} from "./chunk-X4VPNOHX.mjs";
|
|
4
4
|
|
|
5
|
+
// src/sharing/relationShareTypes.ts
|
|
6
|
+
var RELATION_SHARE_INVITATION = "invitation";
|
|
7
|
+
var RELATION_SHARE_APPLICATION = "application";
|
|
8
|
+
var RELATION_SHARE_RESOURCE_TYPES = [
|
|
9
|
+
RELATION_SHARE_INVITATION,
|
|
10
|
+
RELATION_SHARE_APPLICATION
|
|
11
|
+
];
|
|
12
|
+
function isRelationShareResourceType(resourceType) {
|
|
13
|
+
return RELATION_SHARE_RESOURCE_TYPES.includes(
|
|
14
|
+
resourceType
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// src/sharing/constants.ts
|
|
19
|
+
var SHARE_SITE_URL = "https://cluemart.co.nz";
|
|
20
|
+
var SHARE_CALENDAR_ICON = "\u{1F4C5}";
|
|
21
|
+
var SHARE_MARKET_DATES_SECTION_HEADING = `${SHARE_CALENDAR_ICON} Market dates:`;
|
|
22
|
+
var SHARE_CHECKMARK_ICON = "\u2705";
|
|
23
|
+
var SHARE_REQUIREMENTS_SECTION_HEADING = `${SHARE_CHECKMARK_ICON} Requirements:`;
|
|
24
|
+
var SHARE_CATEGORY_ICON = "\u{1F3F7}\uFE0F";
|
|
25
|
+
var SHARE_CATEGORIES_SECTION_HEADING = `${SHARE_CATEGORY_ICON} Categories:`;
|
|
26
|
+
var DEFAULT_SHARE_OG_IMAGE = `${SHARE_SITE_URL}/assets/logo.webp`;
|
|
27
|
+
var RESOURCE_SHARE_TYPES = [
|
|
28
|
+
"market",
|
|
29
|
+
"stallholder",
|
|
30
|
+
"partner"
|
|
31
|
+
];
|
|
32
|
+
var POST_SHARE_RESOURCE_TYPES = [
|
|
33
|
+
"daily_meets",
|
|
34
|
+
"daily_tips",
|
|
35
|
+
"daily_games"
|
|
36
|
+
];
|
|
37
|
+
var SHARE_RESOURCE_LABEL = {
|
|
38
|
+
[RELATION_SHARE_APPLICATION]: "Application",
|
|
39
|
+
[RELATION_SHARE_INVITATION]: "Invitation",
|
|
40
|
+
daily_games: "Daily Game",
|
|
41
|
+
daily_meets: "Daily Meet",
|
|
42
|
+
daily_tips: "Daily Tip",
|
|
43
|
+
market: "Market",
|
|
44
|
+
partner: "Partner",
|
|
45
|
+
stallholder: "Stallholder"
|
|
46
|
+
};
|
|
47
|
+
function isPostShareResourceType(resourceType) {
|
|
48
|
+
return POST_SHARE_RESOURCE_TYPES.includes(
|
|
49
|
+
resourceType
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
5
53
|
// src/sharing/formatCategoryLabel.ts
|
|
6
54
|
function formatCategoryLabel(category) {
|
|
7
55
|
const subcategoryNames = category.subcategories.map((subcategory) => subcategory.name).filter(Boolean);
|
|
@@ -29,6 +77,28 @@ function formatShareMarketDate(dateStr) {
|
|
|
29
77
|
function formatStallCapacityLabel(stallCapacity) {
|
|
30
78
|
return stallCapacity > 0 ? ` (${stallCapacity} spaces available)` : " - Full";
|
|
31
79
|
}
|
|
80
|
+
function formatShareStallLine(stall) {
|
|
81
|
+
return ` - ${stall.label} \u2014 $${stall.price}${formatStallCapacityLabel(stall.stallCapacity)}`;
|
|
82
|
+
}
|
|
83
|
+
function formatShareInvitationMarketDatesSection(dateTime) {
|
|
84
|
+
const dateBlocks = dateTime.map((date) => {
|
|
85
|
+
const formattedDate = formatShareMarketDate(date.startDate);
|
|
86
|
+
const stallLines = date.stallTypes.map(formatShareStallLine);
|
|
87
|
+
return [`- ${formattedDate}`, ...stallLines].join("\n");
|
|
88
|
+
});
|
|
89
|
+
return `${SHARE_MARKET_DATES_SECTION_HEADING}
|
|
90
|
+
${dateBlocks.join("\n")}`;
|
|
91
|
+
}
|
|
92
|
+
function formatShareInvitationRequirementsSection(requirementLabels) {
|
|
93
|
+
const bullets = requirementLabels.map((label) => `- ${label}`);
|
|
94
|
+
return `${SHARE_REQUIREMENTS_SECTION_HEADING}
|
|
95
|
+
${bullets.join("\n")}`;
|
|
96
|
+
}
|
|
97
|
+
function formatShareApplicationCategoriesSection(categoryLabels) {
|
|
98
|
+
const bullets = categoryLabels.map((label) => `- ${label}`);
|
|
99
|
+
return `${SHARE_CATEGORIES_SECTION_HEADING}
|
|
100
|
+
${bullets.join("\n")}`;
|
|
101
|
+
}
|
|
32
102
|
function buildInvitationShareDescription(event, eventInfo) {
|
|
33
103
|
const stallTypes = eventInfo?.dateTime?.flatMap((date) => date.stallTypes) ?? [];
|
|
34
104
|
if (!eventInfo || stallTypes.length === 0) {
|
|
@@ -37,15 +107,9 @@ function buildInvitationShareDescription(event, eventInfo) {
|
|
|
37
107
|
const requirementLabels = (eventInfo.requirements ?? []).filter((item) => item.value).map((item) => item.label);
|
|
38
108
|
const sections = [
|
|
39
109
|
event.location.fullAddress,
|
|
40
|
-
|
|
41
|
-
const start = formatShareMarketDate(date.startDate);
|
|
42
|
-
return `Market date: ${start}`;
|
|
43
|
-
}),
|
|
110
|
+
formatShareInvitationMarketDatesSection(eventInfo.dateTime),
|
|
44
111
|
`Application deadline: vendors must apply at least ${eventInfo.applicationDeadlineHours} hours before each market date.`,
|
|
45
|
-
|
|
46
|
-
(stall) => `Stall: ${stall.label} \u2014 $${stall.price}${formatStallCapacityLabel(stall.stallCapacity)}`
|
|
47
|
-
),
|
|
48
|
-
requirementLabels.length > 0 && `Requirements: ${requirementLabels.join(", ")}`
|
|
112
|
+
requirementLabels.length > 0 && formatShareInvitationRequirementsSection(requirementLabels)
|
|
49
113
|
];
|
|
50
114
|
return joinShareDescriptionSections(sections);
|
|
51
115
|
}
|
|
@@ -63,57 +127,15 @@ function buildApplicationShareDescription(vendor, vendorInfo) {
|
|
|
63
127
|
].filter(Boolean);
|
|
64
128
|
const profileDescription = vendor.description?.trim();
|
|
65
129
|
const sections = [
|
|
66
|
-
categoryLabels.length > 0 &&
|
|
130
|
+
categoryLabels.length > 0 && formatShareApplicationCategoriesSection(categoryLabels),
|
|
67
131
|
`Stall size: ${vendorInfo.stallInfo.size.width}m \xD7 ${vendorInfo.stallInfo.size.depth}m`,
|
|
68
|
-
|
|
132
|
+
complianceLabels.length > 0 && `Compliance: ${complianceLabels.join(", ")}`,
|
|
69
133
|
`Price range: $${vendorInfo.product.priceRange.min} \u2013 $${vendorInfo.product.priceRange.max}`,
|
|
70
134
|
profileDescription
|
|
71
135
|
];
|
|
72
136
|
return joinShareDescriptionSections(sections);
|
|
73
137
|
}
|
|
74
138
|
|
|
75
|
-
// src/sharing/relationShareTypes.ts
|
|
76
|
-
var RELATION_SHARE_INVITATION = "invitation";
|
|
77
|
-
var RELATION_SHARE_APPLICATION = "application";
|
|
78
|
-
var RELATION_SHARE_RESOURCE_TYPES = [
|
|
79
|
-
RELATION_SHARE_INVITATION,
|
|
80
|
-
RELATION_SHARE_APPLICATION
|
|
81
|
-
];
|
|
82
|
-
function isRelationShareResourceType(resourceType) {
|
|
83
|
-
return RELATION_SHARE_RESOURCE_TYPES.includes(
|
|
84
|
-
resourceType
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// src/sharing/constants.ts
|
|
89
|
-
var SHARE_SITE_URL = "https://cluemart.co.nz";
|
|
90
|
-
var DEFAULT_SHARE_OG_IMAGE = `${SHARE_SITE_URL}/assets/logo.webp`;
|
|
91
|
-
var RESOURCE_SHARE_TYPES = [
|
|
92
|
-
"market",
|
|
93
|
-
"stallholder",
|
|
94
|
-
"partner"
|
|
95
|
-
];
|
|
96
|
-
var POST_SHARE_RESOURCE_TYPES = [
|
|
97
|
-
"daily_meets",
|
|
98
|
-
"daily_tips",
|
|
99
|
-
"daily_games"
|
|
100
|
-
];
|
|
101
|
-
var SHARE_RESOURCE_LABEL = {
|
|
102
|
-
[RELATION_SHARE_APPLICATION]: "Application",
|
|
103
|
-
[RELATION_SHARE_INVITATION]: "Invitation",
|
|
104
|
-
daily_games: "Daily Game",
|
|
105
|
-
daily_meets: "Daily Meet",
|
|
106
|
-
daily_tips: "Daily Tip",
|
|
107
|
-
market: "Market",
|
|
108
|
-
partner: "Partner",
|
|
109
|
-
stallholder: "Stallholder"
|
|
110
|
-
};
|
|
111
|
-
function isPostShareResourceType(resourceType) {
|
|
112
|
-
return POST_SHARE_RESOURCE_TYPES.includes(
|
|
113
|
-
resourceType
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
139
|
// src/sharing/buildShareUrl.ts
|
|
118
140
|
var PUBLIC_SHARE_PATH_TYPES = [
|
|
119
141
|
...RESOURCE_SHARE_TYPES,
|
|
@@ -135,7 +157,14 @@ function normalizeShareSection(value) {
|
|
|
135
157
|
if (value == null) {
|
|
136
158
|
return "";
|
|
137
159
|
}
|
|
138
|
-
return value.trim().split("\n").map((line) =>
|
|
160
|
+
return value.trim().split("\n").map((line) => {
|
|
161
|
+
const match = line.match(/^([ \t]*)(.*)$/);
|
|
162
|
+
if (!match) {
|
|
163
|
+
return line;
|
|
164
|
+
}
|
|
165
|
+
const [, leading, rest] = match;
|
|
166
|
+
return leading + rest.trim().replace(/[ \t]{2,}/g, " ");
|
|
167
|
+
}).join("\n").replace(/\n{3,}/g, "\n\n");
|
|
139
168
|
}
|
|
140
169
|
function stripLegacyBulletPrefix(section) {
|
|
141
170
|
return section.startsWith(LEGACY_BULLET_PREFIX) ? section.slice(LEGACY_BULLET_PREFIX.length) : section;
|
|
@@ -201,26 +230,35 @@ function buildSharePagePath(resourceType, rawId) {
|
|
|
201
230
|
}
|
|
202
231
|
|
|
203
232
|
export {
|
|
204
|
-
formatCategoryLabel,
|
|
205
|
-
SHARE_DESCRIPTION_SECTION_SEPARATOR,
|
|
206
|
-
SHARE_DESCRIPTION_SECTION_BREAK,
|
|
207
|
-
OG_DESCRIPTION_LINE_BREAK,
|
|
208
|
-
joinShareOgDescriptionSections,
|
|
209
|
-
joinShareDescriptionSections,
|
|
210
|
-
formatShareMarketDate,
|
|
211
|
-
formatStallCapacityLabel,
|
|
212
|
-
buildInvitationShareDescription,
|
|
213
|
-
buildApplicationShareDescription,
|
|
214
233
|
RELATION_SHARE_INVITATION,
|
|
215
234
|
RELATION_SHARE_APPLICATION,
|
|
216
235
|
RELATION_SHARE_RESOURCE_TYPES,
|
|
217
236
|
isRelationShareResourceType,
|
|
218
237
|
SHARE_SITE_URL,
|
|
238
|
+
SHARE_CALENDAR_ICON,
|
|
239
|
+
SHARE_MARKET_DATES_SECTION_HEADING,
|
|
240
|
+
SHARE_CHECKMARK_ICON,
|
|
241
|
+
SHARE_REQUIREMENTS_SECTION_HEADING,
|
|
242
|
+
SHARE_CATEGORY_ICON,
|
|
243
|
+
SHARE_CATEGORIES_SECTION_HEADING,
|
|
219
244
|
DEFAULT_SHARE_OG_IMAGE,
|
|
220
245
|
RESOURCE_SHARE_TYPES,
|
|
221
246
|
POST_SHARE_RESOURCE_TYPES,
|
|
222
247
|
SHARE_RESOURCE_LABEL,
|
|
223
248
|
isPostShareResourceType,
|
|
249
|
+
formatCategoryLabel,
|
|
250
|
+
SHARE_DESCRIPTION_SECTION_SEPARATOR,
|
|
251
|
+
SHARE_DESCRIPTION_SECTION_BREAK,
|
|
252
|
+
OG_DESCRIPTION_LINE_BREAK,
|
|
253
|
+
joinShareOgDescriptionSections,
|
|
254
|
+
joinShareDescriptionSections,
|
|
255
|
+
formatShareMarketDate,
|
|
256
|
+
formatStallCapacityLabel,
|
|
257
|
+
formatShareInvitationMarketDatesSection,
|
|
258
|
+
formatShareInvitationRequirementsSection,
|
|
259
|
+
formatShareApplicationCategoriesSection,
|
|
260
|
+
buildInvitationShareDescription,
|
|
261
|
+
buildApplicationShareDescription,
|
|
224
262
|
PUBLIC_SHARE_PATH_TYPES,
|
|
225
263
|
RESOURCE_SHARE_TYPES_FOR_URL,
|
|
226
264
|
SHARE_TYPE_PATH_REGEX,
|
|
@@ -235,4 +273,4 @@ export {
|
|
|
235
273
|
normalizeShareRouteId,
|
|
236
274
|
buildSharePagePath
|
|
237
275
|
};
|
|
238
|
-
//# sourceMappingURL=chunk-
|
|
276
|
+
//# sourceMappingURL=chunk-Y6OS3HDB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sharing/relationShareTypes.ts","../src/sharing/constants.ts","../src/sharing/formatCategoryLabel.ts","../src/sharing/joinShareDescriptionSections.ts","../src/sharing/buildRelationShareDescription.ts","../src/sharing/buildShareUrl.ts","../src/sharing/normalizeShareDescription.ts","../src/sharing/normalizeShareRouteId.ts"],"sourcesContent":["/** Path segments for relation share URLs — must match mobile `RelationTitle` values. */\nexport const RELATION_SHARE_INVITATION = \"invitation\" as const;\nexport const RELATION_SHARE_APPLICATION = \"application\" as const;\n\nexport const RELATION_SHARE_RESOURCE_TYPES = [\n RELATION_SHARE_INVITATION,\n RELATION_SHARE_APPLICATION,\n] as const;\n\nexport type RelationShareResourceType =\n (typeof RELATION_SHARE_RESOURCE_TYPES)[number];\n\nexport function isRelationShareResourceType(\n resourceType: string,\n): resourceType is RelationShareResourceType {\n return (RELATION_SHARE_RESOURCE_TYPES as readonly string[]).includes(\n resourceType,\n );\n}\n","import {\n RELATION_SHARE_APPLICATION,\n RELATION_SHARE_INVITATION,\n type RelationShareResourceType,\n} from \"./relationShareTypes\";\n\nexport {\n RELATION_SHARE_APPLICATION,\n RELATION_SHARE_INVITATION,\n RELATION_SHARE_RESOURCE_TYPES,\n isRelationShareResourceType,\n type RelationShareResourceType,\n} from \"./relationShareTypes\";\n\nexport const SHARE_SITE_URL = \"https://cluemart.co.nz\";\n\n/** Calendar marker for invitation market-dates share copy (U+1F4C5 📅). */\nexport const SHARE_CALENDAR_ICON = \"\\u{1F4C5}\";\n\nexport const SHARE_MARKET_DATES_SECTION_HEADING = `${SHARE_CALENDAR_ICON} Market dates:`;\n\n/** Check mark for invitation requirements share copy (U+2705 ✅). */\nexport const SHARE_CHECKMARK_ICON = \"\\u{2705}\";\n\nexport const SHARE_REQUIREMENTS_SECTION_HEADING = `${SHARE_CHECKMARK_ICON} Requirements:`;\n\n/** Label tag for application categories share copy (U+1F3F7 🏷️). */\nexport const SHARE_CATEGORY_ICON = \"\\u{1F3F7}\\u{FE0F}\";\n\nexport const SHARE_CATEGORIES_SECTION_HEADING = `${SHARE_CATEGORY_ICON} Categories:`;\n\nexport const DEFAULT_SHARE_OG_IMAGE = `${SHARE_SITE_URL}/assets/logo.webp`;\n\nexport const RESOURCE_SHARE_TYPES = [\n \"market\",\n \"stallholder\",\n \"partner\",\n] as const;\n\nexport type ResourceShareType = (typeof RESOURCE_SHARE_TYPES)[number];\n\nexport const POST_SHARE_RESOURCE_TYPES = [\n \"daily_meets\",\n \"daily_tips\",\n \"daily_games\",\n] as const;\n\nexport type PostShareResourceType = (typeof POST_SHARE_RESOURCE_TYPES)[number];\n\nexport type ShareResourceType =\n | ResourceShareType\n | PostShareResourceType\n | RelationShareResourceType;\n\nexport const SHARE_RESOURCE_LABEL: Record<ShareResourceType, string> = {\n [RELATION_SHARE_APPLICATION]: \"Application\",\n [RELATION_SHARE_INVITATION]: \"Invitation\",\n daily_games: \"Daily Game\",\n daily_meets: \"Daily Meet\",\n daily_tips: \"Daily Tip\",\n market: \"Market\",\n partner: \"Partner\",\n stallholder: \"Stallholder\",\n};\n\nexport function isPostShareResourceType(\n resourceType: ShareResourceType,\n): resourceType is PostShareResourceType {\n return (POST_SHARE_RESOURCE_TYPES as readonly string[]).includes(\n resourceType,\n );\n}\n","import type { ShareVendorCategory } from \"./shareRelationTypes\";\n\nexport function formatCategoryLabel(category: ShareVendorCategory): string {\n const subcategoryNames = category.subcategories\n .map((subcategory) => subcategory.name)\n .filter(Boolean);\n\n if (subcategoryNames.length === 0) {\n return category.name;\n }\n\n return `${category.name} (${subcategoryNames.join(\", \")})`;\n}\n","/** Visible separator for multi-block share text when line breaks are stripped (legacy OG). */\nexport const SHARE_DESCRIPTION_SECTION_SEPARATOR = \" · \";\n\n/** Blank line between share sections — title, address, dates, URL, etc. */\nexport const SHARE_DESCRIPTION_SECTION_BREAK = \"\\n\\n\";\n\n/**\n * Line break for `og:description` meta content. Use instead of `\\n` — Next.js\n * HTML serialisation collapses literal newlines to spaces; Facebook reads ` `.\n */\nexport const OG_DESCRIPTION_LINE_BREAK = \" \";\n\n/** Joins OG description sections for Facebook link cards (and Twitter). */\nexport function joinShareOgDescriptionSections(\n sections: ReadonlyArray<string | false | null | undefined>,\n): string {\n return sections\n .map((section) => (typeof section === \"string\" ? section.trim() : \"\"))\n .filter((section): section is string => section.length > 0)\n .join(OG_DESCRIPTION_LINE_BREAK);\n}\n\nexport function joinShareDescriptionSections(\n sections: ReadonlyArray<string | false | null | undefined>,\n): string {\n return sections\n .filter((section): section is string => Boolean(section))\n .join(SHARE_DESCRIPTION_SECTION_BREAK);\n}\n","import { formatDate } from \"../utils/date\";\n\nimport {\n SHARE_CATEGORIES_SECTION_HEADING,\n SHARE_MARKET_DATES_SECTION_HEADING,\n SHARE_REQUIREMENTS_SECTION_HEADING,\n} from \"./constants\";\nimport { formatCategoryLabel } from \"./formatCategoryLabel\";\nimport { joinShareDescriptionSections } from \"./joinShareDescriptionSections\";\nimport type {\n ShareEventForInvitation,\n ShareEventInfoForInvitation,\n ShareStallType,\n ShareVendorForApplication,\n ShareVendorInfoForApplication,\n} from \"./shareRelationTypes\";\n\nexport type {\n ShareEventDateTime,\n ShareEventForInvitation,\n ShareEventInfoForInvitation,\n ShareStallType,\n ShareVendorCategory,\n ShareVendorForApplication,\n ShareVendorInfoForApplication,\n} from \"./shareRelationTypes\";\n\n/** Formats event `startDate` (`DD-MM-YYYY`) for share copy — same as share preview UI. */\nexport function formatShareMarketDate(dateStr: string): string {\n return formatDate(dateStr, \"date\");\n}\n\nexport function formatStallCapacityLabel(stallCapacity: number): string {\n return stallCapacity > 0 ? ` (${stallCapacity} spaces available)` : \" - Full\";\n}\n\nfunction formatShareStallLine(stall: ShareStallType): string {\n return ` - ${stall.label} — $${stall.price}${formatStallCapacityLabel(stall.stallCapacity)}`;\n}\n\n/** Nested market dates + per-date stall lines for invitation share copy. */\nexport function formatShareInvitationMarketDatesSection(\n dateTime: ShareEventInfoForInvitation[\"dateTime\"],\n): string {\n const dateBlocks = dateTime.map((date) => {\n const formattedDate = formatShareMarketDate(date.startDate);\n const stallLines = date.stallTypes.map(formatShareStallLine);\n return [`- ${formattedDate}`, ...stallLines].join(\"\\n\");\n });\n\n return `${SHARE_MARKET_DATES_SECTION_HEADING}\\n${dateBlocks.join(\"\\n\")}`;\n}\n\n/** Bulleted requirements list for invitation share copy. */\nexport function formatShareInvitationRequirementsSection(\n requirementLabels: string[],\n): string {\n const bullets = requirementLabels.map((label) => `- ${label}`);\n return `${SHARE_REQUIREMENTS_SECTION_HEADING}\\n${bullets.join(\"\\n\")}`;\n}\n\n/** Bulleted categories list for application share copy. */\nexport function formatShareApplicationCategoriesSection(\n categoryLabels: string[],\n): string {\n const bullets = categoryLabels.map((label) => `- ${label}`);\n return `${SHARE_CATEGORIES_SECTION_HEADING}\\n${bullets.join(\"\\n\")}`;\n}\n\nexport function buildInvitationShareDescription(\n event: ShareEventForInvitation,\n eventInfo: ShareEventInfoForInvitation | null | undefined,\n): string {\n const stallTypes =\n eventInfo?.dateTime?.flatMap((date) => date.stallTypes) ?? [];\n\n if (!eventInfo || stallTypes.length === 0) {\n return event.description?.trim() || \"\";\n }\n\n const requirementLabels = (eventInfo.requirements ?? [])\n .filter((item) => item.value)\n .map((item) => item.label);\n\n const sections = [\n event.location.fullAddress,\n formatShareInvitationMarketDatesSection(eventInfo.dateTime),\n `Application deadline: vendors must apply at least ${eventInfo.applicationDeadlineHours} hours before each market date.`,\n requirementLabels.length > 0 &&\n formatShareInvitationRequirementsSection(requirementLabels),\n ];\n\n return joinShareDescriptionSections(sections);\n}\n\nexport function buildApplicationShareDescription(\n vendor: ShareVendorForApplication,\n vendorInfo: ShareVendorInfoForApplication | null | undefined,\n): string {\n const categoryLabels = vendor.categories.map((category) =>\n formatCategoryLabel(category),\n );\n\n if (!vendorInfo) {\n return vendor.description?.trim() || \"\";\n }\n\n const compliance = vendorInfo.compliance;\n const complianceLabels = [\n compliance?.liabilityInsurance && \"Liability insurance\",\n compliance?.foodBeverageLicense && \"Food & beverage licence\",\n ].filter(Boolean);\n\n const profileDescription = vendor.description?.trim();\n\n const sections = [\n categoryLabels.length > 0 &&\n formatShareApplicationCategoriesSection(categoryLabels),\n `Stall size: ${vendorInfo.stallInfo.size.width}m × ${vendorInfo.stallInfo.size.depth}m`,\n complianceLabels.length > 0 && `Compliance: ${complianceLabels.join(\", \")}`,\n `Price range: $${vendorInfo.product.priceRange.min} – $${vendorInfo.product.priceRange.max}`,\n profileDescription,\n ];\n\n return joinShareDescriptionSections(sections);\n}\n","import {\n POST_SHARE_RESOURCE_TYPES,\n RESOURCE_SHARE_TYPES,\n SHARE_SITE_URL,\n} from \"./constants\";\nimport {\n RELATION_SHARE_APPLICATION,\n RELATION_SHARE_INVITATION,\n} from \"./relationShareTypes\";\n\n/** Path segments for public resource share URLs (markets, posts, etc.). */\nexport const PUBLIC_SHARE_PATH_TYPES = [\n ...RESOURCE_SHARE_TYPES,\n ...POST_SHARE_RESOURCE_TYPES,\n] as const;\n\nexport type PublicSharePathType = (typeof PUBLIC_SHARE_PATH_TYPES)[number];\n\n/** @deprecated Use {@link PUBLIC_SHARE_PATH_TYPES} — kept for mobile deep-link helpers. */\nexport const RESOURCE_SHARE_TYPES_FOR_URL = PUBLIC_SHARE_PATH_TYPES;\n\nexport type RelationSharePathType =\n | typeof RELATION_SHARE_INVITATION\n | typeof RELATION_SHARE_APPLICATION;\n\nexport type ShareType = PublicSharePathType | RelationSharePathType;\n\n/** Alternation for deep-link regexes — keep in sync with {@link ShareType}. */\nexport const SHARE_TYPE_PATH_REGEX = [\n ...PUBLIC_SHARE_PATH_TYPES,\n RELATION_SHARE_APPLICATION,\n RELATION_SHARE_INVITATION,\n].join(\"|\");\n\nexport function buildShareUrl(type: ShareType, id: string): string {\n return `${SHARE_SITE_URL}/share/${type}/${encodeURIComponent(id)}`;\n}\n","import {\n joinShareOgDescriptionSections,\n OG_DESCRIPTION_LINE_BREAK,\n SHARE_DESCRIPTION_SECTION_BREAK,\n SHARE_DESCRIPTION_SECTION_SEPARATOR,\n} from \"./joinShareDescriptionSections\";\n\nexport {\n joinShareOgDescriptionSections,\n OG_DESCRIPTION_LINE_BREAK,\n SHARE_DESCRIPTION_SECTION_BREAK,\n SHARE_DESCRIPTION_SECTION_SEPARATOR,\n};\n\nconst LEGACY_BULLET_PREFIX = \"• \";\n\n/** Trims a share section and collapses spaces per line; preserves line breaks. */\nfunction normalizeShareSection(value: string | null | undefined): string {\n if (value == null) {\n return \"\";\n }\n return value\n .trim()\n .split(\"\\n\")\n .map((line) => {\n const match = line.match(/^([ \\t]*)(.*)$/);\n if (!match) {\n return line;\n }\n const [, leading, rest] = match;\n return leading + rest.trim().replace(/[ \\t]{2,}/g, \" \");\n })\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\");\n}\n\nfunction stripLegacyBulletPrefix(section: string): string {\n return section.startsWith(LEGACY_BULLET_PREFIX)\n ? section.slice(LEGACY_BULLET_PREFIX.length)\n : section;\n}\n\nexport function splitShareDescriptionSections(value: string): string[] {\n const trimmed = value.trim();\n if (!trimmed) {\n return [];\n }\n\n if (trimmed.includes(SHARE_DESCRIPTION_SECTION_SEPARATOR)) {\n return trimmed\n .split(SHARE_DESCRIPTION_SECTION_SEPARATOR)\n .map((section) => stripLegacyBulletPrefix(normalizeShareSection(section)))\n .filter((section) => section.length > 0);\n }\n\n if (/\\n\\n/.test(trimmed)) {\n return trimmed\n .split(/\\n\\n+/)\n .map((section) => stripLegacyBulletPrefix(normalizeShareSection(section)))\n .filter((section) => section.length > 0);\n }\n\n if (/\\n/.test(trimmed)) {\n return trimmed\n .split(/\\n+/)\n .map((section) => stripLegacyBulletPrefix(normalizeShareSection(section)))\n .filter((section) => section.length > 0);\n }\n\n return [stripLegacyBulletPrefix(normalizeShareSection(trimmed))];\n}\n\nfunction collapseExcessiveBlankLines(value: string): string {\n return value.replace(/\\n{4,}/g, \"\\n\\n\\n\").trim();\n}\n\n/**\n * Share copy with a blank line between each section (share sheet message, previews).\n */\nexport function formatShareSectionsForMultilineDisplay(value: string): string {\n return collapseExcessiveBlankLines(\n splitShareDescriptionSections(value).join(SHARE_DESCRIPTION_SECTION_BREAK),\n );\n}\n\n/**\n * Formats multiline share copy for UIs that strip line breaks (legacy OG one-liners).\n */\nexport function formatShareSectionsForCompactDisplay(value: string): string {\n return splitShareDescriptionSections(value).join(\n SHARE_DESCRIPTION_SECTION_SEPARATOR,\n );\n}\n\n/**\n * Formats share descriptions for Open Graph / Twitter meta tags.\n * Sections are joined with {@link OG_DESCRIPTION_LINE_BREAK} (` `).\n */\nexport function normalizeShareOgDescription(value: string): string {\n return joinShareOgDescriptionSections(splitShareDescriptionSections(value));\n}\n\n/**\n * Quote text for Facebook ShareDialog on iOS (`ShareLinkContent.quote`).\n *\n * Title + blank lines + body sections. URL is omitted — `contentUrl` supplies\n * the link card (OG on `/share/*` controls card title/image).\n */\nexport function buildFacebookShareQuote(\n title: string,\n description: string,\n): string | undefined {\n const titleSection = normalizeShareSection(title);\n const body = formatShareSectionsForMultilineDisplay(\n normalizeShareSection(description),\n );\n const sections = [titleSection, body].filter((section) => section.length > 0);\n const quote = sections.join(SHARE_DESCRIPTION_SECTION_BREAK).trim();\n return quote.length > 0 ? quote : undefined;\n}\n\n/**\n * Open Graph / Twitter description from pre-built section strings.\n * Prefer {@link joinShareOgDescriptionSections} when sections are already known.\n */\nexport function buildShareOgDescriptionFromSections(\n sections: ReadonlyArray<string | false | null | undefined>,\n): string {\n return joinShareOgDescriptionSections(sections);\n}\n\n/**\n * Open Graph / Twitter description — body sections only (`og:title` is separate).\n * Multiline / legacy ` · ` input is split into sections, then joined with ` `.\n */\nexport function buildShareOgDescription(\n _title: string,\n description: string,\n): string {\n return joinShareOgDescriptionSections(splitShareDescriptionSections(description));\n}\n","import type { ShareResourceType } from \"./constants\";\n\nexport function normalizeShareRouteId(id: string): string {\n try {\n return decodeURIComponent(id);\n } catch {\n return id;\n }\n}\n\nexport function buildSharePagePath(\n resourceType: ShareResourceType,\n rawId: string,\n): string {\n return `/share/${resourceType}/${encodeURIComponent(normalizeShareRouteId(rawId))}`;\n}\n"],"mappings":"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","names":[]}
|
package/dist/hooks/index.cjs
CHANGED
|
@@ -4769,6 +4769,12 @@ var RELATION_SHARE_APPLICATION = "application";
|
|
|
4769
4769
|
|
|
4770
4770
|
// src/sharing/constants.ts
|
|
4771
4771
|
var SHARE_SITE_URL = "https://cluemart.co.nz";
|
|
4772
|
+
var SHARE_CALENDAR_ICON = "\u{1F4C5}";
|
|
4773
|
+
var SHARE_MARKET_DATES_SECTION_HEADING = `${SHARE_CALENDAR_ICON} Market dates:`;
|
|
4774
|
+
var SHARE_CHECKMARK_ICON = "\u2705";
|
|
4775
|
+
var SHARE_REQUIREMENTS_SECTION_HEADING = `${SHARE_CHECKMARK_ICON} Requirements:`;
|
|
4776
|
+
var SHARE_CATEGORY_ICON = "\u{1F3F7}\uFE0F";
|
|
4777
|
+
var SHARE_CATEGORIES_SECTION_HEADING = `${SHARE_CATEGORY_ICON} Categories:`;
|
|
4772
4778
|
var DEFAULT_SHARE_OG_IMAGE = `${SHARE_SITE_URL}/assets/logo.webp`;
|
|
4773
4779
|
var RESOURCE_SHARE_TYPES = [
|
|
4774
4780
|
"market",
|