Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
d7889d99
Commit
d7889d99
authored
Jan 26, 2024
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: tweak url filters
parent
db3457e0
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
55 additions
and
99 deletions
+55
-99
useFilterWithUrlParams.ts
web/src/hooks/useFilterWithUrlParams.ts
+44
-0
Archived.tsx
web/src/pages/Archived.tsx
+2
-3
Explore.tsx
web/src/pages/Explore.tsx
+2
-31
Home.tsx
web/src/pages/Home.tsx
+2
-31
Timeline.tsx
web/src/pages/Timeline.tsx
+2
-3
UserProfile.tsx
web/src/pages/UserProfile.tsx
+3
-31
No files found.
web/src/hooks/useFilterWithUrlParams.ts
0 → 100644
View file @
d7889d99
import
{
useEffect
}
from
"react"
;
import
{
useLocation
}
from
"react-router-dom"
;
import
{
useFilterStore
}
from
"@/store/module"
;
const
useFilterWithUrlParams
=
()
=>
{
const
location
=
useLocation
();
const
filterStore
=
useFilterStore
();
const
{
tag
,
text
}
=
filterStore
.
state
;
useEffect
(()
=>
{
const
urlParams
=
new
URLSearchParams
(
location
.
search
);
const
tag
=
urlParams
.
get
(
"tag"
);
const
text
=
urlParams
.
get
(
"text"
);
if
(
tag
)
{
filterStore
.
setTagFilter
(
tag
);
}
if
(
text
)
{
filterStore
.
setTextFilter
(
text
);
}
},
[]);
useEffect
(()
=>
{
const
urlParams
=
new
URLSearchParams
(
location
.
search
);
if
(
tag
)
{
urlParams
.
set
(
"tag"
,
tag
);
}
else
{
urlParams
.
delete
(
"tag"
);
}
if
(
text
)
{
urlParams
.
set
(
"text"
,
text
);
}
else
{
urlParams
.
delete
(
"text"
);
}
const
params
=
urlParams
.
toString
();
window
.
history
.
replaceState
({},
""
,
`
${
location
.
pathname
}${
params
?.
length
>
0
?
`?
${
params
}
`
:
""
}
`);
}, [tag, text]);
return {
tag,
text,
};
};
export default useFilterWithUrlParams;
web/src/pages/Archived.tsx
View file @
d7889d99
...
@@ -12,8 +12,8 @@ import SearchBar from "@/components/SearchBar";
...
@@ -12,8 +12,8 @@ import SearchBar from "@/components/SearchBar";
import
{
memoServiceClient
}
from
"@/grpcweb"
;
import
{
memoServiceClient
}
from
"@/grpcweb"
;
import
{
getDateTimeString
}
from
"@/helpers/datetime"
;
import
{
getDateTimeString
}
from
"@/helpers/datetime"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useFilterWithUrlParams
from
"@/hooks/useFilterWithUrlParams"
;
import
useLoading
from
"@/hooks/useLoading"
;
import
useLoading
from
"@/hooks/useLoading"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
useMemoStore
}
from
"@/store/v1"
;
import
{
useMemoStore
}
from
"@/store/v1"
;
import
{
RowStatus
}
from
"@/types/proto/api/v2/common"
;
import
{
RowStatus
}
from
"@/types/proto/api/v2/common"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
...
@@ -23,10 +23,9 @@ const Archived = () => {
...
@@ -23,10 +23,9 @@ const Archived = () => {
const
t
=
useTranslate
();
const
t
=
useTranslate
();
const
loadingState
=
useLoading
();
const
loadingState
=
useLoading
();
const
user
=
useCurrentUser
();
const
user
=
useCurrentUser
();
const
filterStore
=
useFilterStore
();
const
memoStore
=
useMemoStore
();
const
memoStore
=
useMemoStore
();
const
[
archivedMemos
,
setArchivedMemos
]
=
useState
<
Memo
[]
>
([]);
const
[
archivedMemos
,
setArchivedMemos
]
=
useState
<
Memo
[]
>
([]);
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
filterStore
.
state
;
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
useFilterWithUrlParams
()
;
useEffect
(()
=>
{
useEffect
(()
=>
{
(
async
()
=>
{
(
async
()
=>
{
...
...
web/src/pages/Explore.tsx
View file @
d7889d99
import
{
Button
}
from
"@mui/joy"
;
import
{
Button
}
from
"@mui/joy"
;
import
{
useEffect
,
useState
}
from
"react"
;
import
{
useEffect
,
useState
}
from
"react"
;
import
{
useLocation
}
from
"react-router-dom"
;
import
Empty
from
"@/components/Empty"
;
import
Empty
from
"@/components/Empty"
;
import
Icon
from
"@/components/Icon"
;
import
Icon
from
"@/components/Icon"
;
import
MemoFilter
from
"@/components/MemoFilter"
;
import
MemoFilter
from
"@/components/MemoFilter"
;
...
@@ -9,49 +8,21 @@ import MobileHeader from "@/components/MobileHeader";
...
@@ -9,49 +8,21 @@ import MobileHeader from "@/components/MobileHeader";
import
{
DEFAULT_MEMO_LIMIT
}
from
"@/helpers/consts"
;
import
{
DEFAULT_MEMO_LIMIT
}
from
"@/helpers/consts"
;
import
{
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
{
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
{
useFilterStore
}
from
"@/store/module
"
;
import
useFilterWithUrlParams
from
"@/hooks/useFilterWithUrlParams
"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
const
Explore
=
()
=>
{
const
Explore
=
()
=>
{
const
t
=
useTranslate
();
const
t
=
useTranslate
();
const
location
=
useLocation
();
const
user
=
useCurrentUser
();
const
user
=
useCurrentUser
();
const
filterStore
=
useFilterStore
();
const
memoStore
=
useMemoStore
();
const
memoStore
=
useMemoStore
();
const
memoList
=
useMemoList
();
const
memoList
=
useMemoList
();
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
filterStore
.
state
;
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
useFilterWithUrlParams
()
;
const
sortedMemos
=
memoList
.
value
.
sort
((
a
,
b
)
=>
getTimeStampByDate
(
b
.
displayTime
)
-
getTimeStampByDate
(
a
.
displayTime
));
const
sortedMemos
=
memoList
.
value
.
sort
((
a
,
b
)
=>
getTimeStampByDate
(
b
.
displayTime
)
-
getTimeStampByDate
(
a
.
displayTime
));
useEffect
(()
=>
{
useEffect
(()
=>
{
const
urlParams
=
new
URLSearchParams
(
location
.
search
);
const
tag
=
urlParams
.
get
(
"tag"
);
const
text
=
urlParams
.
get
(
"text"
);
if
(
tag
)
{
filterStore
.
setTagFilter
(
tag
);
}
if
(
text
)
{
filterStore
.
setTextFilter
(
text
);
}
},
[]);
useEffect
(()
=>
{
const
urlParams
=
new
URLSearchParams
(
location
.
search
);
if
(
tagQuery
)
{
urlParams
.
set
(
"tag"
,
tagQuery
);
}
else
{
urlParams
.
delete
(
"tag"
);
}
if
(
textQuery
)
{
urlParams
.
set
(
"text"
,
textQuery
);
}
else
{
urlParams
.
delete
(
"text"
);
}
const
params
=
urlParams
.
toString
();
window
.
history
.
replaceState
({},
""
,
`
${
location
.
pathname
}${
params
?.
length
>
0
?
`?
${
params
}
`
:
""
}
`);
memoList
.
reset
();
memoList
.
reset
();
fetchMemos
();
fetchMemos
();
},
[
tagQuery
,
textQuery
]);
},
[
tagQuery
,
textQuery
]);
...
...
web/src/pages/Home.tsx
View file @
d7889d99
import
{
Button
}
from
"@mui/joy"
;
import
{
Button
}
from
"@mui/joy"
;
import
classNames
from
"classnames"
;
import
classNames
from
"classnames"
;
import
{
useEffect
,
useState
}
from
"react"
;
import
{
useEffect
,
useState
}
from
"react"
;
import
{
useLocation
}
from
"react-router-dom"
;
import
Empty
from
"@/components/Empty"
;
import
Empty
from
"@/components/Empty"
;
import
HomeSidebar
from
"@/components/HomeSidebar"
;
import
HomeSidebar
from
"@/components/HomeSidebar"
;
import
HomeSidebarDrawer
from
"@/components/HomeSidebarDrawer"
;
import
HomeSidebarDrawer
from
"@/components/HomeSidebarDrawer"
;
...
@@ -13,55 +12,27 @@ import MobileHeader from "@/components/MobileHeader";
...
@@ -13,55 +12,27 @@ import MobileHeader from "@/components/MobileHeader";
import
{
DEFAULT_MEMO_LIMIT
}
from
"@/helpers/consts"
;
import
{
DEFAULT_MEMO_LIMIT
}
from
"@/helpers/consts"
;
import
{
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
{
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useFilterWithUrlParams
from
"@/hooks/useFilterWithUrlParams"
;
import
useResponsiveWidth
from
"@/hooks/useResponsiveWidth"
;
import
useResponsiveWidth
from
"@/hooks/useResponsiveWidth"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
RowStatus
}
from
"@/types/proto/api/v2/common"
;
import
{
RowStatus
}
from
"@/types/proto/api/v2/common"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
const
Home
=
()
=>
{
const
Home
=
()
=>
{
const
t
=
useTranslate
();
const
t
=
useTranslate
();
const
location
=
useLocation
();
const
{
md
}
=
useResponsiveWidth
();
const
{
md
}
=
useResponsiveWidth
();
const
user
=
useCurrentUser
();
const
user
=
useCurrentUser
();
const
filterStore
=
useFilterStore
();
const
memoStore
=
useMemoStore
();
const
memoStore
=
useMemoStore
();
const
memoList
=
useMemoList
();
const
memoList
=
useMemoList
();
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
filterStore
.
state
;
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
useFilterWithUrlParams
()
;
const
sortedMemos
=
memoList
.
value
const
sortedMemos
=
memoList
.
value
.
filter
((
memo
)
=>
memo
.
rowStatus
===
RowStatus
.
ACTIVE
)
.
filter
((
memo
)
=>
memo
.
rowStatus
===
RowStatus
.
ACTIVE
)
.
sort
((
a
,
b
)
=>
getTimeStampByDate
(
b
.
displayTime
)
-
getTimeStampByDate
(
a
.
displayTime
))
.
sort
((
a
,
b
)
=>
getTimeStampByDate
(
b
.
displayTime
)
-
getTimeStampByDate
(
a
.
displayTime
))
.
sort
((
a
,
b
)
=>
Number
(
b
.
pinned
)
-
Number
(
a
.
pinned
));
.
sort
((
a
,
b
)
=>
Number
(
b
.
pinned
)
-
Number
(
a
.
pinned
));
useEffect
(()
=>
{
useEffect
(()
=>
{
const
urlParams
=
new
URLSearchParams
(
location
.
search
);
const
tag
=
urlParams
.
get
(
"tag"
);
const
text
=
urlParams
.
get
(
"text"
);
if
(
tag
)
{
filterStore
.
setTagFilter
(
tag
);
}
if
(
text
)
{
filterStore
.
setTextFilter
(
text
);
}
},
[]);
useEffect
(()
=>
{
const
urlParams
=
new
URLSearchParams
(
location
.
search
);
if
(
tagQuery
)
{
urlParams
.
set
(
"tag"
,
tagQuery
);
}
else
{
urlParams
.
delete
(
"tag"
);
}
if
(
textQuery
)
{
urlParams
.
set
(
"text"
,
textQuery
);
}
else
{
urlParams
.
delete
(
"text"
);
}
const
params
=
urlParams
.
toString
();
window
.
history
.
replaceState
({},
""
,
`
${
location
.
pathname
}${
params
?.
length
>
0
?
`?
${
params
}
`
:
""
}
`);
memoList
.
reset
();
memoList
.
reset
();
fetchMemos
();
fetchMemos
();
},
[
tagQuery
,
textQuery
]);
},
[
tagQuery
,
textQuery
]);
...
...
web/src/pages/Timeline.tsx
View file @
d7889d99
...
@@ -13,9 +13,9 @@ import { memoServiceClient } from "@/grpcweb";
...
@@ -13,9 +13,9 @@ import { memoServiceClient } from "@/grpcweb";
import
{
DAILY_TIMESTAMP
,
DEFAULT_MEMO_LIMIT
}
from
"@/helpers/consts"
;
import
{
DAILY_TIMESTAMP
,
DEFAULT_MEMO_LIMIT
}
from
"@/helpers/consts"
;
import
{
getNormalizedTimeString
,
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
{
getNormalizedTimeString
,
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
useFilterWithUrlParams
from
"@/hooks/useFilterWithUrlParams"
;
import
useResponsiveWidth
from
"@/hooks/useResponsiveWidth"
;
import
useResponsiveWidth
from
"@/hooks/useResponsiveWidth"
;
import
i18n
from
"@/i18n"
;
import
i18n
from
"@/i18n"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
...
@@ -50,12 +50,11 @@ const Timeline = () => {
...
@@ -50,12 +50,11 @@ const Timeline = () => {
const
user
=
useCurrentUser
();
const
user
=
useCurrentUser
();
const
memoStore
=
useMemoStore
();
const
memoStore
=
useMemoStore
();
const
memoList
=
useMemoList
();
const
memoList
=
useMemoList
();
const
filterStore
=
useFilterStore
();
const
[
activityStats
,
setActivityStats
]
=
useState
<
Record
<
string
,
number
>>
({});
const
[
activityStats
,
setActivityStats
]
=
useState
<
Record
<
string
,
number
>>
({});
const
[
selectedDay
,
setSelectedDay
]
=
useState
<
string
|
undefined
>
();
const
[
selectedDay
,
setSelectedDay
]
=
useState
<
string
|
undefined
>
();
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
filterStore
.
state
;
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
useFilterWithUrlParams
()
;
const
sortedMemos
=
memoList
.
value
.
sort
((
a
,
b
)
=>
getTimeStampByDate
(
b
.
displayTime
)
-
getTimeStampByDate
(
a
.
displayTime
));
const
sortedMemos
=
memoList
.
value
.
sort
((
a
,
b
)
=>
getTimeStampByDate
(
b
.
displayTime
)
-
getTimeStampByDate
(
a
.
displayTime
));
const
groupedByMonth
=
groupByMonth
(
activityStats
,
sortedMemos
);
const
groupedByMonth
=
groupByMonth
(
activityStats
,
sortedMemos
);
...
...
web/src/pages/UserProfile.tsx
View file @
d7889d99
import
{
Button
}
from
"@mui/joy"
;
import
{
Button
}
from
"@mui/joy"
;
import
{
useEffect
,
useState
}
from
"react"
;
import
{
useEffect
,
useState
}
from
"react"
;
import
{
toast
}
from
"react-hot-toast"
;
import
{
toast
}
from
"react-hot-toast"
;
import
{
use
Location
,
use
Params
}
from
"react-router-dom"
;
import
{
useParams
}
from
"react-router-dom"
;
import
Empty
from
"@/components/Empty"
;
import
Empty
from
"@/components/Empty"
;
import
Icon
from
"@/components/Icon"
;
import
Icon
from
"@/components/Icon"
;
import
MemoFilter
from
"@/components/MemoFilter"
;
import
MemoFilter
from
"@/components/MemoFilter"
;
...
@@ -10,41 +10,27 @@ import MobileHeader from "@/components/MobileHeader";
...
@@ -10,41 +10,27 @@ import MobileHeader from "@/components/MobileHeader";
import
UserAvatar
from
"@/components/UserAvatar"
;
import
UserAvatar
from
"@/components/UserAvatar"
;
import
{
DEFAULT_MEMO_LIMIT
}
from
"@/helpers/consts"
;
import
{
DEFAULT_MEMO_LIMIT
}
from
"@/helpers/consts"
;
import
{
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
{
getTimeStampByDate
}
from
"@/helpers/datetime"
;
import
useFilterWithUrlParams
from
"@/hooks/useFilterWithUrlParams"
;
import
useLoading
from
"@/hooks/useLoading"
;
import
useLoading
from
"@/hooks/useLoading"
;
import
{
useFilterStore
}
from
"@/store/module"
;
import
{
useMemoList
,
useMemoStore
,
useUserStore
}
from
"@/store/v1"
;
import
{
useMemoList
,
useMemoStore
,
useUserStore
}
from
"@/store/v1"
;
import
{
User
}
from
"@/types/proto/api/v2/user_service"
;
import
{
User
}
from
"@/types/proto/api/v2/user_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
const
UserProfile
=
()
=>
{
const
UserProfile
=
()
=>
{
const
t
=
useTranslate
();
const
t
=
useTranslate
();
const
location
=
useLocation
();
const
params
=
useParams
();
const
params
=
useParams
();
const
userStore
=
useUserStore
();
const
userStore
=
useUserStore
();
const
loadingState
=
useLoading
();
const
loadingState
=
useLoading
();
const
filterStore
=
useFilterStore
();
const
[
user
,
setUser
]
=
useState
<
User
>
();
const
[
user
,
setUser
]
=
useState
<
User
>
();
const
memoStore
=
useMemoStore
();
const
memoStore
=
useMemoStore
();
const
memoList
=
useMemoList
();
const
memoList
=
useMemoList
();
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isRequesting
,
setIsRequesting
]
=
useState
(
true
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
const
[
isComplete
,
setIsComplete
]
=
useState
(
false
);
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
filterStore
.
state
;
const
{
tag
:
tagQuery
,
text
:
textQuery
}
=
useFilterWithUrlParams
()
;
const
sortedMemos
=
memoList
.
value
const
sortedMemos
=
memoList
.
value
.
sort
((
a
,
b
)
=>
getTimeStampByDate
(
b
.
displayTime
)
-
getTimeStampByDate
(
a
.
displayTime
))
.
sort
((
a
,
b
)
=>
getTimeStampByDate
(
b
.
displayTime
)
-
getTimeStampByDate
(
a
.
displayTime
))
.
sort
((
a
,
b
)
=>
Number
(
b
.
pinned
)
-
Number
(
a
.
pinned
));
.
sort
((
a
,
b
)
=>
Number
(
b
.
pinned
)
-
Number
(
a
.
pinned
));
useEffect
(()
=>
{
const
urlParams
=
new
URLSearchParams
(
location
.
search
);
const
tag
=
urlParams
.
get
(
"tag"
);
const
text
=
urlParams
.
get
(
"text"
);
if
(
tag
)
{
filterStore
.
setTagFilter
(
tag
);
}
if
(
text
)
{
filterStore
.
setTextFilter
(
text
);
}
},
[]);
useEffect
(()
=>
{
useEffect
(()
=>
{
const
username
=
params
.
username
;
const
username
=
params
.
username
;
if
(
!
username
)
{
if
(
!
username
)
{
...
@@ -68,20 +54,6 @@ const UserProfile = () => {
...
@@ -68,20 +54,6 @@ const UserProfile = () => {
return
;
return
;
}
}
const
urlParams
=
new
URLSearchParams
(
location
.
search
);
if
(
tagQuery
)
{
urlParams
.
set
(
"tag"
,
tagQuery
);
}
else
{
urlParams
.
delete
(
"tag"
);
}
if
(
textQuery
)
{
urlParams
.
set
(
"text"
,
textQuery
);
}
else
{
urlParams
.
delete
(
"text"
);
}
const
params
=
urlParams
.
toString
();
window
.
history
.
replaceState
({},
""
,
`
${
location
.
pathname
}${
params
?.
length
>
0
?
`?
${
params
}
`
:
""
}
`);
memoList
.
reset
();
memoList
.
reset
();
fetchMemos
();
fetchMemos
();
},
[
user
,
tagQuery
,
textQuery
]);
},
[
user
,
tagQuery
,
textQuery
]);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment