import { useEffect, useState } from 'react'; import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native'; import { useInboxStore, type ActivityItem, type ApprovalItem, type InboxState } from '../../store/inbox-store'; import { buttonA11y, textInputA11y, dynamicType } from '../../lib/accessibility'; import { colors } from '../../theme'; export default function InboxScreen() { const approvals = useInboxStore((state: InboxState) => state.approvals); const activity = useInboxStore((state: InboxState) => state.activity); const isLoading = useInboxStore((state: InboxState) => state.isLoading); const hydrate = useInboxStore((state: InboxState) => state.hydrate); const approve = useInboxStore((state: InboxState) => state.approve); const reject = useInboxStore((state: InboxState) => state.reject); const [pendingApprovalId, setPendingApprovalId] = useState(null); const [reviewNote, setReviewNote] = useState(''); useEffect(() => { void hydrate(); }, [hydrate]); return ( Inbox Review simple agent actions and approve or reject them from mobile. {isLoading ? Loading approvals… : null} {approvals.length > 0 ? ( ) : null} {approvals.map((item: ApprovalItem) => ( {item.title} {item.summary} Status: {item.status} { setPendingApprovalId(item.id); try { const note = reviewNote.trim() || undefined; await approve(item.id, note); setReviewNote(''); } finally { setPendingApprovalId(null); } }} > {pendingApprovalId === item.id ? 'Approving…' : 'Approve'} { setPendingApprovalId(item.id); try { const note = reviewNote.trim() || undefined; await reject(item.id, note); setReviewNote(''); } finally { setPendingApprovalId(null); } }} > {pendingApprovalId === item.id ? 'Rejecting…' : 'Reject'} ))} {!isLoading && approvals.length === 0 ? ( No approval items are waiting right now. ) : null} Recent activity {activity.map((item: ActivityItem) => ( {item.kind} {item.title} {item.summary} ))} {!isLoading && activity.length === 0 ? ( No recent agent activity yet. ) : null} ); } const styles = StyleSheet.create({ container: { flex: 1, padding: 20, backgroundColor: colors.bgCanvas, gap: 14, }, title: { color: colors.textPrimary, fontSize: 28, fontWeight: '700', }, body: { color: colors.textSecondary, fontSize: 15, lineHeight: 21, }, empty: { color: colors.textSecondary, fontSize: 14, }, card: { backgroundColor: colors.surfaceCard, borderRadius: 16, borderWidth: 1, borderColor: colors.borderDefault, padding: 16, gap: 8, }, cardTitle: { color: colors.textPrimary, fontSize: 16, fontWeight: '700', }, cardBody: { color: colors.textSecondary, fontSize: 14, }, status: { color: colors.textSecondary, fontSize: 13, textTransform: 'capitalize', }, actionRow: { flexDirection: 'row', gap: 10, }, buttonDisabled: { opacity: 0.6, }, approveButton: { backgroundColor: colors.accentPrimary, borderRadius: 10, paddingHorizontal: 12, paddingVertical: 10, }, approveText: { color: colors.textPrimary, fontWeight: '700', }, rejectButton: { borderWidth: 1, borderColor: colors.borderDefault, borderRadius: 10, paddingHorizontal: 12, paddingVertical: 10, }, rejectText: { color: colors.textSecondary, fontWeight: '600', }, feedSection: { gap: 10, }, feedTitle: { color: colors.textPrimary, fontSize: 18, fontWeight: '700', }, feedCard: { backgroundColor: colors.bgElevated, borderRadius: 14, borderWidth: 1, borderColor: colors.borderDefault, padding: 14, gap: 6, }, feedKind: { color: colors.accentSecondary, fontSize: 12, fontWeight: '700', textTransform: 'uppercase', }, reviewNoteInput: { backgroundColor: colors.bgElevated, borderRadius: 12, borderWidth: 1, borderColor: colors.borderDefault, color: colors.textPrimary, padding: 12, fontSize: 14, minHeight: 48, textAlignVertical: 'top' as const, }, });