1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-24 17:51:14 +02:00
unleash.unleash/frontend/src/component/feedback/FeedbackCESContext/FeedbackCESProvider.tsx
olav dbb62631a6 feat: add FeedbackCES component (#826)
* 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
2022-03-31 09:23:46 +02:00

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>
);
};