react-native-gleam 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/ios/GleamView.mm +32 -2
  2. package/package.json +1 -1
package/ios/GleamView.mm CHANGED
@@ -182,6 +182,33 @@ static void _unregisterView(GleamView *view) {
182
182
  [self.layer addSublayer:_shimmerLayer];
183
183
  }
184
184
  [self _registerClock];
185
+ } else if (!_isTransitioning) {
186
+ [self _setChildrenAlphaIfNeeded:1.0];
187
+ _shimmerLayer.opacity = 0.0;
188
+ [_shimmerLayer removeFromSuperlayer];
189
+ [self _unregisterClock];
190
+ }
191
+ }
192
+
193
+ - (void)didMoveToWindow
194
+ {
195
+ [super didMoveToWindow];
196
+ if (!self.window) return;
197
+
198
+ // View (re)joined a window — resync visual state.
199
+ // Mirrors Android's onAttachedToWindow re-attachment path.
200
+ if (_loading) {
201
+ if (_shimmerLayer.superlayer != self.layer) {
202
+ [self.layer addSublayer:_shimmerLayer];
203
+ }
204
+ [self _registerClock];
205
+ } else if (!_isTransitioning) {
206
+ // _isTransitioning=YES means ticks are actively driving it to
207
+ // completion (we no longer bail on !self.window) — let it finish.
208
+ [self _setChildrenAlphaIfNeeded:1.0];
209
+ _shimmerLayer.opacity = 0.0;
210
+ [_shimmerLayer removeFromSuperlayer];
211
+ [self _unregisterClock];
185
212
  }
186
213
  }
187
214
 
@@ -357,8 +384,10 @@ static void _unregisterView(GleamView *view) {
357
384
 
358
385
  - (void)_tickWithTime:(CFTimeInterval)now
359
386
  {
360
- if (!self.window) return;
361
-
387
+ // Transitions must always complete to avoid stuck visual state when the
388
+ // view is hidden (display:'none' → hidden=YES) or has no window.
389
+ // Cost is bounded (≤ transitionDuration) and the ops are cheap property sets.
390
+ // Shimmer animation is cosmetic and unbounded — skip when not visible.
362
391
  if (_isTransitioning) {
363
392
  _transitionElapsed += _displayLink.duration;
364
393
  CGFloat t = _transitionDuration > 0 ? fmin(_transitionElapsed / _transitionDuration, 1.0) : 1.0;
@@ -431,6 +460,7 @@ static void _unregisterView(GleamView *view) {
431
460
  [self _finishTransition];
432
461
  }
433
462
  } else if (_loading) {
463
+ if (!self.window) return;
434
464
  [self _updateGradientPositionWithTime:now];
435
465
  }
436
466
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-gleam",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Native-powered shimmer loading effect for React Native",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",