From 4e6ac576559f1f2777bffa0326f372e2e3b45d2f Mon Sep 17 00:00:00 2001 From: Elhamullah Hossaini Date: Wed, 14 Aug 2024 10:20:00 +0430 Subject: [PATCH 01/21] refactor: redesign discussion components with brutalist terminal aesthetic --- .../discussions/discussion-composer.tsx | 132 +++++++++----- .../discussions/discussion-detail-shell.tsx | 172 ++++++++++++------ components/discussions/discussion-reply.tsx | 43 +++-- 3 files changed, 229 insertions(+), 118 deletions(-) diff --git a/components/discussions/discussion-composer.tsx b/components/discussions/discussion-composer.tsx index 9d79076..60fab83 100644 --- a/components/discussions/discussion-composer.tsx +++ b/components/discussions/discussion-composer.tsx @@ -1,13 +1,13 @@ "use client"; +import Link from "next/link"; import { startTransition, useEffect, useMemo, useState } from "react"; -import { Input } from "@/components/ui/input"; -import { Textarea } from "@/components/ui/textarea"; +import { toast } from "sonner"; + +import { Send, AlertCircle } from "@/components/icons"; import { Button } from "@/components/ui/button"; -import { Switch } from "@/components/ui/switch"; +import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; -import { trpc } from "@/lib/trpc/client"; -import { toast } from "sonner"; import { Select, SelectContent, @@ -15,7 +15,10 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import Link from "next/link"; +import { Switch } from "@/components/ui/switch"; +import { Textarea } from "@/components/ui/textarea"; +import { discussionsConfig } from "@/config/discussions"; +import { trpc } from "@/lib/trpc/client"; type DiscussionComposerProps = { mode: "thread" | "reply"; @@ -26,12 +29,6 @@ type DiscussionComposerProps = { onSubmitted?: () => void; }; -const categoryOptions = [ - { value: "trending", label: "General" }, - { value: "help", label: "Help" }, - { value: "meta", label: "Meta" }, -]; - export function DiscussionComposer({ mode, problemId, @@ -40,19 +37,24 @@ export function DiscussionComposer({ category, onSubmitted, }: DiscussionComposerProps) { + const { thread: config, categories } = discussionsConfig; + const utils = trpc.useUtils(); const sessionQuery = trpc.auth.getSession.useQuery(undefined, { staleTime: 30_000 }); const isAuthenticated = Boolean(sessionQuery.data?.user); + const [title, setTitle] = useState(""); const [content, setContent] = useState(""); const [spoiler, setSpoiler] = useState(false); const [selectedCategory, setSelectedCategory] = useState(category ?? "trending"); const [isSubmitting, setIsSubmitting] = useState(false); + useEffect(() => { if (!problemId && category && category !== selectedCategory) { startTransition(() => setSelectedCategory(category)); } }, [category, problemId, selectedCategory]); + const createThread = trpc.discussions.createThread.useMutation({ onSuccess: () => { toast.success("Thread posted"); @@ -66,6 +68,7 @@ export function DiscussionComposer({ onError: (error) => toast.error(error.message ?? "Unable to create thread"), onSettled: () => setIsSubmitting(false), }); + const replyMutation = trpc.discussions.reply.useMutation({ onSuccess: () => { toast.success("Reply posted"); @@ -113,10 +116,14 @@ export function DiscussionComposer({ if (!isAuthenticated) { return ( -
-

Sign in to join discussions.

-
); @@ -126,47 +133,88 @@ export function DiscussionComposer({
{mode === "thread" ? ( <> - setTitle(event.target.value)} - placeholder="Thread title" - required - /> - {!problemId ? ( -
- +
+ + setTitle(event.target.value)} + placeholder="What would you like to discuss?" + required + className="h-11 rounded-none border-2 border-border font-mono text-sm transition-colors focus:border-primary" + /> +
+ {!problemId && ( +
+
- ) : null} + )} ) : null} -