Skip to content

Commit 08850dd

Browse files
committed
Use peer filter values
1 parent f9133cc commit 08850dd

File tree

4 files changed

+63
-35
lines changed

4 files changed

+63
-35
lines changed

components/dashboard/filters/FilterDropdown.tsx

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ const FilterButton = ({ filterKey, setFilter, filters, tmpValue, open, highlight
204204
};
205205

206206
function FilterDropdown<FV, FM>({
207-
filterKey: currentFilterKey,
207+
filterKey: initialFilterKey,
208208
remainingFilters,
209209
filters,
210210
setFilter,
@@ -223,28 +223,34 @@ function FilterDropdown<FV, FM>({
223223
locked?: boolean;
224224
}) {
225225
const [open, setOpen] = React.useState(false);
226-
const [filterKey, setFilterKey] = React.useState(currentFilterKey);
227-
const [tmpValue, setTmpValue] = React.useState(values[currentFilterKey]);
226+
const [activeFilterKey, setActiveFilterKey] = React.useState(initialFilterKey);
227+
const currentFilterValue = values[initialFilterKey];
228+
const [tmpValue, setTmpValue] = React.useState(currentFilterValue);
228229

229230
React.useEffect(() => {
230-
setFilterKey(currentFilterKey);
231-
setTmpValue(values[currentFilterKey]);
232-
}, [remainingFilters, currentFilterKey, values]);
231+
// Reset if the currently selected filter type is no longer available
232+
// (e.g., it was just applied and moved to displayed filters)
233+
if (activeFilterKey && remainingFilters && !remainingFilters.includes(activeFilterKey)) {
234+
setActiveFilterKey(initialFilterKey);
235+
}
236+
// Always sync tmpValue with the current filter value
237+
setTmpValue(currentFilterValue);
238+
}, [activeFilterKey, initialFilterKey, currentFilterValue, remainingFilters]);
233239

234240
return (
235241
<Popover
236242
open={open}
237243
onOpenChange={open => {
238244
if (!locked) {
239-
setFilterKey(currentFilterKey);
240-
setTmpValue(values[currentFilterKey]);
245+
setActiveFilterKey(initialFilterKey);
246+
setTmpValue(values[initialFilterKey]);
241247
setOpen(open);
242248
}
243249
}}
244250
>
245251
<PopoverAnchor>
246252
<FilterButton
247-
filterKey={filterKey}
253+
filterKey={activeFilterKey}
248254
filters={filters}
249255
tmpValue={tmpValue}
250256
setFilter={setFilter}
@@ -255,19 +261,19 @@ function FilterDropdown<FV, FM>({
255261
/>
256262
</PopoverAnchor>
257263
<PopoverContent className="w-[260px] p-0" align="start">
258-
{filterKey ? (
264+
{activeFilterKey ? (
259265
<SetFilter
260266
tmpValue={tmpValue}
261267
setTmpValue={setTmpValue}
262268
filters={filters}
263-
filterKey={filterKey}
269+
filterKey={activeFilterKey}
264270
setFilter={setFilter}
265271
setOpen={setOpen}
266272
meta={meta}
267273
values={values}
268274
/>
269275
) : (
270-
<ChooseFilterType remainingFilters={remainingFilters} filters={filters} setFilterKey={setFilterKey} />
276+
<ChooseFilterType remainingFilters={remainingFilters} filters={filters} setFilterKey={setActiveFilterKey} />
271277
)}
272278
</PopoverContent>
273279
</Popover>

components/dashboard/filters/Filterbar.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@ import { Separator } from '../../ui/Separator';
1212
import FilterDropdown from './FilterDropdown';
1313

1414
function useGetFilterbarOptions(filters, values, defaultSchemaValues, meta) {
15-
const filterKeys = Object.keys(filters);
15+
const filterKeys = React.useMemo(() => Object.keys(filters), [filters]);
1616
const [displayedFilters, setDisplayedFilters] = React.useState(
1717
filterKeys.filter(key => filterShouldDisplay(key, { values, filters, defaultSchemaValues, meta })),
1818
);
19-
const remainingFilters = filterKeys.filter(key =>
20-
filterShouldBeInAddFilterOptions(key, { values, filters, defaultSchemaValues, meta }),
19+
20+
const remainingFilters = React.useMemo(
21+
() =>
22+
filterKeys.filter(key => filterShouldBeInAddFilterOptions(key, { values, filters, defaultSchemaValues, meta })),
23+
[filterKeys, values, filters, defaultSchemaValues, meta],
2124
);
2225

2326
// When the values change, this effect makes sure to update the displayed filter keys array and maintain the order of the filters

components/dashboard/filters/CreatedByFilter.tsx renamed to components/dashboard/filters/OrderCreatedByFilter.tsx

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import { z } from 'zod';
66
import type { FilterComponentProps, FilterConfig } from '@/lib/filters/filter-types';
77
import { isMulti } from '@/lib/filters/schemas';
88
import { gql } from '@/lib/graphql/helpers';
9-
import type { AccountHoverCardFieldsFragment } from '@/lib/graphql/types/v2/graphql';
9+
import type { AccountHoverCardFieldsFragment, HostContext } from '@/lib/graphql/types/v2/graphql';
1010
import type { ExpectedFundsFilter } from '@/lib/graphql/types/v2/schema';
1111

1212
import { accountHoverCardFields } from '../../AccountHoverCard';
13+
import type { FilterValues as OrderFilterValues } from '../sections/contributions/filters';
1314

1415
import ComboSelectFilter from './ComboSelectFilter';
1516
import { AccountRenderer } from './HostedAccountFilter';
@@ -20,8 +21,15 @@ const createdByFilterSearchQuery = gql`
2021
$searchTerm: String
2122
$expectedFundsFilter: ExpectedFundsFilter
2223
$hostContext: HostContext
24+
$status: [OrderStatus]
2325
) {
24-
orders(account: $account, filter: INCOMING, expectedFundsFilter: $expectedFundsFilter, hostContext: $hostContext) {
26+
orders(
27+
account: $account
28+
filter: INCOMING
29+
expectedFundsFilter: $expectedFundsFilter
30+
hostContext: $hostContext
31+
status: $status
32+
) {
2533
createdByUsers(searchTerm: $searchTerm, limit: 20) {
2634
nodes {
2735
id
@@ -33,7 +41,7 @@ const createdByFilterSearchQuery = gql`
3341
${accountHoverCardFields}
3442
`;
3543

36-
export type CreatedByFilterMeta = {
44+
export type OrderCreatedByFilterMeta = {
3745
accountSlug: string;
3846
expectedFundsFilter?: ExpectedFundsFilter;
3947
};
@@ -46,13 +54,19 @@ const resultNodeToOption = (account: Partial<AccountHoverCardFieldsFragment>) =>
4654
value: account.slug,
4755
});
4856

49-
// This filter is currently only for Host Expected Funds,
50-
// if generalized to other tools we should provide the correct filters through the metadata
51-
function CreatedByFilter({ meta, ...props }: FilterComponentProps<z.infer<typeof schema>, CreatedByFilterMeta>) {
52-
const [options, setOptions] = React.useState<{ label: React.ReactNode; keywords: string[]; value: string }[]>([]);
57+
type RequiredFilterValueTypes = {
58+
hostContext?: HostContext;
59+
expectedFundsFilter?: ExpectedFundsFilter;
60+
status?: OrderFilterValues['status'];
61+
};
5362

63+
function OrderCreatedByFilter({
64+
meta,
65+
values,
66+
...props
67+
}: FilterComponentProps<z.infer<typeof schema>, OrderCreatedByFilterMeta, RequiredFilterValueTypes>) {
68+
const [options, setOptions] = React.useState<{ label: React.ReactNode; keywords: string[]; value: string }[]>([]);
5469
const [search, { loading, data }] = useLazyQuery(createdByFilterSearchQuery, {
55-
variables: { expectedFundsFilter: 'ONLY_PENDING', hostContext: 'ALL' },
5670
fetchPolicy: 'cache-first',
5771
notifyOnNetworkStatusChange: true,
5872
});
@@ -63,11 +77,13 @@ function CreatedByFilter({ meta, ...props }: FilterComponentProps<z.infer<typeof
6377
variables: {
6478
account: { slug: meta.accountSlug },
6579
searchTerm: searchTerm || undefined,
66-
account: { slug: meta.accountSlug },
80+
hostContext: values.hostContext,
81+
expectedFundsFilter: values.expectedFundsFilter,
82+
status: values.status,
6783
},
6884
});
6985
},
70-
[meta.accountSlug, search],
86+
[meta.accountSlug, search, values.hostContext, values.expectedFundsFilter, values.status],
7187
);
7288

7389
// Load initial options on mount
@@ -76,9 +92,12 @@ function CreatedByFilter({ meta, ...props }: FilterComponentProps<z.infer<typeof
7692
variables: {
7793
account: { slug: meta.accountSlug },
7894
searchTerm: undefined,
95+
hostContext: values.hostContext,
96+
expectedFundsFilter: values.expectedFundsFilter,
97+
status: values.status,
7998
},
8099
});
81-
}, [meta.accountSlug, search]);
100+
}, [meta.accountSlug, search, values.hostContext, values.expectedFundsFilter, values.status]);
82101

83102
React.useEffect(() => {
84103
if (!loading && data?.orders?.createdByUsers?.nodes) {
@@ -89,11 +108,11 @@ function CreatedByFilter({ meta, ...props }: FilterComponentProps<z.infer<typeof
89108
return <ComboSelectFilter options={options} loading={loading} searchFunc={searchFunc} isMulti {...props} />;
90109
}
91110

92-
export const createdByFilter: FilterConfig<z.infer<typeof schema>> = {
111+
export const orderCreatedByFilter: FilterConfig<z.infer<typeof schema>> = {
93112
schema: schema,
94113
filter: {
95114
labelMsg: defineMessage({ defaultMessage: 'Created by', id: 'Agreement.createdBy' }),
96-
Component: CreatedByFilter,
115+
Component: OrderCreatedByFilter,
97116
valueRenderer: ({ value, ...props }) => <AccountRenderer account={{ slug: value }} {...props} />,
98117
},
99118
toVariables: (values, key) => ({ [key]: values.map(slug => ({ slug })) }),

components/dashboard/sections/contributions/HostExpectedFunds.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useContext } from 'react';
22
import { useQuery } from '@apollo/client';
33
import { PlusIcon } from 'lucide-react';
44
import { FormattedMessage, useIntl } from 'react-intl';
5-
import type { z } from 'zod';
5+
import { z } from 'zod';
66

77
import type { FilterComponentConfigs, FiltersToVariables, Views } from '../../../../lib/filters/filter-types';
88
import { gql } from '../../../../lib/graphql/helpers';
@@ -16,9 +16,9 @@ import { UpgradePlanCTA } from '@/components/platform-subscriptions/UpgradePlanC
1616
import { Button } from '../../../ui/Button';
1717
import { DashboardContext } from '../../DashboardContext';
1818
import DashboardHeader from '../../DashboardHeader';
19-
import { createdByFilter, type CreatedByFilterMeta } from '../../filters/CreatedByFilter';
2019
import { expectedDateFilter } from '../../filters/DateFilter';
2120
import { HostContextFilter, hostContextFilter } from '../../filters/HostContextFilter';
21+
import { orderCreatedByFilter, type OrderCreatedByFilterMeta } from '../../filters/OrderCreatedByFilter';
2222
import type { DashboardSectionProps } from '../../types';
2323

2424
import ContributionsTable from './ContributionsTable';
@@ -101,23 +101,24 @@ const hostExpectedFundsMetadataQuery = gql`
101101
const schema = baseSchema.extend({
102102
expectedDate: expectedDateFilter.schema,
103103
hostContext: hostContextFilter.schema,
104-
createdBy: createdByFilter.schema,
104+
createdBy: orderCreatedByFilter.schema,
105+
expectedFundsFilter: z.literal(ExpectedFundsFilter.ONLY_PENDING).default(ExpectedFundsFilter.ONLY_PENDING),
105106
});
106107

107-
type FilterMeta = BaseFilterMeta & CreatedByFilterMeta;
108+
type FilterMeta = BaseFilterMeta & OrderCreatedByFilterMeta;
108109

109110
type FilterValues = z.infer<typeof schema>;
110111

111112
const toVariables: FiltersToVariables<FilterValues, DashboardOrdersQueryVariables, FilterMeta> = {
112113
...(baseToVariables as FiltersToVariables<FilterValues, DashboardOrdersQueryVariables, FilterMeta>),
113114
expectedDate: expectedDateFilter.toVariables,
114-
createdBy: createdByFilter.toVariables,
115+
createdBy: orderCreatedByFilter.toVariables,
115116
};
116117

117118
const filters: FilterComponentConfigs<FilterValues, FilterMeta> = {
118119
...baseFilters,
119120
expectedDate: expectedDateFilter.filter,
120-
createdBy: createdByFilter.filter,
121+
createdBy: orderCreatedByFilter.filter,
121122
};
122123

123124
function HostExpectedFunds({ accountSlug }: DashboardSectionProps) {
@@ -194,7 +195,6 @@ function HostExpectedFunds({ accountSlug }: DashboardSectionProps) {
194195
slug: accountSlug,
195196
filter: 'INCOMING',
196197
includeIncognito: true,
197-
expectedFundsFilter: ExpectedFundsFilter.ONLY_PENDING,
198198
...queryFilter.variables,
199199
},
200200

0 commit comments

Comments
 (0)