aboutsummaryrefslogtreecommitdiffstats
path: root/apps/mobile/app/dashboard
diff options
context:
space:
mode:
Diffstat (limited to 'apps/mobile/app/dashboard')
-rw-r--r--apps/mobile/app/dashboard/(tabs)/_layout.tsx15
-rw-r--r--apps/mobile/app/dashboard/(tabs)/highlights.tsx56
2 files changed, 70 insertions, 1 deletions
diff --git a/apps/mobile/app/dashboard/(tabs)/_layout.tsx b/apps/mobile/app/dashboard/(tabs)/_layout.tsx
index 316eddcf..5cc6aa92 100644
--- a/apps/mobile/app/dashboard/(tabs)/_layout.tsx
+++ b/apps/mobile/app/dashboard/(tabs)/_layout.tsx
@@ -2,7 +2,13 @@ import React, { useLayoutEffect } from "react";
import { Tabs, useNavigation } from "expo-router";
import { StyledTabs } from "@/components/navigation/tabs";
import { useColorScheme } from "@/lib/useColorScheme";
-import { ClipboardList, Home, Settings, Tag } from "lucide-react-native";
+import {
+ ClipboardList,
+ Highlighter,
+ Home,
+ Settings,
+ Tag,
+} from "lucide-react-native";
export default function TabLayout() {
const { colors } = useColorScheme();
@@ -45,6 +51,13 @@ export default function TabLayout() {
}}
/>
<Tabs.Screen
+ name="highlights"
+ options={{
+ title: "Highlights",
+ tabBarIcon: ({ color }) => <Highlighter color={color} />,
+ }}
+ />
+ <Tabs.Screen
name="settings"
options={{
title: "Settings",
diff --git a/apps/mobile/app/dashboard/(tabs)/highlights.tsx b/apps/mobile/app/dashboard/(tabs)/highlights.tsx
new file mode 100644
index 00000000..7879081b
--- /dev/null
+++ b/apps/mobile/app/dashboard/(tabs)/highlights.tsx
@@ -0,0 +1,56 @@
+import { View } from "react-native";
+import FullPageError from "@/components/FullPageError";
+import HighlightList from "@/components/highlights/HighlightList";
+import CustomSafeAreaView from "@/components/ui/CustomSafeAreaView";
+import FullPageSpinner from "@/components/ui/FullPageSpinner";
+import PageTitle from "@/components/ui/PageTitle";
+
+import { api } from "@karakeep/shared-react/trpc";
+
+export default function Highlights() {
+ const apiUtils = api.useUtils();
+ const {
+ data,
+ isPending,
+ isPlaceholderData,
+ error,
+ fetchNextPage,
+ isFetchingNextPage,
+ refetch,
+ } = api.highlights.getAll.useInfiniteQuery(
+ {},
+ {
+ initialCursor: null,
+ getNextPageParam: (lastPage) => lastPage.nextCursor,
+ },
+ );
+
+ if (error) {
+ return <FullPageError error={error.message} onRetry={() => refetch()} />;
+ }
+
+ if (isPending || !data) {
+ return <FullPageSpinner />;
+ }
+
+ const onRefresh = () => {
+ apiUtils.highlights.getAll.invalidate();
+ };
+
+ return (
+ <CustomSafeAreaView>
+ <HighlightList
+ highlights={data.pages.flatMap((p) => p.highlights)}
+ header={
+ <View className="flex flex-row justify-between">
+ <PageTitle title="Highlights" />
+ </View>
+ }
+ onRefresh={onRefresh}
+ fetchNextPage={fetchNextPage}
+ isFetchingNextPage={isFetchingNextPage}
+ isRefreshing={isPending || isPlaceholderData}
+ />
+ </CustomSafeAreaView>
+ );
+}