react-phone-apps/apps/property-survey/app/summary.tsx
lanrtop 4e1d92264d feat: 初始化 Property Survey 应用基础架构
- 添加 monorepo 结构 (apps/property-survey, packages/types)
- 配置 Expo + React Native + Android 构建链
- 实现本地数据层 (SQLite/better-sqlite3)
- 添加 Blueprint 项目蓝图系统
- 配置 ESLint + Prettier
- 添加共享类型定义
2026-04-09 13:04:36 +09:00

58 lines
1.7 KiB
TypeScript

import { Alert, StyleSheet, TouchableOpacity, View } from 'react-native'
import { Ionicons } from '@expo/vector-icons'
import { useSummaryData } from '../src/features/summary/useSummaryData'
import { FilterBar } from '../src/features/summary/FilterBar'
import { SummaryStats } from '../src/features/summary/SummaryStats'
import { SummaryList } from '../src/features/summary/SummaryList'
import { exportWithPhotos } from '../src/features/summary/exportData'
import type { FloorNumber } from '@repo/types'
import { Stack, useFocusEffect } from 'expo-router'
import { useCallback } from 'react'
export default function SummaryScreen() {
const { rows, filter, setFilter, refresh } = useSummaryData()
useFocusEffect(useCallback(() => {
refresh()
}, []))
async function handleExport() {
try {
await exportWithPhotos(rows)
} catch (err) {
Alert.alert('导出失败', String(err))
}
}
return (
<>
<Stack.Screen
options={{
headerRight: () => (
<TouchableOpacity onPress={handleExport} style={styles.exportBtn}>
<Ionicons name="share-outline" size={22} color="#10B981" />
</TouchableOpacity>
),
}}
/>
<View style={styles.container}>
<SummaryStats rows={rows} />
<FilterBar
floor={filter.floor}
keyword={filter.keyword}
onFloorChange={(floor) =>
setFilter((f) => ({ ...f, floor: floor as FloorNumber | 0 }))
}
onKeywordChange={(keyword) => setFilter((f) => ({ ...f, keyword }))}
/>
<SummaryList rows={rows} />
</View>
</>
)
}
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: '#fff' },
exportBtn: { paddingHorizontal: 8 },
})