add word/sentence inc/dec
This commit is contained in:
		
							parent
							
								
									294b66b935
								
							
						
					
					
						commit
						a14ed6bdc1
					
				| @ -3,16 +3,26 @@ import { useDispatch } from 'react-redux' | ||||
| import { | ||||
|   incrementSentence, | ||||
|   incrementSegment, | ||||
|   incrementWord | ||||
|   incrementWord, | ||||
|   decrementSegment, | ||||
|   decrementSentence, | ||||
|   decrementWord | ||||
| } from '../store/actions' | ||||
| 
 | ||||
| export const MainControl = () => { | ||||
|   const dispatch = useDispatch() | ||||
|   return ( | ||||
|     <div> | ||||
|       <button onClick={() => dispatch(incrementSegment())}>></button> | ||||
|       <button onClick={() => dispatch(incrementWord())}>Word></button> | ||||
|       <button onClick={() => dispatch(incrementSentence())}>Sentence></button> | ||||
|       <button onClick={() => dispatch(decrementSentence())}> | ||||
|         {'<'}Sentence | ||||
|       </button> | ||||
|       <button onClick={() => dispatch(decrementWord())}>{'<'}Word</button> | ||||
|       <button onClick={() => dispatch(decrementSegment())}>{'<'}</button> | ||||
|       <button onClick={() => dispatch(incrementSegment())}>{'>'}</button> | ||||
|       <button onClick={() => dispatch(incrementWord())}>Word{'>'}</button> | ||||
|       <button onClick={() => dispatch(incrementSentence())}> | ||||
|         Sentence{'>'} | ||||
|       </button> | ||||
|     </div> | ||||
|   ) | ||||
| } | ||||
|  | ||||
							
								
								
									
										21
									
								
								src/components/RsvpOptions.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/components/RsvpOptions.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| import React from 'react' | ||||
| import { useSelector, useDispatch } from 'react-redux' | ||||
| 
 | ||||
| import { setMaxLength } from '../store/actions' | ||||
| 
 | ||||
| export const RsvpOptions = () => { | ||||
|   const maxLength = useSelector(state => state.maxLength) | ||||
|   const dispatch = useDispatch() | ||||
|   return ( | ||||
|     <div> | ||||
|       <input | ||||
|         type="range" | ||||
|         min="3" | ||||
|         max="14" | ||||
|         value={maxLength} | ||||
|         onChange={e => dispatch(setMaxLength(e.target.value))} | ||||
|       /> | ||||
|       {maxLength} | ||||
|     </div> | ||||
|   ) | ||||
| } | ||||
| @ -4,6 +4,7 @@ import { TextInput } from './TextInput' | ||||
| import { TextOutput } from './TextOutput' | ||||
| import { MainControl } from './MainControl' | ||||
| import { RsvpSegment } from './RsvpSegment' | ||||
| import { RsvpOptions } from './RsvpOptions' | ||||
| 
 | ||||
