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
-
-
-
-
-
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
+//
+//
+//
+//
+//
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
-