diff options
| author | Mohamed Bassem <me@mbassem.com> | 2025-11-23 12:22:34 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-23 12:22:34 +0000 |
| commit | 8a5a109cdf14b6503b6bd07aa667788924a12fe6 (patch) | |
| tree | 2d43fc8f3f9ba7f262e6a0135868194dc3b149a2 /apps/mobile/components/highlights/HighlightList.tsx | |
| parent | 7f555f574a0915c6302fb5ad7982a4529fe8a335 (diff) | |
| download | karakeep-8a5a109cdf14b6503b6bd07aa667788924a12fe6.tar.zst | |
feat(mobile): Add highlights page to mobile app (#2156)
* feat: Add highlights page to mobile app
This commit adds a new highlights page to the mobile app where users can
view all their highlights with the following features:
- HighlightCard component: Displays individual highlights with colored borders,
text, optional notes, timestamps, and a link to the source bookmark
- HighlightList component: Renders a scrollable list of highlights with
pull-to-refresh and infinite scroll pagination
- UpdatingHighlightList component: Handles data fetching using tRPC infinite
queries with automatic cache invalidation
- New /dashboard/highlights route with large header title
- Added navigation link in Settings tab under "App Settings"
All components follow the existing mobile app patterns and integrate with
the existing highlights API.
* make it a tab
---------
Co-authored-by: Claude <noreply@anthropic.com>
Diffstat (limited to 'apps/mobile/components/highlights/HighlightList.tsx')
| -rw-r--r-- | apps/mobile/components/highlights/HighlightList.tsx | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/apps/mobile/components/highlights/HighlightList.tsx b/apps/mobile/components/highlights/HighlightList.tsx new file mode 100644 index 00000000..865add2a --- /dev/null +++ b/apps/mobile/components/highlights/HighlightList.tsx @@ -0,0 +1,65 @@ +import { useRef } from "react"; +import { ActivityIndicator, Keyboard, View } from "react-native"; +import Animated, { LinearTransition } from "react-native-reanimated"; +import { Text } from "@/components/ui/Text"; +import { useScrollToTop } from "@react-navigation/native"; + +import type { ZHighlight } from "@karakeep/shared/types/highlights"; + +import HighlightCard from "./HighlightCard"; + +export default function HighlightList({ + highlights, + header, + onRefresh, + fetchNextPage, + isFetchingNextPage, + isRefreshing, +}: { + highlights: ZHighlight[]; + onRefresh: () => void; + isRefreshing: boolean; + fetchNextPage?: () => void; + header?: React.ReactElement; + isFetchingNextPage?: boolean; +}) { + const flatListRef = useRef(null); + useScrollToTop(flatListRef); + + return ( + <Animated.FlatList + ref={flatListRef} + itemLayoutAnimation={LinearTransition} + ListHeaderComponent={header} + contentContainerStyle={{ + gap: 15, + marginHorizontal: 15, + marginBottom: 15, + }} + renderItem={(h) => <HighlightCard highlight={h.item} />} + ListEmptyComponent={ + <View className="items-center justify-center pt-4"> + <Text variant="title3">No Highlights</Text> + <Text className="mt-2 text-center text-muted-foreground"> + Highlights you create will appear here + </Text> + </View> + } + data={highlights} + refreshing={isRefreshing} + onRefresh={onRefresh} + onScrollBeginDrag={Keyboard.dismiss} + keyExtractor={(h) => h.id} + onEndReached={fetchNextPage} + ListFooterComponent={ + isFetchingNextPage ? ( + <View className="items-center"> + <ActivityIndicator /> + </View> + ) : ( + <View /> + ) + } + /> + ); +} |
