mirror of
https://github.com/lingble/chatwoot.git
synced 2025-10-31 19:17:48 +00:00
When Vue 3 is used with options API, any assignment to `this.<something>` is converted to a Proxy before assignment. This is fine as long as we are in the options context, problem arises when we access this in a `composable` any mutations on the object doesn't behave correctly as expected, this PR fixes that by moving the `automation` object inside the composable and using it in the options. > Another option to fix such an issue is to make the object non-reactive, like done in places where we have `editorView`, but that wasn't viable here --------- Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
200 lines
5.5 KiB
JavaScript
200 lines
5.5 KiB
JavaScript
import { ref, computed } from 'vue';
|
|
import { useStoreGetters } from 'dashboard/composables/store';
|
|
import { useAlert } from 'dashboard/composables';
|
|
import { useI18n } from 'vue-i18n';
|
|
|
|
import {
|
|
generateCustomAttributeTypes,
|
|
getDefaultConditions,
|
|
getDefaultActions,
|
|
generateCustomAttributes,
|
|
} from 'dashboard/helper/automationHelper';
|
|
import useAutomationValues from './useAutomationValues';
|
|
|
|
import {
|
|
// AUTOMATION_RULE_EVENTS,
|
|
// AUTOMATION_ACTION_TYPES,
|
|
AUTOMATIONS,
|
|
} from 'dashboard/routes/dashboard/settings/automation/constants.js';
|
|
|
|
/**
|
|
* Composable for handling automation-related functionality.
|
|
* @returns {Object} An object containing various automation-related functions and computed properties.
|
|
*/
|
|
export function useAutomation(startValue = null) {
|
|
const getters = useStoreGetters();
|
|
const { t } = useI18n();
|
|
|
|
const {
|
|
booleanFilterOptions,
|
|
statusFilterOptions,
|
|
getConditionDropdownValues,
|
|
getActionDropdownValues,
|
|
agents,
|
|
campaigns,
|
|
contacts,
|
|
inboxes,
|
|
labels,
|
|
teams,
|
|
slaPolicies,
|
|
} = useAutomationValues();
|
|
|
|
const automation = ref(startValue);
|
|
const automationTypes = structuredClone(AUTOMATIONS);
|
|
const eventName = computed(() => automation.value?.event_name);
|
|
|
|
/**
|
|
* Handles the event change for an automation.value.
|
|
*/
|
|
const onEventChange = () => {
|
|
automation.value.conditions = getDefaultConditions(eventName.value);
|
|
automation.value.actions = getDefaultActions();
|
|
};
|
|
|
|
/**
|
|
* Appends a new condition to the automation.value.
|
|
*/
|
|
const appendNewCondition = () => {
|
|
const defaultCondition = getDefaultConditions(eventName.value);
|
|
automation.value.conditions = [
|
|
...automation.value.conditions,
|
|
...defaultCondition,
|
|
];
|
|
};
|
|
|
|
/**
|
|
* Appends a new action to the automation.value.
|
|
*/
|
|
const appendNewAction = () => {
|
|
const defaultAction = getDefaultActions();
|
|
automation.value.actions = [...automation.value.actions, ...defaultAction];
|
|
};
|
|
|
|
/**
|
|
* Removes a filter from the automation.value.
|
|
* @param {number} index - The index of the filter to remove.
|
|
*/
|
|
const removeFilter = index => {
|
|
if (automation.value.conditions.length <= 1) {
|
|
useAlert(t('AUTOMATION.CONDITION.DELETE_MESSAGE'));
|
|
} else {
|
|
automation.value.conditions = automation.value.conditions.filter(
|
|
(_, i) => i !== index
|
|
);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Removes an action from the automation.value.
|
|
* @param {number} index - The index of the action to remove.
|
|
*/
|
|
const removeAction = index => {
|
|
if (automation.value.actions.length <= 1) {
|
|
useAlert(t('AUTOMATION.ACTION.DELETE_MESSAGE'));
|
|
} else {
|
|
automation.value.actions = automation.value.actions.filter(
|
|
(_, i) => i !== index
|
|
);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Resets a filter in the automation.value.
|
|
* @param {Object} automationTypes - The automation types object.
|
|
* @param {number} index - The index of the filter to reset.
|
|
* @param {Object} currentCondition - The current condition object.
|
|
*/
|
|
const resetFilter = (index, currentCondition) => {
|
|
const newConditions = [...automation.value.conditions];
|
|
|
|
newConditions[index] = {
|
|
...newConditions[index],
|
|
filter_operator: automationTypes[eventName.value].conditions.find(
|
|
condition => condition.key === currentCondition.attribute_key
|
|
).filterOperators[0].value,
|
|
values: '',
|
|
};
|
|
|
|
automation.value.conditions = newConditions;
|
|
};
|
|
|
|
/**
|
|
* Resets an action in the automation.value.
|
|
* @param {number} index - The index of the action to reset.
|
|
*/
|
|
const resetAction = index => {
|
|
const newActions = [...automation.value.actions];
|
|
newActions[index] = {
|
|
...newActions[index],
|
|
action_params: [],
|
|
};
|
|
|
|
automation.value.actions = newActions;
|
|
};
|
|
|
|
/**
|
|
* This function formats the custom attributes for automation types.
|
|
* It retrieves custom attributes for conversations and contacts,
|
|
* generates custom attribute types, and adds them to the relevant automation types.
|
|
*/
|
|
const manifestCustomAttributes = () => {
|
|
const conversationCustomAttributesRaw = getters[
|
|
'attributes/getAttributesByModel'
|
|
].value('conversation_attribute');
|
|
const contactCustomAttributesRaw =
|
|
getters['attributes/getAttributesByModel'].value('contact_attribute');
|
|
|
|
const conversationCustomAttributeTypes = generateCustomAttributeTypes(
|
|
conversationCustomAttributesRaw,
|
|
'conversation_attribute'
|
|
);
|
|
const contactCustomAttributeTypes = generateCustomAttributeTypes(
|
|
contactCustomAttributesRaw,
|
|
'contact_attribute'
|
|
);
|
|
|
|
const manifestedCustomAttributes = generateCustomAttributes(
|
|
conversationCustomAttributeTypes,
|
|
contactCustomAttributeTypes,
|
|
t('AUTOMATION.CONDITION.CONVERSATION_CUSTOM_ATTR_LABEL'),
|
|
t('AUTOMATION.CONDITION.CONTACT_CUSTOM_ATTR_LABEL')
|
|
);
|
|
|
|
[
|
|
'message_created',
|
|
'conversation_created',
|
|
'conversation_updated',
|
|
'conversation_opened',
|
|
].forEach(eventToUpdate => {
|
|
automationTypes[eventToUpdate].conditions = [
|
|
...automationTypes[eventToUpdate].conditions,
|
|
...manifestedCustomAttributes,
|
|
];
|
|
});
|
|
};
|
|
|
|
return {
|
|
automation,
|
|
automationTypes,
|
|
agents,
|
|
campaigns,
|
|
contacts,
|
|
inboxes,
|
|
labels,
|
|
teams,
|
|
slaPolicies,
|
|
booleanFilterOptions,
|
|
statusFilterOptions,
|
|
onEventChange,
|
|
getConditionDropdownValues,
|
|
appendNewCondition,
|
|
appendNewAction,
|
|
removeFilter,
|
|
removeAction,
|
|
resetFilter,
|
|
resetAction,
|
|
getActionDropdownValues,
|
|
manifestCustomAttributes,
|
|
};
|
|
}
|