arky-sdk 0.1.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/api/cms.d.ts +19 -0
- package/dist/api/cms.d.ts.map +1 -0
- package/dist/api/cms.js +41 -0
- package/dist/api/eshop.d.ts +89 -0
- package/dist/api/eshop.d.ts.map +1 -0
- package/dist/api/eshop.js +183 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +5 -0
- package/dist/api/newsletter.d.ts +32 -0
- package/dist/api/newsletter.d.ts.map +1 -0
- package/dist/api/newsletter.js +70 -0
- package/dist/api/reservation.d.ts +84 -0
- package/dist/api/reservation.d.ts.map +1 -0
- package/dist/api/reservation.js +239 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +20 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/services/auth.d.ts +17 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +62 -0
- package/dist/services/http.d.ts +20 -0
- package/dist/services/http.d.ts.map +1 -0
- package/dist/services/http.js +73 -0
- package/dist/stores/business.d.ts +28 -0
- package/dist/stores/business.d.ts.map +1 -0
- package/dist/stores/business.js +122 -0
- package/dist/stores/cart.d.ts +8 -0
- package/dist/stores/cart.d.ts.map +1 -0
- package/dist/stores/cart.js +20 -0
- package/dist/stores/eshop.d.ts +121 -0
- package/dist/stores/eshop.d.ts.map +1 -0
- package/dist/stores/eshop.js +377 -0
- package/dist/stores/index.d.ts +7 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +19 -0
- package/dist/stores/reservation.d.ts +237 -0
- package/dist/stores/reservation.d.ts.map +1 -0
- package/dist/stores/reservation.js +853 -0
- package/dist/types/index.d.ts +244 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/utils/blocks.d.ts +30 -0
- package/dist/utils/blocks.d.ts.map +1 -0
- package/dist/utils/blocks.js +237 -0
- package/dist/utils/currency.d.ts +9 -0
- package/dist/utils/currency.d.ts.map +1 -0
- package/dist/utils/currency.js +99 -0
- package/dist/utils/errors.d.ts +121 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +114 -0
- package/dist/utils/i18n.d.ts +5 -0
- package/dist/utils/i18n.d.ts.map +1 -0
- package/dist/utils/i18n.js +37 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/price.d.ts +33 -0
- package/dist/utils/price.d.ts.map +1 -0
- package/dist/utils/price.js +141 -0
- package/dist/utils/queryParams.d.ts +21 -0
- package/dist/utils/queryParams.d.ts.map +1 -0
- package/dist/utils/queryParams.js +47 -0
- package/dist/utils/svg.d.ts +17 -0
- package/dist/utils/svg.d.ts.map +1 -0
- package/dist/utils/svg.js +62 -0
- package/dist/utils/text.d.ts +26 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +64 -0
- package/dist/utils/timezone.d.ts +9 -0
- package/dist/utils/timezone.d.ts.map +1 -0
- package/dist/utils/timezone.js +49 -0
- package/dist/utils/validation.d.ts +9 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +44 -0
- package/package.json +58 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
export interface Payment {
|
|
2
|
+
currency: string;
|
|
3
|
+
market: string;
|
|
4
|
+
subtotal: number;
|
|
5
|
+
shipping: number;
|
|
6
|
+
discount: number;
|
|
7
|
+
tax: number;
|
|
8
|
+
total: number;
|
|
9
|
+
promoCodeId?: string;
|
|
10
|
+
promoCode?: string;
|
|
11
|
+
promoType?: string;
|
|
12
|
+
promoValue?: number;
|
|
13
|
+
method: PaymentMethod;
|
|
14
|
+
customerId?: string;
|
|
15
|
+
paymentIntentId?: string;
|
|
16
|
+
subscriptionId?: string;
|
|
17
|
+
priceId?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare enum PaymentMethod {
|
|
20
|
+
Cash = "CASH",
|
|
21
|
+
CreditCard = "CREDIT_CARD",
|
|
22
|
+
Free = "FREE"
|
|
23
|
+
}
|
|
24
|
+
export interface QuoteLineItem {
|
|
25
|
+
itemType: string;
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
quantity: number;
|
|
29
|
+
unitPrice: number;
|
|
30
|
+
total: number;
|
|
31
|
+
}
|
|
32
|
+
export interface PromoCodeValidation {
|
|
33
|
+
id: string;
|
|
34
|
+
code: string;
|
|
35
|
+
discountType: any;
|
|
36
|
+
discountValue: number;
|
|
37
|
+
conditions: any[];
|
|
38
|
+
}
|
|
39
|
+
export interface Quote {
|
|
40
|
+
currency: string;
|
|
41
|
+
market: string;
|
|
42
|
+
subtotal: number;
|
|
43
|
+
shipping: number;
|
|
44
|
+
discount: number;
|
|
45
|
+
tax: number;
|
|
46
|
+
total: number;
|
|
47
|
+
lineItems: QuoteLineItem[];
|
|
48
|
+
shippingMethod: ShippingMethod | null;
|
|
49
|
+
promoCode: PromoCodeValidation | null;
|
|
50
|
+
payment: Payment;
|
|
51
|
+
chargeAmount: number;
|
|
52
|
+
}
|
|
53
|
+
export interface Price {
|
|
54
|
+
market: string;
|
|
55
|
+
amount: number;
|
|
56
|
+
compareAt?: number;
|
|
57
|
+
}
|
|
58
|
+
export interface Location {
|
|
59
|
+
country?: string | null;
|
|
60
|
+
address?: string | null;
|
|
61
|
+
city?: string | null;
|
|
62
|
+
postalCode?: string | null;
|
|
63
|
+
countryCode?: string | null;
|
|
64
|
+
coordinates?: {
|
|
65
|
+
lat: number;
|
|
66
|
+
lon: number;
|
|
67
|
+
} | null;
|
|
68
|
+
}
|
|
69
|
+
export interface Zone {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
countries: string[];
|
|
73
|
+
taxBps: number;
|
|
74
|
+
shippingMethods: ShippingMethod[];
|
|
75
|
+
}
|
|
76
|
+
export interface EshopCartItem {
|
|
77
|
+
id: string;
|
|
78
|
+
productId: string;
|
|
79
|
+
variantId: string;
|
|
80
|
+
productName: string;
|
|
81
|
+
productSlug: string;
|
|
82
|
+
variantAttributes: Record<string, any>;
|
|
83
|
+
price: Price;
|
|
84
|
+
quantity: number;
|
|
85
|
+
addedAt: number;
|
|
86
|
+
}
|
|
87
|
+
export interface ReservationCartPart {
|
|
88
|
+
id: string;
|
|
89
|
+
serviceId: string;
|
|
90
|
+
serviceName: string;
|
|
91
|
+
date: string;
|
|
92
|
+
from: number;
|
|
93
|
+
to: number;
|
|
94
|
+
timeText: string;
|
|
95
|
+
isMultiDay: boolean;
|
|
96
|
+
reservationMethod: string;
|
|
97
|
+
providerId?: string;
|
|
98
|
+
blocks: any[];
|
|
99
|
+
}
|
|
100
|
+
export interface PaymentProviderConfig {
|
|
101
|
+
type: "STRIPE";
|
|
102
|
+
publicKey: string;
|
|
103
|
+
secretKey: string;
|
|
104
|
+
webhookSecret: string;
|
|
105
|
+
}
|
|
106
|
+
export interface Market {
|
|
107
|
+
id: string;
|
|
108
|
+
name: string;
|
|
109
|
+
currency: string;
|
|
110
|
+
taxMode: "INCLUSIVE" | "EXCLUSIVE";
|
|
111
|
+
taxBps: number;
|
|
112
|
+
paymentMethods: BusinessPaymentMethod[];
|
|
113
|
+
}
|
|
114
|
+
export interface ShippingMethod {
|
|
115
|
+
id: string;
|
|
116
|
+
type: 'SHIPPING' | 'PICKUP';
|
|
117
|
+
prices: Price[];
|
|
118
|
+
taxable: boolean;
|
|
119
|
+
etaText: string;
|
|
120
|
+
location?: Location;
|
|
121
|
+
}
|
|
122
|
+
export interface BusinessPaymentMethod {
|
|
123
|
+
method: PaymentMethod;
|
|
124
|
+
}
|
|
125
|
+
export interface BusinessConfig {
|
|
126
|
+
orderBlocks?: any[];
|
|
127
|
+
reservationBlocks?: any[];
|
|
128
|
+
markets?: Market[];
|
|
129
|
+
zones?: Zone[];
|
|
130
|
+
paymentProvider?: PaymentProviderConfig;
|
|
131
|
+
aiProvider?: any;
|
|
132
|
+
}
|
|
133
|
+
export interface Business {
|
|
134
|
+
id: string;
|
|
135
|
+
name: string;
|
|
136
|
+
configs?: BusinessConfig;
|
|
137
|
+
}
|
|
138
|
+
export interface EshopStoreState {
|
|
139
|
+
businessId: string;
|
|
140
|
+
selectedShippingMethodId: string | null;
|
|
141
|
+
userToken: string | null;
|
|
142
|
+
processingCheckout: boolean;
|
|
143
|
+
loading: boolean;
|
|
144
|
+
error: string | null;
|
|
145
|
+
phoneNumber: string;
|
|
146
|
+
phoneError: string | null;
|
|
147
|
+
verificationCode: string;
|
|
148
|
+
verifyError: string | null;
|
|
149
|
+
}
|
|
150
|
+
export interface Block {
|
|
151
|
+
id: string;
|
|
152
|
+
key: string;
|
|
153
|
+
type: string;
|
|
154
|
+
properties?: any;
|
|
155
|
+
value?: any;
|
|
156
|
+
}
|
|
157
|
+
export interface ApiResponse<T> {
|
|
158
|
+
success: boolean;
|
|
159
|
+
data?: T;
|
|
160
|
+
error?: string;
|
|
161
|
+
code?: string;
|
|
162
|
+
cursor?: string;
|
|
163
|
+
total?: number;
|
|
164
|
+
}
|
|
165
|
+
export interface PaginatedResponse<T> {
|
|
166
|
+
data: T[];
|
|
167
|
+
meta?: {
|
|
168
|
+
total: number;
|
|
169
|
+
page: number;
|
|
170
|
+
per_page: number;
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
export interface Newsletter {
|
|
174
|
+
id: string;
|
|
175
|
+
businessId: string;
|
|
176
|
+
name: string;
|
|
177
|
+
description: string;
|
|
178
|
+
newsletterType: "FREE" | "PAID";
|
|
179
|
+
statuses: any[];
|
|
180
|
+
prices: Price[];
|
|
181
|
+
paymentProduct?: {
|
|
182
|
+
priceId: string;
|
|
183
|
+
};
|
|
184
|
+
unsubscribeRedirectUrl: string;
|
|
185
|
+
createdAt: number;
|
|
186
|
+
updatedAt: number;
|
|
187
|
+
}
|
|
188
|
+
export interface MarketConfigClient {
|
|
189
|
+
currency: string;
|
|
190
|
+
taxMode: string;
|
|
191
|
+
defaultTaxRate: number;
|
|
192
|
+
paymentMethods: string[];
|
|
193
|
+
showTaxIncluded: boolean;
|
|
194
|
+
shippingMethods?: ShippingMethod[];
|
|
195
|
+
}
|
|
196
|
+
export interface ReservationStoreState {
|
|
197
|
+
currentStep: number;
|
|
198
|
+
totalSteps: number;
|
|
199
|
+
steps: Record<number, {
|
|
200
|
+
name: string;
|
|
201
|
+
labelKey: string;
|
|
202
|
+
}>;
|
|
203
|
+
weekdays: string[];
|
|
204
|
+
monthYear: string;
|
|
205
|
+
days: any[];
|
|
206
|
+
current: Date;
|
|
207
|
+
selectedDate: string | null;
|
|
208
|
+
slots: any[];
|
|
209
|
+
selectedSlot: any | null;
|
|
210
|
+
selectedMethod: string | null;
|
|
211
|
+
selectedProvider: any | null;
|
|
212
|
+
providers: any[];
|
|
213
|
+
loading: boolean;
|
|
214
|
+
startDate: string | null;
|
|
215
|
+
endDate: string | null;
|
|
216
|
+
isMultiDay: boolean;
|
|
217
|
+
phoneNumber: string;
|
|
218
|
+
phoneError: string | null;
|
|
219
|
+
phoneSuccess: string | null;
|
|
220
|
+
verificationCode: string;
|
|
221
|
+
verifyError: string | null;
|
|
222
|
+
isPhoneVerified: boolean;
|
|
223
|
+
isSendingCode: boolean;
|
|
224
|
+
isVerifying: boolean;
|
|
225
|
+
codeSentAt: number | null;
|
|
226
|
+
canResendAt: number | null;
|
|
227
|
+
guestToken: string | null;
|
|
228
|
+
service: any | null;
|
|
229
|
+
business: Business | null;
|
|
230
|
+
currency: string;
|
|
231
|
+
reservationBlocks: Block[];
|
|
232
|
+
apiUrl: string;
|
|
233
|
+
businessId: string;
|
|
234
|
+
storageUrl: string;
|
|
235
|
+
timezone: string;
|
|
236
|
+
tzGroups: any;
|
|
237
|
+
parts: ReservationCartPart[];
|
|
238
|
+
allowedPaymentMethods: string[];
|
|
239
|
+
paymentConfig: {
|
|
240
|
+
provider: PaymentProviderConfig | null;
|
|
241
|
+
enabled: boolean;
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Core type definitions
|
|
2
|
+
// All types are exported individually for better tree-shaking
|
|
3
|
+
export var PaymentMethod;
|
|
4
|
+
(function (PaymentMethod) {
|
|
5
|
+
PaymentMethod["Cash"] = "CASH";
|
|
6
|
+
PaymentMethod["CreditCard"] = "CREDIT_CARD";
|
|
7
|
+
PaymentMethod["Free"] = "FREE";
|
|
8
|
+
})(PaymentMethod || (PaymentMethod = {}));
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface Block {
|
|
2
|
+
id: string;
|
|
3
|
+
key: string;
|
|
4
|
+
type: string;
|
|
5
|
+
properties: any;
|
|
6
|
+
value: any;
|
|
7
|
+
}
|
|
8
|
+
export interface Collection {
|
|
9
|
+
id: string;
|
|
10
|
+
blocks: Block[];
|
|
11
|
+
}
|
|
12
|
+
export interface CollectionEntry {
|
|
13
|
+
id: string;
|
|
14
|
+
collection_id: string;
|
|
15
|
+
blocks: Block[];
|
|
16
|
+
}
|
|
17
|
+
export declare function getBlockLabel(block: any, locale?: string): string;
|
|
18
|
+
export declare function formatBlockValue(block: any): string;
|
|
19
|
+
export declare function prepareBlocksForSubmission(formData: any): any[];
|
|
20
|
+
export declare function extractBlockValues(blocks: any[]): Record<string, any>;
|
|
21
|
+
export declare function getBlockTextValue(block: any, locale?: string): string;
|
|
22
|
+
export declare const getBlockValue: (entry: any, blockKey: string) => any;
|
|
23
|
+
export declare const getBlockValues: (entry: any, blockKey: string) => any;
|
|
24
|
+
export declare const getBlockObjectValues: (entry: any, blockKey: string, locale?: string) => any;
|
|
25
|
+
export declare const getBlockFromArray: (entry: any, blockKey: string, locale?: string) => any;
|
|
26
|
+
export declare const getImageUrl: (imageBlock: any, isBlock?: boolean) => any;
|
|
27
|
+
export declare function getGalleryThumbnail(gallery: any): any;
|
|
28
|
+
export declare function thumbnailUrl(service: any): string;
|
|
29
|
+
export declare const translateMap: (labels: any, lang: string, fallback?: string) => any;
|
|
30
|
+
//# sourceMappingURL=blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/utils/blocks.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,KAAK;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,GAAG,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,KAAK,EAAE,CAAC;CACnB;AAGD,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAmBvE;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CA8BnD;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,CAa/D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAYrE;AAGD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,GAAE,MAAa,GAAG,MAAM,CAgB3E;AAGD,eAAO,MAAM,aAAa,GAAI,OAAO,GAAG,EAAE,UAAU,MAAM,QAQzD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,GAAG,EAAE,UAAU,MAAM,QAQ1D,CAAC;AAgCF,eAAO,MAAM,oBAAoB,GAAI,OAAO,GAAG,EAAE,UAAU,MAAM,EAAE,eAAa,QAkB/E,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,GAAG,EAAE,UAAU,MAAM,EAAE,eAAa,QAW5E,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,YAAY,GAAG,EAAE,iBAAc,QA4D1D,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,GAAG,OAK/C;AAGD,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,UAIxC;AAED,eAAO,MAAM,YAAY,GAAI,QAAQ,GAAG,EAAE,MAAM,MAAM,EAAE,iBAAoB,QAiB3E,CAAC"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
// Block utilities (extracted from index.ts)
|
|
2
|
+
import { STORAGE_URL } from '../config';
|
|
3
|
+
export function getBlockLabel(block, locale = 'en') {
|
|
4
|
+
if (!block)
|
|
5
|
+
return "";
|
|
6
|
+
if (block.properties?.label) {
|
|
7
|
+
if (typeof block.properties.label === "object") {
|
|
8
|
+
return (block.properties.label[locale] ||
|
|
9
|
+
block.properties.label.en ||
|
|
10
|
+
Object.values(block.properties.label)[0] ||
|
|
11
|
+
"");
|
|
12
|
+
}
|
|
13
|
+
if (typeof block.properties.label === "string") {
|
|
14
|
+
return block.properties.label;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Convert key to readable format
|
|
18
|
+
return block.key?.replace(/_/g, ' ').replace(/\b\w/g, (l) => l.toUpperCase()) || "";
|
|
19
|
+
}
|
|
20
|
+
export function formatBlockValue(block) {
|
|
21
|
+
if (!block || block.value === null || block.value === undefined) {
|
|
22
|
+
return "";
|
|
23
|
+
}
|
|
24
|
+
switch (block.type) {
|
|
25
|
+
case "BOOLEAN":
|
|
26
|
+
return block.value ? "Yes" : "No";
|
|
27
|
+
case "NUMBER":
|
|
28
|
+
// Handle date/datetime variants
|
|
29
|
+
if (block.properties?.variant === "DATE" || block.properties?.variant === "DATE_TIME") {
|
|
30
|
+
try {
|
|
31
|
+
return new Date(block.value).toLocaleDateString();
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
return String(block.value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return String(block.value);
|
|
38
|
+
case "RELATIONSHIP":
|
|
39
|
+
if (Array.isArray(block.value) && block.value.length > 0) {
|
|
40
|
+
const firstValue = block.value[0];
|
|
41
|
+
if (firstValue && firstValue.mimeType) {
|
|
42
|
+
return firstValue.name || firstValue.id || "Media";
|
|
43
|
+
}
|
|
44
|
+
return firstValue.title || firstValue.name || firstValue.id || "Entry";
|
|
45
|
+
}
|
|
46
|
+
return String(block.value);
|
|
47
|
+
default:
|
|
48
|
+
return String(block.value);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function prepareBlocksForSubmission(formData) {
|
|
52
|
+
const preparedBlocks = [];
|
|
53
|
+
Object.keys(formData).forEach((key) => {
|
|
54
|
+
if (formData[key] !== null && formData[key] !== undefined) {
|
|
55
|
+
preparedBlocks.push({
|
|
56
|
+
key,
|
|
57
|
+
value: [formData[key]],
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
return preparedBlocks;
|
|
62
|
+
}
|
|
63
|
+
export function extractBlockValues(blocks) {
|
|
64
|
+
const values = {};
|
|
65
|
+
blocks.forEach((block) => {
|
|
66
|
+
if (block.value && block.value.length > 0) {
|
|
67
|
+
values[block.key] = block.value[0];
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
values[block.key] = null;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return values;
|
|
74
|
+
}
|
|
75
|
+
// Extract localized text value from a block, handling multilingual content
|
|
76
|
+
export function getBlockTextValue(block, locale = 'en') {
|
|
77
|
+
if (!block || !block.value || block.value.length === 0)
|
|
78
|
+
return '';
|
|
79
|
+
const firstValue = block.value[0];
|
|
80
|
+
// Handle multilingual object
|
|
81
|
+
if (typeof firstValue === 'object' && firstValue !== null) {
|
|
82
|
+
// Try specified locale first, then 'en', then first available language
|
|
83
|
+
if (firstValue[locale])
|
|
84
|
+
return firstValue[locale];
|
|
85
|
+
if (firstValue.en)
|
|
86
|
+
return firstValue.en;
|
|
87
|
+
const values = Object.values(firstValue);
|
|
88
|
+
return String(values[0] || '');
|
|
89
|
+
}
|
|
90
|
+
// Handle simple string
|
|
91
|
+
return String(firstValue);
|
|
92
|
+
}
|
|
93
|
+
// Legacy functions for backward compatibility
|
|
94
|
+
export const getBlockValue = (entry, blockKey) => {
|
|
95
|
+
if (!entry || !entry.blocks)
|
|
96
|
+
return null;
|
|
97
|
+
const block = entry.blocks.find((f) => f.key === blockKey);
|
|
98
|
+
if (!block || !block.value || block.value.length === 0)
|
|
99
|
+
return null;
|
|
100
|
+
return block.value[0];
|
|
101
|
+
};
|
|
102
|
+
export const getBlockValues = (entry, blockKey) => {
|
|
103
|
+
if (!entry || !entry.blocks)
|
|
104
|
+
return null;
|
|
105
|
+
const block = entry.blocks.find((f) => f.key === blockKey);
|
|
106
|
+
if (!block || !block.value || block.value.length === 0)
|
|
107
|
+
return null;
|
|
108
|
+
return block.value;
|
|
109
|
+
};
|
|
110
|
+
function unwrapBlock(block, locale) {
|
|
111
|
+
if (!block?.type || block.value === undefined)
|
|
112
|
+
return block;
|
|
113
|
+
// Nested objects / lists → recurse for every child
|
|
114
|
+
if (block.type === "BLOCK") {
|
|
115
|
+
return block.value.map((obj) => {
|
|
116
|
+
const parsed = {};
|
|
117
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
118
|
+
parsed[k] = unwrapBlock(v, locale);
|
|
119
|
+
}
|
|
120
|
+
return parsed;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
// Primitive leaves (text/number/boolean/media …)
|
|
124
|
+
const isLocalized = block.type === "TEXT";
|
|
125
|
+
const isList = block.properties?.ui === "list" ||
|
|
126
|
+
(block.properties?.maxValues ?? 1) > 1 ||
|
|
127
|
+
block.value.length > 1;
|
|
128
|
+
if (isList) {
|
|
129
|
+
return isLocalized
|
|
130
|
+
? block.value.map((v) => v[locale] || v["en"])
|
|
131
|
+
: [...block.value];
|
|
132
|
+
}
|
|
133
|
+
return isLocalized ? block.value[0][locale] || block.value[0]["en"] : block.value[0];
|
|
134
|
+
}
|
|
135
|
+
export const getBlockObjectValues = (entry, blockKey, locale = "en") => {
|
|
136
|
+
if (!entry) {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
const values = getBlockValues(entry, blockKey); // top‑level list
|
|
140
|
+
const parsed = values.map((obj) => {
|
|
141
|
+
const res = obj.value.reduce((acc, current) => {
|
|
142
|
+
acc[current.key] = unwrapBlock(current, locale);
|
|
143
|
+
return acc;
|
|
144
|
+
}, {});
|
|
145
|
+
return res;
|
|
146
|
+
});
|
|
147
|
+
return parsed;
|
|
148
|
+
};
|
|
149
|
+
export const getBlockFromArray = (entry, blockKey, locale = "en") => {
|
|
150
|
+
if (!entry) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
const values = getBlockValues(entry, blockKey); // top‑level list
|
|
154
|
+
return values.reduce((acc, current) => {
|
|
155
|
+
acc[current.key] = unwrapBlock(current, locale);
|
|
156
|
+
return acc;
|
|
157
|
+
});
|
|
158
|
+
};
|
|
159
|
+
export const getImageUrl = (imageBlock, isBlock = true) => {
|
|
160
|
+
if (!imageBlock)
|
|
161
|
+
return null;
|
|
162
|
+
const storageUrl = "https://storage.arky.io/dev"; // STORAGE_URL || "https://storage.arky.io/dev";
|
|
163
|
+
// Helper to check if URL is external
|
|
164
|
+
const isExternalUrl = (url) => {
|
|
165
|
+
return url.startsWith('http://') || url.startsWith('https://');
|
|
166
|
+
};
|
|
167
|
+
// Handle relationship blocks with media
|
|
168
|
+
if (imageBlock.type === 'RELATIONSHIP' && Array.isArray(imageBlock.value)) {
|
|
169
|
+
const mediaValue = imageBlock.value[0];
|
|
170
|
+
if (mediaValue && mediaValue.mimeType) {
|
|
171
|
+
// Handle media with resolutions structure
|
|
172
|
+
if (mediaValue.resolutions && mediaValue.resolutions.original && mediaValue.resolutions.original.url) {
|
|
173
|
+
const url = mediaValue.resolutions.original.url;
|
|
174
|
+
return isExternalUrl(url) ? url : `${storageUrl}/${url}`;
|
|
175
|
+
}
|
|
176
|
+
// Handle direct URL on media
|
|
177
|
+
if (mediaValue.url) {
|
|
178
|
+
return isExternalUrl(mediaValue.url) ? mediaValue.url : `${storageUrl}/${mediaValue.url}`;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
if (isBlock) {
|
|
184
|
+
if (typeof imageBlock === "string") {
|
|
185
|
+
// Check if it's already a full URL
|
|
186
|
+
if (isExternalUrl(imageBlock)) {
|
|
187
|
+
return imageBlock;
|
|
188
|
+
}
|
|
189
|
+
return `${storageUrl}/${imageBlock}`;
|
|
190
|
+
}
|
|
191
|
+
if (imageBlock.url) {
|
|
192
|
+
// Check if it's already a full URL
|
|
193
|
+
if (isExternalUrl(imageBlock.url)) {
|
|
194
|
+
return imageBlock.url;
|
|
195
|
+
}
|
|
196
|
+
return `${storageUrl}/${imageBlock.url}`;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (imageBlock.resolutions &&
|
|
200
|
+
imageBlock.resolutions.original &&
|
|
201
|
+
imageBlock.resolutions.original.url) {
|
|
202
|
+
const url = imageBlock.resolutions.original.url;
|
|
203
|
+
// Check if it's already a full URL
|
|
204
|
+
if (isExternalUrl(url)) {
|
|
205
|
+
return url;
|
|
206
|
+
}
|
|
207
|
+
return `${storageUrl}/${url}`;
|
|
208
|
+
}
|
|
209
|
+
return null;
|
|
210
|
+
};
|
|
211
|
+
export function getGalleryThumbnail(gallery) {
|
|
212
|
+
if (!gallery?.length)
|
|
213
|
+
return null;
|
|
214
|
+
const item = gallery.find((g) => g.settings.isThumbnail) || gallery[0];
|
|
215
|
+
const res = item.media.resolutions.thumbnail || item.media.resolutions.original;
|
|
216
|
+
return res?.url || null;
|
|
217
|
+
}
|
|
218
|
+
// full URL or null
|
|
219
|
+
export function thumbnailUrl(service) {
|
|
220
|
+
const storageUrl = STORAGE_URL || "";
|
|
221
|
+
const path = getGalleryThumbnail(service.gallery);
|
|
222
|
+
return path ? `${storageUrl}/${path}` : null;
|
|
223
|
+
}
|
|
224
|
+
export const translateMap = (labels, lang, fallback = "unknown") => {
|
|
225
|
+
let parsedLang = "en";
|
|
226
|
+
if (lang === "sr") {
|
|
227
|
+
parsedLang = "bih";
|
|
228
|
+
}
|
|
229
|
+
if (!labels) {
|
|
230
|
+
return fallback;
|
|
231
|
+
}
|
|
232
|
+
const label = labels[parsedLang];
|
|
233
|
+
if (!label) {
|
|
234
|
+
return fallback;
|
|
235
|
+
}
|
|
236
|
+
return label;
|
|
237
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps currency codes to their display symbols
|
|
3
|
+
*/
|
|
4
|
+
export declare function getCurrencySymbol(currency: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Formats a price with the appropriate currency symbol
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatCurrencyAmount(amount: number, currency: string): string;
|
|
9
|
+
//# sourceMappingURL=currency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["../../src/utils/currency.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmF1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY7E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps currency codes to their display symbols
|
|
3
|
+
*/
|
|
4
|
+
export function getCurrencySymbol(currency) {
|
|
5
|
+
const currencySymbols = {
|
|
6
|
+
USD: '$',
|
|
7
|
+
EUR: '€',
|
|
8
|
+
GBP: '£',
|
|
9
|
+
CAD: 'C$',
|
|
10
|
+
AUD: 'A$',
|
|
11
|
+
JPY: '¥',
|
|
12
|
+
CHF: 'CHF',
|
|
13
|
+
SEK: 'kr',
|
|
14
|
+
NOK: 'kr',
|
|
15
|
+
DKK: 'kr',
|
|
16
|
+
PLN: 'zł',
|
|
17
|
+
CZK: 'Kč',
|
|
18
|
+
HUF: 'Ft',
|
|
19
|
+
RON: 'lei',
|
|
20
|
+
BGN: 'лв',
|
|
21
|
+
HRK: 'kn',
|
|
22
|
+
RSD: 'дин',
|
|
23
|
+
BAM: 'KM',
|
|
24
|
+
MKD: 'ден',
|
|
25
|
+
ALL: 'L',
|
|
26
|
+
TRY: '₺',
|
|
27
|
+
RUB: '₽',
|
|
28
|
+
UAH: '₴',
|
|
29
|
+
BYN: 'Br',
|
|
30
|
+
CNY: '¥',
|
|
31
|
+
INR: '₹',
|
|
32
|
+
KRW: '₩',
|
|
33
|
+
THB: '฿',
|
|
34
|
+
VND: '₫',
|
|
35
|
+
SGD: 'S$',
|
|
36
|
+
MYR: 'RM',
|
|
37
|
+
IDR: 'Rp',
|
|
38
|
+
PHP: '₱',
|
|
39
|
+
BRL: 'R$',
|
|
40
|
+
ARS: '$',
|
|
41
|
+
CLP: '$',
|
|
42
|
+
COP: '$',
|
|
43
|
+
PEN: 'S/',
|
|
44
|
+
MXN: '$',
|
|
45
|
+
ZAR: 'R',
|
|
46
|
+
EGP: 'E£',
|
|
47
|
+
NGN: '₦',
|
|
48
|
+
KES: 'KSh',
|
|
49
|
+
GHS: '₵',
|
|
50
|
+
MAD: 'DH',
|
|
51
|
+
TND: 'د.ت',
|
|
52
|
+
DZD: 'د.ج',
|
|
53
|
+
LYD: 'ل.د',
|
|
54
|
+
AED: 'د.إ',
|
|
55
|
+
SAR: 'ر.س',
|
|
56
|
+
QAR: 'ر.ق',
|
|
57
|
+
KWD: 'د.ك',
|
|
58
|
+
BHD: 'ب.د',
|
|
59
|
+
OMR: 'ر.ع',
|
|
60
|
+
JOD: 'د.أ',
|
|
61
|
+
LBP: 'ل.ل',
|
|
62
|
+
SYP: 'ل.س',
|
|
63
|
+
IQD: 'ع.د',
|
|
64
|
+
IRR: '﷼',
|
|
65
|
+
AFN: '؋',
|
|
66
|
+
PKR: '₨',
|
|
67
|
+
LKR: '₨',
|
|
68
|
+
NPR: '₨',
|
|
69
|
+
BDT: '৳',
|
|
70
|
+
MMK: 'K',
|
|
71
|
+
LAK: '₭',
|
|
72
|
+
KHR: '៛',
|
|
73
|
+
MNT: '₮',
|
|
74
|
+
KZT: '₸',
|
|
75
|
+
UZS: 'лв',
|
|
76
|
+
KGS: 'лв',
|
|
77
|
+
TJS: 'SM',
|
|
78
|
+
TMT: 'T',
|
|
79
|
+
AZN: '₼',
|
|
80
|
+
GEL: '₾',
|
|
81
|
+
AMD: '֏',
|
|
82
|
+
BYR: 'p.',
|
|
83
|
+
MDL: 'L'
|
|
84
|
+
};
|
|
85
|
+
return currencySymbols[currency.toUpperCase()] || currency;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Formats a price with the appropriate currency symbol
|
|
89
|
+
*/
|
|
90
|
+
export function formatCurrencyAmount(amount, currency) {
|
|
91
|
+
const symbol = getCurrencySymbol(currency);
|
|
92
|
+
const formattedAmount = (amount / 100).toFixed(2);
|
|
93
|
+
// For some currencies, symbol goes after the amount
|
|
94
|
+
const symbolAfterCurrencies = ['SEK', 'NOK', 'DKK', 'PLN', 'CZK', 'HUF', 'RON', 'BGN', 'HRK'];
|
|
95
|
+
if (symbolAfterCurrencies.includes(currency.toUpperCase())) {
|
|
96
|
+
return `${formattedAmount} ${symbol}`;
|
|
97
|
+
}
|
|
98
|
+
return `${symbol}${formattedAmount}`;
|
|
99
|
+
}
|