mirror of
https://github.com/ruvnet/RuView.git
synced 2026-04-28 05:59:32 +00:00
P1 fixes (this sprint): - P1-6: Extract sensing-server modules (cli, types, csi, pose) from main.rs - P1-7: DDA ray march for tomography — O(max(n)) replaces O(n^3) voxel scan - P1-8: Batch neural inference — Tensor::stack/split for single GPU call - P1-10: Eliminate 112KB/frame alloc — islice replaces deque→list copy P2 fixes (this quarter): - P2-11: Python unit tests for 8 modules (rate_limit, auth, error_handler, pose_service, stream_service, hardware_service, health_check, metrics) - P2-13: MAT simulated data safety guard — blocking overlay + pulsing banner - P2-14: Wire token blacklist into auth verification + logout endpoint - P2-15: Frame budget benchmark — confirms pipeline well under 50ms budget Addresses 8 of 10 remaining issues from QE analysis (ADR-080). Co-Authored-By: claude-flow <ruv@ruv.net>
49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
import React, { useEffect, useRef } from 'react';
|
|
import { Animated, StyleSheet, Text, View } from 'react-native';
|
|
|
|
interface Props {
|
|
visible: boolean;
|
|
}
|
|
|
|
export const SimulationBanner: React.FC<Props> = ({ visible }) => {
|
|
const opacity = useRef(new Animated.Value(1)).current;
|
|
|
|
useEffect(() => {
|
|
if (!visible) return;
|
|
|
|
const pulse = Animated.loop(
|
|
Animated.sequence([
|
|
Animated.timing(opacity, { toValue: 0.4, duration: 800, useNativeDriver: true }),
|
|
Animated.timing(opacity, { toValue: 1.0, duration: 800, useNativeDriver: true }),
|
|
]),
|
|
);
|
|
pulse.start();
|
|
return () => pulse.stop();
|
|
}, [visible, opacity]);
|
|
|
|
if (!visible) return null;
|
|
|
|
return (
|
|
<Animated.View style={[styles.banner, { opacity }]}>
|
|
<Text style={styles.text}>SIMULATED DATA - NOT CONNECTED TO REAL SENSORS</Text>
|
|
</Animated.View>
|
|
);
|
|
};
|
|
|
|
const styles = StyleSheet.create({
|
|
banner: {
|
|
backgroundColor: '#e74c3c',
|
|
paddingVertical: 6,
|
|
paddingHorizontal: 12,
|
|
borderRadius: 6,
|
|
alignItems: 'center',
|
|
marginBottom: 8,
|
|
},
|
|
text: {
|
|
color: '#ffffff',
|
|
fontWeight: '700',
|
|
fontSize: 12,
|
|
letterSpacing: 0.5,
|
|
textAlign: 'center',
|
|
},
|
|
});
|