Compare commits

..
Author SHA1 Message Date
Shivam Mishra 68ed5a4b4f chore: source account id directly 2024-10-08 18:52:34 +05:30
Shivam Mishra 7ecb993d06 chore: force init account 2024-10-08 18:49:26 +05:30
Shivam Mishra c00a157c03 chore: more log 2024-10-08 18:45:08 +05:30
Shivam Mishra 3750689bee chore: debug debug 2024-10-08 18:43:37 +05:30
Shivam Mishra 0511bf4ba6 chore: more debug 2024-10-08 18:34:06 +05:30
Shivam Mishra 9f50638a40 chore: more logs 2024-10-08 18:30:59 +05:30
Shivam Mishra f5ac272e3b chore: logs 2024-10-08 18:18:49 +05:30
Shivam Mishra 2ba7318817 chore: more try 2024-10-08 18:14:58 +05:30
Shivam Mishra 412303d1cd chore: try i18n 2024-10-08 15:20:35 +05:30
Shivam Mishra 47b9399208 feat: setup fallback 2024-10-08 14:01:57 +05:30
Shivam Mishra 0830ad78b6 chore: try 2024-10-08 13:53:58 +05:30
Shivam Mishra 0b8df762f9 chore: more debug 2024-10-08 12:38:03 +05:30
Shivam Mishra f24c87f9b2 chore: try 2024-10-08 12:28:48 +05:30
Shivam Mishra f62a4170b6 chore: debug 2024-10-08 12:20:14 +05:30
Shivam Mishra 2f090dbc61 Revert "chore: don't use async"
This reverts commit 9101e1e221.
2024-10-08 11:54:02 +05:30
Shivam Mishra ec17682d7a chore: move to created 2024-10-08 11:53:55 +05:30
Shivam Mishra 7861ce8c47 chore: revert iframe helper 2024-10-08 11:42:09 +05:30
Shivam Mishra e5de41fea4 chore: revert console.logs 2024-10-08 11:41:40 +05:30
Shivam Mishra adb0e94cbd chore: remove logs 2024-10-08 11:40:53 +05:30
Shivam Mishra 42fb083491 chore: debug 2024-10-08 11:31:33 +05:30
Shivam Mishra 9101e1e221 chore: don't use async 2024-10-08 11:18:13 +05:30
Shivam Mishra 91bac16c29 chore: add more error log 2024-10-08 11:00:21 +05:30
Shivam Mishra 97699f3087 chore: log errors 2024-10-08 10:59:42 +05:30
Shivam Mishra 1242cfd704 chore: add logs for iframhelper 2024-10-08 10:57:13 +05:30
Shivam Mishra 6963c668bf chore: add console logs 2024-10-08 10:49:56 +05:30
43 changed files with 138 additions and 1170 deletions
@@ -1,15 +1,6 @@
class Google::CallbacksController < OauthCallbackController
include GoogleConcern
def find_channel_by_email
# find by imap_login first, and then by email
# this ensures the legacy users can migrate correctly even if inbox email address doesn't match
imap_channel = Channel::Email.find_by(imap_login: users_data['email'], account: account)
return imap_channel if imap_channel
Channel::Email.find_by(email: users_data['email'], account: account)
end
private
def provider_name
+1 -5
View File
@@ -25,7 +25,7 @@ class OauthCallbackController < ApplicationController
end
def find_or_create_inbox
channel_email = find_channel_by_email
channel_email = Channel::Email.find_by(email: users_data['email'], account: account)
# we need this value to know where to redirect on sucessful processing of the callback
channel_exists = channel_email.present?
@@ -39,10 +39,6 @@ class OauthCallbackController < ApplicationController
[channel_email.inbox, channel_exists]
end
def find_channel_by_email
Channel::Email.find_by(email: users_data['email'], account: account)
end
def update_channel(channel_email)
channel_email.update!({
imap_login: users_data['email'], imap_address: imap_address,
+19 -13
View File
@@ -13,7 +13,6 @@ import { useStore } from 'dashboard/composables/store';
import WootSnackbarBox from './components/SnackbarContainer.vue';
import { setColorTheme } from './helper/themeHelper';
import { isOnOnboardingView } from 'v3/helpers/RouteHelper';
import { useAccount } from 'dashboard/composables/useAccount';
import {
registerSubscription,
verifyServiceWorkerExistence,
@@ -36,9 +35,8 @@ export default {
setup() {
const router = useRouter();
const store = useStore();
const { accountId } = useAccount();
return { router, store, currentAccountId: accountId };
return { router, store };
},
data() {
return {
@@ -54,7 +52,11 @@ export default {
currentUser: 'getCurrentUser',
authUIFlags: 'getAuthUIFlags',
accountUIFlags: 'accounts/getUIFlags',
// currentAccountId: 'getCurrentAccountId',
}),
currentAccountId() {
return this.$route.params.accountId;
},
hasAccounts() {
const { accounts = [] } = this.currentUser || {};
return accounts.length > 0;
@@ -70,19 +72,23 @@ export default {
this.showAddAccountModal = true;
}
},
currentAccountId: {
immediate: true,
handler() {
if (this.currentAccountId) {
this.initializeAccount();
}
},
currentAccountId() {
console.log('THIS CALL', this.currentAccountId);
if (this.currentAccountId) {
this.initializeAccount();
} else {
console.log('NO ACCOUNT ID');
}
},
},
mounted() {
created() {
this.setLocale(window.chatwootConfig.selectedLocale);
},
async mounted() {
this.setLocale(window.chatwootConfig.selectedLocale);
this.initializeColorTheme();
this.listenToThemeChanges();
this.setLocale(window.chatwootConfig.selectedLocale);
await this.$store.dispatch('accounts/get');
},
unmounted() {
if (this.reconnectService) {
@@ -98,7 +104,7 @@ export default {
mql.onchange = e => setColorTheme(e.matches);
},
setLocale(locale) {
this.$root.$i18n.locale = locale;
this.$i18n.locale = locale;
},
async initializeAccount() {
await this.$store.dispatch('accounts/get');
@@ -2,7 +2,6 @@
import { mapGetters } from 'vuex';
import { getSidebarItems } from './config/default-sidebar';
import { useKeyboardEvents } from 'dashboard/composables/useKeyboardEvents';
import { useAccount } from 'dashboard/composables/useAccount';
import { useRoute, useRouter } from 'vue-router';
import PrimarySidebar from './sidebarComponents/Primary.vue';
@@ -34,7 +33,6 @@ export default {
setup(props, { emit }) {
const route = useRoute();
const router = useRouter();
const { accountId } = useAccount();
const toggleKeyShortcutModal = () => {
emit('openKeyShortcutModal');
@@ -74,7 +72,6 @@ export default {
return {
toggleKeyShortcutModal,
accountId,
};
},
data() {
@@ -85,6 +82,7 @@ export default {
computed: {
...mapGetters({
accountId: 'getCurrentAccountId',
currentUser: 'getCurrentUser',
globalConfig: 'globalConfig/get',
inboxes: 'inboxes/getInboxes',
@@ -122,6 +120,7 @@ export default {
this.currentUser,
this.accountId
);
const menuItems = this.sideMenuConfig.primaryMenu;
return menuItems.filter(menuItem => {
const isAvailableForTheUser = hasPermissions(
@@ -132,6 +131,7 @@ export default {
if (!isAvailableForTheUser) {
return false;
}
if (
menuItem.alwaysVisibleOnChatwootInstances &&
!this.isACustomBrandedInstance
@@ -139,10 +139,12 @@ export default {
return true;
}
if (menuItem.featureFlag) {
return this.isFeatureEnabledonAccount(
const isEnabled = this.isFeatureEnabledonAccount(
this.accountId,
menuItem.featureFlag
);
return isEnabled;
}
return true;
});
@@ -50,6 +50,9 @@ export default {
showOptionsMenu: false,
};
},
mounted() {
console.log('MENU ITEMS', this.menuItems);
},
methods: {
frontendURL,
toggleOptions() {
@@ -90,17 +93,13 @@ export default {
/>
</div>
<div class="flex flex-col items-center justify-end pb-6">
<a
<PrimaryNavItem
v-if="!isACustomBrandedInstance"
v-tooltip.right="$t(`SIDEBAR.DOCS`)"
:href="helpDocsURL"
class="text-slate-700 dark:text-slate-100 w-10 h-10 my-2 flex items-center justify-center rounded-lg hover:bg-slate-25 dark:hover:bg-slate-700 dark:hover:text-slate-100 hover:text-slate-600 relative"
rel="noopener noreferrer nofollow"
target="_blank"
>
<fluent-icon icon="book-open-globe" />
<span class="sr-only">{{ $t(`SIDEBAR.DOCS`) }}</span>
</a>
icon="book-open-globe"
name="DOCS"
open-in-new-page
:to="helpDocsURL"
/>
<NotificationBell @open-notification-panel="openNotificationPanel" />
<AgentDetails @toggle-menu="toggleOptions" />
<OptionsMenu
@@ -26,6 +26,13 @@ export default {
default: false,
},
},
mounted() {
console.log(
'MOUNTED: PRIMARY NAV ITEM',
this.name,
this.$t(`SIDEBAR.${this.name}`)
);
},
};
</script>
@@ -48,7 +48,7 @@ const debouncedEmit = debounce(value => {
const onSearch = value => {
searchTerm.value = value;
debouncedEmit(value);
debouncedEmit();
};
const filteredListItems = computed(() => {
@@ -1,5 +1,5 @@
<script>
import { Letter } from 'vue-letter';
import Letter from 'vue-letter';
import GalleryView from '../components/GalleryView.vue';
export default {
@@ -1,15 +1,14 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { ref } from 'vue';
import { describe, it, expect, vi } from 'vitest';
import { useAccount } from '../useAccount';
import { useRoute } from 'vue-router';
import { useStoreGetters } from 'dashboard/composables/store';
vi.mock('vue-router');
vi.mock('dashboard/composables/store');
describe('useAccount', () => {
beforeEach(() => {
useRoute.mockReturnValue({
params: {
accountId: 123,
},
useStoreGetters.mockReturnValue({
getCurrentAccountId: ref(123),
});
});
@@ -1,20 +1,18 @@
import { computed } from 'vue';
import { useRoute } from 'vue-router';
import { useStoreGetters } from 'dashboard/composables/store';
/**
* Composable for account-related operations.
* @returns {Object} An object containing account-related properties and methods.
*/
export function useAccount() {
const getters = useStoreGetters();
/**
* Computed property for the current account ID.
* @type {import('vue').ComputedRef<number>}
*/
const route = useRoute();
const accountId = computed(() => {
return Number(route.params.accountId);
});
const accountId = computed(() => getters.getCurrentAccountId.value);
/**
* Generates an account-scoped URL.
@@ -29,7 +29,7 @@ const showNewButton = computed(
button-route="new"
:icon="icon"
:header-title="t(headerTitle)"
:button-text="t(headerButtonText)"
:button-text="headerButtonText ? t(headerButtonText) : ''"
:show-back-button="showBackButton"
:back-url="backUrl"
:show-new-button="showNewButton"
@@ -5,7 +5,6 @@ import { mapGetters } from 'vuex';
import { useAlert } from 'dashboard/composables';
import { useUISettings } from 'dashboard/composables/useUISettings';
import { useConfig } from 'dashboard/composables/useConfig';
import { useAccount } from 'dashboard/composables/useAccount';
import { FEATURE_FLAGS } from '../../../../featureFlags';
import semver from 'semver';
import { getLanguageDirection } from 'dashboard/components/widgets/conversation/advancedFilterItems/languages';
@@ -14,10 +13,9 @@ export default {
setup() {
const { updateUISettings } = useUISettings();
const { enabledLanguages } = useConfig();
const { accountId } = useAccount();
const v$ = useVuelidate();
return { updateUISettings, v$, enabledLanguages, accountId };
return { updateUISettings, v$, enabledLanguages };
},
data() {
return {
@@ -48,6 +46,7 @@ export default {
globalConfig: 'globalConfig/get',
getAccount: 'accounts/getAccount',
uiFlags: 'accounts/getUIFlags',
accountId: 'getCurrentAccountId',
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
}),
showAutoResolutionConfig() {
@@ -96,8 +95,8 @@ export default {
return this.id.toString();
},
},
mounted() {
this.initializeAccount();
async mounted() {
await this.initializeAccount();
},
methods: {
async initializeAccount() {
@@ -113,7 +112,7 @@ export default {
latest_chatwoot_version: latestChatwootVersion,
} = this.getAccount(this.accountId);
this.$root.$i18n.locale = locale;
this.$i18n.locale = locale;
this.name = name;
this.locale = locale;
this.id = id;
@@ -141,7 +140,7 @@ export default {
support_email: this.supportEmail,
auto_resolve_duration: this.autoResolveDuration,
});
this.$root.$i18n.locale = this.locale;
this.$i18n.locale = this.locale;
this.getAccount(this.id).locale = this.locale;
this.updateDirectionView(this.locale);
useAlert(this.$t('GENERAL_SETTINGS.UPDATE.SUCCESS'));
@@ -47,7 +47,7 @@ const emailProviderList = computed(() => {
function onClick(emailProvider) {
if (emailProvider.isEnabled) {
provider.value = emailProvider.key;
this.provider = emailProvider.key;
}
}
</script>
@@ -1,5 +1,5 @@
<script setup>
import { ref, computed } from 'vue';
import { ref } from 'vue';
import InboxReconnectionRequired from '../../components/InboxReconnectionRequired.vue';
import googleClient from 'dashboard/api/channel/googleClient';
@@ -17,18 +17,11 @@ const { t } = useI18n();
const isRequestingAuthorization = ref(false);
const inboxEmail = computed(() => {
if (props.inbox.imap_login && props.inbox.imap_enabled) {
return props.inbox.imap_login;
}
return props.inbox.email;
});
async function requestAuthorization() {
try {
isRequestingAuthorization.value = true;
const response = await googleClient.generateAuthorization({
email: inboxEmail.value,
email: props.inbox.email,
});
const {
@@ -125,7 +125,7 @@ export default {
"
data-testid="app-title"
@input="v$.app.title.$touch"
@blur="v$.app.title.$touch"
@blur="v$.slug.$touch"
/>
<woot-input
v-model="app.content.url"
@@ -43,7 +43,11 @@ export const getters = {
return diffDays <= TRIAL_PERIOD_DAYS;
},
isFeatureEnabledonAccount: $state => (id, featureName) => {
console.log('----------------------------------------------------');
console.log('CHECK ENABLED for', featureName, id);
console.log($state, findRecordById($state, id));
const { features = {} } = findRecordById($state, id);
console.log('FEATURES', features, features[featureName]);
return features[featureName] || false;
},
};
@@ -1,5 +1,4 @@
import types from '../../mutation-types';
import * as Sentry from '@sentry/vue';
export const mutations = {
[types.SET_CONTACT_UI_FLAG]($state, data) {
@@ -49,23 +48,12 @@ export const mutations = {
[types.DELETE_CONTACT]: ($state, id) => {
const index = $state.sortOrder.findIndex(item => item === id);
$state.sortOrder.splice(index, 1);
delete $state.records[id];
$state.records[id] = null;
},
[types.UPDATE_CONTACTS_PRESENCE]: ($state, data) => {
Object.values($state.records).forEach(element => {
let availabilityStatus;
try {
availabilityStatus = data[element.id];
} catch (error) {
Sentry.setContext('contact is undefined', {
records: $state.records,
data: data,
});
Sentry.captureException(error);
return;
}
const availabilityStatus = data[element.id];
if (availabilityStatus) {
$state.records[element.id].availability_status = availabilityStatus;
} else {
@@ -33,7 +33,7 @@ export const mutations = {
// On reconnect, if there is existing notification with same primary_actor_id,
// it will be deleted and the new one will be added. So it will solve with duplicate notification
if (existingNotification) {
delete $state.records[existingNotification.id];
$state.records[existingNotification.id] = undefined;
}
$state.records[notification.id] = {
@@ -72,7 +72,7 @@ export const mutations = {
},
[types.DELETE_NOTIFICATION]($state, data) {
const { notification, unread_count: unreadCount, count } = data;
delete $state.records[notification.id];
$state.records[notification.id] = undefined;
$state.meta.unreadCount = unreadCount;
$state.meta.count = count;
},
@@ -83,7 +83,7 @@ export const mutations = {
[types.DELETE_READ_NOTIFICATIONS]: $state => {
Object.values($state.records).forEach(item => {
if (item.read_at) {
delete $state.records[item.id];
$state.records[item.id] = undefined;
}
});
},
@@ -1,21 +0,0 @@
@import 'dashboard/assets/scss/app';
*,
::before,
::after {
--_histoire-color-primary-50: 235 245 255;
--_histoire-color-primary-100: 194 225 255;
--_histoire-color-primary-200: 153 206 255;
--_histoire-color-primary-300: 112 186 255;
--_histoire-color-primary-400: 71 166 255;
--_histoire-color-primary-500: 31 147 255;
--_histoire-color-primary-600: 25 118 204;
--_histoire-color-primary-700: 19 88 153;
--_histoire-color-primary-800: 12 59 102;
--_histoire-color-primary-900: 6 29 51;
}
html,
body {
font-family: 'Inter', sans-serif;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="512px" height="512px" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>woot-log</title>
<desc>Created with Sketch.</desc>
<g id="Logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="woot-log" fill-rule="nonzero">
<circle id="Oval" fill="#47A7F6" cx="256" cy="256" r="256"></circle>
<path d="M362.807947,368.807947 L244.122956,368.807947 C178.699407,368.807947 125.456954,315.561812 125.456954,250.12177 C125.456954,184.703089 178.699407,131.456954 244.124143,131.456954 C309.565494,131.456954 362.807947,184.703089 362.807947,250.12177 L362.807947,368.807947 Z" id="Fill-1" stroke="#FFFFFF" stroke-width="6" fill="#FFFFFF"></path>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 916 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

+4 -3
View File
@@ -10,6 +10,7 @@ import Multiselect from 'vue-multiselect';
import { plugin, defaultConfig } from '@formkit/vue';
import WootSwitch from 'components/ui/Switch.vue';
import WootWizard from 'components/ui/Wizard.vue';
import { sync } from 'vuex-router-sync';
import FloatingVue from 'floating-vue';
import WootUiKit from 'dashboard/components';
import App from 'dashboard/App.vue';
@@ -17,7 +18,6 @@ import i18nMessages from 'dashboard/i18n';
import createAxios from 'dashboard/helper/APIHelper';
import commonHelpers, { isJSONValid } from 'dashboard/helper/commons';
import { sync } from 'vuex-router-sync';
import router, { initalizeRouter } from 'dashboard/routes';
import store from 'dashboard/store';
import constants from 'dashboard/constants/globals';
@@ -39,11 +39,10 @@ import 'floating-vue/dist/style.css';
const i18n = createI18n({
legacy: false, // https://github.com/intlify/vue-i18n/issues/1902
locale: 'en',
fallbackLocale: 'en',
messages: i18nMessages,
});
sync(store, router);
const app = createApp(App);
app.use(i18n);
app.use(store);
@@ -99,9 +98,11 @@ app.component('fluent-icon', FluentIcon);
app.directive('resize', vResizeObserver);
app.directive('on-clickaway', onClickaway);
sync(store, router);
// load common helpers into js
commonHelpers();
window.WOOT_STORE = store;
window.dashboardApp = app;
window.WootConstants = constants;
window.axios = createAxios(axios);
// [VITE] Disabled this we don't need it, we can use `useEmitter` directly
+1
View File
@@ -25,6 +25,7 @@ import {
const i18n = createI18n({
legacy: false, // https://github.com/intlify/vue-i18n/issues/1902
locale: 'en',
fallbackLocale: 'en',
messages: i18nMessages,
});
-1
View File
@@ -1 +0,0 @@
import './design-system/histoire.scss';
+1 -1
View File
@@ -120,7 +120,7 @@ export default {
}
},
setLocale(locale) {
this.$root.$i18n.locale = locale || 'en';
this.$i18n.locale = locale || 'en';
},
},
};
+1 -1
View File
@@ -31,7 +31,7 @@ export default {
};
},
setLocale(locale) {
this.$root.$i18n.locale = locale;
this.$i18n.locale = locale;
},
},
};
+30 -2
View File
@@ -66,6 +66,33 @@ export default {
mounted() {
const { websiteToken, locale, widgetColor } = window.chatwootWebChannel;
this.setLocale(locale);
setTimeout(() => {
console.log('SET LOCALE AGAIN 100');
this.setLocale(locale);
}, 100);
setTimeout(() => {
console.log('SET LOCALE AGAIN 200');
this.setLocale(locale);
}, 200);
setTimeout(() => {
console.log('SET LOCALE AGAIN 300');
this.setLocale(locale);
}, 300);
setTimeout(() => {
console.log('SET LOCALE AGAIN 400');
this.setLocale(locale);
}, 400);
setTimeout(() => {
console.log('SET LOCALE AGAIN 500');
this.setLocale(locale);
}, 500);
setTimeout(() => {
console.log('SET LOCALE YET AGAIN');
this.setLocale(locale);
}, 5000);
this.setWidgetColor(widgetColor);
setHeader(window.authToken);
if (this.isIFrame) {
@@ -121,6 +148,7 @@ export default {
},
setLocale(localeWithVariation) {
if (!localeWithVariation) return;
console.log('SETTING LOCALE HAHAHAHAHA!', localeWithVariation);
const { enabledLanguages } = window.chatwootWebChannel;
const localeWithoutVariation = localeWithVariation.split('_')[0];
const hasLocaleWithoutVariation = enabledLanguages.some(
@@ -131,9 +159,9 @@ export default {
);
if (hasLocaleWithVariation) {
this.$root.$i18n.locale = localeWithVariation;
this.$i18n.locale = localeWithVariation;
} else if (hasLocaleWithoutVariation) {
this.$root.$i18n.locale = localeWithoutVariation;
this.$i18n.locale = localeWithoutVariation;
}
},
registerUnreadEvents() {
@@ -60,12 +60,7 @@ export default {
chatwootWebChannel: { websiteToken },
authToken,
} = window;
popoutChatWindow(
origin,
websiteToken,
this.$root.$i18n.locale,
authToken
);
popoutChatWindow(origin, websiteToken, this.$i18n.locale, authToken);
},
closeWindow() {
if (IFrameHelper.isIFrame()) {
@@ -37,7 +37,7 @@ export default {
},
data() {
return {
locale: this.$root.$i18n.locale,
locale: this.$i18n.locale,
hasErrorInPhoneInput: false,
message: '',
formValues: {},
@@ -75,7 +75,7 @@ export default {
messageId: this.messageId,
});
} catch (error) {
// Ignore error
console.log(error);
} finally {
this.isUpdating = false;
}
@@ -41,7 +41,7 @@ export default {
);
this.dyteAuthToken = authToken;
} catch (error) {
// Ignore Error for now
console.log(error);
} finally {
this.isLoading = false;
}
@@ -31,7 +31,7 @@ export const actions = {
const { data } = await ContactsAPI.get();
commit(SET_CURRENT_USER, data);
} catch (error) {
// Ignore error
console.log(error);
}
},
update: async ({ dispatch }, { user }) => {
@@ -39,7 +39,7 @@ export const actions = {
await ContactsAPI.update(user);
dispatch('get');
} catch (error) {
// Ignore error
console.log(error);
}
},
setUser: async ({ dispatch }, { identifier, user: userObject }) => {
@@ -91,14 +91,14 @@ export const actions = {
try {
await ContactsAPI.setCustomAttributes(customAttributes);
} catch (error) {
// Ignore error
console.log(error);
}
},
deleteCustomAttribute: async (_, customAttribute) => {
try {
await ContactsAPI.deleteCustomAttribute(customAttribute);
} catch (error) {
// Ignore error
console.log(error);
}
},
};
@@ -25,7 +25,7 @@ export const actions = {
// Emit event to notify that conversation is created and show the chat screen
emitter.emit(ON_CONVERSATION_CREATED);
} catch (error) {
// Ignore error
console.log(error);
} finally {
commit('setConversationUIFlag', { isCreating: false });
}
@@ -133,7 +133,7 @@ export const actions = {
commit('conversation/setMetaUserLastSeenAt', lastSeen, { root: true });
commit('setMissingMessagesInConversation', updatedConversation);
} catch (error) {
// IgnoreError
console.log(error);
}
},
@@ -158,7 +158,7 @@ export const actions = {
try {
await toggleTyping(data);
} catch (error) {
// IgnoreError
console.log(error);
}
},
@@ -172,7 +172,7 @@ export const actions = {
commit('setMetaUserLastSeenAt', lastSeen);
await setUserLastSeenAt({ lastSeen });
} catch (error) {
// IgnoreError
console.log(error);
}
},
@@ -184,7 +184,7 @@ export const actions = {
try {
await setCustomAttributes(customAttributes);
} catch (error) {
// IgnoreError
console.log(error);
}
},
@@ -192,7 +192,7 @@ export const actions = {
try {
await deleteCustomAttribute(customAttribute);
} catch (error) {
// IgnoreError
console.log(error);
}
},
};
@@ -22,7 +22,7 @@ export const actions = {
commit(SET_CONVERSATION_ATTRIBUTES, data);
commit('conversation/setMetaUserLastSeenAt', lastSeen, { root: true });
} catch (error) {
// Ignore error
console.log(error);
}
},
update({ commit }, data) {
@@ -9,14 +9,14 @@ export const actions = {
try {
await conversationLabels.create(label);
} catch (error) {
// Ignore error
console.log(error);
}
},
destroy: async (_, label) => {
try {
await conversationLabels.destroy(label);
} catch (error) {
// Ignore error
console.log(error);
}
},
};
@@ -5,7 +5,7 @@ const actions = {
try {
await events.create(name);
} catch (error) {
// Ignore error
console.log(error);
}
},
};
@@ -38,7 +38,7 @@ export const actions = {
);
dispatch('contacts/get', {}, { root: true });
} catch (error) {
// Ignore error
console.log(error);
}
commit('toggleUpdateStatus', false);
},
-43
View File
@@ -1,43 +0,0 @@
import { defineConfig } from 'histoire';
import { HstVue } from '@histoire/plugin-vue';
export default defineConfig({
setupFile: './histoire.setup.ts',
plugins: [HstVue()],
vite: {
server: {
port: 6179,
},
},
viteIgnorePlugins: ['vite-plugin-ruby'],
theme: {
darkClass: 'dark',
title: '@chatwoot/design',
logo: {
square: './design-system/images/logo-thumbnail.svg',
light: './design-system/images/logo.png',
dark: './design-system/images/logo-dark.png',
},
},
defaultStoryProps: {
icon: 'carbon:cube',
iconColor: '#1F93FF',
layout: {
type: 'grid',
width: '80%',
},
},
tree: {
groups: [
{
id: 'top',
title: '',
},
{
id: 'components',
title: 'Components',
include: () => true,
},
],
},
});
+1 -6
View File
@@ -14,10 +14,7 @@
"ruby:prettier": "bundle exec rubocop -a",
"build:sdk": "BUILD_MODE=library vite build",
"prepare": "husky install",
"size": "size-limit",
"story:dev": "histoire dev",
"story:build": "histoire build",
"story:preview": "histoire preview"
"size": "size-limit"
},
"size-limit": [
{
@@ -100,7 +97,6 @@
},
"devDependencies": {
"@egoist/tailwindcss-icons": "^1.8.1",
"@histoire/plugin-vue": "0.17.15",
"@iconify-json/logos": "^1.2.0",
"@iconify-json/lucide": "^1.2.5",
"@size-limit/file": "^8.2.4",
@@ -117,7 +113,6 @@
"eslint-plugin-vitest-globals": "^1.5.0",
"eslint-plugin-vue": "^9.28.0",
"fake-indexeddb": "^6.0.0",
"histoire": "0.17.15",
"husky": "^7.0.0",
"jsdom": "^24.1.3",
"lint-staged": "14.0.1",
+3 -953
View File
File diff suppressed because it is too large Load Diff
@@ -39,9 +39,8 @@ RSpec.describe 'Google::CallbacksController', type: :request do
expect(Redis::Alfred.get(cache_key)).to be_nil
end
it 'updates inbox channel config if inbox exists with imap_login and authentication is successful' do
channel_email = create(:channel_email, account: account, imap_login: email)
inbox = channel_email.inbox
it 'creates updates inbox channel config if inbox exists and authentication is successful' do
inbox = create(:channel_email, account: account, email: email)&.inbox
expect(inbox.channel.provider_config).to eq({})
stub_request(:post, 'https://accounts.google.com/o/oauth2/token')
@@ -51,7 +50,7 @@ RSpec.describe 'Google::CallbacksController', type: :request do
get google_callback_url, params: { code: code }
expect(response).to redirect_to app_email_inbox_settings_url(account_id: account.id, inbox_id: inbox.id)
expect(response).to redirect_to app_email_inbox_settings_url(account_id: account.id, inbox_id: account.inboxes.last.id)
expect(account.inboxes.count).to be 1
expect(inbox.channel.reload.provider_config.keys).to include('access_token', 'refresh_token', 'expires_on')
expect(inbox.channel.reload.provider_config['access_token']).to eq response_body_success[:access_token]
+1 -7
View File
@@ -42,11 +42,6 @@ if (isLibraryMode) {
plugins = [vue(vueOptions)];
}
const esbuildOptions = {
minifyIdentifiers: false,
keepNames: true,
};
export default defineConfig({
plugins: plugins,
build: {
@@ -71,7 +66,7 @@ export default defineConfig({
lib: isLibraryMode
? {
entry: path.resolve(__dirname, './app/javascript/entrypoints/sdk.js'),
formats: ['cjs'], // CJS format for single file
formats: ['umd'], // UMD format for single file
name: 'sdk',
}
: undefined,
@@ -112,5 +107,4 @@ export default defineConfig({
mockReset: true,
clearMocks: true,
},
esbuild: isLibraryMode ? esbuildOptions : undefined,
});