POWR/components/ui/skeleton.tsx

40 lines
786 B
TypeScript
Raw Permalink Normal View History

2025-02-09 20:38:38 -05:00
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 };