blob: 293b7765c7ce4126fbd0f859a283dd3e932e29e2 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
"use client";
import LinkCard from "./LinkCard";
import { ZBookmark, ZGetBookmarksRequest } from "@/lib/types/api/bookmarks";
import { api } from "@/lib/trpc";
import TextCard from "./TextCard";
import { Slot } from "@radix-ui/react-slot";
import Masonry from 'react-masonry-css';
import resolveConfig from 'tailwindcss/resolveConfig'
import tailwindConfig from '@/tailwind.config'
import { useMemo } from "react";
function getBreakpointConfig() {
const fullConfig = resolveConfig(tailwindConfig)
const breakpointColumnsObj: {[key: number]: number, default: number} = {
default: 3,
};
breakpointColumnsObj[parseInt(fullConfig.theme.screens.lg)] = 2;
breakpointColumnsObj[parseInt(fullConfig.theme.screens.md)] = 1;
breakpointColumnsObj[parseInt(fullConfig.theme.screens.sm)] = 1;
return breakpointColumnsObj;
}
function renderBookmark(bookmark: ZBookmark) {
let comp;
switch (bookmark.content.type) {
case "link":
comp = <LinkCard bookmark={bookmark} />;
break;
case "text":
comp = <TextCard bookmark={bookmark} />;
break;
}
return (
<Slot
key={bookmark.id}
className="border-grey-100 mb-4 border bg-gray-50 duration-300 ease-in hover:border-blue-300 hover:transition-all"
>
{comp}
</Slot>
);
}
export default function BookmarksGrid({
query,
bookmarks: initialBookmarks,
}: {
query: ZGetBookmarksRequest;
bookmarks: ZBookmark[];
}) {
const { data } = api.bookmarks.getBookmarks.useQuery(query, {
initialData: { bookmarks: initialBookmarks },
});
const breakpointConfig = useMemo(() => getBreakpointConfig(), []);
if (data.bookmarks.length == 0) {
return <p>No bookmarks</p>;
}
return (
<Masonry className="flex gap-4" breakpointCols={breakpointConfig} >
{data.bookmarks.map((b) => renderBookmark(b))}
</Masonry>
);
}
|