mirror of
https://github.com/Unleash/unleash.git
synced 2024-12-22 19:07:54 +01:00
3ee2e5ae9b
Co-authored-by: sjaanus <sellinjaanus@gmail.com>
58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import { useMemo, useState } from 'react';
|
|
import { sortTypes } from 'utils/sortTypes';
|
|
import type { Row, SortByFn } from 'react-table';
|
|
import { usePlausibleTracker } from './usePlausibleTracker';
|
|
|
|
type WithFavorite = {
|
|
favorite: boolean;
|
|
[key: string]: any;
|
|
};
|
|
|
|
export const sortTypesWithFavorites: Record<
|
|
keyof typeof sortTypes,
|
|
SortByFn<object> // TODO: possible type improvement in react-table v8
|
|
> = Object.assign(
|
|
{},
|
|
...Object.entries(sortTypes).map(([key, value]) => ({
|
|
[key]: (
|
|
v1: Row<WithFavorite>,
|
|
v2: Row<WithFavorite>,
|
|
id: string,
|
|
desc?: boolean
|
|
) => {
|
|
if (v1?.original?.favorite && !v2?.original?.favorite)
|
|
return desc ? 1 : -1;
|
|
if (!v1?.original?.favorite && v2?.original?.favorite)
|
|
return desc ? -1 : 1;
|
|
return value(v1, v2, id, desc);
|
|
},
|
|
}))
|
|
);
|
|
|
|
/**
|
|
* Move favorites to the top of the list.
|
|
*/
|
|
export const usePinnedFavorites = (initialState = false) => {
|
|
const [isFavoritesPinned, setIsFavoritesPinned] = useState(initialState);
|
|
const { trackEvent } = usePlausibleTracker();
|
|
|
|
const onChangeIsFavoritePinned = (newState: boolean) => {
|
|
trackEvent('favorite', {
|
|
props: {
|
|
eventType: `features ${!newState ? 'un' : ''}pinned `,
|
|
},
|
|
});
|
|
setIsFavoritesPinned(newState);
|
|
};
|
|
|
|
const enhancedSortTypes = useMemo(() => {
|
|
return isFavoritesPinned ? sortTypesWithFavorites : sortTypes;
|
|
}, [isFavoritesPinned]);
|
|
|
|
return {
|
|
isFavoritesPinned,
|
|
onChangeIsFavoritePinned,
|
|
sortTypes: enhancedSortTypes,
|
|
};
|
|
};
|