11import { t } from "@lingui/core/macro" ;
22import { Trans } from "@lingui/react/macro" ;
3+ import { Badge } from "@repo/ui/components/Badge" ;
4+ import { Button } from "@repo/ui/components/Button" ;
35import { InputGroup , InputGroupAddon , InputGroupButton , InputGroupInput } from "@repo/ui/components/InputGroup" ;
46import { ToggleGroup , ToggleGroupItem } from "@repo/ui/components/ToggleGroup" ;
57import { useDebounce } from "@repo/ui/hooks/useDebounce" ;
68import { useNavigate } from "@tanstack/react-router" ;
7- import { SearchIcon , XIcon } from "lucide-react" ;
9+ import { CloudOffIcon , SearchIcon , TriangleAlertIcon , XIcon } from "lucide-react" ;
810import { useEffect , useState } from "react" ;
911
1012import type { SortableTenantProperties } from "@/shared/lib/api/client" ;
@@ -16,9 +18,11 @@ interface AccountsToolbarProps {
1618 search : string | undefined ;
1719 plans : SubscriptionPlan [ ] ;
1820 statuses : TenantStatusFilter [ ] ;
21+ unsynced : boolean ;
22+ driftDetected : boolean ;
1923}
2024
21- export function AccountsToolbar ( { search, plans, statuses } : Readonly < AccountsToolbarProps > ) {
25+ export function AccountsToolbar ( { search, plans, statuses, unsynced , driftDetected } : Readonly < AccountsToolbarProps > ) {
2226 const navigate = useNavigate ( ) ;
2327 const [ searchInput , setSearchInput ] = useState ( search ?? "" ) ;
2428 const debouncedSearch = useDebounce ( searchInput , 500 ) ;
@@ -137,6 +141,49 @@ export function AccountsToolbar({ search, plans, statuses }: Readonly<AccountsTo
137141 < Trans > Free</ Trans >
138142 </ ToggleGroupItem >
139143 </ ToggleGroup >
144+
145+ < IssueFilterBadges unsynced = { unsynced } driftDetected = { driftDetected } />
140146 </ div >
141147 ) ;
142148}
149+
150+ function IssueFilterBadges ( { unsynced, driftDetected } : Readonly < { unsynced : boolean ; driftDetected : boolean } > ) {
151+ const navigate = useNavigate ( ) ;
152+ const clear = ( key : "unsynced" | "driftDetected" ) => ( ) =>
153+ navigate ( {
154+ to : "/accounts" ,
155+ search : ( previous ) => ( {
156+ search : previous . search ,
157+ plans : previous . plans ,
158+ statuses : previous . statuses ,
159+ unsynced : key === "unsynced" ? undefined : previous . unsynced ,
160+ driftDetected : key === "driftDetected" ? undefined : previous . driftDetected ,
161+ orderBy : previous . orderBy as SortableTenantProperties | undefined ,
162+ sortOrder : previous . sortOrder ,
163+ pageOffset : undefined
164+ } )
165+ } ) ;
166+
167+ return (
168+ < >
169+ { unsynced && (
170+ < Badge variant = "outline" className = "gap-1.5 border-amber-500/30 text-amber-600" >
171+ < CloudOffIcon className = "size-3.5" aria-hidden = { true } />
172+ < Trans > Not synced yet</ Trans >
173+ < Button variant = "ghost" size = "icon-xs" aria-label = { t `Clear filter` } onClick = { clear ( "unsynced" ) } >
174+ < XIcon className = "size-3" />
175+ </ Button >
176+ </ Badge >
177+ ) }
178+ { driftDetected && (
179+ < Badge variant = "outline" className = "gap-1.5 border-amber-500/30 text-amber-600" >
180+ < TriangleAlertIcon className = "size-3.5" aria-hidden = { true } />
181+ < Trans > Drift detected</ Trans >
182+ < Button variant = "ghost" size = "icon-xs" aria-label = { t `Clear filter` } onClick = { clear ( "driftDetected" ) } >
183+ < XIcon className = "size-3" />
184+ </ Button >
185+ </ Badge >
186+ ) }
187+ </ >
188+ ) ;
189+ }
0 commit comments