mirror of
https://github.com/Unleash/unleash.git
synced 2025-09-24 17:51:14 +02:00
* refactor: add screen-reader-only util class * refactor: move FeedbackNPS component * feat: add FeedbackCES component * refactor: improve hidden checkbox styles * refactor: fix IFeedbackEndpointRequestBody source type * refactor: remove unnecessary event.persist() calls * refactor: remove disableEscapeKeyDown from FeedbackCES modal * refactor: make textarea label customizable * refactor: store feedback state on the backend * refactor: add FeedbackCESForm snapshot test * refactor: use extant IAuthFeedback type * refactor: fix showNPSFeedback logic for multiple feedback types
61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
import React, {
|
|
useState,
|
|
ReactNode,
|
|
useMemo,
|
|
useCallback,
|
|
useEffect,
|
|
} from 'react';
|
|
import { FeedbackCES } from 'component/feedback/FeedbackCES/FeedbackCES';
|
|
import {
|
|
feedbackCESContext,
|
|
ShowFeedbackCES,
|
|
IFeedbackCESContext,
|
|
IFeedbackCESState,
|
|
} from 'component/feedback/FeedbackCESContext/FeedbackCESContext';
|
|
import { useFeedbackCESSeen } from 'component/feedback/FeedbackCESContext/useFeedbackCESSeen';
|
|
import { useFeedbackCESEnabled } from 'component/feedback/FeedbackCESContext/useFeedbackCESEnabled';
|
|
|
|
interface IFeedbackProviderProps {
|
|
children: ReactNode;
|
|
}
|
|
|
|
export const FeedbackCESProvider = ({ children }: IFeedbackProviderProps) => {
|
|
const [state, setState] = useState<IFeedbackCESState>();
|
|
const { isSeen, setSeen } = useFeedbackCESSeen();
|
|
const enabled = useFeedbackCESEnabled();
|
|
|
|
useEffect(() => {
|
|
state && setSeen(state);
|
|
}, [state, setSeen]);
|
|
|
|
// Set a new feedback state iff the path is unseen and CES is enabled.
|
|
const showFeedbackCES: ShowFeedbackCES = useCallback(
|
|
value => {
|
|
setState(prev => {
|
|
const next = value instanceof Function ? value(prev) : value;
|
|
return !enabled || !next || isSeen(next) ? undefined : next;
|
|
});
|
|
},
|
|
[enabled, isSeen]
|
|
);
|
|
|
|
const hideFeedbackCES = useCallback(() => {
|
|
setState(undefined);
|
|
}, [setState]);
|
|
|
|
const value: IFeedbackCESContext = useMemo(
|
|
() => ({
|
|
showFeedbackCES: showFeedbackCES,
|
|
hideFeedbackCES: hideFeedbackCES,
|
|
}),
|
|
[showFeedbackCES, hideFeedbackCES]
|
|
);
|
|
|
|
return (
|
|
<feedbackCESContext.Provider value={value}>
|
|
{children}
|
|
<FeedbackCES state={state} />
|
|
</feedbackCESContext.Provider>
|
|
);
|
|
};
|