miinventario-mobile-v2/src/components/skeletons/NotificationSkeleton.tsx
rckrdmrd eb718a95aa Sincronización desde miinventario/apps/mobile - Estándar multi-repo v2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:29:24 -06:00

76 lines
1.8 KiB
TypeScript

import React from 'react';
import { View, StyleSheet } from 'react-native';
import { Skeleton, SkeletonText, SkeletonCircle } from '../ui/Skeleton';
import { useTheme } from '../../theme/ThemeContext';
/**
* Skeleton para una notificación
*/
export function NotificationItemSkeleton() {
const { colors } = useTheme();
return (
<View style={[styles.container, { borderBottomColor: colors.border }]}>
<SkeletonCircle size={44} />
<View style={styles.content}>
<SkeletonText width="80%" height={14} />
<SkeletonText width="100%" height={12} style={{ marginTop: 6 }} />
<SkeletonText width="30%" height={10} style={{ marginTop: 8 }} />
</View>
<View style={styles.indicator}>
<Skeleton width={8} height={8} borderRadius={4} />
</View>
</View>
);
}
/**
* Lista de skeletons de notificaciones
*/
export function NotificationListSkeleton({ count = 6 }: { count?: number }) {
return (
<View>
{Array.from({ length: count }).map((_, index) => (
<NotificationItemSkeleton key={index} />
))}
</View>
);
}
/**
* Skeleton para el header de notificaciones
*/
export function NotificationHeaderSkeleton() {
const { colors } = useTheme();
return (
<View style={[styles.header, { backgroundColor: colors.card }]}>
<SkeletonText width={120} height={20} />
<SkeletonText width={80} height={14} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
padding: 16,
borderBottomWidth: 1,
},
content: {
flex: 1,
marginLeft: 12,
},
indicator: {
justifyContent: 'center',
paddingLeft: 8,
},
header: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
padding: 16,
borderBottomWidth: 1,
},
});