mirror of
https://github.com/DocNR/POWR.git
synced 2025-04-22 16:51:33 +00:00
40 lines
786 B
TypeScript
40 lines
786 B
TypeScript
![]() |
import * as React from 'react';
|
||
|
import Animated, {
|
||
|
useAnimatedStyle,
|
||
|
useSharedValue,
|
||
|
withRepeat,
|
||
|
withSequence,
|
||
|
withTiming,
|
||
|
} from 'react-native-reanimated';
|
||
|
import { cn } from '@/lib/utils';
|
||
|
|
||
|
const duration = 1000;
|
||
|
|
||
|
function Skeleton({
|
||
|
className,
|
||
|
...props
|
||
|
}: Omit<React.ComponentPropsWithoutRef<typeof Animated.View>, 'style'>) {
|
||
|
const sv = useSharedValue(1);
|
||
|
|
||
|
React.useEffect(() => {
|
||
|
sv.value = withRepeat(
|
||
|
withSequence(withTiming(0.5, { duration }), withTiming(1, { duration })),
|
||
|
-1
|
||
|
);
|
||
|
}, []);
|
||
|
|
||
|
const style = useAnimatedStyle(() => ({
|
||
|
opacity: sv.value,
|
||
|
}));
|
||
|
|
||
|
return (
|
||
|
<Animated.View
|
||
|
style={style}
|
||
|
className={cn('rounded-md bg-secondary dark:bg-muted', className)}
|
||
|
{...props}
|
||
|
/>
|
||
|
);
|
||
|
}
|
||
|
|
||
|
export { Skeleton };
|