loading.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. "use client"
  2. import { Platform } from 'react-native'
  3. import React, { useEffect } from 'react';
  4. import { useAnimatedValue } from 'app/lib/hooks/use-animated-value';
  5. import { View } from 'app/design/view'
  6. import { Animated } from 'react-native';
  7. import Svg, { G, Circle } from 'react-native-svg';
  8. import { nativeDriver } from 'app/lib/platform/animation'
  9. function RotatingIcon() {
  10. const spinValue = useAnimatedValue(0);
  11. useEffect(() => {
  12. const animation = Animated.loop(
  13. Animated.timing(spinValue, {
  14. toValue: 1,
  15. duration: 2000,
  16. useNativeDriver: nativeDriver,
  17. })
  18. );
  19. animation.start();
  20. return () => animation.stop();
  21. }, [spinValue]);
  22. const spin = spinValue.interpolate({
  23. inputRange: [0, 1],
  24. outputRange: ['0deg', '360deg'],
  25. });
  26. return (
  27. <Animated.View style={{ transform: [{ rotate: spin }] }}>
  28. <Svg fill="#2563eb" opacity="0.5" width="64" height="128" viewBox="0 0 24 24">
  29. <G>
  30. <Circle cx="12" cy="3" r="1"/>
  31. <Circle cx="16.50" cy="4.21" r="1"/>
  32. <Circle cx="7.50" cy="4.21" r="1"/>
  33. <Circle cx="19.79" cy="7.50" r="1"/>
  34. <Circle cx="4.21" cy="7.50" r="1"/>
  35. <Circle cx="21.00" cy="12.00" r="1"/>
  36. <Circle cx="3.00" cy="12.00" r="1"/>
  37. <Circle cx="19.79" cy="16.50" r="1"/>
  38. <Circle cx="4.21" cy="16.50" r="1"/>
  39. <Circle cx="16.50" cy="19.79" r="1"/>
  40. <Circle cx="7.50" cy="19.79" r="1"/>
  41. <Circle cx="12" cy="21" r="1"/>
  42. </G>
  43. </Svg>
  44. </Animated.View>
  45. );
  46. }
  47. export function Loading() {
  48. if (Platform.OS === 'web') {
  49. return (
  50. <div style={{
  51. width: '100px', height: '100vh', display: 'flex', margin: '0px auto', justifyContent: 'center',
  52. }}>
  53. <img src="/loader.svg" alt="Loading indicator" />
  54. </div>
  55. );
  56. }
  57. return (
  58. <View className='w-full h-full items-center flex-1 justify-center'>
  59. <RotatingIcon />
  60. </View>
  61. );
  62. }