Vue

Preview

Components v2 is under development, but already safe to use in production.

It currently only offers limited features. Only the chatbox chat UI is currently available, not the inbox or popup. New capabilities are added on a rolling basis.

Components v2 lets you fully customize the appearance and behavior of your chat with web components. In this guide we'll show you how to add a chatbox component to your app and customize its theme.

Prerequisites

To make the most of this guide, you'll need:

Installation

To get started, install @talkjs/components, along with the @talkjs/theme-default theme and the react and react-dom dependencies:

1npm install @talkjs/components @talkjs/theme-default react react-dom

If you'd like to use a custom theme instead of the default theme, see: Customize your theme.

To use TalkJS's web components, you'll need to configure Vue to resolve them. If you use Vite to build your project, you can do this by updating your vite.config.js file to treat components with a - in their name as custom elements:

1import vue from '@vitejs/plugin-vue';
2
3export default {
4 plugins: [
5 vue({
6 template: {
7 compilerOptions: {
8 // treat all tags with a dash as custom elements
9 isCustomElement: (tag) => tag.includes('-'),
10 },
11 },
12 }),
13 ],
14};

For other configuration options, see Vue's docs on Using custom elements in Vue.

You now have TalkJS components and a theme installed.

View a conversation

To view an existing sample conversation, import the components and theme into your app, for example in the App.vue file:

1<script setup>
2 import '@talkjs/components/web';
3 import * as defaultTheme from '@talkjs/theme-default';
4 import '@talkjs/components/style.css';
5 import '@talkjs/theme-default/style.css';
6</script>

Next, add the t-chatbox web component and styling:

1<script setup>
2 import '@talkjs/components/web';
3 import * as defaultTheme from '@talkjs/theme-default';
4 import '@talkjs/components/style.css';
5 import '@talkjs/theme-default/style.css';
6
7 const appId = '<APP_ID>';
8</script>
9
10<template>
11 <main>
12 <div class="wrapper">
13 <t-chatbox
14 :app-id="appId"
15 user-id="sample_user_alice"
16 conversation-id="sample_conversation"
17 :theme="defaultTheme"
18 />
19 </div>
20 </main>
21</template>
22
23<style scoped>
24 .wrapper {
25 width: 400px;
26 height: 600px;
27 }
28</style>

The t-chatbox component has the following attributes:

  • appId: Your TalkJS app ID. You can find your app ID on the Settings page of your TalkJS dashboard. For this guide, use the app ID for your test mode, which has built-in sample users and conversations.
  • userId: An identifier for the current user to send messages as. This example uses the ID of an existing sample user, sample_user_alice.
  • conversationId: An identifier of the conversation that you want to view. This example uses the ID for a built-in sample conversation, sample_conversation.
  • theme: the theme you want to use. In this case we've imported the default theme.

Run your app. You should get something like the following:

Chatbox showing a message from Sebastian

You now have a fully-featured chat window running in your app. Try sending a message!

To view the conversation as a different user, change the userId. For example, try switching the userId to sample_user_sebastian to view the other side of the sample conversation.

If the chat window doesn't show up, make sure that you've entered your app ID correctly.

Create new users and conversations

So far in this guide we've used a sample user and conversation. Next, we'll create new users and a conversation between them, and sync them with the TalkJS servers. To do this, we'll use TalkJS Core.

Install the @talkjs/core package:

1npm install @talkjs/core

Then import the TalkSession from the package into your component, along with Vue's onUnmounted hook:

1<script setup>
2 import '@talkjs/components/web';
3 import * as defaultTheme from '@talkjs/theme-default';
4 import { TalkSession } from '@talkjs/core';
5 import { onUnmounted } from 'vue';
6 import '@talkjs/components/style.css';
7 import '@talkjs/theme-default/style.css';
8</script>

Add the following code to the script section of your component:

1const userId = 'frank';
2const otherUserId = 'nina';
3const conversationId = 'my_conversation';
4
5const session = new TalkSession({ appId, userId });
6session.currentUser.createIfNotExists({ name: 'Frank' });
7session.user(otherUserId).createIfNotExists({ name: 'Nina' });
8
9const conversation = session.conversation(conversationId);
10conversation.createIfNotExists();
11conversation.participant(otherUserId).createIfNotExists();
12
13onUnmounted(() => {
14 session.destroy();
15});

Update the t-chatbox component in your template to use the new variables:

