This guide shows you how to add Heyo to your Svelte application. Works with Svelte and SvelteKit.
Install the SDK:
npm install @heyo.so/js
Then initialize it in your root component or +layout.svelte (SvelteKit):
<script>
import { onMount } from 'svelte';
import HEYO from '@heyo.so/js'; // or: import { HEYO } from '@heyo.so/js'
onMount(() => {
HEYO.init({ projectId: 'YOUR_PROJECT_ID' });
});
</script>
<slot />
Load the script dynamically:
<script>
import { onMount } from 'svelte';
onMount(() => {
const script = document.createElement('script');
script.src = 'https://heyo.so/embed/script';
script.defer = true;
script.setAttribute('data-project-id', 'YOUR_PROJECT_ID');
document.head.appendChild(script);
return () => {
document.head.removeChild(script);
};
});
</script>
Create or update src/routes/+layout.svelte:
<script>
import { onMount } from 'svelte';
import HEYO from '@heyo.so/js'; // or: import { HEYO } from '@heyo.so/js'
import { browser } from '$app/environment';
onMount(() => {
if (browser) {
HEYO.init({ projectId: 'YOUR_PROJECT_ID' });
}
});
</script>
<slot />
Create src/lib/stores/chat.js:
import { writable } from 'svelte/store';
function createChatStore() {
const { subscribe, set } = writable(false);
return {
subscribe,
show: () => {
window.HEYO?.show();
set(true);
},
hide: () => {
window.HEYO?.hide();
set(false);
},
toggle: () => {
window.HEYO?.toggle();
set(!get(this));
}
};
}
export const chat = createChatStore();
Usage in a component:
<script>
import { chat } from '$lib/stores/chat';
</script>
<button on:click={chat.show}>Need Help?</button>
Create a Svelte action for chat control:
// src/lib/actions/chat.js
export function chatTrigger(node) {
function handleClick() {
window.HEYO?.show();
}
node.addEventListener('click', handleClick);
return {
destroy() {
node.removeEventListener('click', handleClick);
}
};
}
Usage:
<script>
import { chatTrigger } from '$lib/actions/chat';
</script>
<button use:chatTrigger>Open Chat</button>
<script>
import { onMount } from 'svelte';
import HEYO from '@heyo.so/js'; // or: import { HEYO } from '@heyo.so/js'
import { user } from '$lib/stores/user';
$: if ($user && typeof window !== 'undefined') {
HEYO.init({
projectId: 'YOUR_PROJECT_ID',
user: {
name: $user.name,
email: $user.email
}
});
}
onMount(() => {
HEYO.init({ projectId: 'YOUR_PROJECT_ID' });
});
</script>
<script>
import { page } from '$app/stores';
import { onMount } from 'svelte';
$: {
if (typeof window !== 'undefined') {
// Hide on checkout page
if ($page.url.pathname.includes('/checkout')) {
window.HEYO?.hide();
} else {
window.HEYO?.show();
}
}
}
onMount(() => {
HEYO.init({ projectId: 'YOUR_PROJECT_ID' });
});
</script>
For TypeScript projects, add type definitions in src/app.d.ts:
declare global {
interface Window {
HEYO: {
init: (config: { projectId: string; user?: any }) => void;
show: () => void;
hide: () => void;
toggle: () => void;
};
}
}
export {};
onMount to ensure browser environmentbrowser in SvelteKit before accessing windowonMountbrowser before accessing windowonMount which only runs on client-sidesrc/app.d.ts@heyo.so/js package for built-in types