1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-12-22 19:07:54 +01:00
unleash.unleash/frontend/src/hooks/useWeakMap.ts
olav baae88c7a5 feat: add new feature strategy create/edit pages (#739)
* refactor: add param helper hooks

* refactor: remove first add strategy link

* refactor: add more types to useStrategies

* refactor: port strategy utils to TS

* refactor: replace rollout strategy icon

* refactor: use a named export for useFeature

* refactor: add more types to useFeature

* refactor: adjust code box styles

* refactor: add missing PermissionButton variant prop

* refactor: add missing button icon label

* refactor: move common feature components

* refactor: fix StrategyConstraints error prop types

* refactor: fix GeneralStrategy prop types

* feat: add new feature strategy create/edit pages

* refactor: remove feature strategies page

* refactor: fix types in GeneralStrategy

* refactor: use ConstraintAccordion on the new pages

* refactor: use ConditionallyRender for remove button

* refactor: rename FeatureStrategyForm component

* refactor: use the Edit icon for feature strategies

* refactor: fix initial edit mode for new constraints

* refactor: add FeatureStrategyMenu to closed accordions

* refactor: allow editing multiple constraints

* refactor: show single-valued constraint value

* refactor: increase feature overview strategy width

* refactor: add remove button to feature overview strategies

* refactor: move createEmptyConstraint to own file

* refactor: disable submit button for invalid constraints

* refactor: fix nested paragraphs on the metrics page

* refactor: move create/edit feature strategy to modal

* refactor: always open new constraints in edit mode

* refactor: use a PermissionButton for the save button

* refactor: remvoe unsaved constraints on cancel

* refactor: clarify useConstraintsValidation logic

* refactor: remove unused strategy descriptions

* refactor: restore Rollout icon

* refactor: remove sidebar modal slide animation

* refactor: avoid constraint accordion toggle on edit/delete

* refactor: truncate long strategy names

* refactor: find the correct remove button
2022-03-09 14:59:24 +01:00

34 lines
857 B
TypeScript

import { useState, useCallback, useRef, useMemo } from 'react';
interface IUseWeakMap<K, V> {
set: (k: K, v: V) => void;
get: (k: K) => V | undefined;
}
// A WeakMap associates extra data with an object instance.
// This hook encapsulates a WeakMap, and will trigger
// a rerender whenever `set` is called.
export const useWeakMap = <K extends object, V>(
initial?: WeakMap<K, V>
): IUseWeakMap<K, V> => {
const ref = useRef(initial ?? new WeakMap<K, V>());
const [, setState] = useState(0);
const set = useCallback((key: K, value: V) => {
ref.current.set(key, value);
setState(prev => prev + 1);
}, []);
const get = useCallback((key: K) => {
return ref.current.get(key);
}, []);
return useMemo(
() => ({
set,
get,
}),
[set, get]
);
};