diff --git a/packages/ffe-feedback-react/src/Feedback.stories.tsx b/packages/ffe-feedback-react/src/Feedback.stories.tsx index 635407f5dc..42fcc0dfd5 100644 --- a/packages/ffe-feedback-react/src/Feedback.stories.tsx +++ b/packages/ffe-feedback-react/src/Feedback.stories.tsx @@ -10,8 +10,20 @@ export default meta; type Story = StoryObj; export const Standard: Story = { + args: { + // Removing the headingLevel property to use default value (5) + onThumbClick: () => console.log('Thumb clicked'), + onFeedbackSend: text => console.log('Feedback sent:', text), + }, + render: args => , +}; + +// Adding an example with explicit heading level for comparison +export const WithLargeHeading: Story = { args: { headingLevel: 2, + onThumbClick: () => console.log('Thumb clicked'), + onFeedbackSend: text => console.log('Feedback sent:', text), }, render: args => , }; diff --git a/packages/ffe-feedback-react/src/Feedback.tsx b/packages/ffe-feedback-react/src/Feedback.tsx index fa299eeae7..cb4db9ab8b 100644 --- a/packages/ffe-feedback-react/src/Feedback.tsx +++ b/packages/ffe-feedback-react/src/Feedback.tsx @@ -6,21 +6,25 @@ import classNames from 'classnames'; import { FeedbackExpanded, FeedbackExpandedProps } from './FeedbackExpanded'; import { HighFive } from './HighFive'; +type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6; +type Locale = 'nb' | 'nn' | 'en'; +type BgColor = 'primary' | 'secondary' | 'tertiary'; + export interface FeedbackProps { - headingLevel: 1 | 2 | 3 | 4 | 5 | 6; - locale?: 'nb' | 'nn' | 'en'; + headingLevel?: HeadingLevel; + locale?: Locale; onThumbClick: (thumb: Thumb) => void; onFeedbackSend: (feedbackText: string) => void; - /** Set the background color of the feedback container. */ - bgColor?: 'primary' | 'secondary' | 'tertiary'; + bgColor?: BgColor; contactLink?: FeedbackExpandedProps['contactLink']; texts?: { feedbackNotSentHeading?: string; }; className?: string; } -export const Feedback: React.FC = ({ - headingLevel, + +export const Feedback = ({ + headingLevel = 5, locale = 'nb', onThumbClick, onFeedbackSend, @@ -28,10 +32,12 @@ export const Feedback: React.FC = ({ contactLink, texts, className, -}) => { - const feedbackSentRef = useRef(); - const expandedRef = useRef(); - const [feedbackThumbClicked, setFeedbackThumbClicked] = useState(); +}: FeedbackProps) => { + const feedbackSentRef = useRef(null); + const expandedRef = useRef(null); + const [feedbackThumbClicked, setFeedbackThumbClicked] = useState< + Thumb | undefined + >(); const [expanded, setExpanded] = useState(false); const [feedbackSent, setFeedbackSent] = useState(false); const headingId = useId(); @@ -47,7 +53,7 @@ export const Feedback: React.FC = ({ const handleThumbClicked = (thumb: Thumb) => { setFeedbackThumbClicked(thumb); flushSync(() => { - setExpanded(prevState => !prevState); + setExpanded(true); }); expandedRef.current?.focus(); onThumbClick(thumb); @@ -61,18 +67,44 @@ export const Feedback: React.FC = ({ onFeedbackSend(feedbackText); }; + const renderHeading = ( + level: HeadingLevel, + text: string, + options?: { + ref?: React.RefObject; + tabIndex?: number; + id?: string; + textCenter?: boolean; + }, + ) => { + const { ref, tabIndex, id, textCenter } = options || {}; + + const headingClassName = classNames( + `ffe-h${level}`, + { [`ffe-h${level}--text-center`]: textCenter }, + 'ffe-feedback__heading', + ); + + return React.createElement( + `h${level}`, + { + ref, + id, + tabIndex, + className: headingClassName, + }, + text, + ); + }; + if (feedbackSent) { return (
- {React.createElement( - `h${headingLevel}`, - { - ref: feedbackSentRef, - tabIndex: -1, - className: 'ffe-h4', - }, + {renderHeading( + headingLevel, txt[locale].FEEDBACK_SENT_HEADING, + { ref: feedbackSentRef, tabIndex: -1 }, )}
@@ -84,16 +116,12 @@ export const Feedback: React.FC = ({ return (
- {React.createElement( - `h${headingLevel}`, - { - ref: expandedRef, - tabIndex: -1, - className: 'ffe-h5 ffe-feedback__heading', - }, + {renderHeading( + headingLevel, feedbackThumbClicked === 'THUMB_UP' ? txt[locale].FEEDBACK_GOOD : txt[locale].FEEDBACK_IMPROVE, + { ref: expandedRef, tabIndex: -1 }, )} = ({ return (
- {React.createElement( - `h${headingLevel}`, - { - id: headingId, - className: - 'ffe-h4 ffe-h4--text-center ffe-feedback__heading', - }, + {renderHeading( + headingLevel, texts?.feedbackNotSentHeading ?? txt[locale].FEEDBACK_NOT_SENT_HEADING, + { id: headingId, textCenter: true }, )}