From 35a939b895f32a1eacfd99b705a9283d121eeb2e Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Sun, 27 Feb 2022 14:37:44 +0100 Subject: [PATCH] feat: start splitting component up into multiple pieces. --- .../UserFeedback/UserFeedback.stories.jsx | 23 ++- website/src/components/UserFeedback/index.jsx | 163 ++++++++++++++---- 2 files changed, 142 insertions(+), 44 deletions(-) diff --git a/website/src/components/UserFeedback/UserFeedback.stories.jsx b/website/src/components/UserFeedback/UserFeedback.stories.jsx index c96807162f..5f4ad9eec3 100644 --- a/website/src/components/UserFeedback/UserFeedback.stories.jsx +++ b/website/src/components/UserFeedback/UserFeedback.stories.jsx @@ -1,16 +1,25 @@ import React from 'react'; -import Component from './index'; +import Component, { initialData, FeedbackWrapper } from './index'; export default { title: 'User feedback component', component: Component, }; -const Template = (args) => ; +const Template = (args) => ; -export const A = Template.bind({}); -A.args = { - x: true, - y: 45, - text: 'blah blah blah', +export const FullComponent = Template.bind({}); +FullComponent.args = { + initialData, }; + +export const Step2 = Template.bind({}); +Step2.args = { + initialData: { + ...initialData, + currentStep: 2, + }, +}; + +export const Step3 = Template.bind({}); +export const Closed = Template.bind({}); diff --git a/website/src/components/UserFeedback/index.jsx b/website/src/components/UserFeedback/index.jsx index 61affb3e81..63213c5d56 100644 --- a/website/src/components/UserFeedback/index.jsx +++ b/website/src/components/UserFeedback/index.jsx @@ -4,29 +4,28 @@ import CloseIcon from '@site/src/icons/close'; const join = (...cs) => cs.join(' '); -const Step1 = () => <>; -const Step2 = () => <>; -const Step3 = () => <>; - -const initialData = () => ({ - initialized: Date.now(), - closedOrCompleted: false, +export const initialData = { + currentStep: 1, data: { score: undefined, comment: undefined, customerType: undefined, }, -}); +}; const fetchData = (initialData) => { const localstorageKey = 'user-feedback'; - return initialData; + return { + ...initialData, + initialized: Date.now(), + closedOrCompleted: false, + }; // check localstorage // populate if there is }; -const FeedbackWrapper = () => { +export const FeedbackWrapper = ({ initialData }) => { const [feedbackIsOpen, setFeedbackIsOpen] = React.useState(false); const stateReducer = (state, message) => { switch (message.kind) { @@ -47,48 +46,41 @@ const FeedbackWrapper = () => { ...state, data: { ...state.data, customerType: message.data }, }; + case 'step forward': + return { + ...state, + currentStep: min(state.currentStep + 1, 3), + }; + case 'step back': + return { + ...state, + currentStep: max(state.currentStep - 1, 1), + }; } return state; }; const [state, dispatch] = React.useReducer( stateReducer, - initialData(), + initialData, fetchData, ); const clear = () => dispatch({ kind: 'clear' }); + const stepForward = (e) => { + e.preventDefault(); + console.log('stepping forward!'); + dispatch({ kind: 'step forward' }); + }; + const stepBack = () => dispatch({ kind: 'step back' }); const setScore = (score) => dispatch({ kind: 'set score', data: score }); const setComment = (comment) => dispatch({ kind: 'set comment', data: comment }); const setCustomerType = (customerType) => dispatch({ kind: 'set customer type', data: customerType }); - return feedbackIsOpen ? ( - setFeedbackIsOpen(false)} /> - ) : ( - setFeedbackIsOpen(true)} /> - ); -}; - -const OpenFeedbackButton = ({ openFeedback }) => { - return ; -}; - -const Component = ({ closeFeedback = () => undefined }) => { - return ( -
-
- -
+ const Step1 = () => { + return (

@@ -113,6 +105,12 @@ const Component = ({ closeFeedback = () => undefined }) => { name="satisfaction-level" type="radio" value={n} + defaultChecked={n === state.data.score} + onChange={(e) => { + const value = parseInt(e.target.value); + console.log('the value is', value); + setScore(value); + }} />

- +
+ ); + }; + + return ( + + } + /> + ); +}; + +const OpenFeedbackButton = ({ openFeedback }) => { + return ; +}; + +export const Step1 = ({ score, stepForward, setScore }) => { + return ( +
+

+ + On a scale from 1 to 5 where 1 is very unsatisfied and 5 is + very satisfied, + {' '} + How would you rate your overall satisfaction with the Unleash + documentation? +

+ +
+ + {[1, 2, 3, 4, 5].map((n) => ( + + { + const value = parseInt(e.target.value); + console.log('the value is', value); + setScore(value); + }} + /> + + + ))} + +
+
+ + +
+
+ ); +}; + +const Component = ({ closeFeedback = () => undefined, CurrentStep }) => { + return ( +
+
+ +
+ + {CurrentStep}
); };