mirror of
https://github.com/Unleash/unleash.git
synced 2024-12-28 00:06:53 +01:00
baae88c7a5
* 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
34 lines
857 B
TypeScript
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]
|
|
);
|
|
};
|