mirror of
https://github.com/stablyai/orca.git
synced 2026-10-19 16:03:26 +00:00
* Add mobile diff review * Wrap mobile review notes prompt * Fix mobile review unreviewed navigation * Clear review completion when a refreshed diff invalidates a reviewed file mergeMobileDiffReviewState invalidates a file's reviewed flag when its diff identity changes, but left completedAt set — inconsistent with markUnreviewed. Drop completedAt on invalidation and add a regression test. Co-authored-by: Orca <help@stably.ai> --------- Co-authored-by: Jinwoo-H <jinwoo0825@gmail.com> Co-authored-by: Orca <help@stably.ai>
92 lines
3.1 KiB
TypeScript
92 lines
3.1 KiB
TypeScript
import { FlatList, Pressable, Text, View } from 'react-native'
|
|
import { ChevronLeft, MoreHorizontal } from 'lucide-react-native'
|
|
import { colors } from '../theme/mobile-theme'
|
|
import type { MobileDiffReviewQueueFilter } from '../session/mobile-diff-review-queue'
|
|
import { REVIEW_FILTERS, mobileReviewCountLabel } from '../session/mobile-diff-review-screen-model'
|
|
import { mobileDiffReviewStyles as styles } from './mobile-diff-review-screen-styles'
|
|
|
|
type Props = {
|
|
filter: MobileDiffReviewQueueFilter
|
|
queueLength: number
|
|
reviewedCount: number
|
|
unsentCount: number
|
|
worktreeLabel: string
|
|
onBack: () => void
|
|
onOpenActions: () => void
|
|
onSelectFilter: (filter: MobileDiffReviewQueueFilter) => void
|
|
}
|
|
|
|
export function MobileDiffReviewHeader({
|
|
filter,
|
|
queueLength,
|
|
reviewedCount,
|
|
unsentCount,
|
|
worktreeLabel,
|
|
onBack,
|
|
onOpenActions,
|
|
onSelectFilter
|
|
}: Props) {
|
|
return (
|
|
<View style={styles.header}>
|
|
<View style={styles.topBar}>
|
|
<Pressable
|
|
style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}
|
|
onPress={onBack}
|
|
accessibilityRole="button"
|
|
accessibilityLabel="Back"
|
|
>
|
|
<ChevronLeft size={19} color={colors.textPrimary} strokeWidth={2.2} />
|
|
</Pressable>
|
|
<View style={styles.titleBlock}>
|
|
<Text style={styles.title} numberOfLines={1}>
|
|
Review Changes
|
|
</Text>
|
|
<Text style={styles.subtitle} numberOfLines={1}>
|
|
{worktreeLabel}
|
|
</Text>
|
|
</View>
|
|
<Pressable
|
|
style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}
|
|
onPress={onOpenActions}
|
|
accessibilityRole="button"
|
|
accessibilityLabel="Open review actions"
|
|
>
|
|
<MoreHorizontal size={19} color={colors.textPrimary} strokeWidth={2.2} />
|
|
</Pressable>
|
|
</View>
|
|
<View style={styles.progressRow}>
|
|
<Text style={styles.progressText}>
|
|
{reviewedCount}/{queueLength} reviewed
|
|
</Text>
|
|
<Text style={styles.progressText}>
|
|
{mobileReviewCountLabel(unsentCount, 'unsent note', 'unsent notes')}
|
|
</Text>
|
|
</View>
|
|
<FlatList
|
|
data={REVIEW_FILTERS}
|
|
horizontal
|
|
showsHorizontalScrollIndicator={false}
|
|
keyExtractor={(item) => item}
|
|
contentContainerStyle={styles.filterRow}
|
|
renderItem={({ item }) => (
|
|
<Pressable
|
|
style={({ pressed }) => [
|
|
styles.filterChip,
|
|
filter === item && styles.filterChipActive,
|
|
pressed && styles.filterChipPressed
|
|
]}
|
|
onPress={() => onSelectFilter(item)}
|
|
accessibilityRole="button"
|
|
accessibilityState={{ selected: filter === item }}
|
|
accessibilityLabel={`Show ${item} review files`}
|
|
>
|
|
<Text style={[styles.filterText, filter === item && styles.filterTextActive]}>
|
|
{item === 'all' ? 'All' : item[0]?.toUpperCase() + item.slice(1)}
|
|
</Text>
|
|
</Pressable>
|
|
)}
|
|
/>
|
|
</View>
|
|
)
|
|
}
|