From a6dec2092a0684cdef008b05664fe8720f0d9547 Mon Sep 17 00:00:00 2001 From: Lorenzo Corallo Date: Sun, 12 Apr 2026 23:36:39 +0200 Subject: [PATCH 01/22] checkpoint: user-list user-details (no cards) --- src/app/(auth)/onboarding/no-role/page.tsx | 2 +- .../dashboard/(active)/account/telegram.tsx | 2 +- .../_components/set-assoc-number-dialog.tsx | 2 +- .../(active)/azure/members/columns.tsx | 2 +- .../dashboard/(active)/azure/members/page.tsx | 2 +- .../(active)/azure/members/table.tsx | 4 +- .../(active)/telegram/grants/delete-grant.tsx | 22 +- .../(active)/telegram/grants/grant-list.tsx | 4 +- .../(active)/telegram/grants/new-grant.tsx | 38 +- .../(active)/telegram/groups/page.tsx | 324 +++++++++--------- .../telegram/user-details/add-role.tsx | 14 +- .../telegram/user-details/card-audit-log.tsx | 10 +- .../user-details/card-group-admin.tsx | 2 +- .../telegram/user-details/card-message.tsx | 2 +- .../telegram/user-details/card-user-grant.tsx | 11 +- .../telegram/user-details/card-user-info.tsx | 2 +- .../user-details/delete-group-admin.tsx | 24 +- .../telegram/user-details/new-group-admin.tsx | 20 +- .../(active)/telegram/user-details/page.tsx | 93 ++--- .../telegram/user-details/remove-role.tsx | 14 +- .../(active)/telegram/user-list/page.tsx | 12 +- src/app/dashboard/layout.tsx | 5 +- src/app/layout.tsx | 12 +- src/app/testtrpc/page.tsx | 2 +- src/components/create-assoc-member.tsx | 2 +- src/components/user-select.tsx | 4 +- src/lib/trpc/client.tsx | 56 --- src/lib/trpc/query-client.ts | 21 -- src/lib/utils/telegram.ts | 2 +- src/server/actions/get-user.ts | 15 + src/server/trpc/index.tsx | 16 + src/{lib => server}/trpc/server.tsx | 2 +- src/{lib => server}/trpc/types.tsx | 0 33 files changed, 329 insertions(+), 414 deletions(-) delete mode 100644 src/lib/trpc/client.tsx delete mode 100644 src/lib/trpc/query-client.ts create mode 100644 src/server/actions/get-user.ts create mode 100644 src/server/trpc/index.tsx rename src/{lib => server}/trpc/server.tsx (96%) rename src/{lib => server}/trpc/types.tsx (100%) diff --git a/src/app/(auth)/onboarding/no-role/page.tsx b/src/app/(auth)/onboarding/no-role/page.tsx index c890e55..e04ac23 100644 --- a/src/app/(auth)/onboarding/no-role/page.tsx +++ b/src/app/(auth)/onboarding/no-role/page.tsx @@ -2,8 +2,8 @@ import Image from "next/image" import { redirect } from "next/navigation" import loginSvg2 from "@/assets/svg/login-2.svg" import { Card } from "@/components/ui/card" -import { getQueryClient, trpc } from "@/lib/trpc/server" import { getServerSession } from "@/server/auth" +import { getQueryClient, trpc } from "@/server/trpc/server" import { Logout } from "../link/logout" export default async function OnboardingNoRole() { diff --git a/src/app/dashboard/(active)/account/telegram.tsx b/src/app/dashboard/(active)/account/telegram.tsx index f5261e1..0f1e66d 100644 --- a/src/app/dashboard/(active)/account/telegram.tsx +++ b/src/app/dashboard/(active)/account/telegram.tsx @@ -1,7 +1,7 @@ "use client" import { useQuery } from "@tanstack/react-query" import { useSession } from "@/lib/auth" -import { useTRPC } from "@/lib/trpc/client" +import { useTRPC } from "@/server/trpc" export function Telegram() { const { data: session, isPending } = useSession() diff --git a/src/app/dashboard/(active)/azure/members/_components/set-assoc-number-dialog.tsx b/src/app/dashboard/(active)/azure/members/_components/set-assoc-number-dialog.tsx index ace742d..e286b43 100644 --- a/src/app/dashboard/(active)/azure/members/_components/set-assoc-number-dialog.tsx +++ b/src/app/dashboard/(active)/azure/members/_components/set-assoc-number-dialog.tsx @@ -14,8 +14,8 @@ import { } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" -import { useTRPC } from "@/lib/trpc/client" import { wait } from "@/lib/utils" +import { useTRPC } from "@/server/trpc" export function SetAssocNumberDialog({ userId }: { userId: string }) { const [value, setValue] = useState("") diff --git a/src/app/dashboard/(active)/azure/members/columns.tsx b/src/app/dashboard/(active)/azure/members/columns.tsx index 7476cc2..fddd659 100644 --- a/src/app/dashboard/(active)/azure/members/columns.tsx +++ b/src/app/dashboard/(active)/azure/members/columns.tsx @@ -1,7 +1,7 @@ "use client" import { createColumnHelper, type Row } from "@tanstack/react-table" import { Badge } from "@/components/ui/badge" -import type { ApiOutput } from "@/lib/trpc/types" +import type { ApiOutput } from "@/server/trpc/types" import { SetAssocNumberDialog } from "./_components/set-assoc-number-dialog" type ParsedUser = ApiOutput["azure"]["members"]["getAll"][0] diff --git a/src/app/dashboard/(active)/azure/members/page.tsx b/src/app/dashboard/(active)/azure/members/page.tsx index 84e7e68..3a72300 100644 --- a/src/app/dashboard/(active)/azure/members/page.tsx +++ b/src/app/dashboard/(active)/azure/members/page.tsx @@ -3,7 +3,7 @@ import Link from "next/link" import { Suspense } from "react" import { ErrorBoundary } from "react-error-boundary" import { Spinner } from "@/components/spinner" -import { getQueryClient, trpc } from "@/lib/trpc/server" +import { getQueryClient, trpc } from "@/server/trpc/server" import { AssocTable } from "./table" export default async function AssocMembers() { diff --git a/src/app/dashboard/(active)/azure/members/table.tsx b/src/app/dashboard/(active)/azure/members/table.tsx index c2d8b65..5258332 100644 --- a/src/app/dashboard/(active)/azure/members/table.tsx +++ b/src/app/dashboard/(active)/azure/members/table.tsx @@ -5,8 +5,8 @@ import { useState } from "react" import { CreateAssocUser } from "@/components/create-assoc-member" import { DataTable } from "@/components/data-table" import { Badge } from "@/components/ui/badge" -import { useTRPC } from "@/lib/trpc/client" -import type { ApiOutput } from "@/lib/trpc/types" +import { useTRPC } from "@/server/trpc" +import type { ApiOutput } from "@/server/trpc/types" import { columns } from "./columns" type ParsedUser = ApiOutput["azure"]["members"]["getAll"][0] diff --git a/src/app/dashboard/(active)/telegram/grants/delete-grant.tsx b/src/app/dashboard/(active)/telegram/grants/delete-grant.tsx index 286f0b2..22414d1 100644 --- a/src/app/dashboard/(active)/telegram/grants/delete-grant.tsx +++ b/src/app/dashboard/(active)/telegram/grants/delete-grant.tsx @@ -18,26 +18,26 @@ import { } from "@/components/ui/alert-dialog" import { Button } from "@/components/ui/button" import { useSession } from "@/lib/auth" -import { useTRPC } from "@/lib/trpc/client" +// import { useTRPC } from "@/server/trpc" export function DeleteGrant({ userId }: { userId: number }) { const sesh = useSession() - const qc = useQueryClient() - const trpc = useTRPC() + // const qc = useQueryClient() + // const trpc = useTRPC() const removerId = sesh.data?.user.telegramId - const { mutateAsync } = useMutation(trpc.tg.grants.interrupt.mutationOptions()) + // const { mutateAsync } = useMutation(trpc.tg.grants.interrupt.mutationOptions()) const [open, setOpen] = useState(false) async function interrupt() { if (!removerId) return toast.error("Invalid session, try to reload the page") - const { error } = await mutateAsync({ userId, interruptedById: removerId, sendTgLog: true }) + // const { error } = await mutateAsync({ userId, interruptedById: removerId, sendTgLog: true }) - if (error === "NOT_FOUND") toast.info("The grant was expired or already interrupted") - else if (error === "UNAUTHORIZED") toast.error("You don't have enought permission") - else if (error === "INTERNAL_SERVER_ERROR") toast.error("There was an internal server error") - else toast.success("Grant interrupted successfully") + // if (error === "NOT_FOUND") toast.info("The grant was expired or already interrupted") + // else if (error === "UNAUTHORIZED") toast.error("You don't have enought permission") + // else if (error === "INTERNAL_SERVER_ERROR") toast.error("There was an internal server error") + // else toast.success("Grant interrupted successfully") handleOpenChange(false) } @@ -45,8 +45,8 @@ export function DeleteGrant({ userId }: { userId: number }) { function handleOpenChange(v: boolean) { setOpen(v) if (v === false) { - qc.invalidateQueries(trpc.tg.grants.getOngoing.queryOptions()) - qc.invalidateQueries(trpc.tg.grants.checkUser.queryOptions({ userId })) + // qc.invalidateQueries(trpc.tg.grants.getOngoing.queryOptions()) + // qc.invalidateQueries(trpc.tg.grants.checkUser.queryOptions({ userId })) } } diff --git a/src/app/dashboard/(active)/telegram/grants/grant-list.tsx b/src/app/dashboard/(active)/telegram/grants/grant-list.tsx index 0516719..ff32ce2 100644 --- a/src/app/dashboard/(active)/telegram/grants/grant-list.tsx +++ b/src/app/dashboard/(active)/telegram/grants/grant-list.tsx @@ -1,8 +1,8 @@ "use client" import { useQuery } from "@tanstack/react-query" import { format } from "date-fns" -import { useTRPC } from "@/lib/trpc/client" -import type { ApiOutput } from "@/lib/trpc/types" +import { useTRPC } from "@/server/trpc" +import type { ApiOutput } from "@/server/trpc/types" import { DeleteGrant } from "./delete-grant" type Grants = NonNullable diff --git a/src/app/dashboard/(active)/telegram/grants/new-grant.tsx b/src/app/dashboard/(active)/telegram/grants/new-grant.tsx index 34649e8..6e6f589 100644 --- a/src/app/dashboard/(active)/telegram/grants/new-grant.tsx +++ b/src/app/dashboard/(active)/telegram/grants/new-grant.tsx @@ -33,16 +33,16 @@ import { } from "@/components/ui/select" import { UserSelect } from "@/components/user-select" import { useSession } from "@/lib/auth" -import { useTRPC } from "@/lib/trpc/client" -import type { TgUser } from "@/lib/trpc/types" +// import { useTRPC } from "@/server/trpc" +import type { TgUser } from "@/server/trpc/types" export function NewGrant() { const sesh = useSession() const adderId = sesh.data?.user.telegramId - const trpc = useTRPC() - const qc = useQueryClient() - const mutation = useMutation(trpc.tg.grants.create.mutationOptions()) + // const trpc = useTRPC() + // const qc = useQueryClient() + // const mutation = useMutation(trpc.tg.grants.create.mutationOptions()) const [open, setOpen] = useState(false) const [user, setUser] = useState(null) @@ -59,8 +59,8 @@ export function NewGrant() { setStartDate(undefined) setEndDate(undefined) setReason("") - qc.invalidateQueries(trpc.tg.grants.getOngoing.queryOptions()) - if (user) qc.invalidateQueries(trpc.tg.grants.checkUser.queryOptions({ userId: user.id })) + // qc.invalidateQueries(trpc.tg.grants.getOngoing.queryOptions()) + // if (user) qc.invalidateQueries(trpc.tg.grants.checkUser.queryOptions({ userId: user.id })) } } @@ -81,19 +81,19 @@ export function NewGrant() { async function create() { if (!user || !startDate || !endDate || !adderId) return - const res = await mutation.mutateAsync({ - userId: user.id, - adderId, - since: startDate, - until: endDate, - reason: reason || undefined, - sendTgLog: true, - }) + // const res = await mutation.mutateAsync({ + // userId: user.id, + // adderId, + // since: startDate, + // until: endDate, + // reason: reason || undefined, + // sendTgLog: true, + // }) - if (res.error === "UNAUTHORIZED") toast.error("You don't have permission to create grants.") - else if (res.error === "ALREADY_EXISTING") toast.error("This user already has an ongoing grant.") - else if (res.error === "INTERNAL_SERVER_ERROR") toast.error("There was a server error.") - else toast.success("Grant created successfully!") + // if (res.error === "UNAUTHORIZED") toast.error("You don't have permission to create grants.") + // else if (res.error === "ALREADY_EXISTING") toast.error("This user already has an ongoing grant.") + // else if (res.error === "INTERNAL_SERVER_ERROR") toast.error("There was a server error.") + // else toast.success("Grant created successfully!") handleOpenChange(false) } diff --git a/src/app/dashboard/(active)/telegram/groups/page.tsx b/src/app/dashboard/(active)/telegram/groups/page.tsx index 914fd63..09c349d 100644 --- a/src/app/dashboard/(active)/telegram/groups/page.tsx +++ b/src/app/dashboard/(active)/telegram/groups/page.tsx @@ -1,162 +1,162 @@ -"use client" -import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" -import { ArrowLeft, Copy, Pen, RefreshCcw, Search, X } from "lucide-react" -import Link from "next/link" -import { useState } from "react" -import { toast } from "sonner" -import { Badge } from "@/components/ui/badge" -import { Button } from "@/components/ui/button" -import { Input } from "@/components/ui/input" -import { Label } from "@/components/ui/label" -import { useTRPC } from "@/lib/trpc/client" -import type { ApiOutput } from "@/lib/trpc/types" - -type Groups = ApiOutput["tg"]["groups"]["search"]["groups"] - -export default function TgGroups() { - const [query, setQuery] = useState("") - - const trpc = useTRPC() - const qc = useQueryClient() - const queryOpts = trpc.tg.groups.search.queryOptions({ query, limit: 20, showHidden: true }) - const { data: allGroups, isLoading, refetch } = useQuery(trpc.tg.groups.getAll.queryOptions()) - - const [rows, setRows] = useState(!isLoading ? (allGroups ?? []) : []) - - async function search() { - const res = await qc.fetchQuery(queryOpts) - setRows(res.groups) - return res - } - - async function invalidate() { - await qc.invalidateQueries(queryOpts) - refetch() - await search() - } - - async function submit(e: React.FormEvent) { - e.preventDefault() - - const res = await search() - if (res.count === 0) toast.warning("No groups found with this query") - else toast.info(`Found ${res.count} groups`) - } - - function reset() { - setRows(allGroups ?? []) - setQuery("") - } - - return ( -
- - Back - -
-
- -
- { - setQuery(e.target.value) - }} - value={query} - /> - - {rows.length > 0 && ( - - )} - -
- Max results: 20 -
-
-
-
-

telegram ID

-

Title

-

Tag

-

Invite Link

-

Hide

-
- {rows.map((r) => ( - - ))} -
-
- ) -} - -function GroupRow({ row: r, invalidate }: { row: Groups[number]; invalidate: () => void }) { - const trpc = useTRPC() - const { mutateAsync: hideMutate } = useMutation(trpc.tg.groups.setHide.mutationOptions()) - - async function toggleHide() { - const ok = await hideMutate({ telegramId: r.telegramId, hide: !r.hide }).catch(() => false) - if (!ok) toast.error("The field cannot be modified") - - toast.success("Hide option toggled!") - invalidate() - } - - return ( -
-

{r.telegramId}

-

{r.title}

-

{r.tag ? `@${r.tag}` : ``}

-
- {r.link && ( - - {r.link} - - )} - -
-
-

{r.hide ? HIDDEN : Visibile}

- -
-
- ) -} +// "use client" +// import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" +// import { ArrowLeft, Copy, Pen, RefreshCcw, Search, X } from "lucide-react" +// import Link from "next/link" +// import { useState } from "react" +// import { toast } from "sonner" +// import { Badge } from "@/components/ui/badge" +// import { Button } from "@/components/ui/button" +// import { Input } from "@/components/ui/input" +// import { Label } from "@/components/ui/label" +// import { useTRPC } from "@/server/trpc" +// import type { ApiOutput } from "@/server/trpc/types" +// +// type Groups = ApiOutput["tg"]["groups"]["search"]["groups"] +// +// export default function TgGroups() { +// const [query, setQuery] = useState("") +// +// const trpc = useTRPC() +// const qc = useQueryClient() +// const queryOpts = trpc.tg.groups.search.queryOptions({ query, limit: 20, showHidden: true }) +// const { data: allGroups, isLoading, refetch } = useQuery(trpc.tg.groups.getAll.queryOptions()) +// +// const [rows, setRows] = useState(!isLoading ? (allGroups ?? []) : []) +// +// async function search() { +// const res = await qc.fetchQuery(queryOpts) +// setRows(res.groups) +// return res +// } +// +// async function invalidate() { +// await qc.invalidateQueries(queryOpts) +// refetch() +// await search() +// } +// +// async function submit(e: React.FormEvent) { +// e.preventDefault() +// +// const res = await search() +// if (res.count === 0) toast.warning("No groups found with this query") +// else toast.info(`Found ${res.count} groups`) +// } +// +// function reset() { +// setRows(allGroups ?? []) +// setQuery("") +// } +// +// return ( +//
+// +// Back +// +//
+//
+// +//
+// { +// setQuery(e.target.value) +// }} +// value={query} +// /> +// +// {rows.length > 0 && ( +// +// )} +// +//
+// Max results: 20 +//
+//
+//
+//
+//

telegram ID

+//

Title

+//

Tag

+//

Invite Link

+//

Hide

+//
+// {rows.map((r) => ( +// +// ))} +//
+//
+// ) +// } +// +// function GroupRow({ row: r, invalidate }: { row: Groups[number]; invalidate: () => void }) { +// const trpc = useTRPC() +// const { mutateAsync: hideMutate } = useMutation(trpc.tg.groups.setHide.mutationOptions()) +// +// async function toggleHide() { +// const ok = await hideMutate({ telegramId: r.telegramId, hide: !r.hide }).catch(() => false) +// if (!ok) toast.error("The field cannot be modified") +// +// toast.success("Hide option toggled!") +// invalidate() +// } +// +// return ( +//
+//

{r.telegramId}

+//

{r.title}

+//

{r.tag ? `@${r.tag}` : ``}

+//
+// {r.link && ( +// +// {r.link} +// +// )} +// +//
+//
+//

{r.hide ? HIDDEN : Visibile}

+// +//
+//
+// ) +// } diff --git a/src/app/dashboard/(active)/telegram/user-details/add-role.tsx b/src/app/dashboard/(active)/telegram/user-details/add-role.tsx index b9a3997..b21085f 100644 --- a/src/app/dashboard/(active)/telegram/user-details/add-role.tsx +++ b/src/app/dashboard/(active)/telegram/user-details/add-role.tsx @@ -19,8 +19,8 @@ import { } from "@/components/ui/dialog" import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { useSession } from "@/lib/auth" -import { useTRPC } from "@/lib/trpc/client" -import type { ApiInput, ApiOutput } from "@/lib/trpc/types" +// import { useTRPC } from "@/server/trpc" +import type { ApiInput, ApiOutput } from "@/server/trpc/types" type User = ApiOutput["tg"]["users"]["getByUsername"]["user"] type Roles = NonNullable @@ -43,14 +43,14 @@ export function AddRole({ user, alreadyRoles }: { user: User; alreadyRoles: Role label: `${g.slice(0, 1).toUpperCase()}${g.slice(1)}`, })) - const trpc = useTRPC() - const qc = useQueryClient() + // const trpc = useTRPC() + // const qc = useQueryClient() const router = useRouter() const [open, setOpen] = useState(false) const [selectedRole, setSelectedRole] = useState(null) - const submitMutation = useMutation(trpc.tg.permissions.addRole.mutationOptions()) + // const submitMutation = useMutation(trpc.tg.permissions.addRole.mutationOptions()) async function submit() { if (!adderId) return toast.warning("Invalid session, try reloading the page") @@ -58,7 +58,7 @@ export function AddRole({ user, alreadyRoles }: { user: User; alreadyRoles: Role if (!user) return toast.warning("Invalid user, try restarting the dialog") try { - await submitMutation.mutateAsync({ adderId, userId: user.id, role: selectedRole }) + // await submitMutation.mutateAsync({ adderId, userId: user.id, role: selectedRole }) toast.info(`Role added`) handleOpenChange(false) router.refresh() @@ -73,7 +73,7 @@ export function AddRole({ user, alreadyRoles }: { user: User; alreadyRoles: Role setOpen(v) if (v === false) { // closing - qc.invalidateQueries(trpc.tg.permissions.getRoles.queryOptions({ userId: user?.id ?? 0 })) + // qc.invalidateQueries(trpc.tg.permissions.getRoles.queryOptions({ userId: user?.id ?? 0 })) setSelectedRole(null) } } diff --git a/src/app/dashboard/(active)/telegram/user-details/card-audit-log.tsx b/src/app/dashboard/(active)/telegram/user-details/card-audit-log.tsx index 70cb5a5..cde007f 100644 --- a/src/app/dashboard/(active)/telegram/user-details/card-audit-log.tsx +++ b/src/app/dashboard/(active)/telegram/user-details/card-audit-log.tsx @@ -1,14 +1,14 @@ import { useQuery } from "@tanstack/react-query" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" -import { useTRPC } from "@/lib/trpc/client" -import type { ApiOutput } from "@/lib/trpc/types" import { fmtUser } from "@/lib/utils/telegram" +// import { useTRPC } from "@/server/trpc" +import type { ApiOutput } from "@/server/trpc/types" type Log = NonNullable[number] export function AuditLogCard({ log: m }: { log: Log }) { - const trpc = useTRPC() + // const trpc = useTRPC() - const { data: admin } = useQuery(trpc.tg.users.get.queryOptions({ userId: m.adminId })) + // const { data: admin } = useQuery(trpc.tg.users.get.queryOptions({ userId: m.adminId })) return ( @@ -21,7 +21,7 @@ export function AuditLogCard({ log: m }: { log: Log }) { {m.groupTitle && {m.groupTitle}} [{m.groupId}]

Admin ID: -

{admin?.user && fmtUser(admin.user)}

+ {/*

{admin?.user && fmtUser(admin.user)}

*/} {m.createdAt && ( <> diff --git a/src/app/dashboard/(active)/telegram/user-details/card-group-admin.tsx b/src/app/dashboard/(active)/telegram/user-details/card-group-admin.tsx index 693195a..fce04b0 100644 --- a/src/app/dashboard/(active)/telegram/user-details/card-group-admin.tsx +++ b/src/app/dashboard/(active)/telegram/user-details/card-group-admin.tsx @@ -1,7 +1,7 @@ import { Code } from "@/components/code" import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" -import type { ApiOutput } from "@/lib/trpc/types" import { stripChatId } from "@/lib/utils/telegram" +import type { ApiOutput } from "@/server/trpc/types" import { DeleteGroupAdmin } from "./delete-group-admin" type User = ApiOutput["tg"]["users"]["getByUsername"]["user"] diff --git a/src/app/dashboard/(active)/telegram/user-details/card-message.tsx b/src/app/dashboard/(active)/telegram/user-details/card-message.tsx index b2828da..46603cc 100644 --- a/src/app/dashboard/(active)/telegram/user-details/card-message.tsx +++ b/src/app/dashboard/(active)/telegram/user-details/card-message.tsx @@ -1,8 +1,8 @@ import { ExternalLinkIcon } from "lucide-react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardFooter } from "@/components/ui/card" -import type { ApiOutput } from "@/lib/trpc/types" import { stripChatId } from "@/lib/utils/telegram" +import type { ApiOutput } from "@/server/trpc/types" type Message = NonNullable[number] export function MessageCard({ message: m }: { message: Message }) { diff --git a/src/app/dashboard/(active)/telegram/user-details/card-user-grant.tsx b/src/app/dashboard/(active)/telegram/user-details/card-user-grant.tsx index 5809b79..029cf89 100644 --- a/src/app/dashboard/(active)/telegram/user-details/card-user-grant.tsx +++ b/src/app/dashboard/(active)/telegram/user-details/card-user-grant.tsx @@ -3,15 +3,16 @@ import { useQuery } from "@tanstack/react-query" import { format } from "date-fns" import { Sparkle, Star } from "lucide-react" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" -import { useTRPC } from "@/lib/trpc/client" -import type { TgUser } from "@/lib/trpc/types" +// import { useTRPC } from "@/server/trpc" +import type { TgUser } from "@/server/trpc/types" import { DeleteGrant } from "../grants/delete-grant" export function UserGrantCard({ user }: { user: TgUser }) { - const trpc = useTRPC() - const { data } = useQuery(trpc.tg.grants.checkUser.queryOptions({ userId: user.id })) + // const trpc = useTRPC() + // const { data } = useQuery(trpc.tg.grants.checkUser.queryOptions({ userId: user.id })) - if (!data) return null + // if (!data) return null + return null return ( data.grant && ( diff --git a/src/app/dashboard/(active)/telegram/user-details/card-user-info.tsx b/src/app/dashboard/(active)/telegram/user-details/card-user-info.tsx index 70e7034..c9fc339 100644 --- a/src/app/dashboard/(active)/telegram/user-details/card-user-info.tsx +++ b/src/app/dashboard/(active)/telegram/user-details/card-user-info.tsx @@ -2,7 +2,7 @@ import { Star } from "lucide-react" import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" import { useSession } from "@/lib/auth" -import type { ApiOutput } from "@/lib/trpc/types" +import type { ApiOutput } from "@/server/trpc/types" import { AddRole } from "./add-role" import { RemoveRole } from "./remove-role" diff --git a/src/app/dashboard/(active)/telegram/user-details/delete-group-admin.tsx b/src/app/dashboard/(active)/telegram/user-details/delete-group-admin.tsx index 86bb9c7..b4a58ea 100644 --- a/src/app/dashboard/(active)/telegram/user-details/delete-group-admin.tsx +++ b/src/app/dashboard/(active)/telegram/user-details/delete-group-admin.tsx @@ -19,28 +19,28 @@ import { } from "@/components/ui/alert-dialog" import { Button } from "@/components/ui/button" import { useSession } from "@/lib/auth" -import { useTRPC } from "@/lib/trpc/client" +// import { useTRPC } from "@/server/trpc" export function DeleteGroupAdmin({ userId, chatId }: { userId: number; chatId: number }) { const router = useRouter() const sesh = useSession() - const qc = useQueryClient() - const trpc = useTRPC() + // const qc = useQueryClient() + // const trpc = useTRPC() const removerId = sesh.data?.user.telegramId - const { mutateAsync } = useMutation(trpc.tg.permissions.removeGroup.mutationOptions()) + // const { mutateAsync } = useMutation(trpc.tg.permissions.removeGroup.mutationOptions()) const [open, setOpen] = useState(false) async function deleteGroupAdmin() { if (!removerId) return toast.error("Invalid session, try to reload the page") - const { error } = await mutateAsync({ removerId, userId, groupId: chatId }) - if (error) { - toast.error("There was an error") - console.error(error) - } else { - toast.success("Group Admin deleted!") - } + // const { error } = await mutateAsync({ removerId, userId, groupId: chatId }) + // if (error) { + // toast.error("There was an error") + // console.error(error) + // } else { + // toast.success("Group Admin deleted!") + // } handleOpenChange(false) } @@ -48,7 +48,7 @@ export function DeleteGroupAdmin({ userId, chatId }: { userId: number; chatId: n function handleOpenChange(v: boolean) { setOpen(v) if (v === false) { - qc.invalidateQueries(trpc.tg.permissions.getRoles.queryOptions({ userId })) + // qc.invalidateQueries(trpc.tg.permissions.getRoles.queryOptions({ userId })) router.refresh() } } diff --git a/src/app/dashboard/(active)/telegram/user-details/new-group-admin.tsx b/src/app/dashboard/(active)/telegram/user-details/new-group-admin.tsx index 066658a..8d4aac5 100644 --- a/src/app/dashboard/(active)/telegram/user-details/new-group-admin.tsx +++ b/src/app/dashboard/(active)/telegram/user-details/new-group-admin.tsx @@ -19,8 +19,8 @@ import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger } from "@/components/ui/select" import { useSession } from "@/lib/auth" -import { useTRPC } from "@/lib/trpc/client" -import type { ApiOutput } from "@/lib/trpc/types" +// import { useTRPC } from "@/server/trpc" +import type { ApiOutput } from "@/server/trpc/types" type Groups = ApiOutput["tg"]["groups"]["search"]["groups"] type User = ApiOutput["tg"]["users"]["getByUsername"]["user"] @@ -29,8 +29,8 @@ export function NewGroupAdmin({ user, alreadyIn }: { user: User; alreadyIn: numb const sesh = useSession() const adderId = sesh.data?.user.telegramId - const trpc = useTRPC() - const qc = useQueryClient() + // const trpc = useTRPC() + // const qc = useQueryClient() const router = useRouter() const [open, setOpen] = useState(false) @@ -38,16 +38,16 @@ export function NewGroupAdmin({ user, alreadyIn }: { user: User; alreadyIn: numb const [groups, setGroups] = useState([]) const [selectedGroup, setSelectedGroup] = useState(null) - const queryOpts = trpc.tg.groups.search.queryOptions({ query: groupQuery, limit: 20, showHidden: true }) + // const queryOpts = trpc.tg.groups.search.queryOptions({ query: groupQuery, limit: 20, showHidden: true }) async function searchGroup(e: React.FormEvent) { e.preventDefault() - const res = await qc.fetchQuery(queryOpts) - setGroups(res.groups.filter((g) => !alreadyIn.includes(g.telegramId))) + // const res = await qc.fetchQuery(queryOpts) + // setGroups(res.groups.filter((g) => !alreadyIn.includes(g.telegramId))) } - const submitMutation = useMutation(trpc.tg.permissions.addGroup.mutationOptions()) + // const submitMutation = useMutation(trpc.tg.permissions.addGroup.mutationOptions()) async function submit() { if (!adderId) return toast.warning("Invalid session, try reloading the page") @@ -55,7 +55,7 @@ export function NewGroupAdmin({ user, alreadyIn }: { user: User; alreadyIn: numb if (!user) return toast.warning("Invalid user, try restarting the dialog") try { - await submitMutation.mutateAsync({ adderId, groupId: selectedGroup?.telegramId, userId: user.id }) + // await submitMutation.mutateAsync({ adderId, groupId: selectedGroup?.telegramId, userId: user.id }) toast.info(`Group admin added`) handleOpenChange(false) router.refresh() @@ -76,7 +76,7 @@ export function NewGroupAdmin({ user, alreadyIn }: { user: User; alreadyIn: numb setOpen(v) if (v === false) { // closing - qc.invalidateQueries(trpc.tg.permissions.getRoles.queryOptions({ userId: user?.id ?? 0 })) + // qc.invalidateQueries(trpc.tg.permissions.getRoles.queryOptions({ userId: user?.id ?? 0 })) reset() } } diff --git a/src/app/dashboard/(active)/telegram/user-details/page.tsx b/src/app/dashboard/(active)/telegram/user-details/page.tsx index a8b5343..9bcc45c 100644 --- a/src/app/dashboard/(active)/telegram/user-details/page.tsx +++ b/src/app/dashboard/(active)/telegram/user-details/page.tsx @@ -1,14 +1,12 @@ "use client" -import { useQuery, useQueryClient } from "@tanstack/react-query" import { ArrowLeft, RefreshCcw, Search, X } from "lucide-react" import Link from "next/link" -import { useState } from "react" -import { toast } from "sonner" +import { startTransition, useActionState, useState } from "react" +import { Spinner } from "@/components/spinner" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" -import { useTRPC } from "@/lib/trpc/client" -import type { ApiOutput } from "@/lib/trpc/types" +import { getUser } from "@/server/actions/get-user" import { AuditLogCard } from "./card-audit-log" import { GroupAdminCard } from "./card-group-admin" import { MessageCard } from "./card-message" @@ -16,45 +14,15 @@ import { UserGrantCard } from "./card-user-grant" import { UserInfoCard } from "./card-user-info" import { NewGroupAdmin } from "./new-group-admin" -type User = ApiOutput["tg"]["users"]["getByUsername"]["user"] +type Data = Awaited> export default function TgUsers() { - const [query, setQuery] = useState("") - const [user, setUser] = useState(null) - - const trpc = useTRPC() - - const qc = useQueryClient() - const searchQuery = trpc.tg.users.getByUsername.queryOptions({ username: query }) - const { data: userData, refetch: refetch1 } = useQuery( - trpc.tg.permissions.getRoles.queryOptions({ userId: user?.id ?? 0 }) - ) - const { data: messages, refetch: refetch2 } = useQuery( - trpc.tg.messages.getLastByUser.queryOptions({ userId: user?.id ?? 0 }) - ) - const { data: auditLog, refetch: refetch3 } = useQuery( - trpc.tg.auditLog.getById.queryOptions({ targetId: user?.id ?? 0 }) - ) - - async function refetch() { - await Promise.all([refetch1(), refetch2(), refetch3]) - toast.success("Reloaded correctly") - } - - async function search(e: React.FormEvent) { - e.preventDefault() - - const res = await qc.fetchQuery(searchQuery) - if (!res.user) { - setUser(null) - return toast.warning("No user found with this username") - } - setUser(res.user) - } + const [username, setUsername] = useState("") + const [data, action, pending] = useActionState(() => (username ? getUser(username) : null), null) function reset() { - setUser(null) - setQuery("") + setUsername("") + action() } return ( @@ -63,7 +31,7 @@ export default function TgUsers() { Back -
+