0.2.0 • Published 8 months ago

svelte-instantdb v0.2.0

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

svelte-instantdb

Unofficial Instant SDK for Svelte.

!NOTE Using Svelte 4? Proceed to this example using stores.

Installation

npm install svelte-instantdb

Usage

Reading and Writing Data

<script>
	import { init, tx, id } from 'svelte-instantdb';

	const db = init({
		appId: '__YOUR_APP_ID__'
	});

	const query = db.useQuery({ messages: {} });

	const addMessage = (message) => {
		db.transact(tx.messages[id()].update(message));
	};
</script>

{#if query.isLoading}
	<div>Fetching data...</div>
{:else if query.error}
	<div>Error fetching data: {query.error.message}</div>
{:else}
	<UI data={query.data} {addMessage} />
{/if}

Cursors

<Cursors {room} userCursorColor="tomato">Move your cursor around! ✨</Cursors>

Custom cursors

<Cursors {room} userCursorColor="tomato">
	Move your cursor around! ✨

	{#snippet cursor({ color, presence })}
		<CustomCursor {color} name={presence.name} />
	{/snippet}
</Cursors>

Typing indicator

<script lang="ts">
	// Init schema and db
	// ...

	const room = db.room('chat', 'main');

	// 1. Publish your presence in the room
	const presence = room.usePresence({
		peers: [],
		user: false
	});

	onMount(() => {
		presence.publishPresence({ name: 'your_username' });
	});

	// 2. Use the typing indicator
	const typing = room.useTypingIndicator('chat');

	function typingInfo(users) {
		if (users.length === 0) return null;
		if (users.length === 1) return `${users[0].name} is typing...`;
		if (users.length === 2) return `${users[0].name} and ${users[1].name} are typing...`;

		return `${users[0].name} and ${users.length - 1} others are typing...`;
	}
</script>

<div class="flex h-screen gap-3 p-2">
	<div class="flex flex-1 flex-col justify-end">
		<textarea
			{...typing.inputProps}
			placeholder="Compose your message here..."
			class="w-full rounded-md border-gray-300 p-2 text-sm"
		/>
		<div class="truncate text-xs text-gray-500">
			{typing.active.length ? typingInfo(typing.active) : <>&nbsp;</>}
		</div>
	</div>
</div>

Reactive variables

To make functions return reactive state, pass a function that returns a state instead:

let todoId = $state(null);

const todoState = db.useQuery(() =>
	todoId
		? {
				todos: {
					$: {
						where: {
							id: todoId
						}
					}
				}
			}
		: null
);

todoId = 'some_id';

License

MIT

0.2.0

8 months ago

0.1.8

8 months ago

0.1.7

8 months ago

0.1.6

9 months ago

0.1.5

9 months ago

0.1.4

9 months ago

0.1.3

9 months ago

0.1.2

10 months ago

0.1.1

10 months ago

0.1.0

10 months ago

0.0.11

10 months ago

0.0.10

10 months ago

0.0.9

10 months ago

0.0.8

10 months ago

0.0.7

10 months ago

0.0.6

10 months ago

0.0.5

10 months ago

0.0.4

10 months ago

0.0.3

10 months ago

0.0.2

10 months ago