Skip to content

Commit 23fe282

Browse files
authored
feat: add chatlio widget (#186)
1 parent 488b72b commit 23fe282

3 files changed

Lines changed: 63 additions & 2 deletions

File tree

.vitepress/config.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
import dotenv from 'dotenv';
22
/* @ts-expect-error */
33
import mdFootnote from 'markdown-it-footnote';
4-
import { defineConfig, type HeadConfig } from 'vitepress';
4+
import { defineConfigWithTheme, type DefaultTheme, type HeadConfig } from 'vitepress';
55
import { defaultGroupLink, sidebarLinks } from '../docs/links';
66

77
dotenv.config();
88

99
const BASE = '/';
1010
const BASE_WITH_ORIGIN = `https://developer.stackblitz.com${BASE}`;
1111

12-
export default defineConfig({
12+
interface ThemeConfig extends DefaultTheme.Config {
13+
chatlio: {
14+
id: string | undefined,
15+
allowedRoutes: (RegExp|string)[],
16+
}
17+
}
18+
19+
export default defineConfigWithTheme<ThemeConfig>({
1320
srcDir: './docs',
1421
outDir: `./build${BASE}`,
1522
assetsDir: 'assets',
@@ -95,6 +102,10 @@ export default defineConfig({
95102
'/platform/webcontainers/': sidebarLinks('main', ['webcontainers']),
96103
'/enterprise/': sidebarLinks('enterprise', ['enterprise']),
97104
},
105+
chatlio: {
106+
allowedRoutes: [`^${BASE}teams/.*`, `^${BASE}enterprise/.*`],
107+
id: process.env.VITE_CHATLIO_ID,
108+
}
98109
},
99110

100111
postRender(context) {
@@ -106,6 +117,16 @@ export default defineConfig({
106117
md.use(mdFootnote);
107118
},
108119
},
120+
121+
vue: {
122+
template: {
123+
compilerOptions: {
124+
isCustomElement: (tag) => {
125+
return ["chatlio-widget"].includes(tag.toLowerCase());
126+
}
127+
}
128+
}
129+
},
109130
});
110131

111132
function getAnalyticsTags(env: NodeJS.ProcessEnv): HeadConfig[] {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<script setup lang="ts">
2+
3+
import { ref, effect } from 'vue';
4+
import { useRoute, useData} from 'vitepress';
5+
6+
const scriptId = 'chatlio-widget-src';
7+
const webComponentName = 'chatlio-widget';
8+
const registered = ref(false);
9+
10+
const route = useRoute();
11+
const data = useData();
12+
const chatlio = data.theme.value.chatlio;
13+
14+
const loadChatlio = () => {
15+
if (!chatlio.id || document.getElementById(scriptId)) return;
16+
17+
const script = document.createElement('script');
18+
script.id = scriptId;
19+
script.async = true;
20+
script.src = 'https://js.chatlio.com/widget.js';
21+
document.body.appendChild(script);
22+
customElements.whenDefined(webComponentName).then(() => {
23+
registered.value = true;
24+
});
25+
};
26+
27+
effect(() => {
28+
// We load the widget on allowed pages, but then persist it across all the pages in case you want
29+
// to browse the docs and keep the chat.
30+
if (chatlio.allowedRoutes.some((allowedRoute: string) => route.path.match(allowedRoute))) {
31+
loadChatlio();
32+
}
33+
});
34+
</script>
35+
36+
<template>
37+
<chatlio-widget v-if="chatlio.id && registered" :widgetid="chatlio.id" />
38+
</template>

.vitepress/theme/components/CustomLayout.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import DefaultTheme from 'vitepress/theme';
44
const { Layout } = DefaultTheme;
55
66
import Feedback from '@theme/components/Feedback/Feedback.vue';
7+
import Chatlio from '@theme/components/Chatlio.vue';
78
</script>
89

910
<template>
1011
<Layout>
1112
<template #doc-footer-before>
1213
<ClientOnly>
1314
<Feedback />
15+
<Chatlio />
1416
</ClientOnly>
1517
</template>
1618
</Layout>

0 commit comments

Comments
 (0)