1<t-chatbox
2 :app-id="appId"
3 :user-id="userId"
4 :conversation-id="conversationId"
5 :theme="defaultTheme"
6/>

This code creates a new TalkJS session, which provides access to a continuous, up-to-date flow of your TalkJS data. It then creates two new users and a conversation between them.

Code example

Here's a component file with the code so far, so that you can see how it all fits together:

1<script setup>
2 import '@talkjs/components/web';
3 import * as defaultTheme from '@talkjs/theme-default';
4 import { TalkSession } from '@talkjs/core';
5 import { onUnmounted } from 'vue';
6 import '@talkjs/components/style.css';
7 import '@talkjs/theme-default/style.css';
8
9 const appId = '<APP_ID>';
10 const userId = 'frank';
11 const otherUserId = 'nina';
12 const conversationId = 'my_conversation';
13
14 const session = new TalkSession({ appId, userId });
15 session.currentUser.createIfNotExists({ name: 'Frank' });
16 session.user(otherUserId).createIfNotExists({ name: 'Nina' });
17
18 const conversation = session.conversation(conversationId);
19 conversation.createIfNotExists();
20 conversation.participant(otherUserId).createIfNotExists();
21
22 onUnmounted(() => {
23 session.destroy();
24 });
25</script>
26
27<template>
28 <main>
29 <div class="wrapper">
30 <t-chatbox
31 :app-id="appId"
32 :user-id="userId"
33 :conversation-id="conversationId"
34 :theme="defaultTheme"
35 />
36 </div>
37 </main>
38</template>
39
40<style scoped>
41 .wrapper {
42 width: 400px;
43 height: 600px;
44 }
45</style>

Customize your theme

With a custom theme, you can change any aspect of your chat to match your own style, giving you full control over the look and feel of your chat UI.

Download the theme files from our open source theme-default GitHub repo. Then, extract the src folder and add it your source code. Update your imports to point at the downloaded files:

1<script setup>
2 import '@talkjs/components/web';
3 import * as customTheme from './src'; // Use the path to the files you copied
4 import { TalkSession } from '@talkjs/core';
5 import { onUnmounted } from 'vue';
6 import '@talkjs/components/style.css';
7 import './src/index.css';
8</script>

Pass the custom theme to the chatbox:

1<t-chatbox
2 :app-id="appId"
3 :user-id="userId"
4 :conversation-id="conversationId"
5 :theme="customTheme"
6/>

You can now customize any aspect of your theme by editing the CSS and JavaScript files of the individual components in the custom-theme folder directly.

For styling changes, edit the CSS files. For example, to give message field a different background color, you can edit the custom-theme/components/MessageField.css file. If you change background-color: #ececec to background-color: lightblue, then the message field gets a light blue background color:

Chatbox with a light blue message field

For behavior changes, edit the JavaScript files. For example, to add a new message action, add the following to the MessageActionMenu.js file:

1return html`
2 <div className="t-theme-message-action-menu">
3 ${permissions.canReply &&
4 html`<button t-action="reply" onClick=${() => setReferencedMessage(message.id)}>${t.REPLY_TO_MESSAGE}</button>`}
5 ${permissions.canDelete &&
6 html`<button t-action="delete" onClick=${() => chatbox.deleteMessage(message.id)}>${t.DELETE_MESSAGE}</button>`}
7 <button t-action="example" onClick=${() => console.log('This is an example message action')}>
8 Example message action
9 </button>
10 </div>
11`;

You should now see Example message action in the message action menu for your messages:

Example message action in the message action menu

Check your browser console, and you should see "This is an example message action" logged to the console.

Add authentication

Once you're using TalkJS in production you'll need to enable authentication, so that only legitimate users can connect to your chat. You'll need a backend server that can generate tokens for your users to authenticate with. See our Authentication docs for more detail on how to set this up.

To pass the token to your chatbox, add the token prop:

1<t-chatbox
2 :app-id="appId"
3 :user-id="userId"
4 :conversation-id="conversationId"
5 :theme="customTheme"
6 :token="token"
7/>

You also need to pass the token to your session:

1const session = new TalkSession({ appId, userId, token });

The token is different each time you connect to TalkJS, so you'll need to call your backend to generate it.

Once you are happy that your chat is loading without errors when you provide a token, go the the Settings page of your dashboard and enable the Authentication (identity verification) option in the Security settings section. When authentication is enabled, only users with a valid token can connect to your chat.

Next steps

For more ways to customize your chat, see our Chatbox reference docs.