@restaround/react 1.2.20 → 1.3.3
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/constants/index.d.ts +1 -0
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models/index.esm.js +1 -1
- package/dist/models/index.esm.js.map +1 -1
- package/dist/models/index.js +1 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/menu.d.ts +3 -0
- package/dist/models/models/menu.d.ts +3 -0
- package/dist/models/modules/business/models.d.ts +29 -2
- package/dist/models/modules/feature/models.d.ts +5 -0
- package/dist/models/modules/order/models.d.ts +11 -2
- package/dist/modules/business/models.d.ts +29 -2
- package/dist/modules/customer/hooks.d.ts +1 -0
- package/dist/modules/customer/utils.d.ts +2 -1
- package/dist/modules/feature/constants.d.ts +4 -0
- package/dist/modules/feature/hooks.d.ts +1 -1
- package/dist/modules/feature/models.d.ts +5 -0
- package/dist/modules/order/constants.d.ts +2 -1
- package/dist/modules/order/hooks.d.ts +3 -2
- package/dist/modules/order/models.d.ts +11 -2
- package/dist/modules/order/services.d.ts +4 -2
- package/dist/services/translation/locales/az/customer.d.ts +1 -0
- package/dist/services/translation/locales/az/error.d.ts +2 -0
- package/dist/services/translation/locales/az/index.d.ts +3 -0
- package/dist/services/translation/locales/en/error.d.ts +2 -0
- package/dist/services/translation/locales/en/index.d.ts +2 -0
- package/dist/services/translation/locales/et/error.d.ts +2 -0
- package/dist/services/translation/locales/et/index.d.ts +2 -0
- package/dist/services/translation/locales/index.d.ts +15 -0
- package/dist/services/translation/locales/nl/error.d.ts +2 -0
- package/dist/services/translation/locales/nl/index.d.ts +2 -0
- package/dist/services/translation/locales/ru/customer.d.ts +1 -0
- package/dist/services/translation/locales/ru/error.d.ts +2 -0
- package/dist/services/translation/locales/ru/index.d.ts +3 -0
- package/dist/services/translation/locales/tr/customer.d.ts +1 -0
- package/dist/services/translation/locales/tr/error.d.ts +2 -0
- package/dist/services/translation/locales/tr/index.d.ts +3 -0
- package/dist/store/order.d.ts +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.esm.js.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/models/menu.d.ts +3 -0
- package/dist/utils/modules/business/models.d.ts +29 -2
- package/dist/utils/modules/customer/utils.d.ts +7 -0
- package/dist/utils/modules/feature/models.d.ts +5 -0
- package/dist/utils/modules/order/models.d.ts +11 -2
- package/dist/utils/modules/view/utils.d.ts +6 -0
- package/dist/utils/utils/index.d.ts +1 -0
- package/package.json +6 -6
|
@@ -8,6 +8,8 @@ declare const _default: {
|
|
|
8
8
|
INVALID_OTP: string;
|
|
9
9
|
OTP_RATE_LIMIT_EXCEEDED: string;
|
|
10
10
|
"Invalid Email Address": string;
|
|
11
|
+
FEATURE_NOT_AVAILABLE_FOR_SEGMENT: string;
|
|
12
|
+
ORDER_TYPE_DISABLED_FOR_BUSINESS: string;
|
|
11
13
|
};
|
|
12
14
|
common: {
|
|
13
15
|
Save: string;
|
|
@@ -119,6 +121,7 @@ declare const _default: {
|
|
|
119
121
|
Lachin: string;
|
|
120
122
|
Kalbajar: string;
|
|
121
123
|
Khankendi: string;
|
|
124
|
+
Nakhchivan: string;
|
|
122
125
|
};
|
|
123
126
|
auth: {
|
|
124
127
|
"Create an account or log in": string;
|
package/dist/store/order.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ type OrderContent = {
|
|
|
22
22
|
removeAllProductVariants: (productId: number) => void;
|
|
23
23
|
setIsOrderOpen: Dispatch<React.SetStateAction<boolean>>;
|
|
24
24
|
getCustomer: () => void;
|
|
25
|
+
resetOrder: () => void;
|
|
25
26
|
};
|
|
26
27
|
export declare const OrderProvider: ({ children }: {
|
|
27
28
|
children: ReactNode;
|
package/dist/utils/index.d.ts
CHANGED
package/dist/utils/index.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{isEmpty as t,priceFormatter as r}from"@sorocraft/js-utils";const
|
|
1
|
+
import{isEmpty as t,priceFormatter as r,checkIsValidEmail as n}from"@sorocraft/js-utils";const e=(t,r)=>{var n,e;return(null===(e=null===(n=null==t?void 0:t.translations)||void 0===n?void 0:n.find)||void 0===e?void 0:e.call(n,(t=>t.language===r)))||{}},o=(r,n,o)=>{var i;const a=null===(i=null==n?void 0:n.find)||void 0===i?void 0:i.call(n,(({id:t})=>t===r));if(t(a))return"";const{name:l}=e(a,o);return l},i=(t=0,r=1,n=0)=>t*r*(1+n/100),a="https://images.restaround.co",l=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${a}/${t}`:"",d=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${a}/${t}`:"https://images.restaround.co/no-photo-128.webp",s=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${a}/${t}`:"https://images.restaround.co/restaround-doodle.webp",u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c=(t,r,n)=>u.charAt(t>>2)+u.charAt((3&t)<<4|r>>4)+u.charAt((15&r)<<2|n>>6)+u.charAt(63&n),v=(t,r,n)=>`data:image/gif;base64,R0lGODlhAQABAPAA${c(0,t,r)+c(n,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`,p=(t,r)=>{const n=r.reduce(((t,r)=>{if(!r.visible)return t;const n=Number(r.categoryId);return t[n]||(t[n]=[]),t[n].push(r),t}),{});return t.map((t=>Object.assign(Object.assign({},t),{products:n[Number(t.id)]||[]}))).filter((t=>{var r;return(null===(r=null==t?void 0:t.products)||void 0===r?void 0:r.length)>0}))},f=(t,r)=>{var n,e;return(null===(e=null===(n=null==t?void 0:t.translations)||void 0===n?void 0:n.find)||void 0===e?void 0:e.call(n,(t=>t.language===r)))||{}},A=(t,r)=>{var n,e;return(null===(e=null===(n=null==t?void 0:t.translations)||void 0===n?void 0:n.find)||void 0===e?void 0:e.call(n,(t=>t.language===r)))||{}},g=({option:t,currency:n="USD",language:e="en"})=>{const{price:o}=t||{};return{totalPrice:o,formattedTotalPrice:r(o,n,e)}},m=(t,r)=>{var n;return(null===(n=((null==t?void 0:t.options)||[]).find((({id:t})=>t===r)))||void 0===n?void 0:n.price)||0},h=(t,r,n)=>{var e;if(Array.isArray(r))return t.filter((({id:t})=>r.includes(t))).map((({translations:t})=>{var r;return(null===(r=t.find((t=>t.language===n)))||void 0===r?void 0:r.title)||""})).filter(Boolean).join(", ");{const o=t.find((({id:t})=>t===r));return(null===(e=null==o?void 0:o.translations.find((t=>t.language===n)))||void 0===e?void 0:e.title)||""}},b=(t,r)=>{var n,e,o;return(null===(o=null===(e=null===(n=null==t?void 0:t.translations)||void 0===n?void 0:n.find)||void 0===e?void 0:e.call(n,(t=>t.language===r)))||void 0===o?void 0:o.title)||""};var E;!function(t){t.SINGLE="SINGLE",t.MULTIPLE="MULTIPLE"}(E||(E={}));const y=(t,r)=>{var n,e;return(null===(e=null===(n=null==t?void 0:t.translations)||void 0===n?void 0:n.find)||void 0===e?void 0:e.call(n,(t=>t.language===r)))||{}},P=(t,r=1)=>{const{price:n=0,vat:e=0}=t||{};return i(n,r,e)},I=(t,n,e,o=1)=>{const i=P(t,o);return{totalPrice:i,formattedTotalPrice:r(i,n,e)}},$=(t,r)=>{var n,e;return(null===(e=null===(n=null==t?void 0:t.variants)||void 0===n?void 0:n.find)||void 0===e?void 0:e.call(n,(t=>t.id===r)))||{}},T=(t,r={},n)=>((null==t?void 0:t.addons)||[]).filter((t=>Object.prototype.hasOwnProperty.call(r,t.id))).reduce(((t,n)=>{const{id:e,selectType:o}=n;if(o===E.SINGLE){const o=r[e];return t+m(n,o)}return t+(r[e]||[]).reduce(((t,r)=>t+m(n,r)),0)}),0)*n,O=(t,r,n)=>{const e=$(r,t),{vat:o}=r||{},{price:a}=e||{};return i(a,n,o)},N=({variantId:t,currency:n="USD",language:e="en",product:o,quantity:i=1})=>{const a=O(t,o,i);return{totalPrice:a,formattedTotalPrice:r(a,n,e)}},j=(t,r)=>{var n,e;return(null===(e=null===(n=null==t?void 0:t.translations)||void 0===n?void 0:n.find)||void 0===e?void 0:e.call(n,(t=>t.language===r)))||{}},L=({product:r,variantId:n,quantity:e=1,selectedAddons:o,noVat:i=!1})=>{if(t(r))return{price:0,optionsPrice:0,total:0};const a=Object.assign(Object.assign({},r),{vat:i?0:r.vat}),l=T(a,o,e),d=n?O(n,a,e):P(a,e);return{price:d,optionsPrice:l,total:d+l}},V=({product:t,variantId:n,quantity:e=1,currency:o,language:i,selectedAddons:a,noVat:l=!1})=>{const{total:d}=L({product:t,variantId:n,quantity:e,selectedAddons:a,noVat:l});return{totalPrice:d,formattedTotalPrice:r(d,o,i)}},x=(t,r)=>((null==t?void 0:t.addons)||[]).find((({id:t})=>t===r))||{},R=(t=[],r)=>r*t.reduce(((t,r)=>t+r.price),0),W=(t,n,e)=>{let o=0,i=0;for(const r of t.items){const n=(a=r.price,l=r.quantity,d=r.addons,l*a+R(d,l));o+=n,void 0===t.vat&&r.vat&&(i+=n*r.vat/100)}var a,l,d;void 0!==t.vat&&(i=o*t.vat/100);const s=o+i;return{totalWithoutTax:o,totalWithoutTaxFormatted:r(o,n,e),totalTax:i,totalTaxFormatted:r(i,n,e),totalWithTax:s,totalWithTaxFormatted:r(s,n,e)}},D=(t,r,n)=>{if(!t)throw new Error("Product ID is required");let e=`${t}`;r&&(e+=`-${r}`);const o=Object.entries(n||{}).map((([t,r])=>{if(!t||!r)return null;const n=Array.isArray(r)?r.filter(Boolean).join("-"):`${r}`;return n?`${t}-${n}`:null})).filter(Boolean).join("-");return o&&(e+=`-${o}`),e},w=t=>{var r;const{price:n,variant:e,addons:o,quantity:i,vat:a}=t||{},l=null!==(r=null==e?void 0:e.price)&&void 0!==r?r:n,d=l+(o||[]).reduce(((t,r)=>t+r.price),0),s=l*(a/100),u=d+s;return{totalGross:u*i,totalNet:d*i,totalTax:s*i,itemGrossPrice:u,itemNetPrice:d,itemTax:s}},B=t=>((null==t?void 0:t.addons)||[]).reduce(((t,{addonId:r,optionId:n})=>(t[r]=n,t)),{}),q={994:t=>{const r=["50","51","10","55","99","70","77","60"];return new RegExp(`^(${r.join("|")})\\d{7}$`).test(t)?{isValid:!0}:{isValid:!1,error:`Azerbaijani numbers must be 9 digits and start with ${r.join(", ")}`}},31:t=>/^\d{9}$/.test(t)?{isValid:!0}:{isValid:!1,error:"Dutch numbers must be exactly 9 digits"}};function M(t){if(!t)return{isValid:!1,error:"FIELD_REQUIRED"};const r=t.replace(/\D/g,""),n=r.startsWith("994")?"994":r.startsWith("31")?"31":null;if(!n)return{isValid:!1,error:"Unsupported country code"};const e=r.slice(n.length);return(0,q[n])(e)}var U,G;!function(t){t.PHONE="PHONE",t.OTP="OTP",t.EMAIL="EMAIL"}(U||(U={})),function(t){t.HOME="HOME",t.WORK="WORK",t.TRAVEL="TRAVEL"}(G||(G={}));const H=t=>`${t.countryCode}${t.phoneNumber}`.replaceAll("+",""),F=(t,r)=>{const e={},{phoneNumber:o,email:i,otp:a}=t||{};switch(r){case U.PHONE:{const{isValid:t,error:r}=M(o);t||(e.phoneNumber=r);break}case U.OTP:{const{isValid:t,error:r}=M(o);t||(e.phoneNumber=r),a&&6===a.length||(e.otp="Invalid OTP");break}case U.EMAIL:i&&n(i)||(e.email="Invalid Email Address")}return e},S=t=>{const r="FIELD_REQUIRED",n={},{countryCode:e,cityName:o,street:i,houseNumber:a}=t||{};return e||(n.countryCode=r),o||(n.cityName=r),i||(n.street=r),a||(n.houseNumber=r),n},z=t=>(t||[]).filter(Boolean).join(", "),C=(t,r,n)=>[t,[r,n].filter(Boolean).join("/")].filter(Boolean).join(" "),Q="restaround.co",k=[Q,"restaround.az","restaround.ee","restaround.nl"],K=(t,r)=>{const n=k.includes(t)?t:Q;return{url:`https://${n}/${r||"en"}`,domain:n}},_=t=>"az"===t?"az":"co",J=(t,r)=>`https://app.restaround.${_(t)}/auth/register?lang=${t}&utm_source=${r}`;export{a as IMAGE_BASE_URL,i as calculateTotalPrice,C as formatAddressLine,z as formatCityLine,D as generateOrderItemsId,m as getAddonOptionRawPrice,A as getAddonOptionTranslation,b as getAddonTitle,f as getAddonTranslation,K as getBaseUrl,o as getCategoryNameById,e as getCategoryTranslation,s as getCoverImageSource,l as getImageSource,d as getLogoImageSource,g as getOptionPrice,h as getOptionTitles,R as getOrderAddonsPrice,w as getOrderItemPrice,W as getOrderPrice,x as getProductAddon,V as getProductOrderPrice,L as getProductOrderRawPrice,I as getProductPrice,P as getProductRawPrice,y as getProductTranslation,$ as getProductVariant,N as getProductVariantPrice,O as getProductVariantRawPrice,j as getProductVariantTranslation,J as getRegisterUrl,B as getSelectedAddonsFromOrderItems,T as getSelectedOptionsTotalPrice,_ as getTLD,p as prepareCategoryAndProductMap,H as preparePhoneNumber,v as rgbDataURL,S as validateAddressForm,F as validateForm};
|
|
2
2
|
//# sourceMappingURL=index.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../../../src/utils/category.ts","../../../src/utils/common.ts","../../../src/utils/image.ts","../../../src/utils/menu.ts","../../../src/modules/addon/utils.ts","../../../src/modules/addon/models.ts","../../../src/modules/product/utils.ts","../../../src/modules/order/utils.ts","../../../src/utils/constants.ts","../../../src/utils/url.ts"],"sourcesContent":["import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","export const calculateTotalPrice = (price: number = 0, quantity: number = 1, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","import { Category, CategoryProductMap, Product } from \"src/models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: Category[],\n\tproducts: Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, Product[]>>((map, product) => {\n\t\tif (!product.visible) return map;\n\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"./models\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\n};\n\nexport const getOptionPrice = ({\n\toption,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n}: {\n\toption: MenuAddonOption;\n\tcurrency?: string;\n\tlanguage?: string;\n}) => {\n\tconst { price } = option || {};\n\n\treturn {\n\t\ttotalPrice: price,\n\t\tformattedTotalPrice: priceFormatter(price, currency, language),\n\t};\n};\n\nexport const getAddonOptionRawPrice = (addon: MenuAddon, optionId: number): number => {\n\treturn (addon?.options || []).find(({ id }) => id === optionId)?.price || 0;\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn options\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = options.find(({ id }) => id === optionIds);\n\t\treturn option?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon?.translations?.find?.((t) => t.language === language)?.title || \"\";\n};\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { Product, ProductTranslation, ProductVariant, ProductVariantTranslation } from \"./models\";\n\nimport { calculateTotalPrice } from \"src/utils/common\";\nimport { MenuAddon, MenuAddonSelectType } from \"src/modules/addon/models\";\nimport { getAddonOptionRawPrice } from \"src/modules/addon/utils\";\nimport * as orderModels from \"src/modules/order/models\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductRawPrice = (product: Product, quantity: number = 1) => {\n\tconst { price = 0, vat = 0 } = product || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst totalPrice = getProductRawPrice(product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getSelectedOptionsTotalPrice = (\n\tproduct: Product,\n\tselectedAddons: orderModels.SelectedAddons = {},\n\tquantity: number\n): number => {\n\t// Filter addons that are selected by the user\n\tconst selectedAddonsList = (product?.addons || []).filter((addon) =>\n\t\tObject.prototype.hasOwnProperty.call(selectedAddons, addon.id)\n\t);\n\n\t// Calculate the total price\n\tconst optionsTotalPrice = selectedAddonsList.reduce((total: number, addon: MenuAddon) => {\n\t\tconst { id: addonId, selectType } = addon;\n\n\t\t// Handle SINGLE selection\n\t\tif (selectType === MenuAddonSelectType.SINGLE) {\n\t\t\tconst selectedOptionId = selectedAddons[addonId] as number;\n\t\t\treturn total + getAddonOptionRawPrice(addon, selectedOptionId);\n\t\t}\n\n\t\t// Handle MULTIPLE selection\n\t\tconst selectedOptionIds = (selectedAddons[addonId] || []) as number[];\n\t\tconst multipleOptionsPrice = selectedOptionIds.reduce(\n\t\t\t(multipleTotal, optionId) => multipleTotal + getAddonOptionRawPrice(addon, optionId),\n\t\t\t0\n\t\t);\n\n\t\treturn total + multipleOptionsPrice;\n\t}, 0);\n\n\treturn optionsTotalPrice * quantity;\n};\n\nexport const getProductVariantRawPrice = (\n\tvariantId: number,\n\tproduct: Product,\n\tquantity?: number\n) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst totalPrice = getProductVariantRawPrice(variantId, product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslation => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslation;\n};\n\nexport const getProductOrderRawPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}): { price: number; optionsPrice: number; total: number } => {\n\tif (isEmpty(product)) return { price: 0, optionsPrice: 0, total: 0 };\n\n\tconst productData: Product = { ...product, vat: noVat ? 0 : product.vat };\n\tconst selectedOptionsTotalPrice = getSelectedOptionsTotalPrice(\n\t\tproductData,\n\t\tselectedAddons,\n\t\tquantity\n\t);\n\tconst price = variantId\n\t\t? getProductVariantRawPrice(variantId, productData, quantity)\n\t\t: getProductRawPrice(productData, quantity);\n\n\treturn {\n\t\tprice,\n\t\toptionsPrice: selectedOptionsTotalPrice,\n\t\ttotal: price + selectedOptionsTotalPrice,\n\t};\n};\n\nexport const getProductOrderPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}) => {\n\tconst { total } = getProductOrderRawPrice({\n\t\tproduct,\n\t\tvariantId,\n\t\tquantity,\n\t\tselectedAddons,\n\t\tnoVat,\n\t});\n\n\treturn {\n\t\ttotalPrice: total,\n\t\tformattedTotalPrice: priceFormatter(total, currency, language),\n\t};\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { Order, OrderAddon, OrderItem, SelectedAddons } from \"./models\";\n\nexport const getOrderAddonsPrice = (orderAddons: OrderAddon[] = [], quantity: number): number => {\n\tconst totalOrderAddonsPrice = orderAddons.reduce((sum, current) => sum + current.price, 0);\n\n\treturn quantity * totalOrderAddonsPrice;\n};\n\nexport const getOrderPrice = (order: Order, currency: string, language: string) => {\n\tconst calculateItemTotal = (price: number, quantity: number, addons: OrderAddon[]) => {\n\t\treturn quantity * price + getOrderAddonsPrice(addons, quantity);\n\t};\n\n\tlet totalWithoutTax = 0;\n\tlet totalTax = 0;\n\n\tfor (const item of order.items) {\n\t\tconst itemTotal = calculateItemTotal(item.price, item.quantity, item.addons);\n\t\ttotalWithoutTax += itemTotal;\n\n\t\tif (order.vat === undefined && item.vat) {\n\t\t\ttotalTax += (itemTotal * item.vat) / 100;\n\t\t}\n\t}\n\n\tif (order.vat !== undefined) {\n\t\ttotalTax = (totalWithoutTax * order.vat) / 100;\n\t}\n\n\tconst totalWithTax = totalWithoutTax + totalTax;\n\n\treturn {\n\t\ttotalWithoutTax,\n\t\ttotalWithoutTaxFormatted: priceFormatter(totalWithoutTax, currency, language),\n\t\ttotalTax,\n\t\ttotalTaxFormatted: priceFormatter(totalTax, currency, language),\n\t\ttotalWithTax,\n\t\ttotalWithTaxFormatted: priceFormatter(totalWithTax, currency, language),\n\t};\n};\n\nexport const generateOrderItemsId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons: SelectedAddons\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the order items ID base with productId and variantId\n\tlet orderItemsId = `${productId}`;\n\tif (variantId) {\n\t\torderItemsId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option) ? option.filter(Boolean).join(\"-\") : `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\torderItemsId += `-${addonIdsPart}`;\n\t}\n\n\treturn orderItemsId;\n};\n\nexport const getOrderItemPrice = (orderItem: OrderItem) => {\n\tconst { price, variant, addons, quantity, vat } = orderItem || {};\n\tconst basePrice = variant?.price ?? price;\n\tconst addonsPrice = (addons || []).reduce((sum, addon) => sum + addon.price, 0);\n\n\tconst itemNetPrice = basePrice + addonsPrice;\n\t// Currently VAT is applied only on basePrice, not on addons\n\t// TODO: Re-evaluate for European market where tax may apply to addons too\n\tconst itemTax = basePrice * (vat / 100);\n\tconst itemGrossPrice = itemNetPrice + itemTax;\n\n\tconst totalNet = itemNetPrice * quantity;\n\tconst totalTax = itemTax * quantity;\n\tconst totalGross = itemGrossPrice * quantity;\n\n\treturn {\n\t\ttotalGross,\n\t\ttotalNet,\n\t\ttotalTax,\n\t\titemGrossPrice,\n\t\titemNetPrice,\n\t\titemTax,\n\t};\n};\n\nexport const getSelectedAddonsFromOrderItems = (item: OrderItem): SelectedAddons => {\n\tconst selectedAddons: SelectedAddons = (item?.addons || []).reduce(\n\t\t(acc, { addonId, optionId }) => {\n\t\t\tacc[addonId] = optionId;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{}\n\t);\n\n\treturn selectedAddons;\n};\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n\nexport const getTLD = (language: string) => {\n\treturn language === \"az\" ? \"az\" : \"co\";\n};\n\nexport const getRegisterUrl = (language: string, source: string) => {\n\tconst tld = getTLD(language);\n\n\treturn `https://app.restaround.${tld}/auth/register?lang=${language}&utm_source=${source}`;\n};\n"],"names":["getCategoryTranslation","category","language","_b","_a","translations","find","call","item","getCategoryNameById","categoryId","categories","id","isEmpty","name","calculateTotalPrice","price","quantity","vat","IMAGE_BASE_URL","getImageSource","image","includes","startsWith","getLogoImageSource","logoImage","getCoverImageSource","coverImage","keyStr","triplet","e1","e2","e3","charAt","rgbDataURL","r","g","b","prepareCategoryAndProductMap","products","productMap","reduce","map","product","visible","Number","push","Object","assign","filter","length","getAddonTranslation","addon","getAddonOptionTranslation","option","getOptionPrice","currency","totalPrice","formattedTotalPrice","priceFormatter","getAddonOptionRawPrice","optionId","options","getOptionTitles","optionIds","Array","isArray","t","title","Boolean","join","getAddonTitle","_c","MenuAddonSelectType","getProductTranslation","getProductRawPrice","getProductPrice","getProductVariant","variantId","variants","getSelectedOptionsTotalPrice","selectedAddons","addons","prototype","hasOwnProperty","total","addonId","selectType","SINGLE","selectedOptionId","multipleTotal","getProductVariantRawPrice","variant","getProductVariantPrice","getProductVariantTranslation","getProductOrderRawPrice","noVat","optionsPrice","productData","selectedOptionsTotalPrice","getProductOrderPrice","getProductAddon","getOrderAddonsPrice","orderAddons","sum","current","getOrderPrice","order","totalWithoutTax","totalTax","items","itemTotal","undefined","totalWithTax","totalWithoutTaxFormatted","totalTaxFormatted","totalWithTaxFormatted","generateOrderItemsId","productId","Error","orderItemsId","addonIdsPart","entries","getOrderItemPrice","orderItem","basePrice","itemNetPrice","itemTax","itemGrossPrice","totalGross","totalNet","getSelectedAddonsFromOrderItems","acc","CO_DOMAIN","DOMAINS","getBaseUrl","hostname","domain","url","getTLD","getRegisterUrl","source"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../src/utils/category.ts","../../../src/utils/common.ts","../../../src/utils/image.ts","../../../src/utils/menu.ts","../../../src/modules/addon/utils.ts","../../../src/modules/addon/models.ts","../../../src/modules/product/utils.ts","../../../src/modules/order/utils.ts","../../../src/modules/view/utils.ts","../../../src/modules/customer/models.ts","../../../src/modules/customer/utils.ts","../../../src/utils/constants.ts","../../../src/utils/url.ts"],"sourcesContent":["import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","export const calculateTotalPrice = (price: number = 0, quantity: number = 1, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","import { Category, CategoryProductMap, Product } from \"src/models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: Category[],\n\tproducts: Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, Product[]>>((map, product) => {\n\t\tif (!product.visible) return map;\n\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"./models\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\n};\n\nexport const getOptionPrice = ({\n\toption,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n}: {\n\toption: MenuAddonOption;\n\tcurrency?: string;\n\tlanguage?: string;\n}) => {\n\tconst { price } = option || {};\n\n\treturn {\n\t\ttotalPrice: price,\n\t\tformattedTotalPrice: priceFormatter(price, currency, language),\n\t};\n};\n\nexport const getAddonOptionRawPrice = (addon: MenuAddon, optionId: number): number => {\n\treturn (addon?.options || []).find(({ id }) => id === optionId)?.price || 0;\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn options\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = options.find(({ id }) => id === optionIds);\n\t\treturn option?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon?.translations?.find?.((t) => t.language === language)?.title || \"\";\n};\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { Product, ProductTranslation, ProductVariant, ProductVariantTranslation } from \"./models\";\n\nimport { calculateTotalPrice } from \"src/utils/common\";\nimport { MenuAddon, MenuAddonSelectType } from \"src/modules/addon/models\";\nimport { getAddonOptionRawPrice } from \"src/modules/addon/utils\";\nimport * as orderModels from \"src/modules/order/models\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductRawPrice = (product: Product, quantity: number = 1) => {\n\tconst { price = 0, vat = 0 } = product || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst totalPrice = getProductRawPrice(product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getSelectedOptionsTotalPrice = (\n\tproduct: Product,\n\tselectedAddons: orderModels.SelectedAddons = {},\n\tquantity: number\n): number => {\n\t// Filter addons that are selected by the user\n\tconst selectedAddonsList = (product?.addons || []).filter((addon) =>\n\t\tObject.prototype.hasOwnProperty.call(selectedAddons, addon.id)\n\t);\n\n\t// Calculate the total price\n\tconst optionsTotalPrice = selectedAddonsList.reduce((total: number, addon: MenuAddon) => {\n\t\tconst { id: addonId, selectType } = addon;\n\n\t\t// Handle SINGLE selection\n\t\tif (selectType === MenuAddonSelectType.SINGLE) {\n\t\t\tconst selectedOptionId = selectedAddons[addonId] as number;\n\t\t\treturn total + getAddonOptionRawPrice(addon, selectedOptionId);\n\t\t}\n\n\t\t// Handle MULTIPLE selection\n\t\tconst selectedOptionIds = (selectedAddons[addonId] || []) as number[];\n\t\tconst multipleOptionsPrice = selectedOptionIds.reduce(\n\t\t\t(multipleTotal, optionId) => multipleTotal + getAddonOptionRawPrice(addon, optionId),\n\t\t\t0\n\t\t);\n\n\t\treturn total + multipleOptionsPrice;\n\t}, 0);\n\n\treturn optionsTotalPrice * quantity;\n};\n\nexport const getProductVariantRawPrice = (\n\tvariantId: number,\n\tproduct: Product,\n\tquantity?: number\n) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst totalPrice = getProductVariantRawPrice(variantId, product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslation => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslation;\n};\n\nexport const getProductOrderRawPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}): { price: number; optionsPrice: number; total: number } => {\n\tif (isEmpty(product)) return { price: 0, optionsPrice: 0, total: 0 };\n\n\tconst productData: Product = { ...product, vat: noVat ? 0 : product.vat };\n\tconst selectedOptionsTotalPrice = getSelectedOptionsTotalPrice(\n\t\tproductData,\n\t\tselectedAddons,\n\t\tquantity\n\t);\n\tconst price = variantId\n\t\t? getProductVariantRawPrice(variantId, productData, quantity)\n\t\t: getProductRawPrice(productData, quantity);\n\n\treturn {\n\t\tprice,\n\t\toptionsPrice: selectedOptionsTotalPrice,\n\t\ttotal: price + selectedOptionsTotalPrice,\n\t};\n};\n\nexport const getProductOrderPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}) => {\n\tconst { total } = getProductOrderRawPrice({\n\t\tproduct,\n\t\tvariantId,\n\t\tquantity,\n\t\tselectedAddons,\n\t\tnoVat,\n\t});\n\n\treturn {\n\t\ttotalPrice: total,\n\t\tformattedTotalPrice: priceFormatter(total, currency, language),\n\t};\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { Order, OrderAddon, OrderItem, SelectedAddons } from \"./models\";\n\nexport const getOrderAddonsPrice = (orderAddons: OrderAddon[] = [], quantity: number): number => {\n\tconst totalOrderAddonsPrice = orderAddons.reduce((sum, current) => sum + current.price, 0);\n\n\treturn quantity * totalOrderAddonsPrice;\n};\n\nexport const getOrderPrice = (order: Order, currency: string, language: string) => {\n\tconst calculateItemTotal = (price: number, quantity: number, addons: OrderAddon[]) => {\n\t\treturn quantity * price + getOrderAddonsPrice(addons, quantity);\n\t};\n\n\tlet totalWithoutTax = 0;\n\tlet totalTax = 0;\n\n\tfor (const item of order.items) {\n\t\tconst itemTotal = calculateItemTotal(item.price, item.quantity, item.addons);\n\t\ttotalWithoutTax += itemTotal;\n\n\t\tif (order.vat === undefined && item.vat) {\n\t\t\ttotalTax += (itemTotal * item.vat) / 100;\n\t\t}\n\t}\n\n\tif (order.vat !== undefined) {\n\t\ttotalTax = (totalWithoutTax * order.vat) / 100;\n\t}\n\n\tconst totalWithTax = totalWithoutTax + totalTax;\n\n\treturn {\n\t\ttotalWithoutTax,\n\t\ttotalWithoutTaxFormatted: priceFormatter(totalWithoutTax, currency, language),\n\t\ttotalTax,\n\t\ttotalTaxFormatted: priceFormatter(totalTax, currency, language),\n\t\ttotalWithTax,\n\t\ttotalWithTaxFormatted: priceFormatter(totalWithTax, currency, language),\n\t};\n};\n\nexport const generateOrderItemsId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons: SelectedAddons\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the order items ID base with productId and variantId\n\tlet orderItemsId = `${productId}`;\n\tif (variantId) {\n\t\torderItemsId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option) ? option.filter(Boolean).join(\"-\") : `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\torderItemsId += `-${addonIdsPart}`;\n\t}\n\n\treturn orderItemsId;\n};\n\nexport const getOrderItemPrice = (orderItem: OrderItem) => {\n\tconst { price, variant, addons, quantity, vat } = orderItem || {};\n\tconst basePrice = variant?.price ?? price;\n\tconst addonsPrice = (addons || []).reduce((sum, addon) => sum + addon.price, 0);\n\n\tconst itemNetPrice = basePrice + addonsPrice;\n\t// Currently VAT is applied only on basePrice, not on addons\n\t// TODO: Re-evaluate for European market where tax may apply to addons too\n\tconst itemTax = basePrice * (vat / 100);\n\tconst itemGrossPrice = itemNetPrice + itemTax;\n\n\tconst totalNet = itemNetPrice * quantity;\n\tconst totalTax = itemTax * quantity;\n\tconst totalGross = itemGrossPrice * quantity;\n\n\treturn {\n\t\ttotalGross,\n\t\ttotalNet,\n\t\ttotalTax,\n\t\titemGrossPrice,\n\t\titemNetPrice,\n\t\titemTax,\n\t};\n};\n\nexport const getSelectedAddonsFromOrderItems = (item: OrderItem): SelectedAddons => {\n\tconst selectedAddons: SelectedAddons = (item?.addons || []).reduce(\n\t\t(acc, { addonId, optionId }) => {\n\t\t\tacc[addonId] = optionId;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{}\n\t);\n\n\treturn selectedAddons;\n};\n","interface ValidationResult {\n\tisValid: boolean;\n\terror?: string;\n}\n\ntype Validator = (cleanedNumber: string) => ValidationResult;\n\nconst validators: Record<string, Validator> = {\n\t\"994\": (number) => {\n\t\tconst AZERBAIJANI_PREFIXES = [\"50\", \"51\", \"10\", \"55\", \"99\", \"70\", \"77\", \"60\"];\n\t\tconst pattern = new RegExp(`^(${AZERBAIJANI_PREFIXES.join(\"|\")})\\\\d{7}$`);\n\n\t\tif (!pattern.test(number)) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\terror: `Azerbaijani numbers must be 9 digits and start with ${AZERBAIJANI_PREFIXES.join(\n\t\t\t\t\t\", \"\n\t\t\t\t)}`,\n\t\t\t};\n\t\t}\n\n\t\treturn { isValid: true };\n\t},\n\n\t\"31\": (number) => {\n\t\tconst pattern = /^\\d{9}$/;\n\n\t\tif (!pattern.test(number)) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\terror: \"Dutch numbers must be exactly 9 digits\",\n\t\t\t};\n\t\t}\n\n\t\treturn { isValid: true };\n\t},\n};\n\nexport function validatePhoneNumber(phoneNumber: string): ValidationResult {\n\tif (!phoneNumber) {\n\t\treturn { isValid: false, error: \"FIELD_REQUIRED\" };\n\t}\n\n\tconst cleaned = phoneNumber.replace(/\\D/g, \"\");\n\n\tconst countryCode = cleaned.startsWith(\"994\") ? \"994\" : cleaned.startsWith(\"31\") ? \"31\" : null;\n\n\tif (!countryCode) {\n\t\treturn { isValid: false, error: \"Unsupported country code\" };\n\t}\n\n\tconst nationalNumber = cleaned.slice(countryCode.length);\n\tconst validator = validators[countryCode];\n\n\treturn validator(nationalNumber);\n}\n","export enum CustomerAuthStep {\n\tPHONE = \"PHONE\",\n\tOTP = \"OTP\",\n\tEMAIL = \"EMAIL\",\n}\n\nexport enum CustomerAddressType {\n\tHOME = \"HOME\",\n\tWORK = \"WORK\",\n\tTRAVEL = \"TRAVEL\",\n}\n\nexport interface CustomerAddress {\n\tid?: number;\n\taddressId?: number; // Update address temporary\n\tcountryCode: string;\n\tcityName: string;\n\tstreet: string;\n\thouseNumber: string;\n\tadditionalNumber?: string;\n\tpostCode?: string;\n\tinstructions?: string;\n\tfloor?: number;\n\tlongitude?: number;\n\tlatitude?: number;\n\ttitle?: string;\n\ttype?: CustomerAddressType;\n}\n\nexport interface CustomerAuthForm {\n\tphoneNumber: string;\n\totp: string;\n\temail: string;\n}\n\nexport interface CustomerAuthPhoneForm {\n\tcountryCode: string;\n\tphoneNumber: string;\n}\n\nexport interface AuthResponse {\n\taccessToken: string;\n\trefreshToken: string;\n}\n\nexport interface Customer {\n\tid?: number;\n\temail: string;\n\tphoneNumber: string;\n\tfullName: string;\n\tsmsVerified?: boolean;\n\temailVerified?: boolean;\n\taddress?: CustomerAddress;\n\taddresses?: CustomerAddress[];\n}\n\nexport type CustomerUpdatePayload = Partial<Customer>;\n","import { FormErrors } from \"@sorocraft/ui\";\nimport { checkIsValidEmail } from \"@sorocraft/js-utils\";\n\nimport * as viewUtils from \"src/modules/view/utils\";\n\nimport {\n\tCustomerAddress,\n\tCustomerAuthForm,\n\tCustomerAuthPhoneForm,\n\tCustomerAuthStep,\n} from \"./models\";\n\nexport const preparePhoneNumber = (form: CustomerAuthPhoneForm) => {\n\tconst phoneNumber = `${form.countryCode}${form.phoneNumber}`.replaceAll(\"+\", \"\");\n\n\treturn phoneNumber;\n};\n\nexport const validateForm = (form: CustomerAuthForm, step: CustomerAuthStep): FormErrors => {\n\tconst errors: FormErrors = {};\n\tconst { phoneNumber, email, otp } = form || {};\n\n\tswitch (step) {\n\t\tcase CustomerAuthStep.PHONE: {\n\t\t\tconst { isValid, error } = viewUtils.validatePhoneNumber(phoneNumber);\n\t\t\tif (!isValid) errors.phoneNumber = error;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase CustomerAuthStep.OTP: {\n\t\t\tconst { isValid, error } = viewUtils.validatePhoneNumber(phoneNumber);\n\t\t\tif (!isValid) errors.phoneNumber = error;\n\n\t\t\tif (!otp || otp.length !== 6) {\n\t\t\t\terrors.otp = \"Invalid OTP\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase CustomerAuthStep.EMAIL: {\n\t\t\tif (!email || !checkIsValidEmail(email)) {\n\t\t\t\terrors.email = \"Invalid Email Address\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn errors;\n};\n\nexport const validateAddressForm = (form: CustomerAddress): FormErrors => {\n\tconst errorMessage = \"FIELD_REQUIRED\";\n\tconst errors: FormErrors = {};\n\tconst { countryCode, cityName, street, houseNumber } = form || {};\n\n\tif (!countryCode) errors.countryCode = errorMessage;\n\tif (!cityName) errors.cityName = errorMessage;\n\tif (!street) errors.street = errorMessage;\n\tif (!houseNumber) errors.houseNumber = errorMessage;\n\n\treturn errors;\n};\n\nexport const formatCityLine = (fields: (string | undefined)[]) => {\n\treturn (fields || []).filter(Boolean).join(\", \");\n};\n\nexport const formatAddressLine = (\n\tstreet: string,\n\thouseNumber: string,\n\tadditionalNumber: string\n) => {\n\tconst house = [houseNumber, additionalNumber].filter(Boolean).join(\"/\");\n\tconst fullAddress = [street, house].filter(Boolean).join(\" \");\n\n\treturn fullAddress;\n};\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n\nexport const getTLD = (language: string) => {\n\treturn language === \"az\" ? \"az\" : \"co\";\n};\n\nexport const getRegisterUrl = (language: string, source: string) => {\n\tconst tld = getTLD(language);\n\n\treturn `https://app.restaround.${tld}/auth/register?lang=${language}&utm_source=${source}`;\n};\n"],"names":["getCategoryTranslation","category","language","_b","_a","translations","find","call","item","getCategoryNameById","categoryId","categories","id","isEmpty","name","calculateTotalPrice","price","quantity","vat","IMAGE_BASE_URL","getImageSource","image","includes","startsWith","getLogoImageSource","logoImage","getCoverImageSource","coverImage","keyStr","triplet","e1","e2","e3","charAt","rgbDataURL","r","g","b","prepareCategoryAndProductMap","products","productMap","reduce","map","product","visible","Number","push","Object","assign","filter","length","getAddonTranslation","addon","getAddonOptionTranslation","option","getOptionPrice","currency","totalPrice","formattedTotalPrice","priceFormatter","getAddonOptionRawPrice","optionId","options","getOptionTitles","optionIds","Array","isArray","t","title","Boolean","join","getAddonTitle","_c","MenuAddonSelectType","getProductTranslation","getProductRawPrice","getProductPrice","getProductVariant","variantId","variants","getSelectedOptionsTotalPrice","selectedAddons","addons","prototype","hasOwnProperty","total","addonId","selectType","SINGLE","selectedOptionId","multipleTotal","getProductVariantRawPrice","variant","getProductVariantPrice","getProductVariantTranslation","getProductOrderRawPrice","noVat","optionsPrice","productData","selectedOptionsTotalPrice","getProductOrderPrice","getProductAddon","getOrderAddonsPrice","orderAddons","sum","current","getOrderPrice","order","totalWithoutTax","totalTax","items","itemTotal","undefined","totalWithTax","totalWithoutTaxFormatted","totalTaxFormatted","totalWithTaxFormatted","generateOrderItemsId","productId","Error","orderItemsId","addonIdsPart","entries","getOrderItemPrice","orderItem","basePrice","itemNetPrice","itemTax","itemGrossPrice","totalGross","totalNet","getSelectedAddonsFromOrderItems","acc","validators","number","AZERBAIJANI_PREFIXES","RegExp","test","isValid","error","validatePhoneNumber","phoneNumber","cleaned","replace","countryCode","nationalNumber","slice","validator","CustomerAuthStep","CustomerAddressType","preparePhoneNumber","form","replaceAll","validateForm","step","errors","email","otp","PHONE","viewUtils.validatePhoneNumber","OTP","EMAIL","checkIsValidEmail","validateAddressForm","errorMessage","cityName","street","houseNumber","formatCityLine","fields","formatAddressLine","additionalNumber","CO_DOMAIN","DOMAINS","getBaseUrl","hostname","domain","url","getTLD","getRegisterUrl","source"],"mappings":"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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var t=require("@sorocraft/js-utils");const r=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},e=(t=0,r=1,e=0)=>t*r*(1+e/100),o="https://images.restaround.co",
|
|
1
|
+
"use strict";var t=require("@sorocraft/js-utils");const r=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},e=(t=0,r=1,e=0)=>t*r*(1+e/100),o="https://images.restaround.co",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",i=(t,r,e)=>n.charAt(t>>2)+n.charAt((3&t)<<4|r>>4)+n.charAt((15&r)<<2|e>>6)+n.charAt(63&e),a=(t,r)=>{var e;return(null===(e=((null==t?void 0:t.options)||[]).find((({id:t})=>t===r)))||void 0===e?void 0:e.price)||0};var s;!function(t){t.SINGLE="SINGLE",t.MULTIPLE="MULTIPLE"}(s||(s={}));const d=(t,r=1)=>{const{price:o=0,vat:n=0}=t||{};return e(o,r,n)},l=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.variants)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.id===r)))||{}},u=(t,r={},e)=>((null==t?void 0:t.addons)||[]).filter((t=>Object.prototype.hasOwnProperty.call(r,t.id))).reduce(((t,e)=>{const{id:o,selectType:n}=e;if(n===s.SINGLE){const n=r[o];return t+a(e,n)}return t+(r[o]||[]).reduce(((t,r)=>t+a(e,r)),0)}),0)*e,c=(t,r,o)=>{const n=l(r,t),{vat:i}=r||{},{price:a}=n||{};return e(a,o,i)},p=({product:r,variantId:e,quantity:o=1,selectedAddons:n,noVat:i=!1})=>{if(t.isEmpty(r))return{price:0,optionsPrice:0,total:0};const a=Object.assign(Object.assign({},r),{vat:i?0:r.vat}),s=u(a,n,o),l=e?c(e,a,o):d(a,o);return{price:l,optionsPrice:s,total:l+s}},v=(t=[],r)=>r*t.reduce(((t,r)=>t+r.price),0),g={994:t=>{const r=["50","51","10","55","99","70","77","60"];return new RegExp(`^(${r.join("|")})\\d{7}$`).test(t)?{isValid:!0}:{isValid:!1,error:`Azerbaijani numbers must be 9 digits and start with ${r.join(", ")}`}},31:t=>/^\d{9}$/.test(t)?{isValid:!0}:{isValid:!1,error:"Dutch numbers must be exactly 9 digits"}};function m(t){if(!t)return{isValid:!1,error:"FIELD_REQUIRED"};const r=t.replace(/\D/g,""),e=r.startsWith("994")?"994":r.startsWith("31")?"31":null;if(!e)return{isValid:!1,error:"Unsupported country code"};const o=r.slice(e.length);return(0,g[e])(o)}var A,x;!function(t){t.PHONE="PHONE",t.OTP="OTP",t.EMAIL="EMAIL"}(A||(A={})),function(t){t.HOME="HOME",t.WORK="WORK",t.TRAVEL="TRAVEL"}(x||(x={}));const P="restaround.co",f=[P,"restaround.az","restaround.ee","restaround.nl"],h=t=>"az"===t?"az":"co";exports.IMAGE_BASE_URL=o,exports.calculateTotalPrice=e,exports.formatAddressLine=(t,r,e)=>[t,[r,e].filter(Boolean).join("/")].filter(Boolean).join(" "),exports.formatCityLine=t=>(t||[]).filter(Boolean).join(", "),exports.generateOrderItemsId=(t,r,e)=>{if(!t)throw new Error("Product ID is required");let o=`${t}`;r&&(o+=`-${r}`);const n=Object.entries(e||{}).map((([t,r])=>{if(!t||!r)return null;const e=Array.isArray(r)?r.filter(Boolean).join("-"):`${r}`;return e?`${t}-${e}`:null})).filter(Boolean).join("-");return n&&(o+=`-${n}`),o},exports.getAddonOptionRawPrice=a,exports.getAddonOptionTranslation=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},exports.getAddonTitle=(t,r)=>{var e,o,n;return(null===(n=null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||void 0===n?void 0:n.title)||""},exports.getAddonTranslation=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},exports.getBaseUrl=(t,r)=>{const e=f.includes(t)?t:P;return{url:`https://${e}/${r||"en"}`,domain:e}},exports.getCategoryNameById=(e,o,n)=>{var i;const a=null===(i=null==o?void 0:o.find)||void 0===i?void 0:i.call(o,(({id:t})=>t===e));if(t.isEmpty(a))return"";const{name:s}=r(a,n);return s},exports.getCategoryTranslation=r,exports.getCoverImageSource=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${o}/${t}`:"https://images.restaround.co/restaround-doodle.webp",exports.getImageSource=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${o}/${t}`:"",exports.getLogoImageSource=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${o}/${t}`:"https://images.restaround.co/no-photo-128.webp",exports.getOptionPrice=({option:r,currency:e="USD",language:o="en"})=>{const{price:n}=r||{};return{totalPrice:n,formattedTotalPrice:t.priceFormatter(n,e,o)}},exports.getOptionTitles=(t,r,e)=>{var o;if(Array.isArray(r))return t.filter((({id:t})=>r.includes(t))).map((({translations:t})=>{var r;return(null===(r=t.find((t=>t.language===e)))||void 0===r?void 0:r.title)||""})).filter(Boolean).join(", ");{const n=t.find((({id:t})=>t===r));return(null===(o=null==n?void 0:n.translations.find((t=>t.language===e)))||void 0===o?void 0:o.title)||""}},exports.getOrderAddonsPrice=v,exports.getOrderItemPrice=t=>{var r;const{price:e,variant:o,addons:n,quantity:i,vat:a}=t||{},s=null!==(r=null==o?void 0:o.price)&&void 0!==r?r:e,d=s+(n||[]).reduce(((t,r)=>t+r.price),0),l=s*(a/100),u=d+l;return{totalGross:u*i,totalNet:d*i,totalTax:l*i,itemGrossPrice:u,itemNetPrice:d,itemTax:l}},exports.getOrderPrice=(r,e,o)=>{let n=0,i=0;for(const t of r.items){const e=(a=t.price,s=t.quantity,d=t.addons,s*a+v(d,s));n+=e,void 0===r.vat&&t.vat&&(i+=e*t.vat/100)}var a,s,d;void 0!==r.vat&&(i=n*r.vat/100);const l=n+i;return{totalWithoutTax:n,totalWithoutTaxFormatted:t.priceFormatter(n,e,o),totalTax:i,totalTaxFormatted:t.priceFormatter(i,e,o),totalWithTax:l,totalWithTaxFormatted:t.priceFormatter(l,e,o)}},exports.getProductAddon=(t,r)=>((null==t?void 0:t.addons)||[]).find((({id:t})=>t===r))||{},exports.getProductOrderPrice=({product:r,variantId:e,quantity:o=1,currency:n,language:i,selectedAddons:a,noVat:s=!1})=>{const{total:d}=p({product:r,variantId:e,quantity:o,selectedAddons:a,noVat:s});return{totalPrice:d,formattedTotalPrice:t.priceFormatter(d,n,i)}},exports.getProductOrderRawPrice=p,exports.getProductPrice=(r,e,o,n=1)=>{const i=d(r,n);return{totalPrice:i,formattedTotalPrice:t.priceFormatter(i,e,o)}},exports.getProductRawPrice=d,exports.getProductTranslation=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},exports.getProductVariant=l,exports.getProductVariantPrice=({variantId:r,currency:e="USD",language:o="en",product:n,quantity:i=1})=>{const a=c(r,n,i);return{totalPrice:a,formattedTotalPrice:t.priceFormatter(a,e,o)}},exports.getProductVariantRawPrice=c,exports.getProductVariantTranslation=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},exports.getRegisterUrl=(t,r)=>`https://app.restaround.${h(t)}/auth/register?lang=${t}&utm_source=${r}`,exports.getSelectedAddonsFromOrderItems=t=>((null==t?void 0:t.addons)||[]).reduce(((t,{addonId:r,optionId:e})=>(t[r]=e,t)),{}),exports.getSelectedOptionsTotalPrice=u,exports.getTLD=h,exports.prepareCategoryAndProductMap=(t,r)=>{const e=r.reduce(((t,r)=>{if(!r.visible)return t;const e=Number(r.categoryId);return t[e]||(t[e]=[]),t[e].push(r),t}),{});return t.map((t=>Object.assign(Object.assign({},t),{products:e[Number(t.id)]||[]}))).filter((t=>{var r;return(null===(r=null==t?void 0:t.products)||void 0===r?void 0:r.length)>0}))},exports.preparePhoneNumber=t=>`${t.countryCode}${t.phoneNumber}`.replaceAll("+",""),exports.rgbDataURL=(t,r,e)=>`data:image/gif;base64,R0lGODlhAQABAPAA${i(0,t,r)+i(e,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`,exports.validateAddressForm=t=>{const r="FIELD_REQUIRED",e={},{countryCode:o,cityName:n,street:i,houseNumber:a}=t||{};return o||(e.countryCode=r),n||(e.cityName=r),i||(e.street=r),a||(e.houseNumber=r),e},exports.validateForm=(r,e)=>{const o={},{phoneNumber:n,email:i,otp:a}=r||{};switch(e){case A.PHONE:{const{isValid:t,error:r}=m(n);t||(o.phoneNumber=r);break}case A.OTP:{const{isValid:t,error:r}=m(n);t||(o.phoneNumber=r),a&&6===a.length||(o.otp="Invalid OTP");break}case A.EMAIL:i&&t.checkIsValidEmail(i)||(o.email="Invalid Email Address")}return o};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/utils/category.ts","../../../src/utils/common.ts","../../../src/utils/image.ts","../../../src/modules/addon/utils.ts","../../../src/modules/addon/models.ts","../../../src/modules/product/utils.ts","../../../src/modules/order/utils.ts","../../../src/utils/constants.ts","../../../src/utils/url.ts","../../../src/utils/menu.ts"],"sourcesContent":["import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","export const calculateTotalPrice = (price: number = 0, quantity: number = 1, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"./models\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\n};\n\nexport const getOptionPrice = ({\n\toption,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n}: {\n\toption: MenuAddonOption;\n\tcurrency?: string;\n\tlanguage?: string;\n}) => {\n\tconst { price } = option || {};\n\n\treturn {\n\t\ttotalPrice: price,\n\t\tformattedTotalPrice: priceFormatter(price, currency, language),\n\t};\n};\n\nexport const getAddonOptionRawPrice = (addon: MenuAddon, optionId: number): number => {\n\treturn (addon?.options || []).find(({ id }) => id === optionId)?.price || 0;\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn options\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = options.find(({ id }) => id === optionIds);\n\t\treturn option?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon?.translations?.find?.((t) => t.language === language)?.title || \"\";\n};\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { Product, ProductTranslation, ProductVariant, ProductVariantTranslation } from \"./models\";\n\nimport { calculateTotalPrice } from \"src/utils/common\";\nimport { MenuAddon, MenuAddonSelectType } from \"src/modules/addon/models\";\nimport { getAddonOptionRawPrice } from \"src/modules/addon/utils\";\nimport * as orderModels from \"src/modules/order/models\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductRawPrice = (product: Product, quantity: number = 1) => {\n\tconst { price = 0, vat = 0 } = product || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst totalPrice = getProductRawPrice(product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getSelectedOptionsTotalPrice = (\n\tproduct: Product,\n\tselectedAddons: orderModels.SelectedAddons = {},\n\tquantity: number\n): number => {\n\t// Filter addons that are selected by the user\n\tconst selectedAddonsList = (product?.addons || []).filter((addon) =>\n\t\tObject.prototype.hasOwnProperty.call(selectedAddons, addon.id)\n\t);\n\n\t// Calculate the total price\n\tconst optionsTotalPrice = selectedAddonsList.reduce((total: number, addon: MenuAddon) => {\n\t\tconst { id: addonId, selectType } = addon;\n\n\t\t// Handle SINGLE selection\n\t\tif (selectType === MenuAddonSelectType.SINGLE) {\n\t\t\tconst selectedOptionId = selectedAddons[addonId] as number;\n\t\t\treturn total + getAddonOptionRawPrice(addon, selectedOptionId);\n\t\t}\n\n\t\t// Handle MULTIPLE selection\n\t\tconst selectedOptionIds = (selectedAddons[addonId] || []) as number[];\n\t\tconst multipleOptionsPrice = selectedOptionIds.reduce(\n\t\t\t(multipleTotal, optionId) => multipleTotal + getAddonOptionRawPrice(addon, optionId),\n\t\t\t0\n\t\t);\n\n\t\treturn total + multipleOptionsPrice;\n\t}, 0);\n\n\treturn optionsTotalPrice * quantity;\n};\n\nexport const getProductVariantRawPrice = (\n\tvariantId: number,\n\tproduct: Product,\n\tquantity?: number\n) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst totalPrice = getProductVariantRawPrice(variantId, product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslation => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslation;\n};\n\nexport const getProductOrderRawPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}): { price: number; optionsPrice: number; total: number } => {\n\tif (isEmpty(product)) return { price: 0, optionsPrice: 0, total: 0 };\n\n\tconst productData: Product = { ...product, vat: noVat ? 0 : product.vat };\n\tconst selectedOptionsTotalPrice = getSelectedOptionsTotalPrice(\n\t\tproductData,\n\t\tselectedAddons,\n\t\tquantity\n\t);\n\tconst price = variantId\n\t\t? getProductVariantRawPrice(variantId, productData, quantity)\n\t\t: getProductRawPrice(productData, quantity);\n\n\treturn {\n\t\tprice,\n\t\toptionsPrice: selectedOptionsTotalPrice,\n\t\ttotal: price + selectedOptionsTotalPrice,\n\t};\n};\n\nexport const getProductOrderPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}) => {\n\tconst { total } = getProductOrderRawPrice({\n\t\tproduct,\n\t\tvariantId,\n\t\tquantity,\n\t\tselectedAddons,\n\t\tnoVat,\n\t});\n\n\treturn {\n\t\ttotalPrice: total,\n\t\tformattedTotalPrice: priceFormatter(total, currency, language),\n\t};\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { Order, OrderAddon, OrderItem, SelectedAddons } from \"./models\";\n\nexport const getOrderAddonsPrice = (orderAddons: OrderAddon[] = [], quantity: number): number => {\n\tconst totalOrderAddonsPrice = orderAddons.reduce((sum, current) => sum + current.price, 0);\n\n\treturn quantity * totalOrderAddonsPrice;\n};\n\nexport const getOrderPrice = (order: Order, currency: string, language: string) => {\n\tconst calculateItemTotal = (price: number, quantity: number, addons: OrderAddon[]) => {\n\t\treturn quantity * price + getOrderAddonsPrice(addons, quantity);\n\t};\n\n\tlet totalWithoutTax = 0;\n\tlet totalTax = 0;\n\n\tfor (const item of order.items) {\n\t\tconst itemTotal = calculateItemTotal(item.price, item.quantity, item.addons);\n\t\ttotalWithoutTax += itemTotal;\n\n\t\tif (order.vat === undefined && item.vat) {\n\t\t\ttotalTax += (itemTotal * item.vat) / 100;\n\t\t}\n\t}\n\n\tif (order.vat !== undefined) {\n\t\ttotalTax = (totalWithoutTax * order.vat) / 100;\n\t}\n\n\tconst totalWithTax = totalWithoutTax + totalTax;\n\n\treturn {\n\t\ttotalWithoutTax,\n\t\ttotalWithoutTaxFormatted: priceFormatter(totalWithoutTax, currency, language),\n\t\ttotalTax,\n\t\ttotalTaxFormatted: priceFormatter(totalTax, currency, language),\n\t\ttotalWithTax,\n\t\ttotalWithTaxFormatted: priceFormatter(totalWithTax, currency, language),\n\t};\n};\n\nexport const generateOrderItemsId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons: SelectedAddons\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the order items ID base with productId and variantId\n\tlet orderItemsId = `${productId}`;\n\tif (variantId) {\n\t\torderItemsId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option) ? option.filter(Boolean).join(\"-\") : `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\torderItemsId += `-${addonIdsPart}`;\n\t}\n\n\treturn orderItemsId;\n};\n\nexport const getOrderItemPrice = (orderItem: OrderItem) => {\n\tconst { price, variant, addons, quantity, vat } = orderItem || {};\n\tconst basePrice = variant?.price ?? price;\n\tconst addonsPrice = (addons || []).reduce((sum, addon) => sum + addon.price, 0);\n\n\tconst itemNetPrice = basePrice + addonsPrice;\n\t// Currently VAT is applied only on basePrice, not on addons\n\t// TODO: Re-evaluate for European market where tax may apply to addons too\n\tconst itemTax = basePrice * (vat / 100);\n\tconst itemGrossPrice = itemNetPrice + itemTax;\n\n\tconst totalNet = itemNetPrice * quantity;\n\tconst totalTax = itemTax * quantity;\n\tconst totalGross = itemGrossPrice * quantity;\n\n\treturn {\n\t\ttotalGross,\n\t\ttotalNet,\n\t\ttotalTax,\n\t\titemGrossPrice,\n\t\titemNetPrice,\n\t\titemTax,\n\t};\n};\n\nexport const getSelectedAddonsFromOrderItems = (item: OrderItem): SelectedAddons => {\n\tconst selectedAddons: SelectedAddons = (item?.addons || []).reduce(\n\t\t(acc, { addonId, optionId }) => {\n\t\t\tacc[addonId] = optionId;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{}\n\t);\n\n\treturn selectedAddons;\n};\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n\nexport const getTLD = (language: string) => {\n\treturn language === \"az\" ? \"az\" : \"co\";\n};\n\nexport const getRegisterUrl = (language: string, source: string) => {\n\tconst tld = getTLD(language);\n\n\treturn `https://app.restaround.${tld}/auth/register?lang=${language}&utm_source=${source}`;\n};\n","import { Category, CategoryProductMap, Product } from \"src/models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: Category[],\n\tproducts: Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, Product[]>>((map, product) => {\n\t\tif (!product.visible) return map;\n\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n"],"names":["getCategoryTranslation","category","language","_b","_a","translations","find","call","item","calculateTotalPrice","price","quantity","vat","IMAGE_BASE_URL","keyStr","triplet","e1","e2","e3","charAt","getAddonOptionRawPrice","addon","optionId","options","id","MenuAddonSelectType","getProductRawPrice","product","getProductVariant","variantId","variants","getSelectedOptionsTotalPrice","selectedAddons","addons","filter","Object","prototype","hasOwnProperty","reduce","total","addonId","selectType","SINGLE","selectedOptionId","multipleTotal","getProductVariantRawPrice","variant","getProductOrderRawPrice","noVat","isEmpty","optionsPrice","productData","assign","selectedOptionsTotalPrice","getOrderAddonsPrice","orderAddons","sum","current","CO_DOMAIN","DOMAINS","getTLD","productId","Error","orderItemsId","addonIdsPart","entries","map","option","optionIds","Array","isArray","Boolean","join","_c","t","title","hostname","domain","includes","url","categoryId","categories","name","coverImage","startsWith","image","logoImage","currency","totalPrice","formattedTotalPrice","priceFormatter","orderItem","basePrice","itemNetPrice","itemTax","itemGrossPrice","totalGross","totalNet","totalTax","order","totalWithoutTax","items","itemTotal","undefined","totalWithTax","totalWithoutTaxFormatted","totalTaxFormatted","totalWithTaxFormatted","source","acc","products","productMap","visible","Number","push","length","r","g","b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/utils/category.ts","../../../src/utils/common.ts","../../../src/utils/image.ts","../../../src/modules/addon/utils.ts","../../../src/modules/addon/models.ts","../../../src/modules/product/utils.ts","../../../src/modules/order/utils.ts","../../../src/modules/view/utils.ts","../../../src/modules/customer/models.ts","../../../src/modules/customer/utils.ts","../../../src/utils/constants.ts","../../../src/utils/url.ts","../../../src/utils/menu.ts"],"sourcesContent":["import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","export const calculateTotalPrice = (price: number = 0, quantity: number = 1, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"./models\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\n};\n\nexport const getOptionPrice = ({\n\toption,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n}: {\n\toption: MenuAddonOption;\n\tcurrency?: string;\n\tlanguage?: string;\n}) => {\n\tconst { price } = option || {};\n\n\treturn {\n\t\ttotalPrice: price,\n\t\tformattedTotalPrice: priceFormatter(price, currency, language),\n\t};\n};\n\nexport const getAddonOptionRawPrice = (addon: MenuAddon, optionId: number): number => {\n\treturn (addon?.options || []).find(({ id }) => id === optionId)?.price || 0;\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn options\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = options.find(({ id }) => id === optionIds);\n\t\treturn option?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon?.translations?.find?.((t) => t.language === language)?.title || \"\";\n};\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { Product, ProductTranslation, ProductVariant, ProductVariantTranslation } from \"./models\";\n\nimport { calculateTotalPrice } from \"src/utils/common\";\nimport { MenuAddon, MenuAddonSelectType } from \"src/modules/addon/models\";\nimport { getAddonOptionRawPrice } from \"src/modules/addon/utils\";\nimport * as orderModels from \"src/modules/order/models\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductRawPrice = (product: Product, quantity: number = 1) => {\n\tconst { price = 0, vat = 0 } = product || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst totalPrice = getProductRawPrice(product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getSelectedOptionsTotalPrice = (\n\tproduct: Product,\n\tselectedAddons: orderModels.SelectedAddons = {},\n\tquantity: number\n): number => {\n\t// Filter addons that are selected by the user\n\tconst selectedAddonsList = (product?.addons || []).filter((addon) =>\n\t\tObject.prototype.hasOwnProperty.call(selectedAddons, addon.id)\n\t);\n\n\t// Calculate the total price\n\tconst optionsTotalPrice = selectedAddonsList.reduce((total: number, addon: MenuAddon) => {\n\t\tconst { id: addonId, selectType } = addon;\n\n\t\t// Handle SINGLE selection\n\t\tif (selectType === MenuAddonSelectType.SINGLE) {\n\t\t\tconst selectedOptionId = selectedAddons[addonId] as number;\n\t\t\treturn total + getAddonOptionRawPrice(addon, selectedOptionId);\n\t\t}\n\n\t\t// Handle MULTIPLE selection\n\t\tconst selectedOptionIds = (selectedAddons[addonId] || []) as number[];\n\t\tconst multipleOptionsPrice = selectedOptionIds.reduce(\n\t\t\t(multipleTotal, optionId) => multipleTotal + getAddonOptionRawPrice(addon, optionId),\n\t\t\t0\n\t\t);\n\n\t\treturn total + multipleOptionsPrice;\n\t}, 0);\n\n\treturn optionsTotalPrice * quantity;\n};\n\nexport const getProductVariantRawPrice = (\n\tvariantId: number,\n\tproduct: Product,\n\tquantity?: number\n) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst totalPrice = getProductVariantRawPrice(variantId, product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslation => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslation;\n};\n\nexport const getProductOrderRawPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}): { price: number; optionsPrice: number; total: number } => {\n\tif (isEmpty(product)) return { price: 0, optionsPrice: 0, total: 0 };\n\n\tconst productData: Product = { ...product, vat: noVat ? 0 : product.vat };\n\tconst selectedOptionsTotalPrice = getSelectedOptionsTotalPrice(\n\t\tproductData,\n\t\tselectedAddons,\n\t\tquantity\n\t);\n\tconst price = variantId\n\t\t? getProductVariantRawPrice(variantId, productData, quantity)\n\t\t: getProductRawPrice(productData, quantity);\n\n\treturn {\n\t\tprice,\n\t\toptionsPrice: selectedOptionsTotalPrice,\n\t\ttotal: price + selectedOptionsTotalPrice,\n\t};\n};\n\nexport const getProductOrderPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n\tselectedAddons: orderModels.SelectedAddons;\n\tnoVat?: boolean;\n}) => {\n\tconst { total } = getProductOrderRawPrice({\n\t\tproduct,\n\t\tvariantId,\n\t\tquantity,\n\t\tselectedAddons,\n\t\tnoVat,\n\t});\n\n\treturn {\n\t\ttotalPrice: total,\n\t\tformattedTotalPrice: priceFormatter(total, currency, language),\n\t};\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { Order, OrderAddon, OrderItem, SelectedAddons } from \"./models\";\n\nexport const getOrderAddonsPrice = (orderAddons: OrderAddon[] = [], quantity: number): number => {\n\tconst totalOrderAddonsPrice = orderAddons.reduce((sum, current) => sum + current.price, 0);\n\n\treturn quantity * totalOrderAddonsPrice;\n};\n\nexport const getOrderPrice = (order: Order, currency: string, language: string) => {\n\tconst calculateItemTotal = (price: number, quantity: number, addons: OrderAddon[]) => {\n\t\treturn quantity * price + getOrderAddonsPrice(addons, quantity);\n\t};\n\n\tlet totalWithoutTax = 0;\n\tlet totalTax = 0;\n\n\tfor (const item of order.items) {\n\t\tconst itemTotal = calculateItemTotal(item.price, item.quantity, item.addons);\n\t\ttotalWithoutTax += itemTotal;\n\n\t\tif (order.vat === undefined && item.vat) {\n\t\t\ttotalTax += (itemTotal * item.vat) / 100;\n\t\t}\n\t}\n\n\tif (order.vat !== undefined) {\n\t\ttotalTax = (totalWithoutTax * order.vat) / 100;\n\t}\n\n\tconst totalWithTax = totalWithoutTax + totalTax;\n\n\treturn {\n\t\ttotalWithoutTax,\n\t\ttotalWithoutTaxFormatted: priceFormatter(totalWithoutTax, currency, language),\n\t\ttotalTax,\n\t\ttotalTaxFormatted: priceFormatter(totalTax, currency, language),\n\t\ttotalWithTax,\n\t\ttotalWithTaxFormatted: priceFormatter(totalWithTax, currency, language),\n\t};\n};\n\nexport const generateOrderItemsId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons: SelectedAddons\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the order items ID base with productId and variantId\n\tlet orderItemsId = `${productId}`;\n\tif (variantId) {\n\t\torderItemsId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option) ? option.filter(Boolean).join(\"-\") : `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\torderItemsId += `-${addonIdsPart}`;\n\t}\n\n\treturn orderItemsId;\n};\n\nexport const getOrderItemPrice = (orderItem: OrderItem) => {\n\tconst { price, variant, addons, quantity, vat } = orderItem || {};\n\tconst basePrice = variant?.price ?? price;\n\tconst addonsPrice = (addons || []).reduce((sum, addon) => sum + addon.price, 0);\n\n\tconst itemNetPrice = basePrice + addonsPrice;\n\t// Currently VAT is applied only on basePrice, not on addons\n\t// TODO: Re-evaluate for European market where tax may apply to addons too\n\tconst itemTax = basePrice * (vat / 100);\n\tconst itemGrossPrice = itemNetPrice + itemTax;\n\n\tconst totalNet = itemNetPrice * quantity;\n\tconst totalTax = itemTax * quantity;\n\tconst totalGross = itemGrossPrice * quantity;\n\n\treturn {\n\t\ttotalGross,\n\t\ttotalNet,\n\t\ttotalTax,\n\t\titemGrossPrice,\n\t\titemNetPrice,\n\t\titemTax,\n\t};\n};\n\nexport const getSelectedAddonsFromOrderItems = (item: OrderItem): SelectedAddons => {\n\tconst selectedAddons: SelectedAddons = (item?.addons || []).reduce(\n\t\t(acc, { addonId, optionId }) => {\n\t\t\tacc[addonId] = optionId;\n\n\t\t\treturn acc;\n\t\t},\n\t\t{}\n\t);\n\n\treturn selectedAddons;\n};\n","interface ValidationResult {\n\tisValid: boolean;\n\terror?: string;\n}\n\ntype Validator = (cleanedNumber: string) => ValidationResult;\n\nconst validators: Record<string, Validator> = {\n\t\"994\": (number) => {\n\t\tconst AZERBAIJANI_PREFIXES = [\"50\", \"51\", \"10\", \"55\", \"99\", \"70\", \"77\", \"60\"];\n\t\tconst pattern = new RegExp(`^(${AZERBAIJANI_PREFIXES.join(\"|\")})\\\\d{7}$`);\n\n\t\tif (!pattern.test(number)) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\terror: `Azerbaijani numbers must be 9 digits and start with ${AZERBAIJANI_PREFIXES.join(\n\t\t\t\t\t\", \"\n\t\t\t\t)}`,\n\t\t\t};\n\t\t}\n\n\t\treturn { isValid: true };\n\t},\n\n\t\"31\": (number) => {\n\t\tconst pattern = /^\\d{9}$/;\n\n\t\tif (!pattern.test(number)) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\terror: \"Dutch numbers must be exactly 9 digits\",\n\t\t\t};\n\t\t}\n\n\t\treturn { isValid: true };\n\t},\n};\n\nexport function validatePhoneNumber(phoneNumber: string): ValidationResult {\n\tif (!phoneNumber) {\n\t\treturn { isValid: false, error: \"FIELD_REQUIRED\" };\n\t}\n\n\tconst cleaned = phoneNumber.replace(/\\D/g, \"\");\n\n\tconst countryCode = cleaned.startsWith(\"994\") ? \"994\" : cleaned.startsWith(\"31\") ? \"31\" : null;\n\n\tif (!countryCode) {\n\t\treturn { isValid: false, error: \"Unsupported country code\" };\n\t}\n\n\tconst nationalNumber = cleaned.slice(countryCode.length);\n\tconst validator = validators[countryCode];\n\n\treturn validator(nationalNumber);\n}\n","export enum CustomerAuthStep {\n\tPHONE = \"PHONE\",\n\tOTP = \"OTP\",\n\tEMAIL = \"EMAIL\",\n}\n\nexport enum CustomerAddressType {\n\tHOME = \"HOME\",\n\tWORK = \"WORK\",\n\tTRAVEL = \"TRAVEL\",\n}\n\nexport interface CustomerAddress {\n\tid?: number;\n\taddressId?: number; // Update address temporary\n\tcountryCode: string;\n\tcityName: string;\n\tstreet: string;\n\thouseNumber: string;\n\tadditionalNumber?: string;\n\tpostCode?: string;\n\tinstructions?: string;\n\tfloor?: number;\n\tlongitude?: number;\n\tlatitude?: number;\n\ttitle?: string;\n\ttype?: CustomerAddressType;\n}\n\nexport interface CustomerAuthForm {\n\tphoneNumber: string;\n\totp: string;\n\temail: string;\n}\n\nexport interface CustomerAuthPhoneForm {\n\tcountryCode: string;\n\tphoneNumber: string;\n}\n\nexport interface AuthResponse {\n\taccessToken: string;\n\trefreshToken: string;\n}\n\nexport interface Customer {\n\tid?: number;\n\temail: string;\n\tphoneNumber: string;\n\tfullName: string;\n\tsmsVerified?: boolean;\n\temailVerified?: boolean;\n\taddress?: CustomerAddress;\n\taddresses?: CustomerAddress[];\n}\n\nexport type CustomerUpdatePayload = Partial<Customer>;\n","import { FormErrors } from \"@sorocraft/ui\";\nimport { checkIsValidEmail } from \"@sorocraft/js-utils\";\n\nimport * as viewUtils from \"src/modules/view/utils\";\n\nimport {\n\tCustomerAddress,\n\tCustomerAuthForm,\n\tCustomerAuthPhoneForm,\n\tCustomerAuthStep,\n} from \"./models\";\n\nexport const preparePhoneNumber = (form: CustomerAuthPhoneForm) => {\n\tconst phoneNumber = `${form.countryCode}${form.phoneNumber}`.replaceAll(\"+\", \"\");\n\n\treturn phoneNumber;\n};\n\nexport const validateForm = (form: CustomerAuthForm, step: CustomerAuthStep): FormErrors => {\n\tconst errors: FormErrors = {};\n\tconst { phoneNumber, email, otp } = form || {};\n\n\tswitch (step) {\n\t\tcase CustomerAuthStep.PHONE: {\n\t\t\tconst { isValid, error } = viewUtils.validatePhoneNumber(phoneNumber);\n\t\t\tif (!isValid) errors.phoneNumber = error;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase CustomerAuthStep.OTP: {\n\t\t\tconst { isValid, error } = viewUtils.validatePhoneNumber(phoneNumber);\n\t\t\tif (!isValid) errors.phoneNumber = error;\n\n\t\t\tif (!otp || otp.length !== 6) {\n\t\t\t\terrors.otp = \"Invalid OTP\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tcase CustomerAuthStep.EMAIL: {\n\t\t\tif (!email || !checkIsValidEmail(email)) {\n\t\t\t\terrors.email = \"Invalid Email Address\";\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn errors;\n};\n\nexport const validateAddressForm = (form: CustomerAddress): FormErrors => {\n\tconst errorMessage = \"FIELD_REQUIRED\";\n\tconst errors: FormErrors = {};\n\tconst { countryCode, cityName, street, houseNumber } = form || {};\n\n\tif (!countryCode) errors.countryCode = errorMessage;\n\tif (!cityName) errors.cityName = errorMessage;\n\tif (!street) errors.street = errorMessage;\n\tif (!houseNumber) errors.houseNumber = errorMessage;\n\n\treturn errors;\n};\n\nexport const formatCityLine = (fields: (string | undefined)[]) => {\n\treturn (fields || []).filter(Boolean).join(\", \");\n};\n\nexport const formatAddressLine = (\n\tstreet: string,\n\thouseNumber: string,\n\tadditionalNumber: string\n) => {\n\tconst house = [houseNumber, additionalNumber].filter(Boolean).join(\"/\");\n\tconst fullAddress = [street, house].filter(Boolean).join(\" \");\n\n\treturn fullAddress;\n};\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n\nexport const getTLD = (language: string) => {\n\treturn language === \"az\" ? \"az\" : \"co\";\n};\n\nexport const getRegisterUrl = (language: string, source: string) => {\n\tconst tld = getTLD(language);\n\n\treturn `https://app.restaround.${tld}/auth/register?lang=${language}&utm_source=${source}`;\n};\n","import { Category, CategoryProductMap, Product } from \"src/models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: Category[],\n\tproducts: Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, Product[]>>((map, product) => {\n\t\tif (!product.visible) return map;\n\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n"],"names":["getCategoryTranslation","category","language","_b","_a","translations","find","call","item","calculateTotalPrice","price","quantity","vat","IMAGE_BASE_URL","keyStr","triplet","e1","e2","e3","charAt","getAddonOptionRawPrice","addon","optionId","options","id","MenuAddonSelectType","getProductRawPrice","product","getProductVariant","variantId","variants","getSelectedOptionsTotalPrice","selectedAddons","addons","filter","Object","prototype","hasOwnProperty","reduce","total","addonId","selectType","SINGLE","selectedOptionId","multipleTotal","getProductVariantRawPrice","variant","getProductOrderRawPrice","noVat","isEmpty","optionsPrice","productData","assign","selectedOptionsTotalPrice","getOrderAddonsPrice","orderAddons","sum","current","validators","number","AZERBAIJANI_PREFIXES","RegExp","join","test","isValid","error","validatePhoneNumber","phoneNumber","cleaned","replace","countryCode","startsWith","nationalNumber","slice","length","validator","CustomerAuthStep","CustomerAddressType","CO_DOMAIN","DOMAINS","getTLD","street","houseNumber","additionalNumber","Boolean","fields","productId","Error","orderItemsId","addonIdsPart","entries","map","option","optionIds","Array","isArray","_c","t","title","hostname","domain","includes","url","categoryId","categories","name","coverImage","image","logoImage","currency","totalPrice","formattedTotalPrice","priceFormatter","orderItem","basePrice","itemNetPrice","itemTax","itemGrossPrice","totalGross","totalNet","totalTax","order","totalWithoutTax","items","itemTotal","undefined","totalWithTax","totalWithoutTaxFormatted","totalTaxFormatted","totalWithTaxFormatted","source","acc","products","productMap","visible","Number","push","form","replaceAll","r","g","b","errorMessage","errors","cityName","step","email","otp","PHONE","viewUtils.validatePhoneNumber","OTP","EMAIL","checkIsValidEmail"],"mappings":"wDAIaA,EAAyB,CACrCC,EACAC,aAEA,OAAuC,QAA/BC,EAAsB,QAAtBC,EAAAH,aAAQ,EAARA,EAAUI,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAI,KAAAH,GAACI,GAASA,EAAKN,WAAaA,MAClE,CAAE,CAAA,ECTSO,EAAsB,CAACC,EAAgB,EAAGC,EAAmB,EAAGC,EAAc,IACnFF,EAAQC,GAAY,EAAIC,EAAM,KCDzBC,EAAiB,+BA0BxBC,EAAS,oEAETC,EAAU,CAACC,EAAYC,EAAYC,IACxCJ,EAAOK,OAAOH,GAAM,GACpBF,EAAOK,QAAc,EAALH,IAAW,EAAMC,GAAM,GACvCH,EAAOK,QAAc,GAALF,IAAY,EAAMC,GAAM,GACxCJ,EAAOK,OAAY,GAALD,GCOFE,EAAyB,CAACC,EAAkBC,WACxD,OAA+D,QAAxDlB,IAACiB,aAAA,EAAAA,EAAOE,UAAW,IAAIjB,MAAK,EAAGkB,QAASA,IAAOF,WAAS,IAAAlB,OAAA,EAAAA,EAAEM,QAAS,CAAC,ECxC5E,IAAYe,GAAZ,SAAYA,GACXA,EAAA,OAAA,SACAA,EAAA,SAAA,UACA,CAHD,CAAYA,IAAAA,EAGX,CAAA,UCWYC,EAAqB,CAACC,EAAkBhB,EAAmB,KACvE,MAAMD,MAAEA,EAAQ,EAACE,IAAEA,EAAM,GAAMe,GAAW,CAAE,EAC5C,OAAOlB,EAAoBC,EAAOC,EAAUC,EAAI,EAiBpCgB,EAAoB,CAACD,EAAkBE,aACnD,OAA8B,QAAvB1B,EAAiB,QAAjBC,EAAAuB,aAAO,EAAPA,EAASG,gBAAQ,IAAA1B,OAAA,EAAAA,EAAEE,YAAI,IAAAH,OAAA,EAAAA,EAAAI,KAAAH,GAAII,GAASA,EAAKgB,KAAOK,MAAe,CAAqB,CAAA,EAG/EE,EAA+B,CAC3CJ,EACAK,EAA6C,CAAA,EAC7CrB,MAG4BgB,aAAO,EAAPA,EAASM,SAAU,IAAIC,QAAQb,GAC1Dc,OAAOC,UAAUC,eAAe9B,KAAKyB,EAAgBX,EAAMG,MAIfc,QAAO,CAACC,EAAelB,KACnE,MAAQG,GAAIgB,EAAOC,WAAEA,GAAepB,EAGpC,GAAIoB,IAAehB,EAAoBiB,OAAQ,CAC9C,MAAMC,EAAmBX,EAAeQ,GACxC,OAAOD,EAAQnB,EAAuBC,EAAOsB,GAU9C,OAAOJ,GANoBP,EAAeQ,IAAY,IACPF,QAC9C,CAACM,EAAetB,IAAasB,EAAgBxB,EAAuBC,EAAOC,IAC3E,EAGkC,GACjC,GAEwBX,EAGfkC,EAA4B,CACxChB,EACAF,EACAhB,KAEA,MAAMmC,EAAUlB,EAAkBD,EAASE,IACrCjB,IAAEA,GAAQe,GAAW,CAAE,GACvBjB,MAAEA,GAAUoC,GAAW,CAAE,EAC/B,OAAOrC,EAAoBC,EAAOC,EAAUC,EAAI,EAgCpCmC,EAA0B,EACtCpB,UACAE,YACAlB,WAAW,EACXqB,iBACAgB,SAAQ,MAQR,GAAIC,EAAAA,QAAQtB,GAAU,MAAO,CAAEjB,MAAO,EAAGwC,aAAc,EAAGX,MAAO,GAEjE,MAAMY,EAA4BhB,OAAAiB,OAAAjB,OAAAiB,OAAA,CAAA,EAAAzB,IAASf,IAAKoC,EAAQ,EAAIrB,EAAQf,MAC9DyC,EAA4BtB,EACjCoB,EACAnB,EACArB,GAEKD,EAAQmB,EACXgB,EAA0BhB,EAAWsB,EAAaxC,GAClDe,EAAmByB,EAAaxC,GAEnC,MAAO,CACND,QACAwC,aAAcG,EACdd,MAAO7B,EAAQ2C,EACf,ECvIWC,EAAsB,CAACC,EAA4B,GAAI5C,IAG5DA,EAFuB4C,EAAYjB,QAAO,CAACkB,EAAKC,IAAYD,EAAMC,EAAQ/C,OAAO,GCEnFgD,EAAwC,CAC7C,IAAQC,IACP,MAAMC,EAAuB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAGxE,OAFgB,IAAIC,OAAO,KAAKD,EAAqBE,KAAK,gBAE7CC,KAAKJ,GASX,CAAEK,SAAS,GARV,CACNA,SAAS,EACTC,MAAO,uDAAuDL,EAAqBE,KAClF,QAKqB,EAGzB,GAAOH,GACU,UAEHI,KAAKJ,GAOX,CAAEK,SAAS,GANV,CACNA,SAAS,EACTC,MAAO,2CAQL,SAAUC,EAAoBC,GACnC,IAAKA,EACJ,MAAO,CAAEH,SAAS,EAAOC,MAAO,kBAGjC,MAAMG,EAAUD,EAAYE,QAAQ,MAAO,IAErCC,EAAcF,EAAQG,WAAW,OAAS,MAAQH,EAAQG,WAAW,MAAQ,KAAO,KAE1F,IAAKD,EACJ,MAAO,CAAEN,SAAS,EAAOC,MAAO,4BAGjC,MAAMO,EAAiBJ,EAAQK,MAAMH,EAAYI,QAGjD,OAAOC,EAFWjB,EAAWY,IAEZE,EAClB,CCvDA,IAAYI,EAMAC,GANZ,SAAYD,GACXA,EAAA,MAAA,QACAA,EAAA,IAAA,MACAA,EAAA,MAAA,OACA,CAJD,CAAYA,IAAAA,EAIX,CAAA,IAED,SAAYC,GACXA,EAAA,KAAA,OACAA,EAAA,KAAA,OACAA,EAAA,OAAA,QACA,CAJD,CAAYA,IAAAA,EAIX,CAAA,ICEY,MCZAC,EAAY,gBAKZC,EAAU,CAACD,EAJC,gBACA,gBACA,iBCKZE,EAAU9E,GACF,OAAbA,EAAoB,KAAO,sFF6DF,CAChC+E,EACAC,EACAC,IAGoB,CAACF,EADP,CAACC,EAAaC,GAAkBjD,OAAOkD,SAAStB,KAAK,MAC/B5B,OAAOkD,SAAStB,KAAK,4BAV3BuB,IACtBA,GAAU,IAAInD,OAAOkD,SAAStB,KAAK,mCHxBR,CACnCwB,EACAzD,EACAG,KAEA,IAAKsD,EAAW,MAAM,IAAIC,MAAM,0BAGhC,IAAIC,EAAe,GAAGF,IAClBzD,IACH2D,GAAgB,IAAI3D,KAIrB,MAAM4D,EAAetD,OAAOuD,QAAQ1D,GAAkB,CAAE,GACtD2D,KAAI,EAAEnD,EAASoD,MACf,IAAKpD,IAAYoD,EAAQ,OAAO,KAChC,MAAMC,EAAYC,MAAMC,QAAQH,GAAUA,EAAO1D,OAAOkD,SAAStB,KAAK,KAAO,GAAG8B,IAChF,OAAKC,EACE,GAAGrD,KAAWqD,IADE,IACS,IAEhC3D,OAAOkD,SACPtB,KAAK,KAOP,OAJI2B,IACHD,GAAgB,IAAIC,KAGdD,CAAY,qEH1DqB,CACxCI,EACA1F,aAEA,OAAqC,QAA7BC,EAAoB,QAApBC,EAAAwF,aAAM,EAANA,EAAQvF,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAI,KAAAH,GAACI,GAASA,EAAKN,WAAaA,MAChE,CAAE,CAAA,wBAyCyB,CAACmB,EAAkBnB,eAC/C,OAAkE,QAA3D8F,EAAyB,QAAzB7F,EAAmB,QAAnBC,EAAAiB,aAAK,EAALA,EAAOhB,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAI,IAAAH,OAAA,EAAAA,EAAAI,KAAAH,GAAI6F,GAAMA,EAAE/F,WAAaA,WAAS,IAAA8F,OAAA,EAAAA,EAAEE,QAAS,EAAE,8BApD7C,CAAC7E,EAAkBnB,aACrD,OAAoC,QAA5BC,EAAmB,QAAnBC,EAAAiB,aAAK,EAALA,EAAOhB,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAI,KAAAH,GAACI,GAASA,EAAKN,WAAaA,MAC/D,CAAE,CAAA,qBQTsB,CAACiG,EAAkBjG,KAC5C,MAAMkG,EAASrB,EAAQsB,SAASF,GAAYA,EAAWrB,EAEvD,MAAO,CAAEwB,IAAK,WAAWF,KADVlG,GAAY,OACkBkG,SAAQ,8BXOnB,CAClCG,EACAC,EACAtG,WAEA,MAAMD,EAA2B,QAAhBG,EAAAoG,aAAU,EAAVA,EAAYlG,YAAI,IAAAF,OAAA,EAAAA,EAAAG,KAAAiG,GAAG,EAAGhF,QAASA,IAAO+E,IAEvD,GAAItD,EAAAA,QAAQhD,GAAW,MAAO,GAE9B,MAAMwG,KAAEA,GAASzG,EAAuBC,EAAUC,GAElD,OAAOuG,CAAI,+DELwBC,GAC9BA,EAEDA,EAAWL,SAAS,WAAaK,EAAWnC,WAAW,YAAoBmC,EAExE,GAAG7F,KAAkB6F,IAJJ,6EAjBMC,GACzBA,EAEDA,EAAMN,SAAS,WAAaM,EAAMpC,WAAW,YAAoBoC,EAE9D,GAAG9F,KAAkB8F,IAJT,8BAOeC,GAC7BA,EAEDA,EAAUP,SAAS,WAAaO,EAAUrC,WAAW,YAAoBqC,EAEtE,GAAG/F,KAAkB+F,IAJL,wECWM,EAC7BhB,SACAiB,WAAW,MACX3G,WAAW,SAMX,MAAMQ,MAAEA,GAAUkF,GAAU,CAAE,EAE9B,MAAO,CACNkB,WAAYpG,EACZqG,oBAAqBC,EAAcA,eAACtG,EAAOmG,EAAU3G,GACrD,0BAO6B,CAC9BqB,EACAsE,EACA3F,WAEA,GAAI4F,MAAMC,QAAQF,GACjB,OAAOtE,EACLW,QAAO,EAAGV,QAASqE,EAAUQ,SAAS7E,KACtCmE,KAAI,EAAGtF,mBAAmB,IAAAD,EAAA,OAAiD,QAAjDA,EAAAC,EAAaC,MAAM2F,GAAMA,EAAE/F,WAAaA,WAAS,IAAAE,OAAA,EAAAA,EAAE8F,QAAS,EAAE,IACxFhE,OAAOkD,SACPtB,KAAK,MACD,CACN,MAAM8B,EAASrE,EAAQjB,MAAK,EAAGkB,QAASA,IAAOqE,IAC/C,OAAkE,QAA3DzF,EAAAwF,aAAA,EAAAA,EAAQvF,aAAaC,MAAM2F,GAAMA,EAAE/F,WAAaA,WAAW,IAAAE,OAAA,EAAAA,EAAA8F,QAAS,6DGmB3Ce,UACjC,MAAMvG,MAAEA,EAAKoC,QAAEA,EAAOb,OAAEA,EAAMtB,SAAEA,EAAQC,IAAEA,GAAQqG,GAAa,CAAE,EAC3DC,EAA8B,QAAlB9G,EAAA0C,aAAA,EAAAA,EAASpC,aAAS,IAAAN,EAAAA,EAAAM,EAG9ByG,EAAeD,GAFAjF,GAAU,IAAIK,QAAO,CAACkB,EAAKnC,IAAUmC,EAAMnC,EAAMX,OAAO,GAKvE0G,EAAUF,GAAatG,EAAM,KAC7ByG,EAAiBF,EAAeC,EAMtC,MAAO,CACNE,WAHkBD,EAAiB1G,EAInC4G,SANgBJ,EAAexG,EAO/B6G,SANgBJ,EAAUzG,EAO1B0G,iBACAF,eACAC,UACA,wBAvF2B,CAACK,EAAcZ,EAAkB3G,KAK7D,IAAIwH,EAAkB,EAClBF,EAAW,EAEf,IAAK,MAAMhH,KAAQiH,EAAME,MAAO,CAC/B,MAAMC,GARqBlH,EAQUF,EAAKE,MARAC,EAQOH,EAAKG,SARMsB,EAQIzB,EAAKyB,OAP9DtB,EAAWD,EAAQ4C,EAAoBrB,EAAQtB,IAQtD+G,GAAmBE,OAEDC,IAAdJ,EAAM7G,KAAqBJ,EAAKI,MACnC4G,GAAaI,EAAYpH,EAAKI,IAAO,KAZZ,IAACF,EAAeC,EAAkBsB,OAgB3C4F,IAAdJ,EAAM7G,MACT4G,EAAYE,EAAkBD,EAAM7G,IAAO,KAG5C,MAAMkH,EAAeJ,EAAkBF,EAEvC,MAAO,CACNE,kBACAK,yBAA0Bf,EAAcA,eAACU,EAAiBb,EAAU3G,GACpEsH,WACAQ,kBAAmBhB,EAAcA,eAACQ,EAAUX,EAAU3G,GACtD4H,eACAG,sBAAuBjB,EAAcA,eAACc,EAAcjB,EAAU3G,GAC9D,0BDqI6B,CAACyB,EAAkBa,MACzCb,aAAO,EAAPA,EAASM,SAAU,IAAI3B,MAAK,EAAGkB,QAASA,IAAOgB,KAAa,CAAgB,+BAhCjD,EACnCb,UACAE,YACAlB,WAAW,EACXkG,WACA3G,WACA8B,iBACAgB,SAAQ,MAUR,MAAMT,MAAEA,GAAUQ,EAAwB,CACzCpB,UACAE,YACAlB,WACAqB,iBACAgB,UAGD,MAAO,CACN8D,WAAYvE,EACZwE,oBAAqBC,EAAcA,eAACzE,EAAOsE,EAAU3G,GACrD,4DAvJ6B,CAC9ByB,EACAkF,EACA3G,EACAS,EAAmB,KAEnB,MAAMmG,EAAapF,EAAmBC,EAAShB,GAE/C,MAAO,CACNmG,WAAYA,EACZC,oBAAqBC,EAAcA,eAACF,EAAYD,EAAU3G,GAC1D,6DArBmC,CAACyB,EAAkBzB,aACvD,OAAsC,QAA9BC,EAAqB,QAArBC,EAAAuB,aAAO,EAAPA,EAAStB,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAI,KAAAH,GAACI,GAASA,EAAKN,WAAaA,MACjE,CAAE,CAAA,6DAsEkC,EACrC2B,YACAgF,WAAW,MACX3G,WAAW,KACXyB,UACAhB,WAAW,MAQX,MAAMmG,EAAajE,EAA0BhB,EAAWF,EAAShB,GAEjE,MAAO,CACNmG,WAAYA,EACZC,oBAAqBC,EAAcA,eAACF,EAAYD,EAAU3G,GAC1D,2EAG0C,CAC3C4C,EACA5C,aAEA,OAAsC,QAA9BC,EAAqB,QAArBC,EAAA0C,aAAO,EAAPA,EAASzC,oBAAY,IAAAD,OAAA,EAAAA,EAAEE,YAAO,IAAAH,OAAA,EAAAA,EAAAI,KAAAH,GAACI,GAASA,EAAKN,WAAaA,MACjE,CAAE,CAAA,yBM/F0B,CAACA,EAAkBgI,IAGzC,0BAFKlD,EAAO9E,yBAEwCA,gBAAuBgI,4CLqFnC1H,KACPA,aAAA,EAAAA,EAAMyB,SAAU,IAAIK,QAC3D,CAAC6F,GAAO3F,UAASlB,eAChB6G,EAAI3F,GAAWlB,EAER6G,IAER,iGMzG0C,CAC3C3B,EACA4B,KAEA,MAAMC,EAAaD,EAAS9F,QAAkC,CAACqD,EAAKhE,KACnE,IAAKA,EAAQ2G,QAAS,OAAO3C,EAE7B,MAAMY,EAAagC,OAAO5G,EAAQ4E,YAKlC,OAJKZ,EAAIY,KACRZ,EAAIY,GAAc,IAEnBZ,EAAIY,GAAYiC,KAAK7G,GACdgE,CAAG,GACR,IAEH,OAAOa,EACLb,KAAK1F,GACFkC,OAAAiB,OAAAjB,OAAAiB,OAAA,CAAA,EAAAnD,GACH,CAAAmI,SAAWC,EAAWE,OAAOtI,EAASuB,MAAQ,OAE9CU,QAAQjC,IAAa,IAAAG,EAAA,OAAoB,QAApBA,EAAAH,aAAA,EAAAA,EAAUmI,gBAAU,IAAAhI,OAAA,EAAAA,EAAAsE,QAAS,CAAC,GAAC,6BHVpB+D,GACd,GAAGA,EAAKnE,cAAcmE,EAAKtE,cAAcuE,WAAW,IAAK,uBPqBpD,CAACC,EAAWC,EAAWC,IAChD,yCACC9H,EAAQ,EAAG4H,EAAGC,GAAK7H,EAAQ8H,EAAG,IAAK,uEOiBDJ,IACnC,MAAMK,EAAe,iBACfC,EAAqB,CAAE,GACvBzE,YAAEA,EAAW0E,SAAEA,EAAQ/D,OAAEA,EAAMC,YAAEA,GAAgBuD,GAAQ,CAAE,EAOjE,OALKnE,IAAayE,EAAOzE,YAAcwE,GAClCE,IAAUD,EAAOC,SAAWF,GAC5B7D,IAAQ8D,EAAO9D,OAAS6D,GACxB5D,IAAa6D,EAAO7D,YAAc4D,GAEhCC,CAAM,uBA7Cc,CAACN,EAAwBQ,KACpD,MAAMF,EAAqB,CAAE,GACvB5E,YAAEA,EAAW+E,MAAEA,EAAKC,IAAEA,GAAQV,GAAQ,CAAE,EAE9C,OAAQQ,GACP,KAAKrE,EAAiBwE,MAAO,CAC5B,MAAMpF,QAAEA,EAAOC,MAAEA,GAAUoF,EAA8BlF,GACpDH,IAAS+E,EAAO5E,YAAcF,GACnC,MAGD,KAAKW,EAAiB0E,IAAK,CAC1B,MAAMtF,QAAEA,EAAOC,MAAEA,GAAUoF,EAA8BlF,GACpDH,IAAS+E,EAAO5E,YAAcF,GAE9BkF,GAAsB,IAAfA,EAAIzE,SACfqE,EAAOI,IAAM,eAEd,MAGD,KAAKvE,EAAiB2E,MAChBL,GAAUM,EAAiBA,kBAACN,KAChCH,EAAOG,MAAQ,yBASlB,OAAOH,CAAM"}
|
|
@@ -2,6 +2,7 @@ import * as productModels from "src/modules/product/models";
|
|
|
2
2
|
import * as branchModels from "src/modules/branch/models";
|
|
3
3
|
import * as categoryModels from "./category";
|
|
4
4
|
import * as businessModels from "src/modules/business/models";
|
|
5
|
+
import * as featureModels from "src/modules/feature/models";
|
|
5
6
|
export interface PublicMenuData {
|
|
6
7
|
businessId: number;
|
|
7
8
|
branches: branchModels.Branch[];
|
|
@@ -23,6 +24,8 @@ export interface PublicMenuData {
|
|
|
23
24
|
rootPath?: string;
|
|
24
25
|
hostname?: string | null;
|
|
25
26
|
imageTag?: any;
|
|
27
|
+
businessSegment?: featureModels.FeatureSegment;
|
|
28
|
+
businessSettings?: businessModels.BusinessSettings;
|
|
26
29
|
onBranchSelect?: (branchId: number) => void;
|
|
27
30
|
onLanguageSelect?: (code: string) => void;
|
|
28
31
|
}
|
|
@@ -1,11 +1,36 @@
|
|
|
1
|
+
import { PricingInterval } from "src/models/pricing";
|
|
2
|
+
import * as featureModels from "../feature/models";
|
|
3
|
+
export declare enum SubscriptionStatus {
|
|
4
|
+
ACTIVE = "ACTIVE",
|
|
5
|
+
EXPIRED = "EXPIRED",
|
|
6
|
+
CANCELLED = "CANCELLED"
|
|
7
|
+
}
|
|
8
|
+
export type BillingInterval = "MONTH" | "YEAR";
|
|
9
|
+
export interface Subscription {
|
|
10
|
+
id: number;
|
|
11
|
+
billingInterval: BillingInterval;
|
|
12
|
+
billingIntervalCount: number;
|
|
13
|
+
startDate: string;
|
|
14
|
+
endDate: string;
|
|
15
|
+
interval: PricingInterval;
|
|
16
|
+
status: SubscriptionStatus;
|
|
17
|
+
business_id?: number;
|
|
18
|
+
planName: string;
|
|
19
|
+
}
|
|
1
20
|
export interface BusinessLanguage {
|
|
2
21
|
id: number;
|
|
3
22
|
code: string;
|
|
4
23
|
businessId: number;
|
|
5
24
|
}
|
|
25
|
+
export interface BusinessSettings {
|
|
26
|
+
deliveryOrderEnabled: boolean;
|
|
27
|
+
pickupOrderEnabled: boolean;
|
|
28
|
+
dineInOrderEnabled: boolean;
|
|
29
|
+
}
|
|
6
30
|
export interface Business {
|
|
7
31
|
id: number;
|
|
8
32
|
name: string;
|
|
33
|
+
username: string;
|
|
9
34
|
avatar64?: string;
|
|
10
35
|
avatar128?: string;
|
|
11
36
|
avatar256?: string;
|
|
@@ -13,8 +38,10 @@ export interface Business {
|
|
|
13
38
|
instagram?: string;
|
|
14
39
|
facebook?: string;
|
|
15
40
|
tiktok?: string;
|
|
16
|
-
createdAt
|
|
41
|
+
createdAt?: number;
|
|
17
42
|
currency: string;
|
|
18
43
|
languages: BusinessLanguage[];
|
|
19
|
-
|
|
44
|
+
subscriptions?: Subscription[];
|
|
45
|
+
segment?: featureModels.FeatureSegment;
|
|
46
|
+
settings?: BusinessSettings;
|
|
20
47
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FormErrors } from "@sorocraft/ui";
|
|
2
|
+
import { CustomerAddress, CustomerAuthForm, CustomerAuthPhoneForm, CustomerAuthStep } from "./models";
|
|
3
|
+
export declare const preparePhoneNumber: (form: CustomerAuthPhoneForm) => string;
|
|
4
|
+
export declare const validateForm: (form: CustomerAuthForm, step: CustomerAuthStep) => FormErrors;
|
|
5
|
+
export declare const validateAddressForm: (form: CustomerAddress) => FormErrors;
|
|
6
|
+
export declare const formatCityLine: (fields: (string | undefined)[]) => string;
|
|
7
|
+
export declare const formatAddressLine: (street: string, houseNumber: string, additionalNumber: string) => string;
|
|
@@ -1,15 +1,20 @@
|
|
|
1
|
+
import * as customerModels from "../customer/models";
|
|
1
2
|
export declare enum OrderType {
|
|
2
3
|
DINE_IN = "DINE_IN",
|
|
3
4
|
PICK_UP = "PICK_UP",
|
|
4
5
|
DELIVERY = "DELIVERY"
|
|
5
6
|
}
|
|
6
7
|
export declare enum OrderStatus {
|
|
8
|
+
DRAFT = "DRAFT",
|
|
7
9
|
PENDING = "PENDING",
|
|
8
10
|
CONFIRMED = "CONFIRMED",
|
|
9
11
|
PREPARING = "PREPARING",
|
|
10
12
|
READY = "READY",
|
|
13
|
+
OUT_FOR_DELIVERY = "OUT_FOR_DELIVERY",
|
|
14
|
+
DELIVERED = "DELIVERED",
|
|
11
15
|
COMPLETED = "COMPLETED",
|
|
12
|
-
CANCELLED = "CANCELLED"
|
|
16
|
+
CANCELLED = "CANCELLED",
|
|
17
|
+
FAILED = "FAILED"
|
|
13
18
|
}
|
|
14
19
|
export declare enum OrderItemStatus {
|
|
15
20
|
PENDING = "PENDING",
|
|
@@ -56,7 +61,6 @@ export interface Order {
|
|
|
56
61
|
branchId?: number;
|
|
57
62
|
workingDayId?: number;
|
|
58
63
|
tableId?: number;
|
|
59
|
-
customerId?: number;
|
|
60
64
|
employeeId?: number;
|
|
61
65
|
orderType: OrderType;
|
|
62
66
|
totalPriceWithTax: number;
|
|
@@ -69,6 +73,7 @@ export interface Order {
|
|
|
69
73
|
note?: string;
|
|
70
74
|
createdAt?: number;
|
|
71
75
|
updatedAt?: number;
|
|
76
|
+
customer?: customerModels.Customer;
|
|
72
77
|
}
|
|
73
78
|
export interface OrderItems {
|
|
74
79
|
[key: string]: OrderItem;
|
|
@@ -78,3 +83,7 @@ export declare enum OrderStep {
|
|
|
78
83
|
DETAILS = "DETAILS",
|
|
79
84
|
COMPLETED = "COMPLETED"
|
|
80
85
|
}
|
|
86
|
+
export interface OrderPayload extends Order {
|
|
87
|
+
customerAddressId: number;
|
|
88
|
+
customerId: number;
|
|
89
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@restaround/react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"description": "React Library by restaround.co",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.esm.js",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"homepage": "https://restaround.co",
|
|
51
51
|
"peerDependencies": {
|
|
52
52
|
"@sorocraft/js-utils": ">=1.0.36",
|
|
53
|
-
"@sorocraft/ui": ">=1.
|
|
53
|
+
"@sorocraft/ui": ">=1.2.2",
|
|
54
54
|
"react": ">=19.0.0",
|
|
55
55
|
"react-dom": ">=19.0.0"
|
|
56
56
|
},
|
|
@@ -61,12 +61,12 @@
|
|
|
61
61
|
"@rollup/plugin-typescript": "^12.1.2",
|
|
62
62
|
"@types/jest": "^29.5.14",
|
|
63
63
|
"@types/react": "^19.1.2",
|
|
64
|
-
"@types/react-dom": "^19.1.
|
|
64
|
+
"@types/react-dom": "^19.1.3",
|
|
65
65
|
"autoprefixer": "^10.4.21",
|
|
66
|
-
"eslint": "^9.
|
|
66
|
+
"eslint": "^9.26.0",
|
|
67
67
|
"eslint-plugin-react": "^7.37.5",
|
|
68
68
|
"eslint-plugin-react-hooks": "^5.2.0",
|
|
69
|
-
"eslint-plugin-unicorn": "^
|
|
69
|
+
"eslint-plugin-unicorn": "^59.0.0",
|
|
70
70
|
"jest": "^29.7.0",
|
|
71
71
|
"jest-environment-jsdom": "^29.7.0",
|
|
72
72
|
"rimraf": "^6.0.1",
|
|
@@ -78,6 +78,6 @@
|
|
|
78
78
|
"ts-node": "^10.9.2",
|
|
79
79
|
"tslib": "^2.8.1",
|
|
80
80
|
"typescript": "^5.8.3",
|
|
81
|
-
"typescript-eslint": "^8.31.
|
|
81
|
+
"typescript-eslint": "^8.31.1"
|
|
82
82
|
}
|
|
83
83
|
}
|