Commit 970df1e
authored
refactor(plugins): Migrate to reactive streams and signal-based state (#4254)
* refactor(plugins): migrate to reactive streams and signal-based state
- Refactor Hover plugin to use fromEvent() and effect() for reactive event handling
- Refactor Timeline plugin to react to state.duration changes automatically
- Refactor Zoom plugin to integrate with state.zoom and state.duration signals
- Refactor Minimap plugin to react to state.audioBuffer changes
- Replace manual event listener cleanup with unified subscriptions array
- Eliminate custom unsubscribe functions in favor of BasePlugin pattern
- Integrate plugins with WaveSurfer reactive state signals
Benefits:
- Consistent reactive patterns across all plugins
- Declarative state-driven updates
- Automatic cleanup prevents memory leaks
- Better TypeScript integration with signals
- Reduced boilerplate code
All tests pass. No breaking changes to public APIs.
* fix(Timeline): prevent timeline disappearing on scroll
The scroll listener was being re-registered on every initTimeline() call,
causing multiple listeners to reference stale timeline DOM elements.
Solution:
- Register scroll listener once in onInit() instead of in initTimeline()
- Store reference to current timeline element
- Update scroll listener to use the stored reference
This prevents memory leaks and ensures the timeline remains visible when scrolling.
* fix(Minimap): restore rendering by using duration state instead of audioBuffer
The audioBuffer state is never set in WaveSurfer core, so the reactive effect
was never triggered. The minimap requires decoded data to initialize, which
is available after the duration is set.
Solution:
- React to state.duration changes instead of state.audioBuffer
- Check that decoded data exists before initializing minimap
- This effectively replaces the 'decode' event with reactive state observation
The minimap now renders correctly on audio load.
* refactor(Zoom): convert addEventListener to reactive fromEvent streams
Replace manual event listener management with reactive event streams:
- Use fromEvent() for wheel, touchstart, touchmove, touchend, touchcancel
- Use effect() to react to event stream changes
- Remove manual removeEventListener calls in destroy()
- Cleanup now handled automatically through subscriptions array
Benefits:
- Consistent reactive pattern across all DOM event handling
- Automatic cleanup prevents memory leaks
- More declarative event handling
* fix(Minimap): revert to using decode event instead of reactive state
The previous reactive approach had a race condition where state.duration
could be set before decoded data was available, causing the minimap to not
render. The 'decode' event is the correct trigger as it fires exactly when
audio data is decoded and ready.
Changes:
- Revert from effect(state.duration) back to on('decode')
- Remove unused effect import
- Simplify onScroll to use getDuration() directly
This restores the original working behavior while maintaining the
subscriptions array pattern for automatic cleanup.1 parent 2dc0845 commit 970df1e
4 files changed
+159
-79
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
| 8 | + | |
7 | 9 | | |
8 | 10 | | |
9 | 11 | | |
| |||
53 | 55 | | |
54 | 56 | | |
55 | 57 | | |
56 | | - | |
57 | 58 | | |
58 | 59 | | |
59 | 60 | | |
| |||
109 | 110 | | |
110 | 111 | | |
111 | 112 | | |
112 | | - | |
113 | | - | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
114 | 162 | | |
115 | | - | |
116 | | - | |
117 | | - | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
118 | 178 | | |
119 | 179 | | |
120 | 180 | | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
135 | | - | |
136 | | - | |
137 | | - | |
138 | | - | |
139 | | - | |
140 | | - | |
141 | | - | |
142 | | - | |
143 | | - | |
144 | | - | |
145 | | - | |
146 | | - | |
147 | | - | |
148 | | - | |
149 | | - | |
150 | | - | |
151 | | - | |
152 | | - | |
153 | | - | |
154 | | - | |
155 | | - | |
156 | | - | |
157 | | - | |
158 | | - | |
159 | | - | |
160 | | - | |
161 | | - | |
162 | | - | |
163 | | - | |
164 | | - | |
165 | | - | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
166 | 184 | | |
167 | 185 | | |
168 | 186 | | |
169 | 187 | | |
170 | 188 | | |
171 | | - | |
172 | 189 | | |
173 | 190 | | |
174 | 191 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
244 | 244 | | |
245 | 245 | | |
246 | 246 | | |
| 247 | + | |
247 | 248 | | |
248 | 249 | | |
249 | 250 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
| |||
56 | 57 | | |
57 | 58 | | |
58 | 59 | | |
59 | | - | |
60 | 60 | | |
61 | 61 | | |
| 62 | + | |
62 | 63 | | |
63 | 64 | | |
64 | 65 | | |
| |||
95 | 96 | | |
96 | 97 | | |
97 | 98 | | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
98 | 112 | | |
99 | 113 | | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
100 | 123 | | |
101 | 124 | | |
102 | 125 | | |
103 | 126 | | |
104 | 127 | | |
105 | 128 | | |
106 | 129 | | |
107 | | - | |
108 | | - | |
109 | 130 | | |
110 | 131 | | |
111 | 132 | | |
| |||
188 | 209 | | |
189 | 210 | | |
190 | 211 | | |
191 | | - | |
192 | | - | |
193 | 212 | | |
194 | 213 | | |
195 | 214 | | |
| |||
272 | 291 | | |
273 | 292 | | |
274 | 293 | | |
275 | | - | |
276 | | - | |
277 | | - | |
278 | | - | |
279 | | - | |
280 | | - | |
281 | | - | |
282 | | - | |
283 | | - | |
| 294 | + | |
284 | 295 | | |
285 | 296 | | |
286 | 297 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| 25 | + | |
| 26 | + | |
25 | 27 | | |
26 | 28 | | |
27 | 29 | | |
| |||
95 | 97 | | |
96 | 98 | | |
97 | 99 | | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | | - | |
103 | | - | |
104 | 100 | | |
105 | 101 | | |
106 | 102 | | |
107 | 103 | | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
108 | 166 | | |
109 | 167 | | |
110 | 168 | | |
| |||
248 | 306 | | |
249 | 307 | | |
250 | 308 | | |
251 | | - | |
252 | | - | |
253 | | - | |
254 | | - | |
255 | | - | |
256 | | - | |
257 | | - | |
258 | 309 | | |
259 | 310 | | |
260 | 311 | | |
| |||
0 commit comments