summaryrefslogtreecommitdiff
path: root/apps/mobile/components/EmptyState.tsx
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-01-18 02:58:27 +0000
committersoryu <soryu@soryu.co>2026-01-18 02:58:27 +0000
commitfcf9e70d54bd737d2dea848d25314120f37db503 (patch)
treebc304a9e153485f7686830614b2ddae4d4ff182e /apps/mobile/components/EmptyState.tsx
parentf84a7f2d820f6f432be2b1d78d6bf833b5b19380 (diff)
downloadsoryu-fcf9e70d54bd737d2dea848d25314120f37db503.tar.gz
soryu-fcf9e70d54bd737d2dea848d25314120f37db503.zip
[WIP] Heartbeat checkpoint - 2026-01-18 02:58:27 UTC
Diffstat (limited to 'apps/mobile/components/EmptyState.tsx')
-rw-r--r--apps/mobile/components/EmptyState.tsx53
1 files changed, 53 insertions, 0 deletions
diff --git a/apps/mobile/components/EmptyState.tsx b/apps/mobile/components/EmptyState.tsx
new file mode 100644
index 0000000..0707f91
--- /dev/null
+++ b/apps/mobile/components/EmptyState.tsx
@@ -0,0 +1,53 @@
+import React from 'react';
+import { View, Text, StyleSheet, useColorScheme } from 'react-native';
+import { Ionicons } from '@expo/vector-icons';
+import { Colors } from '../constants/Colors';
+
+interface EmptyStateProps {
+ icon?: keyof typeof Ionicons.glyphMap;
+ title: string;
+ message?: string;
+}
+
+export function EmptyState({
+ icon = 'cube-outline',
+ title,
+ message,
+}: EmptyStateProps) {
+ const colorScheme = useColorScheme() ?? 'light';
+ const colors = Colors[colorScheme];
+
+ return (
+ <View style={styles.container}>
+ <Ionicons name={icon} size={64} color={colors.secondaryText} />
+ <Text style={[styles.title, { color: colors.text }]}>{title}</Text>
+ {message && (
+ <Text style={[styles.message, { color: colors.secondaryText }]}>
+ {message}
+ </Text>
+ )}
+ </View>
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingHorizontal: 32,
+ paddingVertical: 64,
+ },
+ title: {
+ fontSize: 18,
+ fontWeight: '600',
+ marginTop: 16,
+ textAlign: 'center',
+ },
+ message: {
+ fontSize: 14,
+ marginTop: 8,
+ textAlign: 'center',
+ lineHeight: 20,
+ },
+});