aboutsummaryrefslogtreecommitdiffstats
path: root/packages/mobile/components/ui/Skeleton.tsx
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-03-13 03:36:32 +0000
committerMohamedBassem <me@mbassem.com>2024-03-13 03:36:57 +0000
commit61e970bb8c75c6edb279447be3f7ca8a00bd607d (patch)
tree4043c57f903b8da36cf309c2723a1d9e3217012d /packages/mobile/components/ui/Skeleton.tsx
parent4a247b752e8652abf409775bc8008482a9546ad3 (diff)
downloadkarakeep-61e970bb8c75c6edb279447be3f7ca8a00bd607d.tar.zst
mobile: Add support for loading states for bookmarks
Diffstat (limited to 'packages/mobile/components/ui/Skeleton.tsx')
-rw-r--r--packages/mobile/components/ui/Skeleton.tsx38
1 files changed, 38 insertions, 0 deletions
diff --git a/packages/mobile/components/ui/Skeleton.tsx b/packages/mobile/components/ui/Skeleton.tsx
new file mode 100644
index 00000000..68b22e1e
--- /dev/null
+++ b/packages/mobile/components/ui/Skeleton.tsx
@@ -0,0 +1,38 @@
+import { useEffect, useRef } from "react";
+import { Animated, type View } from "react-native";
+
+import { cn } from "@/lib/utils";
+
+function Skeleton({
+ className,
+ ...props
+}: { className?: string } & React.ComponentPropsWithoutRef<typeof View>) {
+ const fadeAnim = useRef(new Animated.Value(0.5)).current;
+
+ useEffect(() => {
+ Animated.loop(
+ Animated.sequence([
+ Animated.timing(fadeAnim, {
+ toValue: 1,
+ duration: 1000,
+ useNativeDriver: true,
+ }),
+ Animated.timing(fadeAnim, {
+ toValue: 0.5,
+ duration: 1000,
+ useNativeDriver: true,
+ }),
+ ]),
+ ).start();
+ }, [fadeAnim]);
+
+ return (
+ <Animated.View
+ className={cn("bg-muted rounded-md", className)}
+ style={[{ opacity: fadeAnim }]}
+ {...props}
+ />
+ );
+}
+
+export { Skeleton };