@@ -10,7 +10,10 @@ import {
1010} from "lucide-react" ;
1111import { useEffect , useRef , useState } from "react" ;
1212import styled from "styled-components" ;
13- import { DEFAULT_STEP } from "../spreadsheet/spreadsheet.constants" ;
13+ import {
14+ DEFAULT_STEP ,
15+ DEFAULT_STEPS ,
16+ } from "../spreadsheet/spreadsheet.constants" ;
1417import { TextField } from "../text-field/text-field.component" ;
1518import {
1619 TabContainer ,
@@ -25,9 +28,12 @@ export const SimulationTab = () => {
2528 const [ delay , setDelay ] = useState < number > ( 100 ) ;
2629 const [ isPlaying , setIsPlaying ] = useState ( false ) ;
2730 const intervalRef = useRef < NodeJS . Timeout | null > ( null ) ;
31+
2832 const [ stepFieldValue , setStepFieldValue ] = useState < number > (
2933 DEFAULT_STEP + 1 ,
3034 ) ;
35+ const [ stepsFieldValue , setStepsFieldValue ] =
36+ useState < number > ( DEFAULT_STEPS ) ;
3137
3238 const prevStep = ( ) => {
3339 Logger . log (
@@ -91,29 +97,57 @@ export const SimulationTab = () => {
9197 setStepFieldValue ( stepper . step + 1 ) ;
9298 } , [ stepper . step ] ) ;
9399
94- const handleStepsInput = ( value : string ) => {
100+ useEffect ( ( ) => {
101+ setStepsFieldValue ( stepper . steps ) ;
102+ } , [ stepper . steps ] ) ;
103+
104+ const onStepInputChange = ( value : string ) => {
95105 if ( / ^ [ 0 - 9 ] * $ / . test ( value ) ) {
96106 setStepFieldValue ( Number ( value ) ) ;
97107 }
98108 } ;
99109
100- const confirmStep = ( ) => {
101- const newStep = Number ( stepFieldValue ) ;
110+ const onStepsInputChange = ( value : string ) => {
111+ if ( / ^ [ 0 - 9 ] * $ / . test ( value ) ) {
112+ setStepsFieldValue ( Number ( value ) ) ;
113+ }
114+ } ;
102115
103- if ( newStep === 0 ) {
116+ const onStepInputBlur = ( ) => {
117+ if ( stepFieldValue === 0 ) {
104118 stepper . setStep ( 0 ) ;
105- setStepFieldValue ( 1 ) ;
106- } else if ( newStep > stepper . steps ) {
119+ } else if ( stepFieldValue > stepsFieldValue ) {
107120 stepper . setStep ( stepper . steps - 1 ) ;
108- setStepFieldValue ( stepper . steps ) ;
109121 } else {
110- stepper . setStep ( newStep - 1 ) ;
122+ stepper . setStep ( stepFieldValue - 1 ) ;
111123 }
112124 } ;
113125
114- const onHandleKeyDown = ( event : React . KeyboardEvent < HTMLInputElement > ) => {
126+ const onStepsInputBlur = ( ) => {
127+ if ( stepsFieldValue === 0 ) {
128+ stepper . setSteps ( 1 ) ;
129+ } else {
130+ stepper . setSteps ( stepsFieldValue ) ;
131+ }
132+
133+ if ( stepFieldValue > stepsFieldValue ) {
134+ stepper . setStep ( stepsFieldValue - 1 ) ;
135+ }
136+ } ;
137+
138+ const onStepInputKeyDown = (
139+ event : React . KeyboardEvent < HTMLInputElement > ,
140+ ) => {
115141 if ( event . key === "Enter" ) {
116- confirmStep ( ) ;
142+ onStepInputBlur ( ) ;
143+ }
144+ } ;
145+
146+ const onStepsInputKeyDown = (
147+ event : React . KeyboardEvent < HTMLInputElement > ,
148+ ) => {
149+ if ( event . key === "Enter" ) {
150+ onStepsInputBlur ( ) ;
117151 }
118152 } ;
119153
@@ -128,9 +162,9 @@ export const SimulationTab = () => {
128162 size = "small"
129163 value = { stepFieldValue . toString ( ) }
130164 disabled = { false }
131- onChange = { ( newValue ) => handleStepsInput ( newValue ) }
132- onBlur = { confirmStep }
133- onKeyDown = { onHandleKeyDown }
165+ onChange = { onStepInputChange }
166+ onBlur = { onStepInputBlur }
167+ onKeyDown = { onStepInputKeyDown }
134168 />
135169
136170 < ToolbarButton onClick = { nextStep } >
@@ -142,12 +176,10 @@ export const SimulationTab = () => {
142176
143177 < TextField
144178 size = "small"
145- value = { stepper . steps . toString ( ) }
146- onChange = { ( value ) =>
147- value === ""
148- ? stepper . setSteps ( 0 )
149- : stepper . setSteps ( parseInt ( value ) )
150- }
179+ value = { stepsFieldValue . toString ( ) }
180+ onChange = { onStepsInputChange }
181+ onBlur = { onStepsInputBlur }
182+ onKeyDown = { onStepsInputKeyDown }
151183 placeholder = "Steps"
152184 />
153185
0 commit comments