From 6395b698b9eed61ab4fb39ba3a4569330656b083 Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 3 Aug 2023 00:20:11 +0800 Subject: [PATCH] feat: add shortcut display mode --- web/src/components/ShortcutView.tsx | 137 +++++++++++++--------- web/src/components/ShortcutsContainer.tsx | 6 +- web/src/components/ViewSetting.tsx | 10 +- web/src/stores/v1/view.ts | 12 +- 4 files changed, 96 insertions(+), 69 deletions(-) diff --git a/web/src/components/ShortcutView.tsx b/web/src/components/ShortcutView.tsx index 9248fe5..8a87fd0 100644 --- a/web/src/components/ShortcutView.tsx +++ b/web/src/components/ShortcutView.tsx @@ -1,4 +1,5 @@ import { Tooltip } from "@mui/joy"; +import classNames from "classnames"; import copy from "copy-to-clipboard"; import { useEffect, useState } from "react"; import toast from "react-hot-toast"; @@ -32,6 +33,7 @@ const ShortcutView = (props: Props) => { const [showAnalyticsDialog, setShowAnalyticsDialog] = useState(false); const havePermission = currentUser.role === "ADMIN" || shortcut.creatorId === currentUser.id; const shortcutLink = absolutifyLink(`/s/${shortcut.name}`); + const compactMode = viewStore.displayStyle === "compact"; useEffect(() => { faviconStore.getOrFetchUrlFavicon(shortcut.link).then((url) => { @@ -59,20 +61,31 @@ const ShortcutView = (props: Props) => { return ( <> -
+
-
- +
+ {favicon ? ( ) : ( - + )} -
+
@@ -91,18 +104,22 @@ const ShortcutView = (props: Props) => { - - - + {!compactMode && ( + + + + )}
- - {shortcut.link} - + {!compactMode && ( + + {shortcut.link} + + )}
@@ -143,46 +160,56 @@ const ShortcutView = (props: Props) => { )}
-
- {shortcut.tags.map((tag) => { - return ( - viewStore.setFilter({ tag: tag })} + + {!compactMode && ( + <> +
+ {shortcut.tags.map((tag) => { + return ( + viewStore.setFilter({ tag: tag })} + > + #{tag} + + ); + })} + {shortcut.tags.length === 0 && No tags} +
+
+ +
+ + {shortcut.creator.nickname} +
+
+ - #{tag} - - ); - })} - {shortcut.tags.length === 0 && No tags} -
-
- -
- - {shortcut.creator.nickname} +
viewStore.setFilter({ visibility: shortcut.visibility })} + > + + {t(`shortcut.visibility.${shortcut.visibility.toLowerCase()}.self`)} +
+ + +
setShowAnalyticsDialog(true)} + > + + {shortcut.view} visits +
+
-
- -
viewStore.setFilter({ visibility: shortcut.visibility })} - > - - {t(`shortcut.visibility.${shortcut.visibility.toLowerCase()}.self`)} -
-
- -
setShowAnalyticsDialog(true)} - > - - {shortcut.view} visits -
-
-
+ + )}
{showQRCodeDialog && setShowQRCodeDialog(false)} />} diff --git a/web/src/components/ShortcutsContainer.tsx b/web/src/components/ShortcutsContainer.tsx index 4139839..d39422f 100644 --- a/web/src/components/ShortcutsContainer.tsx +++ b/web/src/components/ShortcutsContainer.tsx @@ -11,15 +11,15 @@ interface Props { const ShortcutsContainer: React.FC = (props: Props) => { const { shortcutList } = props; const viewStore = useViewStore(); - const layout = viewStore.layout || "grid"; + const displayStyle = viewStore.displayStyle || "full"; const [editingShortcutId, setEditingShortcutId] = useState(); return ( <>
{shortcutList.map((shortcut) => { diff --git a/web/src/components/ViewSetting.tsx b/web/src/components/ViewSetting.tsx index 212e0a8..9d2b882 100644 --- a/web/src/components/ViewSetting.tsx +++ b/web/src/components/ViewSetting.tsx @@ -8,7 +8,7 @@ const ViewSetting = () => { const viewStore = useViewStore(); const order = viewStore.getOrder(); const { field, direction } = order; - const layout = viewStore.layout || "grid"; + const displayStyle = viewStore.displayStyle || "full"; const handleReset = () => { viewStore.setOrder({ field: "name", direction: "asc" }); @@ -49,10 +49,10 @@ const ViewSetting = () => {
- Layout - viewStore.setDisplayStyle(value as any)}> + +
diff --git a/web/src/stores/v1/view.ts b/web/src/stores/v1/view.ts index bb34462..2b6937b 100644 --- a/web/src/stores/v1/view.ts +++ b/web/src/stores/v1/view.ts @@ -13,16 +13,16 @@ export interface Order { direction: "asc" | "desc"; } -export type Layout = "grid" | "list"; +export type DisplayStyle = "full" | "compact"; interface ViewState { filter: Filter; order: Order; - layout: Layout; + displayStyle: DisplayStyle; setFilter: (filter: Partial) => void; getOrder: () => Order; setOrder: (order: Partial) => void; - setLayout: (layout: Layout) => void; + setDisplayStyle: (displayStyle: DisplayStyle) => void; } const useViewStore = create()( @@ -33,7 +33,7 @@ const useViewStore = create()( field: "name", direction: "asc", }, - layout: "grid", + displayStyle: "full", setFilter: (filter: Partial) => { set({ filter: { ...get().filter, ...filter } }); }, @@ -46,8 +46,8 @@ const useViewStore = create()( setOrder: (order: Partial) => { set({ order: { ...get().order, ...order } }); }, - setLayout: (layout: Layout) => { - set({ layout }); + setDisplayStyle: (displayStyle: DisplayStyle) => { + set({ displayStyle }); }, }), {