@trii/components 2.0.54 → 2.0.55
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/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../node_modules/react/cjs/react-jsx-runtime.development.js","../../node_modules/react/jsx-runtime.js","../../src/components/ContactInfoPopup/components/Header/Header.tsx","../../src/components/ContactInfoPopup/components/ContactMethod/ContactMethod.tsx","../../src/components/ContactInfoPopup/components/Properties/Properties.tsx","../../src/components/ContactInfoPopup/components/LabelsSection/LabelsSection.tsx","../../src/components/ContactInfoPopup/types/is-contact.typeguard.ts","../../src/components/ContactInfoPopup/components/BusinessSection/BusinessSection.tsx","../../src/components/ContactInfoPopup/types/is-business.typeguard.ts","../../src/components/ContactInfoPopup/components/MembersSection/components/MemberItem/MemberItem.tsx","../../src/components/ContactInfoPopup/components/MembersSection/MembersSection.tsx","../../src/i18n/config.ts","../../src/components/ContactInfoPopup/ContactInfoPopup.tsx","../../src/components/EditContactModal/context/TranslationContext.tsx","../../src/components/EditContactModal/components/Header/components/Tags/Tags.tsx","../../src/components/EditContactModal/context/EditContactApiContext.tsx","../../src/components/EditContactModal/components/Header/components/ContactName/ContactName.tsx","../../src/components/EditContactModal/components/Header/components/AvatarWithActions/AvatarWithActions.tsx","../../src/components/EditContactModal/components/Header/Header.tsx","../../src/components/EditContactModal/components/TagsEditor/TagsEditor.tsx","../../src/components/EditContactModal/services/http.ts","../../src/components/EditContactModal/services/urls.ts","../../src/components/EditContactModal/services/api.ts","../../src/components/EditContactModal/components/SearchLocation/googleMapsUtils.ts","../../src/components/EditContactModal/components/SearchLocation/SearchLocationInput.tsx","../../src/components/EditContactModal/components/SearchLocation/SearchLocationEditor.tsx","../../src/components/EditContactModal/types/is-business.typeguard.ts","../../src/components/EditContactModal/types/is-contact.typeguard.ts","../../src/components/EditContactModal/hooks/useEditContactModalController.ts","../../src/components/EditContactModal/hooks/useImage.ts","../../src/components/EditContactModal/hooks/useField.ts","../../src/components/EditContactModal/hooks/useSelect.ts","../../node_modules/uuid/dist/esm-browser/rng.js","../../node_modules/uuid/dist/esm-browser/stringify.js","../../node_modules/uuid/dist/esm-browser/native.js","../../node_modules/uuid/dist/esm-browser/v4.js","../../src/components/EditContactModal/utils/contactHelper.ts","../../src/components/EditContactModal/hooks/utils/editContactHelper.ts","../../src/components/EditContactModal/hooks/useEditContactMethods.ts","../../src/components/EditContactModal/hooks/useMultipleSelect.ts","../../src/components/EditContactModal/hooks/useEditBusiness/useEditBusiness.ts","../../src/components/EditContactModal/hooks/useEditContact/useEditContact.ts","../../src/components/EditContactModal/context/EditEntityContext.tsx","../../src/components/EditContactModal/components/Section/utils/resolveUserLabel.ts","../../src/components/EditContactModal/layout/Section.tsx","../../src/components/EditContactModal/layout/SectionContent.tsx","../../src/components/EditContactModal/shared/ContactInfoLabel/components/DateSelect/DateSelect.tsx","../../src/components/EditContactModal/context/EditContactViewContext.tsx","../../src/components/EditContactModal/context/NavigateContext.tsx","../../src/components/EditContactModal/shared/EntityInfoLabel/components/SelectBusinessLabel/SelectBusinessLabel.tsx","../../src/components/EditContactModal/shared/EntityInfoLabel/EntityInfoLabel.tsx","../../src/components/EditContactModal/shared/ContactInfoLabel/ContactInfoLabel.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyInput/CustomPropertyInput.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyDatePicker/CustomPropertyDatePicker.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyOptionSelect/CustomPropertyOptionsSelect.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyTimePicker/CustomPropertyTimePicker.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyTimeRangePicker/CustomPropertyTimeRangePicker.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyDateRangePicker/CustomPropertyDateRangePicker.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/EntityCustomFieldLabel.tsx","../../src/components/EditContactModal/components/Section/General/components/ContactGeneral.tsx","../../src/components/EditContactModal/shared/BusinessInfoLabel/BusinessInfoLabel.tsx","../../src/components/EditContactModal/components/Section/General/components/BusinessGeneral.tsx","../../src/components/EditContactModal/components/Section/General/General.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/hooks/useEditModal.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/ContactMethod/components/ContactMethodItem/ContactMethodItem.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/ContactMethod/components/ContactMethodPhoneItem/utils/phone.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/ContactMethod/components/ContactMethodPhoneItem/ContactMethodPhoneItem.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/ContactMethod/ContactMethod.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/SubsectionHeader/SubsectionHeader.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/SubsectionHeaderWithButton/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/SubsectionHeaderWithButton/SubsectionHeaderWithButton.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/InformationItemContainer/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/InformationItemContainer/InformationItemContainer.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/NoteDeleteButton/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/components/Body/components/Phone/components/OptionsMenu/OptionsMenu.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/NoteDeleteButton/NoteDeleteButton.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/InformationItemInputsContainer/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/InformationItemInputsContainer/InformationItemInputsContainer.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/SubsectionBodyContainer/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/SubsectionBodyContainer/SubsectionBodyContainer.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/StatusAdornment/components/Adornment/Adornment.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/StatusAdornment/StatusAdornment.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/InformationSocialNetworkItem/components/Body/components/Ims/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/InformationSocialNetworkItem/components/Body/components/Ims/Ims.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/InformationSocialNetworkItem/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/InformationSocialNetworkItem/InformationSocialNetworkItem.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/AddressInput/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/AddressInput/AddressInput.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/PhoneInput/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/PhoneInput/PhoneInput.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/WarningsDisplay/components/Warning/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/WarningsDisplay/components/Warning/Warning.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/WarningsDisplay/WarningsDisplay.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/components/Body/components/Phone/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/components/Body/components/Phone/Phone.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/Phones.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Mails/components/Body/components/Mail/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Mails/components/Body/components/Mail/Mail.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Mails/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Mails/Mails.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Whatsapps/components/Body/components/Whatsapp/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Whatsapps/components/Body/components/Whatsapp/Whatsapp.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Whatsapps/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Whatsapps/Whatsapps.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/RCSs/components/Body/components/RCS/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/RCSs/components/Body/components/RCS/RCS.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/RCSs/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/RCSs/RCSs.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/EditModal.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/ContactInformation.tsx","../../src/components/EditContactModal/components/Section/AddressInformation/AddressInformation.tsx","../../src/components/EditContactModal/hooks/useEntityUpdateSync.ts","../../src/components/EditContactModal/hooks/useTagsEditorController.ts","../../src/components/EditContactModal/hooks/useModalCloseHandler.ts","../../src/components/EditContactModal/components/BusinessSelect/BusinessSelectEditor.tsx","../../src/components/EditContactModal/EditContactModal.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n {\n if (hasOwnProperty.call(props, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(props).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import {\r\n Avatar,\r\n Box,\r\n IconButton,\r\n styled,\r\n Typography,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport ArrowForwardIcon from '@mui/icons-material/ArrowForward';\r\nimport MessageIcon from '@mui/icons-material/Message';\r\nimport { useCallback } from 'react';\r\n\r\nconst ButtonsContainer = styled(Box)(({ theme }) => ({\r\n position: 'absolute',\r\n top: 8,\r\n right: 8,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 4,\r\n zIndex: 1,\r\n //@ts-ignore\r\n backgroundColor: theme.palette.background.panel,\r\n}));\r\n\r\nconst SmallIconButton = styled(IconButton)({\r\n padding: 4,\r\n});\r\n\r\nconst HeaderContainer = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n marginBottom: '16px',\r\n position: 'relative',\r\n});\r\n\r\nconst ContactAvatar = styled(Avatar)({\r\n width: 60,\r\n height: 60,\r\n marginBottom: 8,\r\n});\r\n\r\nconst ContactName = styled(Typography)({\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: 200,\r\n textAlign: 'center',\r\n});\r\n\r\nconst LoadingContainer = styled(Box)({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n width: 60,\r\n height: 60,\r\n marginBottom: 8,\r\n});\r\n\r\ntype HeaderProps = {\r\n imgUrl?: string;\r\n name?: string;\r\n contactId?: string;\r\n navigate: (path: string) => void;\r\n isLoading?: boolean;\r\n onError?: (error: Error) => void;\r\n onClose: () => void;\r\n isBusiness?: boolean;\r\n};\r\n\r\nconst Header = ({\r\n imgUrl,\r\n name,\r\n contactId,\r\n navigate,\r\n isLoading = false,\r\n onError,\r\n onClose,\r\n isBusiness = false,\r\n}: HeaderProps) => {\r\n const handleNavigation = useCallback(\r\n (url: string) => (event: React.MouseEvent) => {\r\n try {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (!url) {\r\n throw new Error('Navigation URL is required');\r\n }\r\n\r\n const isNewTab = event.ctrlKey || event.metaKey || event.button === 1; // Ctrl+Click, Cmd+Click, Middle Mouse\r\n\r\n if (isNewTab) {\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n } else {\r\n navigate(url);\r\n }\r\n } catch (error) {\r\n onError?.(error instanceof Error ? error : new Error('Navigation failed'));\r\n }\r\n },\r\n [navigate, onError]\r\n );\r\n\r\n const handleNavigateToContacts = handleNavigation(\r\n isBusiness\r\n ? `/a/contacts/business/${contactId}`\r\n : `/a/contacts/contacts/${contactId}`\r\n );\r\n const handleNavigateToConversations = handleNavigation(\r\n '/a/conversations/conversations'\r\n );\r\n\r\n const displayName = name || 'Unknown Contact';\r\n const avatarAlt = `Avatar for ${displayName}`;\r\n\r\n return (\r\n <HeaderContainer>\r\n <ButtonsContainer>\r\n <SmallIconButton\r\n color=\"info\"\r\n size=\"small\"\r\n onClick={(e) => {\r\n handleNavigateToContacts(e);\r\n onClose();\r\n }}\r\n onMouseDown={(e) => {\r\n if (e.button === 1) {\r\n // Middle mouse button\r\n handleNavigateToContacts(e);\r\n onClose();\r\n }\r\n }}\r\n disabled={!contactId}\r\n aria-label=\"View contact details\"\r\n >\r\n <ArrowForwardIcon fontSize=\"small\" />\r\n </SmallIconButton>\r\n <SmallIconButton\r\n color=\"info\"\r\n size=\"small\"\r\n onClick={(e) => {\r\n handleNavigateToConversations(e);\r\n onClose();\r\n }}\r\n onMouseDown={(e) => {\r\n if (e.button === 1) {\r\n // Middle mouse button\r\n handleNavigateToConversations(e);\r\n onClose();\r\n }\r\n }}\r\n aria-label=\"Go to conversations\"\r\n >\r\n <MessageIcon fontSize=\"small\" />\r\n </SmallIconButton>\r\n </ButtonsContainer>\r\n {isLoading ? (\r\n <LoadingContainer>\r\n <CircularProgress size={24} />\r\n </LoadingContainer>\r\n ) : (\r\n <ContactAvatar\r\n src={imgUrl}\r\n alt={avatarAlt}\r\n onError={() => onError?.(new Error('Failed to load avatar'))}\r\n />\r\n )}\r\n <ContactName variant=\"h6\" title={displayName}>\r\n {displayName}\r\n </ContactName>\r\n </HeaderContainer>\r\n );\r\n};\r\n\r\nexport default Header;\r\n","// Components/ui\r\nimport { Box, Tooltip, Typography, styled } from '@mui/material';\r\n// Types\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ninterface ContactProps {\r\n contactList: IContactAddress[];\r\n title?: string;\r\n showTitle?: boolean;\r\n icon: React.ReactNode;\r\n}\r\n\r\nconst Container = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: 'max-content',\r\n alignItems: 'center',\r\n gap: 8,\r\n});\r\n\r\nconst TitleBox = styled(Box)({\r\n width: '100%',\r\n borderBottom: `1px solid lightgray`,\r\n});\r\n\r\nconst StyledBox = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n padding: 1,\r\n minHeight: '50px',\r\n position: 'relative',\r\n maxWidth: 'inherit'\r\n});\r\n\r\nconst IconBox = styled(Box)(({ theme }) => ({\r\n marginTop: '-20px',\r\n padding: 0,\r\n color: theme.palette.primary.main,\r\n}));\r\n\r\nconst InfoContainer = styled(Box)({\r\n display: 'flex',\r\n maxWidth: '90%',\r\n gap: '10px',\r\n width: '100%',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n alignItems: 'center',\r\n});\r\n\r\nconst AddressContainer = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '50px',\r\n maxWidth: '90%',\r\n\r\n});\r\n\r\nconst NoteText = styled(Typography)({\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n maxWidth: '90%',\r\n position: 'absolute',\r\n bottom: 16,\r\n left: 40,\r\n});\r\n\r\nconst ContactMethod = ({\r\n icon,\r\n contactList,\r\n title,\r\n showTitle = true,\r\n}: ContactProps) => {\r\n const renderContactInfo = (contact: IContactAddress) => (\r\n <StyledBox key={contact.id}>\r\n <InfoContainer>\r\n <IconBox>{icon}</IconBox>\r\n <AddressContainer>\r\n <Tooltip title={contact.address} arrow placement=\"top\">\r\n <Typography\r\n variant=\"subtitle1\"\r\n fontWeight=\"semi-bold\"\r\n fontSize={14}\r\n color=\"text.primary\"\r\n sx={{\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n cursor: 'default',\r\n }}\r\n >\r\n {contact.address}\r\n </Typography>\r\n </Tooltip>\r\n {contact.profileName && (\r\n <Typography\r\n variant=\"body2\"\r\n fontSize={10}\r\n color=\"text.disabled\"\r\n sx={{ marginLeft: '5px', marginTop: '10px' }}\r\n >\r\n {contact.profileName}\r\n </Typography>\r\n )}\r\n </AddressContainer>\r\n {contact.note && (\r\n <NoteText variant=\"body2\" fontSize={12} color=\"text.secondary\">\r\n {contact.note}\r\n </NoteText>\r\n )}\r\n </InfoContainer>\r\n </StyledBox>\r\n );\r\n\r\n return (\r\n <Container>\r\n {showTitle && (\r\n <TitleBox>\r\n <Typography variant=\"subtitle1\" fontWeight=\"bold\" gutterBottom mt={2}>\r\n {title}\r\n </Typography>\r\n </TitleBox>\r\n )}\r\n {contactList?.map(renderContactInfo)}\r\n </Container>\r\n );\r\n};\r\n\r\nexport default ContactMethod;\r\n","// Components/ui\r\nimport { Box, Typography, styled } from '@mui/material';\r\n// Icons\r\nimport { Handyman } from '@mui/icons-material';\r\nimport { ContactField_type, Property } from '@trii/types/dist/Contacts';\r\n// Moment.js\r\nimport moment from 'moment';\r\n\r\ninterface Props {\r\n properties: Property[] | undefined;\r\n title: string;\r\n}\r\nconst Container = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: 'max-content',\r\n alignItems: 'center',\r\n gap: 8,\r\n});\r\n\r\nconst SectionTitle = styled(Typography)({\r\n borderBottom: `1px solid lightgray`,\r\n width: '100%',\r\n});\r\n\r\nconst PropertyItem = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n width: '100%',\r\n});\r\n\r\nconst PropertyText = styled(Typography)({\r\n fontSize: 14,\r\n});\r\n\r\nconst PropertyIcon = styled(Handyman)(({ theme }) => ({\r\n color: theme.palette.primary.main,\r\n fontSize: 16,\r\n}));\r\nconst Properties = ({ properties, title }: Props) => {\r\n const getPropertyTitle = (title: string) => title.replace(/-/g, ' ');\r\n\r\n const formatPropertyValue = (\r\n value: string | string[] | null | undefined,\r\n type: ContactField_type\r\n ): string => {\r\n if (!value || (Array.isArray(value) && value.length === 0)) return '';\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) => formatPropertyValue(item, type)).join(', ');\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const isValidDate = moment(value, moment.ISO_8601).isValid();\r\n const format = (formatStr: string) => moment(value).format(formatStr);\r\n\r\n switch (type) {\r\n case ContactField_type.TIME:\r\n return isValidDate ? format('HH:mm') : value;\r\n case ContactField_type.DATE:\r\n return isValidDate ? format('DD/MM/YYYY') : value;\r\n case ContactField_type.TIMERANGE:\r\n case ContactField_type.DATERANGE:\r\n if (isValidDate) {\r\n return type === ContactField_type.TIMERANGE\r\n ? format('HH:mm')\r\n : format('DD/MM/YYYY');\r\n }\r\n\r\n const parts = value.split(' ');\r\n if (parts.length === 2) {\r\n const [start, end] = parts;\r\n const startFormatted =\r\n type === ContactField_type.TIMERANGE\r\n ? moment(start).format('HH:mm')\r\n : moment(start).format('DD/MM/YYYY');\r\n const endFormatted =\r\n type === ContactField_type.TIMERANGE\r\n ? moment(end).format('HH:mm')\r\n : moment(end).format('DD/MM/YYYY');\r\n return `${startFormatted} - ${endFormatted}`;\r\n }\r\n return value;\r\n default:\r\n return value;\r\n }\r\n }\r\n\r\n return value;\r\n };\r\n\r\n return (\r\n <Container>\r\n <SectionTitle fontWeight=\"bold\" gutterBottom mt={2} variant=\"subtitle1\">\r\n {title}\r\n </SectionTitle>\r\n {properties?.map(\r\n (property, i) =>\r\n property.value.length > 0 && (\r\n <PropertyItem key={i}>\r\n <PropertyIcon />\r\n <PropertyText>\r\n {getPropertyTitle(property.nameKey)}:{' '}\r\n {formatPropertyValue(property.value, property.type)}\r\n </PropertyText>\r\n </PropertyItem>\r\n )\r\n )}\r\n </Container>\r\n );\r\n};\r\n\r\nexport default Properties;\r\n","import { Box, Typography, Chip, styled } from '@mui/material';\r\nimport { IContact, IBusiness } from '@trii/types/dist/Contacts';\r\n\r\nconst SectionTitle = styled(Typography)({\r\n fontWeight: 'bold',\r\n marginBottom: '8px',\r\n marginTop: '16px',\r\n borderBottom: `1px solid lightgray`,\r\n});\r\n\r\nconst TagContainer = styled(Box)({\r\n marginBottom: 16,\r\n});\r\n\r\nconst StyledChip = styled(Chip)(({ theme }) => ({\r\n marginRight: 8,\r\n marginBottom: 8,\r\n backgroundColor: `${theme.palette.primary.main}b3`,\r\n}));\r\n\r\ninterface LabelsSectionProps {\r\n contactData?: IContact | IBusiness;\r\n title: string;\r\n}\r\n\r\nconst LabelsSection = ({ contactData, title }: LabelsSectionProps) => {\r\n if (!contactData) return null;\r\n\r\n if (!contactData.tags?.length) return null;\r\n\r\n return (\r\n <>\r\n <SectionTitle gutterBottom mt={2} variant=\"subtitle1\">\r\n {title}\r\n </SectionTitle>\r\n <TagContainer>\r\n {contactData?.tags\r\n ?.filter((tag) => tag.name?.trim())\r\n .map((tag) => (\r\n <StyledChip key={tag.id} label={tag.name} color=\"primary\" size=\"small\" />\r\n ))}\r\n </TagContainer>\r\n </>\r\n );\r\n};\r\n\r\nexport default LabelsSection;\r\n","import { IContact } from '@trii/types/dist/Contacts/contacts';\r\n\r\n/**\r\n * Type guard to check if an object is an IContact\r\n * @param obj The object to check\r\n * @returns True if the object is an IContact\r\n */\r\nexport function isContact(obj: any): obj is IContact {\r\n // Si está marcado explícitamente como negocio, no es un contacto regular\r\n if (obj?.isBusiness === true) {\r\n return false;\r\n }\r\n \r\n return (\r\n obj !== null &&\r\n typeof obj === 'object' &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.spaceId === 'string' &&\r\n typeof obj.name === 'string' &&\r\n typeof obj.firstName === 'string' &&\r\n typeof obj.lastName === 'string' &&\r\n Array.isArray(obj.phones) &&\r\n Array.isArray(obj.emails) &&\r\n 'origin' in obj &&\r\n typeof obj.isSpam === 'boolean' &&\r\n (!obj.businessId || typeof obj.businessId === 'string')\r\n );\r\n}\r\n","import { styled, Typography } from '@mui/material';\r\n// Types, IContact\r\nimport { isContact } from '../../types/is-contact.typeguard';\r\nimport { IContact } from '@trii/types/dist/Contacts';\r\n\r\nconst SectionTitle = styled(Typography)({\r\n fontWeight: 'bold',\r\n marginBottom: '8px',\r\n marginTop: '16px',\r\n borderBottom: `1px solid lightgray`,\r\n});\r\n\r\ninterface BusinessSectionProps {\r\n contactData?: IContact;\r\n title: string;\r\n}\r\n\r\nconst BusinessSection = ({ contactData, title }: BusinessSectionProps) => {\r\n if (!contactData || !isContact(contactData)) return null;\r\n\r\n return (\r\n <>\r\n <SectionTitle gutterBottom mt={2} variant=\"subtitle1\">\r\n {title}\r\n </SectionTitle>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n {contactData?.businessName}\r\n </Typography>\r\n </>\r\n );\r\n};\r\n\r\nexport default BusinessSection;\r\n","import { IBusiness } from '@trii/types/dist/Contacts/contacts';\r\n\r\n/**\r\n * Type guard to check if an object is an IBusiness\r\n * @param obj The object to check\r\n * @returns True if the object is an IBusiness\r\n */\r\nexport function isBusiness(obj: any): obj is IBusiness {\r\n if (obj?.isBusiness === true) {\r\n // Si se ha marcado explícitamente como negocio con la propiedad isBusiness\r\n return true;\r\n }\r\n \r\n return (\r\n obj !== null &&\r\n typeof obj === 'object' &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.spaceId === 'string' &&\r\n typeof obj.name === 'string' &&\r\n Array.isArray(obj.membersId) &&\r\n Array.isArray(obj.members) &&\r\n Array.isArray(obj.phones) &&\r\n Array.isArray(obj.emails) &&\r\n typeof obj.imageUrl === 'string' &&\r\n !('firstName' in obj) &&\r\n !('lastName' in obj)\r\n );\r\n}\r\n","// Types\r\nimport { Typography } from '@mui/material';\r\n// Components\r\ntype MemberItemProps = {\r\n name: string;\r\n memberId: string;\r\n navigate: (path: string) => void;\r\n};\r\n\r\nconst MemberItem = ({ name, memberId, navigate }: MemberItemProps) => {\r\n const url = `/a/conversations/conversations&conversationId=${memberId}`;\r\n\r\n const handleNavigation = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const isNewTab = event.ctrlKey || event.metaKey || event.button === 1; // Ctrl+Click, Cmd+Click, Middle Mouse\r\n\r\n if (isNewTab) {\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n } else {\r\n navigate(url);\r\n }\r\n };\r\n\r\n return (\r\n <Typography\r\n variant=\"body2\"\r\n color=\"text.secondary\"\r\n role=\"link\"\r\n tabIndex={0}\r\n sx={{ cursor: 'pointer', '&:hover': { textDecoration: 'underline' } }}\r\n onClick={handleNavigation}\r\n onMouseDown={(e) => {\r\n if (e.button === 1) {\r\n handleNavigation(e);\r\n }\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n handleNavigation(e as unknown as React.MouseEvent);\r\n }\r\n }}\r\n >\r\n {name}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default MemberItem;\r\n","import { styled, Typography } from '@mui/material';\r\n// Types\r\nimport { IBusiness } from '@trii/types/dist/Contacts';\r\nimport { isBusiness } from '../../types/is-business.typeguard';\r\nimport { MemberItem } from './components';\r\n\r\nconst SectionTitle = styled(Typography)({\r\n fontWeight: 'bold',\r\n marginBottom: '8px',\r\n marginTop: '16px',\r\n borderBottom: `1px solid lightgray`,\r\n});\r\n\r\ninterface MembersSectionProps {\r\n contactData?: IBusiness;\r\n title: string;\r\n navigate: (path: string) => void;\r\n}\r\n\r\nconst MembersSection = ({ contactData, title, navigate }: MembersSectionProps) => {\r\n if (!contactData || !isBusiness(contactData) || !contactData.members?.length)\r\n return null;\r\n\r\n return (\r\n <>\r\n <SectionTitle gutterBottom mt={2} variant=\"subtitle1\">\r\n {title}\r\n </SectionTitle>\r\n {contactData?.members.map((member) => (\r\n <MemberItem\r\n key={member.id}\r\n memberId={String(member.id)}\r\n name={member.name}\r\n navigate={navigate}\r\n />\r\n ))}\r\n </>\r\n );\r\n};\r\n\r\nexport default MembersSection;\r\n","import i18n from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\nimport en from './locales/en.json';\r\nimport es from './locales/es.json';\r\n\r\nconst resources = {\r\n en: { translation: en },\r\n es: { translation: es },\r\n};\r\n\r\nconst i18nInstance = i18n.createInstance();\r\n\r\ni18nInstance.use(initReactI18next).init({\r\n resources,\r\n lng: 'en',\r\n fallbackLng: 'en',\r\n interpolation: {\r\n escapeValue: false,\r\n },\r\n react: {\r\n useSuspense: false,\r\n },\r\n});\r\n\r\nexport default i18nInstance;\r\n","import { IBusiness, IContact } from '@trii/types/dist/Contacts';\r\nimport { CardContent, Box, styled, Popper, ClickAwayListener, SxProps, Theme } from '@mui/material';\r\nimport { PhoneEnabled, WhatsApp, Facebook, Instagram, ThreeP, Email } from '@mui/icons-material';\r\nimport {\r\n BusinessSection,\r\n ContactMethod,\r\n Header,\r\n LabelsSection,\r\n MembersSection,\r\n Properties,\r\n} from './components';\r\nimport { useEffect } from 'react';\r\nimport { useTranslation, I18nextProvider } from 'react-i18next';\r\nimport i18nInstance from '../../i18n/config';\r\n// Utils\r\nimport { isBusiness } from './types/is-business.typeguard';\r\nimport { isContact } from './types/is-contact.typeguard';\r\n\r\nconst PopupContainer = styled(Box)(({ theme }) => ({\r\n //@ts-ignore\r\n backgroundColor: theme.palette.background.panel,\r\n boxShadow: '0px 4px 10px rgba(0, 0, 0, 0.1)',\r\n borderRadius: '8px',\r\n width: 300,\r\n maxHeight: 'calc(100vh - 500px)',\r\n overflowY: 'auto',\r\n transition: 'opacity 0.3s ease, transform 0.3s ease',\r\n padding: '8px',\r\n zIndex: 1300,\r\n\r\n '&::-webkit-scrollbar': {\r\n width: 5,\r\n },\r\n '&::-webkit-scrollbar-track': {\r\n background: '#E0E0E0',\r\n borderRadius: 10,\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n background: '#9E9E9E',\r\n borderRadius: 10,\r\n transition: 'background 0.3s',\r\n },\r\n '&::-webkit-scrollbar-thumb:hover': {\r\n background: '#616161',\r\n },\r\n}));\r\n\r\nexport interface ContactInfoPopupProps {\r\n open: boolean;\r\n anchorEl: HTMLElement | null;\r\n onClose: () => void;\r\n language?: 'en' | 'es';\r\n contactData?: IContact | IBusiness;\r\n avatarImgUrl?: string;\r\n sx?: SxProps<Theme>;\r\n navigate: (path: string) => void;\r\n}\r\n\r\nconst ContactInfoPopupContent = ({\r\n open,\r\n anchorEl,\r\n onClose,\r\n contactData,\r\n avatarImgUrl,\r\n navigate,\r\n language = 'en',\r\n}: ContactInfoPopupProps) => {\r\n const { t: i18nT, i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (language) {\r\n i18n.changeLanguage(language);\r\n }\r\n }, [language, i18n]);\r\n\r\n const t = i18nT;\r\n const dataIsBusiness = isBusiness(contactData);\r\n const dataIsContact = isContact(contactData);\r\n\r\n const contactMethods = [\r\n {\r\n icon: <PhoneEnabled fontSize=\"small\" />,\r\n title: t('phone'),\r\n contactList: contactData?.phones || [],\r\n showTitle: true,\r\n },\r\n {\r\n icon: <Email fontSize=\"small\" />,\r\n title: t('email'),\r\n contactList: contactData?.emails || [],\r\n showTitle: true,\r\n },\r\n {\r\n icon: <WhatsApp fontSize=\"small\" />,\r\n title: 'IM',\r\n contactList: contactData?.ims_whatsapp || [],\r\n showTitle: true,\r\n },\r\n {\r\n icon: <Facebook fontSize=\"small\" />,\r\n contactList: contactData?.ims_facebook || [],\r\n showTitle: false,\r\n },\r\n {\r\n icon: <Instagram fontSize=\"small\" />,\r\n contactList: contactData?.ims_instagram || [],\r\n showTitle: false,\r\n },\r\n {\r\n icon: <ThreeP fontSize=\"small\" />,\r\n contactList: contactData?.ims_webchat || [],\r\n showTitle: false,\r\n },\r\n ];\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n onClose();\r\n }\r\n };\r\n\r\n if (open) {\r\n window.addEventListener('keydown', handleKeyDown);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [open, onClose]);\r\n\r\n return (\r\n <Popper\r\n sx={{ zIndex: 1300 }}\r\n open={open}\r\n anchorEl={anchorEl}\r\n placement=\"bottom-start\"\r\n data-popper-child=\"true\"\r\n >\r\n <ClickAwayListener onClickAway={onClose}>\r\n <PopupContainer>\r\n <CardContent>\r\n <Header\r\n navigate={navigate}\r\n contactId={contactData?.id}\r\n imgUrl={avatarImgUrl}\r\n name={contactData?.name}\r\n onClose={onClose}\r\n isBusiness={dataIsBusiness}\r\n />\r\n\r\n {/* Labels */}\r\n <LabelsSection contactData={contactData} title={t('labels')} />\r\n\r\n {/* Business from the IContact*/}\r\n {dataIsContact && <BusinessSection contactData={contactData} title={t('business')} />}\r\n\r\n {/* Members from the IBusiness */}\r\n {dataIsBusiness && (\r\n <MembersSection\r\n contactData={contactData}\r\n title={t('businessMembers')}\r\n navigate={navigate}\r\n />\r\n )}\r\n\r\n {/* Contact Methods */}\r\n {contactMethods.map((method, index) => (\r\n <ContactMethod\r\n key={index}\r\n icon={method.icon}\r\n title={method.title}\r\n contactList={method.contactList}\r\n showTitle={method.showTitle}\r\n />\r\n ))}\r\n\r\n {/* Properties */}\r\n <Properties properties={contactData?.properties} title={t('properties')} />\r\n </CardContent>\r\n </PopupContainer>\r\n </ClickAwayListener>\r\n </Popper>\r\n );\r\n};\r\n\r\nconst ContactInfoPopup = (props: ContactInfoPopupProps) => {\r\n return (\r\n <I18nextProvider i18n={i18nInstance}>\r\n <ContactInfoPopupContent {...props} />\r\n </I18nextProvider>\r\n );\r\n};\r\n\r\nexport default ContactInfoPopup;\r\n","import { createContext, useContext } from 'react';\r\nimport type { ReactNode } from 'react';\r\n\r\nexport type TranslationFn = (key: string, ...args: unknown[]) => string;\r\n\r\nconst noop: TranslationFn = (key: string) => key;\r\nconst TranslationContext = createContext<TranslationFn>(noop);\r\n\r\ninterface TranslationProviderProps {\r\n t: TranslationFn;\r\n children: ReactNode;\r\n}\r\n\r\nexport const TranslationProvider = ({ t, children }: TranslationProviderProps) => {\r\n return <TranslationContext.Provider value={t}>{children}</TranslationContext.Provider>;\r\n};\r\n\r\nexport const useTranslationContext = (): TranslationFn => {\r\n const t = useContext(TranslationContext);\r\n if (!t) {\r\n console.warn('[useTranslationContext] using noop, context value is falsy');\r\n return noop;\r\n }\r\n return (...args: Parameters<TranslationFn>) => {\r\n const [key, ...rest] = args;\r\n const result = t(key, ...rest);\r\n return result;\r\n };\r\n};\r\n","import { IContactTag } from '@trii/types/dist/Contacts';\r\nimport { Box, Chip, IconButton, Popover, Stack, Typography } from '@mui/material';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport LabelIcon from '@mui/icons-material/Label';\r\nimport { useMemo, useState } from 'react';\r\nimport type { MouseEvent } from 'react';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ninterface TagsProps {\r\n tags: IContactTag[];\r\n onEditTags: () => void;\r\n}\r\n\r\nconst Tags = ({ tags, onEditTags }: TagsProps) => {\r\n const t = useTranslationContext();\r\n\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n const safeTags = useMemo(() => tags ?? [], [tags]);\r\n const MAX_VISIBLE = 4;\r\n const visibleTags = safeTags.slice(0, MAX_VISIBLE);\r\n const hiddenCount = Math.max(safeTags.length - visibleTags.length, 0);\r\n\r\n const handleOpen = (event: MouseEvent<HTMLElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n\r\n return (\r\n <Box\r\n sx={{\r\n mt: 1,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n maxWidth: 320,\r\n position: 'relative',\r\n '&:hover .tags-action, &:focus-within .tags-action': {\r\n opacity: 1,\r\n },\r\n }}\r\n >\r\n <Stack direction=\"row\" spacing={1} useFlexGap flexWrap=\"wrap\" justifyContent=\"center\">\r\n {visibleTags.map((tag) => (\r\n <Chip\r\n key={tag.id}\r\n label={tag.name}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n sx={{\r\n borderRadius: 999,\r\n maxWidth: 140,\r\n '& .MuiChip-label': {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n }}\r\n />\r\n ))}\r\n\r\n {hiddenCount > 0 ? (\r\n <Chip\r\n label={`+${hiddenCount}`}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n onClick={handleOpen}\r\n sx={{ borderRadius: 999 }}\r\n />\r\n ) : null}\r\n </Stack>\r\n\r\n <IconButton\r\n className=\"tags-action\"\r\n size=\"small\"\r\n aria-label={safeTags.length ? t('tags.edit') : t('tags.add')}\r\n onClick={onEditTags}\r\n sx={{\r\n position: 'absolute',\r\n left: '100%',\r\n ml: 1,\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n color: 'text.secondary',\r\n bgcolor: 'background.paper',\r\n opacity: 0,\r\n transition: 'opacity 0.2s ease-in-out',\r\n '&:hover': {\r\n bgcolor: 'action.hover',\r\n color: 'text.primary',\r\n },\r\n }}\r\n >\r\n {safeTags.length ? <EditIcon fontSize=\"small\" /> : <LabelIcon fontSize=\"small\" />}\r\n </IconButton>\r\n </Box>\r\n\r\n <Popover\r\n open={open}\r\n anchorEl={anchorEl}\r\n onClose={handleClose}\r\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\r\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\r\n >\r\n <Box sx={{ p: 1.5, maxWidth: 320, maxHeight: 240, overflowY: 'auto' }}>\r\n <Typography variant=\"subtitle2\" sx={{ mb: 1 }}>\r\n {t('tags')}\r\n </Typography>\r\n <Stack direction=\"row\" spacing={1} useFlexGap flexWrap=\"wrap\">\r\n {safeTags.map((tag) => (\r\n <Chip\r\n key={tag.id}\r\n label={tag.name}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n sx={{\r\n borderRadius: 999,\r\n maxWidth: 160,\r\n '& .MuiChip-label': {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n }}\r\n />\r\n ))}\r\n </Stack>\r\n </Box>\r\n </Popover>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Tags;\r\n","import { createContext, useContext } from 'react';\r\nimport type { EditContactApi } from '../services/api';\r\n\r\nconst EditContactApiContext = createContext<EditContactApi | null>(null);\r\n\r\nexport const EditContactApiProvider = EditContactApiContext.Provider;\r\n\r\nexport const useEditContactApi = () => {\r\n return useContext(EditContactApiContext);\r\n};\r\n","import { Box, styled, Typography, IconButton, TextField, CircularProgress } from '@mui/material';\r\nimport { Edit, Save } from '@mui/icons-material';\r\nimport { useState, useEffect } from 'react';\r\nimport { IContact, IBusiness } from '@trii/types/dist/Contacts/contacts';\r\nimport { useEditContactApi } from '../../../../context/EditContactApiContext';\r\n\r\nconst NameText = styled(Typography)({\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: 360,\r\n textAlign: 'center',\r\n});\r\n\r\nconst NameWrapper = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '100%',\r\n});\r\n\r\nconst NameContainer = styled(Box)({\r\n position: 'relative',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n maxWidth: '100%',\r\n '&:hover .edit-icon': {\r\n opacity: 1,\r\n visibility: 'visible',\r\n },\r\n});\r\n\r\nconst EditButton = styled(IconButton)({\r\n opacity: 0,\r\n visibility: 'hidden',\r\n transition: 'all 0.2s',\r\n position: 'absolute',\r\n left: '100%',\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n});\r\n\r\nexport type ContactNameProps = {\r\n displayName: string;\r\n contactType?: 'contact' | 'business' | 'unknown';\r\n firstName?: string;\r\n lastName?: string;\r\n name?: string;\r\n entityId?: string;\r\n onEntityUpdated?: (data: IContact | IBusiness) => void;\r\n};\r\n\r\nconst ContactName = ({\r\n displayName,\r\n contactType,\r\n firstName,\r\n lastName,\r\n name,\r\n entityId,\r\n onEntityUpdated,\r\n}: ContactNameProps) => {\r\n const api = useEditContactApi();\r\n const [isEditing, setIsEditing] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [values, setValues] = useState({\r\n firstName: firstName || '',\r\n lastName: lastName || '',\r\n name: name || '',\r\n });\r\n\r\n useEffect(() => {\r\n setValues({\r\n firstName: firstName || '',\r\n lastName: lastName || '',\r\n name: name || '',\r\n });\r\n }, [firstName, lastName, name]);\r\n\r\n const handleSave = async () => {\r\n if (!api || !entityId || !contactType || contactType === 'unknown') return;\r\n\r\n setLoading(true);\r\n try {\r\n let body: any = {};\r\n if (contactType === 'contact') {\r\n body = { firstName: values.firstName, lastName: values.lastName };\r\n } else if (contactType === 'business') {\r\n body = { name: values.name };\r\n }\r\n\r\n const updated = await api.updateEntity({\r\n entityType: contactType,\r\n entityId,\r\n body,\r\n });\r\n\r\n if (updated && onEntityUpdated) {\r\n onEntityUpdated(updated);\r\n }\r\n setIsEditing(false);\r\n } catch (err) {\r\n console.error('Failed to update name', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const showEdit = contactType === 'contact' || contactType === 'business';\r\n\r\n if (isEditing) {\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mt: 1 }}>\r\n {contactType === 'contact' ? (\r\n <>\r\n <TextField\r\n value={values.firstName}\r\n onChange={(e) => setValues({ ...values, firstName: e.target.value })}\r\n size=\"small\"\r\n placeholder=\"First Name\"\r\n sx={{ width: 140 }}\r\n />\r\n <TextField\r\n value={values.lastName}\r\n onChange={(e) => setValues({ ...values, lastName: e.target.value })}\r\n size=\"small\"\r\n placeholder=\"Last Name\"\r\n sx={{ width: 140 }}\r\n />\r\n </>\r\n ) : (\r\n <TextField\r\n value={values.name}\r\n onChange={(e) => setValues({ ...values, name: e.target.value })}\r\n size=\"small\"\r\n placeholder=\"Name\"\r\n sx={{ width: 280 }}\r\n />\r\n )}\r\n <IconButton onClick={handleSave} disabled={loading} color=\"primary\">\r\n {loading ? <CircularProgress size={24} /> : <Save />}\r\n </IconButton>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <NameWrapper>\r\n <NameContainer>\r\n <NameText variant=\"h6\" title={displayName}>\r\n {displayName}\r\n </NameText>\r\n {showEdit && (\r\n <EditButton\r\n size=\"small\"\r\n onClick={() => setIsEditing(true)}\r\n className=\"edit-icon\"\r\n sx={{ ml: 1 }}\r\n >\r\n <Edit fontSize=\"small\" />\r\n </EditButton>\r\n )}\r\n </NameContainer>\r\n </NameWrapper>\r\n );\r\n};\r\n\r\nexport default ContactName;\r\n","import DeleteIcon from '@mui/icons-material/Delete';\r\nimport PhotoCameraIcon from '@mui/icons-material/PhotoCamera';\r\nimport { Avatar, Box, IconButton } from '@mui/material';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ntype AvatarWithActionsProps = {\r\n src?: string;\r\n alt: string;\r\n onError?: () => void;\r\n onUpload?: () => void;\r\n onDelete?: () => void;\r\n isUploading?: boolean;\r\n isDeleting?: boolean;\r\n};\r\n\r\nconst AvatarWithActions = ({\r\n src,\r\n alt,\r\n onError,\r\n onUpload,\r\n onDelete,\r\n isUploading,\r\n isDeleting,\r\n}: AvatarWithActionsProps) => {\r\n const t = useTranslationContext();\r\n return (\r\n <Box\r\n sx={{\r\n width: 60,\r\n height: 60,\r\n mb: 1,\r\n position: 'relative',\r\n '&:hover .avatar-actions, &:focus-within .avatar-actions': {\r\n opacity: 1,\r\n pointerEvents: 'auto',\r\n },\r\n }}\r\n >\r\n <Avatar\r\n src={src}\r\n alt={alt}\r\n onError={onError}\r\n sx={{\r\n width: 60,\r\n height: 60,\r\n }}\r\n />\r\n\r\n <Box\r\n className=\"avatar-actions\"\r\n sx={{\r\n position: 'absolute',\r\n inset: 0,\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 0.5,\r\n bgcolor: 'rgba(0, 0, 0, 0.35)',\r\n opacity: 0,\r\n pointerEvents: 'none',\r\n transition: 'opacity 0.2s ease-in-out',\r\n }}\r\n >\r\n <IconButton\r\n size=\"small\"\r\n aria-label={t('avatar.upload')}\r\n onClick={onUpload}\r\n disabled={Boolean(isUploading)}\r\n sx={{\r\n color: 'common.white',\r\n bgcolor: 'rgba(0, 0, 0, 0.25)',\r\n '&:hover': { bgcolor: 'rgba(0, 0, 0, 0.35)' },\r\n }}\r\n >\r\n <PhotoCameraIcon fontSize=\"small\" />\r\n </IconButton>\r\n\r\n <IconButton\r\n size=\"small\"\r\n aria-label={t('avatar.delete')}\r\n onClick={onDelete}\r\n disabled={Boolean(isDeleting)}\r\n sx={{\r\n color: 'common.white',\r\n bgcolor: 'rgba(0, 0, 0, 0.25)',\r\n '&:hover': { bgcolor: 'rgba(0, 0, 0, 0.35)' },\r\n }}\r\n >\r\n <DeleteIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AvatarWithActions;\r\n","import { Box, styled } from '@mui/material';\r\nimport { Tags, ContactName } from './components';\r\nimport { IContactTag, IContact, IBusiness } from '@trii/types/dist/Contacts/contacts';\r\nimport AvatarWithActions from './components/AvatarWithActions/AvatarWithActions';\r\nimport type { ChangeEvent, RefObject } from 'react';\r\n\r\nconst HeaderContainer = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n gap: '4px',\r\n marginBottom: '20px',\r\n position: 'relative',\r\n});\r\n\r\ntype HeaderProps = {\r\n imgUrl?: string;\r\n displayName: string;\r\n onError?: (error: Error) => void;\r\n tags: IContactTag[];\r\n onEditTags: () => void;\r\n onUploadPhoto: () => void;\r\n onPhotoFileChange: (event: ChangeEvent<HTMLInputElement>) => void;\r\n photoInputRef: RefObject<HTMLInputElement>;\r\n isUploadingPhoto: boolean;\r\n onDeletePhoto: () => void;\r\n isDeletingPhoto: boolean;\r\n contactType?: 'contact' | 'business' | 'unknown';\r\n firstName?: string;\r\n lastName?: string;\r\n name?: string;\r\n entityId?: string;\r\n onEntityUpdated?: (data: IContact | IBusiness) => void;\r\n};\r\n\r\nconst Header = ({\r\n imgUrl,\r\n displayName,\r\n onError,\r\n tags,\r\n onEditTags,\r\n onUploadPhoto,\r\n onPhotoFileChange,\r\n photoInputRef,\r\n isUploadingPhoto,\r\n onDeletePhoto,\r\n isDeletingPhoto,\r\n contactType,\r\n firstName,\r\n lastName,\r\n name,\r\n entityId,\r\n onEntityUpdated,\r\n}: HeaderProps) => {\r\n const avatarAlt = `Avatar for ${displayName}`;\r\n\r\n return (\r\n <HeaderContainer>\r\n <input\r\n ref={photoInputRef}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n onChange={onPhotoFileChange}\r\n style={{ display: 'none' }}\r\n />\r\n <AvatarWithActions\r\n src={imgUrl}\r\n alt={avatarAlt}\r\n onError={() => onError?.(new Error('Failed to load avatar'))}\r\n onUpload={onUploadPhoto}\r\n isUploading={isUploadingPhoto}\r\n onDelete={onDeletePhoto}\r\n isDeleting={isDeletingPhoto}\r\n />\r\n\r\n <ContactName\r\n displayName={displayName}\r\n contactType={contactType}\r\n firstName={firstName}\r\n lastName={lastName}\r\n name={name}\r\n entityId={entityId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n\r\n <Tags tags={tags} onEditTags={onEditTags} />\r\n </HeaderContainer>\r\n );\r\n};\r\n\r\nexport default Header;\r\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\r\nimport SaveIcon from '@mui/icons-material/Save';\r\nimport { Autocomplete, Box, Chip, IconButton, Stack, TextField, Typography } from '@mui/material';\r\nimport Popper, { PopperProps } from '@mui/material/Popper';\r\nimport { LoadingButton } from '@mui/lab';\r\nimport { ILabel } from '@trii/types/dist/Contacts';\r\nimport { useDeferredValue, useMemo, useState } from 'react';\r\nimport { useTranslationContext } from '../../context/TranslationContext';\r\n\r\ntype TagsEditorProps = {\r\n value: ILabel[];\r\n options: ILabel[];\r\n onChange: (value: ILabel[]) => void;\r\n onBack: () => void;\r\n onSave: () => void;\r\n isSaving: boolean;\r\n onCreateNew: (name: string) => void;\r\n isCreatingNew: boolean;\r\n popperContainer?: HTMLElement | null;\r\n};\r\n\r\nconst PAGE_SIZE = 20;\r\n\r\nconst AutocompletePopper = (props: PopperProps & { popperContainer?: HTMLElement | null }) => {\r\n const { popperContainer, ...rest } = props;\r\n return (\r\n <Popper\r\n {...rest}\r\n container={popperContainer ?? rest.container}\r\n style={{ ...(rest.style ?? {}), zIndex: 20000 }}\r\n />\r\n );\r\n};\r\n\r\nconst TagsEditor = ({\r\n value,\r\n options,\r\n onChange,\r\n onBack,\r\n onSave,\r\n isSaving,\r\n onCreateNew,\r\n isCreatingNew,\r\n popperContainer,\r\n}: TagsEditorProps) => {\r\n const t = useTranslationContext();\r\n\r\n const [searchValue, setSearchValue] = useState<string>('');\r\n const [limit, setLimit] = useState(PAGE_SIZE);\r\n\r\n const deferredSearchValue = useDeferredValue(searchValue);\r\n\r\n const safeOptions = useMemo(() => options ?? [], [options]);\r\n\r\n const filteredOptions = useMemo(() => {\r\n const q = String(deferredSearchValue ?? '')\r\n .trim()\r\n .toLowerCase();\r\n if (!q) return safeOptions;\r\n\r\n return safeOptions.filter((o) =>\r\n String(o?.name ?? '')\r\n .toLowerCase()\r\n .includes(q),\r\n );\r\n }, [safeOptions, deferredSearchValue]);\r\n\r\n const visibleOptions = useMemo(() => filteredOptions.slice(0, limit), [filteredOptions, limit]);\r\n\r\n const optionsWithSelectedValues = useMemo(() => {\r\n const byId = new Map<string, ILabel>();\r\n\r\n for (const selected of value ?? []) {\r\n if (!selected?.id) continue;\r\n byId.set(String(selected.id), selected);\r\n }\r\n\r\n for (const opt of visibleOptions ?? []) {\r\n if (!opt?.id) continue;\r\n if (byId.has(String(opt.id))) continue;\r\n byId.set(String(opt.id), opt);\r\n }\r\n\r\n return Array.from(byId.values());\r\n }, [value, visibleOptions]);\r\n\r\n const handleSearchChange = (_: unknown, newInputValue: string) => {\r\n setSearchValue(newInputValue ?? '');\r\n setLimit(PAGE_SIZE);\r\n };\r\n\r\n const onListboxScroll = (event: unknown) => {\r\n const element = event as HTMLElement;\r\n const nearBottom = element.scrollTop + element.clientHeight >= element.scrollHeight - 24;\r\n if (nearBottom) setLimit((l) => l + PAGE_SIZE);\r\n };\r\n\r\n const CustomNoOptionsMessage = () => {\r\n const trimmedSearchValue = String(searchValue ?? '').trim();\r\n const isDisabled = !trimmedSearchValue || isSaving || isCreatingNew;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n }}\r\n >\r\n {t('global.noOptions')}\r\n <LoadingButton\r\n onClick={() => onCreateNew(trimmedSearchValue)}\r\n loading={isCreatingNew}\r\n disabled={isDisabled}\r\n variant=\"contained\"\r\n size=\"small\"\r\n sx={{ marginTop: 1.3 }}\r\n >\r\n {t('global.createNew')}\r\n </LoadingButton>\r\n </Box>\r\n );\r\n };\r\n\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 2 }}>\r\n <IconButton size=\"small\" onClick={onBack} aria-label={t('global.back')} disabled={isSaving}>\r\n <ArrowBackIcon fontSize=\"small\" />\r\n </IconButton>\r\n <Typography variant=\"subtitle1\">{t('tags')}</Typography>\r\n\r\n <Box sx={{ flex: 1 }} />\r\n\r\n <LoadingButton\r\n variant=\"contained\"\r\n size=\"small\"\r\n startIcon={<SaveIcon />}\r\n onClick={onSave}\r\n loading={isSaving}\r\n disabled={isSaving}\r\n >\r\n {t('global.save')}\r\n </LoadingButton>\r\n </Stack>\r\n\r\n <Autocomplete<ILabel, true, false, false>\r\n multiple\r\n disablePortal={false}\r\n value={value}\r\n onChange={(_, newValue) => onChange(newValue)}\r\n options={optionsWithSelectedValues}\r\n filterOptions={(x) => x}\r\n inputValue={searchValue}\r\n onInputChange={handleSearchChange}\r\n getOptionLabel={(option) => option?.name ?? ''}\r\n isOptionEqualToValue={(o, v) => String(o?.id) === String(v?.id)}\r\n PopperComponent={(props) => (\r\n <AutocompletePopper {...props} popperContainer={popperContainer} />\r\n )}\r\n renderOption={(props, option) => {\r\n const { key, ...rest } = props as any;\r\n return (\r\n <li {...rest} key={option?.id ? String(option.id) : String(key ?? option?.name ?? '')}>\r\n {option.name ?? ''}\r\n </li>\r\n );\r\n }}\r\n renderTags={(tagValue, getTagProps) =>\r\n tagValue.map((option, index) => {\r\n const tagProps = getTagProps({ index }) as any;\r\n const { key, ...rest } = tagProps;\r\n return (\r\n <Chip\r\n key={option?.id ? String(option.id) : String(key ?? option?.name ?? index)}\r\n label={option.name ?? ''}\r\n {...rest}\r\n />\r\n );\r\n })\r\n }\r\n size=\"small\"\r\n renderInput={(params) => <TextField {...params} size=\"small\" />}\r\n ListboxProps={{\r\n onScroll: onListboxScroll as any,\r\n sx: { maxHeight: 280, overflowY: 'auto' },\r\n }}\r\n noOptionsText={<CustomNoOptionsMessage />}\r\n sx={{ width: '100%' }}\r\n />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default TagsEditor;\r\n","export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n\r\nexport class ApiError extends Error {\r\n status: number;\r\n body: unknown;\r\n\r\n constructor(message: string, status: number, body: unknown) {\r\n super(message);\r\n this.name = 'ApiError';\r\n this.status = status;\r\n this.body = body;\r\n }\r\n}\r\n\r\ntype RequestJsonArgs = {\r\n url: string;\r\n method?: HttpMethod;\r\n headers?: HeadersInit;\r\n body?: unknown;\r\n signal?: AbortSignal;\r\n};\r\n\r\nexport async function requestJson<T>({\r\n url,\r\n method = 'GET',\r\n headers,\r\n body,\r\n signal,\r\n}: RequestJsonArgs): Promise<T> {\r\n const res = await globalThis.fetch(url, {\r\n method,\r\n headers: {\r\n ...(body ? { 'Content-Type': 'application/json' } : {}),\r\n ...(headers ?? {}),\r\n },\r\n body: body ? JSON.stringify(body) : undefined,\r\n signal,\r\n });\r\n\r\n const contentType = res.headers.get('content-type') || '';\r\n const isJson = contentType.includes('application/json');\r\n const parsedBody = isJson ? await res.json().catch(() => null) : await res.text().catch(() => null);\r\n\r\n if (!res.ok) {\r\n const message =\r\n typeof parsedBody === 'object' && parsedBody && 'message' in (parsedBody as any)\r\n ? String((parsedBody as any).message)\r\n : `Request failed with status ${res.status}`;\r\n\r\n throw new ApiError(message, res.status, parsedBody);\r\n }\r\n\r\n return parsedBody as T;\r\n}\r\n\r\ntype RequestFormDataArgs = {\r\n url: string;\r\n method?: HttpMethod;\r\n headers?: HeadersInit;\r\n formData: FormData;\r\n signal?: AbortSignal;\r\n};\r\n\r\nexport async function requestFormData<T>({\r\n url,\r\n method = 'POST',\r\n headers,\r\n formData,\r\n signal,\r\n}: RequestFormDataArgs): Promise<T> {\r\n const res = await globalThis.fetch(url, {\r\n method,\r\n headers: {\r\n ...(headers ?? {}),\r\n },\r\n body: formData,\r\n signal,\r\n });\r\n\r\n const contentType = res.headers.get('content-type') || '';\r\n const isJson = contentType.includes('application/json');\r\n const parsedBody = isJson ? await res.json().catch(() => null) : await res.text().catch(() => null);\r\n\r\n if (!res.ok) {\r\n const message =\r\n typeof parsedBody === 'object' && parsedBody && 'message' in (parsedBody as any)\r\n ? String((parsedBody as any).message)\r\n : `Request failed with status ${res.status}`;\r\n\r\n throw new ApiError(message, res.status, parsedBody);\r\n }\r\n\r\n return parsedBody as T;\r\n}\r\n","export function joinUrl(baseUrl: string, path: string) {\r\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\r\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\r\n return `${normalizedBase}${normalizedPath}`;\r\n}\r\n\r\nexport function getApiUrls(baseUrl: string, spaceId: string) {\r\n const encodedSpaceId = encodeURIComponent(spaceId);\r\n\r\n return {\r\n CONTACTS: joinUrl(baseUrl, `/contacts/${encodedSpaceId}`),\r\n MEDIA: joinUrl(baseUrl, `/media/${encodedSpaceId}`),\r\n SETTINGS: joinUrl(baseUrl, `/settings/${encodedSpaceId}`),\r\n };\r\n}\r\n","import {\r\n IBusiness,\r\n IContact,\r\n IContactField,\r\n IContactTag,\r\n IContactAddress,\r\n} from '@trii/types/dist/Contacts/contacts';\r\nimport { ILabel } from '@trii/types/dist/Contacts';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { requestFormData, requestJson } from './http';\r\nimport { UserTrii } from '@trii/types/dist/Users';\r\nimport { getApiUrls, joinUrl } from './urls';\r\nimport type { UserInfo } from '@trii/types/dist/Users';\r\n\r\ntype ApiContext = {\r\n baseUrl: string;\r\n spaceId: string;\r\n};\r\n\r\ntype WithSignal = { signal?: AbortSignal };\r\n\r\ntype ApiArgs = ApiContext & WithSignal;\r\n\r\nexport type Order = 'ASC' | 'DESC';\r\n\r\nexport type Filter = {\r\n column: string;\r\n condition: string;\r\n value: string;\r\n};\r\n\r\nexport type TableItemFormat = 'IContact' | 'IBusiness' | 'IContactInfo';\r\n\r\nexport type PaginationFolder = 'Main' | 'Trash' | 'MyContacts';\r\n\r\nexport type Pagination = {\r\n total: number;\r\n lastPage: number;\r\n currentPage: number;\r\n perPage: number;\r\n order: Order;\r\n orderColumn: string;\r\n filter: Filter[];\r\n format: TableItemFormat;\r\n folder?: PaginationFolder;\r\n};\r\n\r\nexport type PaginationInfo = {\r\n total: number;\r\n lastPage: number;\r\n currentPage: number;\r\n perPage: number;\r\n cantPageElements: number;\r\n};\r\n\r\nexport type BusinessTableData = {\r\n contactos: IBusiness[];\r\n contactosIds: unknown[];\r\n paginacion: PaginationInfo;\r\n};\r\n\r\ntype FetchContactArgs = ApiArgs & {\r\n contactId: string;\r\n};\r\n\r\ntype FetchLabelsArgs = ApiArgs;\r\n\r\ntype CreateLabelArgs = ApiArgs & {\r\n name: string;\r\n};\r\n\r\nexport async function fetchLabels({ baseUrl, spaceId, signal }: FetchLabelsArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/labels');\r\n return requestJson<ILabel[]>({ url, signal });\r\n}\r\n\r\nexport async function createLabel({ baseUrl, spaceId, name, signal }: CreateLabelArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/labels');\r\n return requestJson<ILabel>({ url, method: 'POST', body: { name }, signal });\r\n}\r\n\r\nexport async function fetchContact({ baseUrl, spaceId, contactId, signal }: FetchContactArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, `/contacts/${encodeURIComponent(contactId)}`);\r\n return requestJson<IContact | IBusiness>({ url, signal });\r\n}\r\n\r\ntype FetchContactFieldsArgs = ApiArgs & {\r\n forType: 'contact' | 'business';\r\n};\r\n\r\nexport async function fetchContactFields({\r\n baseUrl,\r\n spaceId,\r\n forType,\r\n signal,\r\n}: FetchContactFieldsArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = `${joinUrl(urls.CONTACTS, '/ContactFields')}?filter=custom&for=${encodeURIComponent(forType)}`;\r\n return requestJson<IContactField[]>({ url, signal });\r\n}\r\n\r\ntype UpdateEntityArgs = ApiArgs & {\r\n entityType: 'contact' | 'business';\r\n entityId: string;\r\n body: Partial<IContact> | Partial<IBusiness> | { tags: IContactTag[] };\r\n};\r\n\r\nexport async function updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType,\r\n entityId,\r\n body,\r\n signal,\r\n}: UpdateEntityArgs) {\r\n const path =\r\n entityType === 'business'\r\n ? `/business/${encodeURIComponent(entityId)}`\r\n : `/contacts/${encodeURIComponent(entityId)}`;\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, path);\r\n return requestJson<IContact | IBusiness>({ url, method: 'PUT', body, signal });\r\n}\r\n\r\ntype FetchBusinessTableDataArgs = ApiArgs & {\r\n pagination: Pagination;\r\n};\r\n\r\nexport async function fetchBusinessTableData({\r\n baseUrl,\r\n spaceId,\r\n pagination,\r\n signal,\r\n}: FetchBusinessTableDataArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/Search');\r\n return requestJson<BusinessTableData>({ url, method: 'POST', body: pagination, signal });\r\n}\r\n\r\ntype CreateBusinessArgs = ApiArgs & {\r\n business: Record<string, unknown>;\r\n};\r\n\r\nexport async function createBusiness({ baseUrl, spaceId, business, signal }: CreateBusinessArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/business');\r\n return requestJson<IBusiness>({ url, method: 'POST', body: business, signal });\r\n}\r\n\r\ntype DeleteContactAddressData = {\r\n contactId: string;\r\n contactAddressId: string;\r\n type: ChannelType;\r\n};\r\n\r\ntype CheckContactAddressData = {\r\n address: string;\r\n type: ChannelType;\r\n};\r\n\r\ntype ResultContactAddressCheck = {\r\n success: boolean;\r\n warnings: string[];\r\n};\r\n\r\ntype DeleteContactAddressArgs = ApiArgs & {\r\n data: DeleteContactAddressData;\r\n};\r\n\r\ntype CheckContactAddressArgs = ApiArgs & {\r\n data: CheckContactAddressData;\r\n};\r\n\r\nexport type SetContactAddressRequestData = {\r\n address: string;\r\n type: ChannelType;\r\n contactId: string;\r\n};\r\n\r\nexport type UpdateContactAddressData = {\r\n contactId: string;\r\n contactAddressId: string;\r\n note?: string;\r\n isFavorite?: boolean;\r\n};\r\n\r\ntype SetContactAddressArgs = ApiArgs & {\r\n data: SetContactAddressRequestData;\r\n};\r\n\r\ntype UpdateContactAddressArgs = ApiArgs & {\r\n data: UpdateContactAddressData;\r\n};\r\n\r\nexport async function deleteAddress({ baseUrl, spaceId, data, signal }: DeleteContactAddressArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/contactAddresses');\r\n return requestJson<unknown>({ url, method: 'DELETE', body: data, signal });\r\n}\r\n\r\nexport async function checkContactAddress({\r\n baseUrl,\r\n spaceId,\r\n data,\r\n signal,\r\n}: CheckContactAddressArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/contactAddresses/check');\r\n return requestJson<ResultContactAddressCheck>({ url, method: 'POST', body: data, signal });\r\n}\r\n\r\nexport async function setContactAddress({ baseUrl, spaceId, data, signal }: SetContactAddressArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/contactAddresses/set');\r\n return requestJson<IContactAddress>({ url, method: 'POST', body: data, signal });\r\n}\r\n\r\nexport async function updateContactAddress({\r\n baseUrl,\r\n spaceId,\r\n data,\r\n signal,\r\n}: UpdateContactAddressArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(\r\n urls.CONTACTS,\r\n `/contactAddresses/${encodeURIComponent(data.contactAddressId)}`,\r\n );\r\n return requestJson<IContactAddress>({ url, method: 'PUT', body: data, signal });\r\n}\r\n\r\ntype FetchUserTriiArgs = ApiArgs;\r\n\r\nexport async function fetchUserTrii({ baseUrl, spaceId, signal }: FetchUserTriiArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.SETTINGS, `/user`);\r\n return requestJson<UserTrii>({ url, signal });\r\n}\r\n\r\ntype FetchUsersArgs = ApiArgs;\r\n\r\nexport async function fetchUsers({ baseUrl, spaceId, signal }: FetchUsersArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.SETTINGS, `/users`);\r\n return requestJson<UserInfo[]>({ url, signal });\r\n}\r\n\r\ntype FetchUserTriiByIdArgs = ApiArgs & { userId: string };\r\n\r\nexport async function fetchUserTriiById({\r\n baseUrl,\r\n spaceId,\r\n signal,\r\n userId,\r\n}: FetchUserTriiByIdArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.SETTINGS, `/usersInfor/${userId}`);\r\n return requestJson<UserTrii>({ url, signal });\r\n}\r\n\r\ntype UploadAvatarArgs = ApiArgs & {\r\n contactId: string;\r\n file: File;\r\n};\r\n\r\nexport async function uploadAvatar({\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n file,\r\n signal,\r\n}: UploadAvatarArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const fd = new FormData();\r\n fd.append('file', file, file.name);\r\n\r\n const url = joinUrl(\r\n urls.MEDIA,\r\n `/upload?module=contacts&folderType=avatars&contactId=${encodeURIComponent(contactId)}`,\r\n );\r\n\r\n return requestFormData<string>({ url, formData: fd, signal });\r\n}\r\n\r\ntype FetchContactBoundArgs = WithSignal & { contactId: string };\r\ntype FetchContactFieldsBoundArgs = WithSignal & { forType: 'contact' | 'business' };\r\ntype CreateLabelBoundArgs = WithSignal & { name: string };\r\ntype UpdateEntityBoundArgs = WithSignal & {\r\n entityType: 'contact' | 'business';\r\n entityId: string;\r\n body: Partial<IContact> | Partial<IBusiness> | { tags: IContactTag[] };\r\n};\r\ntype FetchBusinessTableDataBoundArgs = WithSignal & { pagination: Pagination };\r\ntype CreateBusinessBoundArgs = WithSignal & { business: Record<string, unknown> };\r\ntype DeleteContactAddressBoundArgs = WithSignal & { data: DeleteContactAddressData };\r\ntype CheckContactAddressBoundArgs = WithSignal & { data: CheckContactAddressData };\r\ntype FetchUserTriiByIdBoundArgs = WithSignal & { userId: string };\r\ntype UploadAvatarBoundArgs = WithSignal & { contactId: string; file: File };\r\ntype SetContactAddressBoundArgs = WithSignal & { data: SetContactAddressRequestData };\r\ntype UpdateContactAddressBoundArgs = WithSignal & { data: UpdateContactAddressData };\r\n\r\nexport const createEditContactApi = (baseUrl: string, spaceId: string) => ({\r\n fetchLabels: ({ signal }: WithSignal = {}) => fetchLabels({ baseUrl, spaceId, signal }),\r\n createLabel: ({ name, signal }: CreateLabelBoundArgs) =>\r\n createLabel({ baseUrl, spaceId, name, signal }),\r\n fetchContact: ({ contactId, signal }: FetchContactBoundArgs) =>\r\n fetchContact({ baseUrl, spaceId, contactId, signal }),\r\n fetchBusinessTableData: ({ pagination, signal }: FetchBusinessTableDataBoundArgs) =>\r\n fetchBusinessTableData({ baseUrl, spaceId, pagination, signal }),\r\n createBusiness: ({ business, signal }: CreateBusinessBoundArgs) =>\r\n createBusiness({ baseUrl, spaceId, business, signal }),\r\n fetchContactFields: ({ forType, signal }: FetchContactFieldsBoundArgs) =>\r\n fetchContactFields({ baseUrl, spaceId, forType, signal }),\r\n updateEntity: ({ entityType, entityId, body, signal }: UpdateEntityBoundArgs) =>\r\n updateEntity({ baseUrl, spaceId, entityType, entityId, body, signal }),\r\n deleteAddress: ({ data, signal }: DeleteContactAddressBoundArgs) =>\r\n deleteAddress({ baseUrl, spaceId, data, signal }),\r\n deleteAddres: ({ data, signal }: DeleteContactAddressBoundArgs) =>\r\n deleteAddress({ baseUrl, spaceId, data, signal }),\r\n checkContactAddress: ({ data, signal }: CheckContactAddressBoundArgs) =>\r\n checkContactAddress({ baseUrl, spaceId, data, signal }),\r\n setContactAddress: ({ data, signal }: SetContactAddressBoundArgs) =>\r\n setContactAddress({ baseUrl, spaceId, data, signal }),\r\n updateContactAddress: ({ data, signal }: UpdateContactAddressBoundArgs) =>\r\n updateContactAddress({ baseUrl, spaceId, data, signal }),\r\n fetchUserTrii: ({ signal }: WithSignal = {}) => fetchUserTrii({ baseUrl, spaceId, signal }),\r\n fetchUsers: ({ signal }: WithSignal = {}) => fetchUsers({ baseUrl, spaceId, signal }),\r\n fetchUserTriiById: ({ userId, signal }: FetchUserTriiByIdBoundArgs) =>\r\n fetchUserTriiById({ baseUrl, spaceId, userId, signal }),\r\n uploadAvatar: ({ contactId, file, signal }: UploadAvatarBoundArgs) =>\r\n uploadAvatar({ baseUrl, spaceId, contactId, file, signal }),\r\n});\r\n\r\nexport type EditContactApi = ReturnType<typeof createEditContactApi>;\r\n","import { useEffect, useState } from 'react';\n\nexport const isGoogleMapsLoaded = (): boolean => {\n return Boolean((window as any)?.google?.maps?.places?.Autocomplete);\n};\n\nexport const waitForGoogleMaps = (maxWaitTime = 10000): Promise<boolean> => {\n return new Promise((resolve) => {\n if (isGoogleMapsLoaded()) {\n resolve(true);\n return;\n }\n\n const startTime = Date.now();\n const checkInterval = 100;\n\n const interval = window.setInterval(() => {\n if (isGoogleMapsLoaded()) {\n window.clearInterval(interval);\n resolve(true);\n return;\n }\n\n if (Date.now() - startTime > maxWaitTime) {\n window.clearInterval(interval);\n resolve(false);\n }\n }, checkInterval);\n });\n};\n\nexport const useGoogleMapsStatus = () => {\n const [isLoaded, setIsLoaded] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const checkStatus = async () => {\n try {\n const loaded = await waitForGoogleMaps(10000);\n setIsLoaded(loaded);\n if (!loaded) {\n setError('Google Maps API failed to load');\n }\n } catch {\n setError('Error loading Google Maps API');\n setIsLoaded(false);\n } finally {\n setIsLoading(false);\n }\n };\n\n checkStatus();\n }, []);\n\n return { isLoaded, isLoading, error };\n};\n","import { TextField } from '@mui/material';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useGoogleMapsStatus } from './googleMapsUtils';\n\ntype LocationResult = {\n location: { lat: number; lng: number };\n address: string;\n city?: string;\n state?: string;\n country?: string;\n postalCode?: string;\n streetName?: string;\n streetNumber?: string;\n shortAddress?: string;\n};\n\ntype Props = {\n onPlaceSelected: (result: LocationResult) => void;\n onError?: (error: string) => void;\n placeholder?: string;\n};\n\nconst SearchLocationInput = ({ onPlaceSelected, onError, placeholder }: Props) => {\n const t = useTranslationContext();\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const autocompleteRef = useRef<any>(null);\n const placeSelectedRef = useRef(onPlaceSelected);\n const errorRef = useRef(onError);\n\n const { isLoaded, isLoading, error: mapsError } = useGoogleMapsStatus();\n\n const currentPlaceholder = useMemo(() => {\n if (isLoading) return t('searchLocationModal.loadingGoogleMaps');\n if (mapsError) return t('searchLocationModal.googleMapsUnavailable');\n if (!isLoaded) return t('searchLocationModal.googleMapsNotLoaded');\n return placeholder ?? t('searchLocationModal.enterLocation');\n }, [isLoaded, isLoading, mapsError, placeholder, t]);\n\n useEffect(() => {\n placeSelectedRef.current = onPlaceSelected;\n }, [onPlaceSelected]);\n\n useEffect(() => {\n errorRef.current = onError;\n }, [onError]);\n\n useEffect(() => {\n if (!isLoaded) return;\n if (!inputRef.current) return;\n if (autocompleteRef.current) return;\n\n const googleAny = (window as any)?.google;\n if (!googleAny?.maps?.places?.Autocomplete) {\n errorRef.current?.(t('searchLocationModal.googleMapsUnavailable'));\n return;\n }\n\n inputRef.current.focus();\n\n let observer: MutationObserver | null = null;\n\n const applyPacContainerStyles = () => {\n const pacContainers = document.querySelectorAll('.pac-container');\n pacContainers.forEach((container) => {\n const el = container as HTMLElement;\n el.style.zIndex = '20000';\n el.style.position = 'fixed';\n });\n };\n\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n const element = node as Element;\n if (!element.classList?.contains('pac-container')) continue;\n (element as HTMLElement).style.zIndex = '20000';\n (element as HTMLElement).style.position = 'fixed';\n }\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n applyPacContainerStyles();\n window.setTimeout(applyPacContainerStyles, 100);\n\n autocompleteRef.current = new googleAny.maps.places.Autocomplete(inputRef.current, {\n types: ['geocode'],\n componentRestrictions: { country: 'ar' },\n });\n\n const listener = autocompleteRef.current.addListener?.('place_changed', () => {\n const place = autocompleteRef.current?.getPlace?.();\n\n if (!place?.geometry?.location) {\n errorRef.current?.(t('searchLocationModal.selectedPlaceNoLocation'));\n return;\n }\n\n let city = '';\n let state = '';\n let country = '';\n let postalCode = '';\n let streetName = '';\n let streetNumber = '';\n\n const components: any[] = place.address_components ?? [];\n for (const component of components) {\n const types: string[] = component?.types ?? [];\n\n if (types.includes('locality') || types.includes('administrative_area_level_2')) {\n city = component.long_name;\n continue;\n }\n if (types.includes('administrative_area_level_1')) {\n state = component.long_name;\n continue;\n }\n if (types.includes('country')) {\n country = component.long_name;\n continue;\n }\n if (types.includes('postal_code')) {\n postalCode = component.long_name;\n continue;\n }\n if (types.includes('route')) {\n streetName = component.long_name;\n continue;\n }\n if (types.includes('street_number')) {\n streetNumber = component.long_name;\n }\n }\n\n const lat =\n typeof place.geometry.location.lat === 'function' ? place.geometry.location.lat() : 0;\n const lng =\n typeof place.geometry.location.lng === 'function' ? place.geometry.location.lng() : 0;\n\n const result: LocationResult = {\n location: { lat, lng },\n address: place.formatted_address ?? '',\n city,\n state,\n country,\n postalCode,\n streetName,\n streetNumber,\n shortAddress: [streetName, streetNumber].filter(Boolean).join(' '),\n };\n\n placeSelectedRef.current(result);\n });\n\n return () => {\n if (observer) observer.disconnect();\n if (listener?.remove) listener.remove();\n autocompleteRef.current = null;\n };\n }, [isLoaded, t]);\n\n const isDisabled = isLoading || !isLoaded || Boolean(mapsError);\n\n return (\n <TextField\n fullWidth\n size=\"small\"\n inputRef={inputRef}\n placeholder={currentPlaceholder}\n disabled={isDisabled}\n error={Boolean(mapsError)}\n />\n );\n};\n\nexport default SearchLocationInput;\nexport type { LocationResult };\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport SaveIcon from '@mui/icons-material/Save';\nimport { LoadingButton } from '@mui/lab';\nimport { Box, IconButton, Stack, TextField, Typography } from '@mui/material';\nimport { useMemo, useState } from 'react';\nimport type { ChangeEvent } from 'react';\nimport { updateEntity } from '../../services/api';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport SearchLocationInput, { LocationResult } from './SearchLocationInput';\n\ntype AddressDraft = {\n street: string;\n city: string;\n state: string;\n zipcode: string;\n country: string;\n};\n\ntype Props = {\n baseUrl?: string;\n spaceId?: string;\n entityType: 'contact' | 'business';\n entityId: string;\n onBack: () => void;\n onEntityUpdated?: (entity: unknown) => void;\n};\n\nconst EMPTY_DRAFT: AddressDraft = {\n street: '',\n city: '',\n state: '',\n zipcode: '',\n country: '',\n};\n\nconst SearchLocationEditor = ({\n baseUrl,\n spaceId,\n entityType,\n entityId,\n onBack,\n onEntityUpdated,\n}: Props) => {\n const t = useTranslationContext();\n\n const [draft, setDraft] = useState<AddressDraft>(EMPTY_DRAFT);\n const [query, setQuery] = useState('');\n const [error, setError] = useState('');\n\n const [isSavingMain, setIsSavingMain] = useState(false);\n const [isSavingSecondary, setIsSavingSecondary] = useState(false);\n\n const canSubmit = useMemo(() => {\n return Boolean(\n String(draft.street ?? '').trim() ||\n String(draft.city ?? '').trim() ||\n String(draft.state ?? '').trim() ||\n String(draft.zipcode ?? '').trim() ||\n String(draft.country ?? '').trim(),\n );\n }, [draft]);\n\n const handlePlaceSelected = (result: LocationResult) => {\n setQuery(result.address ?? '');\n\n const computedStreet =\n String(result.shortAddress ?? '').trim() ||\n [result.streetName, result.streetNumber].filter(Boolean).join(' ').trim();\n\n setDraft({\n street: computedStreet,\n city: result.city ?? '',\n state: result.state ?? '',\n zipcode: result.postalCode ?? '',\n country: result.country ?? '',\n });\n\n setError('');\n };\n\n const handleError = (errorMessage: string) => {\n setError(String(errorMessage ?? ''));\n };\n\n const handleChange = (key: keyof AddressDraft) => (e: ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value;\n setDraft((prev) => ({ ...prev, [key]: next }));\n };\n\n const handleSaveMainAddress = async () => {\n if (isSavingMain) return;\n if (!baseUrl || !spaceId) return;\n if (!entityId) return;\n\n setIsSavingMain(true);\n try {\n const updated = await updateEntity({\n baseUrl,\n spaceId,\n entityType,\n entityId,\n body: {\n address1: {\n street: String(draft.street ?? ''),\n city: String(draft.city ?? ''),\n state: String(draft.state ?? ''),\n zipcode: String(draft.zipcode ?? ''),\n country: String(draft.country ?? ''),\n },\n },\n });\n\n onEntityUpdated?.(updated);\n onBack();\n } finally {\n setIsSavingMain(false);\n }\n };\n\n const handleSaveSecondaryAddress = async () => {\n if (isSavingSecondary) return;\n if (!baseUrl || !spaceId) return;\n if (!entityId) return;\n\n setIsSavingSecondary(true);\n try {\n const updated = await updateEntity({\n baseUrl,\n spaceId,\n entityType,\n entityId,\n body: {\n address2: {\n street: String(draft.street ?? ''),\n city: String(draft.city ?? ''),\n state: String(draft.state ?? ''),\n zipcode: String(draft.zipcode ?? ''),\n country: String(draft.country ?? ''),\n },\n },\n });\n\n onEntityUpdated?.(updated);\n onBack();\n } finally {\n setIsSavingSecondary(false);\n }\n };\n\n const isDisabled = !canSubmit || isSavingMain || isSavingSecondary;\n\n return (\n <Box sx={{ width: '100%' }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 3 }}>\n <IconButton size=\"small\" onClick={onBack} aria-label={t('global.back')}>\n <ArrowBackIcon fontSize=\"small\" />\n </IconButton>\n <Typography variant=\"h6\">{t('searchLocationModal.searchAddress')}</Typography>\n </Stack>\n\n <Stack spacing={3}>\n <Box sx={{ position: 'relative', zIndex: 1400 }}>\n <SearchLocationInput\n onPlaceSelected={handlePlaceSelected}\n onError={handleError}\n placeholder={t('searchLocationModal.enterLocation')}\n />\n\n {error ? (\n <Typography variant=\"caption\" color=\"error\" sx={{ mt: 0.5, display: 'block' }}>\n {error}\n </Typography>\n ) : null}\n </Box>\n\n <TextField\n label={t('conversations.contactDetails.street')}\n value={draft.street}\n onChange={handleChange('street')}\n fullWidth\n size=\"medium\"\n />\n\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2}>\n <TextField\n label={t('searchLocationModal.city')}\n value={draft.city}\n onChange={handleChange('city')}\n fullWidth\n size=\"medium\"\n />\n <TextField\n label={t('searchLocationModal.state')}\n value={draft.state}\n onChange={handleChange('state')}\n fullWidth\n size=\"medium\"\n />\n </Stack>\n\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2}>\n <TextField\n label={t('searchLocationModal.postalCode')}\n value={draft.zipcode}\n onChange={handleChange('zipcode')}\n fullWidth\n size=\"medium\"\n />\n <TextField\n label={t('searchLocationModal.country')}\n value={draft.country}\n onChange={handleChange('country')}\n fullWidth\n size=\"medium\"\n />\n </Stack>\n\n {query ? (\n <Typography variant=\"caption\" sx={{ opacity: 0.7 }}>\n {query}\n </Typography>\n ) : null}\n\n <Stack direction=\"row\" spacing={2} justifyContent=\"flex-end\" sx={{ pt: 2 }}>\n <LoadingButton\n variant=\"contained\"\n size=\"large\"\n startIcon={<SaveIcon />}\n onClick={handleSaveMainAddress}\n loading={isSavingMain}\n disabled={isDisabled}\n >\n {t('searchLocationModal.saveMainAddress')}\n </LoadingButton>\n\n <LoadingButton\n variant=\"outlined\"\n size=\"large\"\n startIcon={<SaveIcon />}\n onClick={handleSaveSecondaryAddress}\n loading={isSavingSecondary}\n disabled={isDisabled}\n >\n {t('searchLocationModal.saveSecondaryAddress')}\n </LoadingButton>\n </Stack>\n </Stack>\n </Box>\n );\n};\n\nexport default SearchLocationEditor;\n","import { IBusiness } from '@trii/types/dist/Contacts/contacts';\r\n\r\n/**\r\n * Type guard to check if an object is an IBusiness\r\n * @param obj The object to check\r\n * @returns True if the object is an IBusiness\r\n */\r\nexport function isBusiness(obj: any): obj is IBusiness {\r\n if (obj?.isBusiness === true) {\r\n // Si se ha marcado explícitamente como negocio con la propiedad isBusiness\r\n return true;\r\n }\r\n \r\n return (\r\n obj !== null &&\r\n typeof obj === 'object' &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.spaceId === 'string' &&\r\n typeof obj.name === 'string' &&\r\n Array.isArray(obj.membersId) &&\r\n Array.isArray(obj.members) &&\r\n Array.isArray(obj.phones) &&\r\n Array.isArray(obj.emails) &&\r\n typeof obj.imageUrl === 'string' &&\r\n !('firstName' in obj) &&\r\n !('lastName' in obj)\r\n );\r\n}\r\n","import { IContact } from '@trii/types/dist/Contacts/contacts';\r\n\r\n/**\r\n * Type guard to check if an object is an IContact\r\n * @param obj The object to check\r\n * @returns True if the object is an IContact\r\n */\r\nexport function isContact(obj: any): obj is IContact {\r\n // Si está marcado explícitamente como negocio, no es un contacto regular\r\n if (obj?.isBusiness === true) {\r\n return false;\r\n }\r\n \r\n return (\r\n obj !== null &&\r\n typeof obj === 'object' &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.spaceId === 'string' &&\r\n typeof obj.name === 'string' &&\r\n typeof obj.firstName === 'string' &&\r\n typeof obj.lastName === 'string' &&\r\n Array.isArray(obj.phones) &&\r\n Array.isArray(obj.emails) &&\r\n 'origin' in obj &&\r\n typeof obj.isSpam === 'boolean' &&\r\n (!obj.businessId || typeof obj.businessId === 'string')\r\n );\r\n}\r\n","import { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { IBusiness, IContact, IContactField, IContactTag } from '@trii/types/dist/Contacts/contacts';\r\nimport { ILabel } from '@trii/types/dist/Contacts';\r\nimport { createEditContactApi } from '../services/api';\r\nimport { isBusiness } from '../types/is-business.typeguard';\r\nimport { isContact } from '../types/is-contact.typeguard';\r\nimport { UserTrii } from '@trii/types/dist/Users';\r\n\r\nexport type UseEditContactModalControllerArgs = {\r\n open: boolean;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n contactId?: string;\r\n initialContactData?: IContact | IBusiness;\r\n};\r\n\r\ntype ControllerState = {\r\n isLoading: boolean;\r\n error: unknown;\r\n contactData: IContact | IBusiness | null;\r\n labels: ILabel[];\r\n labelsLoading: boolean;\r\n labelsError: unknown;\r\n contactFields: IContactField[];\r\n contactFieldsLoading: boolean;\r\n contactFieldsError: unknown;\r\n userTrii: UserTrii | null;\r\n userLoading: boolean;\r\n userError: unknown;\r\n};\r\n\r\nexport function useEditContactModalController({\r\n open,\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n}: UseEditContactModalControllerArgs) {\r\n const abortRef = useRef<AbortController | null>(null);\r\n\r\n const api = useMemo(() => {\r\n if (!baseUrl || !spaceId) return null;\r\n return createEditContactApi(baseUrl, spaceId);\r\n }, [baseUrl, spaceId]);\r\n\r\n const [state, setState] = useState<ControllerState>({\r\n isLoading: false,\r\n error: null,\r\n contactData: null,\r\n labels: [],\r\n labelsLoading: false,\r\n labelsError: null,\r\n contactFields: [],\r\n contactFieldsLoading: false,\r\n contactFieldsError: null,\r\n userTrii: null,\r\n userLoading: false,\r\n userError: null,\r\n });\r\n\r\n const canFetch = useMemo(() => Boolean(open && api && contactId), [open, api, contactId]);\r\n\r\n useEffect(() => {\r\n if (open) return;\r\n abortRef.current?.abort();\r\n setState({\r\n isLoading: false,\r\n error: null,\r\n contactData: null,\r\n labels: [],\r\n labelsLoading: false,\r\n labelsError: null,\r\n contactFields: [],\r\n contactFieldsLoading: false,\r\n contactFieldsError: null,\r\n userTrii: null,\r\n userLoading: false,\r\n userError: null,\r\n });\r\n }, [open]);\r\n\r\n const canFetchLabels = useMemo(() => Boolean(open && api), [open, api]);\r\n\r\n useEffect(() => {\r\n if (!canFetchLabels || !api) {\r\n return;\r\n }\r\n\r\n const controller = new AbortController();\r\n setState((prev) => ({ ...prev, labelsLoading: true, labelsError: null }));\r\n\r\n api\r\n .fetchLabels({ signal: controller.signal })\r\n .then((labels) => {\r\n setState((prev) => ({ ...prev, labels, labelsLoading: false, labelsError: null }));\r\n })\r\n .catch((err) => {\r\n if (controller.signal.aborted) return;\r\n setState((prev) => ({ ...prev, labelsLoading: false, labelsError: err }));\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, canFetchLabels]);\r\n\r\n useEffect(() => {\r\n if (!canFetch || !api) {\r\n return;\r\n }\r\n\r\n abortRef.current?.abort();\r\n const controller = new AbortController();\r\n abortRef.current = controller;\r\n\r\n setState((prev) => ({ ...prev, isLoading: true, error: null, contactData: null }));\r\n\r\n api\r\n .fetchContact({ contactId: contactId!, signal: controller.signal })\r\n .then((data) => {\r\n setState((prev) => ({ ...prev, isLoading: false, error: null, contactData: data }));\r\n })\r\n .catch((err) => {\r\n if (controller.signal.aborted) return;\r\n setState((prev) => ({ ...prev, isLoading: false, error: err }));\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, canFetch, contactId]);\r\n\r\n const canFetchUser = useMemo(() => Boolean(open && api), [open, api]);\r\n\r\n useEffect(() => {\r\n if (!canFetchUser || !api) return;\r\n\r\n const controller = new AbortController();\r\n setState((prev) => ({ ...prev, userLoading: true, userError: null }));\r\n\r\n api\r\n .fetchUserTrii({ signal: controller.signal })\r\n .then((data) => {\r\n setState((prev) => ({ ...prev, userLoading: false, userError: null, userTrii: data }));\r\n })\r\n .catch((err) => {\r\n if (controller.signal.aborted) return;\r\n setState((prev) => ({ ...prev, userLoading: false, userError: err }));\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, canFetchUser]);\r\n\r\n const selectors = useMemo(() => {\r\n const contactData = state.contactData;\r\n const business = isBusiness(contactData);\r\n const contact = isContact(contactData);\r\n\r\n let contactType: 'business' | 'contact' | 'unknown' = 'unknown';\r\n if (business) contactType = 'business';\r\n if (contact) contactType = 'contact';\r\n\r\n let displayName = 'Unknown Contact';\r\n if (business) {\r\n displayName = contactData.name;\r\n } else if (contact) {\r\n displayName = `${contactData.firstName} ${contactData.lastName}`.trim();\r\n }\r\n\r\n const tags: IContactTag[] = contactData?.tags ?? [];\r\n\r\n return {\r\n isBusiness: business,\r\n isContact: contact,\r\n contactType,\r\n displayName,\r\n tags,\r\n labels: state.labels,\r\n contactFields: state.contactFields,\r\n userTrii: state.userTrii,\r\n userLoading: state.userLoading,\r\n userError: state.userError,\r\n };\r\n }, [state.contactData, state.labels, state.contactFields, state.userTrii, state.userLoading, state.userError]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n if (!api) return;\r\n const contactData = state.contactData;\r\n const business = isBusiness(contactData);\r\n const contact = isContact(contactData);\r\n const forType: 'contact' | 'business' | null = business ? 'business' : contact ? 'contact' : null;\r\n if (!forType) return;\r\n\r\n const controller = new AbortController();\r\n setState((prev) => ({ ...prev, contactFieldsLoading: true, contactFieldsError: null }));\r\n\r\n api\r\n .fetchContactFields({ forType, signal: controller.signal })\r\n .then((fields) => {\r\n setState((prev) => ({ ...prev, contactFields: fields, contactFieldsLoading: false, contactFieldsError: null }));\r\n })\r\n .catch((err) => {\r\n if (controller.signal.aborted) return;\r\n setState((prev) => ({ ...prev, contactFieldsLoading: false, contactFieldsError: err }));\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, open, state.contactData]);\r\n\r\n return {\r\n state,\r\n selectors,\r\n actions: {\r\n setContactData: (contactData?: IContact | IBusiness) =>\r\n setState((prev) => ({ ...prev, contactData: contactData ?? null })),\r\n clearError: () => setState((prev) => ({ ...prev, error: null })),\r\n },\r\n };\r\n}\r\n","import { ChangeEvent, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { UserTrii } from '@trii/types/dist/Users';\r\nimport { fetchUserTrii, updateEntity, uploadAvatar } from '../services/api';\r\n\r\nexport type UseImageType = {\r\n inputAtributes: {\r\n onChange: (event: ChangeEvent<HTMLInputElement>) => void;\r\n ref: React.RefObject<HTMLInputElement>;\r\n type: string;\r\n accept: string;\r\n };\r\n action: {\r\n uploadImage: () => void;\r\n deleteImage: () => Promise<void>;\r\n };\r\n imageUrl: string;\r\n removeParams: (url: string) => string;\r\n isUploading: boolean;\r\n isDeleting: boolean;\r\n};\r\n\r\ntype UseImageArgs = {\r\n baseUrl?: string;\r\n spaceId?: string;\r\n entityType?: 'contact' | 'business';\r\n entityId?: string;\r\n initialImageUrl?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\nconst useImage = ({\r\n baseUrl,\r\n spaceId,\r\n entityType,\r\n entityId,\r\n initialImageUrl,\r\n onEntityUpdated,\r\n}: UseImageArgs): UseImageType => {\r\n const [imageUrl, setImageUrl] = useState<string>(initialImageUrl ?? '');\r\n const [userTrii, setUserTrii] = useState<UserTrii | null>(null);\r\n const [isUploading, setIsUploading] = useState(false);\r\n const [isDeleting, setIsDeleting] = useState(false);\r\n\r\n const ref = useRef<HTMLInputElement | null>(null);\r\n\r\n const canRequest = useMemo(\r\n () => Boolean(baseUrl && spaceId && entityType && entityId),\r\n [baseUrl, spaceId, entityType, entityId]\r\n );\r\n\r\n function removeSasToken(url: string) {\r\n return url.split('?sv=')[0];\r\n }\r\n\r\n function removeCacheId(url: string) {\r\n return url.split('&cacheId=')[0];\r\n }\r\n\r\n function removeParams(url: string) {\r\n let result = removeSasToken(url);\r\n if (!result) return '';\r\n result = removeCacheId(result);\r\n if (!result) return '';\r\n return result;\r\n }\r\n\r\n const ensureUserTrii = async () => {\r\n if (!baseUrl || !spaceId) return null;\r\n const next = await fetchUserTrii({ baseUrl, spaceId });\r\n setUserTrii(next);\r\n return next;\r\n };\r\n\r\n const getImageURLWithAccessToken = async (rawUrl: string) => {\r\n const nextUser = userTrii ?? (await ensureUserTrii());\r\n const storageAzureSAS = nextUser?.storageAzureSAS as any;\r\n\r\n const expireAt = storageAzureSAS?.expireAt;\r\n const expiredAtDate = expireAt ? new Date(expireAt) : null;\r\n\r\n let sas = storageAzureSAS?.sas ?? '';\r\n if (!sas || (expiredAtDate && expiredAtDate < new Date())) {\r\n const refreshed = await ensureUserTrii();\r\n const refreshedSas = (refreshed?.storageAzureSAS as any)?.sas;\r\n sas = refreshedSas ?? '';\r\n }\r\n\r\n if (!sas) {\r\n return rawUrl;\r\n }\r\n\r\n const cacheId = `${Date.now()}`;\r\n return `${rawUrl}${sas}&cacheId=${cacheId}`;\r\n };\r\n\r\n const setAccessImageUrl = async (url: string) => {\r\n if (!url) {\r\n setImageUrl('');\r\n return;\r\n }\r\n\r\n const rawUrl = removeSasToken(url);\r\n if (!rawUrl) return;\r\n const withSas = await getImageURLWithAccessToken(rawUrl);\r\n setImageUrl(withSas);\r\n };\r\n\r\n const onChange = async (event: ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0];\r\n if (!file) return;\r\n if (!canRequest) return;\r\n\r\n if (ref.current) {\r\n ref.current.value = '';\r\n }\r\n\r\n setIsUploading(true);\r\n try {\r\n const uploadedUrl = await uploadAvatar({\r\n baseUrl: baseUrl!,\r\n spaceId: spaceId!,\r\n contactId: entityId!,\r\n file,\r\n });\r\n\r\n const updated = await updateEntity({\r\n baseUrl: baseUrl!,\r\n spaceId: spaceId!,\r\n entityType: entityType!,\r\n entityId: entityId!,\r\n body: { imageUrl: uploadedUrl } as any,\r\n });\r\n\r\n onEntityUpdated?.(updated);\r\n await setAccessImageUrl(uploadedUrl);\r\n } finally {\r\n setIsUploading(false);\r\n }\r\n };\r\n\r\n const uploadImage = () => {\r\n ref.current?.click();\r\n };\r\n\r\n const deleteImage = async () => {\r\n if (!canRequest) return;\r\n if (isDeleting) return;\r\n\r\n setIsDeleting(true);\r\n try {\r\n await updateEntity({\r\n baseUrl: baseUrl!,\r\n spaceId: spaceId!,\r\n entityType: entityType!,\r\n entityId: entityId!,\r\n body: { imageUrl: \"\" },\r\n });\r\n\r\n onEntityUpdated?.({ imageUrl: \"\" });\r\n setImageUrl('');\r\n } finally {\r\n setIsDeleting(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!initialImageUrl) {\r\n setImageUrl('');\r\n return;\r\n }\r\n\r\n void setAccessImageUrl(initialImageUrl);\r\n }, [initialImageUrl]);\r\n\r\n return {\r\n inputAtributes: {\r\n onChange,\r\n ref,\r\n type: 'file',\r\n accept: 'image/*',\r\n },\r\n action: {\r\n uploadImage,\r\n deleteImage,\r\n },\r\n imageUrl,\r\n removeParams,\r\n isUploading,\r\n isDeleting,\r\n };\r\n};\r\n\r\nexport default useImage;\r\n","import { useState, useEffect, ChangeEvent } from 'react';\r\n\r\nexport interface UseFieldType {\r\n actions: {\r\n onError: (errorMsg: string) => void;\r\n onSuccess: () => void;\r\n resetValue: () => void;\r\n changeValue: (newValue: string) => void;\r\n };\r\n attributes: {\r\n error: boolean;\r\n helperText: string;\r\n type: string;\r\n value: string;\r\n onChange: (event: ChangeEvent<HTMLInputElement>) => void;\r\n };\r\n}\r\n\r\nconst useField = (type: string, initialValue?: string): UseFieldType => {\r\n const [value, setValue] = useState(initialValue || '');\r\n const [error, setError] = useState(false);\r\n const [helperText, setHelperText] = useState('');\r\n\r\n useEffect(() => {\r\n setValue(initialValue || '');\r\n\r\n return () => {\r\n setValue(initialValue || '');\r\n };\r\n }, [initialValue]);\r\n\r\n const onError = (errorMsg: string) => {\r\n setError(true);\r\n setHelperText(errorMsg);\r\n };\r\n\r\n const onSuccess = () => {\r\n setError(false);\r\n setHelperText('');\r\n };\r\n\r\n const onChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n setValue(event.target.value);\r\n };\r\n\r\n const changeValue = (newValue: string) => {\r\n setValue(newValue);\r\n };\r\n\r\n const resetValue = () => {\r\n setValue(initialValue || '');\r\n };\r\n\r\n return {\r\n actions: { onError, onSuccess, resetValue, changeValue },\r\n attributes: { error, helperText, type, value, onChange },\r\n };\r\n};\r\n\r\nexport default useField;\r\n","import { useState, useEffect } from 'react';\r\n// Types\r\nimport { SelectChangeEvent } from '@mui/material';\r\n\r\nexport type UseSelectType = {\r\n actions: {\r\n resetValue: () => void;\r\n changeValue: (newValue: string) => void;\r\n };\r\n attributes: {\r\n value: string;\r\n onChange: (event: SelectChangeEvent<string>) => void;\r\n };\r\n};\r\n\r\nconst useSelect = (initialValue: string = ''): UseSelectType => {\r\n const [value, setValue] = useState<string>(initialValue);\r\n\r\n const onChange = (event: SelectChangeEvent<string>) => {\r\n setValue(event.target.value as string);\r\n };\r\n\r\n const changeValue = (newValue: string) => {\r\n setValue(newValue);\r\n };\r\n\r\n const resetValue = () => {\r\n setValue(initialValue ?? '');\r\n };\r\n\r\n useEffect(() => {\r\n setValue(initialValue);\r\n }, [initialValue]);\r\n\r\n return {\r\n actions: { resetValue, changeValue },\r\n attributes: { value, onChange },\r\n };\r\n};\r\n\r\nexport default useSelect;\r\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from 'uuid';\r\n// Types\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\n\r\nexport interface NewAddress {\r\n id: string;\r\n address: string;\r\n note: string;\r\n channelType:\r\n | ChannelType.PHONE\r\n | ChannelType.EMAIL\r\n | ChannelType.WHATSAPP\r\n | ChannelType.INSTAGRAM\r\n | ChannelType.RCS;\r\n isSaved: boolean;\r\n}\r\n\r\n\r\nfunction createNewAddress(\r\n channelType: ChannelType.PHONE | ChannelType.EMAIL | ChannelType.WHATSAPP | ChannelType.RCS\r\n): NewAddress {\r\n return {\r\n id: uuidv4(),\r\n address: '',\r\n note: '',\r\n channelType,\r\n isSaved: false,\r\n };\r\n}\r\n\r\nexport default { createNewAddress };\r\n","// Types\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\nconst getEditedField = (\r\n key: string,\r\n originalValue: string | number | null,\r\n editedValue: string | number\r\n): Record<string, string | number> | null => {\r\n if (\r\n originalValue !== editedValue &&\r\n !(originalValue === null && editedValue === '')\r\n ) {\r\n const editedField: Record<string, string | number> = {};\r\n\r\n editedField[key] = editedValue;\r\n return editedField;\r\n }\r\n return null;\r\n};\r\n\r\nconst getAddressesWithUpdatedValues = (\r\n newValue: string,\r\n newValueAddressId: string,\r\n addresses: IContactAddress[]\r\n): IContactAddress[] => {\r\n const newAddresses = addresses.map((address) => {\r\n if (address.id === newValueAddressId) {\r\n return {\r\n ...address,\r\n address: newValue,\r\n };\r\n }\r\n return address;\r\n });\r\n\r\n return newAddresses;\r\n};\r\n\r\nexport default { getEditedField, getAddressesWithUpdatedValues };\r\n","import { ChangeEvent, useEffect, useState } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport contactHelper from '../utils/contactHelper';\r\nimport editContactHelper from './utils/editContactHelper';\r\n\r\ntype InitialContactMethods =\r\n | {\r\n emails?: IContactAddress[];\r\n phones?: IContactAddress[];\r\n ims_whatsapp?: IContactAddress[];\r\n ims_rcs?: IContactAddress[];\r\n ims_facebook?: IContactAddress[];\r\n ims_webchat?: IContactAddress[];\r\n ims_instagram?: IContactAddress[];\r\n ims_mercadolibre?: IContactAddress[];\r\n }\r\n | null\r\n | undefined;\r\n\r\ntype DeleteAddressPayload = {\r\n contactId: string;\r\n contactAddressId: string;\r\n type: ChannelType;\r\n};\r\n\r\ntype UseEditContactMethodsArgs = {\r\n entityId?: string | null;\r\n initial: InitialContactMethods;\r\n dispatch?: (action: any) => Promise<any>;\r\n deleteAddress: (payload: DeleteAddressPayload) => Promise<any> | any;\r\n};\r\n\r\nconst useEditContactMethods = ({\r\n entityId,\r\n initial,\r\n dispatch,\r\n deleteAddress,\r\n}: UseEditContactMethodsArgs) => {\r\n const [isDeletingAddress, setIsDeletingAddress] = useState<false | string>(false);\r\n\r\n const [initialSnapshot, setInitialSnapshot] = useState<InitialContactMethods>(() => initial);\r\n\r\n const [imsFacebooks, setImsFacebooks] = useState<any[]>(initial?.ims_facebook || []);\r\n const [imsMercadolibre, setImsMercadolibre] = useState<any[]>(initial?.ims_mercadolibre || []);\r\n const [imsWebchats, setImsWebchats] = useState<any[]>(initial?.ims_webchat || []);\r\n const [imsInstagrams, setImsInstagrams] = useState<any[]>(initial?.ims_instagram || []);\r\n const [imsWhatsapp, setImsWhatsApp] = useState<any[]>(initial?.ims_whatsapp || []);\r\n const [emails, setEmails] = useState<any[]>(initial?.emails || []);\r\n const [phoneNumbers, setPhoneNumbers] = useState<any[]>(initial?.phones || []);\r\n const [imsRCS, setImsRCS] = useState<any[]>(initial?.ims_rcs || []);\r\n\r\n const addPhone = () => {\r\n const newPhone = contactHelper.createNewAddress(ChannelType.PHONE);\r\n const newPhoneNumbers = [...phoneNumbers, newPhone];\r\n setPhoneNumbers(newPhoneNumbers as IContactAddress[]);\r\n };\r\n\r\n const addEmail = () => {\r\n const newEmail = contactHelper.createNewAddress(ChannelType.EMAIL);\r\n const newEmails = [...emails, newEmail];\r\n setEmails(newEmails as IContactAddress[]);\r\n };\r\n\r\n const addWhatsapp = () => {\r\n const newWhatsapp = contactHelper.createNewAddress(ChannelType.WHATSAPP);\r\n const newWhatsapps = [...imsWhatsapp, newWhatsapp];\r\n setImsWhatsApp(newWhatsapps as IContactAddress[]);\r\n };\r\n\r\n const addRCS = () => {\r\n const newRCS = contactHelper.createNewAddress(ChannelType.RCS);\r\n const newRCSs = [...imsRCS, newRCS];\r\n setImsRCS(newRCSs as IContactAddress[]);\r\n };\r\n\r\n const addWhatsappVerified = (newWhatsapp: IContactAddress) => {\r\n const updatedWhatsapps = [...imsWhatsapp, newWhatsapp];\r\n setImsWhatsApp(updatedWhatsapps);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_whatsapp: updatedWhatsapps,\r\n }));\r\n };\r\n\r\n const replaceAddress = (addressId: string, newAddress: IContactAddress) => {\r\n if (!newAddress) {\r\n return;\r\n }\r\n\r\n if (newAddress.channelType === 3) {\r\n const newEmails = emails.map((email) => {\r\n if (email.id === addressId) {\r\n return newAddress;\r\n }\r\n return email;\r\n });\r\n\r\n setEmails(newEmails);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n emails: newEmails,\r\n }));\r\n }\r\n\r\n if (newAddress.channelType === 5) {\r\n const newPhoneNumbers = phoneNumbers.map((phoneNumber) => {\r\n if (phoneNumber.id === addressId) {\r\n return newAddress;\r\n }\r\n return phoneNumber;\r\n });\r\n\r\n setPhoneNumbers(newPhoneNumbers);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n phones: newPhoneNumbers,\r\n }));\r\n }\r\n\r\n if (newAddress.channelType === 13) {\r\n const newImsWhatsapp = imsWhatsapp.map((item) => {\r\n if (item.id === addressId) {\r\n return newAddress;\r\n }\r\n return item;\r\n });\r\n\r\n setImsWhatsApp(newImsWhatsapp);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_whatsapp: newImsWhatsapp,\r\n }));\r\n }\r\n\r\n if (newAddress.channelType === 21) {\r\n const newImsRCS = imsRCS.map((item) => {\r\n if (item.id === addressId) {\r\n return newAddress;\r\n }\r\n return item;\r\n });\r\n\r\n setImsRCS(newImsRCS);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_rcs: newImsRCS,\r\n }));\r\n }\r\n\r\n if (newAddress.channelType === 41) {\r\n const newImsMercadolibre = imsMercadolibre.map((item) => {\r\n if (item.id === addressId) {\r\n return newAddress;\r\n }\r\n return item;\r\n });\r\n\r\n setImsMercadolibre(newImsMercadolibre);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_mercadolibre: newImsMercadolibre,\r\n }));\r\n }\r\n };\r\n\r\n const handleAddressFieldChange = async (\r\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n fieldId: string,\r\n type: ChannelType,\r\n ) => {\r\n const newValue = e.target.value;\r\n\r\n if (type === 3) {\r\n const newEmails = editContactHelper.getAddressesWithUpdatedValues(newValue, fieldId, emails);\r\n setEmails(newEmails);\r\n } else if (type === 5) {\r\n const newPhoneNumbers = editContactHelper.getAddressesWithUpdatedValues(\r\n newValue,\r\n fieldId,\r\n phoneNumbers,\r\n );\r\n\r\n setPhoneNumbers(newPhoneNumbers);\r\n } else if (type === 13) {\r\n const newImsWhatsapp = editContactHelper.getAddressesWithUpdatedValues(\r\n newValue,\r\n fieldId,\r\n imsWhatsapp,\r\n );\r\n\r\n setImsWhatsApp(newImsWhatsapp);\r\n } else if (type === 21) {\r\n const newImsRCS = editContactHelper.getAddressesWithUpdatedValues(newValue, fieldId, imsRCS);\r\n\r\n setImsRCS(newImsRCS);\r\n } else if (type === 41) {\r\n const newImsMercadolibre = editContactHelper.getAddressesWithUpdatedValues(\r\n newValue,\r\n fieldId,\r\n imsMercadolibre,\r\n );\r\n setImsMercadolibre(newImsMercadolibre);\r\n }\r\n };\r\n\r\n const handleNoteFieldChange = (\r\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n fieldId: string,\r\n addressType: ChannelType,\r\n ) => {\r\n if (addressType === 14) {\r\n const newImsFacebooks = imsFacebooks.map((imsFacebook) => {\r\n if (imsFacebook.id === fieldId) {\r\n return {\r\n ...imsFacebook,\r\n note: e.target.value,\r\n };\r\n }\r\n return imsFacebook;\r\n });\r\n setImsFacebooks(newImsFacebooks);\r\n }\r\n if (addressType === 20) {\r\n const newImsWebchats = imsWebchats.map((imsWebchat) => {\r\n if (imsWebchat.id === fieldId) {\r\n return {\r\n ...imsWebchat,\r\n note: e.target.value,\r\n };\r\n }\r\n return imsWebchat;\r\n });\r\n setImsWebchats(newImsWebchats);\r\n }\r\n if (addressType === 16) {\r\n const newImsInstagrams = imsInstagrams.map((imsInstagram) => {\r\n if (imsInstagram.id === fieldId) {\r\n return {\r\n ...imsInstagram,\r\n note: e.target.value,\r\n };\r\n }\r\n return imsInstagram;\r\n });\r\n setImsInstagrams(newImsInstagrams);\r\n }\r\n if (addressType === 3) {\r\n const newEmails = emails.map((email) => {\r\n if (email.id === fieldId) {\r\n return {\r\n ...email,\r\n note: e.target.value,\r\n };\r\n }\r\n return email;\r\n });\r\n setEmails(newEmails);\r\n }\r\n if (addressType === 5) {\r\n const newPhoneNumbers = phoneNumbers.map((phoneNumber) => {\r\n if (phoneNumber.id === fieldId) {\r\n return {\r\n ...phoneNumber,\r\n note: e.target.value,\r\n };\r\n }\r\n return phoneNumber;\r\n });\r\n setPhoneNumbers(newPhoneNumbers);\r\n }\r\n if (addressType === 13) {\r\n const newImsWhatsapp = imsWhatsapp.map((item) => {\r\n if (item.id === fieldId) {\r\n return {\r\n ...item,\r\n note: e.target.value,\r\n };\r\n }\r\n return item;\r\n });\r\n setImsWhatsApp(newImsWhatsapp);\r\n }\r\n if (addressType === 21) {\r\n const newImsRCS = imsRCS.map((item) => {\r\n if (item.id === fieldId) {\r\n return {\r\n ...item,\r\n note: e.target.value,\r\n };\r\n }\r\n return item;\r\n });\r\n\r\n setImsRCS(newImsRCS);\r\n }\r\n if (addressType === 41) {\r\n const newImsMercadolibre = imsMercadolibre.map((item) => {\r\n if (item.id === fieldId) {\r\n return {\r\n ...item,\r\n note: e.target.value,\r\n };\r\n }\r\n return item;\r\n });\r\n setImsMercadolibre(newImsMercadolibre);\r\n }\r\n };\r\n\r\n const handleDeleteAddress = async (fieldId: string, addressType: ChannelType) => {\r\n if (!entityId) {\r\n return;\r\n }\r\n\r\n if (\r\n addressType === 3 ||\r\n addressType === 5 ||\r\n addressType === 13 ||\r\n addressType === 14 ||\r\n addressType === 20 ||\r\n addressType === 16 ||\r\n addressType === 21 ||\r\n addressType === 41\r\n ) {\r\n setIsDeletingAddress(fieldId);\r\n const payload = {\r\n contactId: entityId,\r\n contactAddressId: fieldId,\r\n type: addressType,\r\n };\r\n if (dispatch) {\r\n await dispatch(deleteAddress(payload));\r\n } else {\r\n await deleteAddress(payload);\r\n }\r\n setIsDeletingAddress(false);\r\n switch (addressType) {\r\n case 3:\r\n const newEmails = emails.filter((email) => email.id !== fieldId);\r\n setEmails(newEmails);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n emails: newEmails,\r\n }));\r\n break;\r\n case 5:\r\n const newPhoneNumbers = phoneNumbers.filter((phoneNumber) => phoneNumber.id !== fieldId);\r\n setPhoneNumbers(newPhoneNumbers);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n phones: newPhoneNumbers,\r\n }));\r\n break;\r\n case 13:\r\n const newImsWhatsapp = imsWhatsapp.filter((item) => item.id !== fieldId);\r\n setImsWhatsApp(newImsWhatsapp);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_whatsapp: newImsWhatsapp,\r\n }));\r\n break;\r\n case 21:\r\n const newImsRCS = imsRCS.filter((item) => item.id !== fieldId);\r\n setImsRCS(newImsRCS);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_rcs: newImsRCS,\r\n }));\r\n break;\r\n case 41:\r\n const newImsMercadolibre = imsMercadolibre.filter((item) => item.id !== fieldId);\r\n setImsMercadolibre(newImsMercadolibre);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_mercadolibre: newImsMercadolibre,\r\n }));\r\n break;\r\n case 14:\r\n const newImsFacebooks = imsFacebooks.filter((item) => item.id !== fieldId);\r\n setImsFacebooks(newImsFacebooks);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_facebook: newImsFacebooks,\r\n }));\r\n break;\r\n case 20:\r\n const newImsWebchats = imsWebchats.filter((item) => item.id !== fieldId);\r\n setImsWebchats(newImsWebchats);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_webchat: newImsWebchats,\r\n }));\r\n break;\r\n case 16:\r\n const newImsInstagrams = imsInstagrams.filter((item) => item.id !== fieldId);\r\n setImsInstagrams(newImsInstagrams);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_instagram: newImsInstagrams,\r\n }));\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n };\r\n\r\n function resetToInitialContactInformation() {\r\n setImsFacebooks(initialSnapshot?.ims_facebook || []);\r\n setImsMercadolibre(initialSnapshot?.ims_mercadolibre || []);\r\n setImsWebchats(initialSnapshot?.ims_webchat || []);\r\n setImsInstagrams(initialSnapshot?.ims_instagram || []);\r\n setImsWhatsApp(initialSnapshot?.ims_whatsapp || []);\r\n setImsRCS(initialSnapshot?.ims_rcs || []);\r\n setEmails(initialSnapshot?.emails || []);\r\n setPhoneNumbers(initialSnapshot?.phones || []);\r\n }\r\n\r\n useEffect(() => {\r\n setInitialSnapshot(initial);\r\n if (initial?.emails && initial?.phones) {\r\n setEmails(initial.emails);\r\n setPhoneNumbers(initial.phones);\r\n }\r\n setImsWhatsApp(initial?.ims_whatsapp || []);\r\n setImsRCS(initial?.ims_rcs || []);\r\n setImsFacebooks(initial?.ims_facebook || []);\r\n setImsWebchats(initial?.ims_webchat || []);\r\n setImsInstagrams(initial?.ims_instagram || []);\r\n setImsMercadolibre(initial?.ims_mercadolibre || []);\r\n }, [initial]);\r\n\r\n return {\r\n field: {\r\n imsWhatsapp,\r\n imsRCS,\r\n imsMercadolibre,\r\n imsFacebooks,\r\n imsWebchats,\r\n imsInstagrams,\r\n emails,\r\n phoneNumbers,\r\n },\r\n action: {\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n addPhone,\r\n addEmail,\r\n addWhatsapp,\r\n addRCS,\r\n replaceAddress,\r\n addWhatsappVerified,\r\n resetToInitialContactInformation,\r\n },\r\n state: {\r\n isDeletingAddress,\r\n },\r\n };\r\n};\r\n\r\nexport default useEditContactMethods;\r\n","import { useState } from 'react';\r\n\r\nexport interface ItemWithId {\r\n id?: string | null;\r\n [key: string]: any;\r\n}\r\n\r\ntype InitialStateType<T> = T extends (infer U)[]\r\n ? U extends ItemWithId\r\n ? T\r\n : never\r\n : never;\r\n\r\ninterface Props<T extends ItemWithId[]> {\r\n initialState?: InitialStateType<T>;\r\n}\r\n\r\nexport type UseMultipleSelectReturnType<T> = {\r\n attributes: {\r\n value: T;\r\n onChange: (event: any, newValue: T) => void;\r\n };\r\n actions: {\r\n addValue: (newValue: any) => void;\r\n setValue: (newValue: T) => void;\r\n };\r\n};\r\n\r\nexport const useMultipleSelect = <T extends ItemWithId[]>({\r\n initialState = [] as InitialStateType<T>,\r\n}: Props<T> = {}): UseMultipleSelectReturnType<T> => {\r\n const [value, setValue] = useState<T>(initialState);\r\n\r\n const onChange = (event: any, newValue: T) => {\r\n void event;\r\n const hasNewObject = newValue.some(\r\n (newItem) => !value.some((currentItem) => newItem.id === currentItem.id)\r\n );\r\n const removedObjects = value.filter(\r\n (currentItem) => !newValue.some((newItem) => newItem.id === currentItem.id)\r\n );\r\n\r\n if (removedObjects.length > 0 || hasNewObject) {\r\n setValue(newValue);\r\n }\r\n };\r\n\r\n const addValue = (newValue: any) => {\r\n setValue((prevState) => prevState.concat(newValue) as unknown as T);\r\n };\r\n\r\n const setValueWrapper = (newValue: T) => {\r\n setValue(newValue);\r\n };\r\n\r\n return {\r\n attributes: { value, onChange },\r\n actions: {\r\n addValue,\r\n setValue: setValueWrapper,\r\n },\r\n };\r\n};\r\n","import { useEffect, useMemo, useState } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport {\r\n IBusiness,\r\n IContactField,\r\n IContactInfo,\r\n ILabel,\r\n Property,\r\n} from '@trii/types/dist/Contacts';\r\nimport UseEditBusiness from './types/UseEditBusiness';\r\n// Hooks\r\nimport useField from '../useField';\r\nimport useImage from '../useImage';\r\nimport useSelect from '../useSelect';\r\nimport useEditContactMethods from '../useEditContactMethods';\r\nimport { useMultipleSelect } from '../useMultipleSelect';\r\n// Api\r\nimport { deleteAddress } from '../../services/api';\r\n\r\ntype UseEditBusinessArgs = {\r\n business: IBusiness | null;\r\n customContactFields: IContactField[];\r\n baseUrl?: string;\r\n spaceId?: string;\r\n};\r\n\r\nconst useEditBusiness = ({\r\n business,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: UseEditBusinessArgs): UseEditBusiness => {\r\n const apiDeleteAddress = useMemo(\r\n () => async (payload: { contactId: string; contactAddressId: string; type: ChannelType }) => {\r\n if (!baseUrl || !spaceId) return;\r\n await deleteAddress({ baseUrl, spaceId, data: payload });\r\n },\r\n [baseUrl, spaceId],\r\n );\r\n\r\n const apiDispatch = async <T>(maybePromise: Promise<T> | T) => maybePromise;\r\n\r\n const [customProperties, setCustomProperties] = useState<Property[]>([]);\r\n // General section fields\r\n const name = useField('text', business?.name || '');\r\n const contactImage = useImage({\r\n baseUrl,\r\n spaceId,\r\n entityType: 'business',\r\n entityId: business?.id,\r\n initialImageUrl: business?.imageUrl || '',\r\n });\r\n const contactPropietary = useSelect(business?.owner);\r\n const labelMultipleSelect = useMultipleSelect<ILabel[]>({\r\n initialState: (business?.tags as ILabel[]) ?? [],\r\n });\r\n const [selectedContacts, setSelectedContacts] = useState<IContactInfo[]>([]);\r\n\r\n const {\r\n field: {\r\n imsFacebooks,\r\n imsMercadolibre,\r\n imsWebchats,\r\n imsInstagrams,\r\n imsWhatsapp,\r\n emails,\r\n phoneNumbers,\r\n imsRCS,\r\n },\r\n action: {\r\n addPhone,\r\n addEmail,\r\n addWhatsapp,\r\n addRCS,\r\n addWhatsappVerified,\r\n replaceAddress,\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n resetToInitialContactInformation,\r\n },\r\n state: { isDeletingAddress },\r\n } = useEditContactMethods({\r\n entityId: business?.id,\r\n initial: business,\r\n dispatch: apiDispatch,\r\n deleteAddress: apiDeleteAddress,\r\n });\r\n\r\n // Address iformation fields\r\n const homeAddress = useField('text', business?.address1?.street || '');\r\n const secondaryHomeAddress = useField('text', business?.address2?.street || '');\r\n const city = useField('text', business?.address1?.city || '');\r\n const secondaryCity = useField('text', business?.address2?.city || '');\r\n const state = useField('text', business?.address1?.state || '');\r\n const secondaryState = useField('text', business?.address2?.state || '');\r\n const postalCode = useField('text', business?.address1?.zipcode || '');\r\n const secondaryPostalCode = useField('text', business?.address2?.zipcode || '');\r\n const country = useField('text', business?.address1?.country || '');\r\n const secondaryCountry = useField('text', business?.address2?.country || '');\r\n\r\n const getEditedField = (\r\n key: string,\r\n originalValue: string | null | undefined,\r\n editedValue: string | null | undefined,\r\n ) => {\r\n if (originalValue !== editedValue && !(originalValue === null && editedValue === '')) {\r\n return { [key]: editedValue };\r\n }\r\n return {};\r\n };\r\n // Actions\r\n const getEditedBusiness = () => {\r\n if (!business) return null;\r\n\r\n const address1 = {\r\n street: homeAddress.attributes.value,\r\n city: city.attributes.value,\r\n state: state.attributes.value,\r\n zipcode: postalCode.attributes.value,\r\n country: country.attributes.value,\r\n };\r\n const address2 = {\r\n street: secondaryHomeAddress.attributes.value,\r\n city: secondaryCity.attributes.value,\r\n state: secondaryState.attributes.value,\r\n zipcode: secondaryPostalCode.attributes.value,\r\n country: secondaryCountry.attributes.value,\r\n };\r\n const editedBusiness = {\r\n id: business.id,\r\n ...getEditedField('owner', business.owner, contactPropietary.attributes.value),\r\n ...getEditedField('name', business.name, name.attributes.value),\r\n imageUrl: contactImage.imageUrl ? contactImage.removeParams(contactImage.imageUrl) : null,\r\n tags: labelMultipleSelect.attributes.value,\r\n properties: customProperties,\r\n members: selectedContacts,\r\n phoneNumbers,\r\n emails,\r\n address1,\r\n address2,\r\n // ims_whatsapp: modifiedImsWhatsapp,\r\n };\r\n return editedBusiness;\r\n };\r\n\r\n function resetCustomProperty(nameKey: string) {\r\n if (!business) return;\r\n\r\n const normalizeNameKey = (input: string) =>\r\n input.trim().toLowerCase().replace(/\\s+/g, '-').replace(/-+/g, '-');\r\n\r\n const defaultProperty =\r\n business.properties.find((property) => property.nameKey === nameKey) ??\r\n business.properties.find(\r\n (property) => normalizeNameKey(property.nameKey) === normalizeNameKey(nameKey),\r\n );\r\n\r\n if (!defaultProperty) {\r\n console.error(`No se encontró una propiedad con nameKey: ${nameKey}`);\r\n return; // Salir de la función si no se encuentra la propiedad\r\n }\r\n\r\n const updatedProperties = customProperties.map((property) =>\r\n property.nameKey === nameKey ? { ...property, value: defaultProperty.value } : property,\r\n );\r\n setCustomProperties(updatedProperties);\r\n }\r\n\r\n const getFilteredCustomProperties = (): Property[] => {\r\n if (!business) return [];\r\n\r\n return customContactFields.map((customField) => {\r\n const normalizeNameKey = (input: string) =>\r\n input.trim().toLowerCase().replace(/\\s+/g, '-').replace(/-+/g, '-');\r\n\r\n const existingBusinessProperty =\r\n business.properties.find((property) => property.nameKey === customField.nameKey) ??\r\n business.properties.find(\r\n (property) =>\r\n normalizeNameKey(property.nameKey) === normalizeNameKey(customField.nameKey),\r\n );\r\n\r\n if (existingBusinessProperty) {\r\n return {\r\n ...existingBusinessProperty,\r\n nameKey: customField.nameKey,\r\n type: (existingBusinessProperty.type ?? customField.type)!,\r\n value: existingBusinessProperty.value,\r\n };\r\n }\r\n\r\n const existingLocalProperty = customProperties.find(\r\n (property) => property.nameKey === customField.nameKey,\r\n );\r\n\r\n return {\r\n nameKey: customField.nameKey,\r\n type: customField.type!,\r\n value: existingLocalProperty ? existingLocalProperty.value : '',\r\n };\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (business && customContactFields) {\r\n setCustomProperties(getFilteredCustomProperties());\r\n }\r\n }, [business, customContactFields]);\r\n\r\n useEffect(() => {\r\n if (!business) return;\r\n\r\n labelMultipleSelect.actions.setValue((business.tags as ILabel[]) ?? []);\r\n }, [business]);\r\n\r\n return {\r\n field: {\r\n name,\r\n imsWhatsapp,\r\n imsRCS,\r\n contactImage,\r\n contactPropietary,\r\n imsMercadolibre,\r\n imsFacebooks,\r\n imsWebchats,\r\n imsInstagrams,\r\n emails,\r\n phoneNumbers,\r\n homeAddress,\r\n secondaryHomeAddress,\r\n city,\r\n secondaryCity,\r\n state,\r\n secondaryState,\r\n postalCode,\r\n secondaryPostalCode,\r\n country,\r\n secondaryCountry,\r\n customProperties,\r\n labelMultipleSelect,\r\n },\r\n action: {\r\n setCustomProperties,\r\n addWhatsapp,\r\n addRCS,\r\n getEditedBusiness,\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n addPhone,\r\n addEmail,\r\n replaceAddress,\r\n addWhatsappVerified,\r\n resetToInitialContactInformation,\r\n resetCustomProperty,\r\n },\r\n state: {\r\n isDeletingAddress,\r\n },\r\n selectedContacts,\r\n setSelectedContacts,\r\n };\r\n};\r\n\r\nexport default useEditBusiness;\r\n","import { useEffect, useMemo, useState } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { IContact, IContactField, Property } from '@trii/types/dist/Contacts';\r\nimport UseEditContact from './types/UseEditContact';\r\nimport { ItemWithId, useMultipleSelect } from '../useMultipleSelect';\r\n// Hooks\r\nimport useField from '../useField';\r\nimport useImage from '../useImage';\r\nimport useSelect from '../useSelect';\r\nimport useEditContactMethods from '../useEditContactMethods';\r\n// Utils\r\nimport editContactHelper from '../utils/editContactHelper';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\nimport { deleteAddress } from '../../services/api';\r\n\r\ntype UseEditContactArgs = {\r\n contact: IContact | null;\r\n customContactFields: IContactField[];\r\n baseUrl?: string;\r\n spaceId?: string;\r\n};\r\n\r\nconst useEditContact = ({\r\n contact,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: UseEditContactArgs): UseEditContact => {\r\n const apiDeleteAddress = useMemo(\r\n () => async (payload: { contactId: string; contactAddressId: string; type: ChannelType }) => {\r\n if (!baseUrl || !spaceId) return;\r\n await deleteAddress({ baseUrl, spaceId, data: payload });\r\n },\r\n [baseUrl, spaceId],\r\n );\r\n\r\n const apiDispatch = async <T>(maybePromise: Promise<T> | T) => maybePromise;\r\n\r\n const { getEditedField } = editContactHelper;\r\n\r\n const [customProperties, setCustomProperties] = useState<Property[]>([]);\r\n // const [selectedBusiness, setSelectedBusiness] = useState<SimplifiedBusiness[]>([]);\r\n const contactFirstname = useField('text', contact?.firstName || '');\r\n const contactLastname = useField('text', contact?.lastName || '');\r\n const contactImage = useImage({\r\n baseUrl,\r\n spaceId,\r\n entityType: 'contact',\r\n entityId: contact?.id ? String(contact.id) : undefined,\r\n initialImageUrl: contact?.imageUrl,\r\n });\r\n const [birthDate, setBirthDate] = useState<Dayjs | null>(\r\n contact?.birthDate ? dayjs(contact.birthDate) : null,\r\n );\r\n const contactMethods = useEditContactMethods({\r\n entityId: contact?.id,\r\n initial: contact,\r\n dispatch: apiDispatch,\r\n deleteAddress: apiDeleteAddress,\r\n });\r\n\r\n const {\r\n field: {\r\n imsFacebooks,\r\n imsMercadolibre,\r\n imsWebchats,\r\n imsInstagrams,\r\n imsWhatsapp,\r\n emails,\r\n phoneNumbers,\r\n imsRCS,\r\n },\r\n action: {\r\n addPhone,\r\n addEmail,\r\n addWhatsapp,\r\n addRCS,\r\n addWhatsappVerified,\r\n replaceAddress,\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n resetToInitialContactInformation,\r\n },\r\n state: { isDeletingAddress },\r\n } = contactMethods;\r\n //\r\n const labelMultipleSelect = useMultipleSelect({\r\n initialState: contact?.tags as ItemWithId[],\r\n });\r\n const contactPropietary = useSelect(contact?.owner);\r\n // const contactListSelectState = useSelect(contact?.listId);\r\n const homeAddress = useField('text', contact?.address1?.street);\r\n const secondaryHomeAddress = useField('text', contact?.address2?.street);\r\n const city = useField('text', contact?.address1?.city);\r\n const secondaryCity = useField('text', contact?.address2?.city);\r\n const state = useField('text', contact?.address1?.state);\r\n const secondaryState = useField('text', contact?.address2?.state);\r\n const postalCode = useField('text', contact?.address1?.zipcode);\r\n const secondaryPostalCode = useField('text', contact?.address2?.zipcode);\r\n const country = useField('text', contact?.address1?.country);\r\n const secondaryCountry = useField('text', contact?.address2?.country);\r\n\r\n // Actions\r\n const getEditedContact = () => {\r\n if (!contact) return null;\r\n const currentContact = contact;\r\n\r\n const modifiedTags = labelMultipleSelect.attributes.value.map((tag) => ({\r\n id: tag.id,\r\n name: tag.name,\r\n }));\r\n const modifiedPhones = phoneNumbers.map((phoneNumber) => {\r\n const { id, ...rest } = phoneNumber;\r\n return rest;\r\n });\r\n const modifiedEmails = emails.map((email) => {\r\n const { id, ...rest } = email;\r\n return rest;\r\n });\r\n\r\n const editedContact = {\r\n id: currentContact.id,\r\n owner: contactPropietary.attributes.value,\r\n firstName: contactFirstname.attributes.value,\r\n lastName: contactLastname.attributes.value,\r\n // listId: contactListSelectState.attributes.value,\r\n address1: {\r\n ...getEditedField('street', currentContact.address1?.street, homeAddress.attributes.value),\r\n ...getEditedField('city', currentContact.address1?.street, city.attributes.value),\r\n ...getEditedField('state', currentContact.address1?.street, state.attributes.value),\r\n ...getEditedField('zipcode', currentContact.address1?.street, postalCode.attributes.value),\r\n ...getEditedField('country', currentContact.address1?.street, country.attributes.value),\r\n },\r\n address2: {\r\n ...getEditedField(\r\n 'street',\r\n currentContact.address2?.street,\r\n secondaryHomeAddress.attributes.value,\r\n ),\r\n ...getEditedField('city', currentContact.address2?.street, secondaryCity.attributes.value),\r\n ...getEditedField(\r\n 'state',\r\n currentContact.address2?.street,\r\n secondaryState.attributes.value,\r\n ),\r\n ...getEditedField(\r\n 'zipcode',\r\n currentContact.address2?.street,\r\n secondaryPostalCode.attributes.value,\r\n ),\r\n ...getEditedField(\r\n 'country',\r\n currentContact.address2?.street,\r\n secondaryCountry.attributes.value,\r\n ),\r\n },\r\n emails: modifiedEmails,\r\n phones: modifiedPhones,\r\n // ims_whatsapp: modifiedImsWhatsapp,\r\n tags: modifiedTags,\r\n imageUrl: contactImage.imageUrl ? contactImage.removeParams(contactImage.imageUrl) : null,\r\n properties: customProperties,\r\n // businessId: selectedBusiness[0]?.businessId || '',\r\n // businessName: selectedBusiness[0]?.businessName || '',\r\n birthDate: birthDate?.toDate(),\r\n };\r\n\r\n return editedContact;\r\n };\r\n // contact methods/actions are handled by useEditContactMethods\r\n function resetSelectedBusiness() {\r\n if (!contact) return;\r\n if (!contact.businessId || !contact.businessName) {\r\n // setSelectedBusiness([]);\r\n return;\r\n }\r\n // setSelectedBusiness([\r\n // { businessId: contact.businessId, businessName: contact.businessName },\r\n // ]);\r\n }\r\n\r\n function resetBirthDate() {\r\n setBirthDate(contact?.birthDate ? dayjs(contact.birthDate) : null);\r\n }\r\n function resetCustomProperty(nameKey: string) {\r\n if (!contact) return;\r\n\r\n const normalizeNameKey = (input: string) =>\r\n input.trim().toLowerCase().replace(/\\s+/g, '-').replace(/-+/g, '-');\r\n\r\n const defaultProperty =\r\n contact.properties.find((property) => property.nameKey === nameKey) ??\r\n contact.properties.find(\r\n (property) => normalizeNameKey(property.nameKey) === normalizeNameKey(nameKey),\r\n );\r\n\r\n if (!defaultProperty) {\r\n console.error(`No se encontró una propiedad con nameKey: ${nameKey}`);\r\n return; // Salir de la función si no se encuentra la propiedad\r\n }\r\n\r\n const updatedProperties = customProperties.map((property) =>\r\n property.nameKey === nameKey ? { ...property, value: defaultProperty.value } : property,\r\n );\r\n setCustomProperties(updatedProperties);\r\n }\r\n\r\n const getFilteredCustomProperties = (): Property[] => {\r\n if (!contact) return [];\r\n\r\n return customContactFields.map((customField) => {\r\n const normalizeNameKey = (input: string) =>\r\n input.trim().toLowerCase().replace(/\\s+/g, '-').replace(/-+/g, '-');\r\n\r\n const existingProperty =\r\n contact.properties.find((property) => property.nameKey === customField.nameKey) ??\r\n contact.properties.find(\r\n (property) =>\r\n normalizeNameKey(property.nameKey) === normalizeNameKey(customField.nameKey),\r\n );\r\n\r\n if (existingProperty) {\r\n return {\r\n ...existingProperty,\r\n nameKey: customField.nameKey,\r\n type: (existingProperty.type ?? customField.type)!,\r\n value: existingProperty.value,\r\n };\r\n }\r\n\r\n const existingLocalProperty = customProperties.find(\r\n (property) => property.nameKey === customField.nameKey,\r\n );\r\n\r\n return {\r\n nameKey: customField.nameKey,\r\n type: customField.type!,\r\n value: existingLocalProperty ? existingLocalProperty.value : '',\r\n };\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (contact && customContactFields) {\r\n setCustomProperties(getFilteredCustomProperties());\r\n }\r\n }, [contact, customContactFields]);\r\n\r\n useEffect(() => {\r\n if (contact?.tags) {\r\n labelMultipleSelect.actions.setValue(contact.tags);\r\n }\r\n if (contact?.businessId && contact.businessName) {\r\n // setSelectedBusiness([\r\n // { businessId: contact.businessId, businessName: contact.businessName },\r\n // ]);\r\n } else {\r\n // setSelectedBusiness([]);\r\n }\r\n }, [contact]);\r\n\r\n return {\r\n field: {\r\n birthDate,\r\n imsWhatsapp,\r\n imsRCS,\r\n contactFirstname,\r\n contactLastname,\r\n contactImage,\r\n contactPropietary,\r\n imsMercadolibre,\r\n imsFacebooks,\r\n imsWebchats,\r\n imsInstagrams,\r\n emails,\r\n phoneNumbers,\r\n homeAddress,\r\n secondaryHomeAddress,\r\n city,\r\n secondaryCity,\r\n state,\r\n secondaryState,\r\n postalCode,\r\n secondaryPostalCode,\r\n country,\r\n secondaryCountry,\r\n customProperties,\r\n labelMultipleSelect,\r\n // selectedBusiness,\r\n },\r\n action: {\r\n setBirthDate,\r\n setCustomProperties,\r\n getEditedContact,\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n addPhone,\r\n addEmail,\r\n addWhatsapp,\r\n addRCS,\r\n replaceAddress,\r\n // setSelectedBusiness,\r\n addWhatsappVerified,\r\n resetToInitialContactInformation,\r\n resetSelectedBusiness,\r\n resetBirthDate,\r\n resetCustomProperty,\r\n },\r\n state: {\r\n isDeletingAddress,\r\n },\r\n };\r\n};\r\n\r\nexport default useEditContact;\r\n","import { createContext, useContext } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport type { IBusiness, IContact, IContactField } from '@trii/types/dist/Contacts/contacts';\r\nimport useEditBusiness from '../hooks/useEditBusiness/useEditBusiness';\r\nimport type UseEditBusiness from '../hooks/useEditBusiness/types/UseEditBusiness';\r\nimport useEditContact from '../hooks/useEditContact/useEditContact';\r\nimport type UseEditContact from '../hooks/useEditContact/types/UseEditContact';\r\n\r\ntype EditEntityContextValue =\r\n | {\r\n entityType: 'contact';\r\n editEntity: UseEditContact;\r\n entityId: string;\r\n }\r\n | {\r\n entityType: 'business';\r\n editEntity: UseEditBusiness;\r\n entityId: string;\r\n };\r\n\r\nconst EditEntityContext = createContext<EditEntityContextValue | null>(null);\r\n\r\ntype BaseEditEntityProviderProps = {\r\n children: ReactNode;\r\n customContactFields: IContactField[];\r\n baseUrl?: string;\r\n spaceId?: string;\r\n};\r\n\r\ntype EditContactEntityProviderProps = BaseEditEntityProviderProps & {\r\n contact: IContact;\r\n};\r\n\r\nexport const EditContactEntityProvider = ({\r\n children,\r\n contact,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: EditContactEntityProviderProps) => {\r\n const editEntity = useEditContact({\r\n contact,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n });\r\n\r\n return (\r\n <EditEntityContext.Provider value={{ entityType: 'contact', editEntity, entityId: String(contact.id) }}>\r\n {children}\r\n </EditEntityContext.Provider>\r\n );\r\n};\r\n\r\ntype EditBusinessEntityProviderProps = BaseEditEntityProviderProps & {\r\n business: IBusiness;\r\n};\r\n\r\nexport const EditBusinessEntityProvider = ({\r\n children,\r\n business,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: EditBusinessEntityProviderProps) => {\r\n const editEntity = useEditBusiness({\r\n business,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n });\r\n\r\n return (\r\n <EditEntityContext.Provider value={{ entityType: 'business', editEntity, entityId: String(business.id) }}>\r\n {children}\r\n </EditEntityContext.Provider>\r\n );\r\n};\r\n\r\ntype EditEntityProviderProps = BaseEditEntityProviderProps & {\r\n entityType: 'contact' | 'business';\r\n entityData: IContact | IBusiness;\r\n};\r\n\r\nexport const EditEntityProvider = ({\r\n children,\r\n entityType,\r\n entityData,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: EditEntityProviderProps) => {\r\n if (entityType === 'contact') {\r\n return (\r\n <EditContactEntityProvider\r\n contact={entityData as IContact}\r\n customContactFields={customContactFields}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n >\r\n {children}\r\n </EditContactEntityProvider>\r\n );\r\n }\r\n\r\n return (\r\n <EditBusinessEntityProvider\r\n business={entityData as IBusiness}\r\n customContactFields={customContactFields}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n >\r\n {children}\r\n </EditBusinessEntityProvider>\r\n );\r\n};\r\n\r\nexport const useEditEntity = () => {\r\n const ctx = useContext(EditEntityContext);\r\n if (!ctx) {\r\n throw new Error('useEditEntity must be used within EditEntityProvider');\r\n }\r\n return ctx;\r\n};\r\n","import { UserInfo, UserTrii } from \"@trii/types/dist/Users\";\r\n\r\nexport const resolveUserLabel = ({\r\n userId,\r\n users,\r\n currentUser,\r\n}: {\r\n userId?: string;\r\n users: UserInfo[];\r\n currentUser?: UserTrii | null;\r\n}) => {\r\n if (!userId) return null;\r\n if (currentUser?.uid && currentUser.uid === userId) {\r\n return currentUser.display_name || currentUser.email || null;\r\n }\r\n const fromUsers = users.find((u) => u?.id === userId);\r\n return fromUsers?.name?.trim() || fromUsers?.email || null;\r\n};\r\n","import { Box, Button, Divider, Stack, Typography } from '@mui/material';\r\nimport { ReactNode } from 'react';\r\nimport AddLocationAltIcon from '@mui/icons-material/AddLocationAlt';\r\nimport { useTranslationContext } from '../context/TranslationContext';\r\n\r\ntype SectionProps = {\r\n title: string;\r\n children: ReactNode;\r\n enableDirectionSearch?: boolean;\r\n onDirectionSearchClick?: () => void;\r\n};\r\n\r\nconst Section = ({\r\n title,\r\n children,\r\n enableDirectionSearch = false,\r\n onDirectionSearchClick,\r\n}: SectionProps) => {\r\n const t = useTranslationContext();\r\n return (\r\n <Box\r\n sx={{\r\n border: '1px solid',\r\n borderColor: 'divider',\r\n borderRadius: 2,\r\n p: 2,\r\n mb: 2,\r\n }}\r\n >\r\n <Stack direction=\"row\" alignItems=\"center\" justifyContent=\"space-between\">\r\n <Typography variant=\"subtitle1\">{title}</Typography>\r\n {enableDirectionSearch && (\r\n <Button\r\n startIcon={<AddLocationAltIcon sx={{ color: 'primary.main', height: 18, width: 18 }} />}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n color=\"primary\"\r\n onClick={() => onDirectionSearchClick && onDirectionSearchClick()}\r\n >\r\n {t('global.searchLocation')}\r\n </Button>\r\n )}\r\n </Stack>\r\n <Divider sx={{ my: 1.5 }} />\r\n {children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Section;\r\n","import { Box, BoxProps } from '@mui/material';\r\nimport { ReactNode } from 'react';\r\n\r\ntype SectionContentProps = {\r\n children: ReactNode;\r\n} & BoxProps;\r\n\r\nconst SectionContent = ({ children, ...boxProps }: SectionContentProps) => {\r\n return (\r\n <Box\r\n display=\"grid\"\r\n gridTemplateColumns={{ xs: '1fr', md: 'repeat(2, minmax(0, 1fr))' }}\r\n gap={2}\r\n {...boxProps}\r\n >\r\n {children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SectionContent;\r\n","import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { DatePicker } from '@mui/x-date-pickers';\r\nimport Box from '@mui/material/Box';\r\nimport { Dayjs } from 'dayjs';\r\n\r\ninterface DateSelectProps {\r\n birthDate: Dayjs | null;\r\n setBirthDate: (date: Dayjs | null) => void;\r\n dateFormat: string;\r\n}\r\n\r\nconst DateSelect = ({ birthDate, setBirthDate, dateFormat }: DateSelectProps) => {\r\n \r\n const userDateFormat = (dateFormat || 'YYYY/MM/DD').toUpperCase();\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box\r\n sx={{\r\n overflow: 'visible',\r\n paddingTop: '0px',\r\n }}\r\n >\r\n <DatePicker\r\n value={birthDate}\r\n onChange={(newValue) => setBirthDate(newValue)}\r\n slotProps={{ textField: { size: 'small' } }}\r\n format={userDateFormat}\r\n\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default DateSelect;\r\n","import { createContext, useContext } from 'react';\n\nexport type EditContactView = 'main' | 'tags' | 'searchLocation' | 'businessSelect';\n\nexport type EditContactViewContextValue = {\n view: EditContactView;\n setView: (view: EditContactView) => void;\n};\n\nconst noop: EditContactViewContextValue = { view: 'main', setView: () => {} };\n\nconst EditContactViewContext = createContext<EditContactViewContextValue | null>(null);\n\nexport const EditContactViewProvider = EditContactViewContext.Provider;\n\nexport const useEditContactView = () => {\n const ctx = useContext(EditContactViewContext);\n if (!ctx) {\n console.warn('[useEditContactView] using noop, context value is missing');\n return noop;\n }\n return ctx;\n};\n","import { createContext, useContext, ReactNode } from 'react';\r\n\r\nexport type NavigateFn = (path: string) => void;\r\n\r\nconst noop: NavigateFn = () => {};\r\nconst NavigateContext = createContext<NavigateFn>(noop);\r\n\r\ninterface NavigateProviderProps {\r\n navigate: NavigateFn;\r\n children: ReactNode;\r\n}\r\n\r\nexport const NavigateProvider = ({ navigate, children }: NavigateProviderProps) => {\r\n return <NavigateContext.Provider value={navigate}>{children}</NavigateContext.Provider>;\r\n};\r\n\r\nexport const useNavigateContext = (): NavigateFn => {\r\n const navigate = useContext(NavigateContext);\r\n if (!navigate) {\r\n console.warn('[useNavigateContext] using noop, context value is falsy');\r\n return noop;\r\n }\r\n return navigate;\r\n};\r\n","import { Box, CircularProgress, Typography } from '@mui/material';\r\nimport ContactInfoPopup from '../../../../../ContactInfoPopup';\r\nimport useImage from '../../../../hooks/useImage';\r\nimport { useState } from 'react';\r\nimport { IBusiness } from '@trii/types/dist/Contacts';\r\nimport { useEditContactApi } from '../../../../context/EditContactApiContext';\r\nimport { isBusiness } from '../../../../types/is-business.typeguard';\r\nimport { useNavigateContext } from '../../../../context/NavigateContext';\r\n\r\ntype Props = {\r\n value: string;\r\n displayValue: string;\r\n businessId: string;\r\n};\r\n\r\nfunction SelectBusinessLabel({ value, displayValue, businessId }: Props) {\r\n const api = useEditContactApi();\r\n const navigate = useNavigateContext();\r\n\r\n const [businessData, setBusinessData] = useState<IBusiness | null>(null);\r\n const userImage = useImage({\r\n initialImageUrl: businessData?.imageUrl,\r\n entityType: 'business',\r\n entityId: businessId,\r\n });\r\n\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n const [isLoadingData, setIsLoadingData] = useState(false);\r\n\r\n const handleOpenInfoPopover = async (event: React.MouseEvent<HTMLElement>) => {\r\n // Store the target element before any async operations\r\n const targetElement = event.currentTarget;\r\n\r\n setIsLoadingData(true);\r\n\r\n if (!api) {\r\n console.error('API is null');\r\n return;\r\n }\r\n\r\n const response = await api.fetchContact({ contactId: businessId });\r\n\r\n if (response && isBusiness(response)) {\r\n setBusinessData(response);\r\n }\r\n\r\n setIsLoadingData(false);\r\n\r\n if (!targetElement) {\r\n console.error('Target element is null');\r\n return;\r\n }\r\n\r\n setAnchorEl(targetElement);\r\n };\r\n\r\n return (\r\n <Box display=\"flex\" alignItems=\"center\">\r\n <Typography\r\n onClick={handleOpenInfoPopover}\r\n variant=\"body2\"\r\n fontWeight={'600'}\r\n sx={{\r\n padding: 1,\r\n cursor: 'pointer',\r\n }}\r\n color={(theme) => theme.palette.text.primary}\r\n >\r\n {displayValue || (typeof value === 'string' && value) || '-'}\r\n </Typography>\r\n {businessData && (\r\n <ContactInfoPopup\r\n contactData={businessData}\r\n open={Boolean(anchorEl)}\r\n anchorEl={anchorEl}\r\n onClose={() => setAnchorEl(null)}\r\n navigate={navigate}\r\n avatarImgUrl={userImage.imageUrl}\r\n />\r\n )}\r\n {isLoadingData && (\r\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"center\" p={1}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nexport default SelectBusinessLabel;\r\n","import { useEffect, useRef, useState } from 'react';\r\n// Components/ui\r\nimport { DateSelect } from '../ContactInfoLabel/components';\r\nimport {\r\n Box,\r\n CircularProgress,\r\n IconButton,\r\n MenuItem,\r\n Select,\r\n SelectChangeEvent,\r\n TextField,\r\n Tooltip,\r\n Typography,\r\n styled,\r\n} from '@mui/material';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport CancelIcon from '@mui/icons-material/Cancel';\r\nimport SaveIcon from '@mui/icons-material/Save';\r\nimport { updateEntity } from '../../services/api';\r\n// Types\r\nimport type { UserInfo } from '@trii/types/dist/Users';\r\nimport type { IList } from '@trii/types/dist/Contacts';\r\nimport type UseEditContact from '../../hooks/useEditContact/types/UseEditContact';\r\n// Hooks\r\nimport dayjs from 'dayjs';\r\nimport { useTranslationContext } from '../../context/TranslationContext';\r\nimport { useEditContactView } from '../../context/EditContactViewContext';\r\nimport { SelectBusinessLabel } from './components';\r\n\r\ntype SharedProps = {\r\n title: string;\r\n value?: string | Date;\r\n isNotEditable?: boolean;\r\n displayValue?: string;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n minWidth?: string | number;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\ntype ContactBaseProps = SharedProps & {\r\n entityType: 'contact';\r\n entityId?: string;\r\n options?: Array<UserInfo | IList>;\r\n constructUpdateObject?: (value: string | Date | null) => object;\r\n businessId?: string;\r\n};\r\n\r\ntype ContactBirthdayProps = ContactBaseProps & {\r\n inputType: 'birthday';\r\n contact: UseEditContact;\r\n dateFormat: string;\r\n};\r\n\r\ntype ContactNonBirthdayProps = ContactBaseProps & {\r\n inputType?: 'text' | 'select' | 'selectBusiness';\r\n contact?: UseEditContact;\r\n dateFormat?: string;\r\n};\r\n\r\ntype BusinessProps = SharedProps & {\r\n entityType: 'business';\r\n entityId?: string;\r\n inputType?: 'text' | 'select' | 'selectMembers';\r\n options?: UserInfo[];\r\n constructUpdateObject?: (value: string | Date) => object;\r\n};\r\n\r\ntype Props = ContactBirthdayProps | ContactNonBirthdayProps | BusinessProps;\r\n\r\nconst isUserInfo = (option: UserInfo | IList): option is UserInfo => 'email' in option;\r\n\r\nconst isContactBirthdayProps = (p: Props): p is ContactBirthdayProps =>\r\n p.entityType === 'contact' && p.inputType === 'birthday';\r\n\r\nconst StyledIconButton = styled(IconButton)({\r\n opacity: 0,\r\n transition: 'opacity 0.3s ease-in-out',\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n marginLeft: '15px',\r\n});\r\n\r\nconst StyledSaveCancelButton = styled(IconButton)({\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n});\r\n\r\nconst EntityInfoLabel = (props: Props) => {\r\n const { title, value, isNotEditable, displayValue, baseUrl, spaceId, minWidth, onEntityUpdated } =\r\n props;\r\n const t = useTranslationContext();\r\n const { setView } = useEditContactView();\r\n\r\n const inputType = props.inputType ?? 'text';\r\n\r\n const [isEditing, setIsEditing] = useState<boolean>(false);\r\n const [isSaving, setIsSaving] = useState<boolean>(false);\r\n const titleRef = useRef<HTMLElement | null>(null);\r\n const [isTitleTruncated, setIsTitleTruncated] = useState(false);\r\n const [inputValue, setInputValue] = useState<string | Date | undefined>(() => {\r\n if (props.entityType === 'business') return value;\r\n return typeof value === 'string' ? value : undefined;\r\n });\r\n\r\n useEffect(() => {\r\n const el = titleRef.current;\r\n if (!el) return;\r\n\r\n const check = () => {\r\n const next = el.scrollWidth > el.clientWidth;\r\n setIsTitleTruncated((prev) => (prev === next ? prev : next));\r\n };\r\n\r\n check();\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n let rafId = 0;\r\n const ro = new ResizeObserver(() => {\r\n if (typeof window === 'undefined') {\r\n check();\r\n return;\r\n }\r\n if (rafId) window.cancelAnimationFrame(rafId);\r\n rafId = window.requestAnimationFrame(() => {\r\n check();\r\n });\r\n });\r\n ro.observe(el);\r\n return () => {\r\n if (typeof window !== 'undefined' && rafId) window.cancelAnimationFrame(rafId);\r\n ro.disconnect();\r\n };\r\n }\r\n\r\n if (typeof window === 'undefined') return;\r\n window.addEventListener('resize', check);\r\n return () => {\r\n window.removeEventListener('resize', check);\r\n };\r\n }, [title]);\r\n\r\n useEffect(() => {\r\n if (props.entityType === 'business') {\r\n setInputValue(value);\r\n } else {\r\n setInputValue(typeof value === 'string' ? value : undefined);\r\n }\r\n }, [value, props.entityType]);\r\n\r\n const handleEditClick = () => {\r\n if (props.entityType === 'contact' && inputType === 'selectBusiness') {\r\n setView('businessSelect');\r\n return;\r\n }\r\n setIsEditing((prev) => !prev);\r\n };\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setInputValue(e.target.value);\r\n };\r\n\r\n const handleSelectChange = (e: SelectChangeEvent<string>) => {\r\n const newValue = e.target.value;\r\n setInputValue(newValue);\r\n };\r\n\r\n const handleCancel = () => {\r\n if (isContactBirthdayProps(props)) {\r\n props.contact.action.resetBirthDate();\r\n }\r\n setIsEditing(false);\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!props.constructUpdateObject) {\r\n setIsEditing(false);\r\n return;\r\n }\r\n\r\n if (props.entityType === 'business') {\r\n if (inputValue === undefined) {\r\n setIsEditing(false);\r\n return;\r\n }\r\n }\r\n\r\n setIsSaving(true);\r\n\r\n try {\r\n if (!baseUrl || !spaceId) {\r\n throw new Error('Missing baseUrl or spaceId for updateEntity');\r\n }\r\n\r\n if (props.entityType === 'contact') {\r\n let updatedValue: string | Date | null =\r\n inputValue === undefined ? null : (inputValue as any);\r\n\r\n if (isContactBirthdayProps(props)) {\r\n const parsedDate = dayjs(props.contact.field.birthDate);\r\n if (parsedDate.isValid()) {\r\n updatedValue = parsedDate.toISOString();\r\n }\r\n }\r\n\r\n const updatedContactData = props.constructUpdateObject(updatedValue);\r\n const entityId = props.entityId ?? (updatedContactData as any)?.id;\r\n if (!entityId) {\r\n throw new Error('Missing contactId for updateEntity');\r\n }\r\n\r\n const updated = await updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType: 'contact',\r\n entityId,\r\n body: updatedContactData,\r\n });\r\n onEntityUpdated?.(updated);\r\n } else {\r\n const updatedBusinessData = props.constructUpdateObject(inputValue as string | Date);\r\n const entityId = props.entityId ?? (updatedBusinessData as any)?.id;\r\n if (!entityId) {\r\n throw new Error('Missing businessId for updateEntity');\r\n }\r\n\r\n const updated = await updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType: 'business',\r\n entityId,\r\n body: updatedBusinessData,\r\n });\r\n onEntityUpdated?.(updated);\r\n }\r\n } finally {\r\n setIsSaving(false);\r\n setIsEditing(false);\r\n }\r\n };\r\n\r\n const selectValue = typeof inputValue === 'string' ? inputValue : '';\r\n const textValue =\r\n inputValue instanceof Date\r\n ? inputValue.toISOString()\r\n : typeof inputValue === 'string'\r\n ? inputValue\r\n : '';\r\n\r\n const resolvedMinWidth = minWidth ?? (props.entityType === 'contact' ? '45%' : '200px');\r\n const options = props.options ?? [];\r\n\r\n return (\r\n <Box\r\n className=\"fadein contacts-col-5\"\r\n sx={{\r\n display: 'flex',\r\n backgroundColor: (theme) =>\r\n theme.palette.mode === 'dark' ? '1e1e1e' : theme.palette.background.default,\r\n flexDirection: 'column',\r\n borderRadius: 1,\r\n minWidth: resolvedMinWidth,\r\n '&:hover .edit-icon': {\r\n opacity: 1,\r\n },\r\n }}\r\n >\r\n <Box display=\"flex\" position=\"relative\" minHeight={'25px'}>\r\n {isTitleTruncated ? (\r\n <Tooltip title={title} arrow>\r\n <Typography\r\n ref={titleRef}\r\n component=\"span\"\r\n variant=\"body2\"\r\n letterSpacing={-0.5}\r\n fontWeight={'600'}\r\n alignSelf={'center'}\r\n flexGrow={isEditing ? 1 : 0}\r\n color={(theme) => theme.palette.text.primary}\r\n noWrap\r\n sx={{\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {title}\r\n </Typography>\r\n </Tooltip>\r\n ) : (\r\n <Typography\r\n ref={titleRef}\r\n component=\"span\"\r\n variant=\"body2\"\r\n letterSpacing={-0.5}\r\n fontWeight={'600'}\r\n alignSelf={'center'}\r\n flexGrow={isEditing ? 1 : 0}\r\n color={(theme) => theme.palette.text.primary}\r\n noWrap\r\n sx={{ minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\r\n >\r\n {title}\r\n </Typography>\r\n )}\r\n\r\n {isNotEditable ? null : isEditing ? (\r\n <>\r\n <StyledSaveCancelButton size=\"small\" onClick={handleSave}>\r\n {isSaving ? <CircularProgress size={24} /> : <SaveIcon />}\r\n </StyledSaveCancelButton>\r\n <StyledSaveCancelButton size=\"small\" onClick={handleCancel}>\r\n <CancelIcon />\r\n </StyledSaveCancelButton>\r\n </>\r\n ) : (\r\n <StyledIconButton className=\"edit-icon\" size=\"small\" onClick={handleEditClick}>\r\n <EditIcon />\r\n </StyledIconButton>\r\n )}\r\n </Box>\r\n\r\n <Box width={isEditing ? '100%' : '50%'} position=\"relative\">\r\n {isEditing && inputType === 'text' ? (\r\n <TextField\r\n value={textValue}\r\n onChange={handleInputChange}\r\n variant=\"standard\"\r\n size=\"small\"\r\n sx={{ width: '100%' }}\r\n />\r\n ) : isEditing && (inputType === 'select' || inputType === 'selectMembers') ? (\r\n <Select\r\n value={selectValue}\r\n onChange={handleSelectChange}\r\n variant=\"standard\"\r\n size=\"small\"\r\n sx={{ width: '100%' }}\r\n >\r\n {props.entityType === 'contact' ? (\r\n <MenuItem value=\"\">\r\n {t('conversations.contactDetails.contactInfo.emptySelection')}\r\n </MenuItem>\r\n ) : null}\r\n\r\n {options.map((option: any, index: number) => (\r\n <MenuItem key={index} value={option.id}>\r\n {props.entityType === 'contact'\r\n ? option.name?.trim() || (isUserInfo(option) ? option.email : '') || 'Sin nombre'\r\n : option.name?.trim() || option.email || 'Sin nombre'}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n ) : isEditing && isContactBirthdayProps(props) ? (\r\n <DateSelect\r\n birthDate={props.contact.field.birthDate}\r\n setBirthDate={props.contact.action.setBirthDate}\r\n dateFormat={props.dateFormat}\r\n />\r\n ) : !isEditing &&\r\n props.entityType === 'contact' &&\r\n inputType === 'selectBusiness' &&\r\n props.businessId ? (\r\n <SelectBusinessLabel\r\n value={String(value ?? '')}\r\n displayValue={String(displayValue ?? '')}\r\n businessId={props.businessId}\r\n />\r\n ) : (\r\n <Typography\r\n variant=\"body2\"\r\n fontWeight={'400'}\r\n sx={{ padding: '2.5px 14px 8.5px 0px' }}\r\n color={(theme) => theme.palette.text.primary}\r\n >\r\n {displayValue || (typeof value === 'string' && value) || '-'}\r\n </Typography>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default EntityInfoLabel;\r\n","import EntityInfoLabel from '../EntityInfoLabel';\r\n// Types\r\nimport type { UserInfo } from '@trii/types/dist/Users';\r\nimport type { IList } from '@trii/types/dist/Contacts';\r\nimport type UseEditContact from '../../hooks/useEditContact/types/UseEditContact';\r\n\r\ntype BaseProps = {\r\n title: string;\r\n value?: string | Date;\r\n isNotEditable?: boolean;\r\n options?: UserInfo[] | IList[];\r\n displayValue?: string;\r\n constructUpdateObject?: (value: string | Date | null) => object;\r\n businessId?: string;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n contactId?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\ntype BirthdayProps = BaseProps & {\r\n inputType: 'birthday';\r\n contact: UseEditContact;\r\n dateFormat: string;\r\n};\r\n\r\ntype NonBirthdayProps = BaseProps & {\r\n inputType?: 'text' | 'select' | 'selectBusiness';\r\n contact?: UseEditContact;\r\n dateFormat?: string;\r\n};\r\n\r\ntype Props = BirthdayProps | NonBirthdayProps;\r\n\r\nconst ContactInfoLabel = (props: Props) => {\r\n const {\r\n title,\r\n value,\r\n isNotEditable,\r\n options = [],\r\n displayValue,\r\n constructUpdateObject,\r\n businessId,\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n onEntityUpdated,\r\n } = props;\r\n\r\n if (props.inputType === 'birthday') {\r\n return (\r\n <EntityInfoLabel\r\n entityType=\"contact\"\r\n entityId={contactId}\r\n title={title}\r\n value={value}\r\n isNotEditable={isNotEditable}\r\n inputType=\"birthday\"\r\n options={options as Array<UserInfo | IList>}\r\n displayValue={displayValue}\r\n constructUpdateObject={constructUpdateObject}\r\n contact={props.contact}\r\n businessId={businessId}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n dateFormat={props.dateFormat}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n );\r\n }\r\n\r\n const inputType = props.inputType ?? 'text';\r\n\r\n return (\r\n <EntityInfoLabel\r\n entityType=\"contact\"\r\n entityId={contactId}\r\n title={title}\r\n value={value}\r\n isNotEditable={isNotEditable}\r\n inputType={inputType}\r\n options={options as Array<UserInfo | IList>}\r\n displayValue={displayValue}\r\n constructUpdateObject={constructUpdateObject}\r\n businessId={businessId}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n );\r\n};\r\n\r\nexport default ContactInfoLabel;\r\n","// Types\r\nimport { ContactField_type, Property } from '@trii/types/dist/Contacts';\r\n// Components\r\nimport { TextField } from '@mui/material';\r\n\r\ntype CustomPropertyInputProps = Property & {\r\n onChange: (name: string, value: any) => void;\r\n};\r\n\r\nconst CustomPropertyInput = ({\r\n nameKey,\r\n value,\r\n onChange,\r\n type,\r\n}: CustomPropertyInputProps) => {\r\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (\r\n type === ContactField_type.NUMBER_ACCOUNTING ||\r\n type === ContactField_type.NUMBER_DECIMAL ||\r\n type === ContactField_type.NUMBER_CURRENCY ||\r\n type === ContactField_type.CURRENCY\r\n ) {\r\n handleNumberTypeChange(event);\r\n } else if (type === ContactField_type.NUMBER_INTEGER) {\r\n handleIntegerNumberTypeChange(event);\r\n } else if (\r\n type === ContactField_type.LONGTEXT ||\r\n type === ContactField_type.TEXT ||\r\n type === ContactField_type.ADDRESS\r\n ) {\r\n handleTextTypeChange(event);\r\n }\r\n };\r\n\r\n const handleTextTypeChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n onChange(nameKey, event.target.value);\r\n };\r\n\r\n const handleNumberTypeChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const inputValue = event.target.value;\r\n const sanitizedInput = inputValue.replace(/[^0-9.]/g, '');\r\n onChange(nameKey, sanitizedInput);\r\n };\r\n\r\n const handleIntegerNumberTypeChange = (\r\n event: React.ChangeEvent<HTMLInputElement>\r\n ) => {\r\n const newValue = event.target.value;\r\n if (/^\\d*$/.test(newValue)) {\r\n onChange(nameKey, newValue);\r\n }\r\n };\r\n\r\n return (\r\n <TextField\r\n size=\"small\"\r\n variant=\"standard\"\r\n value={value}\r\n onChange={handleChange}\r\n inputProps={{\r\n pattern: '[0-9]*',\r\n }}\r\n multiline={type === ContactField_type.LONGTEXT}\r\n rows={type === ContactField_type.LONGTEXT ? 4 : 1}\r\n sx={{ width: '100%' }}\r\n />\r\n );\r\n};\r\n\r\nexport default CustomPropertyInput;\r\n","import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport { DatePicker } from '@mui/x-date-pickers';\r\nimport Box from '@mui/material/Box';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\n\r\ntype Props = {\r\n value: Dayjs | null;\r\n handleChange: (value: Dayjs | null) => void;\r\n dateFormat: string;\r\n};\r\n\r\nconst CustomPropertyDatePicker = ({ value, handleChange, dateFormat }: Props) => {\r\n const userDateFormat = (dateFormat || 'YYYY/MM/DD').toUpperCase();\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box\r\n sx={{\r\n overflow: 'visible',\r\n paddingTop: '0px',\r\n }}\r\n >\r\n <DatePicker\r\n value={value ? dayjs(value) : null}\r\n onChange={(newValue) => handleChange(newValue)}\r\n format={userDateFormat}\r\n slotProps={{\r\n textField: {\r\n size: 'small',\r\n sx: {\r\n width: '100%',\r\n },\r\n variant: 'standard',\r\n },\r\n openPickerButton: {\r\n disableRipple: true,\r\n },\r\n }}\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default CustomPropertyDatePicker;\r\n","// Components\r\nimport { FormControl, Select, MenuItem } from '@mui/material';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n value: string;\r\n handleChange: (value: string) => void;\r\n options: string[];\r\n};\r\n\r\nconst CustomPropertyOptionsSelect = ({ handleChange, value, options }: Props) => {\r\n const t = useTranslationContext();\r\n\r\n return (\r\n <FormControl className=\"fadein\" sx={{ width: '100%' }}>\r\n <Select\r\n value={value}\r\n onChange={(e) => handleChange(e.target.value)}\r\n size=\"small\"\r\n variant=\"standard\"\r\n >\r\n <MenuItem value=\"\">{t('global.noValue')}</MenuItem>\r\n {options.map((option, i) => (\r\n <MenuItem key={i} value={option}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n );\r\n};\r\n\r\nexport default CustomPropertyOptionsSelect;\r\n","import dayjs, { Dayjs } from 'dayjs';\r\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\r\nimport Box from '@mui/material/Box';\r\n\r\ntype Props = {\r\n value: Dayjs | null;\r\n handleChange: (value: Dayjs | null) => void;\r\n userTimeFormat?: string; // Optional prop for custom time format\r\n};\r\n\r\nconst CustomPropertyTimePicker = ({ value, handleChange, userTimeFormat }: Props) => {\r\n const is24HourFormat = userTimeFormat === '24' ? 'HH:mm' : 'hh:mm';\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ overflow: 'visible', paddingTop: '0px' }}>\r\n <TimePicker\r\n value={value ? dayjs(value) : null}\r\n onChange={(newValue) => handleChange(newValue)}\r\n format={is24HourFormat} \r\n slotProps={{\r\n textField: {\r\n size: 'small',\r\n sx: {\r\n width: '100%',\r\n },\r\n variant: 'standard',\r\n },\r\n openPickerButton: {\r\n disableRipple: true,\r\n },\r\n }}\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default CustomPropertyTimePicker;\r\n","import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport { MultiInputTimeRangeField } from '@mui/x-date-pickers-pro';\r\nimport { DateRange } from '@mui/x-date-pickers-pro';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\nimport Box from '@mui/material/Box';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n value: DateRange<Dayjs> | null;\r\n handleChange: (newValue: DateRange<Dayjs>) => void;\r\n userTimeFormat?: string;\r\n};\r\n\r\nconst CustomPropertyTimeRangePicker = ({ value, handleChange, userTimeFormat }: Props) => {\r\n const t = useTranslationContext();\r\n const initDates: DateRange<Dayjs> = [\r\n dayjs().set('hour', 0).set('minute', 0),\r\n dayjs().set('hour', 0).set('minute', 0),\r\n ];\r\n\r\n const timeFormat = userTimeFormat === '24' ? 'HH:mm' : 'hh:mm';\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ overflow: 'visible', paddingTop: '0px' }}>\r\n <MultiInputTimeRangeField\r\n slotProps={{\r\n textField: ({ position }) => ({\r\n label: position === 'start' ? t('contactEdit.from') : t('contactEdit.to'),\r\n size: 'small',\r\n variant: 'standard',\r\n inputProps: {\r\n placeholder: timeFormat,\r\n },\r\n }),\r\n }}\r\n value={value ? value : initDates}\r\n onChange={(newValue) => handleChange(newValue)}\r\n format={timeFormat}\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default CustomPropertyTimeRangePicker;\r\n","import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\nimport { DateRange, MultiInputDateRangeField } from '@mui/x-date-pickers-pro';\r\nimport Box from '@mui/material/Box';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n value: DateRange<Dayjs> | null;\r\n handleChange: (newValue: DateRange<Dayjs>) => void;\r\n userDateFormat?: string; // Formato personalizado\r\n};\r\n\r\nconst CustomPropertyDateRangePicker = ({ value, handleChange, userDateFormat }: Props) => {\r\n const t = useTranslationContext();\r\n // Default date range if value is null\r\n const initDates: DateRange<Dayjs> = [dayjs(), dayjs()];\r\n\r\n // Determina el formato dinámico\r\n const dateFormat = (userDateFormat || 'YYYY/MM/DD').toUpperCase();\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ overflow: 'visible', paddingTop: '0px' }}>\r\n <MultiInputDateRangeField\r\n slotProps={{\r\n textField: ({ position }) => ({\r\n label: position === 'start' ? t('contactEdit.from') : t('contactEdit.to'),\r\n size: 'small',\r\n sx: {\r\n width: '100%',\r\n },\r\n variant: 'standard',\r\n inputProps: {\r\n placeholder: dateFormat, // Agrega un placeholder para mostrar el formato esperado\r\n },\r\n }),\r\n }}\r\n value={value || initDates} // Usa initDates como valor predeterminado si value es null\r\n onChange={(newValue) => handleChange(newValue)}\r\n format={dateFormat} // Aplica el formato dinámico\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default CustomPropertyDateRangePicker;\r\n","import { useEffect, useRef, useState } from 'react';\r\n// Components/ui\r\nimport { Box, CircularProgress, IconButton, styled, Tooltip, Typography } from '@mui/material';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport CancelIcon from '@mui/icons-material/Cancel';\r\nimport SaveIcon from '@mui/icons-material/Save';\r\nimport {\r\n CustomPropertyDatePicker,\r\n CustomPropertyDateRangePicker,\r\n CustomPropertyInput,\r\n CustomPropertyOptionSelect,\r\n CustomPropertyTimePicker,\r\n CustomPropertyTimeRangePicker,\r\n} from './components';\r\n// Types\r\nimport type { IContactField } from '@trii/types/dist/Contacts/contacts';\r\nimport { ContactField_type, Property } from '@trii/types/dist/Contacts';\r\nimport type { UserTrii } from '@trii/types/dist/Users';\r\n// Services\r\nimport { updateEntity } from '../../services/api';\r\n// Hooks (edit state)\r\nimport type UseEditContact from '../../hooks/useEditContact/types/UseEditContact';\r\nimport type UseEditBusiness from '../../hooks/useEditBusiness/types/UseEditBusiness';\r\n// Utils\r\nimport dayjs, { Dayjs } from 'dayjs';\r\n\r\nconst StyledIconButton = styled(IconButton)(() => ({\r\n opacity: 0,\r\n transition: 'opacity 0.3s ease-in-out',\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n marginLeft: '15px',\r\n}));\r\n\r\nconst StyledSaveCancelButton = styled(IconButton)(() => ({\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n}));\r\n\r\nconst ContactBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n\r\n borderRadius: theme.shape.borderRadius,\r\n minWidth: '45%',\r\n '&:hover .edit-icon': {\r\n opacity: 1,\r\n },\r\n}));\r\n\r\nconst FieldName = styled(Typography)(({ theme }) => ({\r\n fontWeight: 600,\r\n fontSize: '0.875rem',\r\n alignSelf: 'center',\r\n color: theme.palette.text.primary,\r\n letterSpacing: -0.5,\r\n padding: 0,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n minWidth: 0,\r\n}));\r\n\r\nconst FieldValue = styled(Typography)(({ theme }) => ({\r\n fontWeight: 400,\r\n fontSize: '0.875rem',\r\n padding: '2.5px 14px 8.5px 0px',\r\n color: theme.palette.text.primary,\r\n wordWrap: 'break-word',\r\n maxHeight: '80px',\r\n overflow: 'auto',\r\n whiteSpace: 'break-spaces',\r\n}));\r\n\r\ntype Props = {\r\n property: Property;\r\n entity: UseEditContact | UseEditBusiness;\r\n entityType: 'contact' | 'business';\r\n entityId: string;\r\n customContactFields: IContactField[];\r\n userTrii?: UserTrii | null;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\nconst EntityCustomFieldLabel = ({\r\n property,\r\n entity,\r\n entityType,\r\n entityId,\r\n customContactFields,\r\n userTrii,\r\n baseUrl,\r\n spaceId,\r\n onEntityUpdated,\r\n}: Props) => {\r\n const { customProperties } = entity.field;\r\n const { setCustomProperties } = entity.action;\r\n\r\n const [isEditing, setIsEditing] = useState(false);\r\n const [isSaving, setIsSaving] = useState(false);\r\n const titleRef = useRef<HTMLElement | null>(null);\r\n const [isTitleTruncated, setIsTitleTruncated] = useState(false);\r\n\r\n const userDateFormat = (userTrii?.regCon_dateFormat || 'YYYY/MM/DD').toUpperCase();\r\n const userTimeFormat = userTrii?.regCon_timeFormat || '24';\r\n\r\n // Determina si el tipo de campo es numérico\r\n const isNumericType = (type: ContactField_type) =>\r\n type === ContactField_type.NUMBER_INTEGER ||\r\n type === ContactField_type.NUMBER_DECIMAL ||\r\n type === ContactField_type.NUMBER_CURRENCY ||\r\n type === ContactField_type.NUMBER_ACCOUNTING ||\r\n type === ContactField_type.CURRENCY;\r\n\r\n const shouldBeNumeric = (nameKey: string, type: ContactField_type) => {\r\n const lower = nameKey.toLowerCase();\r\n if (lower === 'dni') return true; // fuerza DNI como numérico\r\n return isNumericType(type);\r\n };\r\n\r\n // Normaliza el valor según el tipo del campo\r\n const normalizeValue = (nameKey: string, type: ContactField_type, value: any) => {\r\n if (value === '' || value === null || value === undefined) return null;\r\n\r\n if (shouldBeNumeric(nameKey, type)) {\r\n const num = Number(value);\r\n return Number.isNaN(num) ? value : num;\r\n }\r\n\r\n return value;\r\n };\r\n const toggleEdit = () => setIsEditing((prev) => !prev);\r\n\r\n const handleCancel = () => {\r\n setIsEditing(false);\r\n entity.action.resetCustomProperty(property.nameKey);\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!baseUrl || !spaceId) return;\r\n if (!entityId) return;\r\n\r\n setIsSaving(true);\r\n\r\n const current = customProperties.find((p) => p.nameKey === property.nameKey) || property;\r\n\r\n const { nameKey, value } = current;\r\n\r\n // Definición del campo (si existe)\r\n const fieldDef = customContactFields.find((f) => f.nameKey === nameKey);\r\n\r\n // Tipo efectivo: primero el de la definición, si no existe usamos el del property\r\n const effectiveType: ContactField_type = fieldDef?.type ?? current.type;\r\n\r\n // Preparar el valor según el tipo de campo\r\n let finalValue: any;\r\n\r\n // Manejar campos de tipo TIME\r\n if (effectiveType === ContactField_type.TIME) {\r\n const dayjsValue = dayjs(value);\r\n if (dayjsValue.isValid()) {\r\n // Enviar solo el string de hora formateado\r\n finalValue = dayjsValue.format(userTimeFormat === '24' ? 'HH:mm' : 'hh:mm');\r\n } else {\r\n finalValue = value;\r\n }\r\n }\r\n // Manejar campos de tipo DATE\r\n else if (effectiveType === ContactField_type.DATE) {\r\n const dayjsValue = dayjs(value);\r\n if (dayjsValue.isValid()) {\r\n // Enviar el ISO string para fechas\r\n finalValue = dayjsValue.toISOString();\r\n } else {\r\n finalValue = value;\r\n }\r\n }\r\n // Para otros tipos, usar normalizeValue\r\n else {\r\n finalValue = normalizeValue(nameKey, effectiveType, value);\r\n }\r\n\r\n const updatedContactData = {\r\n properties: [\r\n {\r\n nameKey,\r\n type: effectiveType,\r\n value: finalValue,\r\n },\r\n ],\r\n };\r\n\r\n try {\r\n const updated = await updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType,\r\n entityId,\r\n body: updatedContactData as any,\r\n });\r\n const nextProperties = customProperties.map((p: Property) =>\r\n p.nameKey === nameKey\r\n ? {\r\n ...p,\r\n type: effectiveType,\r\n value: finalValue,\r\n }\r\n : p,\r\n );\r\n setCustomProperties(nextProperties);\r\n onEntityUpdated?.(updated);\r\n } finally {\r\n setIsSaving(false);\r\n setIsEditing(false);\r\n }\r\n };\r\n\r\n const getPropertyName = (propertyNameKey: string) => {\r\n const foundField = customContactFields.find((field) => field.nameKey === propertyNameKey);\r\n\r\n return foundField?.name || propertyNameKey;\r\n };\r\n\r\n useEffect(() => {\r\n const el = titleRef.current;\r\n if (!el) return;\r\n\r\n const check = () => {\r\n const next = el.scrollWidth > el.clientWidth;\r\n setIsTitleTruncated((prev) => (prev === next ? prev : next));\r\n };\r\n\r\n check();\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n let rafId = 0;\r\n const ro = new ResizeObserver(() => {\r\n if (typeof window === 'undefined') {\r\n check();\r\n return;\r\n }\r\n if (rafId) window.cancelAnimationFrame(rafId);\r\n rafId = window.requestAnimationFrame(() => {\r\n check();\r\n });\r\n });\r\n ro.observe(el);\r\n return () => {\r\n if (typeof window !== 'undefined' && rafId) window.cancelAnimationFrame(rafId);\r\n ro.disconnect();\r\n };\r\n }\r\n\r\n if (typeof window === 'undefined') return;\r\n window.addEventListener('resize', check);\r\n return () => {\r\n window.removeEventListener('resize', check);\r\n };\r\n }, [customContactFields, property.nameKey]);\r\n\r\n const handleInputChange = (name: string, value: any) => {\r\n const updatedValue =\r\n property.type === ContactField_type.DATERANGE\r\n ? Array.isArray(value) && value[0] && value[1]\r\n ? `${dayjs(value[0]).toISOString()} - ${dayjs(value[1]).toISOString()}`\r\n : ''\r\n : property.type === ContactField_type.DATE\r\n ? dayjs(value).isValid()\r\n ? dayjs(value).toISOString()\r\n : 'Invalid Date'\r\n : property.type === ContactField_type.TIME\r\n ? dayjs(value).isValid()\r\n ? dayjs(value).toISOString()\r\n : 'Invalid Time'\r\n : value;\r\n\r\n const updatedProperties = customProperties.map((property) =>\r\n property.nameKey === name ? { ...property, value: updatedValue } : property,\r\n );\r\n\r\n setCustomProperties(updatedProperties);\r\n };\r\n\r\n const { type, nameKey, value } = property;\r\n\r\n // Verifica si el valor existe y no está vacío\r\n const hasValue = (val: any) => {\r\n if (val === null || val === undefined) return false;\r\n\r\n // Si es string, verifica que no esté vacío\r\n if (typeof val === 'string') {\r\n return val.trim().length > 0;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const EditField = () => {\r\n if (type === ContactField_type.DATE)\r\n return (\r\n <CustomPropertyDatePicker\r\n value={value ? dayjs(value) : null}\r\n handleChange={(newValue) => handleInputChange(nameKey, newValue?.toDate())}\r\n dateFormat={userDateFormat}\r\n />\r\n );\r\n else if (type === ContactField_type.TIME)\r\n return (\r\n <CustomPropertyTimePicker\r\n value={\r\n // Usar valueDate si está disponible, sino intentar parsear value\r\n (property as any)?.valueDate\r\n ? dayjs((property as any).valueDate)\r\n : value\r\n ? dayjs(value)\r\n : null\r\n }\r\n handleChange={(newValue) => handleInputChange(nameKey, newValue)}\r\n userTimeFormat={userTimeFormat}\r\n />\r\n );\r\n else if (type === ContactField_type.DATERANGE)\r\n return (\r\n <CustomPropertyDateRangePicker\r\n value={\r\n value && typeof value === 'string' && value.includes(' - ')\r\n ? ([dayjs(value.split(' - ')[0]), dayjs(value.split(' - ')[1])] as [Dayjs, Dayjs])\r\n : null\r\n }\r\n handleChange={(newValue) =>\r\n handleInputChange(nameKey, [newValue[0]?.toDate?.(), newValue[1]?.toDate?.()])\r\n }\r\n userDateFormat={userDateFormat}\r\n />\r\n );\r\n else if (type === ContactField_type.TIMERANGE)\r\n return (\r\n <CustomPropertyTimeRangePicker\r\n value={\r\n Array.isArray(value) && value.length === 2\r\n ? ([dayjs(value[0]), dayjs(value[1])] as [Dayjs, Dayjs])\r\n : null\r\n }\r\n handleChange={(newValue) =>\r\n handleInputChange(nameKey, [newValue[0]?.toDate?.(), newValue[1]?.toDate?.()])\r\n }\r\n userTimeFormat={userTimeFormat}\r\n />\r\n );\r\n else if (type === ContactField_type.OPTIONS)\r\n return (\r\n <CustomPropertyOptionSelect\r\n value={typeof value === 'string' ? value : ''}\r\n handleChange={(newValue) => handleInputChange(nameKey, newValue)}\r\n options={\r\n customContactFields.find((field) => field.nameKey === nameKey)?.typeOptions ?? []\r\n }\r\n />\r\n );\r\n else\r\n return (\r\n <CustomPropertyInput\r\n type={type}\r\n nameKey={nameKey}\r\n value={value}\r\n onChange={handleInputChange}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <ContactBox\r\n className={`fadein ${\r\n property.type === ContactField_type.LONGTEXT ? 'contacts-col-12' : 'contacts-col-5'\r\n }`}\r\n >\r\n <Box display=\"flex\" position=\"relative\" minHeight=\"25px\" alignItems=\"center\">\r\n {isTitleTruncated ? (\r\n <Tooltip title={getPropertyName(property.nameKey)} arrow>\r\n <FieldName ref={titleRef} flexGrow={1} noWrap>\r\n {getPropertyName(property.nameKey)}\r\n </FieldName>\r\n </Tooltip>\r\n ) : (\r\n <FieldName ref={titleRef} flexGrow={1} noWrap>\r\n {getPropertyName(property.nameKey)}\r\n </FieldName>\r\n )}\r\n {isEditing ? (\r\n <>\r\n <StyledSaveCancelButton size=\"small\" onClick={handleSave}>\r\n {isSaving ? <CircularProgress size={24} /> : <SaveIcon />}\r\n </StyledSaveCancelButton>\r\n <StyledSaveCancelButton size=\"small\" onClick={handleCancel}>\r\n <CancelIcon />\r\n </StyledSaveCancelButton>\r\n </>\r\n ) : (\r\n <StyledIconButton className=\"edit-icon\" size=\"small\" onClick={toggleEdit}>\r\n <EditIcon />\r\n </StyledIconButton>\r\n )}\r\n </Box>\r\n\r\n <Box\r\n width={isEditing || property.type === ContactField_type.LONGTEXT ? '100%' : '50%'}\r\n position=\"relative\"\r\n >\r\n {isEditing ? (\r\n EditField()\r\n ) : (\r\n <FieldValue>\r\n {hasValue(property?.value)\r\n ? property.type === ContactField_type.DATERANGE\r\n ? (() => {\r\n if (typeof property.value === 'string') {\r\n const parts = property.value.split(' - ');\r\n if (parts.length === 2) {\r\n const [start, end] = parts;\r\n const startParsed = dayjs(start);\r\n const endParsed = dayjs(end);\r\n return `${startParsed.isValid() ? startParsed.format(userDateFormat) : '-'} - ${\r\n endParsed.isValid() ? endParsed.format(userDateFormat) : '-'\r\n }`;\r\n }\r\n } else if (Array.isArray(property.value) && property.value.length === 2) {\r\n return `${dayjs(property.value[0]).format(\r\n userDateFormat,\r\n )} - ${dayjs(property.value[1]).format(userDateFormat)}`;\r\n }\r\n return `${property.value}`;\r\n })()\r\n : property.type === ContactField_type.TIMERANGE\r\n ? (() => {\r\n if (Array.isArray(property.value) && property.value.length === 2) {\r\n return `${dayjs(property.value[0]).format(\r\n userTimeFormat === '24' ? 'HH:mm' : 'hh:mm',\r\n )} - ${dayjs(property.value[1]).format(\r\n userTimeFormat === '24' ? 'HH:mm' : 'hh:mm',\r\n )}`;\r\n }\r\n return `${property.value}`;\r\n })()\r\n : property.type === ContactField_type.TIME\r\n ? (() => {\r\n try {\r\n // Usar valueDate si está disponible, sino usar value\r\n const timeValue = (property as any).valueDate || property.value;\r\n return `${dayjs(timeValue).format(userTimeFormat === '24' ? 'HH:mm' : 'hh:mm A')}`;\r\n } catch (error) {\r\n return `${property.value}`;\r\n }\r\n })()\r\n : property.type === ContactField_type.DATE\r\n ? (() => {\r\n try {\r\n return `${dayjs(property.value).format(userDateFormat)}`;\r\n } catch (error) {\r\n return `${property.value}`;\r\n }\r\n })()\r\n : `${property?.value}`\r\n : null}\r\n </FieldValue>\r\n )}\r\n </Box>\r\n </ContactBox>\r\n );\r\n};\r\n\r\nexport default EntityCustomFieldLabel;\r\n","// Types\r\nimport { IContact } from '@trii/types/dist/Contacts';\r\nimport { GeneralProps } from '../General';\r\nimport { UserInfo } from '@trii/types/dist/Users';\r\n// Hooks\r\nimport { useEffect, useState } from 'react';\r\nimport { useEditEntity } from '../../../../context/EditEntityContext';\r\nimport { useEditContactApi } from '../../../../context/EditContactApiContext';\r\n// Api\r\n// Utils\r\nimport { resolveUserLabel } from '../../utils/resolveUserLabel';\r\n// Layout\r\nimport { Section, SectionContent } from '../../../../layout';\r\n// UI\r\nimport { ContactInfoLabel, EntityCustomFieldLabel } from '../../../../shared';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\nexport type ContactGeneralProps = Omit<GeneralProps, 'entityData' | 'entityType'> & {\r\n entityType: 'contact';\r\n entityData: IContact;\r\n};\r\n\r\nconst ContactGeneral = (props: ContactGeneralProps) => {\r\n const {\r\n dateFormat,\r\n entityData,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n currentUser,\r\n onEntityUpdated,\r\n } = props;\r\n\r\n const t = useTranslationContext();\r\n const { entityType, editEntity } = useEditEntity();\r\n const api = useEditContactApi();\r\n\r\n if (entityType !== 'contact') {\r\n return null;\r\n }\r\n\r\n const [users, setUsers] = useState<UserInfo[]>([]);\r\n const [owner, setOwner] = useState<string | null>(null);\r\n const [updatedBy, setUpdatedBy] = useState<string | null>(null);\r\n const [createdBy, setCreatedBy] = useState<string | null>(null);\r\n\r\n const editContact = editEntity;\r\n\r\n useEffect(() => {\r\n if (!api) return;\r\n const controller = new AbortController();\r\n\r\n api\r\n .fetchUsers({ signal: controller.signal })\r\n .then((data) => {\r\n if (controller.signal.aborted) return;\r\n setUsers(data ?? []);\r\n })\r\n .catch(() => {\r\n if (controller.signal.aborted) return;\r\n setUsers([]);\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api]);\r\n\r\n useEffect(() => {\r\n const controller = new AbortController();\r\n\r\n const getRemoteLabel = async (userId?: string) => {\r\n if (!userId) return null;\r\n if (!api) return null;\r\n try {\r\n const userTrii = await api.fetchUserTriiById({ userId, signal: controller.signal });\r\n return userTrii?.display_name || userTrii?.email || null;\r\n } catch {\r\n return null;\r\n }\r\n };\r\n\r\n const resolve = async () => {\r\n const ownerLabel =\r\n resolveUserLabel({ userId: entityData.owner, users, currentUser }) ??\r\n (entityData.owner ? await getRemoteLabel(entityData.owner) : null);\r\n\r\n const createdByLabel =\r\n resolveUserLabel({ userId: entityData.createdBy ?? undefined, users, currentUser }) ??\r\n (entityData.createdBy ? await getRemoteLabel(entityData.createdBy) : null);\r\n\r\n const updatedByLabel =\r\n resolveUserLabel({ userId: entityData.updatedBy ?? undefined, users, currentUser }) ??\r\n (entityData.updatedBy ? await getRemoteLabel(entityData.updatedBy) : null);\r\n\r\n if (controller.signal.aborted) return;\r\n\r\n setOwner(ownerLabel);\r\n setCreatedBy(createdByLabel);\r\n setUpdatedBy(updatedByLabel);\r\n };\r\n\r\n resolve();\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, entityData, users, currentUser]);\r\n\r\n const userDateFormat = (dateFormat || 'YYYY/MM/DD').toUpperCase();\r\n const birthDate = editContact.field.birthDate;\r\n const dateOnlyString = birthDate?.isValid() ? birthDate.format(userDateFormat) : null;\r\n\r\n const calculateAge = (birthDate: Date) => {\r\n const today = new Date();\r\n let age = today.getFullYear() - birthDate.getFullYear();\r\n const m = today.getMonth() - birthDate.getMonth();\r\n\r\n if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n\r\n return age;\r\n };\r\n\r\n return (\r\n <Section title=\"General\">\r\n <SectionContent>\r\n {/* CONTACT LABELS */}\r\n <ContactInfoLabel\r\n title={t('conversations.contactDetails.contactOwner')}\r\n displayValue={owner || '-'}\r\n value={entityData.owner}\r\n inputType=\"select\"\r\n options={users}\r\n constructUpdateObject={(value) => ({\r\n owner: typeof value === 'string' ? value : '',\r\n })}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n <ContactInfoLabel\r\n title={t('conversations.contactDetails.business')}\r\n displayValue={entityData.businessName || '-'}\r\n value={entityData.businessId}\r\n inputType=\"selectBusiness\"\r\n businessId={entityData.businessId}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n <ContactInfoLabel\r\n title={t('conversations.contactDetails.createdBy')}\r\n value={createdBy || '-'}\r\n isNotEditable={true}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n />\r\n <ContactInfoLabel\r\n title={t('conversations.contactDetails.modifiedBy')}\r\n value={updatedBy || '-'}\r\n isNotEditable={true}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n />\r\n <ContactInfoLabel\r\n title={t('global.birthdate')}\r\n inputType=\"birthday\"\r\n displayValue={birthDate ? `${dateOnlyString} (${calculateAge(birthDate.toDate())})` : '-'}\r\n value={birthDate ? birthDate.toISOString() : ''}\r\n constructUpdateObject={(value) => ({\r\n birthDate: value,\r\n })}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n dateFormat={dateFormat}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n\r\n {editContact.field.customProperties.map((property) => (\r\n <EntityCustomFieldLabel\r\n key={property.nameKey}\r\n property={property}\r\n entity={editContact}\r\n entityType=\"contact\"\r\n entityId={String(entityData.id)}\r\n customContactFields={customContactFields}\r\n userTrii={currentUser}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n ))}\r\n {/*END OF CONTACT LABELS */}\r\n </SectionContent>\r\n </Section>\r\n );\r\n};\r\n\r\nexport default ContactGeneral;\r\n","import EntityInfoLabel from '../EntityInfoLabel';\r\n// Types\r\nimport type { UserInfo } from '@trii/types/dist/Users';\r\n\r\ntype Props = {\r\n title: string;\r\n value?: string | Date;\r\n isNotEditable?: boolean;\r\n inputType?: 'text' | 'select' | 'selectMembers';\r\n options?: UserInfo[];\r\n displayValue?: string;\r\n constructUpdateObject?: (value: string | Date) => object;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n businessId?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\nconst BusinessInfoLabel = ({\r\n title,\r\n value,\r\n isNotEditable,\r\n inputType = 'text',\r\n options = [],\r\n displayValue,\r\n constructUpdateObject,\r\n baseUrl,\r\n spaceId,\r\n businessId,\r\n onEntityUpdated,\r\n}: Props) => {\r\n return (\r\n <EntityInfoLabel\r\n entityType=\"business\"\r\n entityId={businessId}\r\n title={title}\r\n value={value}\r\n isNotEditable={isNotEditable}\r\n inputType={inputType}\r\n options={options}\r\n displayValue={displayValue}\r\n constructUpdateObject={constructUpdateObject}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n );\r\n};\r\n\r\nexport default BusinessInfoLabel;\r\n","// Hooks\r\nimport { useEffect, useState } from 'react';\r\nimport { useEditEntity } from '../../../../context/EditEntityContext';\r\nimport { useEditContactApi } from '../../../../context/EditContactApiContext';\r\n// Api\r\n// Utils\r\nimport { resolveUserLabel } from '../../utils/resolveUserLabel';\r\n// Types\r\nimport { IBusiness } from '@trii/types/dist/Contacts';\r\nimport { GeneralProps } from '../General';\r\nimport { UserInfo } from '@trii/types/dist/Users';\r\n// UI\r\nimport { Section, SectionContent } from '../../../../layout';\r\nimport BusinessInfoLabel from '../../../../shared/BusinessInfoLabel';\r\nimport { EntityCustomFieldLabel } from '../../../../shared';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\nexport type BusinessGeneralProps = Omit<GeneralProps, 'entityData' | 'entityType'> & {\r\n entityType: 'business';\r\n entityData: IBusiness;\r\n};\r\n\r\nconst BusinessGeneral = (props: BusinessGeneralProps) => {\r\n const t = useTranslationContext();\r\n\r\n const { entityData, customContactFields, baseUrl, spaceId, currentUser, onEntityUpdated } = props;\r\n\r\n const { entityType, editEntity } = useEditEntity();\r\n const api = useEditContactApi();\r\n\r\n if (entityType !== 'business') {\r\n return null;\r\n }\r\n\r\n const [users, setUsers] = useState<UserInfo[]>([]);\r\n const [owner, setOwner] = useState<string | null>(null);\r\n const [updatedBy, setUpdatedBy] = useState<string | null>(null);\r\n const [createdBy, setCreatedBy] = useState<string | null>(null);\r\n\r\n const editBusiness = editEntity;\r\n\r\n useEffect(() => {\r\n if (!api) return;\r\n const controller = new AbortController();\r\n\r\n api\r\n .fetchUsers({ signal: controller.signal })\r\n .then((data) => {\r\n if (controller.signal.aborted) return;\r\n setUsers(data ?? []);\r\n })\r\n .catch(() => {\r\n if (controller.signal.aborted) return;\r\n setUsers([]);\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api]);\r\n\r\n useEffect(() => {\r\n const controller = new AbortController();\r\n\r\n const getRemoteLabel = async (userId?: string) => {\r\n if (!userId) return null;\r\n if (!api) return null;\r\n try {\r\n const userTrii = await api.fetchUserTriiById({ userId, signal: controller.signal });\r\n return userTrii?.display_name || userTrii?.email || null;\r\n } catch {\r\n return null;\r\n }\r\n };\r\n\r\n const resolve = async () => {\r\n const ownerLabel =\r\n resolveUserLabel({ userId: entityData.owner, users, currentUser }) ??\r\n (entityData.owner ? await getRemoteLabel(entityData.owner) : null);\r\n\r\n const createdByLabel =\r\n resolveUserLabel({ userId: entityData.createdBy ?? undefined, users, currentUser }) ??\r\n (entityData.createdBy ? await getRemoteLabel(entityData.createdBy) : null);\r\n\r\n const updatedByLabel =\r\n resolveUserLabel({ userId: entityData.updatedBy ?? undefined, users, currentUser }) ??\r\n (entityData.updatedBy ? await getRemoteLabel(entityData.updatedBy) : null);\r\n\r\n if (controller.signal.aborted) return;\r\n\r\n setOwner(ownerLabel);\r\n setCreatedBy(createdByLabel);\r\n setUpdatedBy(updatedByLabel);\r\n };\r\n\r\n resolve();\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, entityData, users, currentUser]);\r\n\r\n return (\r\n <Section title=\"General\">\r\n <SectionContent>\r\n {/* BUSINESS LABELS */}\r\n <BusinessInfoLabel\r\n title={t('conversations.businessDetails.businessOwner')}\r\n value={entityData.owner}\r\n displayValue={owner || '-'}\r\n inputType=\"select\"\r\n options={users}\r\n constructUpdateObject={(value) => ({\r\n owner: typeof value === 'string' ? value : '',\r\n })}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n businessId={entityData.id}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n\r\n <BusinessInfoLabel\r\n title={t('conversations.contactDetails.createdBy')}\r\n value={createdBy || '-'}\r\n isNotEditable={true}\r\n />\r\n <BusinessInfoLabel\r\n title={t('conversations.contactDetails.modifiedBy')}\r\n value={updatedBy || '-'}\r\n isNotEditable={true}\r\n />\r\n\r\n {editBusiness.field.customProperties.map((property) => (\r\n <EntityCustomFieldLabel\r\n key={property.nameKey}\r\n property={property}\r\n entity={editBusiness}\r\n entityType=\"business\"\r\n entityId={String(entityData.id)}\r\n customContactFields={customContactFields}\r\n userTrii={currentUser}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n ))}\r\n {/*END OF BUSINESS LABELS */}\r\n </SectionContent>\r\n </Section>\r\n );\r\n};\r\n\r\nexport default BusinessGeneral;\r\n","import { useMemo } from 'react';\r\n// Types\r\nimport type { IBusiness, IContact, IContactField } from '@trii/types/dist/Contacts/contacts';\r\nimport type { UserTrii } from '@trii/types/dist/Users';\r\nimport ContactGeneral, { ContactGeneralProps } from './components/ContactGeneral';\r\nimport BusinessGeneral, { BusinessGeneralProps } from './components/BusinessGeneral';\r\n\r\nexport interface GeneralProps {\r\n dateFormat: string;\r\n entityType: 'contact' | 'business';\r\n entityData: IContact | IBusiness;\r\n customContactFields: IContactField[];\r\n baseUrl?: string;\r\n spaceId?: string;\r\n currentUser?: UserTrii | null;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n}\r\n\r\nconst General = (props: GeneralProps) => {\r\n const { entityType, entityData } = props;\r\n\r\n const normalizedEntityType = useMemo(() => {\r\n if (entityType === 'contact' || entityType === 'business') return entityType;\r\n return 'contact';\r\n }, [entityType]);\r\n\r\n return normalizedEntityType === 'contact' ? (\r\n <ContactGeneral\r\n {...(props as ContactGeneralProps)}\r\n entityData={entityData as IContact}\r\n entityType=\"contact\"\r\n />\r\n ) : (\r\n <BusinessGeneral\r\n {...(props as BusinessGeneralProps)}\r\n entityData={entityData as IBusiness}\r\n entityType=\"business\"\r\n />\r\n );\r\n};\r\n\r\nexport default General;\r\n","// useModal.ts\r\nimport { useState } from 'react';\r\n\r\ninterface UseEditModalReturn {\r\n isOpen: boolean;\r\n title: string;\r\n openModal: (title: string) => void;\r\n closeModal: () => void;\r\n}\r\n\r\nconst useEditModal = (): UseEditModalReturn => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [title, setTitle] = useState<string>('');\r\n\r\n const openModal = (title: string) => {\r\n setTitle(title);\r\n setIsOpen(true);\r\n };\r\n\r\n const closeModal = () => {\r\n setIsOpen(false);\r\n setTitle(''); // Clear the title when the modal closes\r\n };\r\n\r\n return { isOpen, title, openModal, closeModal };\r\n};\r\n\r\nexport default useEditModal;\r\n","import { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\nimport { styled } from '@mui/system';\r\nimport { Box, Avatar, IconButton, Tooltip } from '@mui/material';\r\nimport {Star, StarBorder } from '@mui/icons-material';\r\nimport useImage from '../../../../../../../hooks/useImage';\r\n\r\ntype Props = {\r\n item: IContactAddress;\r\n owner?: IBusiness | IContact;\r\n};\r\n\r\nconst StyledBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(1),\r\n backgroundColor: theme.palette.background.dropdownMenu,\r\n borderRadius: theme.shape.borderRadius,\r\n color: theme.palette.text.primary,\r\n width: '50%',\r\n paddingBottom: '3px',\r\n minHeight: '50px',\r\n position: 'relative',\r\n}));\r\n\r\nconst LeftSection = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(1),\r\n overflow: 'hidden',\r\n maxWidth: '80%',\r\n}));\r\n\r\nconst RightSection = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n}));\r\n\r\nconst ContactDetails = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(0.5),\r\n overflow: 'hidden',\r\n flexFlow: 'nowrap',\r\n flexWrap: 'wrap',\r\n marginTop: '-5px',\r\n}));\r\n\r\nconst AvatarWrapper = styled(Avatar)(({}) => ({\r\n width: 32,\r\n height: 32,\r\n cursor: 'pointer',\r\n}));\r\n\r\nconst EllipsisText = styled(Box)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n}));\r\n\r\nconst NoteText = styled(EllipsisText)(({ theme }) => ({\r\n fontSize: 12,\r\n color: theme.palette.text.secondary,\r\n position: 'absolute',\r\n bottom: 0,\r\n maxWidth: '70%',\r\n}));\r\n\r\nconst PhoneText = styled(EllipsisText)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n}));\r\n\r\nconst ProfileNameText = styled(EllipsisText)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n}));\r\n\r\nconst ContactMethodItem = ({ item }: Props) => {\r\n const avatarUrlWithoutAccess = item.profileUrl;\r\n\r\n const {imageUrl} = useImage({\r\n initialImageUrl: avatarUrlWithoutAccess,\r\n });\r\n\r\n return (\r\n <>\r\n <StyledBox>\r\n <LeftSection>\r\n <ContactDetails>\r\n <Tooltip title={item.address || ''} arrow>\r\n <PhoneText>{item.address}</PhoneText>\r\n </Tooltip>\r\n <Tooltip title={item.profileName || ''} arrow>\r\n <ProfileNameText\r\n sx={{\r\n marginTop: '-10px',\r\n marginLeft: '5px',\r\n fontSize: '10px',\r\n }}\r\n >\r\n {item.profileName}\r\n </ProfileNameText>\r\n </Tooltip>\r\n <Tooltip title={item.note || ''} arrow>\r\n <NoteText>{item.note}</NoteText>\r\n </Tooltip>\r\n </ContactDetails>\r\n </LeftSection>\r\n <RightSection>\r\n {avatarUrlWithoutAccess !== '' && (\r\n <AvatarWrapper\r\n src={imageUrl}\r\n alt={item.profileName}\r\n style={{ cursor: 'pointer' }}\r\n >\r\n {item?.profileName?.charAt(0).toUpperCase()}\r\n </AvatarWrapper>\r\n )}\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n }}\r\n >\r\n <IconButton\r\n size=\"small\"\r\n sx={{ marginTop: '-5px', padding: 0 }}\r\n >\r\n {item.isFavorite ? (\r\n <Star\r\n sx={{\r\n color: '#fcac34',\r\n }}\r\n />\r\n ) : (\r\n <StarBorder\r\n sx={{\r\n color: '#fcac34',\r\n }}\r\n />\r\n )}\r\n </IconButton>\r\n </Box>\r\n </RightSection>\r\n </StyledBox>\r\n </>\r\n );\r\n};\r\n\r\nexport default ContactMethodItem;\r\n","import { PhoneNumberUtil, PhoneNumberFormat, PhoneNumber } from 'google-libphonenumber';\r\nconst phoneUtil = PhoneNumberUtil.getInstance();\r\n\r\n/**\r\n * Returns a user-friendly display format for a sanitized phone number.\r\n * Always uses INTERNATIONAL format, e.g. \"+54 358 402 2664\"\r\n */\r\nexport const formatPhoneForDisplay = (number: string): string => {\r\n if (!number || !number.trim()) return number;\r\n\r\n try {\r\n const parsed: PhoneNumber = phoneUtil.parse(number, undefined);\r\n\r\n if (!phoneUtil.isValidNumber(parsed)) {\r\n // If not valid, just return as-is\r\n return number;\r\n }\r\n\r\n // Always use INTERNATIONAL format\r\n return phoneUtil.format(parsed, PhoneNumberFormat.INTERNATIONAL);\r\n } catch (e) {\r\n return number;\r\n }\r\n};\r\n","import { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { styled } from '@mui/system';\r\nimport { Box, IconButton, Tooltip } from '@mui/material';\r\nimport LocalPhoneIcon from '@mui/icons-material/LocalPhone';\r\nimport { useMemo } from 'react';\r\nimport { Star, StarBorder } from '@mui/icons-material';\r\nimport { formatPhoneForDisplay } from './utils/phone';\r\n\r\ntype Props = {\r\n item: IContactAddress;\r\n};\r\n\r\nconst StyledIconButton = styled(IconButton)(({ theme }) => ({\r\n padding: theme.spacing(0.5),\r\n marginTop: '-5px',\r\n}));\r\n\r\nconst StyledLocalPhoneIcon = styled(LocalPhoneIcon)(({ theme }) => ({\r\n height: 16,\r\n width: 16,\r\n color: theme.palette.secondary.main\r\n}));\r\n\r\nconst StyledBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(1),\r\n backgroundColor: theme.palette.background.dropdownMenu,\r\n borderRadius: theme.shape.borderRadius,\r\n color: theme.palette.text.primary,\r\n width: '50%',\r\n paddingBottom: '3px',\r\n minHeight: '50px',\r\n position: 'relative',\r\n}));\r\n\r\nconst LeftSection = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(1),\r\n maxWidth: '80%',\r\n}));\r\nconst RightSection = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n}));\r\nconst ContactDetails = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(0.5),\r\n overflow: 'hidden',\r\n flexFlow: 'nowrap',\r\n flexWrap: 'wrap',\r\n marginTop: '-5px',\r\n}));\r\n\r\nconst EllipsisText = styled(Box)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n}));\r\nconst NoteText = styled(EllipsisText)(({ theme }) => ({\r\n fontSize: 12,\r\n color: theme.palette.text.secondary,\r\n position: 'absolute',\r\n bottom: 0,\r\n maxWidth: '70%',\r\n}));\r\nconst PhoneText = styled(EllipsisText)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n}));\r\n\r\nconst ContactMethodPhoneItem = ({ item }: Props) => {\r\n const handleCallContact = () => {\r\n const contactPhone = item.address;\r\n if (!contactPhone) return;\r\n\r\n const event = new CustomEvent('call-contact-header', {\r\n detail: { phoneAddress: contactPhone },\r\n });\r\n window.dispatchEvent(event);\r\n };\r\n\r\n const formattedPhone = useMemo(\r\n () => formatPhoneForDisplay(item.address || ''),\r\n [item.address]\r\n );\r\n\r\n return (\r\n <>\r\n <StyledBox>\r\n <LeftSection>\r\n <StyledIconButton\r\n onClick={handleCallContact}\r\n color=\"primary\"\r\n size=\"small\"\r\n >\r\n <StyledLocalPhoneIcon />\r\n </StyledIconButton>\r\n <ContactDetails>\r\n <Tooltip title={formattedPhone || ''} arrow>\r\n <PhoneText>{formattedPhone}</PhoneText>\r\n </Tooltip>\r\n <Tooltip title={item.note || ''} arrow>\r\n <NoteText>{item.note}</NoteText>\r\n </Tooltip>\r\n </ContactDetails>\r\n </LeftSection>\r\n <RightSection>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n }}\r\n >\r\n <IconButton\r\n size=\"small\"\r\n sx={{ marginTop: '-5px', padding: 0 }}\r\n >\r\n {item.isFavorite ? (\r\n <Star\r\n sx={{\r\n color: '#fcac34',\r\n }}\r\n />\r\n ) : (\r\n <StarBorder\r\n sx={{\r\n color: '#fcac34',\r\n }}\r\n />\r\n )}\r\n </IconButton>\r\n </Box>\r\n </RightSection>\r\n </StyledBox>\r\n </>\r\n );\r\n};\r\n\r\nexport default ContactMethodPhoneItem;\r\n","import { Box, IconButton, styled, Typography } from '@mui/material';\r\nimport { ContactMethodItem, ContactMethodPhoneItem } from './components';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\n\r\ninterface Props {\r\n title: string;\r\n methodItems: IContactAddress[];\r\n isPhone?: boolean;\r\n handleEdit: () => void;\r\n owner?: IBusiness | IContact;\r\n}\r\n\r\nconst StyledBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: theme.spacing(1, 0, 2, 0),\r\n width: '100%',\r\n gap: theme.spacing(1),\r\n '&:hover .edit-icon': {\r\n opacity: 1,\r\n },\r\n}));\r\n\r\nconst StyledTypography = styled(Typography)(({}) => ({\r\n letterSpacing: -0.5,\r\n fontSize: 14,\r\n}));\r\n\r\nconst HeaderBox = styled(Box)(({}) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n}));\r\n\r\nconst MethodItemsBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: theme.spacing(1),\r\n width: '100%',\r\n}));\r\nconst StyledIconButton = styled(IconButton)({\r\n opacity: 0,\r\n transition: 'opacity 0.3s ease-in-out',\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n marginLeft: '15px',\r\n});\r\n\r\nconst ContactMethod = ({ title, methodItems, isPhone, handleEdit, owner }: Props) => {\r\n return (\r\n <StyledBox>\r\n <HeaderBox>\r\n <StyledTypography>{title}</StyledTypography>\r\n <StyledIconButton className=\"edit-icon\" size=\"small\" onClick={handleEdit}>\r\n <EditIcon fontSize=\"small\" sx={{ color: (theme) => theme.palette.secondary.main }} />\r\n </StyledIconButton>\r\n </HeaderBox>\r\n <MethodItemsBox>\r\n {methodItems.map((item, index) => {\r\n if (isPhone) {\r\n return <ContactMethodPhoneItem key={index} item={item} />;\r\n }\r\n return <ContactMethodItem key={index} item={item} owner={owner} />;\r\n })}\r\n </MethodItemsBox>\r\n </StyledBox>\r\n );\r\n};\r\n\r\nexport default ContactMethod;\r\n","// Components/ui\r\nimport { Typography, Box } from '@mui/material';\r\n\r\ntype Props = {\r\n title: string;\r\n};\r\n\r\nconst SubsectionHeader = ({ title }: Props) => {\r\n return (\r\n <Box>\r\n <Typography variant=\"subtitle2\">{title}</Typography>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SubsectionHeader;\r\n","const subsectionHeaderWithButtonStyle = {\r\n container: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center'\r\n },\r\n};\r\n\r\nexport default subsectionHeaderWithButtonStyle;\r\n","// Components/ui\r\nimport { Typography, Button, Box } from '@mui/material';\r\nimport subsectionHeaderWithButtonStyle from './style';\r\nimport AddIcon from '@mui/icons-material/Add';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n title: string;\r\n handleAdd: () => void;\r\n};\r\n\r\nconst SubsectionHeaderWithButton = ({ title, handleAdd }: Props) => {\r\n const t = useTranslationContext();\r\n console.log('[SubsectionHeaderWithButton] title:', title, 't fn:', t?.name || 'anonymous');\r\n return (\r\n <Box sx={subsectionHeaderWithButtonStyle.container}>\r\n <Typography variant=\"subtitle2\">{title}</Typography>\r\n <Button\r\n onClick={handleAdd}\r\n size=\"small\"\r\n startIcon={<AddIcon />}\r\n variant=\"text\"\r\n color=\"primary\"\r\n >\r\n {t('global.add')}\r\n </Button>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SubsectionHeaderWithButton;\r\n","const informationItemContainerStyle = {\r\n container: {\r\n border: '1px solid lightgray',\r\n borderRadius: 1,\r\n p: 2,\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 1,\r\n },\r\n};\r\n\r\nexport default informationItemContainerStyle;\r\n","// Types\r\nimport { ReactNode } from 'react';\r\n// Components/ui\r\nimport informationItemContainerStyle from './style';\r\nimport { Box } from '@mui/material';\r\n\r\ninterface Props {\r\n children: ReactNode;\r\n}\r\n\r\nconst InformationItemContainer = ({ children }: Props) => {\r\n return <Box sx={informationItemContainerStyle.container}>{children}</Box>;\r\n};\r\n\r\nexport default InformationItemContainer;\r\n","const noteDeleteButtonStyle = {\r\n container: {\r\n display: 'flex',\r\n width: '50%',\r\n alignItems: 'center',\r\n justifyContent: 'end'\r\n },\r\n noteTextField: {\r\n width: '100%',\r\n marginRight: '15px'\r\n },\r\n};\r\n\r\nexport default noteDeleteButtonStyle;\r\n","import React, { useState } from 'react';\r\nimport {\r\n Box,\r\n IconButton,\r\n ListItemIcon,\r\n ListItemText,\r\n Menu,\r\n MenuItem,\r\n Modal,\r\n Typography,\r\n Button,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\r\nimport DeleteIcon from '@mui/icons-material/Delete';\r\nimport WhatsAppIcon from '@mui/icons-material/WhatsApp';\r\nimport MmsIcon from '@mui/icons-material/Mms';\r\nimport type { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { useTranslationContext } from '../../../../../../../../../../../../../context/TranslationContext';\r\n\r\ntype OptionsMenuProps = {\r\n onDelete: () => void;\r\n addressData: {\r\n address: string;\r\n channelType: ChannelType;\r\n };\r\n handleLinkAccountSave: () => Promise<void>;\r\n checked: boolean;\r\n onCheckContactAddress?: (type: ChannelType) => Promise<ResultContactAddressCheck | null>;\r\n};\r\n\r\ntype ResultContactAddressCheck = {\r\n success: boolean;\r\n warnings: string[];\r\n};\r\n\r\nconst OptionsMenu = ({\r\n onDelete,\r\n addressData,\r\n handleLinkAccountSave,\r\n checked,\r\n onCheckContactAddress,\r\n}: OptionsMenuProps) => {\r\n const t = useTranslationContext();\r\n\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n const open = Boolean(anchorEl);\r\n const { channelType, address } = addressData;\r\n const [verifying, setVerifying] = useState(false);\r\n const [verificationResult, setVerificationResult] = useState<ResultContactAddressCheck | null>(\r\n null,\r\n );\r\n const [modalOpen, setModalOpen] = useState(false);\r\n\r\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleModalClose = () => {\r\n setModalOpen(false);\r\n };\r\n\r\n const handleDelete = () => {\r\n onDelete();\r\n handleClose();\r\n };\r\n\r\n const handleCheckWA = async () => {\r\n setVerifying(true);\r\n try {\r\n if (!onCheckContactAddress) {\r\n return;\r\n }\r\n\r\n const result = await onCheckContactAddress(13 as unknown as ChannelType);\r\n if (!result) {\r\n return;\r\n }\r\n\r\n setVerificationResult(result);\r\n setModalOpen(true);\r\n } catch (error) {\r\n console.error('Error verifying WhatsApp account:', error);\r\n } finally {\r\n setVerifying(false);\r\n }\r\n handleClose();\r\n };\r\n const handleCheckRCS = async () => {\r\n setVerifying(true);\r\n try {\r\n if (!onCheckContactAddress) {\r\n return;\r\n }\r\n\r\n const result = await onCheckContactAddress(21 as unknown as ChannelType);\r\n if (!result) {\r\n return;\r\n }\r\n\r\n setVerificationResult(result);\r\n setModalOpen(true);\r\n } catch (error) {\r\n console.error('Error verifying RCS account:', error);\r\n } finally {\r\n setVerifying(false);\r\n }\r\n handleClose();\r\n };\r\n\r\n const handleLinkAccount = async () => {\r\n await handleLinkAccountSave();\r\n setModalOpen(false);\r\n };\r\n\r\n return (\r\n <Box>\r\n <IconButton\r\n aria-controls={open ? 'basic-menu' : undefined}\r\n aria-haspopup=\"true\"\r\n aria-expanded={open ? 'true' : undefined}\r\n onClick={handleClick}\r\n >\r\n <MoreVertIcon />\r\n </IconButton>\r\n <Menu\r\n id=\"basic-menu\"\r\n anchorEl={anchorEl}\r\n open={open}\r\n onClose={handleClose}\r\n MenuListProps={{\r\n 'aria-labelledby': 'basic-button',\r\n }}\r\n >\r\n <MenuItem onClick={handleDelete}>\r\n <ListItemIcon>\r\n <DeleteIcon color=\"error\" />\r\n </ListItemIcon>\r\n <ListItemText>{t('global.delete')}</ListItemText>\r\n </MenuItem>\r\n {channelType === 5 && (\r\n <MenuItem onClick={handleCheckWA} disabled={!checked}>\r\n <ListItemIcon>\r\n {verifying ? (\r\n <CircularProgress size={24} />\r\n ) : (\r\n <WhatsAppIcon sx={{ color: 'green' }} />\r\n )}\r\n </ListItemIcon>\r\n <ListItemText>{t('optionsMenu.verifyWspAccount')}</ListItemText>\r\n </MenuItem>\r\n )}\r\n {channelType === 21 && (\r\n <MenuItem onClick={handleCheckRCS} disabled={!checked}>\r\n <ListItemIcon>{verifying ? <CircularProgress size={24} /> : <MmsIcon />}</ListItemIcon>\r\n <ListItemText>{t('optionsMenu.verifyRCSAccount')}</ListItemText>\r\n </MenuItem>\r\n )}\r\n </Menu>\r\n\r\n <Modal\r\n open={modalOpen}\r\n onClose={handleModalClose}\r\n aria-labelledby=\"modal-modal-title\"\r\n aria-describedby=\"modal-modal-description\"\r\n >\r\n <Box\r\n sx={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 400,\r\n boxShadow: 24,\r\n p: 4,\r\n backgroundColor: (theme) => theme.palette.background.default,\r\n }}\r\n >\r\n {verificationResult?.success ? (\r\n <>\r\n <Typography id=\"modal-modal-title\" variant=\"h6\" component=\"h2\">\r\n {t('optionsMenu.wspAccountFound')} {address}\r\n </Typography>\r\n <Typography id=\"modal-modal-description\" sx={{ mt: 2 }}>\r\n {t('optionsMenu.wantToLinkContact')}\r\n </Typography>\r\n <Box sx={{ marginTop: '10px' }}>\r\n <Button onClick={handleLinkAccount} color=\"primary\">\r\n {t('optionsMenu.yesLink')}\r\n </Button>\r\n <Button onClick={handleModalClose} color=\"secondary\">\r\n No\r\n </Button>\r\n </Box>\r\n </>\r\n ) : (\r\n <Box sx={{ position: 'relative' }}>\r\n <Typography id=\"modal-modal-title\" variant=\"h6\" component=\"h2\">\r\n {t('optionsMenu.noWspAccountFound')} {address}\r\n </Typography>\r\n <Button\r\n onClick={handleModalClose}\r\n color=\"secondary\"\r\n sx={{ position: 'absolute', bottom: -25, right: 0 }}\r\n >\r\n {t('global.cancel')}\r\n </Button>\r\n </Box>\r\n )}\r\n </Box>\r\n </Modal>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default OptionsMenu;\r\n","import React, { useState } from 'react';\r\n// UI\r\nimport { Box, IconButton, TextField, CircularProgress } from '@mui/material';\r\nimport SaveIcon from '@mui/icons-material/Save';\r\nimport noteDeleteButtonStyle from './style';\r\n// Types\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { useEditContactApi } from '../../../../../../../context/EditContactApiContext';\r\nimport { useEditEntity } from '../../../../../../../context/EditEntityContext';\r\nimport OptionsMenu from '../../components/Phones/components/Body/components/Phone/components/OptionsMenu';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n addressData: NewAddress | IContactAddress;\r\n handleNoteFieldChange: (\r\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n addressId: string,\r\n addressType: ChannelType,\r\n ) => void;\r\n handleDeleteAddress: (addressId: string, addressType: ChannelType) => void;\r\n checked?: boolean;\r\n entityId?: string;\r\n mode?: string;\r\n setWarnings?: (warnings: string[]) => void;\r\n isDeletingAddress?: string | false;\r\n replaceAddress?: (addressId: string, newAddress: IContactAddress) => void;\r\n addWhatsappVerified?: (newAddress: IContactAddress) => void;\r\n};\r\n\r\nconst NoteDeleteButton = (props: Props) => {\r\n const t = useTranslationContext();\r\n const api = useEditContactApi();\r\n const { editEntity, entityId: entityIdFromContext } = useEditEntity();\r\n\r\n const [isSaving, setIsSaving] = useState(false);\r\n\r\n const checked = props.checked ?? true;\r\n const entityId = props.entityId ?? entityIdFromContext;\r\n\r\n const { note, channelType, id, address } = props.addressData;\r\n const addressIsSaved = !props.addressData.hasOwnProperty('isSaved');\r\n\r\n const replaceAddress = props.replaceAddress ?? editEntity.action.replaceAddress;\r\n const addWhatsappVerified =\r\n props.addWhatsappVerified ||\r\n (typeof (editEntity.action as any)?.addWhatsappVerified === 'function'\r\n ? (editEntity.action as any).addWhatsappVerified\r\n : undefined);\r\n\r\n const handleSetAddress = async (type: ChannelType) => {\r\n if (!api) return null;\r\n if (!entityId) return null;\r\n\r\n const newAddress = await api.setContactAddress({\r\n data: {\r\n address,\r\n contactId: entityId,\r\n type,\r\n },\r\n });\r\n\r\n replaceAddress(id, newAddress);\r\n return newAddress;\r\n };\r\n\r\n const handleUpdateAddress = async () => {\r\n if (!api) return;\r\n if (!entityId) return;\r\n\r\n const updated = await api.updateContactAddress({\r\n data: {\r\n contactAddressId: id,\r\n contactId: entityId,\r\n note: note ?? '',\r\n },\r\n });\r\n\r\n replaceAddress(id, updated);\r\n };\r\n\r\n const handleSave = async () => {\r\n setIsSaving(true);\r\n\r\n if (addressIsSaved) {\r\n await handleUpdateAddress();\r\n setIsSaving(false);\r\n } else {\r\n const newAddress = await handleSetAddress(channelType);\r\n if (newAddress) setIsSaving(false);\r\n }\r\n };\r\n\r\n const handleLinkAccountSave = async () => {\r\n setIsSaving(true);\r\n const newAddress = await handleSetAddress(13 as unknown as ChannelType);\r\n if (newAddress && addWhatsappVerified) {\r\n addWhatsappVerified(newAddress);\r\n }\r\n if (newAddress) setIsSaving(false);\r\n };\r\n\r\n return (\r\n <Box\r\n sx={{\r\n ...noteDeleteButtonStyle.container,\r\n }}\r\n >\r\n {addressIsSaved && (\r\n <TextField\r\n size=\"small\"\r\n label={t('global.note')}\r\n variant=\"outlined\"\r\n onChange={(e) => props.handleNoteFieldChange(e, id, channelType)}\r\n value={note}\r\n fullWidth\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n className=\"contacts-smallInput\"\r\n sx={noteDeleteButtonStyle.noteTextField}\r\n />\r\n )}\r\n <IconButton onClick={handleSave}>\r\n {isSaving ? <CircularProgress size={24} /> : <SaveIcon color=\"primary\" />}\r\n </IconButton>\r\n <OptionsMenu\r\n onDelete={() => props.handleDeleteAddress(id, channelType)}\r\n addressData={props.addressData as any}\r\n handleLinkAccountSave={handleLinkAccountSave}\r\n checked={checked && !isSaving} // Pass the checked prop to OptionsMenu\r\n onCheckContactAddress={async (type) => {\r\n if (!api) return null;\r\n try {\r\n return await api.checkContactAddress({\r\n data: {\r\n address,\r\n type,\r\n },\r\n });\r\n } catch {\r\n return null;\r\n }\r\n }}\r\n />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default NoteDeleteButton;\r\n","const informationItemInputsContainerStyle = {\r\n container: {\r\n display: 'flex',\r\n gap: '100px',\r\n alignItems: 'center',\r\n },\r\n};\r\n\r\nexport default informationItemInputsContainerStyle;\r\n","// Types\r\nimport type { ReactNode } from 'react';\r\n// Components/ui\r\nimport informationItemInputsContainerStyle from './style';\r\nimport { Box } from '@mui/material';\r\n\r\ntype Props = {\r\n children: ReactNode;\r\n};\r\n\r\nconst InformationItemInputsContainer = ({ children }: Props) => {\r\n return <Box sx={informationItemInputsContainerStyle.container}>{children}</Box>;\r\n};\r\n\r\nexport default InformationItemInputsContainer;\r\n","const subsectionBodyContainerStyle = {\r\n container: {\r\n width: '100%',\r\n borderRadius: 1,\r\n px: 1.5,\r\n py: 2,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 2,\r\n overflow: 'auto',\r\n maxHeight: 'calc(100vh - 250px)',\r\n\r\n },\r\n};\r\n\r\nexport default subsectionBodyContainerStyle;\r\n","// Components/ui\r\nimport subsectionBodyContainerStyle from './style';\r\nimport { Box } from '@mui/material';\r\n// Types\r\nimport type { ReactNode } from 'react';\r\n\r\ntype Props = {\r\n children: ReactNode;\r\n variant?: 'large' | 'default';\r\n};\r\n\r\nconst SubsectionBodyContainer = ({ children }: Props) => {\r\n return (\r\n <Box\r\n sx={{\r\n ...subsectionBodyContainerStyle.container,\r\n }}\r\n >\r\n {children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SubsectionBodyContainer;\r\n","import CheckRoundedIcon from '@mui/icons-material/CheckRounded';\r\nimport CloseRoundedIcon from '@mui/icons-material/CloseRounded';\r\nimport CircularProgress from '@mui/material/CircularProgress';\r\nimport { AdornmentStatus } from '../../StatusAdornment';\r\n\r\nconst Adornment = ({ status }: { status:AdornmentStatus }) => {\r\n switch (status) {\r\n case 'idle':\r\n return null;\r\n case 'loading':\r\n return <CircularProgress size={20} />;\r\n case 'available':\r\n return <CheckRoundedIcon style={{ height: 27, width: 27 }} color=\"success\" />;\r\n case 'unavailable':\r\n return <CloseRoundedIcon style={{ height: 27, width: 27 }} color=\"error\" />;\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nexport default Adornment;\r\n","// Components/ui\r\nimport { Adornment } from './components';\r\nimport InputAdornment from '@mui/material/InputAdornment';\r\nimport Typography from '@mui/material/Typography';\r\n\r\nexport type AdornmentStatus = 'idle' | 'loading' | 'available' | 'unavailable';\r\n\r\ntype StatusAdornmentProps = {\r\n status: AdornmentStatus;\r\n text?: string;\r\n};\r\n\r\nconst StatusAdornment = ({ status, text }: StatusAdornmentProps) => {\r\n\r\n const textAdornment = text ? (\r\n <Typography marginRight={0.5}>\r\n {text}\r\n </Typography>\r\n ) : null;\r\n\r\n return (\r\n <InputAdornment position=\"end\">\r\n {textAdornment}\r\n <div style={{ width: 30, display: 'flex', justifyContent: 'center' }}>\r\n <Adornment status={status} />\r\n </div>\r\n </InputAdornment>\r\n );\r\n};\r\n\r\nexport default StatusAdornment;\r\n","const imsStyle = {\r\n code: {\r\n width: '60%',\r\n color: 'gray',\r\n },\r\n};\r\n\r\nexport default imsStyle;\r\n","// Components/ui\r\nimport {\r\n InformationItemContainer,\r\n InformationItemInputsContainer,\r\n NoteDeleteButton,\r\n} from '../../../../../../shared';\r\nimport { Typography } from '@mui/material';\r\nimport imsStyle from './style';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport UseEditBusiness from '../../../../../../../../../../../hooks/useEditBusiness/types/UseEditBusiness';\r\nimport UseEditContact from '../../../../../../../../../../../hooks/useEditContact/types/UseEditContact';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n editEntity: UseEditBusiness | UseEditContact;\r\n};\r\n\r\nconst Ims = ({ data, editEntity }: Props) => {\r\n const editActions = editEntity.action;\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Typography sx={imsStyle.code} variant=\"body2\">\r\n {data.address}\r\n </Typography>\r\n <NoteDeleteButton\r\n addressData={data}\r\n handleNoteFieldChange={editActions.handleNoteFieldChange}\r\n handleDeleteAddress={editActions.handleDeleteAddress}\r\n />\r\n </InformationItemInputsContainer>\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default Ims;\r\n","// Components/ui\r\nimport { Ims } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport SubsectionBodyContainer from '../../../../shared/SubsectionBodyContainer';\r\nimport UseEditContact from '../../../../../../../../../hooks/useEditContact/types/UseEditContact';\r\nimport UseEditBusiness from '../../../../../../../../../hooks/useEditBusiness/types/UseEditBusiness';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n IMSs: NewAddress[] | IContactAddress[];\r\n editEntity: UseEditBusiness | UseEditContact;\r\n};\r\n\r\nconst Body = ({ IMSs, editEntity }: Props) => {\r\n return (\r\n <SubsectionBodyContainer>\r\n {IMSs?.map((ims) => (\r\n <Ims key={ims.id} data={ims} editEntity={editEntity} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Body } from './components';\r\nimport { SubsectionHeader } from '..';\r\n// Types\r\nimport { Box } from '@mui/material';\r\nimport UseEditBusiness from '../../../../../../../hooks/useEditBusiness/types/UseEditBusiness';\r\nimport UseEditContact from '../../../../../../../hooks/useEditContact/types/UseEditContact';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\n\r\ntype Props = {\r\n editEntity: UseEditBusiness | UseEditContact;\r\n title: string;\r\n IMSs: IContactAddress[] | NewAddress[];\r\n};\r\n\r\nconst InformationSocialNetworkItem = ({ editEntity, title, IMSs }: Props) => {\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeader title={title} />\r\n <Body IMSs={IMSs} editEntity={editEntity} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default InformationSocialNetworkItem;\r\n","export const style = {\r\n addressField: {\r\n // width: '35%',\r\n },\r\n};\r\n","import { Dispatch, useEffect, useState } from 'react';\r\n// Components/ui\r\nimport { TextField } from '@mui/material';\r\nimport { style } from './style';\r\nimport StatusAdornment from '../../shared/StatusAdornment';\r\n// Types\r\nimport type { ChangeEvent } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { AdornmentStatus } from '../../shared/StatusAdornment/StatusAdornment';\r\nimport { SetStateAction } from 'react';\r\nimport { CheckContactAddressData } from '../../types/CheckContactAddressData';\r\nimport { useEditContactApi } from '../../../../../../../context/EditContactApiContext';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ninterface AddressInputProps {\r\n data: NewAddress | IContactAddress;\r\n onChange: (\r\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n id: string,\r\n channelType: ChannelType,\r\n ) => void;\r\n setWarnings: Dispatch<SetStateAction<string[]>>;\r\n}\r\n\r\nconst AddressInput = ({ data, onChange, setWarnings }: AddressInputProps) => {\r\n const { id, channelType, address } = data;\r\n const t = useTranslationContext();\r\n\r\n const api = useEditContactApi();\r\n\r\n const [adornmentStatus, setAdornmentStatus] = useState<AdornmentStatus>('idle');\r\n const [lastSearch, setLastSearch] = useState(address);\r\n const addressIsSaved = !data.hasOwnProperty('isSaved');\r\n\r\n useEffect(() => {\r\n let timer = setTimeout(async () => {\r\n if (address !== '' && address !== lastSearch) {\r\n if (!api) {\r\n return;\r\n }\r\n\r\n setAdornmentStatus('loading');\r\n setLastSearch(address);\r\n\r\n const checkContactAddressData: CheckContactAddressData = {\r\n address,\r\n type: channelType,\r\n };\r\n try {\r\n const response = await api.checkContactAddress({ data: checkContactAddressData });\r\n const { success, warnings } = response;\r\n\r\n setWarnings(warnings);\r\n\r\n success ? setAdornmentStatus('available') : setAdornmentStatus('unavailable');\r\n } catch {\r\n setWarnings([]);\r\n setAdornmentStatus('unavailable');\r\n }\r\n }\r\n }, 1700);\r\n\r\n return () => clearTimeout(timer);\r\n }, [api, data, address, channelType, lastSearch, setWarnings]);\r\n\r\n return (\r\n <>\r\n <TextField\r\n disabled={addressIsSaved}\r\n sx={style.addressField}\r\n size=\"small\"\r\n label={\r\n channelType === ChannelType.WHATSAPP || channelType === ChannelType.RCS\r\n ? t\r\n ? t('global.number')\r\n : 'Number'\r\n : t\r\n ? t('global.email')\r\n : 'Email'\r\n }\r\n value={address}\r\n onChange={(e) => {\r\n onChange(e, id, channelType);\r\n }}\r\n variant=\"outlined\"\r\n fullWidth\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n className=\"contacts-smallInput\"\r\n InputProps={{\r\n endAdornment: (\r\n <>\r\n <StatusAdornment status={adornmentStatus} />\r\n </>\r\n ),\r\n }}\r\n />\r\n {}\r\n </>\r\n );\r\n};\r\n\r\nexport default AddressInput;\r\n","export const style = {\r\n addressField: {\r\n // width: '35%',\r\n },\r\n};\r\n","import { Dispatch, useEffect, useState } from 'react';\r\n// Components/ui\r\nimport { TextField } from '@mui/material';\r\nimport { style } from './style';\r\nimport StatusAdornment from '../../shared/StatusAdornment';\r\n// Types\r\nimport type { ChangeEvent } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { AdornmentStatus } from '../../shared/StatusAdornment/StatusAdornment';\r\nimport { SetStateAction } from 'react';\r\nimport { CheckContactAddressData } from '../../types/CheckContactAddressData';\r\nimport { useEditContactApi } from '../../../../../../../context/EditContactApiContext';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ninterface AddressInputProps {\r\n data: NewAddress | IContactAddress;\r\n onChange: (\r\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n id: string,\r\n channelType: ChannelType,\r\n ) => void;\r\n setWarnings: Dispatch<SetStateAction<string[]>>;\r\n}\r\n\r\nconst PhoneInput = ({ data, onChange, setWarnings }: AddressInputProps) => {\r\n const api = useEditContactApi();\r\n const t = useTranslationContext();\r\n const { id, channelType, address } = data;\r\n const [adornmentStatus, setAdornmentStatus] = useState<AdornmentStatus>('idle');\r\n const [lastSearch, setLastSearch] = useState(address);\r\n const addressIsSaved = !data.hasOwnProperty('isSaved');\r\n\r\n useEffect(() => {\r\n let timer = setTimeout(async () => {\r\n if (address !== '' && address !== lastSearch) {\r\n if (!api) {\r\n return;\r\n }\r\n\r\n setAdornmentStatus('loading');\r\n setLastSearch(address);\r\n\r\n const checkContactAddressData: CheckContactAddressData = {\r\n address,\r\n type: channelType,\r\n };\r\n\r\n try {\r\n const { success, warnings } = await api.checkContactAddress({\r\n data: checkContactAddressData,\r\n });\r\n\r\n setWarnings(warnings);\r\n\r\n success ? setAdornmentStatus('available') : setAdornmentStatus('unavailable');\r\n } catch {\r\n setWarnings([]);\r\n setAdornmentStatus('unavailable');\r\n }\r\n }\r\n }, 1700);\r\n\r\n return () => clearTimeout(timer);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [data]);\r\n\r\n return (\r\n <>\r\n <TextField\r\n disabled={addressIsSaved}\r\n sx={style.addressField}\r\n size=\"small\"\r\n label={t('global.number')}\r\n value={address}\r\n onChange={(e) => {\r\n onChange(e, id, channelType);\r\n }}\r\n variant=\"outlined\"\r\n fullWidth\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n className=\"contacts-smallInput\"\r\n InputProps={{\r\n endAdornment: (\r\n <>\r\n <StatusAdornment status={adornmentStatus} />\r\n </>\r\n ),\r\n }}\r\n />\r\n {}\r\n </>\r\n );\r\n};\r\n\r\nexport default PhoneInput;\r\n","export const style = {\r\n secondaryContainer: {\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n height: '100%',\r\n gap: 0.5,\r\n },\r\n icon: { height: 15 },\r\n chip: {\r\n borderRadius: '6px',\r\n height: '22px'\r\n }\r\n};\r\n","// Components/ui\r\nimport { Grid, Box } from '@mui/material';\r\nimport { style } from './style';\r\nimport WarningIcon from '@mui/icons-material/Warning';\r\nimport Chip from '@mui/material/Chip';\r\n\r\ntype WarningProps = {\r\n text: string;\r\n};\r\n\r\nconst Warning = ({ text }: WarningProps) => {\r\n return (\r\n <Grid item >\r\n <Box sx={style.secondaryContainer}>\r\n <Chip icon={<WarningIcon sx={style.icon} />} sx={style.chip} label={text} color=\"error\" variant='outlined' />\r\n </Box>\r\n </Grid>\r\n );\r\n};\r\n\r\nexport default Warning;\r\n","// Components/ui\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\nimport { Warning } from './components';\r\nimport { Box, Grid } from '@mui/material';\r\n\r\ntype WarningsDisplayProps = {\r\n warnings: string[];\r\n};\r\n\r\nconst WarningsDisplay = ({ warnings }: WarningsDisplayProps) => {\r\n const t = useTranslationContext();\r\n\r\n return (\r\n <Box>\r\n <Grid container>\r\n {warnings?.map((warning, i) => (\r\n <Warning key={i} text={t(`contactAddressError.${warning}`)} />\r\n ))}\r\n </Grid>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default WarningsDisplay;\r\n","const phoneStyle = {\r\n numberCountryContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n width: '50%',\r\n },\r\n warningMessage: {\r\n // position: \"absolute\",\r\n // bottom: \"-30px\",\r\n marginTop: \"10px\"\r\n },\r\n adressInputBox: {\r\n position: \"relative\",\r\n width: \"45%\"\r\n }\r\n};\r\n\r\nexport default phoneStyle;\r\n","import { useEffect, useState } from 'react';\r\nimport { Box } from '@mui/material';\r\nimport {\r\n InformationItemContainer,\r\n NoteDeleteButton,\r\n InformationItemInputsContainer,\r\n PhoneInput,\r\n WarningsDisplay,\r\n} from '../../../../../../layout';\r\nimport phoneStyle from './style';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { useEditEntity } from '../../../../../../../../../../../context/EditEntityContext';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n};\r\n\r\nconst Phone = ({ data }: Props) => {\r\n const mode = 'edit';\r\n const { editEntity } = useEditEntity();\r\n const editEntityActions = editEntity.action;\r\n const editEntityState = editEntity.state;\r\n const [warnings, setWarnings] = useState<string[]>([]);\r\n const [checked, setChecked] = useState(true);\r\n\r\n useEffect(() => {\r\n setChecked(warnings.length === 0 && (data.address ?? '') !== '');\r\n }, [warnings, data.address]);\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Box sx={{ ...phoneStyle.numberCountryContainer, flexDirection: 'column' }}>\r\n <PhoneInput\r\n data={data}\r\n setWarnings={setWarnings}\r\n onChange={editEntityActions.handleAddressFieldChange}\r\n />\r\n {warnings.length > 0 && <WarningsDisplay warnings={warnings} />}\r\n </Box>\r\n <NoteDeleteButton\r\n mode={mode}\r\n addressData={data}\r\n handleNoteFieldChange={editEntityActions.handleNoteFieldChange}\r\n handleDeleteAddress={editEntityActions.handleDeleteAddress}\r\n isDeletingAddress={editEntityState.isDeletingAddress}\r\n replaceAddress={editEntityActions.replaceAddress}\r\n addWhatsappVerified={(editEntityActions as any).addWhatsappVerified}\r\n checked={checked}\r\n />\r\n </InformationItemInputsContainer>\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default Phone;\r\n","// Components/ui\r\nimport { Phone } from './components';\r\nimport { SubsectionBodyContainer } from '../../../../layout';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n phoneNumbers: Array<NewAddress | IContactAddress>;\r\n};\r\n\r\nconst Body = ({ phoneNumbers }: Props) => {\r\n return (\r\n <SubsectionBodyContainer variant=\"large\">\r\n {phoneNumbers?.map((phone) => (\r\n <Phone key={phone.id} data={phone} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Body } from './components';\r\nimport { SubsectionHeaderWithButton } from '../../layout';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { Box } from '@mui/material';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n phoneNumbers: Array<NewAddress | IContactAddress>;\r\n handleAdd: () => void;\r\n};\r\n\r\nconst Phones = ({ phoneNumbers, handleAdd }: Props) => {\r\n const t = useTranslationContext();\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeaderWithButton handleAdd={handleAdd} title={t('global.phones')} />\r\n <Body phoneNumbers={phoneNumbers} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Phones;\r\n","const mailStyle = {\r\n emailField: {\r\n width: '60%',\r\n },\r\n numberCountryContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n width: '50%',\r\n },\r\n warningMessage: {\r\n position: \"absolute\",\r\n bottom: \"-30px\"\r\n },\r\n adressInputBox: {\r\n position: \"relative\",\r\n width: \"60%\"\r\n }\r\n};\r\n\r\nexport default mailStyle;\r\n","import { useState } from 'react';\r\n// Components/ui\r\nimport {\r\n AddressInput,\r\n InformationItemContainer,\r\n InformationItemInputsContainer,\r\n NoteDeleteButton,\r\n WarningsDisplay,\r\n} from '../../../../../../layout';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { Box } from '@mui/material';\r\nimport mailStyle from './style';\r\nimport { useEditEntity } from '../../../../../../../../../../../context/EditEntityContext';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n};\r\n\r\nconst Mail = ({ data }: Props) => {\r\n const mode = 'edit';\r\n const { editEntity } = useEditEntity();\r\n const editEntityActions = editEntity.action;\r\n const editEntityState = editEntity.state;\r\n const [warnings, setWarnings] = useState<string[]>([]);\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Box sx={mailStyle.numberCountryContainer}>\r\n <Box sx={mailStyle.adressInputBox}>\r\n <AddressInput\r\n data={data}\r\n setWarnings={setWarnings}\r\n onChange={editEntityActions.handleAddressFieldChange}\r\n />\r\n </Box>\r\n </Box>\r\n <NoteDeleteButton\r\n mode={mode}\r\n addressData={data}\r\n handleNoteFieldChange={editEntityActions.handleNoteFieldChange}\r\n handleDeleteAddress={editEntityActions.handleDeleteAddress}\r\n isDeletingAddress={editEntityState.isDeletingAddress}\r\n replaceAddress={editEntityActions.replaceAddress}\r\n />\r\n </InformationItemInputsContainer>\r\n {warnings.length > 0 && <WarningsDisplay warnings={warnings} />}\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default Mail;\r\n","// Components/ui\r\nimport { SubsectionBodyContainer } from '../../../../layout';\r\nimport { Mail } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n emails: Array<NewAddress | IContactAddress>;\r\n};\r\n\r\nconst Body = ({ emails }: Props) => {\r\n return (\r\n <SubsectionBodyContainer variant=\"large\">\r\n {emails?.map((email) => (\r\n <Mail key={email.id} data={email} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Box } from '@mui/material';\r\nimport { SubsectionHeaderWithButton } from '../../layout';\r\nimport { Body } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n emails: Array<NewAddress | IContactAddress>;\r\n handleAdd: () => void;\r\n};\r\nconst Mails = ({ emails, handleAdd }: Props) => {\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeaderWithButton handleAdd={handleAdd} title={'Emails'} />\r\n <Body emails={emails} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Mails;\r\n","const mailStyle = {\r\n emailField: {\r\n width: '60%',\r\n },\r\n numberCountryContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n width: '50%',\r\n },\r\n warningMessage: {\r\n position: \"absolute\",\r\n bottom: \"-30px\"\r\n },\r\n adressInputBox: {\r\n position: \"relative\",\r\n width: \"60%\"\r\n }\r\n};\r\n\r\nexport default mailStyle;\r\n","import { useState } from 'react';\r\n// Components/ui\r\nimport {\r\n AddressInput,\r\n InformationItemContainer,\r\n InformationItemInputsContainer,\r\n NoteDeleteButton,\r\n WarningsDisplay,\r\n} from '../../../../../../layout';\r\nimport { Box } from '@mui/material';\r\nimport mailStyle from './style';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { useEditEntity } from '../../../../../../../../../../../context/EditEntityContext';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n};\r\n\r\nconst Whatsapp = ({ data }: Props) => {\r\n const mode = 'edit';\r\n const { editEntity } = useEditEntity();\r\n const editEntityActions = editEntity.action;\r\n const editEntityState = editEntity.state;\r\n const [warnings, setWarnings] = useState<string[]>([]);\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Box sx={mailStyle.numberCountryContainer}>\r\n <Box sx={mailStyle.adressInputBox}>\r\n <AddressInput\r\n data={data}\r\n setWarnings={setWarnings}\r\n onChange={editEntityActions.handleAddressFieldChange}\r\n />\r\n </Box>\r\n </Box>\r\n <NoteDeleteButton\r\n mode={mode}\r\n addressData={data}\r\n handleNoteFieldChange={editEntityActions.handleNoteFieldChange}\r\n handleDeleteAddress={editEntityActions.handleDeleteAddress}\r\n isDeletingAddress={editEntityState.isDeletingAddress}\r\n replaceAddress={editEntityActions.replaceAddress}\r\n />\r\n </InformationItemInputsContainer>\r\n {warnings.length > 0 && <WarningsDisplay warnings={warnings} />}\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default Whatsapp;\r\n","// Components/ui\r\nimport { SubsectionBodyContainer } from '../../../../layout';\r\nimport { Whatsapp } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n whatsapps: Array<NewAddress | IContactAddress>;\r\n};\r\n\r\nconst Body = ({ whatsapps }: Props) => {\r\n return (\r\n <SubsectionBodyContainer variant=\"large\">\r\n {whatsapps?.map((whatsapp) => (\r\n <Whatsapp key={whatsapp.id} data={whatsapp} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Box } from '@mui/material';\r\nimport { SubsectionHeaderWithButton } from '../../layout';\r\nimport { Body } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n whatsapps: Array<NewAddress | IContactAddress>;\r\n handleAdd: () => void;\r\n};\r\nconst Whatsapps = ({ whatsapps, handleAdd }: Props) => {\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeaderWithButton handleAdd={handleAdd} title={'WhatsApp'} />\r\n <Body whatsapps={whatsapps} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Whatsapps;\r\n","const mailStyle = {\r\n emailField: {\r\n width: '60%',\r\n },\r\n numberCountryContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n width: '50%',\r\n },\r\n warningMessage: {\r\n position: \"absolute\",\r\n bottom: \"-30px\"\r\n },\r\n adressInputBox: {\r\n position: \"relative\",\r\n width: \"60%\"\r\n }\r\n};\r\n\r\nexport default mailStyle;\r\n","import { useState } from 'react';\r\n// Components/ui\r\nimport {\r\n AddressInput,\r\n InformationItemContainer,\r\n InformationItemInputsContainer,\r\n NoteDeleteButton,\r\n WarningsDisplay,\r\n} from '../../../../../../layout';\r\nimport { Box } from '@mui/material';\r\nimport mailStyle from './style';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { useEditEntity } from '../../../../../../../../../../../context/EditEntityContext';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n};\r\n\r\nconst RCS = ({ data }: Props) => {\r\n const mode = 'edit';\r\n const { editEntity } = useEditEntity();\r\n const editEntityActions = editEntity.action;\r\n const editEntityState = editEntity.state;\r\n const [warnings, setWarnings] = useState<string[]>([]);\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Box sx={mailStyle.numberCountryContainer}>\r\n <Box sx={mailStyle.adressInputBox}>\r\n <AddressInput\r\n data={data}\r\n setWarnings={setWarnings}\r\n onChange={editEntityActions.handleAddressFieldChange}\r\n />\r\n </Box>\r\n </Box>\r\n <NoteDeleteButton\r\n mode={mode}\r\n addressData={data}\r\n handleNoteFieldChange={editEntityActions.handleNoteFieldChange}\r\n handleDeleteAddress={editEntityActions.handleDeleteAddress}\r\n isDeletingAddress={editEntityState.isDeletingAddress}\r\n replaceAddress={editEntityActions.replaceAddress}\r\n />\r\n </InformationItemInputsContainer>\r\n {warnings.length > 0 && <WarningsDisplay warnings={warnings} />}\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default RCS;\r\n","// Components/ui\r\nimport { SubsectionBodyContainer } from '../../../../layout';\r\nimport { RCS } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n RCSs: Array<NewAddress | IContactAddress>;\r\n};\r\n\r\nconst Body = ({ RCSs }: Props) => {\r\n return (\r\n <SubsectionBodyContainer variant=\"large\">\r\n {RCSs?.map((data) => (\r\n <RCS key={data.id} data={data} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Box } from '@mui/material';\r\nimport { SubsectionHeaderWithButton } from '../../layout';\r\nimport { Body } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n RCSs: Array<NewAddress | IContactAddress>;\r\n handleAdd: () => void;\r\n};\r\nconst RCSs = ({ RCSs, handleAdd }: Props) => {\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeaderWithButton handleAdd={handleAdd} title={'RCS'} />\r\n <Body RCSs={RCSs} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default RCSs;\r\n","// Components/ui\r\nimport { Modal, Box, Typography, Button } from '@mui/material';\r\nimport { styled } from '@mui/system';\r\nimport { Mails, Phones, RCSs, Whatsapps } from './components';\r\n// Hooks\r\nimport { InformationSocialNetworkItem } from './layout';\r\nimport { useEditEntity } from '../../../../../context/EditEntityContext';\r\nimport { useTranslationContext } from '../../../../../context/TranslationContext';\r\n\r\ninterface EditModalProps {\r\n open: boolean;\r\n onClose: () => void;\r\n title: string;\r\n}\r\n\r\nconst StyledModalContent = styled(Box)(({ theme }) => ({\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 1000,\r\n backgroundColor: theme.palette.background.paper,\r\n padding: theme.spacing(4),\r\n borderRadius: theme.shape.borderRadius,\r\n}));\r\n\r\nconst EditModal: React.FC<EditModalProps> = ({ open, onClose, title }) => {\r\n const t = useTranslationContext();\r\n const { editEntity } = useEditEntity();\r\n const { emails, phoneNumbers, imsWhatsapp, imsRCS } = editEntity.field;\r\n const { addEmail, addPhone, addWhatsapp, resetToInitialContactInformation, addRCS } =\r\n editEntity.action;\r\n\r\n function handleClose() {\r\n onClose();\r\n resetToInitialContactInformation();\r\n }\r\n\r\n const renderContent = () => {\r\n switch (title) {\r\n case 'Phones':\r\n return <Phones handleAdd={addPhone} phoneNumbers={phoneNumbers} />;\r\n case 'Emails':\r\n return <Mails handleAdd={addEmail} emails={emails} />;\r\n\r\n case 'Whatsapp':\r\n return <Whatsapps handleAdd={addWhatsapp} whatsapps={imsWhatsapp} />;\r\n case 'RCS':\r\n return <RCSs handleAdd={addRCS} RCSs={imsRCS} />;\r\n\r\n case 'Facebook':\r\n return (\r\n <InformationSocialNetworkItem\r\n title={'Facebook'}\r\n IMSs={editEntity.field.imsFacebooks}\r\n editEntity={editEntity}\r\n />\r\n );\r\n case 'Webchat':\r\n return (\r\n <InformationSocialNetworkItem\r\n title={'Webchat'}\r\n IMSs={editEntity.field.imsWebchats}\r\n editEntity={editEntity}\r\n />\r\n );\r\n case 'Instagram':\r\n return (\r\n <InformationSocialNetworkItem\r\n title={'Instagram'}\r\n IMSs={editEntity.field.imsInstagrams}\r\n editEntity={editEntity}\r\n />\r\n );\r\n case 'Mercado libre':\r\n return (\r\n <InformationSocialNetworkItem\r\n title={'Mercado Libre'}\r\n IMSs={editEntity.field.imsMercadolibre}\r\n editEntity={editEntity}\r\n />\r\n );\r\n default:\r\n return <Typography>No information available for this section.</Typography>;\r\n }\r\n };\r\n\r\n return (\r\n <Modal open={open} onClose={onClose}>\r\n <StyledModalContent>\r\n {renderContent()}\r\n <Box mt={2} display={'flex'} justifyContent={'flex-end'}>\r\n <Button variant=\"contained\" color=\"primary\" onClick={handleClose}>\r\n {t('global.close')}\r\n </Button>\r\n </Box>\r\n </StyledModalContent>\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default EditModal;\r\n","import { Section } from '../../../layout';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport type { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\nimport useEditModal from './hooks/useEditModal';\r\nimport { EditModal, ContactMethod } from './components';\r\nimport { useEditEntity } from '../../../context/EditEntityContext';\r\nimport { useTranslationContext } from '../../../context/TranslationContext';\r\n\r\ntype OwnerData = IContact | IBusiness;\r\n\r\ninterface Props {\r\n ownerData: OwnerData;\r\n}\r\n\r\nconst ContactInformation = ({ ownerData }: Props) => {\r\n const { isOpen, title, openModal, closeModal } = useEditModal();\r\n const { editEntity } = useEditEntity();\r\n const t = useTranslationContext();\r\n\r\n const phones: IContactAddress[] = editEntity.field.phoneNumbers;\r\n const emails: IContactAddress[] = editEntity.field.emails;\r\n const facebook: IContactAddress[] = editEntity.field.imsFacebooks;\r\n const whatsapp: IContactAddress[] = editEntity.field.imsWhatsapp;\r\n const mercadolibre: IContactAddress[] = editEntity.field.imsMercadolibre;\r\n const webchat: IContactAddress[] = editEntity.field.imsWebchats;\r\n const instagram: IContactAddress[] = editEntity.field.imsInstagrams;\r\n const rcs: IContactAddress[] = editEntity.field.imsRCS;\r\n\r\n const contactMethods = [\r\n {\r\n key: 'phones',\r\n title: t('conversations.contactDetails.phones'),\r\n items: phones,\r\n isPhone: true,\r\n modalTitle: 'Phones',\r\n visible: true,\r\n },\r\n {\r\n key: 'emails',\r\n title: 'Emails',\r\n items: emails,\r\n modalTitle: 'Emails',\r\n visible: true,\r\n },\r\n {\r\n key: 'facebook',\r\n title: 'Facebook',\r\n items: facebook,\r\n modalTitle: 'Facebook',\r\n visible: true,\r\n },\r\n {\r\n key: 'whatsapp',\r\n title: 'Whatsapp',\r\n items: whatsapp,\r\n modalTitle: 'Whatsapp',\r\n visible: true,\r\n },\r\n {\r\n key: 'rcs',\r\n title: 'RCS',\r\n items: rcs,\r\n modalTitle: 'RCS',\r\n visible: rcs.length > 0,\r\n },\r\n {\r\n key: 'mercado-libre',\r\n title: 'Mercado libre',\r\n items: mercadolibre,\r\n modalTitle: 'Mercado libre',\r\n visible: true,\r\n },\r\n {\r\n key: 'webchat',\r\n title: 'Webchat',\r\n items: webchat,\r\n modalTitle: 'Webchat',\r\n visible: true,\r\n },\r\n {\r\n key: 'instagram',\r\n title: 'Instagram',\r\n items: instagram,\r\n modalTitle: 'Instagram',\r\n visible: true,\r\n },\r\n ];\r\n\r\n return (\r\n <>\r\n <Section title={t('conversations.contactDetails.contactInformation')}>\r\n <div className=\"grid grid-cols-1 gap-3\">\r\n {contactMethods\r\n .filter((method) => method.visible)\r\n .map((method) => (\r\n <ContactMethod\r\n key={method.key}\r\n handleEdit={() => openModal(method.modalTitle)}\r\n title={method.title}\r\n methodItems={method.items}\r\n isPhone={method.isPhone}\r\n owner={ownerData}\r\n />\r\n ))}\r\n </div>\r\n </Section>\r\n <EditModal open={isOpen} onClose={closeModal} title={title} />\r\n </>\r\n );\r\n};\r\n\r\nexport default ContactInformation;\r\n","import type { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\nimport { Section } from '../../../layout';\r\nimport { EntityInfoLabel } from '../../../shared';\r\nimport { useTranslationContext } from '../../../context/TranslationContext';\r\nimport { Typography } from '@mui/material';\r\n\r\nexport type AddressInformationProps = {\r\n entityType: 'contact' | 'business';\r\n entityData: IContact | IBusiness;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n onDirectionSearchClick?: () => void;\r\n};\r\n\r\nconst AddressInformation = ({\r\n entityType,\r\n entityData,\r\n baseUrl,\r\n spaceId,\r\n onEntityUpdated,\r\n onDirectionSearchClick,\r\n}: AddressInformationProps) => {\r\n const commonProps = {\r\n baseUrl,\r\n spaceId,\r\n entityId: String((entityData as any).id),\r\n onEntityUpdated,\r\n };\r\n const t = useTranslationContext();\r\n\r\n const AddressGroup = ({\r\n addressNumber,\r\n title,\r\n }: {\r\n addressNumber: 'address1' | 'address2';\r\n title: string;\r\n }) => (\r\n <div className=\"flex flex-col gap-4 rounded-xl p-4\">\r\n <Typography variant=\"body2\">{title}</Typography>\r\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-3\">\r\n {/* Street takes full width */}\r\n <div className=\"col-span-2\">\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.street')}\r\n value={entityData[addressNumber]?.street ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { street: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n </div>\r\n\r\n {/* City & State share a row */}\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.city')}\r\n value={entityData[addressNumber]?.city ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { city: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.state')}\r\n value={entityData[addressNumber]?.state ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { state: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n\r\n {/* Postcode & Country share a row */}\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.postcode')}\r\n value={entityData[addressNumber]?.zipcode ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { zipcode: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.country')}\r\n value={entityData[addressNumber]?.country ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { country: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <Section\r\n title={t('conversations.contactDetails.addressInformation')}\r\n enableDirectionSearch={true}\r\n onDirectionSearchClick={onDirectionSearchClick}\r\n >\r\n <div className=\"flex flex-col gap-4\">\r\n <AddressGroup\r\n addressNumber=\"address1\"\r\n title={t('conversations.contactDetails.primaryAddress')}\r\n />\r\n <AddressGroup\r\n addressNumber=\"address2\"\r\n title={t('conversations.contactDetails.secondaryAddress')}\r\n />\r\n </div>\r\n </Section>\r\n );\r\n};\r\n\r\nexport default AddressInformation;\r\n","import { useCallback } from 'react';\r\nimport type { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\n\r\ntype Entity = IContact | IBusiness | null;\r\n\r\ntype UseEntityUpdateSyncArgs = {\r\n entity: Entity;\r\n setEntity: (next: IContact | IBusiness | null) => void;\r\n};\r\n\r\nexport const useEntityUpdateSync = ({ entity, setEntity }: UseEntityUpdateSyncArgs) => {\r\n const handleEntityUpdated = useCallback(\r\n (update: unknown) => {\r\n if (!update || typeof update !== 'object') {\r\n return;\r\n }\r\n\r\n const updateObj = update as Record<string, unknown>;\r\n\r\n if ('id' in updateObj) {\r\n // Full entity replacement\r\n setEntity(update as IContact | IBusiness);\r\n return;\r\n }\r\n\r\n if (!entity) {\r\n return;\r\n }\r\n\r\n // Shallow merge partial updates into existing entity\r\n const merged = { ...(entity as any), ...updateObj };\r\n setEntity(merged as IContact | IBusiness);\r\n },\r\n [entity, setEntity],\r\n );\r\n\r\n return handleEntityUpdated;\r\n};\r\n","import { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport type { ILabel } from '@trii/types/dist/Contacts';\r\nimport type { IBusiness, IContact, IContactTag } from '@trii/types/dist/Contacts/contacts';\r\nimport { createLabel, updateEntity } from '../services/api';\r\n\r\ntype ContactType = 'contact' | 'business' | 'unknown';\r\n\r\ntype UseTagsEditorControllerArgs = {\r\n open: boolean;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n contactData: IContact | IBusiness | null;\r\n contactType: ContactType;\r\n labels: ILabel[];\r\n selectedTags: IContactTag[];\r\n onTagsUpdated: (tags: IContactTag[]) => void;\r\n};\r\n\r\ntype UseTagsEditorControllerReturn = {\r\n view: 'main' | 'tags' | 'searchLocation' | 'businessSelect';\r\n setView: (view: 'main' | 'tags' | 'searchLocation' | 'businessSelect') => void;\r\n draftLabels: ILabel[];\r\n setDraftLabels: (labels: ILabel[]) => void;\r\n labelsOptions: ILabel[];\r\n isSaving: boolean;\r\n isCreatingLabel: boolean;\r\n handleCreateLabel: (name: string) => Promise<void>;\r\n handleSaveTags: () => Promise<void>;\r\n};\r\n\r\nexport const useTagsEditorController = ({\r\n open,\r\n baseUrl,\r\n spaceId,\r\n contactData,\r\n contactType,\r\n labels,\r\n selectedTags,\r\n onTagsUpdated,\r\n}: UseTagsEditorControllerArgs): UseTagsEditorControllerReturn => {\r\n const [view, setView] = useState<'main' | 'tags' | 'searchLocation' | 'businessSelect'>('main');\r\n const [draftLabels, setDraftLabels] = useState<ILabel[]>([]);\r\n const [tagsEditorInitialized, setTagsEditorInitialized] = useState(false);\r\n const [isSaving, setIsSaving] = useState(false);\r\n const [createdLabels, setCreatedLabels] = useState<ILabel[]>([]);\r\n const [isCreatingLabel, setIsCreatingLabel] = useState(false);\r\n\r\n const labelsOptions = useMemo(() => {\r\n const safeLabels = labels ?? [];\r\n const safeCreated = createdLabels ?? [];\r\n\r\n const byId = new Map<string, ILabel>();\r\n for (const label of safeLabels) {\r\n if (!label?.id) continue;\r\n byId.set(String(label.id), label);\r\n }\r\n for (const label of safeCreated) {\r\n if (!label?.id) continue;\r\n byId.set(String(label.id), label);\r\n }\r\n\r\n return Array.from(byId.values());\r\n }, [labels, createdLabels]);\r\n\r\n const reset = useCallback(() => {\r\n setView('main');\r\n setDraftLabels([]);\r\n setTagsEditorInitialized(false);\r\n setIsSaving(false);\r\n setCreatedLabels([]);\r\n setIsCreatingLabel(false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!open) {\r\n reset();\r\n }\r\n }, [open, reset]);\r\n\r\n useEffect(() => {\r\n if (view !== 'tags') {\r\n setTagsEditorInitialized(false);\r\n return;\r\n }\r\n\r\n if (tagsEditorInitialized) return;\r\n if (!labelsOptions.length) return;\r\n\r\n const selectedTagIds = new Set(selectedTags.map((t) => String(t.id)));\r\n const initialDraft = labelsOptions.filter((l) => selectedTagIds.has(String(l?.id)));\r\n\r\n setDraftLabels(initialDraft);\r\n setTagsEditorInitialized(true);\r\n }, [view, tagsEditorInitialized, labelsOptions, selectedTags]);\r\n\r\n const handleCreateLabel = useCallback(\r\n async (name: string) => {\r\n if (isCreatingLabel) return;\r\n if (!baseUrl || !spaceId) return;\r\n\r\n const trimmedName = String(name ?? '').trim();\r\n if (!trimmedName) return;\r\n\r\n const normalizedName = trimmedName.toLowerCase();\r\n const existing = labelsOptions.find(\r\n (l) =>\r\n String(l?.name ?? '')\r\n .trim()\r\n .toLowerCase() === normalizedName,\r\n );\r\n\r\n if (existing?.id) {\r\n setDraftLabels((prev) => {\r\n const safePrev = prev ?? [];\r\n const existsInDraft = safePrev.some((p) => String(p?.id) === String(existing.id));\r\n if (existsInDraft) return safePrev;\r\n return [...safePrev, existing];\r\n });\r\n return;\r\n }\r\n\r\n setIsCreatingLabel(true);\r\n try {\r\n const created = await createLabel({ baseUrl, spaceId, name: trimmedName });\r\n\r\n setCreatedLabels((prev) => {\r\n const safePrev = prev ?? [];\r\n if (!created?.id) return safePrev;\r\n const existsInCreated = safePrev.some((p) => String(p?.id) === String(created.id));\r\n if (existsInCreated) return safePrev;\r\n return [...safePrev, created];\r\n });\r\n\r\n setDraftLabels((prev) => {\r\n const safePrev = prev ?? [];\r\n if (!created?.id) return safePrev;\r\n const existsInDraft = safePrev.some((p) => String(p?.id) === String(created.id));\r\n if (existsInDraft) return safePrev;\r\n return [...safePrev, created];\r\n });\r\n } finally {\r\n setIsCreatingLabel(false);\r\n }\r\n },\r\n [isCreatingLabel, baseUrl, spaceId, labelsOptions],\r\n );\r\n\r\n const handleSaveTags = useCallback(async () => {\r\n if (isSaving) return;\r\n if (!baseUrl || !spaceId) return;\r\n if (!contactData) return;\r\n if (contactType !== 'contact' && contactType !== 'business') return;\r\n\r\n const tags: IContactTag[] = draftLabels\r\n .filter((l) => l?.id && l?.name)\r\n .map((l) => ({ id: String(l.id), name: String(l.name) }));\r\n\r\n setIsSaving(true);\r\n try {\r\n await updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType: contactType,\r\n entityId: String((contactData as any).id),\r\n body: { tags },\r\n });\r\n\r\n onTagsUpdated(tags);\r\n setView('main');\r\n } finally {\r\n setIsSaving(false);\r\n }\r\n }, [isSaving, baseUrl, spaceId, contactData, contactType, draftLabels, onTagsUpdated]);\r\n\r\n return {\r\n view,\r\n setView,\r\n draftLabels,\r\n setDraftLabels,\r\n labelsOptions,\r\n isSaving,\r\n isCreatingLabel,\r\n handleCreateLabel,\r\n handleSaveTags,\r\n };\r\n};\r\n","import { useCallback } from 'react';\r\n\r\ntype Reason = 'backdropClick' | 'escapeKeyDown';\r\n\r\ntype UseModalCloseHandlerArgs = {\r\n onClose: () => void;\r\n};\r\n\r\nexport const useModalCloseHandler = ({ onClose }: UseModalCloseHandlerArgs) => {\r\n const handleClose = useCallback(\r\n (_event: unknown, reason?: Reason) => {\r\n if (reason === 'escapeKeyDown') {\r\n return;\r\n }\r\n\r\n onClose();\r\n },\r\n [onClose],\r\n );\r\n\r\n return handleClose;\r\n};\r\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport SaveIcon from '@mui/icons-material/Save';\nimport { LoadingButton } from '@mui/lab';\nimport {\n Autocomplete,\n Box,\n CircularProgress,\n IconButton,\n LinearProgress,\n Stack,\n TextField,\n Typography,\n} from '@mui/material';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { UIEvent } from 'react';\nimport type { UserTrii } from '@trii/types/dist/Users';\n\nimport { useEditContactApi } from '../../context/EditContactApiContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { updateEntity } from '../../services/api';\nimport type { Pagination } from '../../services/api';\n\ntype SimplifiedBusiness = {\n businessId: string;\n businessName: string;\n};\n\ntype Props = {\n baseUrl?: string;\n spaceId?: string;\n contactId?: string;\n initialBusiness?: SimplifiedBusiness | null;\n onBack: () => void;\n onEntityUpdated?: (entity: unknown) => void;\n currentUser?: UserTrii | null;\n};\n\nconst DEFAULT_PAGINATION: Omit<Pagination, 'filter' | 'currentPage'> = {\n format: 'IBusiness',\n total: 0,\n lastPage: 1,\n perPage: 10,\n order: 'ASC',\n orderColumn: 'Id',\n};\n\nconst BusinessSelectEditor = ({\n baseUrl,\n spaceId,\n contactId,\n initialBusiness,\n onBack,\n onEntityUpdated,\n currentUser,\n}: Props) => {\n const t = useTranslationContext();\n const api = useEditContactApi();\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n const [inputValue, setInputValue] = useState(() => initialBusiness?.businessName ?? '');\n const [hasSearched, setHasSearched] = useState(false);\n\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingTimer, setIsLoadingTimer] = useState(false);\n\n const [options, setOptions] = useState<SimplifiedBusiness[]>([]);\n const [selected, setSelected] = useState<SimplifiedBusiness | null>(initialBusiness ?? null);\n\n const [currentPage, setCurrentPage] = useState(1);\n const [isNextPage, setIsNextPage] = useState(false);\n const [allLoaded, setAllLoaded] = useState(false);\n\n const ownerValue = useMemo(() => {\n const displayName = (currentUser as any)?.display_name;\n const email = (currentUser as any)?.email;\n return String(displayName || email || '').trim();\n }, [currentUser]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n abortRef.current?.abort();\n };\n }, []);\n\n useEffect(() => {\n setSelected(initialBusiness ?? null);\n setInputValue(initialBusiness?.businessName ?? '');\n }, [initialBusiness]);\n\n const resetSearchState = () => {\n abortRef.current?.abort();\n abortRef.current = null;\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n setHasSearched(false);\n setAllLoaded(false);\n setCurrentPage(1);\n setIsNextPage(false);\n setOptions([]);\n };\n\n const mapBusinesses = (businesses: Array<{ id: string; name: string }>) => {\n return businesses\n .filter((b) => Boolean(b?.id))\n .map((b) => ({ businessId: String(b.id), businessName: String(b.name ?? '') }));\n };\n\n const fetchPage = async ({ query, page }: { query: string; page: number }) => {\n if (!api) return;\n\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n setIsLoading(true);\n try {\n const pagination: Pagination = {\n ...DEFAULT_PAGINATION,\n currentPage: page,\n filter: [\n {\n value: query,\n column: 'name',\n condition: '',\n },\n ],\n };\n\n const response = await api.fetchBusinessTableData({ pagination, signal: controller.signal });\n if (controller.signal.aborted) return;\n\n const next = mapBusinesses((response?.contactos ?? []) as any);\n setHasSearched(true);\n\n const total = response?.paginacion?.total ?? 0;\n\n setOptions((prev) => {\n const merged =\n page === 1\n ? next\n : (() => {\n const byId = new Map<string, SimplifiedBusiness>();\n for (const item of prev) byId.set(item.businessId, item);\n for (const item of next) byId.set(item.businessId, item);\n return Array.from(byId.values());\n })();\n\n if (total && merged.length >= total) {\n setAllLoaded(true);\n }\n\n return merged;\n });\n } finally {\n setIsLoading(false);\n setIsLoadingTimer(false);\n setIsNextPage(false);\n }\n };\n\n const handleQueryChanged = (value: string) => {\n resetSearchState();\n\n if (!value) return;\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n setIsLoadingTimer(true);\n\n timerRef.current = setTimeout(() => {\n void fetchPage({ query: value, page: 1 });\n }, 800);\n };\n\n const handleScroll = (e: UIEvent<HTMLElement>) => {\n const element = e.target as HTMLElement;\n const bottom = element.scrollHeight - element.scrollTop - element.clientHeight < 1;\n\n if (!bottom) return;\n if (allLoaded) return;\n if (isLoading) return;\n if (!inputValue) return;\n\n const nextPage = currentPage + 1;\n setIsNextPage(true);\n setCurrentPage(nextPage);\n void fetchPage({ query: inputValue, page: nextPage });\n };\n\n const handleCreateBusiness = async () => {\n if (!api) return;\n if (!ownerValue) return;\n\n const name = String(inputValue ?? '').trim();\n if (!name) return;\n\n setIsLoading(true);\n try {\n const business = {\n name,\n owner: ownerValue,\n imageUrl: '',\n members: [],\n tags: [],\n properties: [],\n address1: {\n street: '',\n city: '',\n state: '',\n zipcode: '',\n country: '',\n },\n address2: {\n street: '',\n city: '',\n state: '',\n zipcode: '',\n country: '',\n },\n };\n\n const created = await api.createBusiness({ business });\n const createdOption: SimplifiedBusiness = {\n businessId: String((created as any).id ?? ''),\n businessName: String((created as any).name ?? name),\n };\n\n setOptions([createdOption]);\n setSelected(createdOption);\n setHasSearched(true);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleSave = async () => {\n if (!baseUrl || !spaceId) return;\n if (!contactId) return;\n\n const businessId = selected?.businessId ?? '';\n\n const updated = await updateEntity({\n baseUrl,\n spaceId,\n entityType: 'contact',\n entityId: contactId,\n body: {\n businessId,\n },\n });\n\n onEntityUpdated?.(updated);\n onBack();\n };\n\n const noOptionsNode =\n hasSearched && options.length === 0 && inputValue ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{ px: 1, py: 0.5 }}\n >\n <Typography variant=\"body2\">{t('global.noOptions')}</Typography>\n <LoadingButton\n size=\"small\"\n variant=\"contained\"\n onClick={handleCreateBusiness}\n loading={isLoading}\n disabled={isLoading || !ownerValue}\n >\n {t('global.createNew')}\n </LoadingButton>\n </Stack>\n ) : (\n <Typography variant=\"body2\">{t('global.noOptions')}</Typography>\n );\n\n const isSavingDisabled = !contactId || !baseUrl || !spaceId;\n\n return (\n <Box sx={{ width: '100%' }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 2 }}>\n <IconButton size=\"small\" onClick={onBack} aria-label={t('global.back')}>\n <ArrowBackIcon fontSize=\"small\" />\n </IconButton>\n <Typography variant=\"subtitle1\">{t('conversations.contactDetails.business')}</Typography>\n\n <Box sx={{ flex: 1 }} />\n\n <LoadingButton\n variant=\"contained\"\n size=\"small\"\n startIcon={<SaveIcon />}\n onClick={handleSave}\n loading={false}\n disabled={isSavingDisabled}\n >\n {t('global.save')}\n </LoadingButton>\n </Stack>\n\n <Box sx={{ position: 'relative' }}>\n {isLoading || isLoadingTimer || isNextPage ? (\n <Box sx={{ position: 'absolute', left: 0, right: 0, top: 0 }}>\n <LinearProgress sx={{ borderRadius: 1 }} />\n </Box>\n ) : null}\n\n <Autocomplete\n fullWidth\n disablePortal\n value={selected}\n onChange={(event, newValue) => {\n void event;\n setSelected(newValue);\n }}\n inputValue={inputValue}\n onInputChange={(event, newValue, reason) => {\n void event;\n setInputValue(newValue);\n if (reason !== 'input') return;\n handleQueryChanged(newValue);\n }}\n options={options}\n getOptionLabel={(option) => option?.businessName ?? ''}\n isOptionEqualToValue={(opt, val) => opt.businessId === val.businessId}\n noOptionsText={noOptionsNode}\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n label={t('conversations.contactDetails.business')}\n placeholder={t('global.noValue')}\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <>\n {isLoading || isLoadingTimer ? (\n <CircularProgress size={18} sx={{ mr: 1 }} />\n ) : null}\n {params.InputProps.endAdornment}\n </>\n ),\n }}\n />\n )}\n ListboxProps={{\n sx: {\n maxHeight: 240,\n overflowY: 'auto',\n },\n onScroll: handleScroll,\n }}\n />\n </Box>\n </Box>\n );\n};\n\nexport default BusinessSelectEditor;\n","import {\r\n Backdrop,\r\n Box,\r\n CircularProgress,\r\n Fade,\r\n Modal,\r\n SxProps,\r\n Theme,\r\n IconButton,\r\n} from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport Header from './components/Header/Header';\r\nimport TagsEditor from './components/TagsEditor/TagsEditor';\r\nimport SearchLocationEditor from './components/SearchLocation/SearchLocationEditor';\r\n// Hooks\r\nimport { useMemo, useEffect, useRef } from 'react';\r\nimport { useEditContactModalController } from './hooks/useEditContactModalController';\r\nimport useImage from './hooks/useImage';\r\nimport { AddressInformation, ContactInformation, General } from './components/Section';\r\nimport { EditContactApiProvider } from './context/EditContactApiContext';\r\nimport { TranslationProvider } from './context/TranslationContext';\r\nimport { NavigateProvider } from './context/NavigateContext';\r\nimport { EditContactViewProvider } from './context/EditContactViewContext';\r\n// Services\r\nimport { createEditContactApi } from './services/api';\r\nimport { EditEntityProvider } from './context/EditEntityContext';\r\nimport { useEntityUpdateSync } from './hooks/useEntityUpdateSync';\r\nimport { useTagsEditorController } from './hooks/useTagsEditorController';\r\nimport { useModalCloseHandler } from './hooks/useModalCloseHandler';\r\nimport { useTranslation, I18nextProvider } from 'react-i18next';\r\nimport i18nInstance from '../../i18n/config';\r\nimport BusinessSelectEditor from './components/BusinessSelect/BusinessSelectEditor';\r\n\r\nexport interface Props {\r\n open: boolean;\r\n onClose: () => void;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n contactId?: string;\r\n language?: 'en' | 'es';\r\n sx?: SxProps<Theme>;\r\n navigate: (path: string) => void;\r\n googleMapsApiKey?: string;\r\n}\r\n\r\nconst EditContactModalContent = ({\r\n open,\r\n onClose,\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n sx,\r\n language = 'en',\r\n navigate,\r\n googleMapsApiKey,\r\n}: Props) => {\r\n const { t: i18nT, i18n } = useTranslation();\r\n\r\n const modalContentRef = useRef<HTMLDivElement | null>(null);\r\n\r\n useEffect(() => {\r\n // Check if Google Maps is already loaded or loading\r\n if (\r\n (window as any).google?.maps ||\r\n document.querySelector('script[src^=\"https://maps.googleapis.com/maps/api/js\"]')\r\n ) {\r\n return;\r\n }\r\n\r\n if (!googleMapsApiKey) {\r\n console.warn('Google Maps API key is missing. The location search feature will not work.');\r\n return;\r\n }\r\n\r\n // Load the google maps script and append it to the document body\r\n const script = document.createElement('script');\r\n script.src = `https://maps.googleapis.com/maps/api/js?key=${googleMapsApiKey}&libraries=places`;\r\n script.async = true;\r\n script.defer = true;\r\n document.body.appendChild(script);\r\n\r\n // We typically don't remove the Google Maps script on unmount as it may be used by other components\r\n // and the API is designed to be loaded once.\r\n return () => {\r\n // document.body.removeChild(script);\r\n };\r\n }, [googleMapsApiKey]);\r\n\r\n useEffect(() => {\r\n if (language) {\r\n i18n.changeLanguage(language);\r\n }\r\n }, [language, i18n]);\r\n\r\n const t = (key: string) => i18nT(key);\r\n\r\n const api = useMemo(() => {\r\n if (!baseUrl || !spaceId) return null;\r\n return createEditContactApi(baseUrl, spaceId);\r\n }, [baseUrl, spaceId]);\r\n\r\n const { state, selectors, actions } = useEditContactModalController({\r\n open,\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n });\r\n\r\n const handleEntityUpdated = useEntityUpdateSync({\r\n entity: state.contactData,\r\n setEntity: (next) => actions.setContactData(next ?? undefined),\r\n });\r\n\r\n const {\r\n view,\r\n setView,\r\n draftLabels,\r\n setDraftLabels,\r\n labelsOptions,\r\n isSaving: isSavingTags,\r\n isCreatingLabel,\r\n handleCreateLabel,\r\n handleSaveTags,\r\n } = useTagsEditorController({\r\n open,\r\n baseUrl,\r\n spaceId,\r\n contactData: state.contactData,\r\n contactType: selectors.contactType,\r\n labels: selectors.labels,\r\n selectedTags: selectors.tags,\r\n onTagsUpdated: (tags) => {\r\n if (!state.contactData) return;\r\n actions.setContactData({ ...(state.contactData as any), tags });\r\n },\r\n });\r\n\r\n const image = useImage({\r\n baseUrl,\r\n spaceId,\r\n entityType:\r\n selectors.contactType === 'business' || selectors.contactType === 'contact'\r\n ? selectors.contactType\r\n : undefined,\r\n entityId: state.contactData ? String((state.contactData as any).id) : undefined,\r\n initialImageUrl: state.contactData?.imageUrl,\r\n onEntityUpdated: handleEntityUpdated,\r\n });\r\n\r\n const handleClose = useModalCloseHandler({ onClose });\r\n\r\n const baseSx: SxProps<Theme> = {\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 'min(640px, calc(100vw - 32px))',\r\n height: 'min(560px, calc(100vh - 64px))',\r\n bgcolor: 'background.paper',\r\n borderRadius: 3,\r\n boxShadow: 24,\r\n outline: 0,\r\n p: 3,\r\n overflow: 'visible',\r\n };\r\n\r\n const mergedSx: SxProps<Theme> = Array.isArray(sx) ? [baseSx, ...sx] : sx ? [baseSx, sx] : baseSx;\r\n\r\n return (\r\n <EditContactApiProvider value={api}>\r\n <TranslationProvider t={t}>\r\n <NavigateProvider navigate={navigate}>\r\n <Modal\r\n open={open}\r\n onClose={handleClose}\r\n closeAfterTransition\r\n slots={{ backdrop: Backdrop }}\r\n slotProps={{ backdrop: { timeout: 200 } }}\r\n >\r\n <Fade in={open} timeout={200}>\r\n <Box sx={mergedSx} ref={modalContentRef}>\r\n <IconButton\r\n aria-label=\"close\"\r\n onClick={handleClose}\r\n sx={{\r\n position: 'absolute',\r\n right: 5,\r\n top: 5,\r\n color: (theme) => theme.palette.grey[500],\r\n zIndex: 1,\r\n }}\r\n size=\"small\"\r\n >\r\n <CloseIcon sx={{ fontSize: 20 }} />\r\n </IconButton>\r\n {state.isLoading && !state.contactData ? (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n minHeight: 220,\r\n }}\r\n >\r\n <CircularProgress />\r\n </Box>\r\n ) : state.error ? (\r\n <Box sx={{ mb: 2 }}>Failed to load contact</Box>\r\n ) : state.contactData ? (\r\n <EditContactViewProvider value={{ view, setView }}>\r\n <EditEntityProvider\r\n entityType={selectors.contactType === 'business' ? 'business' : 'contact'}\r\n entityData={state.contactData}\r\n customContactFields={selectors.contactFields}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n >\r\n <Box sx={{ position: 'relative', height: '100%' }}>\r\n <Fade in={view === 'main'} timeout={200} mountOnEnter unmountOnExit>\r\n <Box sx={{ pt: 0.5, position: 'absolute', inset: 0, overflowY: 'auto' }}>\r\n <Header\r\n imgUrl={image.imageUrl}\r\n displayName={selectors.displayName}\r\n tags={selectors.tags}\r\n onEditTags={() => {\r\n setView('tags');\r\n }}\r\n onUploadPhoto={image.action.uploadImage}\r\n onPhotoFileChange={image.inputAtributes.onChange}\r\n photoInputRef={image.inputAtributes.ref}\r\n isUploadingPhoto={image.isUploading}\r\n onDeletePhoto={image.action.deleteImage}\r\n isDeletingPhoto={image.isDeleting}\r\n contactType={selectors.contactType}\r\n entityId={state.contactData?.id}\r\n firstName={\r\n selectors.isContact\r\n ? (state.contactData as any).firstName\r\n : undefined\r\n }\r\n lastName={\r\n selectors.isContact\r\n ? (state.contactData as any).lastName\r\n : undefined\r\n }\r\n name={selectors.isBusiness ? state.contactData.name : undefined}\r\n onEntityUpdated={handleEntityUpdated}\r\n />\r\n <Box sx={{ px: 1, pb: 2 }}>\r\n <General\r\n dateFormat={selectors.userTrii?.regCon_dateFormat || 'MM/dd/yyyy'}\r\n entityType={\r\n selectors.contactType === 'contact' ||\r\n selectors.contactType === 'business'\r\n ? selectors.contactType\r\n : 'contact'\r\n }\r\n entityData={state.contactData}\r\n customContactFields={selectors.contactFields}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={handleEntityUpdated}\r\n currentUser={selectors.userTrii}\r\n />\r\n <AddressInformation\r\n entityType={\r\n selectors.contactType === 'contact' ||\r\n selectors.contactType === 'business'\r\n ? selectors.contactType\r\n : 'contact'\r\n }\r\n entityData={state.contactData}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={handleEntityUpdated}\r\n onDirectionSearchClick={() => setView('searchLocation')}\r\n />\r\n <ContactInformation ownerData={state.contactData} />\r\n </Box>\r\n </Box>\r\n </Fade>\r\n\r\n <Fade\r\n in={view === 'searchLocation'}\r\n timeout={200}\r\n mountOnEnter\r\n unmountOnExit\r\n >\r\n <Box sx={{ pt: 0.5, position: 'absolute', inset: 0, overflowY: 'auto' }}>\r\n <SearchLocationEditor\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n entityType={\r\n selectors.contactType === 'business' ? 'business' : 'contact'\r\n }\r\n entityId={String((state.contactData as any).id)}\r\n onBack={() => setView('main')}\r\n onEntityUpdated={handleEntityUpdated}\r\n />\r\n </Box>\r\n </Fade>\r\n\r\n <Fade in={view === 'tags'} timeout={200} mountOnEnter unmountOnExit>\r\n <Box sx={{ pt: 0.5, position: 'absolute', inset: 0, overflowY: 'auto' }}>\r\n <TagsEditor\r\n value={draftLabels}\r\n options={labelsOptions}\r\n onChange={setDraftLabels}\r\n onBack={() => setView('main')}\r\n onSave={handleSaveTags}\r\n isSaving={isSavingTags}\r\n onCreateNew={handleCreateLabel}\r\n isCreatingNew={isCreatingLabel}\r\n popperContainer={modalContentRef.current}\r\n />\r\n </Box>\r\n </Fade>\r\n\r\n <Fade\r\n in={view === 'businessSelect'}\r\n timeout={200}\r\n mountOnEnter\r\n unmountOnExit\r\n >\r\n <Box sx={{ pt: 0.5, position: 'absolute', inset: 0, overflowY: 'auto' }}>\r\n <BusinessSelectEditor\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={String((state.contactData as any).id)}\r\n initialBusiness={\r\n selectors.isContact && (state.contactData as any)?.businessId\r\n ? {\r\n businessId: String((state.contactData as any).businessId),\r\n businessName: String(\r\n (state.contactData as any).businessName ?? '',\r\n ),\r\n }\r\n : null\r\n }\r\n onBack={() => setView('main')}\r\n onEntityUpdated={handleEntityUpdated}\r\n currentUser={selectors.userTrii}\r\n />\r\n </Box>\r\n </Fade>\r\n </Box>\r\n </EditEntityProvider>\r\n </EditContactViewProvider>\r\n ) : null}\r\n </Box>\r\n </Fade>\r\n </Modal>\r\n </NavigateProvider>\r\n </TranslationProvider>\r\n </EditContactApiProvider>\r\n );\r\n};\r\n\r\nconst EditContactModal = (props: Props) => {\r\n return (\r\n <I18nextProvider i18n={i18nInstance}>\r\n <EditContactModalContent {...props} />\r\n </I18nextProvider>\r\n );\r\n};\r\n\r\nexport default EditContactModal;\r\n"],"names":["f","require$$0","k","l","m","n","p","q","c","a","g","b","d","e","h","reactJsxRuntime_production_min","React","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","maybeIterator","ReactSharedInternals","error","format","_len2","args","_key2","printWarning","level","ReactDebugCurrentFrame","stack","argsWithFormat","item","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","isValidElementType","type","getWrappedName","outerType","innerType","wrapperName","displayName","functionName","getContextName","getComponentNameFromType","context","provider","outerName","lazyComponent","payload","init","assign","disabledDepth","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","disabledLog","disableLogs","props","reenableLogs","ReactCurrentDispatcher","prefix","describeBuiltInComponentFrame","name","source","ownerFn","x","match","reentry","componentFrameCache","PossiblyWeakMap","describeNativeComponentFrame","fn","construct","frame","control","previousPrepareStackTrace","previousDispatcher","Fake","sample","sampleLines","controlLines","s","_frame","syntheticFrame","describeFunctionComponentFrame","shouldConstruct","Component","prototype","describeUnknownElementTypeFrameInDEV","hasOwnProperty","loggedTypeFailures","setCurrentlyValidatingElement","element","owner","checkPropTypes","typeSpecs","values","location","componentName","has","typeSpecName","error$1","err","ex","isArrayImpl","isArray","typeName","value","hasToStringTag","willCoercionThrow","testStringCoercion","checkKeyStringCoercion","ReactCurrentOwner","RESERVED_PROPS","specialPropKeyWarningShown","specialPropRefWarningShown","didWarnAboutStringRefs","hasValidRef","config","getter","hasValidKey","warnIfStringRefCannotBeAutoConverted","self","defineKeyPropWarningGetter","warnAboutAccessingKey","defineRefPropWarningGetter","warnAboutAccessingRef","ReactElement","key","ref","jsxDEV","maybeKey","propName","defaultProps","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","propTypesMisspellWarningShown","isValidElement","object","getDeclarationErrorAddendum","getSourceInfoErrorAddendum","fileName","lineNumber","ownerHasKeyUseWarning","getCurrentComponentErrorInfo","parentType","info","parentName","validateExplicitKey","currentComponentErrorInfo","childOwner","validateChildKeys","node","i","child","iteratorFn","iterator","step","validatePropTypes","propTypes","_name","validateFragmentProps","fragment","keys","didWarnAboutKeySpread","jsxWithValidation","isStaticChildren","validType","sourceInfo","typeString","children","beforeExample","afterExample","jsxWithValidationStatic","jsxWithValidationDynamic","jsx","jsxs","reactJsxRuntime_development","jsxRuntimeModule","require$$1","ButtonsContainer","styled","Box","theme","SmallIconButton","IconButton","HeaderContainer","ContactAvatar","Avatar","ContactName","Typography","LoadingContainer","Header","imgUrl","contactId","navigate","isLoading","onError","onClose","isBusiness","handleNavigation","useCallback","url","event","handleNavigateToContacts","handleNavigateToConversations","avatarAlt","ArrowForwardIcon","MessageIcon","CircularProgress","Container","TitleBox","StyledBox","IconBox","InfoContainer","AddressContainer","NoteText","ContactMethod","icon","contactList","title","showTitle","renderContactInfo","contact","Tooltip","SectionTitle","PropertyItem","PropertyText","PropertyIcon","Handyman","Properties","properties","getPropertyTitle","formatPropertyValue","isValidDate","moment","formatStr","ContactField_type","parts","start","end","startFormatted","endFormatted","property","TagContainer","StyledChip","Chip","LabelsSection","contactData","Fragment","tag","isContact","obj","BusinessSection","MemberItem","memberId","MembersSection","member","resources","en","es","i18nInstance","i18n","initReactI18next","PopupContainer","ContactInfoPopupContent","open","anchorEl","avatarImgUrl","language","i18nT","useTranslation","useEffect","t","dataIsBusiness","dataIsContact","contactMethods","PhoneEnabled","Email","WhatsApp","Facebook","Instagram","ThreeP","handleKeyDown","Popper","ClickAwayListener","CardContent","method","index","ContactInfoPopup","I18nextProvider","noop","TranslationContext","createContext","TranslationProvider","useTranslationContext","useContext","rest","Tags","tags","onEditTags","setAnchorEl","useState","safeTags","useMemo","visibleTags","hiddenCount","handleOpen","handleClose","Stack","EditIcon","LabelIcon","Popover","EditContactApiContext","EditContactApiProvider","useEditContactApi","NameText","NameWrapper","NameContainer","EditButton","contactType","firstName","lastName","entityId","onEntityUpdated","api","isEditing","setIsEditing","loading","setLoading","setValues","handleSave","body","updated","showEdit","TextField","Save","Edit","AvatarWithActions","src","alt","onUpload","onDelete","isUploading","isDeleting","PhotoCameraIcon","DeleteIcon","onUploadPhoto","onPhotoFileChange","photoInputRef","isUploadingPhoto","onDeletePhoto","isDeletingPhoto","PAGE_SIZE","AutocompletePopper","popperContainer","TagsEditor","options","onChange","onBack","onSave","isSaving","onCreateNew","isCreatingNew","searchValue","setSearchValue","limit","setLimit","deferredSearchValue","useDeferredValue","safeOptions","filteredOptions","o","visibleOptions","optionsWithSelectedValues","byId","selected","opt","handleSearchChange","_","newInputValue","onListboxScroll","CustomNoOptionsMessage","trimmedSearchValue","isDisabled","LoadingButton","ArrowBackIcon","SaveIcon","Autocomplete","newValue","option","v","createElement","tagValue","getTagProps","tagProps","params","ApiError","message","status","__publicField","requestJson","headers","signal","res","parsedBody","requestFormData","formData","joinUrl","baseUrl","path","normalizedBase","normalizedPath","getApiUrls","spaceId","encodedSpaceId","fetchLabels","urls","createLabel","fetchContact","fetchContactFields","forType","updateEntity","entityType","fetchBusinessTableData","pagination","createBusiness","business","deleteAddress","data","checkContactAddress","setContactAddress","updateContactAddress","fetchUserTrii","fetchUsers","fetchUserTriiById","userId","uploadAvatar","file","fd","createEditContactApi","isGoogleMapsLoaded","waitForGoogleMaps","maxWaitTime","resolve","startTime","interval","useGoogleMapsStatus","isLoaded","setIsLoaded","setIsLoading","setError","loaded","SearchLocationInput","onPlaceSelected","placeholder","inputRef","useRef","autocompleteRef","placeSelectedRef","errorRef","mapsError","currentPlaceholder","googleAny","observer","applyPacContainerStyles","container","el","mutations","mutation","listener","place","city","state","country","postalCode","streetName","streetNumber","components","component","types","lat","lng","result","EMPTY_DRAFT","SearchLocationEditor","draft","setDraft","query","setQuery","isSavingMain","setIsSavingMain","isSavingSecondary","setIsSavingSecondary","canSubmit","handlePlaceSelected","computedStreet","handleError","errorMessage","handleChange","next","prev","handleSaveMainAddress","handleSaveSecondaryAddress","useEditContactModalController","abortRef","setState","canFetch","canFetchLabels","controller","labels","canFetchUser","selectors","fields","useImage","initialImageUrl","imageUrl","setImageUrl","userTrii","setUserTrii","setIsUploading","setIsDeleting","canRequest","removeSasToken","removeCacheId","removeParams","ensureUserTrii","getImageURLWithAccessToken","rawUrl","storageAzureSAS","expireAt","expiredAtDate","sas","cacheId","setAccessImageUrl","withSas","uploadedUrl","uploadImage","deleteImage","useField","initialValue","setValue","helperText","setHelperText","errorMsg","useSelect","changeValue","resetValue","getRandomValues","rnds8","rng","byteToHex","unsafeStringify","arr","offset","randomUUID","e$9","v4","buf","native","rnds","createNewAddress","channelType","uuidv4","M","getEditedField","originalValue","editedValue","editedField","getAddressesWithUpdatedValues","newValueAddressId","addresses","address","fe","useEditContactMethods","initial","dispatch","isDeletingAddress","setIsDeletingAddress","initialSnapshot","setInitialSnapshot","imsFacebooks","setImsFacebooks","imsMercadolibre","setImsMercadolibre","imsWebchats","setImsWebchats","imsInstagrams","setImsInstagrams","imsWhatsapp","setImsWhatsApp","emails","setEmails","phoneNumbers","setPhoneNumbers","imsRCS","setImsRCS","addPhone","newPhone","contactHelper","ChannelType","newPhoneNumbers","addEmail","newEmail","newEmails","addWhatsapp","newWhatsapp","newWhatsapps","addRCS","newRCS","newRCSs","addWhatsappVerified","updatedWhatsapps","replaceAddress","addressId","newAddress","email","phoneNumber","newImsWhatsapp","newImsRCS","newImsMercadolibre","handleAddressFieldChange","fieldId","editContactHelper","handleNoteFieldChange","addressType","newImsFacebooks","imsFacebook","newImsWebchats","imsWebchat","newImsInstagrams","imsInstagram","handleDeleteAddress","resetToInitialContactInformation","useMultipleSelect","initialState","hasNewObject","newItem","currentItem","prevState","useEditBusiness","customContactFields","apiDeleteAddress","apiDispatch","maybePromise","customProperties","setCustomProperties","contactImage","contactPropietary","labelMultipleSelect","selectedContacts","setSelectedContacts","homeAddress","secondaryHomeAddress","secondaryCity","secondaryState","secondaryPostalCode","secondaryCountry","getEditedBusiness","address1","address2","resetCustomProperty","nameKey","normalizeNameKey","input","defaultProperty","updatedProperties","getFilteredCustomProperties","customField","existingBusinessProperty","existingLocalProperty","useEditContact","contactFirstname","contactLastname","birthDate","setBirthDate","dayjs","getEditedContact","currentContact","modifiedTags","modifiedPhones","id","modifiedEmails","resetSelectedBusiness","resetBirthDate","existingProperty","EditEntityContext","EditContactEntityProvider","editEntity","EditBusinessEntityProvider","EditEntityProvider","entityData","useEditEntity","ctx","resolveUserLabel","users","currentUser","fromUsers","u","Section","enableDirectionSearch","onDirectionSearchClick","Button","AddLocationAltIcon","Divider","SectionContent","boxProps","DateSelect","dateFormat","userDateFormat","LocalizationProvider","AdapterDayjs","DatePicker","EditContactViewContext","EditContactViewProvider","useEditContactView","NavigateContext","NavigateProvider","useNavigateContext","SelectBusinessLabel","displayValue","businessId","businessData","setBusinessData","userImage","isLoadingData","setIsLoadingData","targetElement","response","isUserInfo","isContactBirthdayProps","StyledIconButton","StyledSaveCancelButton","EntityInfoLabel","isNotEditable","minWidth","setView","inputType","setIsSaving","titleRef","isTitleTruncated","setIsTitleTruncated","inputValue","setInputValue","check","rafId","ro","handleEditClick","handleInputChange","handleSelectChange","handleCancel","updatedValue","parsedDate","updatedContactData","updatedBusinessData","selectValue","textValue","resolvedMinWidth","CancelIcon","Select","MenuItem","ContactInfoLabel","constructUpdateObject","CustomPropertyInput","handleNumberTypeChange","handleIntegerNumberTypeChange","handleTextTypeChange","sanitizedInput","CustomPropertyDatePicker","CustomPropertyOptionsSelect","FormControl","CustomPropertyTimePicker","userTimeFormat","is24HourFormat","TimePicker","CustomPropertyTimeRangePicker","initDates","timeFormat","MultiInputTimeRangeField","position","CustomPropertyDateRangePicker","MultiInputDateRangeField","ContactBox","FieldName","FieldValue","EntityCustomFieldLabel","entity","isNumericType","shouldBeNumeric","normalizeValue","num","toggleEdit","current","effectiveType","finalValue","dayjsValue","nextProperties","getPropertyName","propertyNameKey","field","hasValue","val","EditField","CustomPropertyOptionSelect","startParsed","endParsed","timeValue","ContactGeneral","setUsers","setOwner","updatedBy","setUpdatedBy","createdBy","setCreatedBy","editContact","getRemoteLabel","ownerLabel","createdByLabel","updatedByLabel","dateOnlyString","calculateAge","today","age","BusinessInfoLabel","BusinessGeneral","editBusiness","General","useEditModal","isOpen","setIsOpen","setTitle","LeftSection","RightSection","ContactDetails","AvatarWrapper","EllipsisText","PhoneText","ProfileNameText","ContactMethodItem","avatarUrlWithoutAccess","Star","StarBorder","phoneUtil","PhoneNumberUtil","formatPhoneForDisplay","number","parsed","PhoneNumberFormat","StyledLocalPhoneIcon","LocalPhoneIcon","ContactMethodPhoneItem","handleCallContact","contactPhone","formattedPhone","StyledTypography","HeaderBox","MethodItemsBox","methodItems","isPhone","handleEdit","SubsectionHeader","subsectionHeaderWithButtonStyle","SubsectionHeaderWithButton","handleAdd","AddIcon","informationItemContainerStyle","InformationItemContainer","noteDeleteButtonStyle","OptionsMenu","addressData","handleLinkAccountSave","checked","onCheckContactAddress","verifying","setVerifying","verificationResult","setVerificationResult","modalOpen","setModalOpen","handleClick","handleModalClose","handleDelete","handleCheckWA","handleCheckRCS","handleLinkAccount","MoreVertIcon","Menu","ListItemIcon","ListItemText","WhatsAppIcon","MmsIcon","Modal","NoteDeleteButton","entityIdFromContext","note","addressIsSaved","handleSetAddress","handleUpdateAddress","informationItemInputsContainerStyle","InformationItemInputsContainer","subsectionBodyContainerStyle","SubsectionBodyContainer","Adornment","CheckRoundedIcon","CloseRoundedIcon","StatusAdornment","text","InputAdornment","imsStyle","Ims","editActions","Body","IMSs","ims","InformationSocialNetworkItem","style","AddressInput","setWarnings","adornmentStatus","setAdornmentStatus","lastSearch","setLastSearch","timer","checkContactAddressData","success","warnings","PhoneInput","Warning","Grid","WarningIcon","WarningsDisplay","warning","phoneStyle","Phone","mode","editEntityActions","editEntityState","setChecked","phone","Phones","mailStyle","Mail","Mails","Whatsapp","whatsapps","whatsapp","Whatsapps","RCS","RCSs","StyledModalContent","EditModal","ContactInformation","ownerData","openModal","closeModal","phones","facebook","mercadolibre","webchat","instagram","rcs","AddressInformation","commonProps","AddressGroup","addressNumber","useEntityUpdateSync","setEntity","update","updateObj","merged","useTagsEditorController","selectedTags","onTagsUpdated","view","draftLabels","setDraftLabels","tagsEditorInitialized","setTagsEditorInitialized","createdLabels","setCreatedLabels","isCreatingLabel","setIsCreatingLabel","labelsOptions","safeLabels","safeCreated","label","reset","selectedTagIds","initialDraft","handleCreateLabel","trimmedName","normalizedName","existing","safePrev","created","handleSaveTags","useModalCloseHandler","_event","reason","DEFAULT_PAGINATION","BusinessSelectEditor","initialBusiness","timerRef","hasSearched","setHasSearched","isLoadingTimer","setIsLoadingTimer","setOptions","setSelected","currentPage","setCurrentPage","isNextPage","setIsNextPage","allLoaded","setAllLoaded","ownerValue","resetSearchState","mapBusinesses","businesses","fetchPage","page","total","handleQueryChanged","handleScroll","nextPage","handleCreateBusiness","createdOption","noOptionsNode","isSavingDisabled","LinearProgress","EditContactModalContent","sx","googleMapsApiKey","modalContentRef","script","actions","handleEntityUpdated","isSavingTags","image","baseSx","mergedSx","Backdrop","Fade","CloseIcon","EditContactModal"],"mappings":"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","x_google_ignoreList":[0,1,2,33,34,35,36]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../node_modules/react/cjs/react-jsx-runtime.development.js","../../node_modules/react/jsx-runtime.js","../../src/components/ContactInfoPopup/components/Header/Header.tsx","../../src/components/ContactInfoPopup/components/ContactMethod/ContactMethod.tsx","../../src/components/ContactInfoPopup/components/Properties/Properties.tsx","../../src/components/ContactInfoPopup/components/LabelsSection/LabelsSection.tsx","../../src/components/ContactInfoPopup/types/is-contact.typeguard.ts","../../src/components/ContactInfoPopup/components/BusinessSection/BusinessSection.tsx","../../src/components/ContactInfoPopup/types/is-business.typeguard.ts","../../src/components/ContactInfoPopup/components/MembersSection/components/MemberItem/MemberItem.tsx","../../src/components/ContactInfoPopup/components/MembersSection/MembersSection.tsx","../../src/i18n/config.ts","../../src/components/ContactInfoPopup/ContactInfoPopup.tsx","../../src/components/EditContactModal/context/TranslationContext.tsx","../../src/components/EditContactModal/components/Header/components/Tags/Tags.tsx","../../src/components/EditContactModal/context/EditContactApiContext.tsx","../../src/components/EditContactModal/components/Header/components/ContactName/ContactName.tsx","../../src/components/EditContactModal/components/Header/components/AvatarWithActions/AvatarWithActions.tsx","../../src/components/EditContactModal/components/Header/Header.tsx","../../src/components/EditContactModal/components/TagsEditor/TagsEditor.tsx","../../src/components/EditContactModal/services/http.ts","../../src/components/EditContactModal/services/urls.ts","../../src/components/EditContactModal/services/api.ts","../../src/components/EditContactModal/components/SearchLocation/googleMapsUtils.ts","../../src/components/EditContactModal/components/SearchLocation/SearchLocationInput.tsx","../../src/components/EditContactModal/components/SearchLocation/SearchLocationEditor.tsx","../../src/components/EditContactModal/types/is-business.typeguard.ts","../../src/components/EditContactModal/types/is-contact.typeguard.ts","../../src/components/EditContactModal/hooks/useEditContactModalController.ts","../../src/components/EditContactModal/hooks/useImage.ts","../../src/components/EditContactModal/hooks/useField.ts","../../src/components/EditContactModal/hooks/useSelect.ts","../../node_modules/uuid/dist/esm-browser/rng.js","../../node_modules/uuid/dist/esm-browser/stringify.js","../../node_modules/uuid/dist/esm-browser/native.js","../../node_modules/uuid/dist/esm-browser/v4.js","../../src/components/EditContactModal/utils/contactHelper.ts","../../src/components/EditContactModal/hooks/utils/editContactHelper.ts","../../src/components/EditContactModal/hooks/useEditContactMethods.ts","../../src/components/EditContactModal/hooks/useMultipleSelect.ts","../../src/components/EditContactModal/hooks/useEditBusiness/useEditBusiness.ts","../../src/components/EditContactModal/hooks/useEditContact/useEditContact.ts","../../src/components/EditContactModal/context/EditEntityContext.tsx","../../src/components/EditContactModal/components/Section/utils/resolveUserLabel.ts","../../src/components/EditContactModal/layout/Section.tsx","../../src/components/EditContactModal/layout/SectionContent.tsx","../../src/components/EditContactModal/shared/ContactInfoLabel/components/DateSelect/DateSelect.tsx","../../src/components/EditContactModal/context/EditContactViewContext.tsx","../../src/components/EditContactModal/context/NavigateContext.tsx","../../src/components/EditContactModal/shared/EntityInfoLabel/components/SelectBusinessLabel/SelectBusinessLabel.tsx","../../src/components/EditContactModal/shared/EntityInfoLabel/EntityInfoLabel.tsx","../../src/components/EditContactModal/shared/ContactInfoLabel/ContactInfoLabel.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyInput/CustomPropertyInput.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyDatePicker/CustomPropertyDatePicker.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyOptionSelect/CustomPropertyOptionsSelect.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyTimePicker/CustomPropertyTimePicker.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyTimeRangePicker/CustomPropertyTimeRangePicker.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/components/CustomPropertyDateRangePicker/CustomPropertyDateRangePicker.tsx","../../src/components/EditContactModal/shared/EntityCustomFieldLabel/EntityCustomFieldLabel.tsx","../../src/components/EditContactModal/components/Section/General/components/ContactGeneral.tsx","../../src/components/EditContactModal/shared/BusinessInfoLabel/BusinessInfoLabel.tsx","../../src/components/EditContactModal/components/Section/General/components/BusinessGeneral.tsx","../../src/components/EditContactModal/components/Section/General/General.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/hooks/useEditModal.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/ContactMethod/components/ContactMethodItem/ContactMethodItem.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/ContactMethod/components/ContactMethodPhoneItem/utils/phone.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/ContactMethod/components/ContactMethodPhoneItem/ContactMethodPhoneItem.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/ContactMethod/ContactMethod.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/SubsectionHeader/SubsectionHeader.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/SubsectionHeaderWithButton/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/SubsectionHeaderWithButton/SubsectionHeaderWithButton.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/InformationItemContainer/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/InformationItemContainer/InformationItemContainer.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/NoteDeleteButton/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/components/Body/components/Phone/components/OptionsMenu/OptionsMenu.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/NoteDeleteButton/NoteDeleteButton.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/InformationItemInputsContainer/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/InformationItemInputsContainer/InformationItemInputsContainer.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/SubsectionBodyContainer/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/SubsectionBodyContainer/SubsectionBodyContainer.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/StatusAdornment/components/Adornment/Adornment.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/shared/StatusAdornment/StatusAdornment.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/InformationSocialNetworkItem/components/Body/components/Ims/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/InformationSocialNetworkItem/components/Body/components/Ims/Ims.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/InformationSocialNetworkItem/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/InformationSocialNetworkItem/InformationSocialNetworkItem.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/AddressInput/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/AddressInput/AddressInput.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/PhoneInput/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/PhoneInput/PhoneInput.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/WarningsDisplay/components/Warning/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/WarningsDisplay/components/Warning/Warning.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/layout/WarningsDisplay/WarningsDisplay.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/components/Body/components/Phone/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/components/Body/components/Phone/Phone.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Phones/Phones.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Mails/components/Body/components/Mail/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Mails/components/Body/components/Mail/Mail.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Mails/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Mails/Mails.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Whatsapps/components/Body/components/Whatsapp/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Whatsapps/components/Body/components/Whatsapp/Whatsapp.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Whatsapps/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/Whatsapps/Whatsapps.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/RCSs/components/Body/components/RCS/style.ts","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/RCSs/components/Body/components/RCS/RCS.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/RCSs/components/Body/Body.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/components/RCSs/RCSs.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/components/EditModal/EditModal.tsx","../../src/components/EditContactModal/components/Section/ContactInformation/ContactInformation.tsx","../../src/components/EditContactModal/components/Section/AddressInformation/AddressInformation.tsx","../../src/components/EditContactModal/hooks/useEntityUpdateSync.ts","../../src/components/EditContactModal/hooks/useTagsEditorController.ts","../../src/components/EditContactModal/hooks/useModalCloseHandler.ts","../../src/components/EditContactModal/components/BusinessSelect/BusinessSelectEditor.tsx","../../src/components/EditContactModal/EditContactModal.tsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"<anonymous>\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('<anonymous>')) {\n _frame = _frame.replace('<anonymous>', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie. <div {...props} key=\"Hi\" />\n // or <div key=\"Hi\" {...props} /> ). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n // <div {...props} key=\"Hi\" />, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n {\n if (hasOwnProperty.call(props, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(props).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n// even with the prod transform. This means that jsxDEV is purely\n// opt-in behavior for better messages but that we won't stop\n// giving you warnings if you use production apis.\n\nfunction jsxWithValidationStatic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, true);\n }\n}\nfunction jsxWithValidationDynamic(type, props, key) {\n {\n return jsxWithValidation(type, props, key, false);\n }\n}\n\nvar jsx = jsxWithValidationDynamic ; // we may want to special case jsxs internally to take advantage of static children.\n// for now we can ship identical prod functions\n\nvar jsxs = jsxWithValidationStatic ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsx;\nexports.jsxs = jsxs;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import {\r\n Avatar,\r\n Box,\r\n IconButton,\r\n styled,\r\n Typography,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport ArrowForwardIcon from '@mui/icons-material/ArrowForward';\r\nimport MessageIcon from '@mui/icons-material/Message';\r\nimport { useCallback } from 'react';\r\n\r\nconst ButtonsContainer = styled(Box)(({ theme }) => ({\r\n position: 'absolute',\r\n top: 8,\r\n right: 8,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 4,\r\n zIndex: 1,\r\n //@ts-ignore\r\n backgroundColor: theme.palette.background.panel,\r\n}));\r\n\r\nconst SmallIconButton = styled(IconButton)({\r\n padding: 4,\r\n});\r\n\r\nconst HeaderContainer = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n marginBottom: '16px',\r\n position: 'relative',\r\n});\r\n\r\nconst ContactAvatar = styled(Avatar)({\r\n width: 60,\r\n height: 60,\r\n marginBottom: 8,\r\n});\r\n\r\nconst ContactName = styled(Typography)({\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: 200,\r\n textAlign: 'center',\r\n});\r\n\r\nconst LoadingContainer = styled(Box)({\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n width: 60,\r\n height: 60,\r\n marginBottom: 8,\r\n});\r\n\r\ntype HeaderProps = {\r\n imgUrl?: string;\r\n name?: string;\r\n contactId?: string;\r\n navigate: (path: string) => void;\r\n isLoading?: boolean;\r\n onError?: (error: Error) => void;\r\n onClose: () => void;\r\n isBusiness?: boolean;\r\n};\r\n\r\nconst Header = ({\r\n imgUrl,\r\n name,\r\n contactId,\r\n navigate,\r\n isLoading = false,\r\n onError,\r\n onClose,\r\n isBusiness = false,\r\n}: HeaderProps) => {\r\n const handleNavigation = useCallback(\r\n (url: string) => (event: React.MouseEvent) => {\r\n try {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (!url) {\r\n throw new Error('Navigation URL is required');\r\n }\r\n\r\n const isNewTab = event.ctrlKey || event.metaKey || event.button === 1; // Ctrl+Click, Cmd+Click, Middle Mouse\r\n\r\n if (isNewTab) {\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n } else {\r\n navigate(url);\r\n }\r\n } catch (error) {\r\n onError?.(error instanceof Error ? error : new Error('Navigation failed'));\r\n }\r\n },\r\n [navigate, onError]\r\n );\r\n\r\n const handleNavigateToContacts = handleNavigation(\r\n isBusiness\r\n ? `/a/contacts/business/${contactId}`\r\n : `/a/contacts/contacts/${contactId}`\r\n );\r\n const handleNavigateToConversations = handleNavigation(\r\n '/a/conversations/conversations'\r\n );\r\n\r\n const displayName = name || 'Unknown Contact';\r\n const avatarAlt = `Avatar for ${displayName}`;\r\n\r\n return (\r\n <HeaderContainer>\r\n <ButtonsContainer>\r\n <SmallIconButton\r\n color=\"info\"\r\n size=\"small\"\r\n onClick={(e) => {\r\n handleNavigateToContacts(e);\r\n onClose();\r\n }}\r\n onMouseDown={(e) => {\r\n if (e.button === 1) {\r\n // Middle mouse button\r\n handleNavigateToContacts(e);\r\n onClose();\r\n }\r\n }}\r\n disabled={!contactId}\r\n aria-label=\"View contact details\"\r\n >\r\n <ArrowForwardIcon fontSize=\"small\" />\r\n </SmallIconButton>\r\n <SmallIconButton\r\n color=\"info\"\r\n size=\"small\"\r\n onClick={(e) => {\r\n handleNavigateToConversations(e);\r\n onClose();\r\n }}\r\n onMouseDown={(e) => {\r\n if (e.button === 1) {\r\n // Middle mouse button\r\n handleNavigateToConversations(e);\r\n onClose();\r\n }\r\n }}\r\n aria-label=\"Go to conversations\"\r\n >\r\n <MessageIcon fontSize=\"small\" />\r\n </SmallIconButton>\r\n </ButtonsContainer>\r\n {isLoading ? (\r\n <LoadingContainer>\r\n <CircularProgress size={24} />\r\n </LoadingContainer>\r\n ) : (\r\n <ContactAvatar\r\n src={imgUrl}\r\n alt={avatarAlt}\r\n onError={() => onError?.(new Error('Failed to load avatar'))}\r\n />\r\n )}\r\n <ContactName variant=\"h6\" title={displayName}>\r\n {displayName}\r\n </ContactName>\r\n </HeaderContainer>\r\n );\r\n};\r\n\r\nexport default Header;\r\n","// Components/ui\r\nimport { Box, Tooltip, Typography, styled } from '@mui/material';\r\n// Types\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ninterface ContactProps {\r\n contactList: IContactAddress[];\r\n title?: string;\r\n showTitle?: boolean;\r\n icon: React.ReactNode;\r\n}\r\n\r\nconst Container = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: 'max-content',\r\n alignItems: 'center',\r\n gap: 8,\r\n});\r\n\r\nconst TitleBox = styled(Box)({\r\n width: '100%',\r\n borderBottom: `1px solid lightgray`,\r\n});\r\n\r\nconst StyledBox = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n width: '100%',\r\n padding: 1,\r\n minHeight: '50px',\r\n position: 'relative',\r\n maxWidth: 'inherit'\r\n});\r\n\r\nconst IconBox = styled(Box)(({ theme }) => ({\r\n marginTop: '-20px',\r\n padding: 0,\r\n color: theme.palette.primary.main,\r\n}));\r\n\r\nconst InfoContainer = styled(Box)({\r\n display: 'flex',\r\n maxWidth: '90%',\r\n gap: '10px',\r\n width: '100%',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n alignItems: 'center',\r\n});\r\n\r\nconst AddressContainer = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '50px',\r\n maxWidth: '90%',\r\n\r\n});\r\n\r\nconst NoteText = styled(Typography)({\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n maxWidth: '90%',\r\n position: 'absolute',\r\n bottom: 16,\r\n left: 40,\r\n});\r\n\r\nconst ContactMethod = ({\r\n icon,\r\n contactList,\r\n title,\r\n showTitle = true,\r\n}: ContactProps) => {\r\n const renderContactInfo = (contact: IContactAddress) => (\r\n <StyledBox key={contact.id}>\r\n <InfoContainer>\r\n <IconBox>{icon}</IconBox>\r\n <AddressContainer>\r\n <Tooltip title={contact.address} arrow placement=\"top\">\r\n <Typography\r\n variant=\"subtitle1\"\r\n fontWeight=\"semi-bold\"\r\n fontSize={14}\r\n color=\"text.primary\"\r\n sx={{\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n overflow: 'hidden',\r\n cursor: 'default',\r\n }}\r\n >\r\n {contact.address}\r\n </Typography>\r\n </Tooltip>\r\n {contact.profileName && (\r\n <Typography\r\n variant=\"body2\"\r\n fontSize={10}\r\n color=\"text.disabled\"\r\n sx={{ marginLeft: '5px', marginTop: '10px' }}\r\n >\r\n {contact.profileName}\r\n </Typography>\r\n )}\r\n </AddressContainer>\r\n {contact.note && (\r\n <NoteText variant=\"body2\" fontSize={12} color=\"text.secondary\">\r\n {contact.note}\r\n </NoteText>\r\n )}\r\n </InfoContainer>\r\n </StyledBox>\r\n );\r\n\r\n return (\r\n <Container>\r\n {showTitle && (\r\n <TitleBox>\r\n <Typography variant=\"subtitle1\" fontWeight=\"bold\" gutterBottom mt={2}>\r\n {title}\r\n </Typography>\r\n </TitleBox>\r\n )}\r\n {contactList?.map(renderContactInfo)}\r\n </Container>\r\n );\r\n};\r\n\r\nexport default ContactMethod;\r\n","// Components/ui\r\nimport { Box, Typography, styled } from '@mui/material';\r\n// Icons\r\nimport { Handyman } from '@mui/icons-material';\r\nimport { ContactField_type, Property } from '@trii/types/dist/Contacts';\r\n// Moment.js\r\nimport moment from 'moment';\r\n\r\ninterface Props {\r\n properties: Property[] | undefined;\r\n title: string;\r\n}\r\nconst Container = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n height: 'max-content',\r\n alignItems: 'center',\r\n gap: 8,\r\n});\r\n\r\nconst SectionTitle = styled(Typography)({\r\n borderBottom: `1px solid lightgray`,\r\n width: '100%',\r\n});\r\n\r\nconst PropertyItem = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n width: '100%',\r\n});\r\n\r\nconst PropertyText = styled(Typography)({\r\n fontSize: 14,\r\n});\r\n\r\nconst PropertyIcon = styled(Handyman)(({ theme }) => ({\r\n color: theme.palette.primary.main,\r\n fontSize: 16,\r\n}));\r\nconst Properties = ({ properties, title }: Props) => {\r\n const getPropertyTitle = (title: string) => title.replace(/-/g, ' ');\r\n\r\n const formatPropertyValue = (\r\n value: string | string[] | null | undefined,\r\n type: ContactField_type\r\n ): string => {\r\n if (!value || (Array.isArray(value) && value.length === 0)) return '';\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) => formatPropertyValue(item, type)).join(', ');\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const isValidDate = moment(value, moment.ISO_8601).isValid();\r\n const format = (formatStr: string) => moment(value).format(formatStr);\r\n\r\n switch (type) {\r\n case ContactField_type.TIME:\r\n return isValidDate ? format('HH:mm') : value;\r\n case ContactField_type.DATE:\r\n return isValidDate ? format('DD/MM/YYYY') : value;\r\n case ContactField_type.TIMERANGE:\r\n case ContactField_type.DATERANGE:\r\n if (isValidDate) {\r\n return type === ContactField_type.TIMERANGE\r\n ? format('HH:mm')\r\n : format('DD/MM/YYYY');\r\n }\r\n\r\n const parts = value.split(' ');\r\n if (parts.length === 2) {\r\n const [start, end] = parts;\r\n const startFormatted =\r\n type === ContactField_type.TIMERANGE\r\n ? moment(start).format('HH:mm')\r\n : moment(start).format('DD/MM/YYYY');\r\n const endFormatted =\r\n type === ContactField_type.TIMERANGE\r\n ? moment(end).format('HH:mm')\r\n : moment(end).format('DD/MM/YYYY');\r\n return `${startFormatted} - ${endFormatted}`;\r\n }\r\n return value;\r\n default:\r\n return value;\r\n }\r\n }\r\n\r\n return value;\r\n };\r\n\r\n return (\r\n <Container>\r\n <SectionTitle fontWeight=\"bold\" gutterBottom mt={2} variant=\"subtitle1\">\r\n {title}\r\n </SectionTitle>\r\n {properties?.map(\r\n (property, i) =>\r\n property.value.length > 0 && (\r\n <PropertyItem key={i}>\r\n <PropertyIcon />\r\n <PropertyText>\r\n {getPropertyTitle(property.nameKey)}:{' '}\r\n {formatPropertyValue(property.value, property.type)}\r\n </PropertyText>\r\n </PropertyItem>\r\n )\r\n )}\r\n </Container>\r\n );\r\n};\r\n\r\nexport default Properties;\r\n","import { Box, Typography, Chip, styled } from '@mui/material';\r\nimport { IContact, IBusiness } from '@trii/types/dist/Contacts';\r\n\r\nconst SectionTitle = styled(Typography)({\r\n fontWeight: 'bold',\r\n marginBottom: '8px',\r\n marginTop: '16px',\r\n borderBottom: `1px solid lightgray`,\r\n});\r\n\r\nconst TagContainer = styled(Box)({\r\n marginBottom: 16,\r\n});\r\n\r\nconst StyledChip = styled(Chip)(({ theme }) => ({\r\n marginRight: 8,\r\n marginBottom: 8,\r\n backgroundColor: `${theme.palette.primary.main}b3`,\r\n}));\r\n\r\ninterface LabelsSectionProps {\r\n contactData?: IContact | IBusiness;\r\n title: string;\r\n}\r\n\r\nconst LabelsSection = ({ contactData, title }: LabelsSectionProps) => {\r\n if (!contactData) return null;\r\n\r\n if (!contactData.tags?.length) return null;\r\n\r\n return (\r\n <>\r\n <SectionTitle gutterBottom mt={2} variant=\"subtitle1\">\r\n {title}\r\n </SectionTitle>\r\n <TagContainer>\r\n {contactData?.tags\r\n ?.filter((tag) => tag.name?.trim())\r\n .map((tag) => (\r\n <StyledChip key={tag.id} label={tag.name} color=\"primary\" size=\"small\" />\r\n ))}\r\n </TagContainer>\r\n </>\r\n );\r\n};\r\n\r\nexport default LabelsSection;\r\n","import { IContact } from '@trii/types/dist/Contacts/contacts';\r\n\r\n/**\r\n * Type guard to check if an object is an IContact\r\n * @param obj The object to check\r\n * @returns True if the object is an IContact\r\n */\r\nexport function isContact(obj: any): obj is IContact {\r\n // Si está marcado explícitamente como negocio, no es un contacto regular\r\n if (obj?.isBusiness === true) {\r\n return false;\r\n }\r\n \r\n return (\r\n obj !== null &&\r\n typeof obj === 'object' &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.spaceId === 'string' &&\r\n typeof obj.name === 'string' &&\r\n typeof obj.firstName === 'string' &&\r\n typeof obj.lastName === 'string' &&\r\n Array.isArray(obj.phones) &&\r\n Array.isArray(obj.emails) &&\r\n 'origin' in obj &&\r\n typeof obj.isSpam === 'boolean' &&\r\n (!obj.businessId || typeof obj.businessId === 'string')\r\n );\r\n}\r\n","import { styled, Typography } from '@mui/material';\r\n// Types, IContact\r\nimport { isContact } from '../../types/is-contact.typeguard';\r\nimport { IContact } from '@trii/types/dist/Contacts';\r\n\r\nconst SectionTitle = styled(Typography)({\r\n fontWeight: 'bold',\r\n marginBottom: '8px',\r\n marginTop: '16px',\r\n borderBottom: `1px solid lightgray`,\r\n});\r\n\r\ninterface BusinessSectionProps {\r\n contactData?: IContact;\r\n title: string;\r\n}\r\n\r\nconst BusinessSection = ({ contactData, title }: BusinessSectionProps) => {\r\n if (!contactData || !isContact(contactData)) return null;\r\n\r\n return (\r\n <>\r\n <SectionTitle gutterBottom mt={2} variant=\"subtitle1\">\r\n {title}\r\n </SectionTitle>\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n {contactData?.businessName}\r\n </Typography>\r\n </>\r\n );\r\n};\r\n\r\nexport default BusinessSection;\r\n","import { IBusiness } from '@trii/types/dist/Contacts/contacts';\r\n\r\n/**\r\n * Type guard to check if an object is an IBusiness\r\n * @param obj The object to check\r\n * @returns True if the object is an IBusiness\r\n */\r\nexport function isBusiness(obj: any): obj is IBusiness {\r\n if (obj?.isBusiness === true) {\r\n // Si se ha marcado explícitamente como negocio con la propiedad isBusiness\r\n return true;\r\n }\r\n \r\n return (\r\n obj !== null &&\r\n typeof obj === 'object' &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.spaceId === 'string' &&\r\n typeof obj.name === 'string' &&\r\n Array.isArray(obj.membersId) &&\r\n Array.isArray(obj.members) &&\r\n Array.isArray(obj.phones) &&\r\n Array.isArray(obj.emails) &&\r\n typeof obj.imageUrl === 'string' &&\r\n !('firstName' in obj) &&\r\n !('lastName' in obj)\r\n );\r\n}\r\n","// Types\r\nimport { Typography } from '@mui/material';\r\n// Components\r\ntype MemberItemProps = {\r\n name: string;\r\n memberId: string;\r\n navigate: (path: string) => void;\r\n};\r\n\r\nconst MemberItem = ({ name, memberId, navigate }: MemberItemProps) => {\r\n const url = `/a/conversations/conversations&conversationId=${memberId}`;\r\n\r\n const handleNavigation = (event: React.MouseEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const isNewTab = event.ctrlKey || event.metaKey || event.button === 1; // Ctrl+Click, Cmd+Click, Middle Mouse\r\n\r\n if (isNewTab) {\r\n window.open(url, '_blank', 'noopener,noreferrer');\r\n } else {\r\n navigate(url);\r\n }\r\n };\r\n\r\n return (\r\n <Typography\r\n variant=\"body2\"\r\n color=\"text.secondary\"\r\n role=\"link\"\r\n tabIndex={0}\r\n sx={{ cursor: 'pointer', '&:hover': { textDecoration: 'underline' } }}\r\n onClick={handleNavigation}\r\n onMouseDown={(e) => {\r\n if (e.button === 1) {\r\n handleNavigation(e);\r\n }\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n handleNavigation(e as unknown as React.MouseEvent);\r\n }\r\n }}\r\n >\r\n {name}\r\n </Typography>\r\n );\r\n};\r\n\r\nexport default MemberItem;\r\n","import { styled, Typography } from '@mui/material';\r\n// Types\r\nimport { IBusiness } from '@trii/types/dist/Contacts';\r\nimport { isBusiness } from '../../types/is-business.typeguard';\r\nimport { MemberItem } from './components';\r\n\r\nconst SectionTitle = styled(Typography)({\r\n fontWeight: 'bold',\r\n marginBottom: '8px',\r\n marginTop: '16px',\r\n borderBottom: `1px solid lightgray`,\r\n});\r\n\r\ninterface MembersSectionProps {\r\n contactData?: IBusiness;\r\n title: string;\r\n navigate: (path: string) => void;\r\n}\r\n\r\nconst MembersSection = ({ contactData, title, navigate }: MembersSectionProps) => {\r\n if (!contactData || !isBusiness(contactData) || !contactData.members?.length)\r\n return null;\r\n\r\n return (\r\n <>\r\n <SectionTitle gutterBottom mt={2} variant=\"subtitle1\">\r\n {title}\r\n </SectionTitle>\r\n {contactData?.members.map((member) => (\r\n <MemberItem\r\n key={member.id}\r\n memberId={String(member.id)}\r\n name={member.name}\r\n navigate={navigate}\r\n />\r\n ))}\r\n </>\r\n );\r\n};\r\n\r\nexport default MembersSection;\r\n","import i18n from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\nimport en from './locales/en.json';\r\nimport es from './locales/es.json';\r\n\r\nconst resources = {\r\n en: { translation: en },\r\n es: { translation: es },\r\n};\r\n\r\nconst i18nInstance = i18n.createInstance();\r\n\r\ni18nInstance.use(initReactI18next).init({\r\n resources,\r\n lng: 'en',\r\n fallbackLng: 'en',\r\n interpolation: {\r\n escapeValue: false,\r\n },\r\n react: {\r\n useSuspense: false,\r\n },\r\n});\r\n\r\nexport default i18nInstance;\r\n","import { IBusiness, IContact } from '@trii/types/dist/Contacts';\r\nimport { CardContent, Box, styled, Popper, ClickAwayListener, SxProps, Theme } from '@mui/material';\r\nimport { PhoneEnabled, WhatsApp, Facebook, Instagram, ThreeP, Email } from '@mui/icons-material';\r\nimport {\r\n BusinessSection,\r\n ContactMethod,\r\n Header,\r\n LabelsSection,\r\n MembersSection,\r\n Properties,\r\n} from './components';\r\nimport { useEffect } from 'react';\r\nimport { useTranslation, I18nextProvider } from 'react-i18next';\r\nimport i18nInstance from '../../i18n/config';\r\n// Utils\r\nimport { isBusiness } from './types/is-business.typeguard';\r\nimport { isContact } from './types/is-contact.typeguard';\r\n\r\nconst PopupContainer = styled(Box)(({ theme }) => ({\r\n //@ts-ignore\r\n backgroundColor: theme.palette.background.panel,\r\n boxShadow: '0px 4px 10px rgba(0, 0, 0, 0.1)',\r\n borderRadius: '8px',\r\n width: 300,\r\n maxHeight: 'calc(100vh - 500px)',\r\n overflowY: 'auto',\r\n transition: 'opacity 0.3s ease, transform 0.3s ease',\r\n padding: '8px',\r\n zIndex: 1300,\r\n\r\n '&::-webkit-scrollbar': {\r\n width: 5,\r\n },\r\n '&::-webkit-scrollbar-track': {\r\n background: '#E0E0E0',\r\n borderRadius: 10,\r\n },\r\n '&::-webkit-scrollbar-thumb': {\r\n background: '#9E9E9E',\r\n borderRadius: 10,\r\n transition: 'background 0.3s',\r\n },\r\n '&::-webkit-scrollbar-thumb:hover': {\r\n background: '#616161',\r\n },\r\n}));\r\n\r\nexport interface ContactInfoPopupProps {\r\n open: boolean;\r\n anchorEl: HTMLElement | null;\r\n onClose: () => void;\r\n language?: 'en' | 'es';\r\n contactData?: IContact | IBusiness;\r\n avatarImgUrl?: string;\r\n sx?: SxProps<Theme>;\r\n navigate: (path: string) => void;\r\n}\r\n\r\nconst ContactInfoPopupContent = ({\r\n open,\r\n anchorEl,\r\n onClose,\r\n contactData,\r\n avatarImgUrl,\r\n navigate,\r\n language = 'en',\r\n}: ContactInfoPopupProps) => {\r\n const { t: i18nT, i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n if (language) {\r\n i18n.changeLanguage(language);\r\n }\r\n }, [language, i18n]);\r\n\r\n const t = i18nT;\r\n const dataIsBusiness = isBusiness(contactData);\r\n const dataIsContact = isContact(contactData);\r\n\r\n const contactMethods = [\r\n {\r\n icon: <PhoneEnabled fontSize=\"small\" />,\r\n title: t('phone'),\r\n contactList: contactData?.phones || [],\r\n showTitle: true,\r\n },\r\n {\r\n icon: <Email fontSize=\"small\" />,\r\n title: t('email'),\r\n contactList: contactData?.emails || [],\r\n showTitle: true,\r\n },\r\n {\r\n icon: <WhatsApp fontSize=\"small\" />,\r\n title: 'IM',\r\n contactList: contactData?.ims_whatsapp || [],\r\n showTitle: true,\r\n },\r\n {\r\n icon: <Facebook fontSize=\"small\" />,\r\n contactList: contactData?.ims_facebook || [],\r\n showTitle: false,\r\n },\r\n {\r\n icon: <Instagram fontSize=\"small\" />,\r\n contactList: contactData?.ims_instagram || [],\r\n showTitle: false,\r\n },\r\n {\r\n icon: <ThreeP fontSize=\"small\" />,\r\n contactList: contactData?.ims_webchat || [],\r\n showTitle: false,\r\n },\r\n ];\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n onClose();\r\n }\r\n };\r\n\r\n if (open) {\r\n window.addEventListener('keydown', handleKeyDown);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, [open, onClose]);\r\n\r\n return (\r\n <Popper\r\n sx={{ zIndex: 1300 }}\r\n open={open}\r\n anchorEl={anchorEl}\r\n placement=\"bottom-start\"\r\n data-popper-child=\"true\"\r\n >\r\n <ClickAwayListener onClickAway={onClose}>\r\n <PopupContainer>\r\n <CardContent>\r\n <Header\r\n navigate={navigate}\r\n contactId={contactData?.id}\r\n imgUrl={avatarImgUrl}\r\n name={contactData?.name}\r\n onClose={onClose}\r\n isBusiness={dataIsBusiness}\r\n />\r\n\r\n {/* Labels */}\r\n <LabelsSection contactData={contactData} title={t('labels')} />\r\n\r\n {/* Business from the IContact*/}\r\n {dataIsContact && <BusinessSection contactData={contactData} title={t('business')} />}\r\n\r\n {/* Members from the IBusiness */}\r\n {dataIsBusiness && (\r\n <MembersSection\r\n contactData={contactData}\r\n title={t('businessMembers')}\r\n navigate={navigate}\r\n />\r\n )}\r\n\r\n {/* Contact Methods */}\r\n {contactMethods.map((method, index) => (\r\n <ContactMethod\r\n key={index}\r\n icon={method.icon}\r\n title={method.title}\r\n contactList={method.contactList}\r\n showTitle={method.showTitle}\r\n />\r\n ))}\r\n\r\n {/* Properties */}\r\n <Properties properties={contactData?.properties} title={t('properties')} />\r\n </CardContent>\r\n </PopupContainer>\r\n </ClickAwayListener>\r\n </Popper>\r\n );\r\n};\r\n\r\nconst ContactInfoPopup = (props: ContactInfoPopupProps) => {\r\n return (\r\n <I18nextProvider i18n={i18nInstance}>\r\n <ContactInfoPopupContent {...props} />\r\n </I18nextProvider>\r\n );\r\n};\r\n\r\nexport default ContactInfoPopup;\r\n","import { createContext, useContext } from 'react';\r\nimport type { ReactNode } from 'react';\r\n\r\nexport type TranslationFn = (key: string, ...args: unknown[]) => string;\r\n\r\nconst noop: TranslationFn = (key: string) => key;\r\nconst TranslationContext = createContext<TranslationFn>(noop);\r\n\r\ninterface TranslationProviderProps {\r\n t: TranslationFn;\r\n children: ReactNode;\r\n}\r\n\r\nexport const TranslationProvider = ({ t, children }: TranslationProviderProps) => {\r\n return <TranslationContext.Provider value={t}>{children}</TranslationContext.Provider>;\r\n};\r\n\r\nexport const useTranslationContext = (): TranslationFn => {\r\n const t = useContext(TranslationContext);\r\n if (!t) {\r\n console.warn('[useTranslationContext] using noop, context value is falsy');\r\n return noop;\r\n }\r\n return (...args: Parameters<TranslationFn>) => {\r\n const [key, ...rest] = args;\r\n const result = t(key, ...rest);\r\n return result;\r\n };\r\n};\r\n","import { IContactTag } from '@trii/types/dist/Contacts';\r\nimport { Box, Chip, IconButton, Popover, Stack, Typography } from '@mui/material';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport LabelIcon from '@mui/icons-material/Label';\r\nimport { useMemo, useState } from 'react';\r\nimport type { MouseEvent } from 'react';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ninterface TagsProps {\r\n tags: IContactTag[];\r\n onEditTags: () => void;\r\n}\r\n\r\nconst Tags = ({ tags, onEditTags }: TagsProps) => {\r\n const t = useTranslationContext();\r\n\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n const safeTags = useMemo(() => tags ?? [], [tags]);\r\n const MAX_VISIBLE = 4;\r\n const visibleTags = safeTags.slice(0, MAX_VISIBLE);\r\n const hiddenCount = Math.max(safeTags.length - visibleTags.length, 0);\r\n\r\n const handleOpen = (event: MouseEvent<HTMLElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const open = Boolean(anchorEl);\r\n\r\n return (\r\n <Box\r\n sx={{\r\n mt: 1,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n maxWidth: 320,\r\n position: 'relative',\r\n '&:hover .tags-action, &:focus-within .tags-action': {\r\n opacity: 1,\r\n },\r\n }}\r\n >\r\n <Stack direction=\"row\" spacing={1} useFlexGap flexWrap=\"wrap\" justifyContent=\"center\">\r\n {visibleTags.map((tag) => (\r\n <Chip\r\n key={tag.id}\r\n label={tag.name}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n sx={{\r\n borderRadius: 999,\r\n maxWidth: 140,\r\n '& .MuiChip-label': {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n }}\r\n />\r\n ))}\r\n\r\n {hiddenCount > 0 ? (\r\n <Chip\r\n label={`+${hiddenCount}`}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n onClick={handleOpen}\r\n sx={{ borderRadius: 999 }}\r\n />\r\n ) : null}\r\n </Stack>\r\n\r\n <IconButton\r\n className=\"tags-action\"\r\n size=\"small\"\r\n aria-label={safeTags.length ? t('tags.edit') : t('tags.add')}\r\n onClick={onEditTags}\r\n sx={{\r\n position: 'absolute',\r\n left: '100%',\r\n ml: 1,\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n color: 'text.secondary',\r\n bgcolor: 'background.paper',\r\n opacity: 0,\r\n transition: 'opacity 0.2s ease-in-out',\r\n '&:hover': {\r\n bgcolor: 'action.hover',\r\n color: 'text.primary',\r\n },\r\n }}\r\n >\r\n {safeTags.length ? <EditIcon fontSize=\"small\" /> : <LabelIcon fontSize=\"small\" />}\r\n </IconButton>\r\n </Box>\r\n\r\n <Popover\r\n open={open}\r\n anchorEl={anchorEl}\r\n onClose={handleClose}\r\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\r\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\r\n >\r\n <Box sx={{ p: 1.5, maxWidth: 320, maxHeight: 240, overflowY: 'auto' }}>\r\n <Typography variant=\"subtitle2\" sx={{ mb: 1 }}>\r\n {t('tags')}\r\n </Typography>\r\n <Stack direction=\"row\" spacing={1} useFlexGap flexWrap=\"wrap\">\r\n {safeTags.map((tag) => (\r\n <Chip\r\n key={tag.id}\r\n label={tag.name}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n sx={{\r\n borderRadius: 999,\r\n maxWidth: 160,\r\n '& .MuiChip-label': {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n },\r\n }}\r\n />\r\n ))}\r\n </Stack>\r\n </Box>\r\n </Popover>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Tags;\r\n","import { createContext, useContext } from 'react';\r\nimport type { EditContactApi } from '../services/api';\r\n\r\nconst EditContactApiContext = createContext<EditContactApi | null>(null);\r\n\r\nexport const EditContactApiProvider = EditContactApiContext.Provider;\r\n\r\nexport const useEditContactApi = () => {\r\n return useContext(EditContactApiContext);\r\n};\r\n","import { Box, styled, Typography, IconButton, TextField, CircularProgress } from '@mui/material';\r\nimport { Edit, Save } from '@mui/icons-material';\r\nimport { useState, useEffect } from 'react';\r\nimport { IContact, IBusiness } from '@trii/types/dist/Contacts/contacts';\r\nimport { useEditContactApi } from '../../../../context/EditContactApiContext';\r\n\r\nconst NameText = styled(Typography)({\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n maxWidth: 360,\r\n textAlign: 'center',\r\n});\r\n\r\nconst NameWrapper = styled(Box)({\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '100%',\r\n});\r\n\r\nconst NameContainer = styled(Box)({\r\n position: 'relative',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n maxWidth: '100%',\r\n '&:hover .edit-icon': {\r\n opacity: 1,\r\n visibility: 'visible',\r\n },\r\n});\r\n\r\nconst EditButton = styled(IconButton)({\r\n opacity: 0,\r\n visibility: 'hidden',\r\n transition: 'all 0.2s',\r\n position: 'absolute',\r\n left: '100%',\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n});\r\n\r\nexport type ContactNameProps = {\r\n displayName: string;\r\n contactType?: 'contact' | 'business' | 'unknown';\r\n firstName?: string;\r\n lastName?: string;\r\n name?: string;\r\n entityId?: string;\r\n onEntityUpdated?: (data: IContact | IBusiness) => void;\r\n};\r\n\r\nconst ContactName = ({\r\n displayName,\r\n contactType,\r\n firstName,\r\n lastName,\r\n name,\r\n entityId,\r\n onEntityUpdated,\r\n}: ContactNameProps) => {\r\n const api = useEditContactApi();\r\n const [isEditing, setIsEditing] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [values, setValues] = useState({\r\n firstName: firstName || '',\r\n lastName: lastName || '',\r\n name: name || '',\r\n });\r\n\r\n useEffect(() => {\r\n setValues({\r\n firstName: firstName || '',\r\n lastName: lastName || '',\r\n name: name || '',\r\n });\r\n }, [firstName, lastName, name]);\r\n\r\n const handleSave = async () => {\r\n if (!api || !entityId || !contactType || contactType === 'unknown') return;\r\n\r\n setLoading(true);\r\n try {\r\n let body: any = {};\r\n if (contactType === 'contact') {\r\n body = { firstName: values.firstName, lastName: values.lastName };\r\n } else if (contactType === 'business') {\r\n body = { name: values.name };\r\n }\r\n\r\n const updated = await api.updateEntity({\r\n entityType: contactType,\r\n entityId,\r\n body,\r\n });\r\n\r\n if (updated && onEntityUpdated) {\r\n onEntityUpdated(updated);\r\n }\r\n setIsEditing(false);\r\n } catch (err) {\r\n console.error('Failed to update name', err);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const showEdit = contactType === 'contact' || contactType === 'business';\r\n\r\n if (isEditing) {\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mt: 1 }}>\r\n {contactType === 'contact' ? (\r\n <>\r\n <TextField\r\n value={values.firstName}\r\n onChange={(e) => setValues({ ...values, firstName: e.target.value })}\r\n size=\"small\"\r\n placeholder=\"First Name\"\r\n sx={{ width: 140 }}\r\n />\r\n <TextField\r\n value={values.lastName}\r\n onChange={(e) => setValues({ ...values, lastName: e.target.value })}\r\n size=\"small\"\r\n placeholder=\"Last Name\"\r\n sx={{ width: 140 }}\r\n />\r\n </>\r\n ) : (\r\n <TextField\r\n value={values.name}\r\n onChange={(e) => setValues({ ...values, name: e.target.value })}\r\n size=\"small\"\r\n placeholder=\"Name\"\r\n sx={{ width: 280 }}\r\n />\r\n )}\r\n <IconButton onClick={handleSave} disabled={loading} color=\"primary\">\r\n {loading ? <CircularProgress size={24} /> : <Save />}\r\n </IconButton>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <NameWrapper>\r\n <NameContainer>\r\n <NameText variant=\"h6\" title={displayName}>\r\n {displayName}\r\n </NameText>\r\n {showEdit && (\r\n <EditButton\r\n size=\"small\"\r\n onClick={() => setIsEditing(true)}\r\n className=\"edit-icon\"\r\n sx={{ ml: 1 }}\r\n >\r\n <Edit fontSize=\"small\" />\r\n </EditButton>\r\n )}\r\n </NameContainer>\r\n </NameWrapper>\r\n );\r\n};\r\n\r\nexport default ContactName;\r\n","import DeleteIcon from '@mui/icons-material/Delete';\r\nimport PhotoCameraIcon from '@mui/icons-material/PhotoCamera';\r\nimport { Avatar, Box, IconButton } from '@mui/material';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ntype AvatarWithActionsProps = {\r\n src?: string;\r\n alt: string;\r\n onError?: () => void;\r\n onUpload?: () => void;\r\n onDelete?: () => void;\r\n isUploading?: boolean;\r\n isDeleting?: boolean;\r\n};\r\n\r\nconst AvatarWithActions = ({\r\n src,\r\n alt,\r\n onError,\r\n onUpload,\r\n onDelete,\r\n isUploading,\r\n isDeleting,\r\n}: AvatarWithActionsProps) => {\r\n const t = useTranslationContext();\r\n return (\r\n <Box\r\n sx={{\r\n width: 60,\r\n height: 60,\r\n mb: 1,\r\n position: 'relative',\r\n '&:hover .avatar-actions, &:focus-within .avatar-actions': {\r\n opacity: 1,\r\n pointerEvents: 'auto',\r\n },\r\n }}\r\n >\r\n <Avatar\r\n src={src}\r\n alt={alt}\r\n onError={onError}\r\n sx={{\r\n width: 60,\r\n height: 60,\r\n }}\r\n />\r\n\r\n <Box\r\n className=\"avatar-actions\"\r\n sx={{\r\n position: 'absolute',\r\n inset: 0,\r\n borderRadius: '50%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 0.5,\r\n bgcolor: 'rgba(0, 0, 0, 0.35)',\r\n opacity: 0,\r\n pointerEvents: 'none',\r\n transition: 'opacity 0.2s ease-in-out',\r\n }}\r\n >\r\n <IconButton\r\n size=\"small\"\r\n aria-label={t('avatar.upload')}\r\n onClick={onUpload}\r\n disabled={Boolean(isUploading)}\r\n sx={{\r\n color: 'common.white',\r\n bgcolor: 'rgba(0, 0, 0, 0.25)',\r\n '&:hover': { bgcolor: 'rgba(0, 0, 0, 0.35)' },\r\n }}\r\n >\r\n <PhotoCameraIcon fontSize=\"small\" />\r\n </IconButton>\r\n\r\n <IconButton\r\n size=\"small\"\r\n aria-label={t('avatar.delete')}\r\n onClick={onDelete}\r\n disabled={Boolean(isDeleting)}\r\n sx={{\r\n color: 'common.white',\r\n bgcolor: 'rgba(0, 0, 0, 0.25)',\r\n '&:hover': { bgcolor: 'rgba(0, 0, 0, 0.35)' },\r\n }}\r\n >\r\n <DeleteIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default AvatarWithActions;\r\n","import { Box, styled } from '@mui/material';\r\nimport { Tags, ContactName } from './components';\r\nimport { IContactTag, IContact, IBusiness } from '@trii/types/dist/Contacts/contacts';\r\nimport AvatarWithActions from './components/AvatarWithActions/AvatarWithActions';\r\nimport type { ChangeEvent, RefObject } from 'react';\r\n\r\nconst HeaderContainer = styled(Box)({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n gap: '4px',\r\n marginBottom: '20px',\r\n position: 'relative',\r\n});\r\n\r\ntype HeaderProps = {\r\n imgUrl?: string;\r\n displayName: string;\r\n onError?: (error: Error) => void;\r\n tags: IContactTag[];\r\n onEditTags: () => void;\r\n onUploadPhoto: () => void;\r\n onPhotoFileChange: (event: ChangeEvent<HTMLInputElement>) => void;\r\n photoInputRef: RefObject<HTMLInputElement>;\r\n isUploadingPhoto: boolean;\r\n onDeletePhoto: () => void;\r\n isDeletingPhoto: boolean;\r\n contactType?: 'contact' | 'business' | 'unknown';\r\n firstName?: string;\r\n lastName?: string;\r\n name?: string;\r\n entityId?: string;\r\n onEntityUpdated?: (data: IContact | IBusiness) => void;\r\n};\r\n\r\nconst Header = ({\r\n imgUrl,\r\n displayName,\r\n onError,\r\n tags,\r\n onEditTags,\r\n onUploadPhoto,\r\n onPhotoFileChange,\r\n photoInputRef,\r\n isUploadingPhoto,\r\n onDeletePhoto,\r\n isDeletingPhoto,\r\n contactType,\r\n firstName,\r\n lastName,\r\n name,\r\n entityId,\r\n onEntityUpdated,\r\n}: HeaderProps) => {\r\n const avatarAlt = `Avatar for ${displayName}`;\r\n\r\n return (\r\n <HeaderContainer>\r\n <input\r\n ref={photoInputRef}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n onChange={onPhotoFileChange}\r\n style={{ display: 'none' }}\r\n />\r\n <AvatarWithActions\r\n src={imgUrl}\r\n alt={avatarAlt}\r\n onError={() => onError?.(new Error('Failed to load avatar'))}\r\n onUpload={onUploadPhoto}\r\n isUploading={isUploadingPhoto}\r\n onDelete={onDeletePhoto}\r\n isDeleting={isDeletingPhoto}\r\n />\r\n\r\n <ContactName\r\n displayName={displayName}\r\n contactType={contactType}\r\n firstName={firstName}\r\n lastName={lastName}\r\n name={name}\r\n entityId={entityId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n\r\n <Tags tags={tags} onEditTags={onEditTags} />\r\n </HeaderContainer>\r\n );\r\n};\r\n\r\nexport default Header;\r\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\r\nimport SaveIcon from '@mui/icons-material/Save';\r\nimport { Autocomplete, Box, Chip, IconButton, Stack, TextField, Typography } from '@mui/material';\r\nimport Popper, { PopperProps } from '@mui/material/Popper';\r\nimport { LoadingButton } from '@mui/lab';\r\nimport { ILabel } from '@trii/types/dist/Contacts';\r\nimport { useDeferredValue, useMemo, useState } from 'react';\r\nimport { useTranslationContext } from '../../context/TranslationContext';\r\n\r\ntype TagsEditorProps = {\r\n value: ILabel[];\r\n options: ILabel[];\r\n onChange: (value: ILabel[]) => void;\r\n onBack: () => void;\r\n onSave: () => void;\r\n isSaving: boolean;\r\n onCreateNew: (name: string) => void;\r\n isCreatingNew: boolean;\r\n popperContainer?: HTMLElement | null;\r\n};\r\n\r\nconst PAGE_SIZE = 20;\r\n\r\nconst AutocompletePopper = (props: PopperProps & { popperContainer?: HTMLElement | null }) => {\r\n const { popperContainer, ...rest } = props;\r\n return (\r\n <Popper\r\n {...rest}\r\n container={popperContainer ?? rest.container}\r\n style={{ ...(rest.style ?? {}), zIndex: 20000 }}\r\n />\r\n );\r\n};\r\n\r\nconst TagsEditor = ({\r\n value,\r\n options,\r\n onChange,\r\n onBack,\r\n onSave,\r\n isSaving,\r\n onCreateNew,\r\n isCreatingNew,\r\n popperContainer,\r\n}: TagsEditorProps) => {\r\n const t = useTranslationContext();\r\n\r\n const [searchValue, setSearchValue] = useState<string>('');\r\n const [limit, setLimit] = useState(PAGE_SIZE);\r\n\r\n const deferredSearchValue = useDeferredValue(searchValue);\r\n\r\n const safeOptions = useMemo(() => options ?? [], [options]);\r\n\r\n const filteredOptions = useMemo(() => {\r\n const q = String(deferredSearchValue ?? '')\r\n .trim()\r\n .toLowerCase();\r\n if (!q) return safeOptions;\r\n\r\n return safeOptions.filter((o) =>\r\n String(o?.name ?? '')\r\n .toLowerCase()\r\n .includes(q),\r\n );\r\n }, [safeOptions, deferredSearchValue]);\r\n\r\n const visibleOptions = useMemo(() => filteredOptions.slice(0, limit), [filteredOptions, limit]);\r\n\r\n const optionsWithSelectedValues = useMemo(() => {\r\n const byId = new Map<string, ILabel>();\r\n\r\n for (const selected of value ?? []) {\r\n if (!selected?.id) continue;\r\n byId.set(String(selected.id), selected);\r\n }\r\n\r\n for (const opt of visibleOptions ?? []) {\r\n if (!opt?.id) continue;\r\n if (byId.has(String(opt.id))) continue;\r\n byId.set(String(opt.id), opt);\r\n }\r\n\r\n return Array.from(byId.values());\r\n }, [value, visibleOptions]);\r\n\r\n const handleSearchChange = (_: unknown, newInputValue: string) => {\r\n setSearchValue(newInputValue ?? '');\r\n setLimit(PAGE_SIZE);\r\n };\r\n\r\n const onListboxScroll = (event: unknown) => {\r\n const element = event as HTMLElement;\r\n const nearBottom = element.scrollTop + element.clientHeight >= element.scrollHeight - 24;\r\n if (nearBottom) setLimit((l) => l + PAGE_SIZE);\r\n };\r\n\r\n const CustomNoOptionsMessage = () => {\r\n const trimmedSearchValue = String(searchValue ?? '').trim();\r\n const isDisabled = !trimmedSearchValue || isSaving || isCreatingNew;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n }}\r\n >\r\n {t('global.noOptions')}\r\n <LoadingButton\r\n onClick={() => onCreateNew(trimmedSearchValue)}\r\n loading={isCreatingNew}\r\n disabled={isDisabled}\r\n variant=\"contained\"\r\n size=\"small\"\r\n sx={{ marginTop: 1.3 }}\r\n >\r\n {t('global.createNew')}\r\n </LoadingButton>\r\n </Box>\r\n );\r\n };\r\n\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 2 }}>\r\n <IconButton size=\"small\" onClick={onBack} aria-label={t('global.back')} disabled={isSaving}>\r\n <ArrowBackIcon fontSize=\"small\" />\r\n </IconButton>\r\n <Typography variant=\"subtitle1\">{t('tags')}</Typography>\r\n\r\n <Box sx={{ flex: 1 }} />\r\n\r\n <LoadingButton\r\n variant=\"contained\"\r\n size=\"small\"\r\n startIcon={<SaveIcon />}\r\n onClick={onSave}\r\n loading={isSaving}\r\n disabled={isSaving}\r\n >\r\n {t('global.save')}\r\n </LoadingButton>\r\n </Stack>\r\n\r\n <Autocomplete<ILabel, true, false, false>\r\n multiple\r\n disablePortal={false}\r\n value={value}\r\n onChange={(_, newValue) => onChange(newValue)}\r\n options={optionsWithSelectedValues}\r\n filterOptions={(x) => x}\r\n inputValue={searchValue}\r\n onInputChange={handleSearchChange}\r\n getOptionLabel={(option) => option?.name ?? ''}\r\n isOptionEqualToValue={(o, v) => String(o?.id) === String(v?.id)}\r\n PopperComponent={(props) => (\r\n <AutocompletePopper {...props} popperContainer={popperContainer} />\r\n )}\r\n renderOption={(props, option) => {\r\n const { key, ...rest } = props as any;\r\n return (\r\n <li {...rest} key={option?.id ? String(option.id) : String(key ?? option?.name ?? '')}>\r\n {option.name ?? ''}\r\n </li>\r\n );\r\n }}\r\n renderTags={(tagValue, getTagProps) =>\r\n tagValue.map((option, index) => {\r\n const tagProps = getTagProps({ index }) as any;\r\n const { key, ...rest } = tagProps;\r\n return (\r\n <Chip\r\n key={option?.id ? String(option.id) : String(key ?? option?.name ?? index)}\r\n label={option.name ?? ''}\r\n {...rest}\r\n />\r\n );\r\n })\r\n }\r\n size=\"small\"\r\n renderInput={(params) => <TextField {...params} size=\"small\" />}\r\n ListboxProps={{\r\n onScroll: onListboxScroll as any,\r\n sx: { maxHeight: 280, overflowY: 'auto' },\r\n }}\r\n noOptionsText={<CustomNoOptionsMessage />}\r\n sx={{ width: '100%' }}\r\n />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default TagsEditor;\r\n","export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n\r\nexport class ApiError extends Error {\r\n status: number;\r\n body: unknown;\r\n\r\n constructor(message: string, status: number, body: unknown) {\r\n super(message);\r\n this.name = 'ApiError';\r\n this.status = status;\r\n this.body = body;\r\n }\r\n}\r\n\r\ntype RequestJsonArgs = {\r\n url: string;\r\n method?: HttpMethod;\r\n headers?: HeadersInit;\r\n body?: unknown;\r\n signal?: AbortSignal;\r\n};\r\n\r\nexport async function requestJson<T>({\r\n url,\r\n method = 'GET',\r\n headers,\r\n body,\r\n signal,\r\n}: RequestJsonArgs): Promise<T> {\r\n const res = await globalThis.fetch(url, {\r\n method,\r\n headers: {\r\n ...(body ? { 'Content-Type': 'application/json' } : {}),\r\n ...(headers ?? {}),\r\n },\r\n body: body ? JSON.stringify(body) : undefined,\r\n signal,\r\n });\r\n\r\n const contentType = res.headers.get('content-type') || '';\r\n const isJson = contentType.includes('application/json');\r\n const parsedBody = isJson ? await res.json().catch(() => null) : await res.text().catch(() => null);\r\n\r\n if (!res.ok) {\r\n const message =\r\n typeof parsedBody === 'object' && parsedBody && 'message' in (parsedBody as any)\r\n ? String((parsedBody as any).message)\r\n : `Request failed with status ${res.status}`;\r\n\r\n throw new ApiError(message, res.status, parsedBody);\r\n }\r\n\r\n return parsedBody as T;\r\n}\r\n\r\ntype RequestFormDataArgs = {\r\n url: string;\r\n method?: HttpMethod;\r\n headers?: HeadersInit;\r\n formData: FormData;\r\n signal?: AbortSignal;\r\n};\r\n\r\nexport async function requestFormData<T>({\r\n url,\r\n method = 'POST',\r\n headers,\r\n formData,\r\n signal,\r\n}: RequestFormDataArgs): Promise<T> {\r\n const res = await globalThis.fetch(url, {\r\n method,\r\n headers: {\r\n ...(headers ?? {}),\r\n },\r\n body: formData,\r\n signal,\r\n });\r\n\r\n const contentType = res.headers.get('content-type') || '';\r\n const isJson = contentType.includes('application/json');\r\n const parsedBody = isJson ? await res.json().catch(() => null) : await res.text().catch(() => null);\r\n\r\n if (!res.ok) {\r\n const message =\r\n typeof parsedBody === 'object' && parsedBody && 'message' in (parsedBody as any)\r\n ? String((parsedBody as any).message)\r\n : `Request failed with status ${res.status}`;\r\n\r\n throw new ApiError(message, res.status, parsedBody);\r\n }\r\n\r\n return parsedBody as T;\r\n}\r\n","export function joinUrl(baseUrl: string, path: string) {\r\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\r\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\r\n return `${normalizedBase}${normalizedPath}`;\r\n}\r\n\r\nexport function getApiUrls(baseUrl: string, spaceId: string) {\r\n const encodedSpaceId = encodeURIComponent(spaceId);\r\n\r\n return {\r\n CONTACTS: joinUrl(baseUrl, `/contacts/${encodedSpaceId}`),\r\n MEDIA: joinUrl(baseUrl, `/media/${encodedSpaceId}`),\r\n SETTINGS: joinUrl(baseUrl, `/settings/${encodedSpaceId}`),\r\n };\r\n}\r\n","import {\r\n IBusiness,\r\n IContact,\r\n IContactField,\r\n IContactTag,\r\n IContactAddress,\r\n} from '@trii/types/dist/Contacts/contacts';\r\nimport { ILabel } from '@trii/types/dist/Contacts';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { requestFormData, requestJson } from './http';\r\nimport { UserTrii } from '@trii/types/dist/Users';\r\nimport { getApiUrls, joinUrl } from './urls';\r\nimport type { UserInfo } from '@trii/types/dist/Users';\r\n\r\ntype ApiContext = {\r\n baseUrl: string;\r\n spaceId: string;\r\n};\r\n\r\ntype WithSignal = { signal?: AbortSignal };\r\n\r\ntype ApiArgs = ApiContext & WithSignal;\r\n\r\nexport type Order = 'ASC' | 'DESC';\r\n\r\nexport type Filter = {\r\n column: string;\r\n condition: string;\r\n value: string;\r\n};\r\n\r\nexport type TableItemFormat = 'IContact' | 'IBusiness' | 'IContactInfo';\r\n\r\nexport type PaginationFolder = 'Main' | 'Trash' | 'MyContacts';\r\n\r\nexport type Pagination = {\r\n total: number;\r\n lastPage: number;\r\n currentPage: number;\r\n perPage: number;\r\n order: Order;\r\n orderColumn: string;\r\n filter: Filter[];\r\n format: TableItemFormat;\r\n folder?: PaginationFolder;\r\n};\r\n\r\nexport type PaginationInfo = {\r\n total: number;\r\n lastPage: number;\r\n currentPage: number;\r\n perPage: number;\r\n cantPageElements: number;\r\n};\r\n\r\nexport type BusinessTableData = {\r\n contactos: IBusiness[];\r\n contactosIds: unknown[];\r\n paginacion: PaginationInfo;\r\n};\r\n\r\ntype FetchContactArgs = ApiArgs & {\r\n contactId: string;\r\n};\r\n\r\ntype FetchLabelsArgs = ApiArgs;\r\n\r\ntype CreateLabelArgs = ApiArgs & {\r\n name: string;\r\n};\r\n\r\nexport async function fetchLabels({ baseUrl, spaceId, signal }: FetchLabelsArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/labels');\r\n return requestJson<ILabel[]>({ url, signal });\r\n}\r\n\r\nexport async function createLabel({ baseUrl, spaceId, name, signal }: CreateLabelArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/labels');\r\n return requestJson<ILabel>({ url, method: 'POST', body: { name }, signal });\r\n}\r\n\r\nexport async function fetchContact({ baseUrl, spaceId, contactId, signal }: FetchContactArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, `/contacts/${encodeURIComponent(contactId)}`);\r\n return requestJson<IContact | IBusiness>({ url, signal });\r\n}\r\n\r\ntype FetchContactFieldsArgs = ApiArgs & {\r\n forType: 'contact' | 'business';\r\n};\r\n\r\nexport async function fetchContactFields({\r\n baseUrl,\r\n spaceId,\r\n forType,\r\n signal,\r\n}: FetchContactFieldsArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = `${joinUrl(urls.CONTACTS, '/ContactFields')}?filter=custom&for=${encodeURIComponent(forType)}`;\r\n return requestJson<IContactField[]>({ url, signal });\r\n}\r\n\r\ntype UpdateEntityArgs = ApiArgs & {\r\n entityType: 'contact' | 'business';\r\n entityId: string;\r\n body: Partial<IContact> | Partial<IBusiness> | { tags: IContactTag[] };\r\n};\r\n\r\nexport async function updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType,\r\n entityId,\r\n body,\r\n signal,\r\n}: UpdateEntityArgs) {\r\n const path =\r\n entityType === 'business'\r\n ? `/business/${encodeURIComponent(entityId)}`\r\n : `/contacts/${encodeURIComponent(entityId)}`;\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, path);\r\n return requestJson<IContact | IBusiness>({ url, method: 'PUT', body, signal });\r\n}\r\n\r\ntype FetchBusinessTableDataArgs = ApiArgs & {\r\n pagination: Pagination;\r\n};\r\n\r\nexport async function fetchBusinessTableData({\r\n baseUrl,\r\n spaceId,\r\n pagination,\r\n signal,\r\n}: FetchBusinessTableDataArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/Search');\r\n return requestJson<BusinessTableData>({ url, method: 'POST', body: pagination, signal });\r\n}\r\n\r\ntype CreateBusinessArgs = ApiArgs & {\r\n business: Record<string, unknown>;\r\n};\r\n\r\nexport async function createBusiness({ baseUrl, spaceId, business, signal }: CreateBusinessArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/business');\r\n return requestJson<IBusiness>({ url, method: 'POST', body: business, signal });\r\n}\r\n\r\ntype DeleteContactAddressData = {\r\n contactId: string;\r\n contactAddressId: string;\r\n type: ChannelType;\r\n};\r\n\r\ntype CheckContactAddressData = {\r\n address: string;\r\n type: ChannelType;\r\n};\r\n\r\ntype ResultContactAddressCheck = {\r\n success: boolean;\r\n warnings: string[];\r\n};\r\n\r\ntype DeleteContactAddressArgs = ApiArgs & {\r\n data: DeleteContactAddressData;\r\n};\r\n\r\ntype CheckContactAddressArgs = ApiArgs & {\r\n data: CheckContactAddressData;\r\n};\r\n\r\nexport type SetContactAddressRequestData = {\r\n address: string;\r\n type: ChannelType;\r\n contactId: string;\r\n};\r\n\r\nexport type UpdateContactAddressData = {\r\n contactId: string;\r\n contactAddressId: string;\r\n note?: string;\r\n isFavorite?: boolean;\r\n};\r\n\r\ntype SetContactAddressArgs = ApiArgs & {\r\n data: SetContactAddressRequestData;\r\n};\r\n\r\ntype UpdateContactAddressArgs = ApiArgs & {\r\n data: UpdateContactAddressData;\r\n};\r\n\r\nexport async function deleteAddress({ baseUrl, spaceId, data, signal }: DeleteContactAddressArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/contactAddresses');\r\n return requestJson<unknown>({ url, method: 'DELETE', body: data, signal });\r\n}\r\n\r\nexport async function checkContactAddress({\r\n baseUrl,\r\n spaceId,\r\n data,\r\n signal,\r\n}: CheckContactAddressArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/contactAddresses/check');\r\n return requestJson<ResultContactAddressCheck>({ url, method: 'POST', body: data, signal });\r\n}\r\n\r\nexport async function setContactAddress({ baseUrl, spaceId, data, signal }: SetContactAddressArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.CONTACTS, '/contactAddresses/set');\r\n return requestJson<IContactAddress>({ url, method: 'POST', body: data, signal });\r\n}\r\n\r\nexport async function updateContactAddress({\r\n baseUrl,\r\n spaceId,\r\n data,\r\n signal,\r\n}: UpdateContactAddressArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(\r\n urls.CONTACTS,\r\n `/contactAddresses/${encodeURIComponent(data.contactAddressId)}`,\r\n );\r\n return requestJson<IContactAddress>({ url, method: 'PUT', body: data, signal });\r\n}\r\n\r\ntype FetchUserTriiArgs = ApiArgs;\r\n\r\nexport async function fetchUserTrii({ baseUrl, spaceId, signal }: FetchUserTriiArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.SETTINGS, `/user`);\r\n return requestJson<UserTrii>({ url, signal });\r\n}\r\n\r\ntype FetchUsersArgs = ApiArgs;\r\n\r\nexport async function fetchUsers({ baseUrl, spaceId, signal }: FetchUsersArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.SETTINGS, `/users`);\r\n return requestJson<UserInfo[]>({ url, signal });\r\n}\r\n\r\ntype FetchUserTriiByIdArgs = ApiArgs & { userId: string };\r\n\r\nexport async function fetchUserTriiById({\r\n baseUrl,\r\n spaceId,\r\n signal,\r\n userId,\r\n}: FetchUserTriiByIdArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const url = joinUrl(urls.SETTINGS, `/usersInfor/${userId}`);\r\n return requestJson<UserTrii>({ url, signal });\r\n}\r\n\r\ntype UploadAvatarArgs = ApiArgs & {\r\n contactId: string;\r\n file: File;\r\n};\r\n\r\nexport async function uploadAvatar({\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n file,\r\n signal,\r\n}: UploadAvatarArgs) {\r\n const urls = getApiUrls(baseUrl, spaceId);\r\n const fd = new FormData();\r\n fd.append('file', file, file.name);\r\n\r\n const url = joinUrl(\r\n urls.MEDIA,\r\n `/upload?module=contacts&folderType=avatars&contactId=${encodeURIComponent(contactId)}`,\r\n );\r\n\r\n return requestFormData<string>({ url, formData: fd, signal });\r\n}\r\n\r\ntype FetchContactBoundArgs = WithSignal & { contactId: string };\r\ntype FetchContactFieldsBoundArgs = WithSignal & { forType: 'contact' | 'business' };\r\ntype CreateLabelBoundArgs = WithSignal & { name: string };\r\ntype UpdateEntityBoundArgs = WithSignal & {\r\n entityType: 'contact' | 'business';\r\n entityId: string;\r\n body: Partial<IContact> | Partial<IBusiness> | { tags: IContactTag[] };\r\n};\r\ntype FetchBusinessTableDataBoundArgs = WithSignal & { pagination: Pagination };\r\ntype CreateBusinessBoundArgs = WithSignal & { business: Record<string, unknown> };\r\ntype DeleteContactAddressBoundArgs = WithSignal & { data: DeleteContactAddressData };\r\ntype CheckContactAddressBoundArgs = WithSignal & { data: CheckContactAddressData };\r\ntype FetchUserTriiByIdBoundArgs = WithSignal & { userId: string };\r\ntype UploadAvatarBoundArgs = WithSignal & { contactId: string; file: File };\r\ntype SetContactAddressBoundArgs = WithSignal & { data: SetContactAddressRequestData };\r\ntype UpdateContactAddressBoundArgs = WithSignal & { data: UpdateContactAddressData };\r\n\r\nexport const createEditContactApi = (baseUrl: string, spaceId: string) => ({\r\n fetchLabels: ({ signal }: WithSignal = {}) => fetchLabels({ baseUrl, spaceId, signal }),\r\n createLabel: ({ name, signal }: CreateLabelBoundArgs) =>\r\n createLabel({ baseUrl, spaceId, name, signal }),\r\n fetchContact: ({ contactId, signal }: FetchContactBoundArgs) =>\r\n fetchContact({ baseUrl, spaceId, contactId, signal }),\r\n fetchBusinessTableData: ({ pagination, signal }: FetchBusinessTableDataBoundArgs) =>\r\n fetchBusinessTableData({ baseUrl, spaceId, pagination, signal }),\r\n createBusiness: ({ business, signal }: CreateBusinessBoundArgs) =>\r\n createBusiness({ baseUrl, spaceId, business, signal }),\r\n fetchContactFields: ({ forType, signal }: FetchContactFieldsBoundArgs) =>\r\n fetchContactFields({ baseUrl, spaceId, forType, signal }),\r\n updateEntity: ({ entityType, entityId, body, signal }: UpdateEntityBoundArgs) =>\r\n updateEntity({ baseUrl, spaceId, entityType, entityId, body, signal }),\r\n deleteAddress: ({ data, signal }: DeleteContactAddressBoundArgs) =>\r\n deleteAddress({ baseUrl, spaceId, data, signal }),\r\n deleteAddres: ({ data, signal }: DeleteContactAddressBoundArgs) =>\r\n deleteAddress({ baseUrl, spaceId, data, signal }),\r\n checkContactAddress: ({ data, signal }: CheckContactAddressBoundArgs) =>\r\n checkContactAddress({ baseUrl, spaceId, data, signal }),\r\n setContactAddress: ({ data, signal }: SetContactAddressBoundArgs) =>\r\n setContactAddress({ baseUrl, spaceId, data, signal }),\r\n updateContactAddress: ({ data, signal }: UpdateContactAddressBoundArgs) =>\r\n updateContactAddress({ baseUrl, spaceId, data, signal }),\r\n fetchUserTrii: ({ signal }: WithSignal = {}) => fetchUserTrii({ baseUrl, spaceId, signal }),\r\n fetchUsers: ({ signal }: WithSignal = {}) => fetchUsers({ baseUrl, spaceId, signal }),\r\n fetchUserTriiById: ({ userId, signal }: FetchUserTriiByIdBoundArgs) =>\r\n fetchUserTriiById({ baseUrl, spaceId, userId, signal }),\r\n uploadAvatar: ({ contactId, file, signal }: UploadAvatarBoundArgs) =>\r\n uploadAvatar({ baseUrl, spaceId, contactId, file, signal }),\r\n});\r\n\r\nexport type EditContactApi = ReturnType<typeof createEditContactApi>;\r\n","import { useEffect, useState } from 'react';\n\nexport const isGoogleMapsLoaded = (): boolean => {\n return Boolean((window as any)?.google?.maps?.places?.Autocomplete);\n};\n\nexport const waitForGoogleMaps = (maxWaitTime = 10000): Promise<boolean> => {\n return new Promise((resolve) => {\n if (isGoogleMapsLoaded()) {\n resolve(true);\n return;\n }\n\n const startTime = Date.now();\n const checkInterval = 100;\n\n const interval = window.setInterval(() => {\n if (isGoogleMapsLoaded()) {\n window.clearInterval(interval);\n resolve(true);\n return;\n }\n\n if (Date.now() - startTime > maxWaitTime) {\n window.clearInterval(interval);\n resolve(false);\n }\n }, checkInterval);\n });\n};\n\nexport const useGoogleMapsStatus = () => {\n const [isLoaded, setIsLoaded] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const checkStatus = async () => {\n try {\n const loaded = await waitForGoogleMaps(10000);\n setIsLoaded(loaded);\n if (!loaded) {\n setError('Google Maps API failed to load');\n }\n } catch {\n setError('Error loading Google Maps API');\n setIsLoaded(false);\n } finally {\n setIsLoading(false);\n }\n };\n\n checkStatus();\n }, []);\n\n return { isLoaded, isLoading, error };\n};\n","import { TextField } from '@mui/material';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { useGoogleMapsStatus } from './googleMapsUtils';\n\ntype LocationResult = {\n location: { lat: number; lng: number };\n address: string;\n city?: string;\n state?: string;\n country?: string;\n postalCode?: string;\n streetName?: string;\n streetNumber?: string;\n shortAddress?: string;\n};\n\ntype Props = {\n onPlaceSelected: (result: LocationResult) => void;\n onError?: (error: string) => void;\n placeholder?: string;\n};\n\nconst SearchLocationInput = ({ onPlaceSelected, onError, placeholder }: Props) => {\n const t = useTranslationContext();\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const autocompleteRef = useRef<any>(null);\n const placeSelectedRef = useRef(onPlaceSelected);\n const errorRef = useRef(onError);\n\n const { isLoaded, isLoading, error: mapsError } = useGoogleMapsStatus();\n\n const currentPlaceholder = useMemo(() => {\n if (isLoading) return t('searchLocationModal.loadingGoogleMaps');\n if (mapsError) return t('searchLocationModal.googleMapsUnavailable');\n if (!isLoaded) return t('searchLocationModal.googleMapsNotLoaded');\n return placeholder ?? t('searchLocationModal.enterLocation');\n }, [isLoaded, isLoading, mapsError, placeholder, t]);\n\n useEffect(() => {\n placeSelectedRef.current = onPlaceSelected;\n }, [onPlaceSelected]);\n\n useEffect(() => {\n errorRef.current = onError;\n }, [onError]);\n\n useEffect(() => {\n if (!isLoaded) return;\n if (!inputRef.current) return;\n if (autocompleteRef.current) return;\n\n const googleAny = (window as any)?.google;\n if (!googleAny?.maps?.places?.Autocomplete) {\n errorRef.current?.(t('searchLocationModal.googleMapsUnavailable'));\n return;\n }\n\n inputRef.current.focus();\n\n let observer: MutationObserver | null = null;\n\n const applyPacContainerStyles = () => {\n const pacContainers = document.querySelectorAll('.pac-container');\n pacContainers.forEach((container) => {\n const el = container as HTMLElement;\n el.style.zIndex = '20000';\n el.style.position = 'fixed';\n });\n };\n\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of Array.from(mutation.addedNodes)) {\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n const element = node as Element;\n if (!element.classList?.contains('pac-container')) continue;\n (element as HTMLElement).style.zIndex = '20000';\n (element as HTMLElement).style.position = 'fixed';\n }\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n applyPacContainerStyles();\n window.setTimeout(applyPacContainerStyles, 100);\n\n autocompleteRef.current = new googleAny.maps.places.Autocomplete(inputRef.current, {\n types: ['geocode'],\n componentRestrictions: { country: 'ar' },\n });\n\n const listener = autocompleteRef.current.addListener?.('place_changed', () => {\n const place = autocompleteRef.current?.getPlace?.();\n\n if (!place?.geometry?.location) {\n errorRef.current?.(t('searchLocationModal.selectedPlaceNoLocation'));\n return;\n }\n\n let city = '';\n let state = '';\n let country = '';\n let postalCode = '';\n let streetName = '';\n let streetNumber = '';\n\n const components: any[] = place.address_components ?? [];\n for (const component of components) {\n const types: string[] = component?.types ?? [];\n\n if (types.includes('locality') || types.includes('administrative_area_level_2')) {\n city = component.long_name;\n continue;\n }\n if (types.includes('administrative_area_level_1')) {\n state = component.long_name;\n continue;\n }\n if (types.includes('country')) {\n country = component.long_name;\n continue;\n }\n if (types.includes('postal_code')) {\n postalCode = component.long_name;\n continue;\n }\n if (types.includes('route')) {\n streetName = component.long_name;\n continue;\n }\n if (types.includes('street_number')) {\n streetNumber = component.long_name;\n }\n }\n\n const lat =\n typeof place.geometry.location.lat === 'function' ? place.geometry.location.lat() : 0;\n const lng =\n typeof place.geometry.location.lng === 'function' ? place.geometry.location.lng() : 0;\n\n const result: LocationResult = {\n location: { lat, lng },\n address: place.formatted_address ?? '',\n city,\n state,\n country,\n postalCode,\n streetName,\n streetNumber,\n shortAddress: [streetName, streetNumber].filter(Boolean).join(' '),\n };\n\n placeSelectedRef.current(result);\n });\n\n return () => {\n if (observer) observer.disconnect();\n if (listener?.remove) listener.remove();\n autocompleteRef.current = null;\n };\n }, [isLoaded, t]);\n\n const isDisabled = isLoading || !isLoaded || Boolean(mapsError);\n\n return (\n <TextField\n fullWidth\n size=\"small\"\n inputRef={inputRef}\n placeholder={currentPlaceholder}\n disabled={isDisabled}\n error={Boolean(mapsError)}\n />\n );\n};\n\nexport default SearchLocationInput;\nexport type { LocationResult };\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport SaveIcon from '@mui/icons-material/Save';\nimport { LoadingButton } from '@mui/lab';\nimport { Box, IconButton, Stack, TextField, Typography } from '@mui/material';\nimport { useMemo, useState } from 'react';\nimport type { ChangeEvent } from 'react';\nimport { updateEntity } from '../../services/api';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport SearchLocationInput, { LocationResult } from './SearchLocationInput';\n\ntype AddressDraft = {\n street: string;\n city: string;\n state: string;\n zipcode: string;\n country: string;\n};\n\ntype Props = {\n baseUrl?: string;\n spaceId?: string;\n entityType: 'contact' | 'business';\n entityId: string;\n onBack: () => void;\n onEntityUpdated?: (entity: unknown) => void;\n};\n\nconst EMPTY_DRAFT: AddressDraft = {\n street: '',\n city: '',\n state: '',\n zipcode: '',\n country: '',\n};\n\nconst SearchLocationEditor = ({\n baseUrl,\n spaceId,\n entityType,\n entityId,\n onBack,\n onEntityUpdated,\n}: Props) => {\n const t = useTranslationContext();\n\n const [draft, setDraft] = useState<AddressDraft>(EMPTY_DRAFT);\n const [query, setQuery] = useState('');\n const [error, setError] = useState('');\n\n const [isSavingMain, setIsSavingMain] = useState(false);\n const [isSavingSecondary, setIsSavingSecondary] = useState(false);\n\n const canSubmit = useMemo(() => {\n return Boolean(\n String(draft.street ?? '').trim() ||\n String(draft.city ?? '').trim() ||\n String(draft.state ?? '').trim() ||\n String(draft.zipcode ?? '').trim() ||\n String(draft.country ?? '').trim(),\n );\n }, [draft]);\n\n const handlePlaceSelected = (result: LocationResult) => {\n setQuery(result.address ?? '');\n\n const computedStreet =\n String(result.shortAddress ?? '').trim() ||\n [result.streetName, result.streetNumber].filter(Boolean).join(' ').trim();\n\n setDraft({\n street: computedStreet,\n city: result.city ?? '',\n state: result.state ?? '',\n zipcode: result.postalCode ?? '',\n country: result.country ?? '',\n });\n\n setError('');\n };\n\n const handleError = (errorMessage: string) => {\n setError(String(errorMessage ?? ''));\n };\n\n const handleChange = (key: keyof AddressDraft) => (e: ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value;\n setDraft((prev) => ({ ...prev, [key]: next }));\n };\n\n const handleSaveMainAddress = async () => {\n if (isSavingMain) return;\n if (!baseUrl || !spaceId) return;\n if (!entityId) return;\n\n setIsSavingMain(true);\n try {\n const updated = await updateEntity({\n baseUrl,\n spaceId,\n entityType,\n entityId,\n body: {\n address1: {\n street: String(draft.street ?? ''),\n city: String(draft.city ?? ''),\n state: String(draft.state ?? ''),\n zipcode: String(draft.zipcode ?? ''),\n country: String(draft.country ?? ''),\n },\n },\n });\n\n onEntityUpdated?.(updated);\n onBack();\n } finally {\n setIsSavingMain(false);\n }\n };\n\n const handleSaveSecondaryAddress = async () => {\n if (isSavingSecondary) return;\n if (!baseUrl || !spaceId) return;\n if (!entityId) return;\n\n setIsSavingSecondary(true);\n try {\n const updated = await updateEntity({\n baseUrl,\n spaceId,\n entityType,\n entityId,\n body: {\n address2: {\n street: String(draft.street ?? ''),\n city: String(draft.city ?? ''),\n state: String(draft.state ?? ''),\n zipcode: String(draft.zipcode ?? ''),\n country: String(draft.country ?? ''),\n },\n },\n });\n\n onEntityUpdated?.(updated);\n onBack();\n } finally {\n setIsSavingSecondary(false);\n }\n };\n\n const isDisabled = !canSubmit || isSavingMain || isSavingSecondary;\n\n return (\n <Box sx={{ width: '100%' }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 3 }}>\n <IconButton size=\"small\" onClick={onBack} aria-label={t('global.back')}>\n <ArrowBackIcon fontSize=\"small\" />\n </IconButton>\n <Typography variant=\"h6\">{t('searchLocationModal.searchAddress')}</Typography>\n </Stack>\n\n <Stack spacing={3}>\n <Box sx={{ position: 'relative', zIndex: 1400 }}>\n <SearchLocationInput\n onPlaceSelected={handlePlaceSelected}\n onError={handleError}\n placeholder={t('searchLocationModal.enterLocation')}\n />\n\n {error ? (\n <Typography variant=\"caption\" color=\"error\" sx={{ mt: 0.5, display: 'block' }}>\n {error}\n </Typography>\n ) : null}\n </Box>\n\n <TextField\n label={t('conversations.contactDetails.street')}\n value={draft.street}\n onChange={handleChange('street')}\n fullWidth\n size=\"medium\"\n />\n\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2}>\n <TextField\n label={t('searchLocationModal.city')}\n value={draft.city}\n onChange={handleChange('city')}\n fullWidth\n size=\"medium\"\n />\n <TextField\n label={t('searchLocationModal.state')}\n value={draft.state}\n onChange={handleChange('state')}\n fullWidth\n size=\"medium\"\n />\n </Stack>\n\n <Stack direction={{ xs: 'column', sm: 'row' }} spacing={2}>\n <TextField\n label={t('searchLocationModal.postalCode')}\n value={draft.zipcode}\n onChange={handleChange('zipcode')}\n fullWidth\n size=\"medium\"\n />\n <TextField\n label={t('searchLocationModal.country')}\n value={draft.country}\n onChange={handleChange('country')}\n fullWidth\n size=\"medium\"\n />\n </Stack>\n\n {query ? (\n <Typography variant=\"caption\" sx={{ opacity: 0.7 }}>\n {query}\n </Typography>\n ) : null}\n\n <Stack direction=\"row\" spacing={2} justifyContent=\"flex-end\" sx={{ pt: 2 }}>\n <LoadingButton\n variant=\"contained\"\n size=\"large\"\n startIcon={<SaveIcon />}\n onClick={handleSaveMainAddress}\n loading={isSavingMain}\n disabled={isDisabled}\n >\n {t('searchLocationModal.saveMainAddress')}\n </LoadingButton>\n\n <LoadingButton\n variant=\"outlined\"\n size=\"large\"\n startIcon={<SaveIcon />}\n onClick={handleSaveSecondaryAddress}\n loading={isSavingSecondary}\n disabled={isDisabled}\n >\n {t('searchLocationModal.saveSecondaryAddress')}\n </LoadingButton>\n </Stack>\n </Stack>\n </Box>\n );\n};\n\nexport default SearchLocationEditor;\n","import { IBusiness } from '@trii/types/dist/Contacts/contacts';\r\n\r\n/**\r\n * Type guard to check if an object is an IBusiness\r\n * @param obj The object to check\r\n * @returns True if the object is an IBusiness\r\n */\r\nexport function isBusiness(obj: any): obj is IBusiness {\r\n if (obj?.isBusiness === true) {\r\n // Si se ha marcado explícitamente como negocio con la propiedad isBusiness\r\n return true;\r\n }\r\n \r\n return (\r\n obj !== null &&\r\n typeof obj === 'object' &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.spaceId === 'string' &&\r\n typeof obj.name === 'string' &&\r\n Array.isArray(obj.membersId) &&\r\n Array.isArray(obj.members) &&\r\n Array.isArray(obj.phones) &&\r\n Array.isArray(obj.emails) &&\r\n typeof obj.imageUrl === 'string' &&\r\n !('firstName' in obj) &&\r\n !('lastName' in obj)\r\n );\r\n}\r\n","import { IContact } from '@trii/types/dist/Contacts/contacts';\r\n\r\n/**\r\n * Type guard to check if an object is an IContact\r\n * @param obj The object to check\r\n * @returns True if the object is an IContact\r\n */\r\nexport function isContact(obj: any): obj is IContact {\r\n // Si está marcado explícitamente como negocio, no es un contacto regular\r\n if (obj?.isBusiness === true) {\r\n return false;\r\n }\r\n \r\n return (\r\n obj !== null &&\r\n typeof obj === 'object' &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.spaceId === 'string' &&\r\n typeof obj.name === 'string' &&\r\n typeof obj.firstName === 'string' &&\r\n typeof obj.lastName === 'string' &&\r\n Array.isArray(obj.phones) &&\r\n Array.isArray(obj.emails) &&\r\n 'origin' in obj &&\r\n typeof obj.isSpam === 'boolean' &&\r\n (!obj.businessId || typeof obj.businessId === 'string')\r\n );\r\n}\r\n","import { useEffect, useMemo, useRef, useState } from 'react';\r\nimport { IBusiness, IContact, IContactField, IContactTag } from '@trii/types/dist/Contacts/contacts';\r\nimport { ILabel } from '@trii/types/dist/Contacts';\r\nimport { createEditContactApi } from '../services/api';\r\nimport { isBusiness } from '../types/is-business.typeguard';\r\nimport { isContact } from '../types/is-contact.typeguard';\r\nimport { UserTrii } from '@trii/types/dist/Users';\r\n\r\nexport type UseEditContactModalControllerArgs = {\r\n open: boolean;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n contactId?: string;\r\n initialContactData?: IContact | IBusiness;\r\n};\r\n\r\ntype ControllerState = {\r\n isLoading: boolean;\r\n error: unknown;\r\n contactData: IContact | IBusiness | null;\r\n labels: ILabel[];\r\n labelsLoading: boolean;\r\n labelsError: unknown;\r\n contactFields: IContactField[];\r\n contactFieldsLoading: boolean;\r\n contactFieldsError: unknown;\r\n userTrii: UserTrii | null;\r\n userLoading: boolean;\r\n userError: unknown;\r\n};\r\n\r\nexport function useEditContactModalController({\r\n open,\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n}: UseEditContactModalControllerArgs) {\r\n const abortRef = useRef<AbortController | null>(null);\r\n\r\n const api = useMemo(() => {\r\n if (!baseUrl || !spaceId) return null;\r\n return createEditContactApi(baseUrl, spaceId);\r\n }, [baseUrl, spaceId]);\r\n\r\n const [state, setState] = useState<ControllerState>({\r\n isLoading: false,\r\n error: null,\r\n contactData: null,\r\n labels: [],\r\n labelsLoading: false,\r\n labelsError: null,\r\n contactFields: [],\r\n contactFieldsLoading: false,\r\n contactFieldsError: null,\r\n userTrii: null,\r\n userLoading: false,\r\n userError: null,\r\n });\r\n\r\n const canFetch = useMemo(() => Boolean(open && api && contactId), [open, api, contactId]);\r\n\r\n useEffect(() => {\r\n if (open) return;\r\n abortRef.current?.abort();\r\n setState({\r\n isLoading: false,\r\n error: null,\r\n contactData: null,\r\n labels: [],\r\n labelsLoading: false,\r\n labelsError: null,\r\n contactFields: [],\r\n contactFieldsLoading: false,\r\n contactFieldsError: null,\r\n userTrii: null,\r\n userLoading: false,\r\n userError: null,\r\n });\r\n }, [open]);\r\n\r\n const canFetchLabels = useMemo(() => Boolean(open && api), [open, api]);\r\n\r\n useEffect(() => {\r\n if (!canFetchLabels || !api) {\r\n return;\r\n }\r\n\r\n const controller = new AbortController();\r\n setState((prev) => ({ ...prev, labelsLoading: true, labelsError: null }));\r\n\r\n api\r\n .fetchLabels({ signal: controller.signal })\r\n .then((labels) => {\r\n setState((prev) => ({ ...prev, labels, labelsLoading: false, labelsError: null }));\r\n })\r\n .catch((err) => {\r\n if (controller.signal.aborted) return;\r\n setState((prev) => ({ ...prev, labelsLoading: false, labelsError: err }));\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, canFetchLabels]);\r\n\r\n useEffect(() => {\r\n if (!canFetch || !api) {\r\n return;\r\n }\r\n\r\n abortRef.current?.abort();\r\n const controller = new AbortController();\r\n abortRef.current = controller;\r\n\r\n setState((prev) => ({ ...prev, isLoading: true, error: null, contactData: null }));\r\n\r\n api\r\n .fetchContact({ contactId: contactId!, signal: controller.signal })\r\n .then((data) => {\r\n setState((prev) => ({ ...prev, isLoading: false, error: null, contactData: data }));\r\n })\r\n .catch((err) => {\r\n if (controller.signal.aborted) return;\r\n setState((prev) => ({ ...prev, isLoading: false, error: err }));\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, canFetch, contactId]);\r\n\r\n const canFetchUser = useMemo(() => Boolean(open && api), [open, api]);\r\n\r\n useEffect(() => {\r\n if (!canFetchUser || !api) return;\r\n\r\n const controller = new AbortController();\r\n setState((prev) => ({ ...prev, userLoading: true, userError: null }));\r\n\r\n api\r\n .fetchUserTrii({ signal: controller.signal })\r\n .then((data) => {\r\n setState((prev) => ({ ...prev, userLoading: false, userError: null, userTrii: data }));\r\n })\r\n .catch((err) => {\r\n if (controller.signal.aborted) return;\r\n setState((prev) => ({ ...prev, userLoading: false, userError: err }));\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, canFetchUser]);\r\n\r\n const selectors = useMemo(() => {\r\n const contactData = state.contactData;\r\n const business = isBusiness(contactData);\r\n const contact = isContact(contactData);\r\n\r\n let contactType: 'business' | 'contact' | 'unknown' = 'unknown';\r\n if (business) contactType = 'business';\r\n if (contact) contactType = 'contact';\r\n\r\n let displayName = 'Unknown Contact';\r\n if (business) {\r\n displayName = contactData.name;\r\n } else if (contact) {\r\n displayName = `${contactData.firstName} ${contactData.lastName}`.trim();\r\n }\r\n\r\n const tags: IContactTag[] = contactData?.tags ?? [];\r\n\r\n return {\r\n isBusiness: business,\r\n isContact: contact,\r\n contactType,\r\n displayName,\r\n tags,\r\n labels: state.labels,\r\n contactFields: state.contactFields,\r\n userTrii: state.userTrii,\r\n userLoading: state.userLoading,\r\n userError: state.userError,\r\n };\r\n }, [state.contactData, state.labels, state.contactFields, state.userTrii, state.userLoading, state.userError]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n if (!api) return;\r\n const contactData = state.contactData;\r\n const business = isBusiness(contactData);\r\n const contact = isContact(contactData);\r\n const forType: 'contact' | 'business' | null = business ? 'business' : contact ? 'contact' : null;\r\n if (!forType) return;\r\n\r\n const controller = new AbortController();\r\n setState((prev) => ({ ...prev, contactFieldsLoading: true, contactFieldsError: null }));\r\n\r\n api\r\n .fetchContactFields({ forType, signal: controller.signal })\r\n .then((fields) => {\r\n setState((prev) => ({ ...prev, contactFields: fields, contactFieldsLoading: false, contactFieldsError: null }));\r\n })\r\n .catch((err) => {\r\n if (controller.signal.aborted) return;\r\n setState((prev) => ({ ...prev, contactFieldsLoading: false, contactFieldsError: err }));\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, open, state.contactData]);\r\n\r\n return {\r\n state,\r\n selectors,\r\n actions: {\r\n setContactData: (contactData?: IContact | IBusiness) =>\r\n setState((prev) => ({ ...prev, contactData: contactData ?? null })),\r\n clearError: () => setState((prev) => ({ ...prev, error: null })),\r\n },\r\n };\r\n}\r\n","import { ChangeEvent, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { UserTrii } from '@trii/types/dist/Users';\r\nimport { fetchUserTrii, updateEntity, uploadAvatar } from '../services/api';\r\n\r\nexport type UseImageType = {\r\n inputAtributes: {\r\n onChange: (event: ChangeEvent<HTMLInputElement>) => void;\r\n ref: React.RefObject<HTMLInputElement>;\r\n type: string;\r\n accept: string;\r\n };\r\n action: {\r\n uploadImage: () => void;\r\n deleteImage: () => Promise<void>;\r\n };\r\n imageUrl: string;\r\n removeParams: (url: string) => string;\r\n isUploading: boolean;\r\n isDeleting: boolean;\r\n};\r\n\r\ntype UseImageArgs = {\r\n baseUrl?: string;\r\n spaceId?: string;\r\n entityType?: 'contact' | 'business';\r\n entityId?: string;\r\n initialImageUrl?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\nconst useImage = ({\r\n baseUrl,\r\n spaceId,\r\n entityType,\r\n entityId,\r\n initialImageUrl,\r\n onEntityUpdated,\r\n}: UseImageArgs): UseImageType => {\r\n const [imageUrl, setImageUrl] = useState<string>(initialImageUrl ?? '');\r\n const [userTrii, setUserTrii] = useState<UserTrii | null>(null);\r\n const [isUploading, setIsUploading] = useState(false);\r\n const [isDeleting, setIsDeleting] = useState(false);\r\n\r\n const ref = useRef<HTMLInputElement | null>(null);\r\n\r\n const canRequest = useMemo(\r\n () => Boolean(baseUrl && spaceId && entityType && entityId),\r\n [baseUrl, spaceId, entityType, entityId]\r\n );\r\n\r\n function removeSasToken(url: string) {\r\n return url.split('?sv=')[0];\r\n }\r\n\r\n function removeCacheId(url: string) {\r\n return url.split('&cacheId=')[0];\r\n }\r\n\r\n function removeParams(url: string) {\r\n let result = removeSasToken(url);\r\n if (!result) return '';\r\n result = removeCacheId(result);\r\n if (!result) return '';\r\n return result;\r\n }\r\n\r\n const ensureUserTrii = async () => {\r\n if (!baseUrl || !spaceId) return null;\r\n const next = await fetchUserTrii({ baseUrl, spaceId });\r\n setUserTrii(next);\r\n return next;\r\n };\r\n\r\n const getImageURLWithAccessToken = async (rawUrl: string) => {\r\n const nextUser = userTrii ?? (await ensureUserTrii());\r\n const storageAzureSAS = nextUser?.storageAzureSAS as any;\r\n\r\n const expireAt = storageAzureSAS?.expireAt;\r\n const expiredAtDate = expireAt ? new Date(expireAt) : null;\r\n\r\n let sas = storageAzureSAS?.sas ?? '';\r\n if (!sas || (expiredAtDate && expiredAtDate < new Date())) {\r\n const refreshed = await ensureUserTrii();\r\n const refreshedSas = (refreshed?.storageAzureSAS as any)?.sas;\r\n sas = refreshedSas ?? '';\r\n }\r\n\r\n if (!sas) {\r\n return rawUrl;\r\n }\r\n\r\n const cacheId = `${Date.now()}`;\r\n return `${rawUrl}${sas}&cacheId=${cacheId}`;\r\n };\r\n\r\n const setAccessImageUrl = async (url: string) => {\r\n if (!url) {\r\n setImageUrl('');\r\n return;\r\n }\r\n\r\n const rawUrl = removeSasToken(url);\r\n if (!rawUrl) return;\r\n const withSas = await getImageURLWithAccessToken(rawUrl);\r\n setImageUrl(withSas);\r\n };\r\n\r\n const onChange = async (event: ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0];\r\n if (!file) return;\r\n if (!canRequest) return;\r\n\r\n if (ref.current) {\r\n ref.current.value = '';\r\n }\r\n\r\n setIsUploading(true);\r\n try {\r\n const uploadedUrl = await uploadAvatar({\r\n baseUrl: baseUrl!,\r\n spaceId: spaceId!,\r\n contactId: entityId!,\r\n file,\r\n });\r\n\r\n const updated = await updateEntity({\r\n baseUrl: baseUrl!,\r\n spaceId: spaceId!,\r\n entityType: entityType!,\r\n entityId: entityId!,\r\n body: { imageUrl: uploadedUrl } as any,\r\n });\r\n\r\n onEntityUpdated?.(updated);\r\n await setAccessImageUrl(uploadedUrl);\r\n } finally {\r\n setIsUploading(false);\r\n }\r\n };\r\n\r\n const uploadImage = () => {\r\n ref.current?.click();\r\n };\r\n\r\n const deleteImage = async () => {\r\n if (!canRequest) return;\r\n if (isDeleting) return;\r\n\r\n setIsDeleting(true);\r\n try {\r\n await updateEntity({\r\n baseUrl: baseUrl!,\r\n spaceId: spaceId!,\r\n entityType: entityType!,\r\n entityId: entityId!,\r\n body: { imageUrl: \"\" },\r\n });\r\n\r\n onEntityUpdated?.({ imageUrl: \"\" });\r\n setImageUrl('');\r\n } finally {\r\n setIsDeleting(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!initialImageUrl) {\r\n setImageUrl('');\r\n return;\r\n }\r\n\r\n void setAccessImageUrl(initialImageUrl);\r\n }, [initialImageUrl]);\r\n\r\n return {\r\n inputAtributes: {\r\n onChange,\r\n ref,\r\n type: 'file',\r\n accept: 'image/*',\r\n },\r\n action: {\r\n uploadImage,\r\n deleteImage,\r\n },\r\n imageUrl,\r\n removeParams,\r\n isUploading,\r\n isDeleting,\r\n };\r\n};\r\n\r\nexport default useImage;\r\n","import { useState, useEffect, ChangeEvent } from 'react';\r\n\r\nexport interface UseFieldType {\r\n actions: {\r\n onError: (errorMsg: string) => void;\r\n onSuccess: () => void;\r\n resetValue: () => void;\r\n changeValue: (newValue: string) => void;\r\n };\r\n attributes: {\r\n error: boolean;\r\n helperText: string;\r\n type: string;\r\n value: string;\r\n onChange: (event: ChangeEvent<HTMLInputElement>) => void;\r\n };\r\n}\r\n\r\nconst useField = (type: string, initialValue?: string): UseFieldType => {\r\n const [value, setValue] = useState(initialValue || '');\r\n const [error, setError] = useState(false);\r\n const [helperText, setHelperText] = useState('');\r\n\r\n useEffect(() => {\r\n setValue(initialValue || '');\r\n\r\n return () => {\r\n setValue(initialValue || '');\r\n };\r\n }, [initialValue]);\r\n\r\n const onError = (errorMsg: string) => {\r\n setError(true);\r\n setHelperText(errorMsg);\r\n };\r\n\r\n const onSuccess = () => {\r\n setError(false);\r\n setHelperText('');\r\n };\r\n\r\n const onChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n setValue(event.target.value);\r\n };\r\n\r\n const changeValue = (newValue: string) => {\r\n setValue(newValue);\r\n };\r\n\r\n const resetValue = () => {\r\n setValue(initialValue || '');\r\n };\r\n\r\n return {\r\n actions: { onError, onSuccess, resetValue, changeValue },\r\n attributes: { error, helperText, type, value, onChange },\r\n };\r\n};\r\n\r\nexport default useField;\r\n","import { useState, useEffect } from 'react';\r\n// Types\r\nimport { SelectChangeEvent } from '@mui/material';\r\n\r\nexport type UseSelectType = {\r\n actions: {\r\n resetValue: () => void;\r\n changeValue: (newValue: string) => void;\r\n };\r\n attributes: {\r\n value: string;\r\n onChange: (event: SelectChangeEvent<string>) => void;\r\n };\r\n};\r\n\r\nconst useSelect = (initialValue: string = ''): UseSelectType => {\r\n const [value, setValue] = useState<string>(initialValue);\r\n\r\n const onChange = (event: SelectChangeEvent<string>) => {\r\n setValue(event.target.value as string);\r\n };\r\n\r\n const changeValue = (newValue: string) => {\r\n setValue(newValue);\r\n };\r\n\r\n const resetValue = () => {\r\n setValue(initialValue ?? '');\r\n };\r\n\r\n useEffect(() => {\r\n setValue(initialValue);\r\n }, [initialValue]);\r\n\r\n return {\r\n actions: { resetValue, changeValue },\r\n attributes: { value, onChange },\r\n };\r\n};\r\n\r\nexport default useSelect;\r\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from 'uuid';\r\n// Types\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\n\r\nexport interface NewAddress {\r\n id: string;\r\n address: string;\r\n note: string;\r\n channelType:\r\n | ChannelType.PHONE\r\n | ChannelType.EMAIL\r\n | ChannelType.WHATSAPP\r\n | ChannelType.INSTAGRAM\r\n | ChannelType.RCS;\r\n isSaved: boolean;\r\n}\r\n\r\n\r\nfunction createNewAddress(\r\n channelType: ChannelType.PHONE | ChannelType.EMAIL | ChannelType.WHATSAPP | ChannelType.RCS\r\n): NewAddress {\r\n return {\r\n id: uuidv4(),\r\n address: '',\r\n note: '',\r\n channelType,\r\n isSaved: false,\r\n };\r\n}\r\n\r\nexport default { createNewAddress };\r\n","// Types\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\nconst getEditedField = (\r\n key: string,\r\n originalValue: string | number | null,\r\n editedValue: string | number\r\n): Record<string, string | number> | null => {\r\n if (\r\n originalValue !== editedValue &&\r\n !(originalValue === null && editedValue === '')\r\n ) {\r\n const editedField: Record<string, string | number> = {};\r\n\r\n editedField[key] = editedValue;\r\n return editedField;\r\n }\r\n return null;\r\n};\r\n\r\nconst getAddressesWithUpdatedValues = (\r\n newValue: string,\r\n newValueAddressId: string,\r\n addresses: IContactAddress[]\r\n): IContactAddress[] => {\r\n const newAddresses = addresses.map((address) => {\r\n if (address.id === newValueAddressId) {\r\n return {\r\n ...address,\r\n address: newValue,\r\n };\r\n }\r\n return address;\r\n });\r\n\r\n return newAddresses;\r\n};\r\n\r\nexport default { getEditedField, getAddressesWithUpdatedValues };\r\n","import { ChangeEvent, useEffect, useState } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport contactHelper from '../utils/contactHelper';\r\nimport editContactHelper from './utils/editContactHelper';\r\n\r\ntype InitialContactMethods =\r\n | {\r\n emails?: IContactAddress[];\r\n phones?: IContactAddress[];\r\n ims_whatsapp?: IContactAddress[];\r\n ims_rcs?: IContactAddress[];\r\n ims_facebook?: IContactAddress[];\r\n ims_webchat?: IContactAddress[];\r\n ims_instagram?: IContactAddress[];\r\n ims_mercadolibre?: IContactAddress[];\r\n }\r\n | null\r\n | undefined;\r\n\r\ntype DeleteAddressPayload = {\r\n contactId: string;\r\n contactAddressId: string;\r\n type: ChannelType;\r\n};\r\n\r\ntype UseEditContactMethodsArgs = {\r\n entityId?: string | null;\r\n initial: InitialContactMethods;\r\n dispatch?: (action: any) => Promise<any>;\r\n deleteAddress: (payload: DeleteAddressPayload) => Promise<any> | any;\r\n};\r\n\r\nconst useEditContactMethods = ({\r\n entityId,\r\n initial,\r\n dispatch,\r\n deleteAddress,\r\n}: UseEditContactMethodsArgs) => {\r\n const [isDeletingAddress, setIsDeletingAddress] = useState<false | string>(false);\r\n\r\n const [initialSnapshot, setInitialSnapshot] = useState<InitialContactMethods>(() => initial);\r\n\r\n const [imsFacebooks, setImsFacebooks] = useState<any[]>(initial?.ims_facebook || []);\r\n const [imsMercadolibre, setImsMercadolibre] = useState<any[]>(initial?.ims_mercadolibre || []);\r\n const [imsWebchats, setImsWebchats] = useState<any[]>(initial?.ims_webchat || []);\r\n const [imsInstagrams, setImsInstagrams] = useState<any[]>(initial?.ims_instagram || []);\r\n const [imsWhatsapp, setImsWhatsApp] = useState<any[]>(initial?.ims_whatsapp || []);\r\n const [emails, setEmails] = useState<any[]>(initial?.emails || []);\r\n const [phoneNumbers, setPhoneNumbers] = useState<any[]>(initial?.phones || []);\r\n const [imsRCS, setImsRCS] = useState<any[]>(initial?.ims_rcs || []);\r\n\r\n const addPhone = () => {\r\n const newPhone = contactHelper.createNewAddress(ChannelType.PHONE);\r\n const newPhoneNumbers = [...phoneNumbers, newPhone];\r\n setPhoneNumbers(newPhoneNumbers as IContactAddress[]);\r\n };\r\n\r\n const addEmail = () => {\r\n const newEmail = contactHelper.createNewAddress(ChannelType.EMAIL);\r\n const newEmails = [...emails, newEmail];\r\n setEmails(newEmails as IContactAddress[]);\r\n };\r\n\r\n const addWhatsapp = () => {\r\n const newWhatsapp = contactHelper.createNewAddress(ChannelType.WHATSAPP);\r\n const newWhatsapps = [...imsWhatsapp, newWhatsapp];\r\n setImsWhatsApp(newWhatsapps as IContactAddress[]);\r\n };\r\n\r\n const addRCS = () => {\r\n const newRCS = contactHelper.createNewAddress(ChannelType.RCS);\r\n const newRCSs = [...imsRCS, newRCS];\r\n setImsRCS(newRCSs as IContactAddress[]);\r\n };\r\n\r\n const addWhatsappVerified = (newWhatsapp: IContactAddress) => {\r\n const updatedWhatsapps = [...imsWhatsapp, newWhatsapp];\r\n setImsWhatsApp(updatedWhatsapps);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_whatsapp: updatedWhatsapps,\r\n }));\r\n };\r\n\r\n const replaceAddress = (addressId: string, newAddress: IContactAddress) => {\r\n if (!newAddress) {\r\n return;\r\n }\r\n\r\n if (newAddress.channelType === 3) {\r\n const newEmails = emails.map((email) => {\r\n if (email.id === addressId) {\r\n return newAddress;\r\n }\r\n return email;\r\n });\r\n\r\n setEmails(newEmails);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n emails: newEmails,\r\n }));\r\n }\r\n\r\n if (newAddress.channelType === 5) {\r\n const newPhoneNumbers = phoneNumbers.map((phoneNumber) => {\r\n if (phoneNumber.id === addressId) {\r\n return newAddress;\r\n }\r\n return phoneNumber;\r\n });\r\n\r\n setPhoneNumbers(newPhoneNumbers);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n phones: newPhoneNumbers,\r\n }));\r\n }\r\n\r\n if (newAddress.channelType === 13) {\r\n const newImsWhatsapp = imsWhatsapp.map((item) => {\r\n if (item.id === addressId) {\r\n return newAddress;\r\n }\r\n return item;\r\n });\r\n\r\n setImsWhatsApp(newImsWhatsapp);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_whatsapp: newImsWhatsapp,\r\n }));\r\n }\r\n\r\n if (newAddress.channelType === 21) {\r\n const newImsRCS = imsRCS.map((item) => {\r\n if (item.id === addressId) {\r\n return newAddress;\r\n }\r\n return item;\r\n });\r\n\r\n setImsRCS(newImsRCS);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_rcs: newImsRCS,\r\n }));\r\n }\r\n\r\n if (newAddress.channelType === 41) {\r\n const newImsMercadolibre = imsMercadolibre.map((item) => {\r\n if (item.id === addressId) {\r\n return newAddress;\r\n }\r\n return item;\r\n });\r\n\r\n setImsMercadolibre(newImsMercadolibre);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_mercadolibre: newImsMercadolibre,\r\n }));\r\n }\r\n };\r\n\r\n const handleAddressFieldChange = async (\r\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n fieldId: string,\r\n type: ChannelType,\r\n ) => {\r\n const newValue = e.target.value;\r\n\r\n if (type === 3) {\r\n const newEmails = editContactHelper.getAddressesWithUpdatedValues(newValue, fieldId, emails);\r\n setEmails(newEmails);\r\n } else if (type === 5) {\r\n const newPhoneNumbers = editContactHelper.getAddressesWithUpdatedValues(\r\n newValue,\r\n fieldId,\r\n phoneNumbers,\r\n );\r\n\r\n setPhoneNumbers(newPhoneNumbers);\r\n } else if (type === 13) {\r\n const newImsWhatsapp = editContactHelper.getAddressesWithUpdatedValues(\r\n newValue,\r\n fieldId,\r\n imsWhatsapp,\r\n );\r\n\r\n setImsWhatsApp(newImsWhatsapp);\r\n } else if (type === 21) {\r\n const newImsRCS = editContactHelper.getAddressesWithUpdatedValues(newValue, fieldId, imsRCS);\r\n\r\n setImsRCS(newImsRCS);\r\n } else if (type === 41) {\r\n const newImsMercadolibre = editContactHelper.getAddressesWithUpdatedValues(\r\n newValue,\r\n fieldId,\r\n imsMercadolibre,\r\n );\r\n setImsMercadolibre(newImsMercadolibre);\r\n }\r\n };\r\n\r\n const handleNoteFieldChange = (\r\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n fieldId: string,\r\n addressType: ChannelType,\r\n ) => {\r\n if (addressType === 14) {\r\n const newImsFacebooks = imsFacebooks.map((imsFacebook) => {\r\n if (imsFacebook.id === fieldId) {\r\n return {\r\n ...imsFacebook,\r\n note: e.target.value,\r\n };\r\n }\r\n return imsFacebook;\r\n });\r\n setImsFacebooks(newImsFacebooks);\r\n }\r\n if (addressType === 20) {\r\n const newImsWebchats = imsWebchats.map((imsWebchat) => {\r\n if (imsWebchat.id === fieldId) {\r\n return {\r\n ...imsWebchat,\r\n note: e.target.value,\r\n };\r\n }\r\n return imsWebchat;\r\n });\r\n setImsWebchats(newImsWebchats);\r\n }\r\n if (addressType === 16) {\r\n const newImsInstagrams = imsInstagrams.map((imsInstagram) => {\r\n if (imsInstagram.id === fieldId) {\r\n return {\r\n ...imsInstagram,\r\n note: e.target.value,\r\n };\r\n }\r\n return imsInstagram;\r\n });\r\n setImsInstagrams(newImsInstagrams);\r\n }\r\n if (addressType === 3) {\r\n const newEmails = emails.map((email) => {\r\n if (email.id === fieldId) {\r\n return {\r\n ...email,\r\n note: e.target.value,\r\n };\r\n }\r\n return email;\r\n });\r\n setEmails(newEmails);\r\n }\r\n if (addressType === 5) {\r\n const newPhoneNumbers = phoneNumbers.map((phoneNumber) => {\r\n if (phoneNumber.id === fieldId) {\r\n return {\r\n ...phoneNumber,\r\n note: e.target.value,\r\n };\r\n }\r\n return phoneNumber;\r\n });\r\n setPhoneNumbers(newPhoneNumbers);\r\n }\r\n if (addressType === 13) {\r\n const newImsWhatsapp = imsWhatsapp.map((item) => {\r\n if (item.id === fieldId) {\r\n return {\r\n ...item,\r\n note: e.target.value,\r\n };\r\n }\r\n return item;\r\n });\r\n setImsWhatsApp(newImsWhatsapp);\r\n }\r\n if (addressType === 21) {\r\n const newImsRCS = imsRCS.map((item) => {\r\n if (item.id === fieldId) {\r\n return {\r\n ...item,\r\n note: e.target.value,\r\n };\r\n }\r\n return item;\r\n });\r\n\r\n setImsRCS(newImsRCS);\r\n }\r\n if (addressType === 41) {\r\n const newImsMercadolibre = imsMercadolibre.map((item) => {\r\n if (item.id === fieldId) {\r\n return {\r\n ...item,\r\n note: e.target.value,\r\n };\r\n }\r\n return item;\r\n });\r\n setImsMercadolibre(newImsMercadolibre);\r\n }\r\n };\r\n\r\n const handleDeleteAddress = async (fieldId: string, addressType: ChannelType) => {\r\n if (!entityId) {\r\n return;\r\n }\r\n\r\n if (\r\n addressType === 3 ||\r\n addressType === 5 ||\r\n addressType === 13 ||\r\n addressType === 14 ||\r\n addressType === 20 ||\r\n addressType === 16 ||\r\n addressType === 21 ||\r\n addressType === 41\r\n ) {\r\n setIsDeletingAddress(fieldId);\r\n const payload = {\r\n contactId: entityId,\r\n contactAddressId: fieldId,\r\n type: addressType,\r\n };\r\n if (dispatch) {\r\n await dispatch(deleteAddress(payload));\r\n } else {\r\n await deleteAddress(payload);\r\n }\r\n setIsDeletingAddress(false);\r\n switch (addressType) {\r\n case 3:\r\n const newEmails = emails.filter((email) => email.id !== fieldId);\r\n setEmails(newEmails);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n emails: newEmails,\r\n }));\r\n break;\r\n case 5:\r\n const newPhoneNumbers = phoneNumbers.filter((phoneNumber) => phoneNumber.id !== fieldId);\r\n setPhoneNumbers(newPhoneNumbers);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n phones: newPhoneNumbers,\r\n }));\r\n break;\r\n case 13:\r\n const newImsWhatsapp = imsWhatsapp.filter((item) => item.id !== fieldId);\r\n setImsWhatsApp(newImsWhatsapp);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_whatsapp: newImsWhatsapp,\r\n }));\r\n break;\r\n case 21:\r\n const newImsRCS = imsRCS.filter((item) => item.id !== fieldId);\r\n setImsRCS(newImsRCS);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_rcs: newImsRCS,\r\n }));\r\n break;\r\n case 41:\r\n const newImsMercadolibre = imsMercadolibre.filter((item) => item.id !== fieldId);\r\n setImsMercadolibre(newImsMercadolibre);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_mercadolibre: newImsMercadolibre,\r\n }));\r\n break;\r\n case 14:\r\n const newImsFacebooks = imsFacebooks.filter((item) => item.id !== fieldId);\r\n setImsFacebooks(newImsFacebooks);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_facebook: newImsFacebooks,\r\n }));\r\n break;\r\n case 20:\r\n const newImsWebchats = imsWebchats.filter((item) => item.id !== fieldId);\r\n setImsWebchats(newImsWebchats);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_webchat: newImsWebchats,\r\n }));\r\n break;\r\n case 16:\r\n const newImsInstagrams = imsInstagrams.filter((item) => item.id !== fieldId);\r\n setImsInstagrams(newImsInstagrams);\r\n setInitialSnapshot((prev) => ({\r\n ...(prev ?? {}),\r\n ims_instagram: newImsInstagrams,\r\n }));\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n };\r\n\r\n function resetToInitialContactInformation() {\r\n setImsFacebooks(initialSnapshot?.ims_facebook || []);\r\n setImsMercadolibre(initialSnapshot?.ims_mercadolibre || []);\r\n setImsWebchats(initialSnapshot?.ims_webchat || []);\r\n setImsInstagrams(initialSnapshot?.ims_instagram || []);\r\n setImsWhatsApp(initialSnapshot?.ims_whatsapp || []);\r\n setImsRCS(initialSnapshot?.ims_rcs || []);\r\n setEmails(initialSnapshot?.emails || []);\r\n setPhoneNumbers(initialSnapshot?.phones || []);\r\n }\r\n\r\n useEffect(() => {\r\n setInitialSnapshot(initial);\r\n if (initial?.emails && initial?.phones) {\r\n setEmails(initial.emails);\r\n setPhoneNumbers(initial.phones);\r\n }\r\n setImsWhatsApp(initial?.ims_whatsapp || []);\r\n setImsRCS(initial?.ims_rcs || []);\r\n setImsFacebooks(initial?.ims_facebook || []);\r\n setImsWebchats(initial?.ims_webchat || []);\r\n setImsInstagrams(initial?.ims_instagram || []);\r\n setImsMercadolibre(initial?.ims_mercadolibre || []);\r\n }, [initial]);\r\n\r\n return {\r\n field: {\r\n imsWhatsapp,\r\n imsRCS,\r\n imsMercadolibre,\r\n imsFacebooks,\r\n imsWebchats,\r\n imsInstagrams,\r\n emails,\r\n phoneNumbers,\r\n },\r\n action: {\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n addPhone,\r\n addEmail,\r\n addWhatsapp,\r\n addRCS,\r\n replaceAddress,\r\n addWhatsappVerified,\r\n resetToInitialContactInformation,\r\n },\r\n state: {\r\n isDeletingAddress,\r\n },\r\n };\r\n};\r\n\r\nexport default useEditContactMethods;\r\n","import { useState } from 'react';\r\n\r\nexport interface ItemWithId {\r\n id?: string | null;\r\n [key: string]: any;\r\n}\r\n\r\ntype InitialStateType<T> = T extends (infer U)[]\r\n ? U extends ItemWithId\r\n ? T\r\n : never\r\n : never;\r\n\r\ninterface Props<T extends ItemWithId[]> {\r\n initialState?: InitialStateType<T>;\r\n}\r\n\r\nexport type UseMultipleSelectReturnType<T> = {\r\n attributes: {\r\n value: T;\r\n onChange: (event: any, newValue: T) => void;\r\n };\r\n actions: {\r\n addValue: (newValue: any) => void;\r\n setValue: (newValue: T) => void;\r\n };\r\n};\r\n\r\nexport const useMultipleSelect = <T extends ItemWithId[]>({\r\n initialState = [] as InitialStateType<T>,\r\n}: Props<T> = {}): UseMultipleSelectReturnType<T> => {\r\n const [value, setValue] = useState<T>(initialState);\r\n\r\n const onChange = (event: any, newValue: T) => {\r\n void event;\r\n const hasNewObject = newValue.some(\r\n (newItem) => !value.some((currentItem) => newItem.id === currentItem.id)\r\n );\r\n const removedObjects = value.filter(\r\n (currentItem) => !newValue.some((newItem) => newItem.id === currentItem.id)\r\n );\r\n\r\n if (removedObjects.length > 0 || hasNewObject) {\r\n setValue(newValue);\r\n }\r\n };\r\n\r\n const addValue = (newValue: any) => {\r\n setValue((prevState) => prevState.concat(newValue) as unknown as T);\r\n };\r\n\r\n const setValueWrapper = (newValue: T) => {\r\n setValue(newValue);\r\n };\r\n\r\n return {\r\n attributes: { value, onChange },\r\n actions: {\r\n addValue,\r\n setValue: setValueWrapper,\r\n },\r\n };\r\n};\r\n","import { useEffect, useMemo, useState } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport {\r\n IBusiness,\r\n IContactField,\r\n IContactInfo,\r\n ILabel,\r\n Property,\r\n} from '@trii/types/dist/Contacts';\r\nimport UseEditBusiness from './types/UseEditBusiness';\r\n// Hooks\r\nimport useField from '../useField';\r\nimport useImage from '../useImage';\r\nimport useSelect from '../useSelect';\r\nimport useEditContactMethods from '../useEditContactMethods';\r\nimport { useMultipleSelect } from '../useMultipleSelect';\r\n// Api\r\nimport { deleteAddress } from '../../services/api';\r\n\r\ntype UseEditBusinessArgs = {\r\n business: IBusiness | null;\r\n customContactFields: IContactField[];\r\n baseUrl?: string;\r\n spaceId?: string;\r\n};\r\n\r\nconst useEditBusiness = ({\r\n business,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: UseEditBusinessArgs): UseEditBusiness => {\r\n const apiDeleteAddress = useMemo(\r\n () => async (payload: { contactId: string; contactAddressId: string; type: ChannelType }) => {\r\n if (!baseUrl || !spaceId) return;\r\n await deleteAddress({ baseUrl, spaceId, data: payload });\r\n },\r\n [baseUrl, spaceId],\r\n );\r\n\r\n const apiDispatch = async <T>(maybePromise: Promise<T> | T) => maybePromise;\r\n\r\n const [customProperties, setCustomProperties] = useState<Property[]>([]);\r\n // General section fields\r\n const name = useField('text', business?.name || '');\r\n const contactImage = useImage({\r\n baseUrl,\r\n spaceId,\r\n entityType: 'business',\r\n entityId: business?.id,\r\n initialImageUrl: business?.imageUrl || '',\r\n });\r\n const contactPropietary = useSelect(business?.owner);\r\n const labelMultipleSelect = useMultipleSelect<ILabel[]>({\r\n initialState: (business?.tags as ILabel[]) ?? [],\r\n });\r\n const [selectedContacts, setSelectedContacts] = useState<IContactInfo[]>([]);\r\n\r\n const {\r\n field: {\r\n imsFacebooks,\r\n imsMercadolibre,\r\n imsWebchats,\r\n imsInstagrams,\r\n imsWhatsapp,\r\n emails,\r\n phoneNumbers,\r\n imsRCS,\r\n },\r\n action: {\r\n addPhone,\r\n addEmail,\r\n addWhatsapp,\r\n addRCS,\r\n addWhatsappVerified,\r\n replaceAddress,\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n resetToInitialContactInformation,\r\n },\r\n state: { isDeletingAddress },\r\n } = useEditContactMethods({\r\n entityId: business?.id,\r\n initial: business,\r\n dispatch: apiDispatch,\r\n deleteAddress: apiDeleteAddress,\r\n });\r\n\r\n // Address iformation fields\r\n const homeAddress = useField('text', business?.address1?.street || '');\r\n const secondaryHomeAddress = useField('text', business?.address2?.street || '');\r\n const city = useField('text', business?.address1?.city || '');\r\n const secondaryCity = useField('text', business?.address2?.city || '');\r\n const state = useField('text', business?.address1?.state || '');\r\n const secondaryState = useField('text', business?.address2?.state || '');\r\n const postalCode = useField('text', business?.address1?.zipcode || '');\r\n const secondaryPostalCode = useField('text', business?.address2?.zipcode || '');\r\n const country = useField('text', business?.address1?.country || '');\r\n const secondaryCountry = useField('text', business?.address2?.country || '');\r\n\r\n const getEditedField = (\r\n key: string,\r\n originalValue: string | null | undefined,\r\n editedValue: string | null | undefined,\r\n ) => {\r\n if (originalValue !== editedValue && !(originalValue === null && editedValue === '')) {\r\n return { [key]: editedValue };\r\n }\r\n return {};\r\n };\r\n // Actions\r\n const getEditedBusiness = () => {\r\n if (!business) return null;\r\n\r\n const address1 = {\r\n street: homeAddress.attributes.value,\r\n city: city.attributes.value,\r\n state: state.attributes.value,\r\n zipcode: postalCode.attributes.value,\r\n country: country.attributes.value,\r\n };\r\n const address2 = {\r\n street: secondaryHomeAddress.attributes.value,\r\n city: secondaryCity.attributes.value,\r\n state: secondaryState.attributes.value,\r\n zipcode: secondaryPostalCode.attributes.value,\r\n country: secondaryCountry.attributes.value,\r\n };\r\n const editedBusiness = {\r\n id: business.id,\r\n ...getEditedField('owner', business.owner, contactPropietary.attributes.value),\r\n ...getEditedField('name', business.name, name.attributes.value),\r\n imageUrl: contactImage.imageUrl ? contactImage.removeParams(contactImage.imageUrl) : null,\r\n tags: labelMultipleSelect.attributes.value,\r\n properties: customProperties,\r\n members: selectedContacts,\r\n phoneNumbers,\r\n emails,\r\n address1,\r\n address2,\r\n // ims_whatsapp: modifiedImsWhatsapp,\r\n };\r\n return editedBusiness;\r\n };\r\n\r\n function resetCustomProperty(nameKey: string) {\r\n if (!business) return;\r\n\r\n const normalizeNameKey = (input: string) =>\r\n input.trim().toLowerCase().replace(/\\s+/g, '-').replace(/-+/g, '-');\r\n\r\n const defaultProperty =\r\n business.properties.find((property) => property.nameKey === nameKey) ??\r\n business.properties.find(\r\n (property) => normalizeNameKey(property.nameKey) === normalizeNameKey(nameKey),\r\n );\r\n\r\n if (!defaultProperty) {\r\n console.error(`No se encontró una propiedad con nameKey: ${nameKey}`);\r\n return; // Salir de la función si no se encuentra la propiedad\r\n }\r\n\r\n const updatedProperties = customProperties.map((property) =>\r\n property.nameKey === nameKey ? { ...property, value: defaultProperty.value } : property,\r\n );\r\n setCustomProperties(updatedProperties);\r\n }\r\n\r\n const getFilteredCustomProperties = (): Property[] => {\r\n if (!business) return [];\r\n\r\n return customContactFields.map((customField) => {\r\n const normalizeNameKey = (input: string) =>\r\n input.trim().toLowerCase().replace(/\\s+/g, '-').replace(/-+/g, '-');\r\n\r\n const existingBusinessProperty =\r\n business.properties.find((property) => property.nameKey === customField.nameKey) ??\r\n business.properties.find(\r\n (property) =>\r\n normalizeNameKey(property.nameKey) === normalizeNameKey(customField.nameKey),\r\n );\r\n\r\n if (existingBusinessProperty) {\r\n return {\r\n ...existingBusinessProperty,\r\n nameKey: customField.nameKey,\r\n type: (existingBusinessProperty.type ?? customField.type)!,\r\n value: existingBusinessProperty.value,\r\n };\r\n }\r\n\r\n const existingLocalProperty = customProperties.find(\r\n (property) => property.nameKey === customField.nameKey,\r\n );\r\n\r\n return {\r\n nameKey: customField.nameKey,\r\n type: customField.type!,\r\n value: existingLocalProperty ? existingLocalProperty.value : '',\r\n };\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (business && customContactFields) {\r\n setCustomProperties(getFilteredCustomProperties());\r\n }\r\n }, [business, customContactFields]);\r\n\r\n useEffect(() => {\r\n if (!business) return;\r\n\r\n labelMultipleSelect.actions.setValue((business.tags as ILabel[]) ?? []);\r\n }, [business]);\r\n\r\n return {\r\n field: {\r\n name,\r\n imsWhatsapp,\r\n imsRCS,\r\n contactImage,\r\n contactPropietary,\r\n imsMercadolibre,\r\n imsFacebooks,\r\n imsWebchats,\r\n imsInstagrams,\r\n emails,\r\n phoneNumbers,\r\n homeAddress,\r\n secondaryHomeAddress,\r\n city,\r\n secondaryCity,\r\n state,\r\n secondaryState,\r\n postalCode,\r\n secondaryPostalCode,\r\n country,\r\n secondaryCountry,\r\n customProperties,\r\n labelMultipleSelect,\r\n },\r\n action: {\r\n setCustomProperties,\r\n addWhatsapp,\r\n addRCS,\r\n getEditedBusiness,\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n addPhone,\r\n addEmail,\r\n replaceAddress,\r\n addWhatsappVerified,\r\n resetToInitialContactInformation,\r\n resetCustomProperty,\r\n },\r\n state: {\r\n isDeletingAddress,\r\n },\r\n selectedContacts,\r\n setSelectedContacts,\r\n };\r\n};\r\n\r\nexport default useEditBusiness;\r\n","import { useEffect, useMemo, useState } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { IContact, IContactField, Property } from '@trii/types/dist/Contacts';\r\nimport UseEditContact from './types/UseEditContact';\r\nimport { ItemWithId, useMultipleSelect } from '../useMultipleSelect';\r\n// Hooks\r\nimport useField from '../useField';\r\nimport useImage from '../useImage';\r\nimport useSelect from '../useSelect';\r\nimport useEditContactMethods from '../useEditContactMethods';\r\n// Utils\r\nimport editContactHelper from '../utils/editContactHelper';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\nimport { deleteAddress } from '../../services/api';\r\n\r\ntype UseEditContactArgs = {\r\n contact: IContact | null;\r\n customContactFields: IContactField[];\r\n baseUrl?: string;\r\n spaceId?: string;\r\n};\r\n\r\nconst useEditContact = ({\r\n contact,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: UseEditContactArgs): UseEditContact => {\r\n const apiDeleteAddress = useMemo(\r\n () => async (payload: { contactId: string; contactAddressId: string; type: ChannelType }) => {\r\n if (!baseUrl || !spaceId) return;\r\n await deleteAddress({ baseUrl, spaceId, data: payload });\r\n },\r\n [baseUrl, spaceId],\r\n );\r\n\r\n const apiDispatch = async <T>(maybePromise: Promise<T> | T) => maybePromise;\r\n\r\n const { getEditedField } = editContactHelper;\r\n\r\n const [customProperties, setCustomProperties] = useState<Property[]>([]);\r\n // const [selectedBusiness, setSelectedBusiness] = useState<SimplifiedBusiness[]>([]);\r\n const contactFirstname = useField('text', contact?.firstName || '');\r\n const contactLastname = useField('text', contact?.lastName || '');\r\n const contactImage = useImage({\r\n baseUrl,\r\n spaceId,\r\n entityType: 'contact',\r\n entityId: contact?.id ? String(contact.id) : undefined,\r\n initialImageUrl: contact?.imageUrl,\r\n });\r\n const [birthDate, setBirthDate] = useState<Dayjs | null>(\r\n contact?.birthDate ? dayjs(contact.birthDate) : null,\r\n );\r\n const contactMethods = useEditContactMethods({\r\n entityId: contact?.id,\r\n initial: contact,\r\n dispatch: apiDispatch,\r\n deleteAddress: apiDeleteAddress,\r\n });\r\n\r\n const {\r\n field: {\r\n imsFacebooks,\r\n imsMercadolibre,\r\n imsWebchats,\r\n imsInstagrams,\r\n imsWhatsapp,\r\n emails,\r\n phoneNumbers,\r\n imsRCS,\r\n },\r\n action: {\r\n addPhone,\r\n addEmail,\r\n addWhatsapp,\r\n addRCS,\r\n addWhatsappVerified,\r\n replaceAddress,\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n resetToInitialContactInformation,\r\n },\r\n state: { isDeletingAddress },\r\n } = contactMethods;\r\n //\r\n const labelMultipleSelect = useMultipleSelect({\r\n initialState: contact?.tags as ItemWithId[],\r\n });\r\n const contactPropietary = useSelect(contact?.owner);\r\n // const contactListSelectState = useSelect(contact?.listId);\r\n const homeAddress = useField('text', contact?.address1?.street);\r\n const secondaryHomeAddress = useField('text', contact?.address2?.street);\r\n const city = useField('text', contact?.address1?.city);\r\n const secondaryCity = useField('text', contact?.address2?.city);\r\n const state = useField('text', contact?.address1?.state);\r\n const secondaryState = useField('text', contact?.address2?.state);\r\n const postalCode = useField('text', contact?.address1?.zipcode);\r\n const secondaryPostalCode = useField('text', contact?.address2?.zipcode);\r\n const country = useField('text', contact?.address1?.country);\r\n const secondaryCountry = useField('text', contact?.address2?.country);\r\n\r\n // Actions\r\n const getEditedContact = () => {\r\n if (!contact) return null;\r\n const currentContact = contact;\r\n\r\n const modifiedTags = labelMultipleSelect.attributes.value.map((tag) => ({\r\n id: tag.id,\r\n name: tag.name,\r\n }));\r\n const modifiedPhones = phoneNumbers.map((phoneNumber) => {\r\n const { id, ...rest } = phoneNumber;\r\n return rest;\r\n });\r\n const modifiedEmails = emails.map((email) => {\r\n const { id, ...rest } = email;\r\n return rest;\r\n });\r\n\r\n const editedContact = {\r\n id: currentContact.id,\r\n owner: contactPropietary.attributes.value,\r\n firstName: contactFirstname.attributes.value,\r\n lastName: contactLastname.attributes.value,\r\n // listId: contactListSelectState.attributes.value,\r\n address1: {\r\n ...getEditedField('street', currentContact.address1?.street, homeAddress.attributes.value),\r\n ...getEditedField('city', currentContact.address1?.street, city.attributes.value),\r\n ...getEditedField('state', currentContact.address1?.street, state.attributes.value),\r\n ...getEditedField('zipcode', currentContact.address1?.street, postalCode.attributes.value),\r\n ...getEditedField('country', currentContact.address1?.street, country.attributes.value),\r\n },\r\n address2: {\r\n ...getEditedField(\r\n 'street',\r\n currentContact.address2?.street,\r\n secondaryHomeAddress.attributes.value,\r\n ),\r\n ...getEditedField('city', currentContact.address2?.street, secondaryCity.attributes.value),\r\n ...getEditedField(\r\n 'state',\r\n currentContact.address2?.street,\r\n secondaryState.attributes.value,\r\n ),\r\n ...getEditedField(\r\n 'zipcode',\r\n currentContact.address2?.street,\r\n secondaryPostalCode.attributes.value,\r\n ),\r\n ...getEditedField(\r\n 'country',\r\n currentContact.address2?.street,\r\n secondaryCountry.attributes.value,\r\n ),\r\n },\r\n emails: modifiedEmails,\r\n phones: modifiedPhones,\r\n // ims_whatsapp: modifiedImsWhatsapp,\r\n tags: modifiedTags,\r\n imageUrl: contactImage.imageUrl ? contactImage.removeParams(contactImage.imageUrl) : null,\r\n properties: customProperties,\r\n // businessId: selectedBusiness[0]?.businessId || '',\r\n // businessName: selectedBusiness[0]?.businessName || '',\r\n birthDate: birthDate?.toDate(),\r\n };\r\n\r\n return editedContact;\r\n };\r\n // contact methods/actions are handled by useEditContactMethods\r\n function resetSelectedBusiness() {\r\n if (!contact) return;\r\n if (!contact.businessId || !contact.businessName) {\r\n // setSelectedBusiness([]);\r\n return;\r\n }\r\n // setSelectedBusiness([\r\n // { businessId: contact.businessId, businessName: contact.businessName },\r\n // ]);\r\n }\r\n\r\n function resetBirthDate() {\r\n setBirthDate(contact?.birthDate ? dayjs(contact.birthDate) : null);\r\n }\r\n function resetCustomProperty(nameKey: string) {\r\n if (!contact) return;\r\n\r\n const normalizeNameKey = (input: string) =>\r\n input.trim().toLowerCase().replace(/\\s+/g, '-').replace(/-+/g, '-');\r\n\r\n const defaultProperty =\r\n contact.properties.find((property) => property.nameKey === nameKey) ??\r\n contact.properties.find(\r\n (property) => normalizeNameKey(property.nameKey) === normalizeNameKey(nameKey),\r\n );\r\n\r\n if (!defaultProperty) {\r\n console.error(`No se encontró una propiedad con nameKey: ${nameKey}`);\r\n return; // Salir de la función si no se encuentra la propiedad\r\n }\r\n\r\n const updatedProperties = customProperties.map((property) =>\r\n property.nameKey === nameKey ? { ...property, value: defaultProperty.value } : property,\r\n );\r\n setCustomProperties(updatedProperties);\r\n }\r\n\r\n const getFilteredCustomProperties = (): Property[] => {\r\n if (!contact) return [];\r\n\r\n return customContactFields.map((customField) => {\r\n const normalizeNameKey = (input: string) =>\r\n input.trim().toLowerCase().replace(/\\s+/g, '-').replace(/-+/g, '-');\r\n\r\n const existingProperty =\r\n contact.properties.find((property) => property.nameKey === customField.nameKey) ??\r\n contact.properties.find(\r\n (property) =>\r\n normalizeNameKey(property.nameKey) === normalizeNameKey(customField.nameKey),\r\n );\r\n\r\n if (existingProperty) {\r\n return {\r\n ...existingProperty,\r\n nameKey: customField.nameKey,\r\n type: (existingProperty.type ?? customField.type)!,\r\n value: existingProperty.value,\r\n };\r\n }\r\n\r\n const existingLocalProperty = customProperties.find(\r\n (property) => property.nameKey === customField.nameKey,\r\n );\r\n\r\n return {\r\n nameKey: customField.nameKey,\r\n type: customField.type!,\r\n value: existingLocalProperty ? existingLocalProperty.value : '',\r\n };\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (contact && customContactFields) {\r\n setCustomProperties(getFilteredCustomProperties());\r\n }\r\n }, [contact, customContactFields]);\r\n\r\n useEffect(() => {\r\n if (contact?.tags) {\r\n labelMultipleSelect.actions.setValue(contact.tags);\r\n }\r\n if (contact?.businessId && contact.businessName) {\r\n // setSelectedBusiness([\r\n // { businessId: contact.businessId, businessName: contact.businessName },\r\n // ]);\r\n } else {\r\n // setSelectedBusiness([]);\r\n }\r\n }, [contact]);\r\n\r\n return {\r\n field: {\r\n birthDate,\r\n imsWhatsapp,\r\n imsRCS,\r\n contactFirstname,\r\n contactLastname,\r\n contactImage,\r\n contactPropietary,\r\n imsMercadolibre,\r\n imsFacebooks,\r\n imsWebchats,\r\n imsInstagrams,\r\n emails,\r\n phoneNumbers,\r\n homeAddress,\r\n secondaryHomeAddress,\r\n city,\r\n secondaryCity,\r\n state,\r\n secondaryState,\r\n postalCode,\r\n secondaryPostalCode,\r\n country,\r\n secondaryCountry,\r\n customProperties,\r\n labelMultipleSelect,\r\n // selectedBusiness,\r\n },\r\n action: {\r\n setBirthDate,\r\n setCustomProperties,\r\n getEditedContact,\r\n handleAddressFieldChange,\r\n handleNoteFieldChange,\r\n handleDeleteAddress,\r\n addPhone,\r\n addEmail,\r\n addWhatsapp,\r\n addRCS,\r\n replaceAddress,\r\n // setSelectedBusiness,\r\n addWhatsappVerified,\r\n resetToInitialContactInformation,\r\n resetSelectedBusiness,\r\n resetBirthDate,\r\n resetCustomProperty,\r\n },\r\n state: {\r\n isDeletingAddress,\r\n },\r\n };\r\n};\r\n\r\nexport default useEditContact;\r\n","import { createContext, useContext } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport type { IBusiness, IContact, IContactField } from '@trii/types/dist/Contacts/contacts';\r\nimport useEditBusiness from '../hooks/useEditBusiness/useEditBusiness';\r\nimport type UseEditBusiness from '../hooks/useEditBusiness/types/UseEditBusiness';\r\nimport useEditContact from '../hooks/useEditContact/useEditContact';\r\nimport type UseEditContact from '../hooks/useEditContact/types/UseEditContact';\r\n\r\ntype EditEntityContextValue =\r\n | {\r\n entityType: 'contact';\r\n editEntity: UseEditContact;\r\n entityId: string;\r\n }\r\n | {\r\n entityType: 'business';\r\n editEntity: UseEditBusiness;\r\n entityId: string;\r\n };\r\n\r\nconst EditEntityContext = createContext<EditEntityContextValue | null>(null);\r\n\r\ntype BaseEditEntityProviderProps = {\r\n children: ReactNode;\r\n customContactFields: IContactField[];\r\n baseUrl?: string;\r\n spaceId?: string;\r\n};\r\n\r\ntype EditContactEntityProviderProps = BaseEditEntityProviderProps & {\r\n contact: IContact;\r\n};\r\n\r\nexport const EditContactEntityProvider = ({\r\n children,\r\n contact,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: EditContactEntityProviderProps) => {\r\n const editEntity = useEditContact({\r\n contact,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n });\r\n\r\n return (\r\n <EditEntityContext.Provider value={{ entityType: 'contact', editEntity, entityId: String(contact.id) }}>\r\n {children}\r\n </EditEntityContext.Provider>\r\n );\r\n};\r\n\r\ntype EditBusinessEntityProviderProps = BaseEditEntityProviderProps & {\r\n business: IBusiness;\r\n};\r\n\r\nexport const EditBusinessEntityProvider = ({\r\n children,\r\n business,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: EditBusinessEntityProviderProps) => {\r\n const editEntity = useEditBusiness({\r\n business,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n });\r\n\r\n return (\r\n <EditEntityContext.Provider value={{ entityType: 'business', editEntity, entityId: String(business.id) }}>\r\n {children}\r\n </EditEntityContext.Provider>\r\n );\r\n};\r\n\r\ntype EditEntityProviderProps = BaseEditEntityProviderProps & {\r\n entityType: 'contact' | 'business';\r\n entityData: IContact | IBusiness;\r\n};\r\n\r\nexport const EditEntityProvider = ({\r\n children,\r\n entityType,\r\n entityData,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n}: EditEntityProviderProps) => {\r\n if (entityType === 'contact') {\r\n return (\r\n <EditContactEntityProvider\r\n contact={entityData as IContact}\r\n customContactFields={customContactFields}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n >\r\n {children}\r\n </EditContactEntityProvider>\r\n );\r\n }\r\n\r\n return (\r\n <EditBusinessEntityProvider\r\n business={entityData as IBusiness}\r\n customContactFields={customContactFields}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n >\r\n {children}\r\n </EditBusinessEntityProvider>\r\n );\r\n};\r\n\r\nexport const useEditEntity = () => {\r\n const ctx = useContext(EditEntityContext);\r\n if (!ctx) {\r\n throw new Error('useEditEntity must be used within EditEntityProvider');\r\n }\r\n return ctx;\r\n};\r\n","import { UserInfo, UserTrii } from \"@trii/types/dist/Users\";\r\n\r\nexport const resolveUserLabel = ({\r\n userId,\r\n users,\r\n currentUser,\r\n}: {\r\n userId?: string;\r\n users: UserInfo[];\r\n currentUser?: UserTrii | null;\r\n}) => {\r\n if (!userId) return null;\r\n if (currentUser?.uid && currentUser.uid === userId) {\r\n return currentUser.display_name || currentUser.email || null;\r\n }\r\n const fromUsers = users.find((u) => u?.id === userId);\r\n return fromUsers?.name?.trim() || fromUsers?.email || null;\r\n};\r\n","import { Box, Button, Divider, Stack, Typography } from '@mui/material';\r\nimport { ReactNode } from 'react';\r\nimport AddLocationAltIcon from '@mui/icons-material/AddLocationAlt';\r\nimport { useTranslationContext } from '../context/TranslationContext';\r\n\r\ntype SectionProps = {\r\n title: string;\r\n children: ReactNode;\r\n enableDirectionSearch?: boolean;\r\n onDirectionSearchClick?: () => void;\r\n};\r\n\r\nconst Section = ({\r\n title,\r\n children,\r\n enableDirectionSearch = false,\r\n onDirectionSearchClick,\r\n}: SectionProps) => {\r\n const t = useTranslationContext();\r\n return (\r\n <Box\r\n sx={{\r\n border: '1px solid',\r\n borderColor: 'divider',\r\n borderRadius: 2,\r\n p: 2,\r\n mb: 2,\r\n }}\r\n >\r\n <Stack direction=\"row\" alignItems=\"center\" justifyContent=\"space-between\">\r\n <Typography variant=\"subtitle1\">{title}</Typography>\r\n {enableDirectionSearch && (\r\n <Button\r\n startIcon={<AddLocationAltIcon sx={{ color: 'primary.main', height: 18, width: 18 }} />}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n color=\"primary\"\r\n onClick={() => onDirectionSearchClick && onDirectionSearchClick()}\r\n >\r\n {t('global.searchLocation')}\r\n </Button>\r\n )}\r\n </Stack>\r\n <Divider sx={{ my: 1.5 }} />\r\n {children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Section;\r\n","import { Box, BoxProps } from '@mui/material';\r\nimport { ReactNode } from 'react';\r\n\r\ntype SectionContentProps = {\r\n children: ReactNode;\r\n} & BoxProps;\r\n\r\nconst SectionContent = ({ children, ...boxProps }: SectionContentProps) => {\r\n return (\r\n <Box\r\n display=\"grid\"\r\n gridTemplateColumns={{ xs: '1fr', md: 'repeat(2, minmax(0, 1fr))' }}\r\n gap={2}\r\n {...boxProps}\r\n >\r\n {children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SectionContent;\r\n","import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { DatePicker } from '@mui/x-date-pickers';\r\nimport Box from '@mui/material/Box';\r\nimport { Dayjs } from 'dayjs';\r\n\r\ninterface DateSelectProps {\r\n birthDate: Dayjs | null;\r\n setBirthDate: (date: Dayjs | null) => void;\r\n dateFormat: string;\r\n}\r\n\r\nconst DateSelect = ({ birthDate, setBirthDate, dateFormat }: DateSelectProps) => {\r\n \r\n const userDateFormat = (dateFormat || 'YYYY/MM/DD').toUpperCase();\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box\r\n sx={{\r\n overflow: 'visible',\r\n paddingTop: '0px',\r\n }}\r\n >\r\n <DatePicker\r\n value={birthDate}\r\n onChange={(newValue) => setBirthDate(newValue)}\r\n slotProps={{ textField: { size: 'small' } }}\r\n format={userDateFormat}\r\n\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default DateSelect;\r\n","import { createContext, useContext } from 'react';\n\nexport type EditContactView = 'main' | 'tags' | 'searchLocation' | 'businessSelect';\n\nexport type EditContactViewContextValue = {\n view: EditContactView;\n setView: (view: EditContactView) => void;\n};\n\nconst noop: EditContactViewContextValue = { view: 'main', setView: () => {} };\n\nconst EditContactViewContext = createContext<EditContactViewContextValue | null>(null);\n\nexport const EditContactViewProvider = EditContactViewContext.Provider;\n\nexport const useEditContactView = () => {\n const ctx = useContext(EditContactViewContext);\n if (!ctx) {\n console.warn('[useEditContactView] using noop, context value is missing');\n return noop;\n }\n return ctx;\n};\n","import { createContext, useContext, ReactNode } from 'react';\r\n\r\nexport type NavigateFn = (path: string) => void;\r\n\r\nconst noop: NavigateFn = () => {};\r\nconst NavigateContext = createContext<NavigateFn>(noop);\r\n\r\ninterface NavigateProviderProps {\r\n navigate: NavigateFn;\r\n children: ReactNode;\r\n}\r\n\r\nexport const NavigateProvider = ({ navigate, children }: NavigateProviderProps) => {\r\n return <NavigateContext.Provider value={navigate}>{children}</NavigateContext.Provider>;\r\n};\r\n\r\nexport const useNavigateContext = (): NavigateFn => {\r\n const navigate = useContext(NavigateContext);\r\n if (!navigate) {\r\n console.warn('[useNavigateContext] using noop, context value is falsy');\r\n return noop;\r\n }\r\n return navigate;\r\n};\r\n","import { Box, CircularProgress, Typography } from '@mui/material';\r\nimport ContactInfoPopup from '../../../../../ContactInfoPopup';\r\nimport useImage from '../../../../hooks/useImage';\r\nimport { useState } from 'react';\r\nimport { IBusiness } from '@trii/types/dist/Contacts';\r\nimport { useEditContactApi } from '../../../../context/EditContactApiContext';\r\nimport { isBusiness } from '../../../../types/is-business.typeguard';\r\nimport { useNavigateContext } from '../../../../context/NavigateContext';\r\n\r\ntype Props = {\r\n value: string;\r\n displayValue: string;\r\n businessId: string;\r\n};\r\n\r\nfunction SelectBusinessLabel({ value, displayValue, businessId }: Props) {\r\n const api = useEditContactApi();\r\n const navigate = useNavigateContext();\r\n\r\n const [businessData, setBusinessData] = useState<IBusiness | null>(null);\r\n const userImage = useImage({\r\n initialImageUrl: businessData?.imageUrl,\r\n entityType: 'business',\r\n entityId: businessId,\r\n });\r\n\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\r\n const [isLoadingData, setIsLoadingData] = useState(false);\r\n\r\n const handleOpenInfoPopover = async (event: React.MouseEvent<HTMLElement>) => {\r\n // Store the target element before any async operations\r\n const targetElement = event.currentTarget;\r\n\r\n setIsLoadingData(true);\r\n\r\n if (!api) {\r\n console.error('API is null');\r\n return;\r\n }\r\n\r\n const response = await api.fetchContact({ contactId: businessId });\r\n\r\n if (response && isBusiness(response)) {\r\n setBusinessData(response);\r\n }\r\n\r\n setIsLoadingData(false);\r\n\r\n if (!targetElement) {\r\n console.error('Target element is null');\r\n return;\r\n }\r\n\r\n setAnchorEl(targetElement);\r\n };\r\n\r\n return (\r\n <Box display=\"flex\" alignItems=\"center\">\r\n <Typography\r\n onClick={handleOpenInfoPopover}\r\n variant=\"body2\"\r\n fontWeight={'600'}\r\n sx={{\r\n padding: 1,\r\n cursor: 'pointer',\r\n }}\r\n color={(theme) => theme.palette.text.primary}\r\n >\r\n {displayValue || (typeof value === 'string' && value) || '-'}\r\n </Typography>\r\n {businessData && (\r\n <ContactInfoPopup\r\n contactData={businessData}\r\n open={Boolean(anchorEl)}\r\n anchorEl={anchorEl}\r\n onClose={() => setAnchorEl(null)}\r\n navigate={navigate}\r\n avatarImgUrl={userImage.imageUrl}\r\n />\r\n )}\r\n {isLoadingData && (\r\n <Box display=\"flex\" alignItems=\"center\" justifyContent=\"center\" p={1}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\nexport default SelectBusinessLabel;\r\n","import { useEffect, useRef, useState } from 'react';\r\n// Components/ui\r\nimport { DateSelect } from '../ContactInfoLabel/components';\r\nimport {\r\n Box,\r\n CircularProgress,\r\n IconButton,\r\n MenuItem,\r\n Select,\r\n SelectChangeEvent,\r\n TextField,\r\n Tooltip,\r\n Typography,\r\n styled,\r\n} from '@mui/material';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport CancelIcon from '@mui/icons-material/Cancel';\r\nimport SaveIcon from '@mui/icons-material/Save';\r\nimport { updateEntity } from '../../services/api';\r\n// Types\r\nimport type { UserInfo } from '@trii/types/dist/Users';\r\nimport type { IList } from '@trii/types/dist/Contacts';\r\nimport type UseEditContact from '../../hooks/useEditContact/types/UseEditContact';\r\n// Hooks\r\nimport dayjs from 'dayjs';\r\nimport { useTranslationContext } from '../../context/TranslationContext';\r\nimport { useEditContactView } from '../../context/EditContactViewContext';\r\nimport { SelectBusinessLabel } from './components';\r\n\r\ntype SharedProps = {\r\n title: string;\r\n value?: string | Date;\r\n isNotEditable?: boolean;\r\n displayValue?: string;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n minWidth?: string | number;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\ntype ContactBaseProps = SharedProps & {\r\n entityType: 'contact';\r\n entityId?: string;\r\n options?: Array<UserInfo | IList>;\r\n constructUpdateObject?: (value: string | Date | null) => object;\r\n businessId?: string;\r\n};\r\n\r\ntype ContactBirthdayProps = ContactBaseProps & {\r\n inputType: 'birthday';\r\n contact: UseEditContact;\r\n dateFormat: string;\r\n};\r\n\r\ntype ContactNonBirthdayProps = ContactBaseProps & {\r\n inputType?: 'text' | 'select' | 'selectBusiness';\r\n contact?: UseEditContact;\r\n dateFormat?: string;\r\n};\r\n\r\ntype BusinessProps = SharedProps & {\r\n entityType: 'business';\r\n entityId?: string;\r\n inputType?: 'text' | 'select' | 'selectMembers';\r\n options?: UserInfo[];\r\n constructUpdateObject?: (value: string | Date) => object;\r\n};\r\n\r\ntype Props = ContactBirthdayProps | ContactNonBirthdayProps | BusinessProps;\r\n\r\nconst isUserInfo = (option: UserInfo | IList): option is UserInfo => 'email' in option;\r\n\r\nconst isContactBirthdayProps = (p: Props): p is ContactBirthdayProps =>\r\n p.entityType === 'contact' && p.inputType === 'birthday';\r\n\r\nconst StyledIconButton = styled(IconButton)({\r\n opacity: 0,\r\n transition: 'opacity 0.3s ease-in-out',\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n marginLeft: '15px',\r\n});\r\n\r\nconst StyledSaveCancelButton = styled(IconButton)({\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n});\r\n\r\nconst EntityInfoLabel = (props: Props) => {\r\n const { title, value, isNotEditable, displayValue, baseUrl, spaceId, minWidth, onEntityUpdated } =\r\n props;\r\n const t = useTranslationContext();\r\n const { setView } = useEditContactView();\r\n\r\n const inputType = props.inputType ?? 'text';\r\n\r\n const [isEditing, setIsEditing] = useState<boolean>(false);\r\n const [isSaving, setIsSaving] = useState<boolean>(false);\r\n const titleRef = useRef<HTMLElement | null>(null);\r\n const [isTitleTruncated, setIsTitleTruncated] = useState(false);\r\n const [inputValue, setInputValue] = useState<string | Date | undefined>(() => {\r\n if (props.entityType === 'business') return value;\r\n return typeof value === 'string' ? value : undefined;\r\n });\r\n\r\n useEffect(() => {\r\n const el = titleRef.current;\r\n if (!el) return;\r\n\r\n const check = () => {\r\n const next = el.scrollWidth > el.clientWidth;\r\n setIsTitleTruncated((prev) => (prev === next ? prev : next));\r\n };\r\n\r\n check();\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n let rafId = 0;\r\n const ro = new ResizeObserver(() => {\r\n if (typeof window === 'undefined') {\r\n check();\r\n return;\r\n }\r\n if (rafId) window.cancelAnimationFrame(rafId);\r\n rafId = window.requestAnimationFrame(() => {\r\n check();\r\n });\r\n });\r\n ro.observe(el);\r\n return () => {\r\n if (typeof window !== 'undefined' && rafId) window.cancelAnimationFrame(rafId);\r\n ro.disconnect();\r\n };\r\n }\r\n\r\n if (typeof window === 'undefined') return;\r\n window.addEventListener('resize', check);\r\n return () => {\r\n window.removeEventListener('resize', check);\r\n };\r\n }, [title]);\r\n\r\n useEffect(() => {\r\n if (props.entityType === 'business') {\r\n setInputValue(value);\r\n } else {\r\n setInputValue(typeof value === 'string' ? value : undefined);\r\n }\r\n }, [value, props.entityType]);\r\n\r\n const handleEditClick = () => {\r\n if (props.entityType === 'contact' && inputType === 'selectBusiness') {\r\n setView('businessSelect');\r\n return;\r\n }\r\n setIsEditing((prev) => !prev);\r\n };\r\n\r\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setInputValue(e.target.value);\r\n };\r\n\r\n const handleSelectChange = (e: SelectChangeEvent<string>) => {\r\n const newValue = e.target.value;\r\n setInputValue(newValue);\r\n };\r\n\r\n const handleCancel = () => {\r\n if (isContactBirthdayProps(props)) {\r\n props.contact.action.resetBirthDate();\r\n }\r\n setIsEditing(false);\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!props.constructUpdateObject) {\r\n setIsEditing(false);\r\n return;\r\n }\r\n\r\n if (props.entityType === 'business') {\r\n if (inputValue === undefined) {\r\n setIsEditing(false);\r\n return;\r\n }\r\n }\r\n\r\n setIsSaving(true);\r\n\r\n try {\r\n if (!baseUrl || !spaceId) {\r\n throw new Error('Missing baseUrl or spaceId for updateEntity');\r\n }\r\n\r\n if (props.entityType === 'contact') {\r\n let updatedValue: string | Date | null =\r\n inputValue === undefined ? null : (inputValue as any);\r\n\r\n if (isContactBirthdayProps(props)) {\r\n const parsedDate = dayjs(props.contact.field.birthDate);\r\n if (parsedDate.isValid()) {\r\n updatedValue = parsedDate.toISOString();\r\n }\r\n }\r\n\r\n const updatedContactData = props.constructUpdateObject(updatedValue);\r\n const entityId = props.entityId ?? (updatedContactData as any)?.id;\r\n if (!entityId) {\r\n throw new Error('Missing contactId for updateEntity');\r\n }\r\n\r\n const updated = await updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType: 'contact',\r\n entityId,\r\n body: updatedContactData,\r\n });\r\n onEntityUpdated?.(updated);\r\n } else {\r\n const updatedBusinessData = props.constructUpdateObject(inputValue as string | Date);\r\n const entityId = props.entityId ?? (updatedBusinessData as any)?.id;\r\n if (!entityId) {\r\n throw new Error('Missing businessId for updateEntity');\r\n }\r\n\r\n const updated = await updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType: 'business',\r\n entityId,\r\n body: updatedBusinessData,\r\n });\r\n onEntityUpdated?.(updated);\r\n }\r\n } finally {\r\n setIsSaving(false);\r\n setIsEditing(false);\r\n }\r\n };\r\n\r\n const selectValue = typeof inputValue === 'string' ? inputValue : '';\r\n const textValue =\r\n inputValue instanceof Date\r\n ? inputValue.toISOString()\r\n : typeof inputValue === 'string'\r\n ? inputValue\r\n : '';\r\n\r\n const resolvedMinWidth = minWidth ?? (props.entityType === 'contact' ? '45%' : '200px');\r\n const options = props.options ?? [];\r\n\r\n return (\r\n <Box\r\n className=\"fadein contacts-col-5\"\r\n sx={{\r\n display: 'flex',\r\n backgroundColor: (theme) =>\r\n theme.palette.mode === 'dark' ? '1e1e1e' : theme.palette.background.default,\r\n flexDirection: 'column',\r\n borderRadius: 1,\r\n minWidth: resolvedMinWidth,\r\n '&:hover .edit-icon': {\r\n opacity: 1,\r\n },\r\n }}\r\n >\r\n <Box display=\"flex\" position=\"relative\" minHeight={'25px'}>\r\n {isTitleTruncated ? (\r\n <Tooltip title={title} arrow>\r\n <Typography\r\n ref={titleRef}\r\n component=\"span\"\r\n variant=\"body2\"\r\n letterSpacing={-0.5}\r\n fontWeight={'600'}\r\n alignSelf={'center'}\r\n flexGrow={isEditing ? 1 : 0}\r\n color={(theme) => theme.palette.text.primary}\r\n noWrap\r\n sx={{\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {title}\r\n </Typography>\r\n </Tooltip>\r\n ) : (\r\n <Typography\r\n ref={titleRef}\r\n component=\"span\"\r\n variant=\"body2\"\r\n letterSpacing={-0.5}\r\n fontWeight={'600'}\r\n alignSelf={'center'}\r\n flexGrow={isEditing ? 1 : 0}\r\n color={(theme) => theme.palette.text.primary}\r\n noWrap\r\n sx={{ minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\r\n >\r\n {title}\r\n </Typography>\r\n )}\r\n\r\n {isNotEditable ? null : isEditing ? (\r\n <>\r\n <StyledSaveCancelButton size=\"small\" onClick={handleSave}>\r\n {isSaving ? <CircularProgress size={24} /> : <SaveIcon />}\r\n </StyledSaveCancelButton>\r\n <StyledSaveCancelButton size=\"small\" onClick={handleCancel}>\r\n <CancelIcon />\r\n </StyledSaveCancelButton>\r\n </>\r\n ) : (\r\n <StyledIconButton className=\"edit-icon\" size=\"small\" onClick={handleEditClick}>\r\n <EditIcon />\r\n </StyledIconButton>\r\n )}\r\n </Box>\r\n\r\n <Box width={isEditing ? '100%' : '50%'} position=\"relative\">\r\n {isEditing && inputType === 'text' ? (\r\n <TextField\r\n value={textValue}\r\n onChange={handleInputChange}\r\n variant=\"standard\"\r\n size=\"small\"\r\n sx={{ width: '100%' }}\r\n />\r\n ) : isEditing && (inputType === 'select' || inputType === 'selectMembers') ? (\r\n <Select\r\n value={selectValue}\r\n onChange={handleSelectChange}\r\n variant=\"standard\"\r\n size=\"small\"\r\n sx={{ width: '100%' }}\r\n >\r\n {props.entityType === 'contact' ? (\r\n <MenuItem value=\"\">\r\n {t('conversations.contactDetails.contactInfo.emptySelection')}\r\n </MenuItem>\r\n ) : null}\r\n\r\n {options.map((option: any, index: number) => (\r\n <MenuItem key={index} value={option.id}>\r\n {props.entityType === 'contact'\r\n ? option.name?.trim() || (isUserInfo(option) ? option.email : '') || 'Sin nombre'\r\n : option.name?.trim() || option.email || 'Sin nombre'}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n ) : isEditing && isContactBirthdayProps(props) ? (\r\n <DateSelect\r\n birthDate={props.contact.field.birthDate}\r\n setBirthDate={props.contact.action.setBirthDate}\r\n dateFormat={props.dateFormat}\r\n />\r\n ) : !isEditing &&\r\n props.entityType === 'contact' &&\r\n inputType === 'selectBusiness' &&\r\n props.businessId ? (\r\n <SelectBusinessLabel\r\n value={String(value ?? '')}\r\n displayValue={String(displayValue ?? '')}\r\n businessId={props.businessId}\r\n />\r\n ) : (\r\n <Typography\r\n variant=\"body2\"\r\n fontWeight={'400'}\r\n sx={{ padding: '2.5px 14px 8.5px 0px' }}\r\n color={(theme) => theme.palette.text.primary}\r\n >\r\n {displayValue || (typeof value === 'string' && value) || '-'}\r\n </Typography>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default EntityInfoLabel;\r\n","import EntityInfoLabel from '../EntityInfoLabel';\r\n// Types\r\nimport type { UserInfo } from '@trii/types/dist/Users';\r\nimport type { IList } from '@trii/types/dist/Contacts';\r\nimport type UseEditContact from '../../hooks/useEditContact/types/UseEditContact';\r\n\r\ntype BaseProps = {\r\n title: string;\r\n value?: string | Date;\r\n isNotEditable?: boolean;\r\n options?: UserInfo[] | IList[];\r\n displayValue?: string;\r\n constructUpdateObject?: (value: string | Date | null) => object;\r\n businessId?: string;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n contactId?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\ntype BirthdayProps = BaseProps & {\r\n inputType: 'birthday';\r\n contact: UseEditContact;\r\n dateFormat: string;\r\n};\r\n\r\ntype NonBirthdayProps = BaseProps & {\r\n inputType?: 'text' | 'select' | 'selectBusiness';\r\n contact?: UseEditContact;\r\n dateFormat?: string;\r\n};\r\n\r\ntype Props = BirthdayProps | NonBirthdayProps;\r\n\r\nconst ContactInfoLabel = (props: Props) => {\r\n const {\r\n title,\r\n value,\r\n isNotEditable,\r\n options = [],\r\n displayValue,\r\n constructUpdateObject,\r\n businessId,\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n onEntityUpdated,\r\n } = props;\r\n\r\n if (props.inputType === 'birthday') {\r\n return (\r\n <EntityInfoLabel\r\n entityType=\"contact\"\r\n entityId={contactId}\r\n title={title}\r\n value={value}\r\n isNotEditable={isNotEditable}\r\n inputType=\"birthday\"\r\n options={options as Array<UserInfo | IList>}\r\n displayValue={displayValue}\r\n constructUpdateObject={constructUpdateObject}\r\n contact={props.contact}\r\n businessId={businessId}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n dateFormat={props.dateFormat}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n );\r\n }\r\n\r\n const inputType = props.inputType ?? 'text';\r\n\r\n return (\r\n <EntityInfoLabel\r\n entityType=\"contact\"\r\n entityId={contactId}\r\n title={title}\r\n value={value}\r\n isNotEditable={isNotEditable}\r\n inputType={inputType}\r\n options={options as Array<UserInfo | IList>}\r\n displayValue={displayValue}\r\n constructUpdateObject={constructUpdateObject}\r\n businessId={businessId}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n );\r\n};\r\n\r\nexport default ContactInfoLabel;\r\n","// Types\r\nimport { ContactField_type, Property } from '@trii/types/dist/Contacts';\r\n// Components\r\nimport { TextField } from '@mui/material';\r\n\r\ntype CustomPropertyInputProps = Property & {\r\n onChange: (name: string, value: any) => void;\r\n};\r\n\r\nconst CustomPropertyInput = ({\r\n nameKey,\r\n value,\r\n onChange,\r\n type,\r\n}: CustomPropertyInputProps) => {\r\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if (\r\n type === ContactField_type.NUMBER_ACCOUNTING ||\r\n type === ContactField_type.NUMBER_DECIMAL ||\r\n type === ContactField_type.NUMBER_CURRENCY ||\r\n type === ContactField_type.CURRENCY\r\n ) {\r\n handleNumberTypeChange(event);\r\n } else if (type === ContactField_type.NUMBER_INTEGER) {\r\n handleIntegerNumberTypeChange(event);\r\n } else if (\r\n type === ContactField_type.LONGTEXT ||\r\n type === ContactField_type.TEXT ||\r\n type === ContactField_type.ADDRESS\r\n ) {\r\n handleTextTypeChange(event);\r\n }\r\n };\r\n\r\n const handleTextTypeChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n onChange(nameKey, event.target.value);\r\n };\r\n\r\n const handleNumberTypeChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const inputValue = event.target.value;\r\n const sanitizedInput = inputValue.replace(/[^0-9.]/g, '');\r\n onChange(nameKey, sanitizedInput);\r\n };\r\n\r\n const handleIntegerNumberTypeChange = (\r\n event: React.ChangeEvent<HTMLInputElement>\r\n ) => {\r\n const newValue = event.target.value;\r\n if (/^\\d*$/.test(newValue)) {\r\n onChange(nameKey, newValue);\r\n }\r\n };\r\n\r\n return (\r\n <TextField\r\n size=\"small\"\r\n variant=\"standard\"\r\n value={value}\r\n onChange={handleChange}\r\n inputProps={{\r\n pattern: '[0-9]*',\r\n }}\r\n multiline={type === ContactField_type.LONGTEXT}\r\n rows={type === ContactField_type.LONGTEXT ? 4 : 1}\r\n sx={{ width: '100%' }}\r\n />\r\n );\r\n};\r\n\r\nexport default CustomPropertyInput;\r\n","import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport { DatePicker } from '@mui/x-date-pickers';\r\nimport Box from '@mui/material/Box';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\n\r\ntype Props = {\r\n value: Dayjs | null;\r\n handleChange: (value: Dayjs | null) => void;\r\n dateFormat: string;\r\n};\r\n\r\nconst CustomPropertyDatePicker = ({ value, handleChange, dateFormat }: Props) => {\r\n const userDateFormat = (dateFormat || 'YYYY/MM/DD').toUpperCase();\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box\r\n sx={{\r\n overflow: 'visible',\r\n paddingTop: '0px',\r\n }}\r\n >\r\n <DatePicker\r\n value={value ? dayjs(value) : null}\r\n onChange={(newValue) => handleChange(newValue)}\r\n format={userDateFormat}\r\n slotProps={{\r\n textField: {\r\n size: 'small',\r\n sx: {\r\n width: '100%',\r\n },\r\n variant: 'standard',\r\n },\r\n openPickerButton: {\r\n disableRipple: true,\r\n },\r\n }}\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default CustomPropertyDatePicker;\r\n","// Components\r\nimport { FormControl, Select, MenuItem } from '@mui/material';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n value: string;\r\n handleChange: (value: string) => void;\r\n options: string[];\r\n};\r\n\r\nconst CustomPropertyOptionsSelect = ({ handleChange, value, options }: Props) => {\r\n const t = useTranslationContext();\r\n\r\n return (\r\n <FormControl className=\"fadein\" sx={{ width: '100%' }}>\r\n <Select\r\n value={value}\r\n onChange={(e) => handleChange(e.target.value)}\r\n size=\"small\"\r\n variant=\"standard\"\r\n >\r\n <MenuItem value=\"\">{t('global.noValue')}</MenuItem>\r\n {options.map((option, i) => (\r\n <MenuItem key={i} value={option}>\r\n {option}\r\n </MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n );\r\n};\r\n\r\nexport default CustomPropertyOptionsSelect;\r\n","import dayjs, { Dayjs } from 'dayjs';\r\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\r\nimport Box from '@mui/material/Box';\r\n\r\ntype Props = {\r\n value: Dayjs | null;\r\n handleChange: (value: Dayjs | null) => void;\r\n userTimeFormat?: string; // Optional prop for custom time format\r\n};\r\n\r\nconst CustomPropertyTimePicker = ({ value, handleChange, userTimeFormat }: Props) => {\r\n const is24HourFormat = userTimeFormat === '24' ? 'HH:mm' : 'hh:mm';\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ overflow: 'visible', paddingTop: '0px' }}>\r\n <TimePicker\r\n value={value ? dayjs(value) : null}\r\n onChange={(newValue) => handleChange(newValue)}\r\n format={is24HourFormat} \r\n slotProps={{\r\n textField: {\r\n size: 'small',\r\n sx: {\r\n width: '100%',\r\n },\r\n variant: 'standard',\r\n },\r\n openPickerButton: {\r\n disableRipple: true,\r\n },\r\n }}\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default CustomPropertyTimePicker;\r\n","import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport { MultiInputTimeRangeField } from '@mui/x-date-pickers-pro';\r\nimport { DateRange } from '@mui/x-date-pickers-pro';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\nimport Box from '@mui/material/Box';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n value: DateRange<Dayjs> | null;\r\n handleChange: (newValue: DateRange<Dayjs>) => void;\r\n userTimeFormat?: string;\r\n};\r\n\r\nconst CustomPropertyTimeRangePicker = ({ value, handleChange, userTimeFormat }: Props) => {\r\n const t = useTranslationContext();\r\n const initDates: DateRange<Dayjs> = [\r\n dayjs().set('hour', 0).set('minute', 0),\r\n dayjs().set('hour', 0).set('minute', 0),\r\n ];\r\n\r\n const timeFormat = userTimeFormat === '24' ? 'HH:mm' : 'hh:mm';\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ overflow: 'visible', paddingTop: '0px' }}>\r\n <MultiInputTimeRangeField\r\n slotProps={{\r\n textField: ({ position }) => ({\r\n label: position === 'start' ? t('contactEdit.from') : t('contactEdit.to'),\r\n size: 'small',\r\n variant: 'standard',\r\n inputProps: {\r\n placeholder: timeFormat,\r\n },\r\n }),\r\n }}\r\n value={value ? value : initDates}\r\n onChange={(newValue) => handleChange(newValue)}\r\n format={timeFormat}\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default CustomPropertyTimeRangePicker;\r\n","import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\nimport { DateRange, MultiInputDateRangeField } from '@mui/x-date-pickers-pro';\r\nimport Box from '@mui/material/Box';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n value: DateRange<Dayjs> | null;\r\n handleChange: (newValue: DateRange<Dayjs>) => void;\r\n userDateFormat?: string; // Formato personalizado\r\n};\r\n\r\nconst CustomPropertyDateRangePicker = ({ value, handleChange, userDateFormat }: Props) => {\r\n const t = useTranslationContext();\r\n // Default date range if value is null\r\n const initDates: DateRange<Dayjs> = [dayjs(), dayjs()];\r\n\r\n // Determina el formato dinámico\r\n const dateFormat = (userDateFormat || 'YYYY/MM/DD').toUpperCase();\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ overflow: 'visible', paddingTop: '0px' }}>\r\n <MultiInputDateRangeField\r\n slotProps={{\r\n textField: ({ position }) => ({\r\n label: position === 'start' ? t('contactEdit.from') : t('contactEdit.to'),\r\n size: 'small',\r\n sx: {\r\n width: '100%',\r\n },\r\n variant: 'standard',\r\n inputProps: {\r\n placeholder: dateFormat, // Agrega un placeholder para mostrar el formato esperado\r\n },\r\n }),\r\n }}\r\n value={value || initDates} // Usa initDates como valor predeterminado si value es null\r\n onChange={(newValue) => handleChange(newValue)}\r\n format={dateFormat} // Aplica el formato dinámico\r\n />\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n};\r\n\r\nexport default CustomPropertyDateRangePicker;\r\n","import { useEffect, useRef, useState } from 'react';\r\n// Components/ui\r\nimport { Box, CircularProgress, IconButton, styled, Tooltip, Typography } from '@mui/material';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport CancelIcon from '@mui/icons-material/Cancel';\r\nimport SaveIcon from '@mui/icons-material/Save';\r\nimport {\r\n CustomPropertyDatePicker,\r\n CustomPropertyDateRangePicker,\r\n CustomPropertyInput,\r\n CustomPropertyOptionSelect,\r\n CustomPropertyTimePicker,\r\n CustomPropertyTimeRangePicker,\r\n} from './components';\r\n// Types\r\nimport type { IContactField } from '@trii/types/dist/Contacts/contacts';\r\nimport { ContactField_type, Property } from '@trii/types/dist/Contacts';\r\nimport type { UserTrii } from '@trii/types/dist/Users';\r\n// Services\r\nimport { updateEntity } from '../../services/api';\r\n// Hooks (edit state)\r\nimport type UseEditContact from '../../hooks/useEditContact/types/UseEditContact';\r\nimport type UseEditBusiness from '../../hooks/useEditBusiness/types/UseEditBusiness';\r\n// Utils\r\nimport dayjs, { Dayjs } from 'dayjs';\r\n\r\nconst StyledIconButton = styled(IconButton)(() => ({\r\n opacity: 0,\r\n transition: 'opacity 0.3s ease-in-out',\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n marginLeft: '15px',\r\n}));\r\n\r\nconst StyledSaveCancelButton = styled(IconButton)(() => ({\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n}));\r\n\r\nconst ContactBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n\r\n borderRadius: theme.shape.borderRadius,\r\n minWidth: '45%',\r\n '&:hover .edit-icon': {\r\n opacity: 1,\r\n },\r\n}));\r\n\r\nconst FieldName = styled(Typography)(({ theme }) => ({\r\n fontWeight: 600,\r\n fontSize: '0.875rem',\r\n alignSelf: 'center',\r\n color: theme.palette.text.primary,\r\n letterSpacing: -0.5,\r\n padding: 0,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n minWidth: 0,\r\n}));\r\n\r\nconst FieldValue = styled(Typography)(({ theme }) => ({\r\n fontWeight: 400,\r\n fontSize: '0.875rem',\r\n padding: '2.5px 14px 8.5px 0px',\r\n color: theme.palette.text.primary,\r\n wordWrap: 'break-word',\r\n maxHeight: '80px',\r\n overflow: 'auto',\r\n whiteSpace: 'break-spaces',\r\n}));\r\n\r\ntype Props = {\r\n property: Property;\r\n entity: UseEditContact | UseEditBusiness;\r\n entityType: 'contact' | 'business';\r\n entityId: string;\r\n customContactFields: IContactField[];\r\n userTrii?: UserTrii | null;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\nconst EntityCustomFieldLabel = ({\r\n property,\r\n entity,\r\n entityType,\r\n entityId,\r\n customContactFields,\r\n userTrii,\r\n baseUrl,\r\n spaceId,\r\n onEntityUpdated,\r\n}: Props) => {\r\n const { customProperties } = entity.field;\r\n const { setCustomProperties } = entity.action;\r\n\r\n const [isEditing, setIsEditing] = useState(false);\r\n const [isSaving, setIsSaving] = useState(false);\r\n const titleRef = useRef<HTMLElement | null>(null);\r\n const [isTitleTruncated, setIsTitleTruncated] = useState(false);\r\n\r\n const userDateFormat = (userTrii?.regCon_dateFormat || 'YYYY/MM/DD').toUpperCase();\r\n const userTimeFormat = userTrii?.regCon_timeFormat || '24';\r\n\r\n // Determina si el tipo de campo es numérico\r\n const isNumericType = (type: ContactField_type) =>\r\n type === ContactField_type.NUMBER_INTEGER ||\r\n type === ContactField_type.NUMBER_DECIMAL ||\r\n type === ContactField_type.NUMBER_CURRENCY ||\r\n type === ContactField_type.NUMBER_ACCOUNTING ||\r\n type === ContactField_type.CURRENCY;\r\n\r\n const shouldBeNumeric = (nameKey: string, type: ContactField_type) => {\r\n const lower = nameKey.toLowerCase();\r\n if (lower === 'dni') return true; // fuerza DNI como numérico\r\n return isNumericType(type);\r\n };\r\n\r\n // Normaliza el valor según el tipo del campo\r\n const normalizeValue = (nameKey: string, type: ContactField_type, value: any) => {\r\n if (value === '' || value === null || value === undefined) return null;\r\n\r\n if (shouldBeNumeric(nameKey, type)) {\r\n const num = Number(value);\r\n return Number.isNaN(num) ? value : num;\r\n }\r\n\r\n return value;\r\n };\r\n const toggleEdit = () => setIsEditing((prev) => !prev);\r\n\r\n const handleCancel = () => {\r\n setIsEditing(false);\r\n entity.action.resetCustomProperty(property.nameKey);\r\n };\r\n\r\n const handleSave = async () => {\r\n if (!baseUrl || !spaceId) return;\r\n if (!entityId) return;\r\n\r\n setIsSaving(true);\r\n\r\n const current = customProperties.find((p) => p.nameKey === property.nameKey) || property;\r\n\r\n const { nameKey, value } = current;\r\n\r\n // Definición del campo (si existe)\r\n const fieldDef = customContactFields.find((f) => f.nameKey === nameKey);\r\n\r\n // Tipo efectivo: primero el de la definición, si no existe usamos el del property\r\n const effectiveType: ContactField_type = fieldDef?.type ?? current.type;\r\n\r\n // Preparar el valor según el tipo de campo\r\n let finalValue: any;\r\n\r\n // Manejar campos de tipo TIME\r\n if (effectiveType === ContactField_type.TIME) {\r\n const dayjsValue = dayjs(value);\r\n if (dayjsValue.isValid()) {\r\n // Enviar solo el string de hora formateado\r\n finalValue = dayjsValue.format(userTimeFormat === '24' ? 'HH:mm' : 'hh:mm');\r\n } else {\r\n finalValue = value;\r\n }\r\n }\r\n // Manejar campos de tipo DATE\r\n else if (effectiveType === ContactField_type.DATE) {\r\n const dayjsValue = dayjs(value);\r\n if (dayjsValue.isValid()) {\r\n // Enviar el ISO string para fechas\r\n finalValue = dayjsValue.toISOString();\r\n } else {\r\n finalValue = value;\r\n }\r\n }\r\n // Para otros tipos, usar normalizeValue\r\n else {\r\n finalValue = normalizeValue(nameKey, effectiveType, value);\r\n }\r\n\r\n const updatedContactData = {\r\n properties: [\r\n {\r\n nameKey,\r\n type: effectiveType,\r\n value: finalValue,\r\n },\r\n ],\r\n };\r\n\r\n try {\r\n const updated = await updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType,\r\n entityId,\r\n body: updatedContactData as any,\r\n });\r\n const nextProperties = customProperties.map((p: Property) =>\r\n p.nameKey === nameKey\r\n ? {\r\n ...p,\r\n type: effectiveType,\r\n value: finalValue,\r\n }\r\n : p,\r\n );\r\n setCustomProperties(nextProperties);\r\n onEntityUpdated?.(updated);\r\n } finally {\r\n setIsSaving(false);\r\n setIsEditing(false);\r\n }\r\n };\r\n\r\n const getPropertyName = (propertyNameKey: string) => {\r\n const foundField = customContactFields.find((field) => field.nameKey === propertyNameKey);\r\n\r\n return foundField?.name || propertyNameKey;\r\n };\r\n\r\n useEffect(() => {\r\n const el = titleRef.current;\r\n if (!el) return;\r\n\r\n const check = () => {\r\n const next = el.scrollWidth > el.clientWidth;\r\n setIsTitleTruncated((prev) => (prev === next ? prev : next));\r\n };\r\n\r\n check();\r\n\r\n if (typeof ResizeObserver !== 'undefined') {\r\n let rafId = 0;\r\n const ro = new ResizeObserver(() => {\r\n if (typeof window === 'undefined') {\r\n check();\r\n return;\r\n }\r\n if (rafId) window.cancelAnimationFrame(rafId);\r\n rafId = window.requestAnimationFrame(() => {\r\n check();\r\n });\r\n });\r\n ro.observe(el);\r\n return () => {\r\n if (typeof window !== 'undefined' && rafId) window.cancelAnimationFrame(rafId);\r\n ro.disconnect();\r\n };\r\n }\r\n\r\n if (typeof window === 'undefined') return;\r\n window.addEventListener('resize', check);\r\n return () => {\r\n window.removeEventListener('resize', check);\r\n };\r\n }, [customContactFields, property.nameKey]);\r\n\r\n const handleInputChange = (name: string, value: any) => {\r\n const updatedValue =\r\n property.type === ContactField_type.DATERANGE\r\n ? Array.isArray(value) && value[0] && value[1]\r\n ? `${dayjs(value[0]).toISOString()} - ${dayjs(value[1]).toISOString()}`\r\n : ''\r\n : property.type === ContactField_type.DATE\r\n ? dayjs(value).isValid()\r\n ? dayjs(value).toISOString()\r\n : 'Invalid Date'\r\n : property.type === ContactField_type.TIME\r\n ? dayjs(value).isValid()\r\n ? dayjs(value).toISOString()\r\n : 'Invalid Time'\r\n : value;\r\n\r\n const updatedProperties = customProperties.map((property) =>\r\n property.nameKey === name ? { ...property, value: updatedValue } : property,\r\n );\r\n\r\n setCustomProperties(updatedProperties);\r\n };\r\n\r\n const { type, nameKey, value } = property;\r\n\r\n // Verifica si el valor existe y no está vacío\r\n const hasValue = (val: any) => {\r\n if (val === null || val === undefined) return false;\r\n\r\n // Si es string, verifica que no esté vacío\r\n if (typeof val === 'string') {\r\n return val.trim().length > 0;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const EditField = () => {\r\n if (type === ContactField_type.DATE)\r\n return (\r\n <CustomPropertyDatePicker\r\n value={value ? dayjs(value) : null}\r\n handleChange={(newValue) => handleInputChange(nameKey, newValue?.toDate())}\r\n dateFormat={userDateFormat}\r\n />\r\n );\r\n else if (type === ContactField_type.TIME)\r\n return (\r\n <CustomPropertyTimePicker\r\n value={\r\n // Usar valueDate si está disponible, sino intentar parsear value\r\n (property as any)?.valueDate\r\n ? dayjs((property as any).valueDate)\r\n : value\r\n ? dayjs(value)\r\n : null\r\n }\r\n handleChange={(newValue) => handleInputChange(nameKey, newValue)}\r\n userTimeFormat={userTimeFormat}\r\n />\r\n );\r\n else if (type === ContactField_type.DATERANGE)\r\n return (\r\n <CustomPropertyDateRangePicker\r\n value={\r\n value && typeof value === 'string' && value.includes(' - ')\r\n ? ([dayjs(value.split(' - ')[0]), dayjs(value.split(' - ')[1])] as [Dayjs, Dayjs])\r\n : null\r\n }\r\n handleChange={(newValue) =>\r\n handleInputChange(nameKey, [newValue[0]?.toDate?.(), newValue[1]?.toDate?.()])\r\n }\r\n userDateFormat={userDateFormat}\r\n />\r\n );\r\n else if (type === ContactField_type.TIMERANGE)\r\n return (\r\n <CustomPropertyTimeRangePicker\r\n value={\r\n Array.isArray(value) && value.length === 2\r\n ? ([dayjs(value[0]), dayjs(value[1])] as [Dayjs, Dayjs])\r\n : null\r\n }\r\n handleChange={(newValue) =>\r\n handleInputChange(nameKey, [newValue[0]?.toDate?.(), newValue[1]?.toDate?.()])\r\n }\r\n userTimeFormat={userTimeFormat}\r\n />\r\n );\r\n else if (type === ContactField_type.OPTIONS)\r\n return (\r\n <CustomPropertyOptionSelect\r\n value={typeof value === 'string' ? value : ''}\r\n handleChange={(newValue) => handleInputChange(nameKey, newValue)}\r\n options={\r\n customContactFields.find((field) => field.nameKey === nameKey)?.typeOptions ?? []\r\n }\r\n />\r\n );\r\n else\r\n return (\r\n <CustomPropertyInput\r\n type={type}\r\n nameKey={nameKey}\r\n value={value}\r\n onChange={handleInputChange}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <ContactBox\r\n className={`fadein ${\r\n property.type === ContactField_type.LONGTEXT ? 'contacts-col-12' : 'contacts-col-5'\r\n }`}\r\n >\r\n <Box display=\"flex\" position=\"relative\" minHeight=\"25px\" alignItems=\"center\">\r\n {isTitleTruncated ? (\r\n <Tooltip title={getPropertyName(property.nameKey)} arrow>\r\n <FieldName ref={titleRef} flexGrow={1} noWrap>\r\n {getPropertyName(property.nameKey)}\r\n </FieldName>\r\n </Tooltip>\r\n ) : (\r\n <FieldName ref={titleRef} flexGrow={1} noWrap>\r\n {getPropertyName(property.nameKey)}\r\n </FieldName>\r\n )}\r\n {isEditing ? (\r\n <>\r\n <StyledSaveCancelButton size=\"small\" onClick={handleSave}>\r\n {isSaving ? <CircularProgress size={24} /> : <SaveIcon />}\r\n </StyledSaveCancelButton>\r\n <StyledSaveCancelButton size=\"small\" onClick={handleCancel}>\r\n <CancelIcon />\r\n </StyledSaveCancelButton>\r\n </>\r\n ) : (\r\n <StyledIconButton className=\"edit-icon\" size=\"small\" onClick={toggleEdit}>\r\n <EditIcon />\r\n </StyledIconButton>\r\n )}\r\n </Box>\r\n\r\n <Box\r\n width={isEditing || property.type === ContactField_type.LONGTEXT ? '100%' : '50%'}\r\n position=\"relative\"\r\n >\r\n {isEditing ? (\r\n EditField()\r\n ) : (\r\n <FieldValue>\r\n {hasValue(property?.value)\r\n ? property.type === ContactField_type.DATERANGE\r\n ? (() => {\r\n if (typeof property.value === 'string') {\r\n const parts = property.value.split(' - ');\r\n if (parts.length === 2) {\r\n const [start, end] = parts;\r\n const startParsed = dayjs(start);\r\n const endParsed = dayjs(end);\r\n return `${startParsed.isValid() ? startParsed.format(userDateFormat) : '-'} - ${\r\n endParsed.isValid() ? endParsed.format(userDateFormat) : '-'\r\n }`;\r\n }\r\n } else if (Array.isArray(property.value) && property.value.length === 2) {\r\n return `${dayjs(property.value[0]).format(\r\n userDateFormat,\r\n )} - ${dayjs(property.value[1]).format(userDateFormat)}`;\r\n }\r\n return `${property.value}`;\r\n })()\r\n : property.type === ContactField_type.TIMERANGE\r\n ? (() => {\r\n if (Array.isArray(property.value) && property.value.length === 2) {\r\n return `${dayjs(property.value[0]).format(\r\n userTimeFormat === '24' ? 'HH:mm' : 'hh:mm',\r\n )} - ${dayjs(property.value[1]).format(\r\n userTimeFormat === '24' ? 'HH:mm' : 'hh:mm',\r\n )}`;\r\n }\r\n return `${property.value}`;\r\n })()\r\n : property.type === ContactField_type.TIME\r\n ? (() => {\r\n try {\r\n // Usar valueDate si está disponible, sino usar value\r\n const timeValue = (property as any).valueDate || property.value;\r\n return `${dayjs(timeValue).format(userTimeFormat === '24' ? 'HH:mm' : 'hh:mm A')}`;\r\n } catch (error) {\r\n return `${property.value}`;\r\n }\r\n })()\r\n : property.type === ContactField_type.DATE\r\n ? (() => {\r\n try {\r\n return `${dayjs(property.value).format(userDateFormat)}`;\r\n } catch (error) {\r\n return `${property.value}`;\r\n }\r\n })()\r\n : `${property?.value}`\r\n : null}\r\n </FieldValue>\r\n )}\r\n </Box>\r\n </ContactBox>\r\n );\r\n};\r\n\r\nexport default EntityCustomFieldLabel;\r\n","// Types\r\nimport { IContact } from '@trii/types/dist/Contacts';\r\nimport { GeneralProps } from '../General';\r\nimport { UserInfo } from '@trii/types/dist/Users';\r\n// Hooks\r\nimport { useEffect, useState } from 'react';\r\nimport { useEditEntity } from '../../../../context/EditEntityContext';\r\nimport { useEditContactApi } from '../../../../context/EditContactApiContext';\r\n// Api\r\n// Utils\r\nimport { resolveUserLabel } from '../../utils/resolveUserLabel';\r\n// Layout\r\nimport { Section, SectionContent } from '../../../../layout';\r\n// UI\r\nimport { ContactInfoLabel, EntityCustomFieldLabel } from '../../../../shared';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\nexport type ContactGeneralProps = Omit<GeneralProps, 'entityData' | 'entityType'> & {\r\n entityType: 'contact';\r\n entityData: IContact;\r\n};\r\n\r\nconst ContactGeneral = (props: ContactGeneralProps) => {\r\n const {\r\n dateFormat,\r\n entityData,\r\n customContactFields,\r\n baseUrl,\r\n spaceId,\r\n currentUser,\r\n onEntityUpdated,\r\n } = props;\r\n\r\n const t = useTranslationContext();\r\n const { entityType, editEntity } = useEditEntity();\r\n const api = useEditContactApi();\r\n\r\n if (entityType !== 'contact') {\r\n return null;\r\n }\r\n\r\n const [users, setUsers] = useState<UserInfo[]>([]);\r\n const [owner, setOwner] = useState<string | null>(null);\r\n const [updatedBy, setUpdatedBy] = useState<string | null>(null);\r\n const [createdBy, setCreatedBy] = useState<string | null>(null);\r\n\r\n const editContact = editEntity;\r\n\r\n useEffect(() => {\r\n if (!api) return;\r\n const controller = new AbortController();\r\n\r\n api\r\n .fetchUsers({ signal: controller.signal })\r\n .then((data) => {\r\n if (controller.signal.aborted) return;\r\n setUsers(data ?? []);\r\n })\r\n .catch(() => {\r\n if (controller.signal.aborted) return;\r\n setUsers([]);\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api]);\r\n\r\n useEffect(() => {\r\n const controller = new AbortController();\r\n\r\n const getRemoteLabel = async (userId?: string) => {\r\n if (!userId) return null;\r\n if (!api) return null;\r\n try {\r\n const userTrii = await api.fetchUserTriiById({ userId, signal: controller.signal });\r\n return userTrii?.display_name || userTrii?.email || null;\r\n } catch {\r\n return null;\r\n }\r\n };\r\n\r\n const resolve = async () => {\r\n const ownerLabel =\r\n resolveUserLabel({ userId: entityData.owner, users, currentUser }) ??\r\n (entityData.owner ? await getRemoteLabel(entityData.owner) : null);\r\n\r\n const createdByLabel =\r\n resolveUserLabel({ userId: entityData.createdBy ?? undefined, users, currentUser }) ??\r\n (entityData.createdBy ? await getRemoteLabel(entityData.createdBy) : null);\r\n\r\n const updatedByLabel =\r\n resolveUserLabel({ userId: entityData.updatedBy ?? undefined, users, currentUser }) ??\r\n (entityData.updatedBy ? await getRemoteLabel(entityData.updatedBy) : null);\r\n\r\n if (controller.signal.aborted) return;\r\n\r\n setOwner(ownerLabel);\r\n setCreatedBy(createdByLabel);\r\n setUpdatedBy(updatedByLabel);\r\n };\r\n\r\n resolve();\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, entityData, users, currentUser]);\r\n\r\n const userDateFormat = (dateFormat || 'YYYY/MM/DD').toUpperCase();\r\n const birthDate = editContact.field.birthDate;\r\n const dateOnlyString = birthDate?.isValid() ? birthDate.format(userDateFormat) : null;\r\n\r\n const calculateAge = (birthDate: Date) => {\r\n const today = new Date();\r\n let age = today.getFullYear() - birthDate.getFullYear();\r\n const m = today.getMonth() - birthDate.getMonth();\r\n\r\n if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n\r\n return age;\r\n };\r\n\r\n return (\r\n <Section title=\"General\">\r\n <SectionContent>\r\n {/* CONTACT LABELS */}\r\n <ContactInfoLabel\r\n title={t('conversations.contactDetails.contactOwner')}\r\n displayValue={owner || '-'}\r\n value={entityData.owner}\r\n inputType=\"select\"\r\n options={users}\r\n constructUpdateObject={(value) => ({\r\n owner: typeof value === 'string' ? value : '',\r\n })}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n <ContactInfoLabel\r\n title={t('conversations.contactDetails.business')}\r\n displayValue={entityData.businessName || '-'}\r\n value={entityData.businessId}\r\n inputType=\"selectBusiness\"\r\n businessId={entityData.businessId}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n <ContactInfoLabel\r\n title={t('conversations.contactDetails.createdBy')}\r\n value={createdBy || '-'}\r\n isNotEditable={true}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n />\r\n <ContactInfoLabel\r\n title={t('conversations.contactDetails.modifiedBy')}\r\n value={updatedBy || '-'}\r\n isNotEditable={true}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n />\r\n <ContactInfoLabel\r\n title={t('global.birthdate')}\r\n inputType=\"birthday\"\r\n displayValue={birthDate ? `${dateOnlyString} (${calculateAge(birthDate.toDate())})` : '-'}\r\n value={birthDate ? birthDate.toISOString() : ''}\r\n constructUpdateObject={(value) => ({\r\n birthDate: value,\r\n })}\r\n contact={editContact}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={entityData.id}\r\n dateFormat={dateFormat}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n\r\n {editContact.field.customProperties.map((property) => (\r\n <EntityCustomFieldLabel\r\n key={property.nameKey}\r\n property={property}\r\n entity={editContact}\r\n entityType=\"contact\"\r\n entityId={String(entityData.id)}\r\n customContactFields={customContactFields}\r\n userTrii={currentUser}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n ))}\r\n {/*END OF CONTACT LABELS */}\r\n </SectionContent>\r\n </Section>\r\n );\r\n};\r\n\r\nexport default ContactGeneral;\r\n","import EntityInfoLabel from '../EntityInfoLabel';\r\n// Types\r\nimport type { UserInfo } from '@trii/types/dist/Users';\r\n\r\ntype Props = {\r\n title: string;\r\n value?: string | Date;\r\n isNotEditable?: boolean;\r\n inputType?: 'text' | 'select' | 'selectMembers';\r\n options?: UserInfo[];\r\n displayValue?: string;\r\n constructUpdateObject?: (value: string | Date) => object;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n businessId?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n};\r\n\r\nconst BusinessInfoLabel = ({\r\n title,\r\n value,\r\n isNotEditable,\r\n inputType = 'text',\r\n options = [],\r\n displayValue,\r\n constructUpdateObject,\r\n baseUrl,\r\n spaceId,\r\n businessId,\r\n onEntityUpdated,\r\n}: Props) => {\r\n return (\r\n <EntityInfoLabel\r\n entityType=\"business\"\r\n entityId={businessId}\r\n title={title}\r\n value={value}\r\n isNotEditable={isNotEditable}\r\n inputType={inputType}\r\n options={options}\r\n displayValue={displayValue}\r\n constructUpdateObject={constructUpdateObject}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n );\r\n};\r\n\r\nexport default BusinessInfoLabel;\r\n","// Hooks\r\nimport { useEffect, useState } from 'react';\r\nimport { useEditEntity } from '../../../../context/EditEntityContext';\r\nimport { useEditContactApi } from '../../../../context/EditContactApiContext';\r\n// Api\r\n// Utils\r\nimport { resolveUserLabel } from '../../utils/resolveUserLabel';\r\n// Types\r\nimport { IBusiness } from '@trii/types/dist/Contacts';\r\nimport { GeneralProps } from '../General';\r\nimport { UserInfo } from '@trii/types/dist/Users';\r\n// UI\r\nimport { Section, SectionContent } from '../../../../layout';\r\nimport BusinessInfoLabel from '../../../../shared/BusinessInfoLabel';\r\nimport { EntityCustomFieldLabel } from '../../../../shared';\r\nimport { useTranslationContext } from '../../../../context/TranslationContext';\r\n\r\nexport type BusinessGeneralProps = Omit<GeneralProps, 'entityData' | 'entityType'> & {\r\n entityType: 'business';\r\n entityData: IBusiness;\r\n};\r\n\r\nconst BusinessGeneral = (props: BusinessGeneralProps) => {\r\n const t = useTranslationContext();\r\n\r\n const { entityData, customContactFields, baseUrl, spaceId, currentUser, onEntityUpdated } = props;\r\n\r\n const { entityType, editEntity } = useEditEntity();\r\n const api = useEditContactApi();\r\n\r\n if (entityType !== 'business') {\r\n return null;\r\n }\r\n\r\n const [users, setUsers] = useState<UserInfo[]>([]);\r\n const [owner, setOwner] = useState<string | null>(null);\r\n const [updatedBy, setUpdatedBy] = useState<string | null>(null);\r\n const [createdBy, setCreatedBy] = useState<string | null>(null);\r\n\r\n const editBusiness = editEntity;\r\n\r\n useEffect(() => {\r\n if (!api) return;\r\n const controller = new AbortController();\r\n\r\n api\r\n .fetchUsers({ signal: controller.signal })\r\n .then((data) => {\r\n if (controller.signal.aborted) return;\r\n setUsers(data ?? []);\r\n })\r\n .catch(() => {\r\n if (controller.signal.aborted) return;\r\n setUsers([]);\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api]);\r\n\r\n useEffect(() => {\r\n const controller = new AbortController();\r\n\r\n const getRemoteLabel = async (userId?: string) => {\r\n if (!userId) return null;\r\n if (!api) return null;\r\n try {\r\n const userTrii = await api.fetchUserTriiById({ userId, signal: controller.signal });\r\n return userTrii?.display_name || userTrii?.email || null;\r\n } catch {\r\n return null;\r\n }\r\n };\r\n\r\n const resolve = async () => {\r\n const ownerLabel =\r\n resolveUserLabel({ userId: entityData.owner, users, currentUser }) ??\r\n (entityData.owner ? await getRemoteLabel(entityData.owner) : null);\r\n\r\n const createdByLabel =\r\n resolveUserLabel({ userId: entityData.createdBy ?? undefined, users, currentUser }) ??\r\n (entityData.createdBy ? await getRemoteLabel(entityData.createdBy) : null);\r\n\r\n const updatedByLabel =\r\n resolveUserLabel({ userId: entityData.updatedBy ?? undefined, users, currentUser }) ??\r\n (entityData.updatedBy ? await getRemoteLabel(entityData.updatedBy) : null);\r\n\r\n if (controller.signal.aborted) return;\r\n\r\n setOwner(ownerLabel);\r\n setCreatedBy(createdByLabel);\r\n setUpdatedBy(updatedByLabel);\r\n };\r\n\r\n resolve();\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [api, entityData, users, currentUser]);\r\n\r\n return (\r\n <Section title=\"General\">\r\n <SectionContent>\r\n {/* BUSINESS LABELS */}\r\n <BusinessInfoLabel\r\n title={t('conversations.businessDetails.businessOwner')}\r\n value={entityData.owner}\r\n displayValue={owner || '-'}\r\n inputType=\"select\"\r\n options={users}\r\n constructUpdateObject={(value) => ({\r\n owner: typeof value === 'string' ? value : '',\r\n })}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n businessId={entityData.id}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n\r\n <BusinessInfoLabel\r\n title={t('conversations.contactDetails.createdBy')}\r\n value={createdBy || '-'}\r\n isNotEditable={true}\r\n />\r\n <BusinessInfoLabel\r\n title={t('conversations.contactDetails.modifiedBy')}\r\n value={updatedBy || '-'}\r\n isNotEditable={true}\r\n />\r\n\r\n {editBusiness.field.customProperties.map((property) => (\r\n <EntityCustomFieldLabel\r\n key={property.nameKey}\r\n property={property}\r\n entity={editBusiness}\r\n entityType=\"business\"\r\n entityId={String(entityData.id)}\r\n customContactFields={customContactFields}\r\n userTrii={currentUser}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={onEntityUpdated}\r\n />\r\n ))}\r\n {/*END OF BUSINESS LABELS */}\r\n </SectionContent>\r\n </Section>\r\n );\r\n};\r\n\r\nexport default BusinessGeneral;\r\n","import { useMemo } from 'react';\r\n// Types\r\nimport type { IBusiness, IContact, IContactField } from '@trii/types/dist/Contacts/contacts';\r\nimport type { UserTrii } from '@trii/types/dist/Users';\r\nimport ContactGeneral, { ContactGeneralProps } from './components/ContactGeneral';\r\nimport BusinessGeneral, { BusinessGeneralProps } from './components/BusinessGeneral';\r\n\r\nexport interface GeneralProps {\r\n dateFormat: string;\r\n entityType: 'contact' | 'business';\r\n entityData: IContact | IBusiness;\r\n customContactFields: IContactField[];\r\n baseUrl?: string;\r\n spaceId?: string;\r\n currentUser?: UserTrii | null;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n}\r\n\r\nconst General = (props: GeneralProps) => {\r\n const { entityType, entityData } = props;\r\n\r\n const normalizedEntityType = useMemo(() => {\r\n if (entityType === 'contact' || entityType === 'business') return entityType;\r\n return 'contact';\r\n }, [entityType]);\r\n\r\n return normalizedEntityType === 'contact' ? (\r\n <ContactGeneral\r\n {...(props as ContactGeneralProps)}\r\n entityData={entityData as IContact}\r\n entityType=\"contact\"\r\n />\r\n ) : (\r\n <BusinessGeneral\r\n {...(props as BusinessGeneralProps)}\r\n entityData={entityData as IBusiness}\r\n entityType=\"business\"\r\n />\r\n );\r\n};\r\n\r\nexport default General;\r\n","// useModal.ts\r\nimport { useState } from 'react';\r\n\r\ninterface UseEditModalReturn {\r\n isOpen: boolean;\r\n title: string;\r\n openModal: (title: string) => void;\r\n closeModal: () => void;\r\n}\r\n\r\nconst useEditModal = (): UseEditModalReturn => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [title, setTitle] = useState<string>('');\r\n\r\n const openModal = (title: string) => {\r\n setTitle(title);\r\n setIsOpen(true);\r\n };\r\n\r\n const closeModal = () => {\r\n setIsOpen(false);\r\n setTitle(''); // Clear the title when the modal closes\r\n };\r\n\r\n return { isOpen, title, openModal, closeModal };\r\n};\r\n\r\nexport default useEditModal;\r\n","import { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\nimport { styled } from '@mui/system';\r\nimport { Box, Avatar, IconButton, Tooltip } from '@mui/material';\r\nimport {Star, StarBorder } from '@mui/icons-material';\r\nimport useImage from '../../../../../../../hooks/useImage';\r\n\r\ntype Props = {\r\n item: IContactAddress;\r\n owner?: IBusiness | IContact;\r\n};\r\n\r\nconst StyledBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(1),\r\n backgroundColor: theme.palette.background.dropdownMenu,\r\n borderRadius: theme.shape.borderRadius,\r\n color: theme.palette.text.primary,\r\n width: '50%',\r\n paddingBottom: '3px',\r\n minHeight: '50px',\r\n position: 'relative',\r\n}));\r\n\r\nconst LeftSection = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(1),\r\n overflow: 'hidden',\r\n maxWidth: '80%',\r\n}));\r\n\r\nconst RightSection = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n}));\r\n\r\nconst ContactDetails = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(0.5),\r\n overflow: 'hidden',\r\n flexFlow: 'nowrap',\r\n flexWrap: 'wrap',\r\n marginTop: '-5px',\r\n}));\r\n\r\nconst AvatarWrapper = styled(Avatar)(({}) => ({\r\n width: 32,\r\n height: 32,\r\n cursor: 'pointer',\r\n}));\r\n\r\nconst EllipsisText = styled(Box)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n}));\r\n\r\nconst NoteText = styled(EllipsisText)(({ theme }) => ({\r\n fontSize: 12,\r\n color: theme.palette.text.secondary,\r\n position: 'absolute',\r\n bottom: 0,\r\n maxWidth: '70%',\r\n}));\r\n\r\nconst PhoneText = styled(EllipsisText)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n}));\r\n\r\nconst ProfileNameText = styled(EllipsisText)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n}));\r\n\r\nconst ContactMethodItem = ({ item }: Props) => {\r\n const avatarUrlWithoutAccess = item.profileUrl;\r\n\r\n const {imageUrl} = useImage({\r\n initialImageUrl: avatarUrlWithoutAccess,\r\n });\r\n\r\n return (\r\n <>\r\n <StyledBox>\r\n <LeftSection>\r\n <ContactDetails>\r\n <Tooltip title={item.address || ''} arrow>\r\n <PhoneText>{item.address}</PhoneText>\r\n </Tooltip>\r\n <Tooltip title={item.profileName || ''} arrow>\r\n <ProfileNameText\r\n sx={{\r\n marginTop: '-10px',\r\n marginLeft: '5px',\r\n fontSize: '10px',\r\n }}\r\n >\r\n {item.profileName}\r\n </ProfileNameText>\r\n </Tooltip>\r\n <Tooltip title={item.note || ''} arrow>\r\n <NoteText>{item.note}</NoteText>\r\n </Tooltip>\r\n </ContactDetails>\r\n </LeftSection>\r\n <RightSection>\r\n {avatarUrlWithoutAccess !== '' && (\r\n <AvatarWrapper\r\n src={imageUrl}\r\n alt={item.profileName}\r\n style={{ cursor: 'pointer' }}\r\n >\r\n {item?.profileName?.charAt(0).toUpperCase()}\r\n </AvatarWrapper>\r\n )}\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n }}\r\n >\r\n <IconButton\r\n size=\"small\"\r\n sx={{ marginTop: '-5px', padding: 0 }}\r\n >\r\n {item.isFavorite ? (\r\n <Star\r\n sx={{\r\n color: '#fcac34',\r\n }}\r\n />\r\n ) : (\r\n <StarBorder\r\n sx={{\r\n color: '#fcac34',\r\n }}\r\n />\r\n )}\r\n </IconButton>\r\n </Box>\r\n </RightSection>\r\n </StyledBox>\r\n </>\r\n );\r\n};\r\n\r\nexport default ContactMethodItem;\r\n","import { PhoneNumberUtil, PhoneNumberFormat, PhoneNumber } from 'google-libphonenumber';\r\nconst phoneUtil = PhoneNumberUtil.getInstance();\r\n\r\n/**\r\n * Returns a user-friendly display format for a sanitized phone number.\r\n * Always uses INTERNATIONAL format, e.g. \"+54 358 402 2664\"\r\n */\r\nexport const formatPhoneForDisplay = (number: string): string => {\r\n if (!number || !number.trim()) return number;\r\n\r\n try {\r\n const parsed: PhoneNumber = phoneUtil.parse(number, undefined);\r\n\r\n if (!phoneUtil.isValidNumber(parsed)) {\r\n // If not valid, just return as-is\r\n return number;\r\n }\r\n\r\n // Always use INTERNATIONAL format\r\n return phoneUtil.format(parsed, PhoneNumberFormat.INTERNATIONAL);\r\n } catch (e) {\r\n return number;\r\n }\r\n};\r\n","import { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { styled } from '@mui/system';\r\nimport { Box, IconButton, Tooltip } from '@mui/material';\r\nimport LocalPhoneIcon from '@mui/icons-material/LocalPhone';\r\nimport { useMemo } from 'react';\r\nimport { Star, StarBorder } from '@mui/icons-material';\r\nimport { formatPhoneForDisplay } from './utils/phone';\r\n\r\ntype Props = {\r\n item: IContactAddress;\r\n};\r\n\r\nconst StyledIconButton = styled(IconButton)(({ theme }) => ({\r\n padding: theme.spacing(0.5),\r\n marginTop: '-5px',\r\n}));\r\n\r\nconst StyledLocalPhoneIcon = styled(LocalPhoneIcon)(({ theme }) => ({\r\n height: 16,\r\n width: 16,\r\n color: theme.palette.secondary.main\r\n}));\r\n\r\nconst StyledBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(1),\r\n backgroundColor: theme.palette.background.dropdownMenu,\r\n borderRadius: theme.shape.borderRadius,\r\n color: theme.palette.text.primary,\r\n width: '50%',\r\n paddingBottom: '3px',\r\n minHeight: '50px',\r\n position: 'relative',\r\n}));\r\n\r\nconst LeftSection = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(1),\r\n maxWidth: '80%',\r\n}));\r\nconst RightSection = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1),\r\n}));\r\nconst ContactDetails = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start',\r\n gap: theme.spacing(0.5),\r\n overflow: 'hidden',\r\n flexFlow: 'nowrap',\r\n flexWrap: 'wrap',\r\n marginTop: '-5px',\r\n}));\r\n\r\nconst EllipsisText = styled(Box)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n whiteSpace: 'nowrap',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n}));\r\nconst NoteText = styled(EllipsisText)(({ theme }) => ({\r\n fontSize: 12,\r\n color: theme.palette.text.secondary,\r\n position: 'absolute',\r\n bottom: 0,\r\n maxWidth: '70%',\r\n}));\r\nconst PhoneText = styled(EllipsisText)(({}) => ({\r\n fontSize: 14,\r\n fontWeight: 500,\r\n}));\r\n\r\nconst ContactMethodPhoneItem = ({ item }: Props) => {\r\n const handleCallContact = () => {\r\n const contactPhone = item.address;\r\n if (!contactPhone) return;\r\n\r\n const event = new CustomEvent('call-contact-header', {\r\n detail: { phoneAddress: contactPhone },\r\n });\r\n window.dispatchEvent(event);\r\n };\r\n\r\n const formattedPhone = useMemo(\r\n () => formatPhoneForDisplay(item.address || ''),\r\n [item.address]\r\n );\r\n\r\n return (\r\n <>\r\n <StyledBox>\r\n <LeftSection>\r\n <StyledIconButton\r\n onClick={handleCallContact}\r\n color=\"primary\"\r\n size=\"small\"\r\n >\r\n <StyledLocalPhoneIcon />\r\n </StyledIconButton>\r\n <ContactDetails>\r\n <Tooltip title={formattedPhone || ''} arrow>\r\n <PhoneText>{formattedPhone}</PhoneText>\r\n </Tooltip>\r\n <Tooltip title={item.note || ''} arrow>\r\n <NoteText>{item.note}</NoteText>\r\n </Tooltip>\r\n </ContactDetails>\r\n </LeftSection>\r\n <RightSection>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n }}\r\n >\r\n <IconButton\r\n size=\"small\"\r\n sx={{ marginTop: '-5px', padding: 0 }}\r\n >\r\n {item.isFavorite ? (\r\n <Star\r\n sx={{\r\n color: '#fcac34',\r\n }}\r\n />\r\n ) : (\r\n <StarBorder\r\n sx={{\r\n color: '#fcac34',\r\n }}\r\n />\r\n )}\r\n </IconButton>\r\n </Box>\r\n </RightSection>\r\n </StyledBox>\r\n </>\r\n );\r\n};\r\n\r\nexport default ContactMethodPhoneItem;\r\n","import { Box, IconButton, styled, Typography } from '@mui/material';\r\nimport { ContactMethodItem, ContactMethodPhoneItem } from './components';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\n\r\ninterface Props {\r\n title: string;\r\n methodItems: IContactAddress[];\r\n isPhone?: boolean;\r\n handleEdit: () => void;\r\n owner?: IBusiness | IContact;\r\n}\r\n\r\nconst StyledBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: theme.spacing(1, 0, 2, 0),\r\n width: '100%',\r\n gap: theme.spacing(1),\r\n '&:hover .edit-icon': {\r\n opacity: 1,\r\n },\r\n}));\r\n\r\nconst StyledTypography = styled(Typography)(({}) => ({\r\n letterSpacing: -0.5,\r\n fontSize: 14,\r\n}));\r\n\r\nconst HeaderBox = styled(Box)(({}) => ({\r\n display: 'flex',\r\n alignItems: 'center',\r\n}));\r\n\r\nconst MethodItemsBox = styled(Box)(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: theme.spacing(1),\r\n width: '100%',\r\n}));\r\nconst StyledIconButton = styled(IconButton)({\r\n opacity: 0,\r\n transition: 'opacity 0.3s ease-in-out',\r\n '& .MuiSvgIcon-root': {\r\n width: '0.8em',\r\n height: '0.8em',\r\n },\r\n marginLeft: '15px',\r\n});\r\n\r\nconst ContactMethod = ({ title, methodItems, isPhone, handleEdit, owner }: Props) => {\r\n return (\r\n <StyledBox>\r\n <HeaderBox>\r\n <StyledTypography>{title}</StyledTypography>\r\n <StyledIconButton className=\"edit-icon\" size=\"small\" onClick={handleEdit}>\r\n <EditIcon fontSize=\"small\" sx={{ color: (theme) => theme.palette.secondary.main }} />\r\n </StyledIconButton>\r\n </HeaderBox>\r\n <MethodItemsBox>\r\n {methodItems.map((item, index) => {\r\n if (isPhone) {\r\n return <ContactMethodPhoneItem key={index} item={item} />;\r\n }\r\n return <ContactMethodItem key={index} item={item} owner={owner} />;\r\n })}\r\n </MethodItemsBox>\r\n </StyledBox>\r\n );\r\n};\r\n\r\nexport default ContactMethod;\r\n","// Components/ui\r\nimport { Typography, Box } from '@mui/material';\r\n\r\ntype Props = {\r\n title: string;\r\n};\r\n\r\nconst SubsectionHeader = ({ title }: Props) => {\r\n return (\r\n <Box>\r\n <Typography variant=\"subtitle2\">{title}</Typography>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SubsectionHeader;\r\n","const subsectionHeaderWithButtonStyle = {\r\n container: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center'\r\n },\r\n};\r\n\r\nexport default subsectionHeaderWithButtonStyle;\r\n","// Components/ui\r\nimport { Typography, Button, Box } from '@mui/material';\r\nimport subsectionHeaderWithButtonStyle from './style';\r\nimport AddIcon from '@mui/icons-material/Add';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n title: string;\r\n handleAdd: () => void;\r\n};\r\n\r\nconst SubsectionHeaderWithButton = ({ title, handleAdd }: Props) => {\r\n const t = useTranslationContext();\r\n console.log('[SubsectionHeaderWithButton] title:', title, 't fn:', t?.name || 'anonymous');\r\n return (\r\n <Box sx={subsectionHeaderWithButtonStyle.container}>\r\n <Typography variant=\"subtitle2\">{title}</Typography>\r\n <Button\r\n onClick={handleAdd}\r\n size=\"small\"\r\n startIcon={<AddIcon />}\r\n variant=\"text\"\r\n color=\"primary\"\r\n >\r\n {t('global.add')}\r\n </Button>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SubsectionHeaderWithButton;\r\n","const informationItemContainerStyle = {\r\n container: {\r\n border: '1px solid lightgray',\r\n borderRadius: 1,\r\n p: 2,\r\n width: '100%',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 1,\r\n },\r\n};\r\n\r\nexport default informationItemContainerStyle;\r\n","// Types\r\nimport { ReactNode } from 'react';\r\n// Components/ui\r\nimport informationItemContainerStyle from './style';\r\nimport { Box } from '@mui/material';\r\n\r\ninterface Props {\r\n children: ReactNode;\r\n}\r\n\r\nconst InformationItemContainer = ({ children }: Props) => {\r\n return <Box sx={informationItemContainerStyle.container}>{children}</Box>;\r\n};\r\n\r\nexport default InformationItemContainer;\r\n","const noteDeleteButtonStyle = {\r\n container: {\r\n display: 'flex',\r\n width: '50%',\r\n alignItems: 'center',\r\n justifyContent: 'end'\r\n },\r\n noteTextField: {\r\n width: '100%',\r\n marginRight: '15px'\r\n },\r\n};\r\n\r\nexport default noteDeleteButtonStyle;\r\n","import React, { useState } from 'react';\r\nimport {\r\n Box,\r\n IconButton,\r\n ListItemIcon,\r\n ListItemText,\r\n Menu,\r\n MenuItem,\r\n Modal,\r\n Typography,\r\n Button,\r\n CircularProgress,\r\n} from '@mui/material';\r\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\r\nimport DeleteIcon from '@mui/icons-material/Delete';\r\nimport WhatsAppIcon from '@mui/icons-material/WhatsApp';\r\nimport MmsIcon from '@mui/icons-material/Mms';\r\nimport type { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { useTranslationContext } from '../../../../../../../../../../../../../context/TranslationContext';\r\n\r\ntype OptionsMenuProps = {\r\n onDelete: () => void;\r\n addressData: {\r\n address: string;\r\n channelType: ChannelType;\r\n };\r\n handleLinkAccountSave: () => Promise<void>;\r\n checked: boolean;\r\n onCheckContactAddress?: (type: ChannelType) => Promise<ResultContactAddressCheck | null>;\r\n};\r\n\r\ntype ResultContactAddressCheck = {\r\n success: boolean;\r\n warnings: string[];\r\n};\r\n\r\nconst OptionsMenu = ({\r\n onDelete,\r\n addressData,\r\n handleLinkAccountSave,\r\n checked,\r\n onCheckContactAddress,\r\n}: OptionsMenuProps) => {\r\n const t = useTranslationContext();\r\n\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n const open = Boolean(anchorEl);\r\n const { channelType, address } = addressData;\r\n const [verifying, setVerifying] = useState(false);\r\n const [verificationResult, setVerificationResult] = useState<ResultContactAddressCheck | null>(\r\n null,\r\n );\r\n const [modalOpen, setModalOpen] = useState(false);\r\n\r\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleModalClose = () => {\r\n setModalOpen(false);\r\n };\r\n\r\n const handleDelete = () => {\r\n onDelete();\r\n handleClose();\r\n };\r\n\r\n const handleCheckWA = async () => {\r\n setVerifying(true);\r\n try {\r\n if (!onCheckContactAddress) {\r\n return;\r\n }\r\n\r\n const result = await onCheckContactAddress(13 as unknown as ChannelType);\r\n if (!result) {\r\n return;\r\n }\r\n\r\n setVerificationResult(result);\r\n setModalOpen(true);\r\n } catch (error) {\r\n console.error('Error verifying WhatsApp account:', error);\r\n } finally {\r\n setVerifying(false);\r\n }\r\n handleClose();\r\n };\r\n const handleCheckRCS = async () => {\r\n setVerifying(true);\r\n try {\r\n if (!onCheckContactAddress) {\r\n return;\r\n }\r\n\r\n const result = await onCheckContactAddress(21 as unknown as ChannelType);\r\n if (!result) {\r\n return;\r\n }\r\n\r\n setVerificationResult(result);\r\n setModalOpen(true);\r\n } catch (error) {\r\n console.error('Error verifying RCS account:', error);\r\n } finally {\r\n setVerifying(false);\r\n }\r\n handleClose();\r\n };\r\n\r\n const handleLinkAccount = async () => {\r\n await handleLinkAccountSave();\r\n setModalOpen(false);\r\n };\r\n\r\n return (\r\n <Box>\r\n <IconButton\r\n aria-controls={open ? 'basic-menu' : undefined}\r\n aria-haspopup=\"true\"\r\n aria-expanded={open ? 'true' : undefined}\r\n onClick={handleClick}\r\n >\r\n <MoreVertIcon />\r\n </IconButton>\r\n <Menu\r\n id=\"basic-menu\"\r\n anchorEl={anchorEl}\r\n open={open}\r\n onClose={handleClose}\r\n MenuListProps={{\r\n 'aria-labelledby': 'basic-button',\r\n }}\r\n >\r\n <MenuItem onClick={handleDelete}>\r\n <ListItemIcon>\r\n <DeleteIcon color=\"error\" />\r\n </ListItemIcon>\r\n <ListItemText>{t('global.delete')}</ListItemText>\r\n </MenuItem>\r\n {channelType === 5 && (\r\n <MenuItem onClick={handleCheckWA} disabled={!checked}>\r\n <ListItemIcon>\r\n {verifying ? (\r\n <CircularProgress size={24} />\r\n ) : (\r\n <WhatsAppIcon sx={{ color: 'green' }} />\r\n )}\r\n </ListItemIcon>\r\n <ListItemText>{t('optionsMenu.verifyWspAccount')}</ListItemText>\r\n </MenuItem>\r\n )}\r\n {channelType === 21 && (\r\n <MenuItem onClick={handleCheckRCS} disabled={!checked}>\r\n <ListItemIcon>{verifying ? <CircularProgress size={24} /> : <MmsIcon />}</ListItemIcon>\r\n <ListItemText>{t('optionsMenu.verifyRCSAccount')}</ListItemText>\r\n </MenuItem>\r\n )}\r\n </Menu>\r\n\r\n <Modal\r\n open={modalOpen}\r\n onClose={handleModalClose}\r\n aria-labelledby=\"modal-modal-title\"\r\n aria-describedby=\"modal-modal-description\"\r\n >\r\n <Box\r\n sx={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 400,\r\n boxShadow: 24,\r\n p: 4,\r\n backgroundColor: (theme) => theme.palette.background.default,\r\n }}\r\n >\r\n {verificationResult?.success ? (\r\n <>\r\n <Typography id=\"modal-modal-title\" variant=\"h6\" component=\"h2\">\r\n {t('optionsMenu.wspAccountFound')} {address}\r\n </Typography>\r\n <Typography id=\"modal-modal-description\" sx={{ mt: 2 }}>\r\n {t('optionsMenu.wantToLinkContact')}\r\n </Typography>\r\n <Box sx={{ marginTop: '10px' }}>\r\n <Button onClick={handleLinkAccount} color=\"primary\">\r\n {t('optionsMenu.yesLink')}\r\n </Button>\r\n <Button onClick={handleModalClose} color=\"secondary\">\r\n No\r\n </Button>\r\n </Box>\r\n </>\r\n ) : (\r\n <Box sx={{ position: 'relative' }}>\r\n <Typography id=\"modal-modal-title\" variant=\"h6\" component=\"h2\">\r\n {t('optionsMenu.noWspAccountFound')} {address}\r\n </Typography>\r\n <Button\r\n onClick={handleModalClose}\r\n color=\"secondary\"\r\n sx={{ position: 'absolute', bottom: -25, right: 0 }}\r\n >\r\n {t('global.cancel')}\r\n </Button>\r\n </Box>\r\n )}\r\n </Box>\r\n </Modal>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default OptionsMenu;\r\n","import React, { useState } from 'react';\r\n// UI\r\nimport { Box, IconButton, TextField, CircularProgress } from '@mui/material';\r\nimport SaveIcon from '@mui/icons-material/Save';\r\nimport noteDeleteButtonStyle from './style';\r\n// Types\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { useEditContactApi } from '../../../../../../../context/EditContactApiContext';\r\nimport { useEditEntity } from '../../../../../../../context/EditEntityContext';\r\nimport OptionsMenu from '../../components/Phones/components/Body/components/Phone/components/OptionsMenu';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n addressData: NewAddress | IContactAddress;\r\n handleNoteFieldChange: (\r\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n addressId: string,\r\n addressType: ChannelType,\r\n ) => void;\r\n handleDeleteAddress: (addressId: string, addressType: ChannelType) => void;\r\n checked?: boolean;\r\n entityId?: string;\r\n mode?: string;\r\n setWarnings?: (warnings: string[]) => void;\r\n isDeletingAddress?: string | false;\r\n replaceAddress?: (addressId: string, newAddress: IContactAddress) => void;\r\n addWhatsappVerified?: (newAddress: IContactAddress) => void;\r\n};\r\n\r\nconst NoteDeleteButton = (props: Props) => {\r\n const t = useTranslationContext();\r\n const api = useEditContactApi();\r\n const { editEntity, entityId: entityIdFromContext } = useEditEntity();\r\n\r\n const [isSaving, setIsSaving] = useState(false);\r\n\r\n const checked = props.checked ?? true;\r\n const entityId = props.entityId ?? entityIdFromContext;\r\n\r\n const { note, channelType, id, address } = props.addressData;\r\n const addressIsSaved = !props.addressData.hasOwnProperty('isSaved');\r\n\r\n const replaceAddress = props.replaceAddress ?? editEntity.action.replaceAddress;\r\n const addWhatsappVerified =\r\n props.addWhatsappVerified ||\r\n (typeof (editEntity.action as any)?.addWhatsappVerified === 'function'\r\n ? (editEntity.action as any).addWhatsappVerified\r\n : undefined);\r\n\r\n const handleSetAddress = async (type: ChannelType) => {\r\n if (!api) return null;\r\n if (!entityId) return null;\r\n\r\n const newAddress = await api.setContactAddress({\r\n data: {\r\n address,\r\n contactId: entityId,\r\n type,\r\n },\r\n });\r\n\r\n replaceAddress(id, newAddress);\r\n return newAddress;\r\n };\r\n\r\n const handleUpdateAddress = async () => {\r\n if (!api) return;\r\n if (!entityId) return;\r\n\r\n const updated = await api.updateContactAddress({\r\n data: {\r\n contactAddressId: id,\r\n contactId: entityId,\r\n note: note ?? '',\r\n },\r\n });\r\n\r\n replaceAddress(id, updated);\r\n };\r\n\r\n const handleSave = async () => {\r\n setIsSaving(true);\r\n\r\n if (addressIsSaved) {\r\n await handleUpdateAddress();\r\n setIsSaving(false);\r\n } else {\r\n const newAddress = await handleSetAddress(channelType);\r\n if (newAddress) setIsSaving(false);\r\n }\r\n };\r\n\r\n const handleLinkAccountSave = async () => {\r\n setIsSaving(true);\r\n const newAddress = await handleSetAddress(13 as unknown as ChannelType);\r\n if (newAddress && addWhatsappVerified) {\r\n addWhatsappVerified(newAddress);\r\n }\r\n if (newAddress) setIsSaving(false);\r\n };\r\n\r\n return (\r\n <Box\r\n sx={{\r\n ...noteDeleteButtonStyle.container,\r\n }}\r\n >\r\n {addressIsSaved && (\r\n <TextField\r\n size=\"small\"\r\n label={t('global.note')}\r\n variant=\"outlined\"\r\n onChange={(e) => props.handleNoteFieldChange(e, id, channelType)}\r\n value={note}\r\n fullWidth\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n className=\"contacts-smallInput\"\r\n sx={noteDeleteButtonStyle.noteTextField}\r\n />\r\n )}\r\n <IconButton onClick={handleSave}>\r\n {isSaving ? <CircularProgress size={24} /> : <SaveIcon color=\"primary\" />}\r\n </IconButton>\r\n <OptionsMenu\r\n onDelete={() => props.handleDeleteAddress(id, channelType)}\r\n addressData={props.addressData as any}\r\n handleLinkAccountSave={handleLinkAccountSave}\r\n checked={checked && !isSaving} // Pass the checked prop to OptionsMenu\r\n onCheckContactAddress={async (type) => {\r\n if (!api) return null;\r\n try {\r\n return await api.checkContactAddress({\r\n data: {\r\n address,\r\n type,\r\n },\r\n });\r\n } catch {\r\n return null;\r\n }\r\n }}\r\n />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default NoteDeleteButton;\r\n","const informationItemInputsContainerStyle = {\r\n container: {\r\n display: 'flex',\r\n gap: '100px',\r\n alignItems: 'center',\r\n },\r\n};\r\n\r\nexport default informationItemInputsContainerStyle;\r\n","// Types\r\nimport type { ReactNode } from 'react';\r\n// Components/ui\r\nimport informationItemInputsContainerStyle from './style';\r\nimport { Box } from '@mui/material';\r\n\r\ntype Props = {\r\n children: ReactNode;\r\n};\r\n\r\nconst InformationItemInputsContainer = ({ children }: Props) => {\r\n return <Box sx={informationItemInputsContainerStyle.container}>{children}</Box>;\r\n};\r\n\r\nexport default InformationItemInputsContainer;\r\n","const subsectionBodyContainerStyle = {\r\n container: {\r\n width: '100%',\r\n borderRadius: 1,\r\n px: 1.5,\r\n py: 2,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 2,\r\n overflow: 'auto',\r\n maxHeight: 'calc(100vh - 250px)',\r\n\r\n },\r\n};\r\n\r\nexport default subsectionBodyContainerStyle;\r\n","// Components/ui\r\nimport subsectionBodyContainerStyle from './style';\r\nimport { Box } from '@mui/material';\r\n// Types\r\nimport type { ReactNode } from 'react';\r\n\r\ntype Props = {\r\n children: ReactNode;\r\n variant?: 'large' | 'default';\r\n};\r\n\r\nconst SubsectionBodyContainer = ({ children }: Props) => {\r\n return (\r\n <Box\r\n sx={{\r\n ...subsectionBodyContainerStyle.container,\r\n }}\r\n >\r\n {children}\r\n </Box>\r\n );\r\n};\r\n\r\nexport default SubsectionBodyContainer;\r\n","import CheckRoundedIcon from '@mui/icons-material/CheckRounded';\r\nimport CloseRoundedIcon from '@mui/icons-material/CloseRounded';\r\nimport CircularProgress from '@mui/material/CircularProgress';\r\nimport { AdornmentStatus } from '../../StatusAdornment';\r\n\r\nconst Adornment = ({ status }: { status:AdornmentStatus }) => {\r\n switch (status) {\r\n case 'idle':\r\n return null;\r\n case 'loading':\r\n return <CircularProgress size={20} />;\r\n case 'available':\r\n return <CheckRoundedIcon style={{ height: 27, width: 27 }} color=\"success\" />;\r\n case 'unavailable':\r\n return <CloseRoundedIcon style={{ height: 27, width: 27 }} color=\"error\" />;\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nexport default Adornment;\r\n","// Components/ui\r\nimport { Adornment } from './components';\r\nimport InputAdornment from '@mui/material/InputAdornment';\r\nimport Typography from '@mui/material/Typography';\r\n\r\nexport type AdornmentStatus = 'idle' | 'loading' | 'available' | 'unavailable';\r\n\r\ntype StatusAdornmentProps = {\r\n status: AdornmentStatus;\r\n text?: string;\r\n};\r\n\r\nconst StatusAdornment = ({ status, text }: StatusAdornmentProps) => {\r\n\r\n const textAdornment = text ? (\r\n <Typography marginRight={0.5}>\r\n {text}\r\n </Typography>\r\n ) : null;\r\n\r\n return (\r\n <InputAdornment position=\"end\">\r\n {textAdornment}\r\n <div style={{ width: 30, display: 'flex', justifyContent: 'center' }}>\r\n <Adornment status={status} />\r\n </div>\r\n </InputAdornment>\r\n );\r\n};\r\n\r\nexport default StatusAdornment;\r\n","const imsStyle = {\r\n code: {\r\n width: '60%',\r\n color: 'gray',\r\n },\r\n};\r\n\r\nexport default imsStyle;\r\n","// Components/ui\r\nimport {\r\n InformationItemContainer,\r\n InformationItemInputsContainer,\r\n NoteDeleteButton,\r\n} from '../../../../../../shared';\r\nimport { Typography } from '@mui/material';\r\nimport imsStyle from './style';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport UseEditBusiness from '../../../../../../../../../../../hooks/useEditBusiness/types/UseEditBusiness';\r\nimport UseEditContact from '../../../../../../../../../../../hooks/useEditContact/types/UseEditContact';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n editEntity: UseEditBusiness | UseEditContact;\r\n};\r\n\r\nconst Ims = ({ data, editEntity }: Props) => {\r\n const editActions = editEntity.action;\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Typography sx={imsStyle.code} variant=\"body2\">\r\n {data.address}\r\n </Typography>\r\n <NoteDeleteButton\r\n addressData={data}\r\n handleNoteFieldChange={editActions.handleNoteFieldChange}\r\n handleDeleteAddress={editActions.handleDeleteAddress}\r\n />\r\n </InformationItemInputsContainer>\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default Ims;\r\n","// Components/ui\r\nimport { Ims } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport SubsectionBodyContainer from '../../../../shared/SubsectionBodyContainer';\r\nimport UseEditContact from '../../../../../../../../../hooks/useEditContact/types/UseEditContact';\r\nimport UseEditBusiness from '../../../../../../../../../hooks/useEditBusiness/types/UseEditBusiness';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n IMSs: NewAddress[] | IContactAddress[];\r\n editEntity: UseEditBusiness | UseEditContact;\r\n};\r\n\r\nconst Body = ({ IMSs, editEntity }: Props) => {\r\n return (\r\n <SubsectionBodyContainer>\r\n {IMSs?.map((ims) => (\r\n <Ims key={ims.id} data={ims} editEntity={editEntity} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Body } from './components';\r\nimport { SubsectionHeader } from '..';\r\n// Types\r\nimport { Box } from '@mui/material';\r\nimport UseEditBusiness from '../../../../../../../hooks/useEditBusiness/types/UseEditBusiness';\r\nimport UseEditContact from '../../../../../../../hooks/useEditContact/types/UseEditContact';\r\nimport { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\n\r\ntype Props = {\r\n editEntity: UseEditBusiness | UseEditContact;\r\n title: string;\r\n IMSs: IContactAddress[] | NewAddress[];\r\n};\r\n\r\nconst InformationSocialNetworkItem = ({ editEntity, title, IMSs }: Props) => {\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeader title={title} />\r\n <Body IMSs={IMSs} editEntity={editEntity} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default InformationSocialNetworkItem;\r\n","export const style = {\r\n addressField: {\r\n // width: '35%',\r\n },\r\n};\r\n","import { Dispatch, useEffect, useState } from 'react';\r\n// Components/ui\r\nimport { TextField } from '@mui/material';\r\nimport { style } from './style';\r\nimport StatusAdornment from '../../shared/StatusAdornment';\r\n// Types\r\nimport type { ChangeEvent } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { AdornmentStatus } from '../../shared/StatusAdornment/StatusAdornment';\r\nimport { SetStateAction } from 'react';\r\nimport { CheckContactAddressData } from '../../types/CheckContactAddressData';\r\nimport { useEditContactApi } from '../../../../../../../context/EditContactApiContext';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ninterface AddressInputProps {\r\n data: NewAddress | IContactAddress;\r\n onChange: (\r\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n id: string,\r\n channelType: ChannelType,\r\n ) => void;\r\n setWarnings: Dispatch<SetStateAction<string[]>>;\r\n}\r\n\r\nconst AddressInput = ({ data, onChange, setWarnings }: AddressInputProps) => {\r\n const { id, channelType, address } = data;\r\n const t = useTranslationContext();\r\n\r\n const api = useEditContactApi();\r\n\r\n const [adornmentStatus, setAdornmentStatus] = useState<AdornmentStatus>('idle');\r\n const [lastSearch, setLastSearch] = useState(address);\r\n const addressIsSaved = !data.hasOwnProperty('isSaved');\r\n\r\n useEffect(() => {\r\n let timer = setTimeout(async () => {\r\n if (address !== '' && address !== lastSearch) {\r\n if (!api) {\r\n return;\r\n }\r\n\r\n setAdornmentStatus('loading');\r\n setLastSearch(address);\r\n\r\n const checkContactAddressData: CheckContactAddressData = {\r\n address,\r\n type: channelType,\r\n };\r\n try {\r\n const response = await api.checkContactAddress({ data: checkContactAddressData });\r\n const { success, warnings } = response;\r\n\r\n setWarnings(warnings);\r\n\r\n success ? setAdornmentStatus('available') : setAdornmentStatus('unavailable');\r\n } catch {\r\n setWarnings([]);\r\n setAdornmentStatus('unavailable');\r\n }\r\n }\r\n }, 1700);\r\n\r\n return () => clearTimeout(timer);\r\n }, [api, data, address, channelType, lastSearch, setWarnings]);\r\n\r\n return (\r\n <>\r\n <TextField\r\n disabled={addressIsSaved}\r\n sx={style.addressField}\r\n size=\"small\"\r\n label={\r\n channelType === ChannelType.WHATSAPP || channelType === ChannelType.RCS\r\n ? t\r\n ? t('global.number')\r\n : 'Number'\r\n : t\r\n ? t('global.email')\r\n : 'Email'\r\n }\r\n value={address}\r\n onChange={(e) => {\r\n onChange(e, id, channelType);\r\n }}\r\n variant=\"outlined\"\r\n fullWidth\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n className=\"contacts-smallInput\"\r\n InputProps={{\r\n endAdornment: (\r\n <>\r\n <StatusAdornment status={adornmentStatus} />\r\n </>\r\n ),\r\n }}\r\n />\r\n {}\r\n </>\r\n );\r\n};\r\n\r\nexport default AddressInput;\r\n","export const style = {\r\n addressField: {\r\n // width: '35%',\r\n },\r\n};\r\n","import { Dispatch, useEffect, useState } from 'react';\r\n// Components/ui\r\nimport { TextField } from '@mui/material';\r\nimport { style } from './style';\r\nimport StatusAdornment from '../../shared/StatusAdornment';\r\n// Types\r\nimport type { ChangeEvent } from 'react';\r\nimport { ChannelType } from '@trii/types/dist/Common/Channels';\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { AdornmentStatus } from '../../shared/StatusAdornment/StatusAdornment';\r\nimport { SetStateAction } from 'react';\r\nimport { CheckContactAddressData } from '../../types/CheckContactAddressData';\r\nimport { useEditContactApi } from '../../../../../../../context/EditContactApiContext';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ninterface AddressInputProps {\r\n data: NewAddress | IContactAddress;\r\n onChange: (\r\n e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,\r\n id: string,\r\n channelType: ChannelType,\r\n ) => void;\r\n setWarnings: Dispatch<SetStateAction<string[]>>;\r\n}\r\n\r\nconst PhoneInput = ({ data, onChange, setWarnings }: AddressInputProps) => {\r\n const api = useEditContactApi();\r\n const t = useTranslationContext();\r\n const { id, channelType, address } = data;\r\n const [adornmentStatus, setAdornmentStatus] = useState<AdornmentStatus>('idle');\r\n const [lastSearch, setLastSearch] = useState(address);\r\n const addressIsSaved = !data.hasOwnProperty('isSaved');\r\n\r\n useEffect(() => {\r\n let timer = setTimeout(async () => {\r\n if (address !== '' && address !== lastSearch) {\r\n if (!api) {\r\n return;\r\n }\r\n\r\n setAdornmentStatus('loading');\r\n setLastSearch(address);\r\n\r\n const checkContactAddressData: CheckContactAddressData = {\r\n address,\r\n type: channelType,\r\n };\r\n\r\n try {\r\n const { success, warnings } = await api.checkContactAddress({\r\n data: checkContactAddressData,\r\n });\r\n\r\n setWarnings(warnings);\r\n\r\n success ? setAdornmentStatus('available') : setAdornmentStatus('unavailable');\r\n } catch {\r\n setWarnings([]);\r\n setAdornmentStatus('unavailable');\r\n }\r\n }\r\n }, 1700);\r\n\r\n return () => clearTimeout(timer);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [data]);\r\n\r\n return (\r\n <>\r\n <TextField\r\n disabled={addressIsSaved}\r\n sx={style.addressField}\r\n size=\"small\"\r\n label={t('global.number')}\r\n value={address}\r\n onChange={(e) => {\r\n onChange(e, id, channelType);\r\n }}\r\n variant=\"outlined\"\r\n fullWidth\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n className=\"contacts-smallInput\"\r\n InputProps={{\r\n endAdornment: (\r\n <>\r\n <StatusAdornment status={adornmentStatus} />\r\n </>\r\n ),\r\n }}\r\n />\r\n {}\r\n </>\r\n );\r\n};\r\n\r\nexport default PhoneInput;\r\n","export const style = {\r\n secondaryContainer: {\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n height: '100%',\r\n gap: 0.5,\r\n },\r\n icon: { height: 15 },\r\n chip: {\r\n borderRadius: '6px',\r\n height: '22px'\r\n }\r\n};\r\n","// Components/ui\r\nimport { Grid, Box } from '@mui/material';\r\nimport { style } from './style';\r\nimport WarningIcon from '@mui/icons-material/Warning';\r\nimport Chip from '@mui/material/Chip';\r\n\r\ntype WarningProps = {\r\n text: string;\r\n};\r\n\r\nconst Warning = ({ text }: WarningProps) => {\r\n return (\r\n <Grid item >\r\n <Box sx={style.secondaryContainer}>\r\n <Chip icon={<WarningIcon sx={style.icon} />} sx={style.chip} label={text} color=\"error\" variant='outlined' />\r\n </Box>\r\n </Grid>\r\n );\r\n};\r\n\r\nexport default Warning;\r\n","// Components/ui\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\nimport { Warning } from './components';\r\nimport { Box, Grid } from '@mui/material';\r\n\r\ntype WarningsDisplayProps = {\r\n warnings: string[];\r\n};\r\n\r\nconst WarningsDisplay = ({ warnings }: WarningsDisplayProps) => {\r\n const t = useTranslationContext();\r\n\r\n return (\r\n <Box>\r\n <Grid container>\r\n {warnings?.map((warning, i) => (\r\n <Warning key={i} text={t(`contactAddressError.${warning}`)} />\r\n ))}\r\n </Grid>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default WarningsDisplay;\r\n","const phoneStyle = {\r\n numberCountryContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n width: '50%',\r\n },\r\n warningMessage: {\r\n // position: \"absolute\",\r\n // bottom: \"-30px\",\r\n marginTop: \"10px\"\r\n },\r\n adressInputBox: {\r\n position: \"relative\",\r\n width: \"45%\"\r\n }\r\n};\r\n\r\nexport default phoneStyle;\r\n","import { useEffect, useState } from 'react';\r\nimport { Box } from '@mui/material';\r\nimport {\r\n InformationItemContainer,\r\n NoteDeleteButton,\r\n InformationItemInputsContainer,\r\n PhoneInput,\r\n WarningsDisplay,\r\n} from '../../../../../../layout';\r\nimport phoneStyle from './style';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { useEditEntity } from '../../../../../../../../../../../context/EditEntityContext';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n};\r\n\r\nconst Phone = ({ data }: Props) => {\r\n const mode = 'edit';\r\n const { editEntity } = useEditEntity();\r\n const editEntityActions = editEntity.action;\r\n const editEntityState = editEntity.state;\r\n const [warnings, setWarnings] = useState<string[]>([]);\r\n const [checked, setChecked] = useState(true);\r\n\r\n useEffect(() => {\r\n setChecked(warnings.length === 0 && (data.address ?? '') !== '');\r\n }, [warnings, data.address]);\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Box sx={{ ...phoneStyle.numberCountryContainer, flexDirection: 'column' }}>\r\n <PhoneInput\r\n data={data}\r\n setWarnings={setWarnings}\r\n onChange={editEntityActions.handleAddressFieldChange}\r\n />\r\n {warnings.length > 0 && <WarningsDisplay warnings={warnings} />}\r\n </Box>\r\n <NoteDeleteButton\r\n mode={mode}\r\n addressData={data}\r\n handleNoteFieldChange={editEntityActions.handleNoteFieldChange}\r\n handleDeleteAddress={editEntityActions.handleDeleteAddress}\r\n isDeletingAddress={editEntityState.isDeletingAddress}\r\n replaceAddress={editEntityActions.replaceAddress}\r\n addWhatsappVerified={(editEntityActions as any).addWhatsappVerified}\r\n checked={checked}\r\n />\r\n </InformationItemInputsContainer>\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default Phone;\r\n","// Components/ui\r\nimport { Phone } from './components';\r\nimport { SubsectionBodyContainer } from '../../../../layout';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n phoneNumbers: Array<NewAddress | IContactAddress>;\r\n};\r\n\r\nconst Body = ({ phoneNumbers }: Props) => {\r\n return (\r\n <SubsectionBodyContainer variant=\"large\">\r\n {phoneNumbers?.map((phone) => (\r\n <Phone key={phone.id} data={phone} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Body } from './components';\r\nimport { SubsectionHeaderWithButton } from '../../layout';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { Box } from '@mui/material';\r\nimport { useTranslationContext } from '../../../../../../../context/TranslationContext';\r\n\r\ntype Props = {\r\n phoneNumbers: Array<NewAddress | IContactAddress>;\r\n handleAdd: () => void;\r\n};\r\n\r\nconst Phones = ({ phoneNumbers, handleAdd }: Props) => {\r\n const t = useTranslationContext();\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeaderWithButton handleAdd={handleAdd} title={t('global.phones')} />\r\n <Body phoneNumbers={phoneNumbers} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Phones;\r\n","const mailStyle = {\r\n emailField: {\r\n width: '60%',\r\n },\r\n numberCountryContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n width: '50%',\r\n },\r\n warningMessage: {\r\n position: \"absolute\",\r\n bottom: \"-30px\"\r\n },\r\n adressInputBox: {\r\n position: \"relative\",\r\n width: \"60%\"\r\n }\r\n};\r\n\r\nexport default mailStyle;\r\n","import { useState } from 'react';\r\n// Components/ui\r\nimport {\r\n AddressInput,\r\n InformationItemContainer,\r\n InformationItemInputsContainer,\r\n NoteDeleteButton,\r\n WarningsDisplay,\r\n} from '../../../../../../layout';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { Box } from '@mui/material';\r\nimport mailStyle from './style';\r\nimport { useEditEntity } from '../../../../../../../../../../../context/EditEntityContext';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n};\r\n\r\nconst Mail = ({ data }: Props) => {\r\n const mode = 'edit';\r\n const { editEntity } = useEditEntity();\r\n const editEntityActions = editEntity.action;\r\n const editEntityState = editEntity.state;\r\n const [warnings, setWarnings] = useState<string[]>([]);\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Box sx={mailStyle.numberCountryContainer}>\r\n <Box sx={mailStyle.adressInputBox}>\r\n <AddressInput\r\n data={data}\r\n setWarnings={setWarnings}\r\n onChange={editEntityActions.handleAddressFieldChange}\r\n />\r\n </Box>\r\n </Box>\r\n <NoteDeleteButton\r\n mode={mode}\r\n addressData={data}\r\n handleNoteFieldChange={editEntityActions.handleNoteFieldChange}\r\n handleDeleteAddress={editEntityActions.handleDeleteAddress}\r\n isDeletingAddress={editEntityState.isDeletingAddress}\r\n replaceAddress={editEntityActions.replaceAddress}\r\n />\r\n </InformationItemInputsContainer>\r\n {warnings.length > 0 && <WarningsDisplay warnings={warnings} />}\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default Mail;\r\n","// Components/ui\r\nimport { SubsectionBodyContainer } from '../../../../layout';\r\nimport { Mail } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n emails: Array<NewAddress | IContactAddress>;\r\n};\r\n\r\nconst Body = ({ emails }: Props) => {\r\n return (\r\n <SubsectionBodyContainer variant=\"large\">\r\n {emails?.map((email) => (\r\n <Mail key={email.id} data={email} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Box } from '@mui/material';\r\nimport { SubsectionHeaderWithButton } from '../../layout';\r\nimport { Body } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n emails: Array<NewAddress | IContactAddress>;\r\n handleAdd: () => void;\r\n};\r\nconst Mails = ({ emails, handleAdd }: Props) => {\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeaderWithButton handleAdd={handleAdd} title={'Emails'} />\r\n <Body emails={emails} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Mails;\r\n","const mailStyle = {\r\n emailField: {\r\n width: '60%',\r\n },\r\n numberCountryContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n width: '50%',\r\n },\r\n warningMessage: {\r\n position: \"absolute\",\r\n bottom: \"-30px\"\r\n },\r\n adressInputBox: {\r\n position: \"relative\",\r\n width: \"60%\"\r\n }\r\n};\r\n\r\nexport default mailStyle;\r\n","import { useState } from 'react';\r\n// Components/ui\r\nimport {\r\n AddressInput,\r\n InformationItemContainer,\r\n InformationItemInputsContainer,\r\n NoteDeleteButton,\r\n WarningsDisplay,\r\n} from '../../../../../../layout';\r\nimport { Box } from '@mui/material';\r\nimport mailStyle from './style';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { useEditEntity } from '../../../../../../../../../../../context/EditEntityContext';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n};\r\n\r\nconst Whatsapp = ({ data }: Props) => {\r\n const mode = 'edit';\r\n const { editEntity } = useEditEntity();\r\n const editEntityActions = editEntity.action;\r\n const editEntityState = editEntity.state;\r\n const [warnings, setWarnings] = useState<string[]>([]);\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Box sx={mailStyle.numberCountryContainer}>\r\n <Box sx={mailStyle.adressInputBox}>\r\n <AddressInput\r\n data={data}\r\n setWarnings={setWarnings}\r\n onChange={editEntityActions.handleAddressFieldChange}\r\n />\r\n </Box>\r\n </Box>\r\n <NoteDeleteButton\r\n mode={mode}\r\n addressData={data}\r\n handleNoteFieldChange={editEntityActions.handleNoteFieldChange}\r\n handleDeleteAddress={editEntityActions.handleDeleteAddress}\r\n isDeletingAddress={editEntityState.isDeletingAddress}\r\n replaceAddress={editEntityActions.replaceAddress}\r\n />\r\n </InformationItemInputsContainer>\r\n {warnings.length > 0 && <WarningsDisplay warnings={warnings} />}\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default Whatsapp;\r\n","// Components/ui\r\nimport { SubsectionBodyContainer } from '../../../../layout';\r\nimport { Whatsapp } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n whatsapps: Array<NewAddress | IContactAddress>;\r\n};\r\n\r\nconst Body = ({ whatsapps }: Props) => {\r\n return (\r\n <SubsectionBodyContainer variant=\"large\">\r\n {whatsapps?.map((whatsapp) => (\r\n <Whatsapp key={whatsapp.id} data={whatsapp} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Box } from '@mui/material';\r\nimport { SubsectionHeaderWithButton } from '../../layout';\r\nimport { Body } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n whatsapps: Array<NewAddress | IContactAddress>;\r\n handleAdd: () => void;\r\n};\r\nconst Whatsapps = ({ whatsapps, handleAdd }: Props) => {\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeaderWithButton handleAdd={handleAdd} title={'WhatsApp'} />\r\n <Body whatsapps={whatsapps} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default Whatsapps;\r\n","const mailStyle = {\r\n emailField: {\r\n width: '60%',\r\n },\r\n numberCountryContainer: {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n width: '50%',\r\n },\r\n warningMessage: {\r\n position: \"absolute\",\r\n bottom: \"-30px\"\r\n },\r\n adressInputBox: {\r\n position: \"relative\",\r\n width: \"60%\"\r\n }\r\n};\r\n\r\nexport default mailStyle;\r\n","import { useState } from 'react';\r\n// Components/ui\r\nimport {\r\n AddressInput,\r\n InformationItemContainer,\r\n InformationItemInputsContainer,\r\n NoteDeleteButton,\r\n WarningsDisplay,\r\n} from '../../../../../../layout';\r\nimport { Box } from '@mui/material';\r\nimport mailStyle from './style';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport { useEditEntity } from '../../../../../../../../../../../context/EditEntityContext';\r\n\r\ntype Props = {\r\n data: NewAddress | IContactAddress;\r\n};\r\n\r\nconst RCS = ({ data }: Props) => {\r\n const mode = 'edit';\r\n const { editEntity } = useEditEntity();\r\n const editEntityActions = editEntity.action;\r\n const editEntityState = editEntity.state;\r\n const [warnings, setWarnings] = useState<string[]>([]);\r\n\r\n return (\r\n <InformationItemContainer>\r\n <InformationItemInputsContainer>\r\n <Box sx={mailStyle.numberCountryContainer}>\r\n <Box sx={mailStyle.adressInputBox}>\r\n <AddressInput\r\n data={data}\r\n setWarnings={setWarnings}\r\n onChange={editEntityActions.handleAddressFieldChange}\r\n />\r\n </Box>\r\n </Box>\r\n <NoteDeleteButton\r\n mode={mode}\r\n addressData={data}\r\n handleNoteFieldChange={editEntityActions.handleNoteFieldChange}\r\n handleDeleteAddress={editEntityActions.handleDeleteAddress}\r\n isDeletingAddress={editEntityState.isDeletingAddress}\r\n replaceAddress={editEntityActions.replaceAddress}\r\n />\r\n </InformationItemInputsContainer>\r\n {warnings.length > 0 && <WarningsDisplay warnings={warnings} />}\r\n </InformationItemContainer>\r\n );\r\n};\r\n\r\nexport default RCS;\r\n","// Components/ui\r\nimport { SubsectionBodyContainer } from '../../../../layout';\r\nimport { RCS } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n RCSs: Array<NewAddress | IContactAddress>;\r\n};\r\n\r\nconst Body = ({ RCSs }: Props) => {\r\n return (\r\n <SubsectionBodyContainer variant=\"large\">\r\n {RCSs?.map((data) => (\r\n <RCS key={data.id} data={data} />\r\n ))}\r\n </SubsectionBodyContainer>\r\n );\r\n};\r\n\r\nexport default Body;\r\n","// Components/ui\r\nimport { Box } from '@mui/material';\r\nimport { SubsectionHeaderWithButton } from '../../layout';\r\nimport { Body } from './components';\r\n// Types\r\nimport { NewAddress } from '../../../../../../../utils/contactHelper';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\n\r\ntype Props = {\r\n RCSs: Array<NewAddress | IContactAddress>;\r\n handleAdd: () => void;\r\n};\r\nconst RCSs = ({ RCSs, handleAdd }: Props) => {\r\n return (\r\n <Box sx={{ width: '100%' }}>\r\n <SubsectionHeaderWithButton handleAdd={handleAdd} title={'RCS'} />\r\n <Body RCSs={RCSs} />\r\n </Box>\r\n );\r\n};\r\n\r\nexport default RCSs;\r\n","// Components/ui\r\nimport { Modal, Box, Typography, Button } from '@mui/material';\r\nimport { styled } from '@mui/system';\r\nimport { Mails, Phones, RCSs, Whatsapps } from './components';\r\n// Hooks\r\nimport { InformationSocialNetworkItem } from './layout';\r\nimport { useEditEntity } from '../../../../../context/EditEntityContext';\r\nimport { useTranslationContext } from '../../../../../context/TranslationContext';\r\n\r\ninterface EditModalProps {\r\n open: boolean;\r\n onClose: () => void;\r\n title: string;\r\n}\r\n\r\nconst StyledModalContent = styled(Box)(({ theme }) => ({\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 1000,\r\n backgroundColor: theme.palette.background.paper,\r\n padding: theme.spacing(4),\r\n borderRadius: theme.shape.borderRadius,\r\n}));\r\n\r\nconst EditModal: React.FC<EditModalProps> = ({ open, onClose, title }) => {\r\n const t = useTranslationContext();\r\n const { editEntity } = useEditEntity();\r\n const { emails, phoneNumbers, imsWhatsapp, imsRCS } = editEntity.field;\r\n const { addEmail, addPhone, addWhatsapp, resetToInitialContactInformation, addRCS } =\r\n editEntity.action;\r\n\r\n function handleClose() {\r\n onClose();\r\n resetToInitialContactInformation();\r\n }\r\n\r\n const renderContent = () => {\r\n switch (title) {\r\n case 'Phones':\r\n return <Phones handleAdd={addPhone} phoneNumbers={phoneNumbers} />;\r\n case 'Emails':\r\n return <Mails handleAdd={addEmail} emails={emails} />;\r\n\r\n case 'Whatsapp':\r\n return <Whatsapps handleAdd={addWhatsapp} whatsapps={imsWhatsapp} />;\r\n case 'RCS':\r\n return <RCSs handleAdd={addRCS} RCSs={imsRCS} />;\r\n\r\n case 'Facebook':\r\n return (\r\n <InformationSocialNetworkItem\r\n title={'Facebook'}\r\n IMSs={editEntity.field.imsFacebooks}\r\n editEntity={editEntity}\r\n />\r\n );\r\n case 'Webchat':\r\n return (\r\n <InformationSocialNetworkItem\r\n title={'Webchat'}\r\n IMSs={editEntity.field.imsWebchats}\r\n editEntity={editEntity}\r\n />\r\n );\r\n case 'Instagram':\r\n return (\r\n <InformationSocialNetworkItem\r\n title={'Instagram'}\r\n IMSs={editEntity.field.imsInstagrams}\r\n editEntity={editEntity}\r\n />\r\n );\r\n case 'Mercado libre':\r\n return (\r\n <InformationSocialNetworkItem\r\n title={'Mercado Libre'}\r\n IMSs={editEntity.field.imsMercadolibre}\r\n editEntity={editEntity}\r\n />\r\n );\r\n default:\r\n return <Typography>No information available for this section.</Typography>;\r\n }\r\n };\r\n\r\n return (\r\n <Modal open={open} onClose={onClose}>\r\n <StyledModalContent>\r\n {renderContent()}\r\n <Box mt={2} display={'flex'} justifyContent={'flex-end'}>\r\n <Button variant=\"contained\" color=\"primary\" onClick={handleClose}>\r\n {t('global.close')}\r\n </Button>\r\n </Box>\r\n </StyledModalContent>\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default EditModal;\r\n","import { Section } from '../../../layout';\r\nimport type { IContactAddress } from '@trii/types/dist/Contacts';\r\nimport type { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\nimport useEditModal from './hooks/useEditModal';\r\nimport { EditModal, ContactMethod } from './components';\r\nimport { useEditEntity } from '../../../context/EditEntityContext';\r\nimport { useTranslationContext } from '../../../context/TranslationContext';\r\n\r\ntype OwnerData = IContact | IBusiness;\r\n\r\ninterface Props {\r\n ownerData: OwnerData;\r\n}\r\n\r\nconst ContactInformation = ({ ownerData }: Props) => {\r\n const { isOpen, title, openModal, closeModal } = useEditModal();\r\n const { editEntity } = useEditEntity();\r\n const t = useTranslationContext();\r\n\r\n const phones: IContactAddress[] = editEntity.field.phoneNumbers;\r\n const emails: IContactAddress[] = editEntity.field.emails;\r\n const facebook: IContactAddress[] = editEntity.field.imsFacebooks;\r\n const whatsapp: IContactAddress[] = editEntity.field.imsWhatsapp;\r\n const mercadolibre: IContactAddress[] = editEntity.field.imsMercadolibre;\r\n const webchat: IContactAddress[] = editEntity.field.imsWebchats;\r\n const instagram: IContactAddress[] = editEntity.field.imsInstagrams;\r\n const rcs: IContactAddress[] = editEntity.field.imsRCS;\r\n\r\n const contactMethods = [\r\n {\r\n key: 'phones',\r\n title: t('conversations.contactDetails.phones'),\r\n items: phones,\r\n isPhone: true,\r\n modalTitle: 'Phones',\r\n visible: true,\r\n },\r\n {\r\n key: 'emails',\r\n title: 'Emails',\r\n items: emails,\r\n modalTitle: 'Emails',\r\n visible: true,\r\n },\r\n {\r\n key: 'facebook',\r\n title: 'Facebook',\r\n items: facebook,\r\n modalTitle: 'Facebook',\r\n visible: true,\r\n },\r\n {\r\n key: 'whatsapp',\r\n title: 'Whatsapp',\r\n items: whatsapp,\r\n modalTitle: 'Whatsapp',\r\n visible: true,\r\n },\r\n {\r\n key: 'rcs',\r\n title: 'RCS',\r\n items: rcs,\r\n modalTitle: 'RCS',\r\n visible: rcs.length > 0,\r\n },\r\n {\r\n key: 'mercado-libre',\r\n title: 'Mercado libre',\r\n items: mercadolibre,\r\n modalTitle: 'Mercado libre',\r\n visible: true,\r\n },\r\n {\r\n key: 'webchat',\r\n title: 'Webchat',\r\n items: webchat,\r\n modalTitle: 'Webchat',\r\n visible: true,\r\n },\r\n {\r\n key: 'instagram',\r\n title: 'Instagram',\r\n items: instagram,\r\n modalTitle: 'Instagram',\r\n visible: true,\r\n },\r\n ];\r\n\r\n return (\r\n <>\r\n <Section title={t('conversations.contactDetails.contactInformation')}>\r\n <div className=\"grid grid-cols-1 gap-3\">\r\n {contactMethods\r\n .filter((method) => method.visible)\r\n .map((method) => (\r\n <ContactMethod\r\n key={method.key}\r\n handleEdit={() => openModal(method.modalTitle)}\r\n title={method.title}\r\n methodItems={method.items}\r\n isPhone={method.isPhone}\r\n owner={ownerData}\r\n />\r\n ))}\r\n </div>\r\n </Section>\r\n <EditModal open={isOpen} onClose={closeModal} title={title} />\r\n </>\r\n );\r\n};\r\n\r\nexport default ContactInformation;\r\n","import type { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\nimport { Section } from '../../../layout';\r\nimport { EntityInfoLabel } from '../../../shared';\r\nimport { useTranslationContext } from '../../../context/TranslationContext';\r\nimport { Typography } from '@mui/material';\r\n\r\nexport type AddressInformationProps = {\r\n entityType: 'contact' | 'business';\r\n entityData: IContact | IBusiness;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n onEntityUpdated?: (entity: unknown) => void;\r\n onDirectionSearchClick?: () => void;\r\n};\r\n\r\nconst AddressInformation = ({\r\n entityType,\r\n entityData,\r\n baseUrl,\r\n spaceId,\r\n onEntityUpdated,\r\n onDirectionSearchClick,\r\n}: AddressInformationProps) => {\r\n const commonProps = {\r\n baseUrl,\r\n spaceId,\r\n entityId: String((entityData as any).id),\r\n onEntityUpdated,\r\n };\r\n const t = useTranslationContext();\r\n\r\n const AddressGroup = ({\r\n addressNumber,\r\n title,\r\n }: {\r\n addressNumber: 'address1' | 'address2';\r\n title: string;\r\n }) => (\r\n <div className=\"flex flex-col gap-4 rounded-xl p-4\">\r\n <Typography variant=\"body2\">{title}</Typography>\r\n <div className=\"grid grid-cols-2 gap-x-4 gap-y-3\">\r\n {/* Street takes full width */}\r\n <div className=\"col-span-2\">\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.street')}\r\n value={entityData[addressNumber]?.street ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { street: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n </div>\r\n\r\n {/* City & State share a row */}\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.city')}\r\n value={entityData[addressNumber]?.city ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { city: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.state')}\r\n value={entityData[addressNumber]?.state ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { state: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n\r\n {/* Postcode & Country share a row */}\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.postcode')}\r\n value={entityData[addressNumber]?.zipcode ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { zipcode: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n <EntityInfoLabel\r\n entityType={entityType as any}\r\n title={t('conversations.contactDetails.country')}\r\n value={entityData[addressNumber]?.country ?? ''}\r\n {...commonProps}\r\n constructUpdateObject={(value: any) => ({\r\n [addressNumber]: { country: value as string },\r\n })}\r\n minWidth=\"100%\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <Section\r\n title={t('conversations.contactDetails.addressInformation')}\r\n enableDirectionSearch={true}\r\n onDirectionSearchClick={onDirectionSearchClick}\r\n >\r\n <div className=\"flex flex-col gap-4\">\r\n <AddressGroup\r\n addressNumber=\"address1\"\r\n title={t('conversations.contactDetails.primaryAddress')}\r\n />\r\n <AddressGroup\r\n addressNumber=\"address2\"\r\n title={t('conversations.contactDetails.secondaryAddress')}\r\n />\r\n </div>\r\n </Section>\r\n );\r\n};\r\n\r\nexport default AddressInformation;\r\n","import { useCallback } from 'react';\r\nimport type { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\n\r\ntype Entity = IContact | IBusiness | null;\r\n\r\ntype UseEntityUpdateSyncArgs = {\r\n entity: Entity;\r\n setEntity: (next: IContact | IBusiness | null) => void;\r\n};\r\n\r\nexport const useEntityUpdateSync = ({ entity, setEntity }: UseEntityUpdateSyncArgs) => {\r\n const handleEntityUpdated = useCallback(\r\n (update: unknown) => {\r\n if (!update || typeof update !== 'object') {\r\n return;\r\n }\r\n\r\n const updateObj = update as Record<string, unknown>;\r\n\r\n if ('id' in updateObj) {\r\n // Full entity replacement\r\n setEntity(update as IContact | IBusiness);\r\n return;\r\n }\r\n\r\n if (!entity) {\r\n return;\r\n }\r\n\r\n // Shallow merge partial updates into existing entity\r\n const merged = { ...(entity as any), ...updateObj };\r\n setEntity(merged as IContact | IBusiness);\r\n },\r\n [entity, setEntity],\r\n );\r\n\r\n return handleEntityUpdated;\r\n};\r\n","import { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport type { ILabel } from '@trii/types/dist/Contacts';\r\nimport type { IBusiness, IContact, IContactTag } from '@trii/types/dist/Contacts/contacts';\r\nimport { createLabel, updateEntity } from '../services/api';\r\n\r\ntype ContactType = 'contact' | 'business' | 'unknown';\r\n\r\ntype UseTagsEditorControllerArgs = {\r\n open: boolean;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n contactData: IContact | IBusiness | null;\r\n contactType: ContactType;\r\n labels: ILabel[];\r\n selectedTags: IContactTag[];\r\n onTagsUpdated: (tags: IContactTag[]) => void;\r\n};\r\n\r\ntype UseTagsEditorControllerReturn = {\r\n view: 'main' | 'tags' | 'searchLocation' | 'businessSelect';\r\n setView: (view: 'main' | 'tags' | 'searchLocation' | 'businessSelect') => void;\r\n draftLabels: ILabel[];\r\n setDraftLabels: (labels: ILabel[]) => void;\r\n labelsOptions: ILabel[];\r\n isSaving: boolean;\r\n isCreatingLabel: boolean;\r\n handleCreateLabel: (name: string) => Promise<void>;\r\n handleSaveTags: () => Promise<void>;\r\n};\r\n\r\nexport const useTagsEditorController = ({\r\n open,\r\n baseUrl,\r\n spaceId,\r\n contactData,\r\n contactType,\r\n labels,\r\n selectedTags,\r\n onTagsUpdated,\r\n}: UseTagsEditorControllerArgs): UseTagsEditorControllerReturn => {\r\n const [view, setView] = useState<'main' | 'tags' | 'searchLocation' | 'businessSelect'>('main');\r\n const [draftLabels, setDraftLabels] = useState<ILabel[]>([]);\r\n const [tagsEditorInitialized, setTagsEditorInitialized] = useState(false);\r\n const [isSaving, setIsSaving] = useState(false);\r\n const [createdLabels, setCreatedLabels] = useState<ILabel[]>([]);\r\n const [isCreatingLabel, setIsCreatingLabel] = useState(false);\r\n\r\n const labelsOptions = useMemo(() => {\r\n const safeLabels = labels ?? [];\r\n const safeCreated = createdLabels ?? [];\r\n\r\n const byId = new Map<string, ILabel>();\r\n for (const label of safeLabels) {\r\n if (!label?.id) continue;\r\n byId.set(String(label.id), label);\r\n }\r\n for (const label of safeCreated) {\r\n if (!label?.id) continue;\r\n byId.set(String(label.id), label);\r\n }\r\n\r\n return Array.from(byId.values());\r\n }, [labels, createdLabels]);\r\n\r\n const reset = useCallback(() => {\r\n setView('main');\r\n setDraftLabels([]);\r\n setTagsEditorInitialized(false);\r\n setIsSaving(false);\r\n setCreatedLabels([]);\r\n setIsCreatingLabel(false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!open) {\r\n reset();\r\n }\r\n }, [open, reset]);\r\n\r\n useEffect(() => {\r\n if (view !== 'tags') {\r\n setTagsEditorInitialized(false);\r\n return;\r\n }\r\n\r\n if (tagsEditorInitialized) return;\r\n if (!labelsOptions.length) return;\r\n\r\n const selectedTagIds = new Set(selectedTags.map((t) => String(t.id)));\r\n const initialDraft = labelsOptions.filter((l) => selectedTagIds.has(String(l?.id)));\r\n\r\n setDraftLabels(initialDraft);\r\n setTagsEditorInitialized(true);\r\n }, [view, tagsEditorInitialized, labelsOptions, selectedTags]);\r\n\r\n const handleCreateLabel = useCallback(\r\n async (name: string) => {\r\n if (isCreatingLabel) return;\r\n if (!baseUrl || !spaceId) return;\r\n\r\n const trimmedName = String(name ?? '').trim();\r\n if (!trimmedName) return;\r\n\r\n const normalizedName = trimmedName.toLowerCase();\r\n const existing = labelsOptions.find(\r\n (l) =>\r\n String(l?.name ?? '')\r\n .trim()\r\n .toLowerCase() === normalizedName,\r\n );\r\n\r\n if (existing?.id) {\r\n setDraftLabels((prev) => {\r\n const safePrev = prev ?? [];\r\n const existsInDraft = safePrev.some((p) => String(p?.id) === String(existing.id));\r\n if (existsInDraft) return safePrev;\r\n return [...safePrev, existing];\r\n });\r\n return;\r\n }\r\n\r\n setIsCreatingLabel(true);\r\n try {\r\n const created = await createLabel({ baseUrl, spaceId, name: trimmedName });\r\n\r\n setCreatedLabels((prev) => {\r\n const safePrev = prev ?? [];\r\n if (!created?.id) return safePrev;\r\n const existsInCreated = safePrev.some((p) => String(p?.id) === String(created.id));\r\n if (existsInCreated) return safePrev;\r\n return [...safePrev, created];\r\n });\r\n\r\n setDraftLabels((prev) => {\r\n const safePrev = prev ?? [];\r\n if (!created?.id) return safePrev;\r\n const existsInDraft = safePrev.some((p) => String(p?.id) === String(created.id));\r\n if (existsInDraft) return safePrev;\r\n return [...safePrev, created];\r\n });\r\n } finally {\r\n setIsCreatingLabel(false);\r\n }\r\n },\r\n [isCreatingLabel, baseUrl, spaceId, labelsOptions],\r\n );\r\n\r\n const handleSaveTags = useCallback(async () => {\r\n if (isSaving) return;\r\n if (!baseUrl || !spaceId) return;\r\n if (!contactData) return;\r\n if (contactType !== 'contact' && contactType !== 'business') return;\r\n\r\n const tags: IContactTag[] = draftLabels\r\n .filter((l) => l?.id && l?.name)\r\n .map((l) => ({ id: String(l.id), name: String(l.name) }));\r\n\r\n setIsSaving(true);\r\n try {\r\n await updateEntity({\r\n baseUrl,\r\n spaceId,\r\n entityType: contactType,\r\n entityId: String((contactData as any).id),\r\n body: { tags },\r\n });\r\n\r\n onTagsUpdated(tags);\r\n setView('main');\r\n } finally {\r\n setIsSaving(false);\r\n }\r\n }, [isSaving, baseUrl, spaceId, contactData, contactType, draftLabels, onTagsUpdated]);\r\n\r\n return {\r\n view,\r\n setView,\r\n draftLabels,\r\n setDraftLabels,\r\n labelsOptions,\r\n isSaving,\r\n isCreatingLabel,\r\n handleCreateLabel,\r\n handleSaveTags,\r\n };\r\n};\r\n","import { useCallback } from 'react';\r\n\r\ntype Reason = 'backdropClick' | 'escapeKeyDown';\r\n\r\ntype UseModalCloseHandlerArgs = {\r\n onClose: () => void;\r\n};\r\n\r\nexport const useModalCloseHandler = ({ onClose }: UseModalCloseHandlerArgs) => {\r\n const handleClose = useCallback(\r\n (_event: unknown, reason?: Reason) => {\r\n if (reason === 'escapeKeyDown') {\r\n return;\r\n }\r\n\r\n onClose();\r\n },\r\n [onClose],\r\n );\r\n\r\n return handleClose;\r\n};\r\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport SaveIcon from '@mui/icons-material/Save';\nimport { LoadingButton } from '@mui/lab';\nimport {\n Autocomplete,\n Box,\n CircularProgress,\n IconButton,\n LinearProgress,\n Stack,\n TextField,\n Typography,\n} from '@mui/material';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { UIEvent } from 'react';\nimport type { UserTrii } from '@trii/types/dist/Users';\n\nimport { useEditContactApi } from '../../context/EditContactApiContext';\nimport { useTranslationContext } from '../../context/TranslationContext';\nimport { updateEntity } from '../../services/api';\nimport type { Pagination } from '../../services/api';\n\ntype SimplifiedBusiness = {\n businessId: string;\n businessName: string;\n};\n\ntype Props = {\n baseUrl?: string;\n spaceId?: string;\n contactId?: string;\n initialBusiness?: SimplifiedBusiness | null;\n onBack: () => void;\n onEntityUpdated?: (entity: unknown) => void;\n currentUser?: UserTrii | null;\n};\n\nconst DEFAULT_PAGINATION: Omit<Pagination, 'filter' | 'currentPage'> = {\n format: 'IBusiness',\n total: 0,\n lastPage: 1,\n perPage: 10,\n order: 'ASC',\n orderColumn: 'Id',\n};\n\nconst BusinessSelectEditor = ({\n baseUrl,\n spaceId,\n contactId,\n initialBusiness,\n onBack,\n onEntityUpdated,\n currentUser,\n}: Props) => {\n const t = useTranslationContext();\n const api = useEditContactApi();\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n\n const [inputValue, setInputValue] = useState(() => initialBusiness?.businessName ?? '');\n const [hasSearched, setHasSearched] = useState(false);\n\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingTimer, setIsLoadingTimer] = useState(false);\n\n const [options, setOptions] = useState<SimplifiedBusiness[]>([]);\n const [selected, setSelected] = useState<SimplifiedBusiness | null>(initialBusiness ?? null);\n\n const [currentPage, setCurrentPage] = useState(1);\n const [isNextPage, setIsNextPage] = useState(false);\n const [allLoaded, setAllLoaded] = useState(false);\n\n const ownerValue = useMemo(() => {\n const displayName = (currentUser as any)?.display_name;\n const email = (currentUser as any)?.email;\n return String(displayName || email || '').trim();\n }, [currentUser]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n abortRef.current?.abort();\n };\n }, []);\n\n useEffect(() => {\n setSelected(initialBusiness ?? null);\n setInputValue(initialBusiness?.businessName ?? '');\n }, [initialBusiness]);\n\n const resetSearchState = () => {\n abortRef.current?.abort();\n abortRef.current = null;\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n setHasSearched(false);\n setAllLoaded(false);\n setCurrentPage(1);\n setIsNextPage(false);\n setOptions([]);\n };\n\n const mapBusinesses = (businesses: Array<{ id: string; name: string }>) => {\n return businesses\n .filter((b) => Boolean(b?.id))\n .map((b) => ({ businessId: String(b.id), businessName: String(b.name ?? '') }));\n };\n\n const fetchPage = async ({ query, page }: { query: string; page: number }) => {\n if (!api) return;\n\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n setIsLoading(true);\n try {\n const pagination: Pagination = {\n ...DEFAULT_PAGINATION,\n currentPage: page,\n filter: [\n {\n value: query,\n column: 'name',\n condition: '',\n },\n ],\n };\n\n const response = await api.fetchBusinessTableData({ pagination, signal: controller.signal });\n if (controller.signal.aborted) return;\n\n const next = mapBusinesses((response?.contactos ?? []) as any);\n setHasSearched(true);\n\n const total = response?.paginacion?.total ?? 0;\n\n setOptions((prev) => {\n const merged =\n page === 1\n ? next\n : (() => {\n const byId = new Map<string, SimplifiedBusiness>();\n for (const item of prev) byId.set(item.businessId, item);\n for (const item of next) byId.set(item.businessId, item);\n return Array.from(byId.values());\n })();\n\n if (total && merged.length >= total) {\n setAllLoaded(true);\n }\n\n return merged;\n });\n } finally {\n setIsLoading(false);\n setIsLoadingTimer(false);\n setIsNextPage(false);\n }\n };\n\n const handleQueryChanged = (value: string) => {\n resetSearchState();\n\n if (!value) return;\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n setIsLoadingTimer(true);\n\n timerRef.current = setTimeout(() => {\n void fetchPage({ query: value, page: 1 });\n }, 800);\n };\n\n const handleScroll = (e: UIEvent<HTMLElement>) => {\n const element = e.target as HTMLElement;\n const bottom = element.scrollHeight - element.scrollTop - element.clientHeight < 1;\n\n if (!bottom) return;\n if (allLoaded) return;\n if (isLoading) return;\n if (!inputValue) return;\n\n const nextPage = currentPage + 1;\n setIsNextPage(true);\n setCurrentPage(nextPage);\n void fetchPage({ query: inputValue, page: nextPage });\n };\n\n const handleCreateBusiness = async () => {\n if (!api) return;\n if (!ownerValue) return;\n\n const name = String(inputValue ?? '').trim();\n if (!name) return;\n\n setIsLoading(true);\n try {\n const business = {\n name,\n owner: ownerValue,\n imageUrl: '',\n members: [],\n tags: [],\n properties: [],\n address1: {\n street: '',\n city: '',\n state: '',\n zipcode: '',\n country: '',\n },\n address2: {\n street: '',\n city: '',\n state: '',\n zipcode: '',\n country: '',\n },\n };\n\n const created = await api.createBusiness({ business });\n const createdOption: SimplifiedBusiness = {\n businessId: String((created as any).id ?? ''),\n businessName: String((created as any).name ?? name),\n };\n\n setOptions([createdOption]);\n setSelected(createdOption);\n setHasSearched(true);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleSave = async () => {\n if (!baseUrl || !spaceId) return;\n if (!contactId) return;\n\n const businessId = selected?.businessId ?? '';\n\n const updated = await updateEntity({\n baseUrl,\n spaceId,\n entityType: 'contact',\n entityId: contactId,\n body: {\n businessId,\n },\n });\n\n onEntityUpdated?.(updated);\n onBack();\n };\n\n const noOptionsNode =\n hasSearched && options.length === 0 && inputValue ? (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n sx={{ px: 1, py: 0.5 }}\n >\n <Typography variant=\"body2\">{t('global.noOptions')}</Typography>\n <LoadingButton\n size=\"small\"\n variant=\"contained\"\n onClick={handleCreateBusiness}\n loading={isLoading}\n disabled={isLoading || !ownerValue}\n >\n {t('global.createNew')}\n </LoadingButton>\n </Stack>\n ) : (\n <Typography variant=\"body2\">{t('global.noOptions')}</Typography>\n );\n\n const isSavingDisabled = !contactId || !baseUrl || !spaceId;\n\n return (\n <Box sx={{ width: '100%' }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ mb: 2 }}>\n <IconButton size=\"small\" onClick={onBack} aria-label={t('global.back')}>\n <ArrowBackIcon fontSize=\"small\" />\n </IconButton>\n <Typography variant=\"subtitle1\">{t('conversations.contactDetails.business')}</Typography>\n\n <Box sx={{ flex: 1 }} />\n\n <LoadingButton\n variant=\"contained\"\n size=\"small\"\n startIcon={<SaveIcon />}\n onClick={handleSave}\n loading={false}\n disabled={isSavingDisabled}\n >\n {t('global.save')}\n </LoadingButton>\n </Stack>\n\n <Box sx={{ position: 'relative' }}>\n {isLoading || isLoadingTimer || isNextPage ? (\n <Box sx={{ position: 'absolute', left: 0, right: 0, top: 0 }}>\n <LinearProgress sx={{ borderRadius: 1 }} />\n </Box>\n ) : null}\n\n <Autocomplete\n fullWidth\n disablePortal\n value={selected}\n onChange={(event, newValue) => {\n void event;\n setSelected(newValue);\n }}\n inputValue={inputValue}\n onInputChange={(event, newValue, reason) => {\n void event;\n setInputValue(newValue);\n if (reason !== 'input') return;\n handleQueryChanged(newValue);\n }}\n options={options}\n getOptionLabel={(option) => option?.businessName ?? ''}\n isOptionEqualToValue={(opt, val) => opt.businessId === val.businessId}\n noOptionsText={noOptionsNode}\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n label={t('conversations.contactDetails.business')}\n placeholder={t('global.noValue')}\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <>\n {isLoading || isLoadingTimer ? (\n <CircularProgress size={18} sx={{ mr: 1 }} />\n ) : null}\n {params.InputProps.endAdornment}\n </>\n ),\n }}\n />\n )}\n ListboxProps={{\n sx: {\n maxHeight: 240,\n overflowY: 'auto',\n },\n onScroll: handleScroll,\n }}\n />\n </Box>\n </Box>\n );\n};\n\nexport default BusinessSelectEditor;\n","import {\r\n Backdrop,\r\n Box,\r\n CircularProgress,\r\n Fade,\r\n Modal,\r\n SxProps,\r\n Theme,\r\n IconButton,\r\n} from '@mui/material';\r\nimport { IBusiness, IContact } from '@trii/types/dist/Contacts/contacts';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport Header from './components/Header/Header';\r\nimport TagsEditor from './components/TagsEditor/TagsEditor';\r\nimport SearchLocationEditor from './components/SearchLocation/SearchLocationEditor';\r\n// Hooks\r\nimport { useMemo, useEffect, useRef } from 'react';\r\nimport { useEditContactModalController } from './hooks/useEditContactModalController';\r\nimport useImage from './hooks/useImage';\r\nimport { AddressInformation, ContactInformation, General } from './components/Section';\r\nimport { EditContactApiProvider } from './context/EditContactApiContext';\r\nimport { TranslationProvider } from './context/TranslationContext';\r\nimport { NavigateProvider } from './context/NavigateContext';\r\nimport { EditContactViewProvider } from './context/EditContactViewContext';\r\n// Services\r\nimport { createEditContactApi } from './services/api';\r\nimport { EditEntityProvider } from './context/EditEntityContext';\r\nimport { useEntityUpdateSync } from './hooks/useEntityUpdateSync';\r\nimport { useTagsEditorController } from './hooks/useTagsEditorController';\r\nimport { useModalCloseHandler } from './hooks/useModalCloseHandler';\r\nimport { useTranslation, I18nextProvider } from 'react-i18next';\r\nimport i18nInstance from '../../i18n/config';\r\nimport BusinessSelectEditor from './components/BusinessSelect/BusinessSelectEditor';\r\n\r\nexport interface Props {\r\n open: boolean;\r\n onClose: () => void;\r\n baseUrl?: string;\r\n spaceId?: string;\r\n contactId?: string;\r\n language?: 'en' | 'es';\r\n sx?: SxProps<Theme>;\r\n navigate: (path: string) => void;\r\n googleMapsApiKey?: string;\r\n onEntityUpdated?: (entity: IContact | IBusiness) => void;\r\n}\r\n\r\nconst EditContactModalContent = ({\r\n open,\r\n onClose,\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n sx,\r\n language = 'en',\r\n navigate,\r\n googleMapsApiKey,\r\n onEntityUpdated,\r\n}: Props) => {\r\n const { t: i18nT, i18n } = useTranslation();\r\n\r\n const modalContentRef = useRef<HTMLDivElement | null>(null);\r\n\r\n useEffect(() => {\r\n // Check if Google Maps is already loaded or loading\r\n if (\r\n (window as any).google?.maps ||\r\n document.querySelector('script[src^=\"https://maps.googleapis.com/maps/api/js\"]')\r\n ) {\r\n return;\r\n }\r\n\r\n if (!googleMapsApiKey) {\r\n console.warn('Google Maps API key is missing. The location search feature will not work.');\r\n return;\r\n }\r\n\r\n // Load the google maps script and append it to the document body\r\n const script = document.createElement('script');\r\n script.src = `https://maps.googleapis.com/maps/api/js?key=${googleMapsApiKey}&libraries=places`;\r\n script.async = true;\r\n script.defer = true;\r\n document.body.appendChild(script);\r\n\r\n // We typically don't remove the Google Maps script on unmount as it may be used by other components\r\n // and the API is designed to be loaded once.\r\n return () => {\r\n // document.body.removeChild(script);\r\n };\r\n }, [googleMapsApiKey]);\r\n\r\n useEffect(() => {\r\n if (language) {\r\n i18n.changeLanguage(language);\r\n }\r\n }, [language, i18n]);\r\n\r\n const t = (key: string) => i18nT(key);\r\n\r\n const api = useMemo(() => {\r\n if (!baseUrl || !spaceId) return null;\r\n return createEditContactApi(baseUrl, spaceId);\r\n }, [baseUrl, spaceId]);\r\n\r\n const { state, selectors, actions } = useEditContactModalController({\r\n open,\r\n baseUrl,\r\n spaceId,\r\n contactId,\r\n });\r\n\r\n const handleEntityUpdated = useEntityUpdateSync({\r\n entity: state.contactData,\r\n setEntity: (next) => {\r\n actions.setContactData(next ?? undefined);\r\n if (next && onEntityUpdated) {\r\n onEntityUpdated(next);\r\n }\r\n },\r\n });\r\n\r\n const {\r\n view,\r\n setView,\r\n draftLabels,\r\n setDraftLabels,\r\n labelsOptions,\r\n isSaving: isSavingTags,\r\n isCreatingLabel,\r\n handleCreateLabel,\r\n handleSaveTags,\r\n } = useTagsEditorController({\r\n open,\r\n baseUrl,\r\n spaceId,\r\n contactData: state.contactData,\r\n contactType: selectors.contactType,\r\n labels: selectors.labels,\r\n selectedTags: selectors.tags,\r\n onTagsUpdated: (tags) => {\r\n if (!state.contactData) return;\r\n const updatedEntity = { ...(state.contactData as any), tags };\r\n actions.setContactData(updatedEntity);\r\n if (onEntityUpdated) {\r\n onEntityUpdated(updatedEntity);\r\n }\r\n },\r\n });\r\n\r\n const image = useImage({\r\n baseUrl,\r\n spaceId,\r\n entityType:\r\n selectors.contactType === 'business' || selectors.contactType === 'contact'\r\n ? selectors.contactType\r\n : undefined,\r\n entityId: state.contactData ? String((state.contactData as any).id) : undefined,\r\n initialImageUrl: state.contactData?.imageUrl,\r\n onEntityUpdated: handleEntityUpdated,\r\n });\r\n\r\n const handleClose = useModalCloseHandler({ onClose });\r\n\r\n const baseSx: SxProps<Theme> = {\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n width: 'min(640px, calc(100vw - 32px))',\r\n height: 'min(560px, calc(100vh - 64px))',\r\n bgcolor: 'background.paper',\r\n borderRadius: 3,\r\n boxShadow: 24,\r\n outline: 0,\r\n p: 3,\r\n overflow: 'visible',\r\n };\r\n\r\n const mergedSx: SxProps<Theme> = Array.isArray(sx) ? [baseSx, ...sx] : sx ? [baseSx, sx] : baseSx;\r\n\r\n return (\r\n <EditContactApiProvider value={api}>\r\n <TranslationProvider t={t}>\r\n <NavigateProvider navigate={navigate}>\r\n <Modal\r\n open={open}\r\n onClose={handleClose}\r\n closeAfterTransition\r\n slots={{ backdrop: Backdrop }}\r\n slotProps={{ backdrop: { timeout: 200 } }}\r\n >\r\n <Fade in={open} timeout={200}>\r\n <Box sx={mergedSx} ref={modalContentRef}>\r\n <IconButton\r\n aria-label=\"close\"\r\n onClick={handleClose}\r\n sx={{\r\n position: 'absolute',\r\n right: 5,\r\n top: 5,\r\n color: (theme) => theme.palette.grey[500],\r\n zIndex: 1,\r\n }}\r\n size=\"small\"\r\n >\r\n <CloseIcon sx={{ fontSize: 20 }} />\r\n </IconButton>\r\n {state.isLoading && !state.contactData ? (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n minHeight: 220,\r\n }}\r\n >\r\n <CircularProgress />\r\n </Box>\r\n ) : state.error ? (\r\n <Box sx={{ mb: 2 }}>Failed to load contact</Box>\r\n ) : state.contactData ? (\r\n <EditContactViewProvider value={{ view, setView }}>\r\n <EditEntityProvider\r\n entityType={selectors.contactType === 'business' ? 'business' : 'contact'}\r\n entityData={state.contactData}\r\n customContactFields={selectors.contactFields}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n >\r\n <Box sx={{ position: 'relative', height: '100%' }}>\r\n <Fade in={view === 'main'} timeout={200} mountOnEnter unmountOnExit>\r\n <Box sx={{ pt: 0.5, position: 'absolute', inset: 0, overflowY: 'auto' }}>\r\n <Header\r\n imgUrl={image.imageUrl}\r\n displayName={selectors.displayName}\r\n tags={selectors.tags}\r\n onEditTags={() => {\r\n setView('tags');\r\n }}\r\n onUploadPhoto={image.action.uploadImage}\r\n onPhotoFileChange={image.inputAtributes.onChange}\r\n photoInputRef={image.inputAtributes.ref}\r\n isUploadingPhoto={image.isUploading}\r\n onDeletePhoto={image.action.deleteImage}\r\n isDeletingPhoto={image.isDeleting}\r\n contactType={selectors.contactType}\r\n entityId={state.contactData?.id}\r\n firstName={\r\n selectors.isContact\r\n ? (state.contactData as any).firstName\r\n : undefined\r\n }\r\n lastName={\r\n selectors.isContact\r\n ? (state.contactData as any).lastName\r\n : undefined\r\n }\r\n name={selectors.isBusiness ? state.contactData.name : undefined}\r\n onEntityUpdated={handleEntityUpdated}\r\n />\r\n <Box sx={{ px: 1, pb: 2 }}>\r\n <General\r\n dateFormat={selectors.userTrii?.regCon_dateFormat || 'MM/dd/yyyy'}\r\n entityType={\r\n selectors.contactType === 'contact' ||\r\n selectors.contactType === 'business'\r\n ? selectors.contactType\r\n : 'contact'\r\n }\r\n entityData={state.contactData}\r\n customContactFields={selectors.contactFields}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={handleEntityUpdated}\r\n currentUser={selectors.userTrii}\r\n />\r\n <AddressInformation\r\n entityType={\r\n selectors.contactType === 'contact' ||\r\n selectors.contactType === 'business'\r\n ? selectors.contactType\r\n : 'contact'\r\n }\r\n entityData={state.contactData}\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n onEntityUpdated={handleEntityUpdated}\r\n onDirectionSearchClick={() => setView('searchLocation')}\r\n />\r\n <ContactInformation ownerData={state.contactData} />\r\n </Box>\r\n </Box>\r\n </Fade>\r\n\r\n <Fade\r\n in={view === 'searchLocation'}\r\n timeout={200}\r\n mountOnEnter\r\n unmountOnExit\r\n >\r\n <Box sx={{ pt: 0.5, position: 'absolute', inset: 0, overflowY: 'auto' }}>\r\n <SearchLocationEditor\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n entityType={\r\n selectors.contactType === 'business' ? 'business' : 'contact'\r\n }\r\n entityId={String((state.contactData as any).id)}\r\n onBack={() => setView('main')}\r\n onEntityUpdated={handleEntityUpdated}\r\n />\r\n </Box>\r\n </Fade>\r\n\r\n <Fade in={view === 'tags'} timeout={200} mountOnEnter unmountOnExit>\r\n <Box sx={{ pt: 0.5, position: 'absolute', inset: 0, overflowY: 'auto' }}>\r\n <TagsEditor\r\n value={draftLabels}\r\n options={labelsOptions}\r\n onChange={setDraftLabels}\r\n onBack={() => setView('main')}\r\n onSave={handleSaveTags}\r\n isSaving={isSavingTags}\r\n onCreateNew={handleCreateLabel}\r\n isCreatingNew={isCreatingLabel}\r\n popperContainer={modalContentRef.current}\r\n />\r\n </Box>\r\n </Fade>\r\n\r\n <Fade\r\n in={view === 'businessSelect'}\r\n timeout={200}\r\n mountOnEnter\r\n unmountOnExit\r\n >\r\n <Box sx={{ pt: 0.5, position: 'absolute', inset: 0, overflowY: 'auto' }}>\r\n <BusinessSelectEditor\r\n baseUrl={baseUrl}\r\n spaceId={spaceId}\r\n contactId={String((state.contactData as any).id)}\r\n initialBusiness={\r\n selectors.isContact && (state.contactData as any)?.businessId\r\n ? {\r\n businessId: String((state.contactData as any).businessId),\r\n businessName: String(\r\n (state.contactData as any).businessName ?? '',\r\n ),\r\n }\r\n : null\r\n }\r\n onBack={() => setView('main')}\r\n onEntityUpdated={handleEntityUpdated}\r\n currentUser={selectors.userTrii}\r\n />\r\n </Box>\r\n </Fade>\r\n </Box>\r\n </EditEntityProvider>\r\n </EditContactViewProvider>\r\n ) : null}\r\n </Box>\r\n </Fade>\r\n </Modal>\r\n </NavigateProvider>\r\n </TranslationProvider>\r\n </EditContactApiProvider>\r\n );\r\n};\r\n\r\nconst EditContactModal = (props: Props) => {\r\n return (\r\n <I18nextProvider i18n={i18nInstance}>\r\n <EditContactModalContent {...props} />\r\n </I18nextProvider>\r\n );\r\n};\r\n\r\nexport default EditContactModal;\r\n"],"names":["f","require$$0","k","l","m","n","p","q","c","a","g","b","d","e","h","reactJsxRuntime_production_min","React","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_OFFSCREEN_TYPE","MAYBE_ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","maybeIterator","ReactSharedInternals","error","format","_len2","args","_key2","printWarning","level","ReactDebugCurrentFrame","stack","argsWithFormat","item","enableScopeAPI","enableCacheElement","enableTransitionTracing","enableLegacyHidden","enableDebugTracing","REACT_MODULE_REFERENCE","isValidElementType","type","getWrappedName","outerType","innerType","wrapperName","displayName","functionName","getContextName","getComponentNameFromType","context","provider","outerName","lazyComponent","payload","init","assign","disabledDepth","prevLog","prevInfo","prevWarn","prevError","prevGroup","prevGroupCollapsed","prevGroupEnd","disabledLog","disableLogs","props","reenableLogs","ReactCurrentDispatcher","prefix","describeBuiltInComponentFrame","name","source","ownerFn","x","match","reentry","componentFrameCache","PossiblyWeakMap","describeNativeComponentFrame","fn","construct","frame","control","previousPrepareStackTrace","previousDispatcher","Fake","sample","sampleLines","controlLines","s","_frame","syntheticFrame","describeFunctionComponentFrame","shouldConstruct","Component","prototype","describeUnknownElementTypeFrameInDEV","hasOwnProperty","loggedTypeFailures","setCurrentlyValidatingElement","element","owner","checkPropTypes","typeSpecs","values","location","componentName","has","typeSpecName","error$1","err","ex","isArrayImpl","isArray","typeName","value","hasToStringTag","willCoercionThrow","testStringCoercion","checkKeyStringCoercion","ReactCurrentOwner","RESERVED_PROPS","specialPropKeyWarningShown","specialPropRefWarningShown","didWarnAboutStringRefs","hasValidRef","config","getter","hasValidKey","warnIfStringRefCannotBeAutoConverted","self","defineKeyPropWarningGetter","warnAboutAccessingKey","defineRefPropWarningGetter","warnAboutAccessingRef","ReactElement","key","ref","jsxDEV","maybeKey","propName","defaultProps","ReactCurrentOwner$1","ReactDebugCurrentFrame$1","setCurrentlyValidatingElement$1","propTypesMisspellWarningShown","isValidElement","object","getDeclarationErrorAddendum","getSourceInfoErrorAddendum","fileName","lineNumber","ownerHasKeyUseWarning","getCurrentComponentErrorInfo","parentType","info","parentName","validateExplicitKey","currentComponentErrorInfo","childOwner","validateChildKeys","node","i","child","iteratorFn","iterator","step","validatePropTypes","propTypes","_name","validateFragmentProps","fragment","keys","didWarnAboutKeySpread","jsxWithValidation","isStaticChildren","validType","sourceInfo","typeString","children","beforeExample","afterExample","jsxWithValidationStatic","jsxWithValidationDynamic","jsx","jsxs","reactJsxRuntime_development","jsxRuntimeModule","require$$1","ButtonsContainer","styled","Box","theme","SmallIconButton","IconButton","HeaderContainer","ContactAvatar","Avatar","ContactName","Typography","LoadingContainer","Header","imgUrl","contactId","navigate","isLoading","onError","onClose","isBusiness","handleNavigation","useCallback","url","event","handleNavigateToContacts","handleNavigateToConversations","avatarAlt","ArrowForwardIcon","MessageIcon","CircularProgress","Container","TitleBox","StyledBox","IconBox","InfoContainer","AddressContainer","NoteText","ContactMethod","icon","contactList","title","showTitle","renderContactInfo","contact","Tooltip","SectionTitle","PropertyItem","PropertyText","PropertyIcon","Handyman","Properties","properties","getPropertyTitle","formatPropertyValue","isValidDate","moment","formatStr","ContactField_type","parts","start","end","startFormatted","endFormatted","property","TagContainer","StyledChip","Chip","LabelsSection","contactData","Fragment","tag","isContact","obj","BusinessSection","MemberItem","memberId","MembersSection","member","resources","en","es","i18nInstance","i18n","initReactI18next","PopupContainer","ContactInfoPopupContent","open","anchorEl","avatarImgUrl","language","i18nT","useTranslation","useEffect","t","dataIsBusiness","dataIsContact","contactMethods","PhoneEnabled","Email","WhatsApp","Facebook","Instagram","ThreeP","handleKeyDown","Popper","ClickAwayListener","CardContent","method","index","ContactInfoPopup","I18nextProvider","noop","TranslationContext","createContext","TranslationProvider","useTranslationContext","useContext","rest","Tags","tags","onEditTags","setAnchorEl","useState","safeTags","useMemo","visibleTags","hiddenCount","handleOpen","handleClose","Stack","EditIcon","LabelIcon","Popover","EditContactApiContext","EditContactApiProvider","useEditContactApi","NameText","NameWrapper","NameContainer","EditButton","contactType","firstName","lastName","entityId","onEntityUpdated","api","isEditing","setIsEditing","loading","setLoading","setValues","handleSave","body","updated","showEdit","TextField","Save","Edit","AvatarWithActions","src","alt","onUpload","onDelete","isUploading","isDeleting","PhotoCameraIcon","DeleteIcon","onUploadPhoto","onPhotoFileChange","photoInputRef","isUploadingPhoto","onDeletePhoto","isDeletingPhoto","PAGE_SIZE","AutocompletePopper","popperContainer","TagsEditor","options","onChange","onBack","onSave","isSaving","onCreateNew","isCreatingNew","searchValue","setSearchValue","limit","setLimit","deferredSearchValue","useDeferredValue","safeOptions","filteredOptions","o","visibleOptions","optionsWithSelectedValues","byId","selected","opt","handleSearchChange","_","newInputValue","onListboxScroll","CustomNoOptionsMessage","trimmedSearchValue","isDisabled","LoadingButton","ArrowBackIcon","SaveIcon","Autocomplete","newValue","option","v","createElement","tagValue","getTagProps","tagProps","params","ApiError","message","status","__publicField","requestJson","headers","signal","res","parsedBody","requestFormData","formData","joinUrl","baseUrl","path","normalizedBase","normalizedPath","getApiUrls","spaceId","encodedSpaceId","fetchLabels","urls","createLabel","fetchContact","fetchContactFields","forType","updateEntity","entityType","fetchBusinessTableData","pagination","createBusiness","business","deleteAddress","data","checkContactAddress","setContactAddress","updateContactAddress","fetchUserTrii","fetchUsers","fetchUserTriiById","userId","uploadAvatar","file","fd","createEditContactApi","isGoogleMapsLoaded","waitForGoogleMaps","maxWaitTime","resolve","startTime","interval","useGoogleMapsStatus","isLoaded","setIsLoaded","setIsLoading","setError","loaded","SearchLocationInput","onPlaceSelected","placeholder","inputRef","useRef","autocompleteRef","placeSelectedRef","errorRef","mapsError","currentPlaceholder","googleAny","observer","applyPacContainerStyles","container","el","mutations","mutation","listener","place","city","state","country","postalCode","streetName","streetNumber","components","component","types","lat","lng","result","EMPTY_DRAFT","SearchLocationEditor","draft","setDraft","query","setQuery","isSavingMain","setIsSavingMain","isSavingSecondary","setIsSavingSecondary","canSubmit","handlePlaceSelected","computedStreet","handleError","errorMessage","handleChange","next","prev","handleSaveMainAddress","handleSaveSecondaryAddress","useEditContactModalController","abortRef","setState","canFetch","canFetchLabels","controller","labels","canFetchUser","selectors","fields","useImage","initialImageUrl","imageUrl","setImageUrl","userTrii","setUserTrii","setIsUploading","setIsDeleting","canRequest","removeSasToken","removeCacheId","removeParams","ensureUserTrii","getImageURLWithAccessToken","rawUrl","storageAzureSAS","expireAt","expiredAtDate","sas","cacheId","setAccessImageUrl","withSas","uploadedUrl","uploadImage","deleteImage","useField","initialValue","setValue","helperText","setHelperText","errorMsg","useSelect","changeValue","resetValue","getRandomValues","rnds8","rng","byteToHex","unsafeStringify","arr","offset","randomUUID","e$9","v4","buf","native","rnds","createNewAddress","channelType","uuidv4","M","getEditedField","originalValue","editedValue","editedField","getAddressesWithUpdatedValues","newValueAddressId","addresses","address","fe","useEditContactMethods","initial","dispatch","isDeletingAddress","setIsDeletingAddress","initialSnapshot","setInitialSnapshot","imsFacebooks","setImsFacebooks","imsMercadolibre","setImsMercadolibre","imsWebchats","setImsWebchats","imsInstagrams","setImsInstagrams","imsWhatsapp","setImsWhatsApp","emails","setEmails","phoneNumbers","setPhoneNumbers","imsRCS","setImsRCS","addPhone","newPhone","contactHelper","ChannelType","newPhoneNumbers","addEmail","newEmail","newEmails","addWhatsapp","newWhatsapp","newWhatsapps","addRCS","newRCS","newRCSs","addWhatsappVerified","updatedWhatsapps","replaceAddress","addressId","newAddress","email","phoneNumber","newImsWhatsapp","newImsRCS","newImsMercadolibre","handleAddressFieldChange","fieldId","editContactHelper","handleNoteFieldChange","addressType","newImsFacebooks","imsFacebook","newImsWebchats","imsWebchat","newImsInstagrams","imsInstagram","handleDeleteAddress","resetToInitialContactInformation","useMultipleSelect","initialState","hasNewObject","newItem","currentItem","prevState","useEditBusiness","customContactFields","apiDeleteAddress","apiDispatch","maybePromise","customProperties","setCustomProperties","contactImage","contactPropietary","labelMultipleSelect","selectedContacts","setSelectedContacts","homeAddress","secondaryHomeAddress","secondaryCity","secondaryState","secondaryPostalCode","secondaryCountry","getEditedBusiness","address1","address2","resetCustomProperty","nameKey","normalizeNameKey","input","defaultProperty","updatedProperties","getFilteredCustomProperties","customField","existingBusinessProperty","existingLocalProperty","useEditContact","contactFirstname","contactLastname","birthDate","setBirthDate","dayjs","getEditedContact","currentContact","modifiedTags","modifiedPhones","id","modifiedEmails","resetSelectedBusiness","resetBirthDate","existingProperty","EditEntityContext","EditContactEntityProvider","editEntity","EditBusinessEntityProvider","EditEntityProvider","entityData","useEditEntity","ctx","resolveUserLabel","users","currentUser","fromUsers","u","Section","enableDirectionSearch","onDirectionSearchClick","Button","AddLocationAltIcon","Divider","SectionContent","boxProps","DateSelect","dateFormat","userDateFormat","LocalizationProvider","AdapterDayjs","DatePicker","EditContactViewContext","EditContactViewProvider","useEditContactView","NavigateContext","NavigateProvider","useNavigateContext","SelectBusinessLabel","displayValue","businessId","businessData","setBusinessData","userImage","isLoadingData","setIsLoadingData","targetElement","response","isUserInfo","isContactBirthdayProps","StyledIconButton","StyledSaveCancelButton","EntityInfoLabel","isNotEditable","minWidth","setView","inputType","setIsSaving","titleRef","isTitleTruncated","setIsTitleTruncated","inputValue","setInputValue","check","rafId","ro","handleEditClick","handleInputChange","handleSelectChange","handleCancel","updatedValue","parsedDate","updatedContactData","updatedBusinessData","selectValue","textValue","resolvedMinWidth","CancelIcon","Select","MenuItem","ContactInfoLabel","constructUpdateObject","CustomPropertyInput","handleNumberTypeChange","handleIntegerNumberTypeChange","handleTextTypeChange","sanitizedInput","CustomPropertyDatePicker","CustomPropertyOptionsSelect","FormControl","CustomPropertyTimePicker","userTimeFormat","is24HourFormat","TimePicker","CustomPropertyTimeRangePicker","initDates","timeFormat","MultiInputTimeRangeField","position","CustomPropertyDateRangePicker","MultiInputDateRangeField","ContactBox","FieldName","FieldValue","EntityCustomFieldLabel","entity","isNumericType","shouldBeNumeric","normalizeValue","num","toggleEdit","current","effectiveType","finalValue","dayjsValue","nextProperties","getPropertyName","propertyNameKey","field","hasValue","val","EditField","CustomPropertyOptionSelect","startParsed","endParsed","timeValue","ContactGeneral","setUsers","setOwner","updatedBy","setUpdatedBy","createdBy","setCreatedBy","editContact","getRemoteLabel","ownerLabel","createdByLabel","updatedByLabel","dateOnlyString","calculateAge","today","age","BusinessInfoLabel","BusinessGeneral","editBusiness","General","useEditModal","isOpen","setIsOpen","setTitle","LeftSection","RightSection","ContactDetails","AvatarWrapper","EllipsisText","PhoneText","ProfileNameText","ContactMethodItem","avatarUrlWithoutAccess","Star","StarBorder","phoneUtil","PhoneNumberUtil","formatPhoneForDisplay","number","parsed","PhoneNumberFormat","StyledLocalPhoneIcon","LocalPhoneIcon","ContactMethodPhoneItem","handleCallContact","contactPhone","formattedPhone","StyledTypography","HeaderBox","MethodItemsBox","methodItems","isPhone","handleEdit","SubsectionHeader","subsectionHeaderWithButtonStyle","SubsectionHeaderWithButton","handleAdd","AddIcon","informationItemContainerStyle","InformationItemContainer","noteDeleteButtonStyle","OptionsMenu","addressData","handleLinkAccountSave","checked","onCheckContactAddress","verifying","setVerifying","verificationResult","setVerificationResult","modalOpen","setModalOpen","handleClick","handleModalClose","handleDelete","handleCheckWA","handleCheckRCS","handleLinkAccount","MoreVertIcon","Menu","ListItemIcon","ListItemText","WhatsAppIcon","MmsIcon","Modal","NoteDeleteButton","entityIdFromContext","note","addressIsSaved","handleSetAddress","handleUpdateAddress","informationItemInputsContainerStyle","InformationItemInputsContainer","subsectionBodyContainerStyle","SubsectionBodyContainer","Adornment","CheckRoundedIcon","CloseRoundedIcon","StatusAdornment","text","InputAdornment","imsStyle","Ims","editActions","Body","IMSs","ims","InformationSocialNetworkItem","style","AddressInput","setWarnings","adornmentStatus","setAdornmentStatus","lastSearch","setLastSearch","timer","checkContactAddressData","success","warnings","PhoneInput","Warning","Grid","WarningIcon","WarningsDisplay","warning","phoneStyle","Phone","mode","editEntityActions","editEntityState","setChecked","phone","Phones","mailStyle","Mail","Mails","Whatsapp","whatsapps","whatsapp","Whatsapps","RCS","RCSs","StyledModalContent","EditModal","ContactInformation","ownerData","openModal","closeModal","phones","facebook","mercadolibre","webchat","instagram","rcs","AddressInformation","commonProps","AddressGroup","addressNumber","useEntityUpdateSync","setEntity","update","updateObj","merged","useTagsEditorController","selectedTags","onTagsUpdated","view","draftLabels","setDraftLabels","tagsEditorInitialized","setTagsEditorInitialized","createdLabels","setCreatedLabels","isCreatingLabel","setIsCreatingLabel","labelsOptions","safeLabels","safeCreated","label","reset","selectedTagIds","initialDraft","handleCreateLabel","trimmedName","normalizedName","existing","safePrev","created","handleSaveTags","useModalCloseHandler","_event","reason","DEFAULT_PAGINATION","BusinessSelectEditor","initialBusiness","timerRef","hasSearched","setHasSearched","isLoadingTimer","setIsLoadingTimer","setOptions","setSelected","currentPage","setCurrentPage","isNextPage","setIsNextPage","allLoaded","setAllLoaded","ownerValue","resetSearchState","mapBusinesses","businesses","fetchPage","page","total","handleQueryChanged","handleScroll","nextPage","handleCreateBusiness","createdOption","noOptionsNode","isSavingDisabled","LinearProgress","EditContactModalContent","sx","googleMapsApiKey","modalContentRef","script","actions","handleEntityUpdated","isSavingTags","updatedEntity","image","baseSx","mergedSx","Backdrop","Fade","CloseIcon","EditContactModal"],"mappings":"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","x_google_ignoreList":[0,1,2,33,34,35,36]}
|