1- import { useState , useEffect , useRef } from 'react' ;
1+ import { useState , useEffect , useRef , useCallback } from 'react' ;
22import { Layers , Plus , Trash2 , Play , Square , FastForward , Clock } from 'lucide-react' ;
33
44const PATTERNS = [ "Wave" , "Realistic" , "Thrust" , "Pulse" , "Tease" , "Escalate" , "Edge" , "Depth" , "Adaptive" ] ;
@@ -50,25 +50,7 @@ export function SequenceBuilder({
5050 executeStep ( steps [ 0 ] ) ;
5151 } ;
5252
53- const stopSequence = ( ) => {
54- setIsSequencePlaying ( false ) ;
55- setActiveStepIdx ( null ) ;
56- setStepTimeRemaining ( 0 ) ;
57- stopPattern ( ) ;
58- } ;
59-
60- const nextStep = ( ) => {
61- const nextIdx = activeStepIdx + 1 ;
62- if ( nextIdx < steps . length ) {
63- setActiveStepIdx ( nextIdx ) ;
64- setStepTimeRemaining ( steps [ nextIdx ] . duration ) ;
65- executeStep ( steps [ nextIdx ] ) ;
66- } else {
67- stopSequence ( ) ;
68- }
69- } ;
70-
71- const executeStep = ( step ) => {
53+ const executeStep = useCallback ( ( step ) => {
7254 // Set UI states so sliders align
7355 setPatternName ( step . pattern ) ;
7456 setFrequencyHz ( step . freq ) ;
@@ -82,7 +64,25 @@ export function SequenceBuilder({
8264 strokeLengthMm : step . stroke ,
8365 intensityPct : step . intensity ,
8466 } ) ;
85- } ;
67+ } , [ setPatternName , setFrequencyHz , setStrokeLengthMm , onIntensityChange , startPattern ] ) ;
68+
69+ const stopSequence = useCallback ( ( ) => {
70+ setIsSequencePlaying ( false ) ;
71+ setActiveStepIdx ( null ) ;
72+ setStepTimeRemaining ( 0 ) ;
73+ stopPattern ( ) ;
74+ } , [ stopPattern ] ) ;
75+
76+ const nextStep = useCallback ( ( ) => {
77+ const nextIdx = activeStepIdx + 1 ;
78+ if ( nextIdx < steps . length ) {
79+ setActiveStepIdx ( nextIdx ) ;
80+ setStepTimeRemaining ( steps [ nextIdx ] . duration ) ;
81+ executeStep ( steps [ nextIdx ] ) ;
82+ } else {
83+ stopSequence ( ) ;
84+ }
85+ } , [ activeStepIdx , steps , executeStep , stopSequence ] ) ;
8686
8787 // Timer loop for sequence playback
8888 useEffect ( ( ) => {
@@ -92,14 +92,18 @@ export function SequenceBuilder({
9292 setStepTimeRemaining ( prev => prev - 1 ) ;
9393 } , 1000 ) ;
9494 } else {
95- nextStep ( ) ;
95+ setTimeout ( ( ) => {
96+ nextStep ( ) ;
97+ } , 0 ) ;
9698 }
9799 } else if ( ! isRunning && isSequencePlaying ) {
98- stopSequence ( ) ;
100+ setTimeout ( ( ) => {
101+ stopSequence ( ) ;
102+ } , 0 ) ;
99103 }
100104
101105 return ( ) => clearTimeout ( timerRef . current ) ;
102- } , [ isSequencePlaying , activeStepIdx , stepTimeRemaining , isRunning ] ) ;
106+ } , [ isSequencePlaying , activeStepIdx , stepTimeRemaining , isRunning , nextStep , stopSequence ] ) ;
103107
104108 return (
105109 < div className = "control-card glass" >
0 commit comments