| const FlexRow = styled.div` | ||||
|   display: flex; | ||||
| @ -23,6 +24,7 @@ export const RsvpReader = () => { | ||||
|       <FlexItem flex={2}> | ||||
|         <RsvpSegment /> | ||||
|         <MainControl></MainControl> | ||||
|         <RsvpOptions></RsvpOptions> | ||||
|       </FlexItem> | ||||
|       <FlexItem> | ||||
|         <TextOutput /> | ||||
|  | ||||
| @ -2,7 +2,10 @@ import React from 'react' | ||||
| import { useSelector } from 'react-redux' | ||||
| import styled from 'styled-components' | ||||
| 
 | ||||
| import { selectParsedText } from '../store/selectors.js' | ||||
| import { | ||||
|   selectParsedText, | ||||
|   selectCurrentSegmentIndex | ||||
| } from '../store/selectors.js' | ||||
| 
 | ||||
| const Segment = styled.span` | ||||
|   color: ${props => (props.sentenceBeginning ? 'red' : 'black')}; | ||||
| @ -15,7 +18,7 @@ const SelectedSegment = styled.span` | ||||
| 
 | ||||
| export const TextOutput = () => { | ||||
|   const parsedText = useSelector(selectParsedText) | ||||
|   const curSegment = useSelector(state => state.curSegment) | ||||
|   const curSegment = useSelector(selectCurrentSegmentIndex) | ||||
|   const { segments, words, sentences } = parsedText | ||||
|   return ( | ||||
|     <div> | ||||
|  | ||||
| @ -1,4 +1,11 @@ | ||||
| export const setText = text => ({ type: 'SET_TEXT', payload: text }) | ||||
| export const incrementSegment = () => ({ type: 'INCREMENT_SEGMENT' }) | ||||
| export const incrementWord = () => ({ type: 'INCREMENT_WORD' }) | ||||
| export const incrementSentence = () => ({ type: 'INCREMENT_SENTENCE' }) | ||||
| export const incrementSegment = () => ({ type: 'INC_SEGMENT' }) | ||||
| export const decrementSegment = () => ({ type: 'DEC_SEGMENT' }) | ||||
| export const incrementWord = () => ({ type: 'INC_WORD' }) | ||||
| export const decrementWord = () => ({ type: 'DEC_WORD' }) | ||||
| export const incrementSentence = () => ({ type: 'INC_SENTENCE' }) | ||||
| export const decrementSentence = () => ({ type: 'DEC_SENTENCE' }) | ||||
| export const setMaxLength = length => ({ | ||||
|   type: 'SET_MAX_LENGTH', | ||||
|   payload: length | ||||
| }) | ||||
|  | ||||
| @ -1,26 +1,30 @@ | ||||
| import { selectNextWord, selectNextSentence } from './selectors' | ||||
| import { | ||||
|   selectNextWord, | ||||
|   selectNextSentence, | ||||
|   selectPrevWord, | ||||
|   selectPrevSentence | ||||
| } from './selectors' | ||||
| 
 | ||||
| export const initialState = { | ||||
|   originalText: 'Sample Text', | ||||
|   curSegment: 0 | ||||
|   curIdx: 0, | ||||
|   maxLength: 5 | ||||
| } | ||||
| 
 | ||||
| const reducer = { | ||||
|   SET_TEXT: (state, payload) => ({ | ||||
|     ...state, | ||||
|     originalText: payload, | ||||
|     curSegment: 0 | ||||
|     curIdx: 0 | ||||
|   }), | ||||
|   SET_CURRENT_SEGMENT: (state, payload) => ({ ...state, curSegment: payload }), | ||||
|   INCREMENT_SEGMENT: state => ({ | ||||
|     ...state, | ||||
|     curSegment: state.curSegment + 1 | ||||
|   }), | ||||
|   INCREMENT_WORD: state => ({ ...state, curSegment: selectNextWord(state) }), | ||||
|   INCREMENT_SENTENCE: state => ({ | ||||
|     ...state, | ||||
|     curSegment: selectNextSentence(state) | ||||
|   }) | ||||
|   SET_CURRENT_SEGMENT: (state, payload) => ({ ...state, curIdx: payload }), | ||||
|   INC_SEGMENT: state => ({ ...state, curIdx: state.curIdx + 1 }), | ||||
|   DEC_SEGMENT: state => ({ ...state, curIdx: state.curIdx - 1 }), | ||||
|   INC_WORD: state => ({ ...state, curIdx: selectNextWord(state) }), | ||||
|   DEC_WORD: state => ({ ...state, curIdx: selectPrevWord(state) }), | ||||
|   INC_SENTENCE: state => ({ ...state, curIdx: selectNextSentence(state) }), | ||||
|   DEC_SENTENCE: state => ({ ...state, curIdx: selectPrevSentence(state) }), | ||||
|   SET_MAX_LENGTH: (state, payload) => ({ ...state, maxLength: payload }) | ||||
| } | ||||
| 
 | ||||
| export const reducerFn = (state, { type, payload }) => { | ||||
|  | ||||
| @ -5,9 +5,12 @@ import { getNextBiggerNumber, getNextSmallerNumber } from '../lib/array-util.js' | ||||
| 
 | ||||
| // parsedText selectors
 | ||||
| 
 | ||||
| export const selectMaxLength = state => state.maxLength | ||||
| 
 | ||||
| export const selectParsedText = createSelector( | ||||
|   state => state.originalText, | ||||
|   originalText => parseText(originalText) | ||||
|   selectMaxLength, | ||||
|   (originalText, maxLength) => parseText(originalText, maxLength) | ||||
| ) | ||||
| 
 | ||||
| export const selectSegments = createSelector( | ||||
| @ -15,15 +18,12 @@ export const selectSegments = createSelector( | ||||
|   parsedText => parsedText.segments | ||||
| ) | ||||
| 
 | ||||
| export const selectCurrentSegmentIndex = createSelector( | ||||
|   state => state.curSegment, | ||||
|   curIdx => curIdx | ||||
| ) | ||||
| export const selectCurrentSegmentIndex = state => state.curIdx | ||||
| 
 | ||||
| export const selectCurrentSegment = createSelector( | ||||
|   selectParsedText, | ||||
|   state => state.curSegment, | ||||
|   (parsedText, curSegment) => parsedText.segments[curSegment] | ||||
|   selectCurrentSegmentIndex, | ||||
|   (parsedText, curIdx) => parsedText.segments[curIdx] | ||||
| ) | ||||
| 
 | ||||
| // next/prev words
 | ||||
| @ -35,7 +35,7 @@ export const selectWords = createSelector( | ||||
| 
 | ||||
| export const selectNextWord = createSelector( | ||||
|   selectWords, | ||||
|   state => state.curSegment, | ||||
|   selectCurrentSegmentIndex, | ||||
|   (words, curSegment) => getNextBiggerNumber(curSegment, words) | ||||
| ) | ||||
| 
 | ||||
| @ -46,7 +46,6 @@ export const selectPrevWord = createSelector( | ||||
| ) | ||||
| 
 | ||||
| export const selectHasNextWord = createSelector(selectNextWord, Boolean) | ||||
| 
 | ||||
| export const selectHasPrevWord = createSelector(selectPrevWord, Boolean) | ||||
| 
 | ||||
| // next/prev sentences
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user