mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-03 20:48:07 +00:00 
			
		
		
		
	# Pull Request Template ## Description **This PR includes:** * Refactored two legacy mixins (`availability.js`, `nextAvailability.js`) into a Vue 3 composable (`useAvailability`), helper module and component based rendering logic. * Fixed an issue where the widget wouldn't load if business hours were enabled but all days were unchecked. * Fixed translation issue [[#11280](https://github.com/chatwoot/chatwoot/issues/11280)](https://github.com/chatwoot/chatwoot/issues/11280). * Reduced code complexity and size. * Added test coverage for both the composable and helper functions. ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? ### Loom video https://www.loom.com/share/2bc3ed694b4349419505e275d14d0b98?sid=22d585e4-0dc7-4242-bcb6-e3edc16e3aee ### Story <img width="995" height="442" alt="image" src="https://github.com/user-attachments/assets/d6340738-07db-41d5-86fa-a8ecf734cc70" /> ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules Fixes https://github.com/chatwoot/chatwoot/issues/12012 --------- Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com> Co-authored-by: Pranav <pranav@chatwoot.com> Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<script>
 | 
						|
import { mapActions } from 'vuex';
 | 
						|
import { useRouter } from 'vue-router';
 | 
						|
import PreChatForm from '../components/PreChat/Form.vue';
 | 
						|
import configMixin from '../mixins/configMixin';
 | 
						|
import { isEmptyObject } from 'widget/helpers/utils';
 | 
						|
import { ON_CONVERSATION_CREATED } from '../constants/widgetBusEvents';
 | 
						|
import { emitter } from 'shared/helpers/mitt';
 | 
						|
 | 
						|
export default {
 | 
						|
  components: {
 | 
						|
    PreChatForm,
 | 
						|
  },
 | 
						|
  mixins: [configMixin],
 | 
						|
  setup() {
 | 
						|
    const router = useRouter();
 | 
						|
    return { router };
 | 
						|
  },
 | 
						|
  mounted() {
 | 
						|
    // Register event listener for conversation creation
 | 
						|
    emitter.on(ON_CONVERSATION_CREATED, this.handleConversationCreated);
 | 
						|
  },
 | 
						|
  beforeUnmount() {
 | 
						|
    emitter.off(ON_CONVERSATION_CREATED, this.handleConversationCreated);
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    ...mapActions('conversation', ['clearConversations']),
 | 
						|
    ...mapActions('conversationAttributes', ['clearConversationAttributes']),
 | 
						|
    handleConversationCreated() {
 | 
						|
      // Redirect to messages page after conversation is created
 | 
						|
      this.router.replace({ name: 'messages' });
 | 
						|
      // Only after successful navigation, reset the isUpdatingRoute UIflag in app/javascript/widget/router.js
 | 
						|
      // See issue: https://github.com/chatwoot/chatwoot/issues/10736
 | 
						|
    },
 | 
						|
 | 
						|
    onSubmit({
 | 
						|
      fullName,
 | 
						|
      emailAddress,
 | 
						|
      message,
 | 
						|
      activeCampaignId,
 | 
						|
      phoneNumber,
 | 
						|
      contactCustomAttributes,
 | 
						|
      conversationCustomAttributes,
 | 
						|
    }) {
 | 
						|
      if (activeCampaignId) {
 | 
						|
        emitter.emit('execute-campaign', {
 | 
						|
          campaignId: activeCampaignId,
 | 
						|
          customAttributes: conversationCustomAttributes,
 | 
						|
        });
 | 
						|
        this.$store.dispatch('contacts/update', {
 | 
						|
          user: {
 | 
						|
            email: emailAddress,
 | 
						|
            name: fullName,
 | 
						|
            phone_number: phoneNumber,
 | 
						|
          },
 | 
						|
        });
 | 
						|
      } else {
 | 
						|
        this.clearConversations();
 | 
						|
        this.clearConversationAttributes();
 | 
						|
        this.$store.dispatch('conversation/createConversation', {
 | 
						|
          fullName: fullName,
 | 
						|
          emailAddress: emailAddress,
 | 
						|
          message: message,
 | 
						|
          phoneNumber: phoneNumber,
 | 
						|
          customAttributes: conversationCustomAttributes,
 | 
						|
        });
 | 
						|
      }
 | 
						|
      if (!isEmptyObject(contactCustomAttributes)) {
 | 
						|
        this.$store.dispatch(
 | 
						|
          'contacts/setCustomAttributes',
 | 
						|
          contactCustomAttributes
 | 
						|
        );
 | 
						|
      }
 | 
						|
    },
 | 
						|
  },
 | 
						|
};
 | 
						|
</script>
 | 
						|
 | 
						|
<template>
 | 
						|
  <div class="flex flex-1 overflow-auto">
 | 
						|
    <PreChatForm :options="preChatFormOptions" @submit-pre-chat="onSubmit" />
 | 
						|
  </div>
 | 
						|
</template>
 |