Fixed toaster, updated add conversation dialog

This commit is contained in:
Alois 2026-03-26 01:31:31 +01:00
commit 246b36abc9
3 changed files with 76 additions and 45 deletions

View file

@ -12,16 +12,27 @@ import {
import z from "zod"; import z from "zod";
import { toast } from "@tensamin/shared/log"; import { toast } from "@tensamin/shared/log";
import { useSocket } from "@tensamin/ttp/context"; import { useSocket } from "@tensamin/ttp/context";
import { useState } from "react";
import { Loader2 } from "lucide-react";
/** // The page
* Executes Page.
* @param none This function has no parameters.
* @returns unknown.
*/
export default function Page() { export default function Page() {
return (
<div className="p-3 flex gap-2">
<AddConversationButton />
<Button disabled>Add Community</Button>
</div>
);
}
// Add Conversation Button Component
function AddConversationButton() {
const { send } = useSocket(); const { send } = useSocket();
const [loading, setLoading] = useState(false);
function submit(username: string | null) { function submit(username: string | null) {
if (loading) return;
const schema = z const schema = z
.string() .string()
.min(1, "Username is too short") .min(1, "Username is too short")
@ -34,48 +45,61 @@ export default function Page() {
return; return;
} }
setTimeout(() => setLoading(true), 500);
send("add_conversation", { send("add_conversation", {
chat_partner_name: result.data, chat_partner_name: result.data,
}) })
.then(() => toast("success", "Conversation added")) .then(() => {
.catch(() => toast("error", "Failed to add conversation")); toast("success", "Conversation added");
})
.catch((error) => {
if (String(error).includes("error_not_found")) {
toast("error", "User not found");
return;
}
toast("error", "Failed to add conversation, check console for details");
console.error("Failed to add conversation", error);
})
.finally(() => setLoading(false));
} }
return ( return (
<div className="p-3 flex gap-2"> <Dialog>
<Dialog> <DialogTrigger render={<Button>Add Conversation</Button>} />
<DialogTrigger render={<Button>Add Conversation</Button>} /> <DialogContent>
<DialogContent> <DialogHeader>
<DialogHeader> <DialogTitle>New Conversation</DialogTitle>
<DialogTitle>New Conversation</DialogTitle> </DialogHeader>
</DialogHeader> <DialogDescription>
<DialogDescription> Add a new conversation. Just enter the username of the person you want
Add a new conversation. Just enter the username of the person you to add as a conversation.
want to add as a conversation. </DialogDescription>
</DialogDescription> <form
<form className="flex flex-col gap-5"
className="flex flex-col gap-5" onSubmit={(event) => {
onSubmit={(event) => { event.preventDefault();
event.preventDefault(); const form = new FormData(event.currentTarget);
const form = new FormData(event.currentTarget); const username = form.get("username") as string | null;
const username = form.get("username") as string | null; submit(username);
submit(username); }}
}} >
> <Input
<Input required
type="text" type="text"
id="username" id="username"
name="username" name="username"
placeholder="Enter username..." placeholder="Enter username..."
/> />
<div className="flex w-full justify-end gap-1"> <div className="flex w-full justify-end gap-1">
<DialogClose render={<Button variant="outline">Cancel</Button>} /> <DialogClose render={<Button variant="outline">Cancel</Button>} />
<Button type="submit">Continue</Button> <Button disabled={loading} type="submit">
</div> {loading && <Loader2 className="animate-spin" />} Continue
</form> </Button>
</DialogContent> </div>
</Dialog> </form>
<Button disabled>Add Community</Button> </DialogContent>
</div> </Dialog>
); );
} }

View file

@ -128,6 +128,13 @@ export const socket = {
}), }),
response: z.object({}), response: z.object({}),
}, },
add_conversation: {
request: z.object({
chat_partner_id: z.number().optional(),
chat_partner_name: z.string().min(1).max(15).optional(),
}),
response: z.object({}),
},
} satisfies Record<string, { request: z.ZodType; response: z.ZodType }>; } satisfies Record<string, { request: z.ZodType; response: z.ZodType }>;
export type Socket = typeof socket; export type Socket = typeof socket;

View file

@ -26,9 +26,9 @@ const Toaster = ({ ...props }: ToasterProps) => {
}} }}
style={ style={
{ {
"--normal-bg": "var(--popover)", "--normal-bg": "var(--color-popover)",
"--normal-text": "var(--popover-foreground)", "--normal-text": "var(--color-popover-foreground)",
"--normal-border": "var(--border)", "--normal-border": "var(--color-border)",
"--border-radius": "var(--radius)", "--border-radius": "var(--radius)",
} as React.CSSProperties } as React.CSSProperties
} }