From e8f634f7593ebeb92d1b255f3da7a141b00a04e3 Mon Sep 17 00:00:00 2001 From: April Hall Date: Fri, 7 Feb 2025 11:13:55 -0500 Subject: [PATCH] feat: Add functionality to channel creation dialog --- bun.lockb | Bin 175798 -> 194153 bytes package.json | 4 +- src/lib/components/channelDialog.svelte | 25 ++++++-- src/lib/components/mainLayout.svelte | 15 ++++- .../ui/dialog/dialog-content.svelte | 56 ++++++++--------- .../ui/dialog/dialog-description.svelte | 17 +++-- .../components/ui/dialog/dialog-footer.svelte | 17 +++-- .../components/ui/dialog/dialog-header.svelte | 14 ++--- .../ui/dialog/dialog-overlay.svelte | 29 +++++---- .../components/ui/dialog/dialog-portal.svelte | 6 +- .../components/ui/dialog/dialog-title.svelte | 17 +++-- src/lib/components/ui/dialog/index.ts | 58 +++++++++--------- src/lib/components/ui/label/index.ts | 7 +++ src/lib/components/ui/label/label.svelte | 15 +++++ src/lib/server/db/index.ts | 13 ++++ src/lib/types/schema.ts | 7 +++ src/routes/+layout.server.ts | 5 ++ src/routes/+layout.svelte | 3 +- src/routes/+page.server.ts | 26 +++++++- 19 files changed, 209 insertions(+), 125 deletions(-) create mode 100644 src/lib/components/ui/label/index.ts create mode 100644 src/lib/components/ui/label/label.svelte create mode 100644 src/lib/types/schema.ts diff --git a/bun.lockb b/bun.lockb index 7a2c9e3098a8d8a14791806e493cb3a0d99c8cb6..1f9793177c0354866b053c5d377f8121373b309b 100755 GIT binary patch delta 38884 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 } = $props(); + const { form, errors, constraints, enhance } = superForm(data); @@ -10,11 +17,19 @@ Create Channel -

