11"use client"
2- import { useQueryClient } from "@tanstack/react-query"
3- import { ArrowLeft , Copy , Search , X } from "lucide-react"
2+ import { useMutation , useQueryClient } from "@tanstack/react-query"
3+ import { ArrowLeft , Copy , Pen , Search , X } from "lucide-react"
44import Link from "next/link"
55import { useState } from "react"
66import { toast } from "sonner"
7+ import { Badge } from "@/components/ui/badge"
78import { Button } from "@/components/ui/button"
89import { Input } from "@/components/ui/input"
910import { Label } from "@/components/ui/label"
@@ -17,14 +18,25 @@ export default function TgGroups() {
1718
1819 const trpc = useTRPC ( )
1920 const qc = useQueryClient ( )
20- const queryOpts = trpc . tg . groups . search . queryOptions ( { query, limit : 20 } )
21+ const queryOpts = trpc . tg . groups . search . queryOptions ( { query, limit : 20 , showHidden : true } )
2122
2223 const [ rows , setRows ] = useState < Groups > ( [ ] )
23- async function search ( e : React . FormEvent < HTMLFormElement > ) {
24- e . preventDefault ( )
2524
25+ async function search ( ) {
2626 const res = await qc . fetchQuery ( queryOpts )
2727 setRows ( res . groups )
28+ return res
29+ }
30+
31+ async function invalidate ( ) {
32+ await qc . invalidateQueries ( queryOpts )
33+ await search ( )
34+ }
35+
36+ async function submit ( e : React . FormEvent < HTMLFormElement > ) {
37+ e . preventDefault ( )
38+
39+ const res = await search ( )
2840 if ( res . count === 0 ) toast . warning ( "No groups found with this query" )
2941 else toast . info ( `Found ${ res . count } groups` )
3042 }
@@ -39,7 +51,7 @@ export default function TgGroups() {
3951 < Link href = "/dashboard/telegram" className = "flex gap-1 items-center text-muted-foreground mb-2 hover:underline" >
4052 < ArrowLeft size = { 16 } /> Back
4153 </ Link >
42- < form onSubmit = { search } className = "pt-2 gap-y-4 flex flex-col justify-start items-start" >
54+ < form onSubmit = { submit } className = "pt-2 gap-y-4 flex flex-col justify-start items-start" >
4355 < div className = "flex gap-2 flex-col items-start justify-start" >
4456 < Label htmlFor = "email" className = "text-base" >
4557 Search
@@ -70,23 +82,35 @@ export default function TgGroups() {
7082 </ div >
7183 </ form >
7284 < div className = "flex flex-col w-full items-start justify-start py-4" >
73- < div className = "grid gap-4 items-center grid-cols-4 w-full border-b py-2" >
85+ < div className = "grid gap-4 items-center grid-cols-5 w-full border-b py-2" >
7486 < p > telegram ID</ p >
7587 < p > Title</ p >
7688 < p > Tag</ p >
7789 < p > Invite Link</ p >
90+ < p > Hide</ p >
7891 </ div >
7992 { rows . map ( ( r ) => (
80- < GroupRow row = { r } key = { r . telegramId } />
93+ < GroupRow row = { r } key = { r . telegramId } invalidate = { invalidate } />
8194 ) ) }
8295 </ div >
8396 </ div >
8497 )
8598}
8699
87- function GroupRow ( { row : r } : { row : Groups [ number ] } ) {
100+ function GroupRow ( { row : r , invalidate } : { row : Groups [ number ] ; invalidate : ( ) => void } ) {
101+ const trpc = useTRPC ( )
102+ const { mutateAsync : hideMutate } = useMutation ( trpc . tg . groups . setHide . mutationOptions ( ) )
103+
104+ async function toggleHide ( ) {
105+ const ok = await hideMutate ( { telegramId : r . telegramId , hide : ! r . hide } ) . catch ( ( ) => false )
106+ if ( ! ok ) toast . error ( "The field cannot be modified" )
107+
108+ toast . success ( "Hide option toggled!" )
109+ invalidate ( )
110+ }
111+
88112 return (
89- < div className = "grid gap-4 items-center grid-cols-4 border-b py-2 w-full" >
113+ < div className = "grid gap-4 items-center grid-cols-5 border-b py-2 w-full" >
90114 < p > { r . telegramId } </ p >
91115 < p > { r . title } </ p >
92116 < p className = { r . tag ? "" : "text-muted-foreground italic" } > { r . tag ? `@${ r . tag } ` : `<unset>` } </ p >
@@ -97,15 +121,15 @@ function GroupRow({ row: r }: { row: Groups[number] }) {
97121 target = "_blank"
98122 rel = "noopener noreferrer"
99123 aria-label = { `Link for group ${ r . title } ` }
100- className = "hover:underline"
124+ className = "hover:underline text-xs "
101125 >
102126 { r . link }
103127 </ a >
104128 ) }
105129 < Button
106130 type = "button"
107131 variant = "outline"
108- size = "icon"
132+ size = "icon-sm "
109133 className = { ! r . link ? "hidden" : "" }
110134 onClick = { async ( ) => {
111135 try {
@@ -121,6 +145,12 @@ function GroupRow({ row: r }: { row: Groups[number] }) {
121145 < Copy />
122146 </ Button >
123147 </ div >
148+ < div className = "flex items-center justify-start gap-2" >
149+ < p > { r . hide ? < Badge className = "bg-yellow-800" > HIDDEN</ Badge > : < Badge variant = "secondary" > Visibile</ Badge > } </ p >
150+ < Button type = "button" variant = "outline" size = "icon-sm" className = { ! r . link ? "hidden" : "" } onClick = { toggleHide } >
151+ < Pen />
152+ </ Button >
153+ </ div >
124154 </ div >
125155 )
126156}
0 commit comments