aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-06-09 21:05:21 +0000
committerMohamedBassem <me@mbassem.com>2024-06-09 21:05:21 +0000
commit6928800a604f05ef62234cb5c3ee1e60fb27ea1a (patch)
tree4c0f7c395a25b6db23f6cc6a4fc9c65c6f5ee1a4 /apps
parent546139e82f151b35d6492b7cbf2ac89dbfd5d0b5 (diff)
downloadkarakeep-6928800a604f05ef62234cb5c3ee1e60fb27ea1a.tar.zst
refactor: Extract the bookmark polling logic into a separate shared component
Diffstat (limited to 'apps')
-rw-r--r--apps/web/components/dashboard/bookmarks/AssetCard.tsx36
-rw-r--r--apps/web/components/dashboard/bookmarks/BookmarkCard.tsx59
-rw-r--r--apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx34
-rw-r--r--apps/web/components/dashboard/bookmarks/LinkCard.tsx30
-rw-r--r--apps/web/components/dashboard/bookmarks/TextCard.tsx29
5 files changed, 75 insertions, 113 deletions
diff --git a/apps/web/components/dashboard/bookmarks/AssetCard.tsx b/apps/web/components/dashboard/bookmarks/AssetCard.tsx
index f110e0c4..c235e4c8 100644
--- a/apps/web/components/dashboard/bookmarks/AssetCard.tsx
+++ b/apps/web/components/dashboard/bookmarks/AssetCard.tsx
@@ -2,14 +2,9 @@
import Image from "next/image";
import Link from "next/link";
-import { api } from "@/lib/trpc";
-import type {
- ZBookmark,
- ZBookmarkTypeAsset,
-} from "@hoarder/shared/types/bookmarks";
+import type { ZBookmarkTypeAsset } from "@hoarder/shared/types/bookmarks";
import { getAssetUrl } from "@hoarder/shared-react/utils/assetUtils";
-import { isBookmarkStillTagging } from "@hoarder/shared-react/utils/bookmarkUtils";
import { BookmarkLayoutAdaptingCard } from "./BookmarkLayoutAdaptingCard";
@@ -51,37 +46,12 @@ function AssetImage({
}
export default function AssetCard({
- bookmark: initialData,
+ bookmark: bookmarkedAsset,
className,
}: {
- bookmark: ZBookmark;
+ bookmark: ZBookmarkTypeAsset;
className?: string;
}) {
- const { data: bookmark } = api.bookmarks.getBookmark.useQuery(
- {
- bookmarkId: initialData.id,
- },
- {
- initialData,
- refetchInterval: (query) => {
- const data = query.state.data;
- if (!data) {
- return false;
- }
- if (isBookmarkStillTagging(data)) {
- return 1000;
- }
- return false;
- },
- },
- );
-
- if (bookmark.content.type != "asset") {
- throw new Error("Unexpected bookmark type");
- }
-
- const bookmarkedAsset = { ...bookmark, content: bookmark.content };
-
return (
<BookmarkLayoutAdaptingCard
title={bookmarkedAsset.title ?? bookmarkedAsset.content.fileName}
diff --git a/apps/web/components/dashboard/bookmarks/BookmarkCard.tsx b/apps/web/components/dashboard/bookmarks/BookmarkCard.tsx
new file mode 100644
index 00000000..76316de7
--- /dev/null
+++ b/apps/web/components/dashboard/bookmarks/BookmarkCard.tsx
@@ -0,0 +1,59 @@
+import { api } from "@/lib/trpc";
+
+import type { ZBookmark } from "@hoarder/shared/types/bookmarks";
+import { isBookmarkStillLoading } from "@hoarder/shared-react/utils/bookmarkUtils";
+
+import AssetCard from "./AssetCard";
+import LinkCard from "./LinkCard";
+import TextCard from "./TextCard";
+
+export default function BookmarkCard({
+ bookmark: initialData,
+ className,
+}: {
+ bookmark: ZBookmark;
+ className?: string;
+}) {
+ const { data: bookmark } = api.bookmarks.getBookmark.useQuery(
+ {
+ bookmarkId: initialData.id,
+ },
+ {
+ initialData,
+ refetchInterval: (query) => {
+ const data = query.state.data;
+ if (!data) {
+ return false;
+ }
+ if (isBookmarkStillLoading(data)) {
+ return 1000;
+ }
+ return false;
+ },
+ },
+ );
+
+ switch (bookmark.content.type) {
+ case "link":
+ return (
+ <LinkCard
+ className={className}
+ bookmark={{ ...bookmark, content: bookmark.content }}
+ />
+ );
+ case "text":
+ return (
+ <TextCard
+ className={className}
+ bookmark={{ ...bookmark, content: bookmark.content }}
+ />
+ );
+ case "asset":
+ return (
+ <AssetCard
+ className={className}
+ bookmark={{ ...bookmark, content: bookmark.content }}
+ />
+ );
+ }
+}
diff --git a/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx b/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx
index b44dea33..540546fe 100644
--- a/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx
+++ b/apps/web/components/dashboard/bookmarks/BookmarksGrid.tsx
@@ -11,12 +11,10 @@ import resolveConfig from "tailwindcss/resolveConfig";
import type { ZBookmark } from "@hoarder/shared/types/bookmarks";
-import AssetCard from "./AssetCard";
+import BookmarkCard from "./BookmarkCard";
import EditorCard from "./EditorCard";
-import LinkCard from "./LinkCard";
-import TextCard from "./TextCard";
-function BookmarkCard({ children }: { children: React.ReactNode }) {
+function StyledBookmarkCard({ children }: { children: React.ReactNode }) {
return (
<Slot className="mb-4 border border-border bg-card duration-300 ease-in hover:shadow-lg hover:transition-all">
{children}
@@ -36,24 +34,6 @@ function getBreakpointConfig() {
return breakpointColumnsObj;
}
-function renderBookmark(bookmark: ZBookmark) {
- let comp;
- switch (bookmark.content.type) {
- case "link":
- comp = <LinkCard bookmark={{ ...bookmark, content: bookmark.content }} />;
- break;
- case "text":
- comp = <TextCard bookmark={{ ...bookmark, content: bookmark.content }} />;
- break;
- case "asset":
- comp = (
- <AssetCard bookmark={{ ...bookmark, content: bookmark.content }} />
- );
- break;
- }
- return <BookmarkCard key={bookmark.id}>{comp}</BookmarkCard>;
-}
-
export default function BookmarksGrid({
bookmarks,
hasNextPage = false,
@@ -76,11 +56,15 @@ export default function BookmarksGrid({
const children = [
showEditorCard && (
- <BookmarkCard key={"editor"}>
+ <StyledBookmarkCard key={"editor"}>
<EditorCard />
- </BookmarkCard>
+ </StyledBookmarkCard>
),
- ...bookmarks.map((b) => renderBookmark(b)),
+ ...bookmarks.map((b) => (
+ <StyledBookmarkCard key={b.id}>
+ <BookmarkCard bookmark={b} />
+ </StyledBookmarkCard>
+ )),
];
return (
<>
diff --git a/apps/web/components/dashboard/bookmarks/LinkCard.tsx b/apps/web/components/dashboard/bookmarks/LinkCard.tsx
index 1446b031..7212940b 100644
--- a/apps/web/components/dashboard/bookmarks/LinkCard.tsx
+++ b/apps/web/components/dashboard/bookmarks/LinkCard.tsx
@@ -2,13 +2,11 @@
import Image from "next/image";
import Link from "next/link";
-import { api } from "@/lib/trpc";
import type { ZBookmarkTypeLink } from "@hoarder/shared/types/bookmarks";
import {
getBookmarkLinkImageUrl,
isBookmarkStillCrawling,
- isBookmarkStillLoading,
} from "@hoarder/shared-react/utils/bookmarkUtils";
import { BookmarkLayoutAdaptingCard } from "./BookmarkLayoutAdaptingCard";
@@ -80,38 +78,12 @@ function LinkUrl({ bookmark }: { bookmark: ZBookmarkTypeLink }) {
}
export default function LinkCard({
- bookmark: initialData,
+ bookmark: bookmarkLink,
className,
}: {
bookmark: ZBookmarkTypeLink;
className?: string;
}) {
- const { data: bookmark } = api.bookmarks.getBookmark.useQuery(
- {
- bookmarkId: initialData.id,
- },
- {
- initialData,
- refetchInterval: (query) => {
- const data = query.state.data;
- if (!data) {
- return false;
- }
- // If the link is not crawled or not tagged
- if (isBookmarkStillLoading(data)) {
- return 1000;
- }
- return false;
- },
- },
- );
-
- if (bookmark.content.type !== "link") {
- throw new Error("Invalid bookmark type");
- }
-
- const bookmarkLink = { ...bookmark, content: bookmark.content };
-
return (
<BookmarkLayoutAdaptingCard
title={<LinkTitle bookmark={bookmarkLink} />}
diff --git a/apps/web/components/dashboard/bookmarks/TextCard.tsx b/apps/web/components/dashboard/bookmarks/TextCard.tsx
index b18efc3d..ffaa18a4 100644
--- a/apps/web/components/dashboard/bookmarks/TextCard.tsx
+++ b/apps/web/components/dashboard/bookmarks/TextCard.tsx
@@ -2,46 +2,23 @@
import { useState } from "react";
import { MarkdownComponent } from "@/components/ui/markdown-component";
-import { api } from "@/lib/trpc";
import { bookmarkLayoutSwitch } from "@/lib/userLocalSettings/bookmarksLayout";
import { cn } from "@/lib/utils";
-import type { ZBookmark } from "@hoarder/shared/types/bookmarks";
-import { isBookmarkStillTagging } from "@hoarder/shared-react/utils/bookmarkUtils";
+import type { ZBookmarkTypeText } from "@hoarder/shared/types/bookmarks";
import { BookmarkedTextViewer } from "./BookmarkedTextViewer";
import { BookmarkLayoutAdaptingCard } from "./BookmarkLayoutAdaptingCard";
export default function TextCard({
- bookmark: initialData,
+ bookmark,
className,
}: {
- bookmark: ZBookmark;
+ bookmark: ZBookmarkTypeText;
className?: string;
}) {
- const { data: bookmark } = api.bookmarks.getBookmark.useQuery(
- {
- bookmarkId: initialData.id,
- },
- {
- initialData,
- refetchInterval: (query) => {
- const data = query.state.data;
- if (!data) {
- return false;
- }
- if (isBookmarkStillTagging(data)) {
- return 1000;
- }
- return false;
- },
- },
- );
const [previewModalOpen, setPreviewModalOpen] = useState(false);
const bookmarkedText = bookmark.content;
- if (bookmarkedText.type != "text") {
- throw new Error("Unexpected bookmark type");
- }
return (
<>