@timardex/cluemart-shared 1.5.608 → 1.5.615
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-KFTMFH4W.mjs → chunk-DC6SAEHT.mjs} +41 -6
- package/dist/chunk-DC6SAEHT.mjs.map +1 -0
- package/dist/hooks/index.cjs +7 -0
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.mjs +1 -1
- package/dist/index.cjs +52 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +30 -1
- package/dist/index.d.ts +30 -1
- package/dist/index.mjs +40 -5
- package/dist/index.mjs.map +1 -1
- package/dist/sharing/index.cjs +52 -5
- package/dist/sharing/index.cjs.map +1 -1
- package/dist/sharing/index.d.mts +30 -1
- package/dist/sharing/index.d.ts +30 -1
- package/dist/sharing/index.mjs +25 -1
- package/package.json +1 -1
- package/dist/chunk-KFTMFH4W.mjs.map +0 -1
|
@@ -21,8 +21,15 @@ var SHARE_CALENDAR_ICON = "\u{1F4C5}";
|
|
|
21
21
|
var SHARE_MARKET_DATES_SECTION_HEADING = `${SHARE_CALENDAR_ICON} Market dates:`;
|
|
22
22
|
var SHARE_CHECKMARK_ICON = "\u2705";
|
|
23
23
|
var SHARE_REQUIREMENTS_SECTION_HEADING = `${SHARE_CHECKMARK_ICON} Requirements:`;
|
|
24
|
+
var SHARE_COMPLIANCE_PREFIX = `${SHARE_CHECKMARK_ICON} Compliance:`;
|
|
24
25
|
var SHARE_CATEGORY_ICON = "\u{1F3F7}\uFE0F";
|
|
25
26
|
var SHARE_CATEGORIES_SECTION_HEADING = `${SHARE_CATEGORY_ICON} Categories:`;
|
|
27
|
+
var SHARE_RULER_ICON = "\u{1F4CF}";
|
|
28
|
+
var SHARE_STALL_SIZE_PREFIX = `${SHARE_RULER_ICON} Stall size:`;
|
|
29
|
+
var SHARE_DOLLAR_ICON = "$";
|
|
30
|
+
var SHARE_PRICE_RANGE_PREFIX = `${SHARE_DOLLAR_ICON} Price range:`;
|
|
31
|
+
var SHARE_CLOCK_ICON = "\u23F0";
|
|
32
|
+
var SHARE_APPLICATION_DEADLINE_PREFIX = `${SHARE_CLOCK_ICON} Application deadline:`;
|
|
26
33
|
var SHARE_MORE_INFO_LINE = "More info in the ClueMart app";
|
|
27
34
|
var DEFAULT_SHARE_OG_IMAGE = `${SHARE_SITE_URL}/assets/logo.webp`;
|
|
28
35
|
var RESOURCE_SHARE_TYPES = [
|
|
@@ -109,6 +116,20 @@ function formatShareApplicationCategoriesSection(categoryLabels) {
|
|
|
109
116
|
return `${SHARE_CATEGORIES_SECTION_HEADING}
|
|
110
117
|
${bullets.join("\n")}`;
|
|
111
118
|
}
|
|
119
|
+
function formatShareApplicationStallSizeLine(size) {
|
|
120
|
+
return `${SHARE_STALL_SIZE_PREFIX} ${size.width}m \xD7 ${size.depth}m`;
|
|
121
|
+
}
|
|
122
|
+
function formatShareApplicationComplianceSection(complianceLabels) {
|
|
123
|
+
const bullets = complianceLabels.map((label) => `- ${label}`);
|
|
124
|
+
return `${SHARE_COMPLIANCE_PREFIX}
|
|
125
|
+
${bullets.join("\n")}`;
|
|
126
|
+
}
|
|
127
|
+
function formatShareApplicationPriceRangeLine(priceRange) {
|
|
128
|
+
return `${SHARE_PRICE_RANGE_PREFIX} $${priceRange.min} \u2013 $${priceRange.max}`;
|
|
129
|
+
}
|
|
130
|
+
function formatShareInvitationApplicationDeadlineLine(applicationDeadlineHours) {
|
|
131
|
+
return `${SHARE_APPLICATION_DEADLINE_PREFIX} vendors must apply at least ${applicationDeadlineHours} hours before each market date.`;
|
|
132
|
+
}
|
|
112
133
|
function buildInvitationShareDescription(event, eventInfo) {
|
|
113
134
|
const stallTypes = eventInfo?.dateTime?.flatMap((date) => date.stallTypes) ?? [];
|
|
114
135
|
if (!eventInfo || stallTypes.length === 0) {
|
|
@@ -118,7 +139,9 @@ function buildInvitationShareDescription(event, eventInfo) {
|
|
|
118
139
|
const sections = [
|
|
119
140
|
event.location.fullAddress,
|
|
120
141
|
formatShareInvitationMarketDatesSection(eventInfo.dateTime),
|
|
121
|
-
|
|
142
|
+
formatShareInvitationApplicationDeadlineLine(
|
|
143
|
+
eventInfo.applicationDeadlineHours
|
|
144
|
+
),
|
|
122
145
|
requirementLabels.length > 0 && formatShareInvitationRequirementsSection(requirementLabels)
|
|
123
146
|
];
|
|
124
147
|
return joinShareDescriptionSections(sections);
|
|
@@ -134,13 +157,13 @@ function buildApplicationShareDescription(vendor, vendorInfo) {
|
|
|
134
157
|
const complianceLabels = [
|
|
135
158
|
compliance?.liabilityInsurance && "Liability insurance",
|
|
136
159
|
compliance?.foodBeverageLicense && "Food & beverage licence"
|
|
137
|
-
].filter(Boolean);
|
|
160
|
+
].filter((label) => Boolean(label));
|
|
138
161
|
const profileDescription = vendor.description?.trim();
|
|
139
162
|
const sections = [
|
|
140
163
|
categoryLabels.length > 0 && formatShareApplicationCategoriesSection(categoryLabels),
|
|
141
|
-
|
|
142
|
-
complianceLabels.length > 0 &&
|
|
143
|
-
|
|
164
|
+
formatShareApplicationStallSizeLine(vendorInfo.stallInfo.size),
|
|
165
|
+
complianceLabels.length > 0 && formatShareApplicationComplianceSection(complianceLabels),
|
|
166
|
+
formatShareApplicationPriceRangeLine(vendorInfo.product.priceRange),
|
|
144
167
|
profileDescription
|
|
145
168
|
];
|
|
146
169
|
return joinShareDescriptionSections(sections);
|
|
@@ -236,8 +259,15 @@ export {
|
|
|
236
259
|
SHARE_MARKET_DATES_SECTION_HEADING,
|
|
237
260
|
SHARE_CHECKMARK_ICON,
|
|
238
261
|
SHARE_REQUIREMENTS_SECTION_HEADING,
|
|
262
|
+
SHARE_COMPLIANCE_PREFIX,
|
|
239
263
|
SHARE_CATEGORY_ICON,
|
|
240
264
|
SHARE_CATEGORIES_SECTION_HEADING,
|
|
265
|
+
SHARE_RULER_ICON,
|
|
266
|
+
SHARE_STALL_SIZE_PREFIX,
|
|
267
|
+
SHARE_DOLLAR_ICON,
|
|
268
|
+
SHARE_PRICE_RANGE_PREFIX,
|
|
269
|
+
SHARE_CLOCK_ICON,
|
|
270
|
+
SHARE_APPLICATION_DEADLINE_PREFIX,
|
|
241
271
|
SHARE_MORE_INFO_LINE,
|
|
242
272
|
DEFAULT_SHARE_OG_IMAGE,
|
|
243
273
|
RESOURCE_SHARE_TYPES,
|
|
@@ -252,9 +282,14 @@ export {
|
|
|
252
282
|
appendShareMoreInfoLine,
|
|
253
283
|
formatShareMarketDate,
|
|
254
284
|
formatStallCapacityLabel,
|
|
285
|
+
formatShareStallLine,
|
|
255
286
|
formatShareInvitationMarketDatesSection,
|
|
256
287
|
formatShareInvitationRequirementsSection,
|
|
257
288
|
formatShareApplicationCategoriesSection,
|
|
289
|
+
formatShareApplicationStallSizeLine,
|
|
290
|
+
formatShareApplicationComplianceSection,
|
|
291
|
+
formatShareApplicationPriceRangeLine,
|
|
292
|
+
formatShareInvitationApplicationDeadlineLine,
|
|
258
293
|
buildInvitationShareDescription,
|
|
259
294
|
buildApplicationShareDescription,
|
|
260
295
|
PUBLIC_SHARE_PATH_TYPES,
|
|
@@ -271,4 +306,4 @@ export {
|
|
|
271
306
|
normalizeShareRouteId,
|
|
272
307
|
buildSharePagePath
|
|
273
308
|
};
|
|
274
|
-
//# sourceMappingURL=chunk-
|
|
309
|
+
//# sourceMappingURL=chunk-DC6SAEHT.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/** Prefix for application compliance line (share text + OG section parsing). */\nexport const SHARE_COMPLIANCE_PREFIX = `${SHARE_CHECKMARK_ICON} Compliance:`;\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\n/** Straight ruler for application stall-size share copy (U+1F4CF 📏). */\nexport const SHARE_RULER_ICON = \"\\u{1F4CF}\";\n\n/** Prefix for application stall-size line (share text + OG section parsing). */\nexport const SHARE_STALL_SIZE_PREFIX = `${SHARE_RULER_ICON} Stall size:`;\n\n/** Dollar marker for price-range share copy (U+0024 $ — text, not emoji, so it stays black). */\nexport const SHARE_DOLLAR_ICON = \"$\";\n\n/** Prefix for application price-range line (share text + OG section parsing). */\nexport const SHARE_PRICE_RANGE_PREFIX = `${SHARE_DOLLAR_ICON} Price range:`;\n\n/** Alarm clock for invitation application-deadline share copy (U+23F0 ⏰). */\nexport const SHARE_CLOCK_ICON = \"\\u{23F0}\";\n\n/** Prefix for the invitation application-deadline sentence (share text + OG section parsing). */\nexport const SHARE_APPLICATION_DEADLINE_PREFIX = `${SHARE_CLOCK_ICON} Application deadline:`;\n\n/** Footer on share sheet messages, Facebook SDK quote, and `og:description`. */\nexport const SHARE_MORE_INFO_LINE = \"More info in the ClueMart app\";\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","import { SHARE_MORE_INFO_LINE } from \"./constants\";\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 .map((section) => section.replace(/\\n/g, OG_DESCRIPTION_LINE_BREAK))\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\n/** Appends the standard share footer when assembling sheet / SDK quote text. */\nexport function appendShareMoreInfoLine(description: string): string {\n const trimmed = description.trim();\n if (trimmed.endsWith(SHARE_MORE_INFO_LINE)) {\n return trimmed;\n }\n if (trimmed.length === 0) {\n return SHARE_MORE_INFO_LINE;\n }\n return joinShareDescriptionSections([trimmed, SHARE_MORE_INFO_LINE]);\n}\n","import { formatDate } from \"../utils/date\";\n\nimport {\n SHARE_APPLICATION_DEADLINE_PREFIX,\n SHARE_CATEGORIES_SECTION_HEADING,\n SHARE_MARKET_DATES_SECTION_HEADING,\n SHARE_REQUIREMENTS_SECTION_HEADING,\n SHARE_COMPLIANCE_PREFIX,\n SHARE_PRICE_RANGE_PREFIX,\n SHARE_STALL_SIZE_PREFIX,\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\nexport function 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\n/** Stall dimensions line for application share copy. */\nexport function formatShareApplicationStallSizeLine(size: {\n width: string;\n depth: string;\n}): string {\n return `${SHARE_STALL_SIZE_PREFIX} ${size.width}m × ${size.depth}m`;\n}\n\n/** Bulleted compliance list for application share copy. */\nexport function formatShareApplicationComplianceSection(\n complianceLabels: string[],\n): string {\n const bullets = complianceLabels.map((label) => `- ${label}`);\n return `${SHARE_COMPLIANCE_PREFIX}\\n${bullets.join(\"\\n\")}`;\n}\n\n/** Price range line for application share copy. */\nexport function formatShareApplicationPriceRangeLine(priceRange: {\n min: string;\n max: string;\n}): string {\n return `${SHARE_PRICE_RANGE_PREFIX} $${priceRange.min} – $${priceRange.max}`;\n}\n\n/** Application-deadline sentence for invitation share copy. */\nexport function formatShareInvitationApplicationDeadlineLine(\n applicationDeadlineHours: number,\n): string {\n return `${SHARE_APPLICATION_DEADLINE_PREFIX} vendors must apply at least ${applicationDeadlineHours} hours before each market date.`;\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 formatShareInvitationApplicationDeadlineLine(\n eventInfo.applicationDeadlineHours,\n ),\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((label): label is string => Boolean(label));\n\n const profileDescription = vendor.description?.trim();\n\n const sections = [\n categoryLabels.length > 0 &&\n formatShareApplicationCategoriesSection(categoryLabels),\n formatShareApplicationStallSizeLine(vendorInfo.stallInfo.size),\n complianceLabels.length > 0 &&\n formatShareApplicationComplianceSection(complianceLabels),\n formatShareApplicationPriceRangeLine(vendorInfo.product.priceRange),\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\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 { SHARE_MORE_INFO_LINE, type ShareResourceType } from \"./constants\";\nimport {\n joinShareOgDescriptionSections,\n OG_DESCRIPTION_LINE_BREAK,\n SHARE_DESCRIPTION_SECTION_BREAK,\n} from \"./joinShareDescriptionSections\";\n\nexport {\n joinShareOgDescriptionSections,\n OG_DESCRIPTION_LINE_BREAK,\n SHARE_DESCRIPTION_SECTION_BREAK,\n};\n\n/** Trims share text and collapses spaces per line; preserves `\\n\\n` section breaks. */\nexport function normalizeShareText(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\n/** Share-sheet footer always follows title and body/caption. */\nexport type ShareMessageFooterPlacement = \"after-body\";\n\nexport function shareMessageFooterPlacementForType(\n _shareType?: ShareResourceType,\n): ShareMessageFooterPlacement {\n return \"after-body\";\n}\n\n/**\n * Ordered sections for share-sheet / Facebook SDK quote text:\n * title → description (full body or post caption) → {@link SHARE_MORE_INFO_LINE}.\n */\nexport function buildShareMessageSections(input: {\n title?: string | null;\n description?: string | null;\n shareType?: ShareResourceType;\n}): string[] {\n const title = normalizeShareText(input.title);\n const description = normalizeShareText(input.description);\n\n return [title, description, SHARE_MORE_INFO_LINE].filter(\n (section) => section.length > 0,\n );\n}\n\nexport function splitShareDescriptionSections(value: string): string[] {\n const trimmed = normalizeShareText(value);\n if (!trimmed) {\n return [];\n }\n\n if (/\\n\\n/.test(trimmed)) {\n return trimmed\n .split(/\\n\\n+/)\n .map((section) => normalizeShareText(section))\n .filter((section) => section.length > 0);\n }\n\n if (/\\n/.test(trimmed)) {\n return trimmed\n .split(/\\n+/)\n .map((section) => normalizeShareText(section))\n .filter((section) => section.length > 0);\n }\n\n return [trimmed];\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 shareType?: ShareResourceType,\n): string | undefined {\n const sections = buildShareMessageSections({ title, description, shareType });\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/** Open Graph / Twitter description — body sections only (`og:title` is separate). */\nexport function buildShareOgDescription(\n _title: string,\n description: string,\n): string {\n return joinShareOgDescriptionSections(\n splitShareDescriptionSections(description),\n );\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
|
@@ -4773,8 +4773,15 @@ var SHARE_CALENDAR_ICON = "\u{1F4C5}";
|
|
|
4773
4773
|
var SHARE_MARKET_DATES_SECTION_HEADING = `${SHARE_CALENDAR_ICON} Market dates:`;
|
|
4774
4774
|
var SHARE_CHECKMARK_ICON = "\u2705";
|
|
4775
4775
|
var SHARE_REQUIREMENTS_SECTION_HEADING = `${SHARE_CHECKMARK_ICON} Requirements:`;
|
|
4776
|
+
var SHARE_COMPLIANCE_PREFIX = `${SHARE_CHECKMARK_ICON} Compliance:`;
|
|
4776
4777
|
var SHARE_CATEGORY_ICON = "\u{1F3F7}\uFE0F";
|
|
4777
4778
|
var SHARE_CATEGORIES_SECTION_HEADING = `${SHARE_CATEGORY_ICON} Categories:`;
|
|
4779
|
+
var SHARE_RULER_ICON = "\u{1F4CF}";
|
|
4780
|
+
var SHARE_STALL_SIZE_PREFIX = `${SHARE_RULER_ICON} Stall size:`;
|
|
4781
|
+
var SHARE_DOLLAR_ICON = "$";
|
|
4782
|
+
var SHARE_PRICE_RANGE_PREFIX = `${SHARE_DOLLAR_ICON} Price range:`;
|
|
4783
|
+
var SHARE_CLOCK_ICON = "\u23F0";
|
|
4784
|
+
var SHARE_APPLICATION_DEADLINE_PREFIX = `${SHARE_CLOCK_ICON} Application deadline:`;
|
|
4778
4785
|
var DEFAULT_SHARE_OG_IMAGE = `${SHARE_SITE_URL}/assets/logo.webp`;
|
|
4779
4786
|
var RESOURCE_SHARE_TYPES = [
|
|
4780
4787
|
"market",
|