load and merge filters
This commit is contained in:
parent
5b6dcb37f6
commit
6cf502800e
@ -62,6 +62,7 @@ const RoutesLoading = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const createRoutesSet = (type, useRoutes) => () => {
|
const createRoutesSet = (type, useRoutes) => () => {
|
||||||
const results = useRoutes();
|
const results = useRoutes();
|
||||||
const pageKey = {
|
const pageKey = {
|
||||||
|
@ -65,6 +65,9 @@ const filtersEqual = (a, b) => {
|
|||||||
* Deep copy of filters
|
* Deep copy of filters
|
||||||
*/
|
*/
|
||||||
const cloneFilters = (filters) => {
|
const cloneFilters = (filters) => {
|
||||||
|
return filters;
|
||||||
|
|
||||||
|
/*
|
||||||
const nextFilters = [
|
const nextFilters = [
|
||||||
{...filters[FILTER_GROUP_SOURCES]},
|
{...filters[FILTER_GROUP_SOURCES]},
|
||||||
{...filters[FILTER_GROUP_ASNS]},
|
{...filters[FILTER_GROUP_ASNS]},
|
||||||
@ -83,6 +86,7 @@ const cloneFilters = (filters) => {
|
|||||||
nextFilters[FILTER_GROUP_LARGE_COMMUNITIES].filters =
|
nextFilters[FILTER_GROUP_LARGE_COMMUNITIES].filters =
|
||||||
[...nextFilters[FILTER_GROUP_LARGE_COMMUNITIES].filters];
|
[...nextFilters[FILTER_GROUP_LARGE_COMMUNITIES].filters];
|
||||||
return nextFilters;
|
return nextFilters;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -114,31 +118,6 @@ const cmpFilterCommunity = (set, filter) => {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Merge filters
|
|
||||||
*/
|
|
||||||
const _mergeFilters = (a, b) => {
|
|
||||||
let groups = initializeFilterState();
|
|
||||||
let setCmp = [];
|
|
||||||
setCmp[FILTER_GROUP_SOURCES] = cmpFilterValue;
|
|
||||||
setCmp[FILTER_GROUP_ASNS] = cmpFilterValue;
|
|
||||||
setCmp[FILTER_GROUP_COMMUNITIES] = cmpFilterCommunity;
|
|
||||||
setCmp[FILTER_GROUP_EXT_COMMUNITIES] = cmpFilterCommunity;
|
|
||||||
setCmp[FILTER_GROUP_LARGE_COMMUNITIES] = cmpFilterCommunity;
|
|
||||||
for (const i in groups) {
|
|
||||||
groups[i].filters = mergeFilterSet(setCmp[i], a[i].filters, b[i].filters);
|
|
||||||
}
|
|
||||||
return groups;
|
|
||||||
}
|
|
||||||
|
|
||||||
const mergeFilters = (a, ...other) => {
|
|
||||||
let result = cloneFilters(a);
|
|
||||||
for (const filters of other) {
|
|
||||||
result = _mergeFilters(result, cloneFilters(filters));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Merge list of filters
|
* Merge list of filters
|
||||||
*/
|
*/
|
||||||
@ -156,6 +135,43 @@ const mergeFilterSet = (inSet, a, b) => {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Merge filters
|
||||||
|
*/
|
||||||
|
const _mergeFilters = (a, b) => {
|
||||||
|
let groups = initializeFilterState();
|
||||||
|
if (!a || !b) {
|
||||||
|
return groups;
|
||||||
|
}
|
||||||
|
let setCmp = [];
|
||||||
|
setCmp[FILTER_GROUP_SOURCES] = cmpFilterValue;
|
||||||
|
setCmp[FILTER_GROUP_ASNS] = cmpFilterValue;
|
||||||
|
setCmp[FILTER_GROUP_COMMUNITIES] = cmpFilterCommunity;
|
||||||
|
setCmp[FILTER_GROUP_EXT_COMMUNITIES] = cmpFilterCommunity;
|
||||||
|
setCmp[FILTER_GROUP_LARGE_COMMUNITIES] = cmpFilterCommunity;
|
||||||
|
for (const i in groups) {
|
||||||
|
if (a[i]?.filters && b[i]?.filters) {
|
||||||
|
groups[i].filters = mergeFilterSet(setCmp[i], a[i].filters, b[i].filters);
|
||||||
|
}
|
||||||
|
else if(a[i]?.filters) {
|
||||||
|
groups[i].filters = a[i].filters;
|
||||||
|
}
|
||||||
|
else if(b[i]?.filters) {
|
||||||
|
groups[i].filters = b[i].filters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mergeFilters = (a, ...other) => {
|
||||||
|
let result = a;
|
||||||
|
for (const filters of other) {
|
||||||
|
result = _mergeFilters(result, filters);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Does a single group have any filters?
|
* Does a single group have any filters?
|
||||||
*/
|
*/
|
||||||
@ -281,3 +297,58 @@ const decodeFiltersApplied = (params) => {
|
|||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FiltersContext
|
||||||
|
*/
|
||||||
|
const initialContext = {
|
||||||
|
applied: [],
|
||||||
|
available: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
const FiltersContext = createContext(initialContext);
|
||||||
|
|
||||||
|
export const useFilters = () => useContext(FiltersContext);
|
||||||
|
|
||||||
|
const useRoutesFilters = (routes) => {
|
||||||
|
return useMemo(() => {
|
||||||
|
if (!routes.requested || routes.loading) {
|
||||||
|
return { applied: [], available: [] };
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
applied: routes.filtersApplied,
|
||||||
|
available: routes.filtersAvailable,
|
||||||
|
};
|
||||||
|
}, [routes]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RoutesFiltersProvider merged the filters from the
|
||||||
|
* received, filtered and noexport responses
|
||||||
|
*/
|
||||||
|
export const RoutesFiltersProvider = ({children}) => {
|
||||||
|
const received = useRoutesFilters(useRoutesReceived());
|
||||||
|
const filtered = useRoutesFilters(useRoutesFiltered());
|
||||||
|
const noexport = useRoutesFilters(useRoutesNotExported());
|
||||||
|
|
||||||
|
const filters = useMemo(() => {
|
||||||
|
const applied = mergeFilters(
|
||||||
|
received.applied,
|
||||||
|
filtered.applied,
|
||||||
|
noexport.applied,
|
||||||
|
);
|
||||||
|
const available = mergeFilters(
|
||||||
|
received.available,
|
||||||
|
filtered.available,
|
||||||
|
noexport.available,
|
||||||
|
);
|
||||||
|
return { applied, available };
|
||||||
|
}, [received, filtered, noexport]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<FiltersContext.Provider value={filters}>
|
||||||
|
{children}
|
||||||
|
</FiltersContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
@ -34,6 +34,10 @@ import { RoutesReceivedProvider
|
|||||||
, useRoutesLoading
|
, useRoutesLoading
|
||||||
}
|
}
|
||||||
from 'app/context/routes';
|
from 'app/context/routes';
|
||||||
|
import { RoutesFiltersProvider
|
||||||
|
, useFilters
|
||||||
|
}
|
||||||
|
from 'app/context/filters';
|
||||||
|
|
||||||
import PageHeader
|
import PageHeader
|
||||||
from 'app/components/page/Header';
|
from 'app/components/page/Header';
|
||||||
@ -94,6 +98,8 @@ const RoutesPageSearch = () => {
|
|||||||
const RoutesPageContent = () => {
|
const RoutesPageContent = () => {
|
||||||
const localRelatedPeers = useLocalRelatedPeers();
|
const localRelatedPeers = useLocalRelatedPeers();
|
||||||
const isLoading = useRoutesLoading();
|
const isLoading = useRoutesLoading();
|
||||||
|
const filters = useFilters();
|
||||||
|
console.log(filters);
|
||||||
|
|
||||||
let pageClass = "routeservers-page";
|
let pageClass = "routeservers-page";
|
||||||
if (localRelatedPeers.length > 1) {
|
if (localRelatedPeers.length > 1) {
|
||||||
@ -126,10 +132,6 @@ const RoutesPageContent = () => {
|
|||||||
linkProps={this.props.linkProps}
|
linkProps={this.props.linkProps}
|
||||||
filtersApplied={this.props.filtersApplied}
|
filtersApplied={this.props.filtersApplied}
|
||||||
filtersAvailable={this.props.filtersAvailable} />
|
filtersAvailable={this.props.filtersAvailable} />
|
||||||
<RelatedPeersCard
|
|
||||||
neighbors={this.props.allRelatedPeers}
|
|
||||||
rsId={this.props.params.routeserverId}
|
|
||||||
protocolId={this.props.params.protocolId} />
|
|
||||||
*/ }
|
*/ }
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -173,7 +175,9 @@ const RoutesPage = () => {
|
|||||||
query={query.q}
|
query={query.q}
|
||||||
page={query.pr}>{/* innermost used for api status */}
|
page={query.pr}>{/* innermost used for api status */}
|
||||||
|
|
||||||
|
<RoutesFiltersProvider>
|
||||||
<RoutesPageContent />
|
<RoutesPageContent />
|
||||||
|
</RoutesFiltersProvider>
|
||||||
|
|
||||||
</RoutesReceivedProvider>
|
</RoutesReceivedProvider>
|
||||||
</RoutesFilteredProvider>
|
</RoutesFilteredProvider>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user