aboutsummaryrefslogtreecommitdiffstats
path: root/apps/mobile/components/highlights/HighlightList.tsx
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-11-23 12:22:34 +0000
committerGitHub <noreply@github.com>2025-11-23 12:22:34 +0000
commit8a5a109cdf14b6503b6bd07aa667788924a12fe6 (patch)
tree2d43fc8f3f9ba7f262e6a0135868194dc3b149a2 /apps/mobile/components/highlights/HighlightList.tsx
parent7f555f574a0915c6302fb5ad7982a4529fe8a335 (diff)
downloadkarakeep-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.tsx65
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 />
+ )
+ }
+ />
+ );
+}