diff --git a/apps/studio/components/interfaces/HomePageActions.tsx b/apps/studio/components/interfaces/HomePageActions.tsx
index 2509b438ce980..0667f73c2cf0c 100644
--- a/apps/studio/components/interfaces/HomePageActions.tsx
+++ b/apps/studio/components/interfaces/HomePageActions.tsx
@@ -5,21 +5,15 @@ import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite
import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled'
import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage'
import { PROJECT_STATUS } from 'lib/constants'
-import { Filter, Grid, List, Loader2, Plus, Search, X } from 'lucide-react'
+import { Grid, List, Loader2, Plus, Search, X } from 'lucide-react'
import Link from 'next/link'
import { parseAsArrayOf, parseAsString, useQueryState } from 'nuqs'
-import {
- Button,
- Checkbox_Shadcn_,
- Label_Shadcn_,
- Popover_Shadcn_,
- PopoverContent_Shadcn_,
- PopoverTrigger_Shadcn_,
- ToggleGroup,
- ToggleGroupItem,
-} from 'ui'
+import { useEffect } from 'react'
+import { Button, ToggleGroup, ToggleGroupItem } from 'ui'
import { Input } from 'ui-patterns/DataInputs/Input'
+import { FilterPopover } from '../ui/FilterPopover'
+
interface HomePageActionsProps {
slug?: string
hideNewProject?: boolean
@@ -43,6 +37,10 @@ export const HomePageActions = ({
)
const [viewMode, setViewMode] = useLocalStorageQuery(LOCAL_STORAGE_KEYS.PROJECTS_VIEW, 'grid')
+ const [filterStatusStorage, setFilterStatusStorage, { isSuccess }] = useLocalStorageQuery<
+ string[]
+ >(LOCAL_STORAGE_KEYS.PROJECTS_FILTER, [])
+
const { isFetching: isFetchingProjects } = useOrgProjectsInfiniteQuery(
{
slug,
@@ -52,6 +50,10 @@ export const HomePageActions = ({
{ placeholderData: keepPreviousData }
)
+ useEffect(() => {
+ if (isSuccess && !!urlSlug) setFilterStatus(filterStatusStorage)
+ }, [filterStatusStorage, isSuccess, urlSlug, setFilterStatus])
+
return (
@@ -76,44 +78,18 @@ export const HomePageActions = ({
]}
/>
-
-
- }
- />
-
-
-
-
Filter projects by status
-
- {[
- { key: PROJECT_STATUS.ACTIVE_HEALTHY, label: 'Active' },
- { key: PROJECT_STATUS.INACTIVE, label: 'Paused' },
- ].map(({ key, label }) => (
-
- {
- if (filterStatus.includes(key)) {
- setFilterStatus(filterStatus.filter((y) => y !== key))
- } else {
- setFilterStatus(filterStatus.concat([key]))
- }
- }}
- />
-
- {label}
-
-
- ))}
-
-
-
-
+
setFilterStatusStorage(options)}
+ />
{isFetchingProjects && }
diff --git a/apps/studio/components/ui/FilterPopover.tsx b/apps/studio/components/ui/FilterPopover.tsx
index a052ed2dd0c94..9583df9dac1ca 100644
--- a/apps/studio/components/ui/FilterPopover.tsx
+++ b/apps/studio/components/ui/FilterPopover.tsx
@@ -1,8 +1,7 @@
import { useIntersectionObserver } from '@uidotdev/usehooks'
import { noop } from 'lodash'
-import { X } from 'lucide-react'
+import { ChevronDown, X } from 'lucide-react'
import { useEffect, useRef, useState } from 'react'
-
import {
Button,
Checkbox_Shadcn_,
@@ -12,9 +11,6 @@ import {
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
ScrollArea,
- Tooltip,
- TooltipContent,
- TooltipTrigger,
} from 'ui'
import { Input } from 'ui-patterns/DataInputs/Input'
import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
@@ -185,6 +181,7 @@ export const FilterPopover =
>({
type={buttonType ?? (activeOptions.length > 0 ? 'default' : 'dashed')}
onClick={() => setOpen(false)}
className={variant === 'rounded' ? 'rounded-full' : ''}
+ iconRight={}
>
{name}
@@ -259,10 +256,12 @@ export const FilterPopover = >({
)}
- {hasNextPage && (
+ {hasNextPage ? (
+ ) : (
+
)}
diff --git a/packages/common/constants/local-storage.ts b/packages/common/constants/local-storage.ts
index 6a6aeb6518bb5..d35915541a0f6 100644
--- a/packages/common/constants/local-storage.ts
+++ b/packages/common/constants/local-storage.ts
@@ -7,6 +7,7 @@ export const LOCAL_STORAGE_KEYS = {
SIDEBAR_BEHAVIOR: 'supabase-sidebar-behavior',
EDITOR_PANEL_STATE: 'supabase-editor-panel-state',
PROJECTS_VIEW: 'projects-view',
+ PROJECTS_FILTER: 'projects-filter',
FEEDBACK_WIDGET_CONTENT: 'feedback-widget-content',
FEEDBACK_WIDGET_SCREENSHOT: 'feedback-widget-screenshot',
INCIDENT_BANNER_DISMISSED: (id: string) => `incident-banner-dismissed-${id}`,