import * as React from 'react';
import { useLocation } from 'react-router-dom';
import styled from 'styled-components';
import type { FeedbackProps } from '@redocly/theme/core/types';
import { useThemeHooks, useThemeConfig } from '@redocly/theme/core/hooks';
import { Rating } from '@redocly/theme/components/Feedback/Rating';
import { Sentiment } from '@redocly/theme/components/Feedback/Sentiment';
import { Comment } from '@redocly/theme/components/Feedback/Comment';
import { Mood } from '@redocly/theme/components/Feedback/Mood';
import { Scale } from '@redocly/theme/components/Feedback/Scale';
import { DEFAULT_FEEDBACK_TYPE } from '@redocly/theme/core/constants';
const feedbackComponents = {
rating: Rating,
sentiment: Sentiment,
mood: Mood,
scale: Scale,
comment: Comment,
};
type FeedbackComponents = typeof feedbackComponents;
type FeedbackComponentsKeys = keyof FeedbackComponents;
export function Feedback(props: FeedbackProps & { path?: string }) {
const { useSubmitFeedback, useTelemetry } = useThemeHooks();
const { submitFeedback } = useSubmitFeedback();
const telemetry = useTelemetry();
const { pathname } = useLocation();
const { feedback: themeFeedbackConf } = useThemeConfig();
const feedbackConf = {
...themeFeedbackConf,
path: props?.path,
type: props?.type || themeFeedbackConf?.type || DEFAULT_FEEDBACK_TYPE,
settings: props?.settings || themeFeedbackConf?.settings || {},
hide: props.hide ?? themeFeedbackConf?.hide,
};
if (feedbackConf.hide) {
return null;
}
const renderFeedbackComponent = () => {
const { type, settings, path } = feedbackConf;
const FeedbackComponent = feedbackComponents[
type as FeedbackComponentsKeys
] as FeedbackComponents[FeedbackComponentsKeys];
if (!FeedbackComponent) {
return null;
}
return (
{
submitFeedback({ type, values, path });
telemetry.sendFeedbackMessage({ feedbackType: type });
}}
/>
);
};
return {renderFeedbackComponent()};
}
const FeedbackWrapper = styled.div`
padding: var(--feedback-padding);
background-color: var(--feedback-bg-color);
color: var(--feedback-font-color);
font-size: var(--feedback-font-size);
width: var(--feedback-width);
max-width: 100%;
border-radius: var(--feedback-border-radius);
@media print {
display: none;
}
`;