- + + + {#if $errors.channelName}{/if} + + +
- - - diff --git a/src/lib/components/mainLayout.svelte b/src/lib/components/mainLayout.svelte index 3eae795..877c51a 100644 --- a/src/lib/components/mainLayout.svelte +++ b/src/lib/components/mainLayout.svelte @@ -1,17 +1,26 @@
@@ -32,7 +41,7 @@
- +
diff --git a/src/lib/components/ui/dialog/dialog-content.svelte b/src/lib/components/ui/dialog/dialog-content.svelte index 0bc61b3..defccc8 100644 --- a/src/lib/components/ui/dialog/dialog-content.svelte +++ b/src/lib/components/ui/dialog/dialog-content.svelte @@ -1,36 +1,34 @@ - - - - - - Close - - + + + + + + Close + + diff --git a/src/lib/components/ui/dialog/dialog-description.svelte b/src/lib/components/ui/dialog/dialog-description.svelte index 8bc70cc..64e79f7 100644 --- a/src/lib/components/ui/dialog/dialog-description.svelte +++ b/src/lib/components/ui/dialog/dialog-description.svelte @@ -1,16 +1,13 @@ - - + + diff --git a/src/lib/components/ui/dialog/dialog-footer.svelte b/src/lib/components/ui/dialog/dialog-footer.svelte index a235d1f..c625327 100644 --- a/src/lib/components/ui/dialog/dialog-footer.svelte +++ b/src/lib/components/ui/dialog/dialog-footer.svelte @@ -1,16 +1,13 @@ -
- +
+
diff --git a/src/lib/components/ui/dialog/dialog-header.svelte b/src/lib/components/ui/dialog/dialog-header.svelte index 6b4448c..c0a1367 100644 --- a/src/lib/components/ui/dialog/dialog-header.svelte +++ b/src/lib/components/ui/dialog/dialog-header.svelte @@ -1,13 +1,13 @@ -
- +
+
diff --git a/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/lib/components/ui/dialog/dialog-overlay.svelte index 9da95c5..2ef74db 100644 --- a/src/lib/components/ui/dialog/dialog-overlay.svelte +++ b/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -1,21 +1,20 @@ + {transition} + {transitionConfig} + class={cn('bg-background/80 fixed inset-0 z-50 backdrop-blur-sm ', className)} + {...$$restProps} /> diff --git a/src/lib/components/ui/dialog/dialog-portal.svelte b/src/lib/components/ui/dialog/dialog-portal.svelte index 400e62b..e0720dc 100644 --- a/src/lib/components/ui/dialog/dialog-portal.svelte +++ b/src/lib/components/ui/dialog/dialog-portal.svelte @@ -1,9 +1,9 @@ - + diff --git a/src/lib/components/ui/dialog/dialog-title.svelte b/src/lib/components/ui/dialog/dialog-title.svelte index 06574f3..c514c31 100644 --- a/src/lib/components/ui/dialog/dialog-title.svelte +++ b/src/lib/components/ui/dialog/dialog-title.svelte @@ -1,16 +1,13 @@ - - + + diff --git a/src/lib/components/ui/dialog/index.ts b/src/lib/components/ui/dialog/index.ts index b17ba5e..707a04e 100644 --- a/src/lib/components/ui/dialog/index.ts +++ b/src/lib/components/ui/dialog/index.ts @@ -1,37 +1,37 @@ -import { Dialog as DialogPrimitive } from "bits-ui"; +import { Dialog as DialogPrimitive } from 'bits-ui'; -import Title from "./dialog-title.svelte"; -import Portal from "./dialog-portal.svelte"; -import Footer from "./dialog-footer.svelte"; -import Header from "./dialog-header.svelte"; -import Overlay from "./dialog-overlay.svelte"; -import Content from "./dialog-content.svelte"; -import Description from "./dialog-description.svelte"; +import Title from './dialog-title.svelte'; +import Portal from './dialog-portal.svelte'; +import Footer from './dialog-footer.svelte'; +import Header from './dialog-header.svelte'; +import Overlay from './dialog-overlay.svelte'; +import Content from './dialog-content.svelte'; +import Description from './dialog-description.svelte'; const Root = DialogPrimitive.Root; const Trigger = DialogPrimitive.Trigger; const Close = DialogPrimitive.Close; export { - Root, - Title, - Portal, - Footer, - Header, - Trigger, - Overlay, - Content, - Description, - Close, - // - Root as Dialog, - Title as DialogTitle, - Portal as DialogPortal, - Footer as DialogFooter, - Header as DialogHeader, - Trigger as DialogTrigger, - Overlay as DialogOverlay, - Content as DialogContent, - Description as DialogDescription, - Close as DialogClose, + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose, }; diff --git a/src/lib/components/ui/label/index.ts b/src/lib/components/ui/label/index.ts new file mode 100644 index 0000000..36fb393 --- /dev/null +++ b/src/lib/components/ui/label/index.ts @@ -0,0 +1,7 @@ +import Root from './label.svelte'; + +export { + Root, + // + Root as Label, +}; diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte new file mode 100644 index 0000000..a751e7f --- /dev/null +++ b/src/lib/components/ui/label/label.svelte @@ -0,0 +1,15 @@ + + + + + diff --git a/src/lib/server/db/index.ts b/src/lib/server/db/index.ts index 3d21638..5a1a8ed 100644 --- a/src/lib/server/db/index.ts +++ b/src/lib/server/db/index.ts @@ -62,6 +62,19 @@ class Db { } } + async checkChannel(channel: string): Promise { + try { + const res = await this.client.execute(`SELECT table_name FROM system_schema.tables WHERE keyspace_name = 'channels' AND table_name = ?`, [ + channel.toLowerCase(), + ]); + + return res.rowLength !== 0; + } catch (e) { + console.log(`Error checking channel existance: ${e as Error}`); + return false; + } + } + // Get Channels method async getChannels(): Promise { try { diff --git a/src/lib/types/schema.ts b/src/lib/types/schema.ts new file mode 100644 index 0000000..cb6e77b --- /dev/null +++ b/src/lib/types/schema.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export const newChannelSchema = z.object({ + channelName: z.string().min(1, 'Channel name is required'), +}); + +export type NewChannelSchema = typeof newChannelSchema; diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index 8640f49..e4706b2 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -1,6 +1,10 @@ import { db } from '$lib/server/db'; +import { zod } from 'sveltekit-superforms/adapters'; +import { superValidate } from 'sveltekit-superforms'; +import { newChannelSchema } from '$lib/types/schema'; export async function load() { + const form = await superValidate(zod(newChannelSchema)); const rows = await db.getChannels(); const channels: string[] = rows ? rows.map((value) => { @@ -10,5 +14,6 @@ export async function load() { return { channels, + form, }; } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 9cb4ec7..ee13ea1 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -4,10 +4,9 @@ import MainLayout from '$lib/components/mainLayout.svelte'; import { ModeWatcher } from 'mode-watcher'; let { data, children }: LayoutProps = $props(); - const channels = data.channels; - + {@render children()} diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 0b7dad2..9c24f06 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,5 +1,29 @@ -import { redirect } from '@sveltejs/kit'; +import { redirect, fail } from '@sveltejs/kit'; +import { zod } from 'sveltekit-superforms/adapters'; +import { setError, superValidate, message } from 'sveltekit-superforms'; +import { newChannelSchema } from '$lib/types/schema'; +import type { Actions } from './$types'; +import { db } from '$lib/server/db'; export function load(): void { redirect(308, '/channel/general'); } + +export const actions = { + default: async ({ request }) => { + const form = await superValidate(request, zod(newChannelSchema)); + const channel = form.data.channelName; + + if (!form.valid) { + return fail(400, { form }); + } + + if (await db.checkChannel(channel)) { + return setError(form, 'channelName', 'Channel already exists.'); + } + + db.createChannel(channel); + + return message(form, 'Channel created!'); + }, +} satisfies Actions;