@myrjfa/state 3.0.7 → 3.0.9
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/lib/actions/adminDashboard.d.ts.map +1 -1
- package/dist/lib/actions/adminDashboard.js +2 -1
- package/dist/lib/actions/adventure.d.ts.map +1 -1
- package/dist/lib/actions/adventure.js +3 -2
- package/dist/lib/actions/application.d.ts +5 -3
- package/dist/lib/actions/application.d.ts.map +1 -1
- package/dist/lib/actions/application.js +46 -2
- package/dist/lib/actions/auth.d.ts +18 -3
- package/dist/lib/actions/auth.d.ts.map +1 -1
- package/dist/lib/actions/auth.js +22 -0
- package/dist/lib/actions/blog.d.ts.map +1 -1
- package/dist/lib/actions/blog.js +4 -2
- package/dist/lib/actions/booking.d.ts +29 -1
- package/dist/lib/actions/booking.d.ts.map +1 -1
- package/dist/lib/actions/booking.js +186 -0
- package/dist/lib/actions/brand.d.ts +7 -0
- package/dist/lib/actions/brand.d.ts.map +1 -1
- package/dist/lib/actions/brand.js +4 -0
- package/dist/lib/actions/chat.d.ts +3 -0
- package/dist/lib/actions/chat.d.ts.map +1 -1
- package/dist/lib/actions/chat.js +40 -1
- package/dist/lib/actions/community.d.ts +5 -2
- package/dist/lib/actions/community.d.ts.map +1 -1
- package/dist/lib/actions/community.js +16 -4
- package/dist/lib/actions/companion.d.ts +27 -15
- package/dist/lib/actions/companion.d.ts.map +1 -1
- package/dist/lib/actions/companion.js +22 -15
- package/dist/lib/actions/companionUpload.d.ts +11 -0
- package/dist/lib/actions/companionUpload.d.ts.map +1 -0
- package/dist/lib/actions/companionUpload.js +14 -0
- package/dist/lib/actions/event.d.ts +1 -1
- package/dist/lib/actions/event.d.ts.map +1 -1
- package/dist/lib/actions/event.js +8 -4
- package/dist/lib/actions/fetcher.d.ts +9 -3
- package/dist/lib/actions/fetcher.d.ts.map +1 -1
- package/dist/lib/actions/fetcher.js +60 -15
- package/dist/lib/actions/guide.d.ts.map +1 -1
- package/dist/lib/actions/guide.js +4 -2
- package/dist/lib/actions/homeBanner.d.ts +8 -0
- package/dist/lib/actions/homeBanner.d.ts.map +1 -0
- package/dist/lib/actions/homeBanner.js +33 -0
- package/dist/lib/actions/hostDashboard.d.ts +1 -11
- package/dist/lib/actions/hostDashboard.d.ts.map +1 -1
- package/dist/lib/actions/hostDashboard.js +1 -146
- package/dist/lib/actions/itinerary.d.ts +1 -1
- package/dist/lib/actions/itinerary.d.ts.map +1 -1
- package/dist/lib/actions/itinerary.js +2 -2
- package/dist/lib/actions/listingInterest.d.ts +2 -5
- package/dist/lib/actions/listingInterest.d.ts.map +1 -1
- package/dist/lib/actions/listingInterest.js +18 -3
- package/dist/lib/actions/location.d.ts +4 -0
- package/dist/lib/actions/location.d.ts.map +1 -1
- package/dist/lib/actions/location.js +10 -6
- package/dist/lib/actions/marketplaceContract.d.ts.map +1 -1
- package/dist/lib/actions/marketplaceContract.js +3 -2
- package/dist/lib/actions/nativeTransport.d.ts +25 -0
- package/dist/lib/actions/nativeTransport.d.ts.map +1 -0
- package/dist/lib/actions/nativeTransport.js +50 -0
- package/dist/lib/actions/notification.d.ts +54 -2
- package/dist/lib/actions/notification.d.ts.map +1 -1
- package/dist/lib/actions/notification.js +13 -1
- package/dist/lib/actions/opportunity.d.ts.map +1 -1
- package/dist/lib/actions/opportunity.js +3 -2
- package/dist/lib/actions/package.d.ts +5 -3
- package/dist/lib/actions/package.d.ts.map +1 -1
- package/dist/lib/actions/package.js +15 -9
- package/dist/lib/actions/portfolio.d.ts.map +1 -1
- package/dist/lib/actions/portfolio.js +2 -1
- package/dist/lib/actions/profile.d.ts +5 -0
- package/dist/lib/actions/profile.d.ts.map +1 -1
- package/dist/lib/actions/profile.js +15 -2
- package/dist/lib/actions/rental.d.ts.map +1 -1
- package/dist/lib/actions/rental.js +3 -2
- package/dist/lib/actions/review.d.ts +7 -0
- package/dist/lib/actions/review.d.ts.map +1 -1
- package/dist/lib/actions/review.js +65 -31
- package/dist/lib/actions/room.d.ts +0 -4
- package/dist/lib/actions/room.d.ts.map +1 -1
- package/dist/lib/actions/room.js +3 -2
- package/dist/lib/actions/serverActions.native.d.ts +4 -0
- package/dist/lib/actions/serverActions.native.d.ts.map +1 -0
- package/dist/lib/actions/serverActions.native.js +5 -0
- package/dist/lib/actions/socialAutomation.d.ts.map +1 -1
- package/dist/lib/actions/socialAutomation.js +3 -2
- package/dist/lib/actions/socket.d.ts.map +1 -1
- package/dist/lib/actions/socket.js +6 -5
- package/dist/lib/actions/stay.d.ts +14 -1
- package/dist/lib/actions/stay.d.ts.map +1 -1
- package/dist/lib/actions/stay.js +32 -4
- package/dist/lib/actions/store.d.ts +1 -0
- package/dist/lib/actions/store.d.ts.map +1 -1
- package/dist/lib/actions/store.js +9 -0
- package/dist/lib/actions/user.d.ts +2 -0
- package/dist/lib/actions/user.d.ts.map +1 -1
- package/dist/lib/actions/user.js +5 -0
- package/dist/lib/companion/discoveryPrefill.d.ts +17 -0
- package/dist/lib/companion/discoveryPrefill.d.ts.map +1 -1
- package/dist/lib/companion/discoveryPrefill.js +20 -0
- package/dist/lib/context/ChatContext.d.ts.map +1 -1
- package/dist/lib/context/ChatContext.js +59 -51
- package/dist/lib/data/catalogueLocations.d.ts +3 -0
- package/dist/lib/data/catalogueLocations.d.ts.map +1 -0
- package/dist/lib/data/catalogueLocations.js +21 -0
- package/dist/lib/data/skills.d.ts +5 -0
- package/dist/lib/data/skills.d.ts.map +1 -0
- package/dist/lib/data/skills.js +97 -0
- package/dist/lib/forms/application.d.ts +4 -0
- package/dist/lib/forms/application.d.ts.map +1 -0
- package/dist/lib/forms/application.js +17 -0
- package/dist/lib/forms/packageEnquiry.d.ts +4 -0
- package/dist/lib/forms/packageEnquiry.d.ts.map +1 -0
- package/dist/lib/forms/packageEnquiry.js +12 -0
- package/dist/lib/forms/review.d.ts +6 -0
- package/dist/lib/forms/review.d.ts.map +1 -0
- package/dist/lib/forms/review.js +20 -0
- package/dist/lib/hooks/useSubmissionGuard.d.ts +2 -0
- package/dist/lib/hooks/useSubmissionGuard.d.ts.map +1 -0
- package/dist/lib/hooks/useSubmissionGuard.js +12 -0
- package/dist/lib/hooks/useUploadTasks.d.ts +7 -0
- package/dist/lib/hooks/useUploadTasks.d.ts.map +1 -0
- package/dist/lib/hooks/useUploadTasks.js +11 -0
- package/dist/lib/models/application.d.ts +21 -0
- package/dist/lib/models/application.d.ts.map +1 -1
- package/dist/lib/models/authorization.d.ts +1 -1
- package/dist/lib/models/authorization.d.ts.map +1 -1
- package/dist/lib/models/authorization.js +2 -0
- package/dist/lib/models/blog.d.ts +2 -2
- package/dist/lib/models/booking.d.ts +3 -0
- package/dist/lib/models/booking.d.ts.map +1 -1
- package/dist/lib/models/chat.d.ts +8 -0
- package/dist/lib/models/chat.d.ts.map +1 -1
- package/dist/lib/models/chat.js +10 -0
- package/dist/lib/models/community.d.ts +15 -0
- package/dist/lib/models/community.d.ts.map +1 -1
- package/dist/lib/models/community.js +2 -1
- package/dist/lib/models/companion.d.ts +46 -0
- package/dist/lib/models/companion.d.ts.map +1 -1
- package/dist/lib/models/discount.d.ts +20 -20
- package/dist/lib/models/enquiry.d.ts +13 -0
- package/dist/lib/models/enquiry.d.ts.map +1 -1
- package/dist/lib/models/homeBanner.d.ts +17 -0
- package/dist/lib/models/homeBanner.d.ts.map +1 -0
- package/dist/lib/models/homeBanner.js +1 -0
- package/dist/lib/models/interest.d.ts +42 -0
- package/dist/lib/models/interest.d.ts.map +1 -0
- package/dist/lib/models/interest.js +1 -0
- package/dist/lib/models/location.d.ts +1 -0
- package/dist/lib/models/location.d.ts.map +1 -1
- package/dist/lib/models/notifications.d.ts +30 -2
- package/dist/lib/models/notifications.d.ts.map +1 -1
- package/dist/lib/models/notifications.js +6 -0
- package/dist/lib/models/opportunities/freelance.d.ts +37 -4
- package/dist/lib/models/opportunities/freelance.d.ts.map +1 -1
- package/dist/lib/models/opportunities/internship.d.ts +37 -4
- package/dist/lib/models/opportunities/internship.d.ts.map +1 -1
- package/dist/lib/models/opportunities/job.d.ts +37 -4
- package/dist/lib/models/opportunities/job.d.ts.map +1 -1
- package/dist/lib/models/opportunities/opportunity.d.ts +38 -5
- package/dist/lib/models/opportunities/opportunity.d.ts.map +1 -1
- package/dist/lib/models/opportunities/opportunity.js +1 -1
- package/dist/lib/models/opportunities/volunteerJob.d.ts +37 -4
- package/dist/lib/models/opportunities/volunteerJob.d.ts.map +1 -1
- package/dist/lib/models/pricing.d.ts +2 -0
- package/dist/lib/models/pricing.d.ts.map +1 -1
- package/dist/lib/models/pricing.js +4 -0
- package/dist/lib/models/props.d.ts +4 -43
- package/dist/lib/models/props.d.ts.map +1 -1
- package/dist/lib/models/props.js +3 -121
- package/dist/lib/models/question.d.ts +14 -0
- package/dist/lib/models/question.d.ts.map +1 -0
- package/dist/lib/models/question.js +6 -0
- package/dist/lib/models/review.d.ts +13 -1
- package/dist/lib/models/review.d.ts.map +1 -1
- package/dist/lib/models/review.js +4 -0
- package/dist/lib/models/tile.d.ts +7 -1
- package/dist/lib/models/tile.d.ts.map +1 -1
- package/dist/lib/models/travelPackage.d.ts +37 -4
- package/dist/lib/models/travelPackage.d.ts.map +1 -1
- package/dist/lib/models/travelPackage.js +1 -1
- package/dist/lib/models/user.d.ts +25 -2
- package/dist/lib/models/user.d.ts.map +1 -1
- package/dist/lib/models/user.js +1 -0
- package/dist/lib/userAtom.d.ts +30 -5
- package/dist/lib/userAtom.d.ts.map +1 -1
- package/dist/lib/utils/entityTiles.d.ts.map +1 -1
- package/dist/lib/utils/entityTiles.js +3 -2
- package/dist/lib/utils/htmlDescription.d.ts +3 -0
- package/dist/lib/utils/htmlDescription.d.ts.map +1 -0
- package/dist/lib/utils/htmlDescription.js +7 -0
- package/dist/lib/utils/htmlDescription.native.d.ts +3 -0
- package/dist/lib/utils/htmlDescription.native.d.ts.map +1 -0
- package/dist/lib/utils/htmlDescription.native.js +7 -0
- package/dist/lib/utils/text.d.ts +5 -1
- package/dist/lib/utils/text.d.ts.map +1 -1
- package/dist/lib/utils/text.js +18 -6
- package/dist/lib/utils/uploadFile.d.ts +9 -0
- package/dist/lib/utils/uploadFile.d.ts.map +1 -0
- package/dist/lib/utils/uploadFile.js +9 -0
- package/dist/lib/utils/uploadTasks.d.ts +76 -0
- package/dist/lib/utils/uploadTasks.d.ts.map +1 -0
- package/dist/lib/utils/uploadTasks.js +102 -0
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import he from 'he';
|
|
2
|
+
/** Text-only mobile preview. Never evaluates HTML or requires Node DOM streams. */
|
|
3
|
+
export function extractHtmlContentDescription(html, limit = 150) {
|
|
4
|
+
const firstParagraph = /<p(?:\s[^>]*)?>([\s\S]*?)<\/p>/i.exec(html || '')?.[1] || '';
|
|
5
|
+
const paragraph = he.decode(firstParagraph.replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1>/gi, '').replace(/<[^>]*>/g, '')).trim();
|
|
6
|
+
return paragraph.length > limit ? paragraph.substring(0, limit) + '...' : paragraph;
|
|
7
|
+
}
|
package/dist/lib/utils/text.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { extractHtmlContentDescription } from './htmlDescription';
|
|
1
2
|
import { type ClassValue } from "clsx";
|
|
2
3
|
import { User } from "../models/user";
|
|
3
4
|
export declare const MAX_IMAGE_SIZE_MB = 5;
|
|
@@ -18,7 +19,6 @@ export declare function formatDuration(start: number, end: number): string;
|
|
|
18
19
|
export declare function truncateDecimal(num: number, limit: number): number;
|
|
19
20
|
export declare function sanitize<T>(input: any, keys: (keyof T)[]): T;
|
|
20
21
|
export declare const formatTimestamp: (date: Date) => string;
|
|
21
|
-
export declare function extractHtmlContentDescription(html: string, limit?: number): string;
|
|
22
22
|
export declare function createMetadata({ title, description, path, }: {
|
|
23
23
|
title?: string;
|
|
24
24
|
description?: string;
|
|
@@ -50,4 +50,8 @@ export declare function createMetadata({ title, description, path, }: {
|
|
|
50
50
|
export declare function convertEscapesToHTML(raw: string): string;
|
|
51
51
|
export declare const expertiseLevels: string[];
|
|
52
52
|
export declare function incompleteMVP(user?: User): string[];
|
|
53
|
+
/** Validate optional external work links without fetching or rewriting their display URL. */
|
|
54
|
+
export declare function getHttpUrl(value?: string): string | null;
|
|
55
|
+
/** Readable plain-text projection for listing descriptions and policy summaries. */
|
|
56
|
+
export declare function plainTextContent(value: unknown): string;
|
|
53
57
|
//# sourceMappingURL=text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/text.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAC;AAG7C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,eAAO,MAAM,eAAe,KAAK,CAAC;AAKlC,eAAO,MAAM,UAAU,UAAmB,CAAC;AAE3C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,GAAG,SAAS,WAGjD,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAG9D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBrD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWvD;AAGD,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,WACO,CAAC;AAEhE,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,WAKrC,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,MAAM,MAAM,WACE,CAAC;AAE3E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAcjE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAM5D;AAED,eAAO,MAAM,eAAe,GAAI,MAAM,IAAI,WAczC,CAAC;AAGF,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,WAAW,EACX,IAAI,GACL,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;;;;;;;;;;;;;;;;;;;;;;;EA8BA;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAaxD;AAED,eAAO,MAAM,eAAe,UAA0D,CAAC;AAEvF,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,EAAE,CAanD;AAED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxD;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEvD"}
|
package/dist/lib/utils/text.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
export { extractHtmlContentDescription } from './htmlDescription';
|
|
2
2
|
import { clsx } from "clsx";
|
|
3
3
|
import { format, formatDistanceToNow } from 'date-fns';
|
|
4
4
|
import he from "he";
|
|
@@ -113,11 +113,6 @@ export const formatTimestamp = (date) => {
|
|
|
113
113
|
return `${diffDays}d ago`;
|
|
114
114
|
return format(date, "MMM d");
|
|
115
115
|
};
|
|
116
|
-
export function extractHtmlContentDescription(html, limit = 150) {
|
|
117
|
-
const $ = load(html || '');
|
|
118
|
-
const firstParagraph = $('p').first().text().trim();
|
|
119
|
-
return truncateText(firstParagraph, limit);
|
|
120
|
-
}
|
|
121
116
|
// seo
|
|
122
117
|
export function createMetadata({ title, description, path, }) {
|
|
123
118
|
const baseUrl = "https://www.trippeaze.com";
|
|
@@ -184,3 +179,20 @@ export function incompleteMVP(user) {
|
|
|
184
179
|
}
|
|
185
180
|
return incompletions;
|
|
186
181
|
}
|
|
182
|
+
/** Validate optional external work links without fetching or rewriting their display URL. */
|
|
183
|
+
export function getHttpUrl(value) {
|
|
184
|
+
const trimmed = value?.trim() || "";
|
|
185
|
+
if (!trimmed || trimmed.length > 2000)
|
|
186
|
+
return null;
|
|
187
|
+
try {
|
|
188
|
+
const url = new URL(trimmed);
|
|
189
|
+
return url.protocol === "https:" || url.protocol === "http:" ? trimmed : null;
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Readable plain-text projection for listing descriptions and policy summaries. */
|
|
196
|
+
export function plainTextContent(value) {
|
|
197
|
+
return typeof value === "string" ? he.decode(value.replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1>/gi, "").replace(/<\/(p|div|li|h[1-6])>/gi, "\n").replace(/<br\s*\/?>/gi, "\n").replace(/<[^>]*>/g, "")).trim() : "";
|
|
198
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** One multipart asset contract for browser File objects and OS-picked native URIs. */
|
|
2
|
+
export interface NativeUploadFile {
|
|
3
|
+
uri: string;
|
|
4
|
+
name: string;
|
|
5
|
+
mimeType: string;
|
|
6
|
+
}
|
|
7
|
+
export type UploadFile = File | NativeUploadFile;
|
|
8
|
+
export declare function appendUploadFile(form: FormData, field: string, file: UploadFile): void;
|
|
9
|
+
//# sourceMappingURL=uploadFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploadFile.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/uploadFile.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,WAAW,gBAAgB;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;CAAE;AAClF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,gBAAgB,CAAC;AACjD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,QAM/E"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function appendUploadFile(form, field, file) {
|
|
2
|
+
if ('uri' in file) {
|
|
3
|
+
// React Native's FormData serializer consumes this standard native file tuple.
|
|
4
|
+
// It is not a Blob in memory and must not be fetched through an API client.
|
|
5
|
+
form.append(field, { uri: file.uri, name: file.name, type: file.mimeType });
|
|
6
|
+
}
|
|
7
|
+
else
|
|
8
|
+
form.append(field, file);
|
|
9
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { CommunityContent } from '../models/community';
|
|
2
|
+
export type UploadTaskStage = 'uploading' | 'submitting' | 'processing' | 'complete' | 'failed';
|
|
3
|
+
export declare const isUploadTaskActive: (task: UploadTask) => boolean;
|
|
4
|
+
export declare const uploadTaskSummary: (task: UploadTask) => string;
|
|
5
|
+
export interface UploadTask {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
stage: UploadTaskStage;
|
|
9
|
+
percent?: number;
|
|
10
|
+
error?: string;
|
|
11
|
+
href?: string;
|
|
12
|
+
originHref?: string;
|
|
13
|
+
retrySafe: boolean;
|
|
14
|
+
unread: boolean;
|
|
15
|
+
completeLabel?: string;
|
|
16
|
+
recoveryKey?: string;
|
|
17
|
+
attempt: number;
|
|
18
|
+
notificationSent?: boolean;
|
|
19
|
+
publication?: CommunityContent;
|
|
20
|
+
}
|
|
21
|
+
export interface UploadTaskControls {
|
|
22
|
+
progress: (percent: number) => void;
|
|
23
|
+
submitting: () => void;
|
|
24
|
+
assertCurrent: () => void;
|
|
25
|
+
}
|
|
26
|
+
export interface UploadTaskOptions<T> {
|
|
27
|
+
title: string;
|
|
28
|
+
href?: string;
|
|
29
|
+
retrySafe?: boolean;
|
|
30
|
+
operation: (controls: UploadTaskControls) => Promise<T>;
|
|
31
|
+
resultHref?: (result: T) => string | undefined;
|
|
32
|
+
body?: FormData;
|
|
33
|
+
completeLabel?: string;
|
|
34
|
+
recoveryKey?: string;
|
|
35
|
+
publication?: (result: T) => CommunityContent;
|
|
36
|
+
}
|
|
37
|
+
export declare function createUploadTaskStore(): {
|
|
38
|
+
getSnapshot: () => UploadTask[];
|
|
39
|
+
getActivity: () => {
|
|
40
|
+
open: boolean;
|
|
41
|
+
taskId: string | undefined;
|
|
42
|
+
};
|
|
43
|
+
openActivity: (taskId?: string) => void;
|
|
44
|
+
closeActivity: () => void;
|
|
45
|
+
notificationSaved: (id: string, attempt: number) => void;
|
|
46
|
+
observePublication: (id: string, content: CommunityContent) => void;
|
|
47
|
+
getResult: (id: string) => unknown;
|
|
48
|
+
captureScope: () => () => void;
|
|
49
|
+
subscribe: (listener: () => void) => () => void;
|
|
50
|
+
run: <T>(options: UploadTaskOptions<T>) => Promise<T>;
|
|
51
|
+
retry: (id: string) => Promise<unknown>;
|
|
52
|
+
dismiss: (id: string) => void;
|
|
53
|
+
markRead: () => void;
|
|
54
|
+
clear: () => void;
|
|
55
|
+
};
|
|
56
|
+
export declare const uploadTasks: {
|
|
57
|
+
getSnapshot: () => UploadTask[];
|
|
58
|
+
getActivity: () => {
|
|
59
|
+
open: boolean;
|
|
60
|
+
taskId: string | undefined;
|
|
61
|
+
};
|
|
62
|
+
openActivity: (taskId?: string) => void;
|
|
63
|
+
closeActivity: () => void;
|
|
64
|
+
notificationSaved: (id: string, attempt: number) => void;
|
|
65
|
+
observePublication: (id: string, content: CommunityContent) => void;
|
|
66
|
+
getResult: (id: string) => unknown;
|
|
67
|
+
captureScope: () => () => void;
|
|
68
|
+
subscribe: (listener: () => void) => () => void;
|
|
69
|
+
run: <T>(options: UploadTaskOptions<T>) => Promise<T>;
|
|
70
|
+
retry: (id: string) => Promise<unknown>;
|
|
71
|
+
dismiss: (id: string) => void;
|
|
72
|
+
markRead: () => void;
|
|
73
|
+
clear: () => void;
|
|
74
|
+
};
|
|
75
|
+
export declare function runUploadTask<T>(options: UploadTaskOptions<T>): Promise<T>;
|
|
76
|
+
//# sourceMappingURL=uploadTasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploadTasks.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/uploadTasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;AAChG,eAAO,MAAM,kBAAkB,GAAI,MAAM,UAAU,YAAmE,CAAC;AACvH,eAAO,MAAM,iBAAiB,GAAI,MAAM,UAAU,WAAof,CAAC;AACviB,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AACD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AACD,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;IAC/C,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,gBAAgB,CAAC;CAC/C;AAID,wBAAgB,qBAAqB;;;;gBAMgB,MAAM,GAAG,SAAS;;4BAkC3C,MAAM;;4BAEN,MAAM,WAAW,MAAM;6BACtB,MAAM,WAAW,gBAAgB;oBAO1C,MAAM;;0BAKA,MAAM,IAAI;UAC1B,CAAC,WAAW,iBAAiB,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC;gBAQjC,MAAM;kBAMV,MAAM;;;EAIvB;AAED,eAAO,MAAM,WAAW;;;;gBAtE6B,MAAM,GAAG,SAAS;;4BAkC3C,MAAM;;4BAEN,MAAM,WAAW,MAAM;6BACtB,MAAM,WAAW,gBAAgB;oBAO1C,MAAM;;0BAKA,MAAM,IAAI;UAC1B,CAAC,WAAW,iBAAiB,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC;gBAQjC,MAAM;kBAMV,MAAM;;;CAM0B,CAAC;AACnD,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAW1E"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { getNativeTransport, nativeInteractionGuard } from '../actions/nativeTransport';
|
|
2
|
+
export const isUploadTaskActive = (task) => ['uploading', 'submitting', 'processing'].includes(task.stage);
|
|
3
|
+
export const uploadTaskSummary = (task) => task.stage === 'processing' ? task.publication?.processingState === 'ready' ? 'Waiting for staff review' : task.publication?.publicationJob?.paused ? 'Processing paused' : task.publication?.processingState === 'pending' ? 'Queued for processing' : task.publication?.processingStage === 'automated_review' ? 'Reviewing caption' : 'Preparing media' : task.stage === 'submitting' ? 'Waiting for server confirmation' : task.percent === undefined ? 'Starting upload…' : `Uploading · ${task.percent}%`;
|
|
4
|
+
// In-memory work deliberately outlives route components. Files and request bodies
|
|
5
|
+
// are never written to browser storage; server-accepted jobs remain server-owned.
|
|
6
|
+
export function createUploadTaskStore() {
|
|
7
|
+
let tasks = [];
|
|
8
|
+
const listeners = new Set();
|
|
9
|
+
const operations = new Map();
|
|
10
|
+
let sequence = 0;
|
|
11
|
+
let generation = 0;
|
|
12
|
+
let activity = { open: false, taskId: undefined };
|
|
13
|
+
const results = new Map();
|
|
14
|
+
const notify = () => listeners.forEach(listener => listener());
|
|
15
|
+
const update = (id, patch) => {
|
|
16
|
+
if (!tasks.some(task => task.id === id))
|
|
17
|
+
return;
|
|
18
|
+
tasks = tasks.map(task => task.id === id ? { ...task, ...patch } : task);
|
|
19
|
+
notify();
|
|
20
|
+
};
|
|
21
|
+
const execute = async (id, options) => {
|
|
22
|
+
const currentGeneration = generation;
|
|
23
|
+
const assertCurrent = () => { if (generation !== currentGeneration)
|
|
24
|
+
throw new Error('The account changed. Return to your draft before continuing.'); };
|
|
25
|
+
update(id, { stage: 'uploading', percent: undefined, error: undefined, unread: false, notificationSent: false, attempt: (tasks.find(task => task.id === id)?.attempt || 0) + 1 });
|
|
26
|
+
try {
|
|
27
|
+
const result = await options.operation({
|
|
28
|
+
progress: percent => update(id, { percent: Math.min(100, Math.max(0, percent)), stage: percent >= 100 ? 'submitting' : 'uploading' }),
|
|
29
|
+
submitting: () => update(id, { stage: 'submitting' }),
|
|
30
|
+
assertCurrent,
|
|
31
|
+
});
|
|
32
|
+
assertCurrent();
|
|
33
|
+
results.set(id, result);
|
|
34
|
+
const publication = options.publication?.(result);
|
|
35
|
+
const pending = publication && !['failed'].includes(publication.processingState || '') && !['rejected', 'hidden'].includes(publication.moderationState || '') && !(publication.processingState === 'ready' && publication.moderationState === 'approved');
|
|
36
|
+
const failed = publication && (publication.processingState === 'failed' || ['rejected', 'hidden'].includes(publication.moderationState || ''));
|
|
37
|
+
update(id, { stage: pending ? 'processing' : failed ? 'failed' : 'complete', publication, percent: undefined, href: options.resultHref?.(result) || options.href, unread: true });
|
|
38
|
+
operations.delete(id);
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
update(id, { stage: 'failed', percent: undefined, error: error instanceof Error ? error.message : 'This upload could not finish.', unread: true });
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
getSnapshot: () => tasks,
|
|
48
|
+
getActivity: () => activity,
|
|
49
|
+
openActivity: (taskId) => { activity = { open: true, taskId }; notify(); },
|
|
50
|
+
closeActivity: () => { activity = { open: false, taskId: undefined }; notify(); },
|
|
51
|
+
notificationSaved: (id, attempt) => { if (tasks.find(task => task.id === id)?.attempt === attempt)
|
|
52
|
+
update(id, { notificationSent: true }); },
|
|
53
|
+
observePublication: (id, content) => {
|
|
54
|
+
const task = tasks.find(task => task.id === id);
|
|
55
|
+
if (!task || task.stage !== 'processing' || !task.publication || (content.processingVersion || 0) < (task.publication.processingVersion || 0))
|
|
56
|
+
return;
|
|
57
|
+
const failed = content.processingState === 'failed' || ['rejected', 'hidden'].includes(content.moderationState || '');
|
|
58
|
+
const complete = content.processingState === 'ready' && content.moderationState === 'approved';
|
|
59
|
+
update(id, { publication: content, stage: failed ? 'failed' : complete ? 'complete' : 'processing', retrySafe: false, notificationSent: task.notificationSent, error: failed ? 'Open your post status to check available recovery.' : undefined });
|
|
60
|
+
},
|
|
61
|
+
getResult: (id) => results.get(id),
|
|
62
|
+
captureScope: () => {
|
|
63
|
+
const current = generation;
|
|
64
|
+
return () => { if (generation !== current)
|
|
65
|
+
throw new Error('The account changed. Return to your draft before continuing.'); };
|
|
66
|
+
},
|
|
67
|
+
subscribe: (listener) => { listeners.add(listener); return () => { listeners.delete(listener); }; },
|
|
68
|
+
run: (options) => {
|
|
69
|
+
const id = `upload-${Date.now()}-${++sequence}`;
|
|
70
|
+
options = { ...options, href: options.href || (typeof window !== 'undefined' && window.location ? window.location.pathname + window.location.search : undefined) };
|
|
71
|
+
operations.set(id, options);
|
|
72
|
+
tasks = [...tasks, { id, title: options.title, stage: 'uploading', href: options.href, originHref: options.href, retrySafe: !!options.retrySafe, unread: false, completeLabel: options.completeLabel, recoveryKey: options.recoveryKey, attempt: 0 }];
|
|
73
|
+
notify();
|
|
74
|
+
return execute(id, options);
|
|
75
|
+
},
|
|
76
|
+
retry: async (id) => {
|
|
77
|
+
const task = tasks.find(item => item.id === id);
|
|
78
|
+
const options = operations.get(id);
|
|
79
|
+
if (!task || task.stage !== 'failed' || !task.retrySafe || !options)
|
|
80
|
+
throw new Error('Check your dashboard before submitting again.');
|
|
81
|
+
return execute(id, options);
|
|
82
|
+
},
|
|
83
|
+
dismiss: (id) => { if (tasks.some(task => task.id === id && isUploadTaskActive(task)))
|
|
84
|
+
return; tasks = tasks.filter(task => task.id !== id); operations.delete(id); results.delete(id); notify(); },
|
|
85
|
+
markRead: () => { tasks = tasks.map(task => ({ ...task, unread: false })); notify(); },
|
|
86
|
+
clear: () => { generation++; tasks = []; activity = { open: false, taskId: undefined }; operations.clear(); results.clear(); notify(); },
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export const uploadTasks = createUploadTaskStore();
|
|
90
|
+
export function runUploadTask(options) {
|
|
91
|
+
if (getNativeTransport()) {
|
|
92
|
+
const assertCurrent = nativeInteractionGuard();
|
|
93
|
+
return uploadTasks.run({ ...options, operation: controls => options.operation({
|
|
94
|
+
...controls,
|
|
95
|
+
assertCurrent: () => { controls.assertCurrent(); assertCurrent(); },
|
|
96
|
+
}) }).then(result => { assertCurrent(); return result; });
|
|
97
|
+
}
|
|
98
|
+
const silentDraft = options.body && options.body.get('status') === 'draft' && !Array.from(options.body.values()).some(value => typeof value !== 'string' && value.size > 0);
|
|
99
|
+
if (typeof window === 'undefined' || silentDraft)
|
|
100
|
+
return options.operation({ progress: () => { }, submitting: () => { }, assertCurrent: () => { } });
|
|
101
|
+
return uploadTasks.run(options);
|
|
102
|
+
}
|