UNPKG

@open-tender/utils

Version:

A library of utils for use with Open Tender applications that utilize our cloud-based Order API.

181 lines (180 loc) 8.54 kB
import { isEmpty } from './helpers'; export const handleRespError = (err) => { const error = typeof err === 'string' ? { detail: err } : err; let { detail } = error || {}; const { title = 'Something went wrong', params } = error || {}; const messages = params ? Object.entries(params || {}) : []; const errors = !params ? {} : Object.entries(params || {}).reduce((obj, [key, msg]) => { const [, attribute, index, field] = key.split('.'); if (!index) return Object.assign(Object.assign({}, obj), { [attribute]: msg }); const error = { index: JSON.parse(index)[0], [field]: msg }; const errors = obj[attribute] ? [...obj[attribute], error] : [error]; return Object.assign(Object.assign({}, obj), { [attribute]: errors }); }, {}); if (detail && detail.includes('parameters') && messages.length) { detail = messages[0][1]; } return { title, detail, messages, errors, err }; }; export const processError = (msg) => { if (!msg) return errMessages.unknown; if (msg.includes('is a required property')) { return errMessages.requiredField; } else if (msg.includes("'' is too short")) { return errMessages.requiredField; } else if (msg.includes("not a 'email'")) { return errMessages.invalidEmail; } else if (msg.includes("not a 'phone'")) { return errMessages.invalidPhone; } else if (msg.includes("not a 'optional-phone'")) { return errMessages.invalidPhone; } else if (msg.includes('invalid token')) { return errMessages.invalidToken; } else if (msg.includes("not a 'user-password'")) { return errMessages.invalidPassword; } else if (msg.includes("not a 'optional-date'")) { return errMessages.invalidDate; } return msg; }; const makeErrObj = (keys, msg) => { const obj = keys.reduceRight((msg, key) => ({ [key]: msg }), msg); return typeof obj === 'string' ? null : obj; }; export const handleFormErrorsNested = (params) => { return Object.entries(params).reduce((obj, error) => { const [field, msg] = error; const errMsg = typeof msg === 'string' ? msg : msg === null || msg === void 0 ? void 0 : msg.detail; if (!errMsg) return obj; const message = processError(errMsg); const keys = field.replace('$.', '').split('.'); const errObj = makeErrObj(keys, message); return errObj ? Object.assign(Object.assign({}, obj), errObj) : obj; }, {}); }; export const makeFormErrorsNested = (error) => { let errors = {}; if (error === null || error === void 0 ? void 0 : error.params) { errors = handleFormErrorsNested(error.params); errors.form = error.detail; } else { errors.form = (error === null || error === void 0 ? void 0 : error.detail) || (error === null || error === void 0 ? void 0 : error.message) || ''; } return errors; }; export const handleFormErrors = (params) => { return Object.entries(params).reduce((obj, error) => { const [field, msg] = error; const message = processError(msg); return Object.assign(Object.assign({}, obj), { [field.replace('$.', '')]: message }); }, {}); }; export const makeFormErrors = (error) => { let errors = {}; if (error === null || error === void 0 ? void 0 : error.params) { errors = handleFormErrors(error.params); errors.form = error.detail; } else { errors.form = (error === null || error === void 0 ? void 0 : error.detail) || (error === null || error === void 0 ? void 0 : error.message) || ''; } return errors; }; export const handleCheckoutError = (error) => { const { detail, params, message } = error || {}; if (!params || isEmpty(params)) return { form: detail || message || 'Unknown error. Please contact support.' }; const errObj = Object.entries(params).reduce((obj, error) => { const [key, value] = error; const errMsg = value.message; const [, entity, index, field] = key.split('.'); const existingEntity = Object.hasOwn(obj, entity) ? obj[entity] : null; if (!index) { return Object.assign(Object.assign({}, obj), { [entity]: errMsg }); } else if (!field) { if (existingEntity && typeof existingEntity !== 'string') { return Object.assign(Object.assign({}, obj), { [entity]: Object.assign(Object.assign({}, existingEntity), { [index]: errMsg }) }); } else { return Object.assign(Object.assign({}, obj), { [entity]: { [index]: errMsg } }); } } else { if (existingEntity && typeof existingEntity !== 'string') { const existingIndex = existingEntity[index] || null; const newIndex = existingIndex && typeof existingIndex !== 'string' ? Object.assign(Object.assign({}, existingIndex), { [field]: errMsg }) : { [field]: errMsg }; const newEntity = Object.assign(Object.assign({}, existingEntity), { [index]: newIndex }); return Object.assign(Object.assign({}, obj), { [entity]: newEntity }); } else { return Object.assign(Object.assign({}, obj), { [entity]: { [index]: { [field]: errMsg } } }); } } }, { form: 'There are one or more errors below' }); return errObj; }; export const makeCheckError = (params) => { if (!params || isEmpty(params)) return null; const error = { code: 'CHECK_ERRORS', detail: 'The parameters of your request were invalid.', status: 400, title: 'Checkout Errors', params }; return error; }; export const errMessages = { unknown: 'Unknown error. Please contact Open Tender support.', forbidden: 'Your account does not have access to this page. Please contact your brand admin to request access.', expiredToken: 'Reset token has expired. Please head back to the login form and try again.', notAllowed: "This operation isn't allowed for this entity", duplicates: 'One or more fields are already in use. Please choose different values.', errorsBelow: 'There are one or more errors below.', emptyField: 'This field cannot be empty', invalidAmount: 'Invalid amount', invalidEmail: 'Invalid email address', invalidEmails: 'One or more email addresses are invaiid', notInteger: 'Must be an integer', positiveInteger: 'Must be a positive integer', invalidTime: 'Enter in HH:MM AM|PM format (e.g. 9:40 AM)', invalidDate: 'Enter in YYYY-MM-DD format or leave blank', invalidNumber: 'Enter as a number with or without decimals', invalidHex: 'Enter as a hexidecimal color code', invalidZip: 'Enter a valid 5 digit zip code', invalidPhone: 'Invalid phone number', invalidPassword: 'Invalid password. Passwords must be at least 8 characters and include only letters and numbers and any of these special characters: !@#$%^&_-+=<>.', invalidToken: 'Password reset token is invalid or expired. Please resubmit your password reset request via the login form.', requiredField: 'This field is required', invalidFilename: 'Invalid filename. Please rename the file and try again.', notExist: 'The requested entity does not exist.', serverError: 'Unknown error. Please contact Open Tender support.', invalidHours: 'One or more invalid times submitted. Please see below.', revenueCenterClosed: 'This location is closed or otherwise not able to accept orders at the selected time. Please try changing your order time.', serviceTypeNotAvailable: 'This location does not offer the selected service type at this time. Please switch to another service type.', notInZone: 'Selected address not in the delivery zone for this revenue center', missingAddress: 'An address is required for delivery orders. Please add one.', orderNotFound: "Sorry, but we couldn't find an order matching that ID. Please try again.", distanceSurcharge: "Distance-based surcharges can't be applied to orders with requested times in the past. Please adjust your requested delivery time.", missingAddressDeliveryZone: "Please add an address for this revenue center or the revenue center's parent store before setting a delivery zone" };