diff --git a/web/src/components/Memo.tsx b/web/src/components/Memo.tsx index dc1fc9b1..73e8a5a4 100644 --- a/web/src/components/Memo.tsx +++ b/web/src/components/Memo.tsx @@ -195,6 +195,15 @@ const Memo: React.FC = (props: Props) => { editorStateService.setEditMemoWithId(memo.id); }; + const handleMemoVisibilityClick = (visibility: Visibility) => { + const currVisibilityQuery = locationService.getState().query?.visibility; + if (currVisibilityQuery === visibility) { + locationService.setMemoVisibilityQuery(undefined); + } else { + locationService.setMemoVisibilityQuery(visibility); + } + }; + return (
{memo.pinned &&
} @@ -204,7 +213,12 @@ const Memo: React.FC = (props: Props) => { {displayTimeStr} {memo.visibility !== "PRIVATE" && !isVisitorMode && ( - {memo.visibility} + handleMemoVisibilityClick(memo.visibility)} + > + {memo.visibility} + )}
{!isVisitorMode && ( diff --git a/web/src/components/MemoFilter.tsx b/web/src/components/MemoFilter.tsx index 40b620d9..f71fb241 100644 --- a/web/src/components/MemoFilter.tsx +++ b/web/src/components/MemoFilter.tsx @@ -9,9 +9,9 @@ import "../less/memo-filter.less"; const MemoFilter = () => { const { t } = useTranslation(); const query = useAppSelector((state) => state.location.query); - const { tag: tagQuery, duration, type: memoType, text: textQuery, shortcutId } = query; + const { tag: tagQuery, duration, type: memoType, text: textQuery, shortcutId, visibility } = query; const shortcut = shortcutId ? shortcutService.getShortcutById(shortcutId) : null; - const showFilter = Boolean(tagQuery || (duration && duration.from < duration.to) || memoType || textQuery || shortcut); + const showFilter = Boolean(tagQuery || (duration && duration.from < duration.to) || memoType || textQuery || shortcut || visibility); return (
@@ -40,6 +40,14 @@ const MemoFilter = () => { > {t(getTextWithMemoType(memoType as MemoSpecType))}
+
{ + locationService.setMemoVisibilityQuery(undefined); + }} + > + {visibility} +
{duration && duration.from < duration.to ? (
{ const { memos, isFetching } = useAppSelector((state) => state.memo); const [isComplete, setIsComplete] = useState(false); - const { tag: tagQuery, duration, type: memoType, text: textQuery, shortcutId } = query ?? {}; + const { tag: tagQuery, duration, type: memoType, text: textQuery, shortcutId, visibility } = query ?? {}; const shortcut = shortcutId ? shortcutService.getShortcutById(shortcutId) : null; - const showMemoFilter = Boolean(tagQuery || (duration && duration.from < duration.to) || memoType || textQuery || shortcut); + const showMemoFilter = Boolean(tagQuery || (duration && duration.from < duration.to) || memoType || textQuery || shortcut || visibility); const shownMemos = showMemoFilter || shortcut @@ -65,6 +65,9 @@ const MemoList = () => { if (textQuery && !memo.content.toLowerCase().includes(textQuery.toLowerCase())) { shouldShow = false; } + if (visibility) { + shouldShow = memo.visibility === visibility; + } return shouldShow; }) diff --git a/web/src/services/locationService.ts b/web/src/services/locationService.ts index 65267c48..a1e31d32 100644 --- a/web/src/services/locationService.ts +++ b/web/src/services/locationService.ts @@ -59,6 +59,7 @@ const locationService = { duration: undefined, text: undefined, shortcutId: undefined, + visibility: undefined, }) ); updateLocationUrl(); @@ -116,6 +117,15 @@ const locationService = { ); updateLocationUrl(); }, + + setMemoVisibilityQuery: (visibility?: Visibility) => { + store.dispatch( + setQuery({ + visibility: visibility, + }) + ); + updateLocationUrl(); + }, }; export default locationService; diff --git a/web/src/store/modules/location.ts b/web/src/store/modules/location.ts index 10801418..bba5a2b0 100644 --- a/web/src/store/modules/location.ts +++ b/web/src/store/modules/location.ts @@ -11,6 +11,7 @@ export interface Query { type?: MemoSpecType; text?: string; shortcutId?: ShortcutId; + visibility?: Visibility; } interface State { @@ -52,6 +53,7 @@ const getStateFromLocation = () => { to, }; } + state.query.visibility = (urlParams.get("visibility") as Visibility) ?? undefined; } return state;