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
104948ae
Commit
104948ae
authored
Nov 20, 2024
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: set pull to refresh with screen size
parent
7b70c203
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
46 additions
and
35 deletions
+46
-35
PagedMemoList.tsx
web/src/components/PagedMemoList/PagedMemoList.tsx
+46
-35
No files found.
web/src/components/PagedMemoList/PagedMemoList.tsx
View file @
104948ae
import
{
Button
}
from
"@usememos/mui"
;
import
{
Button
}
from
"@usememos/mui"
;
import
{
ArrowDownIcon
,
LoaderIcon
}
from
"lucide-react"
;
import
{
ArrowDownIcon
,
LoaderIcon
}
from
"lucide-react"
;
import
{
useEffect
,
useState
}
from
"react"
;
import
{
use
Callback
,
use
Effect
,
useState
}
from
"react"
;
import
PullToRefresh
from
"react-simple-pull-to-refresh"
;
import
PullToRefresh
from
"react-simple-pull-to-refresh"
;
import
{
DEFAULT_LIST_MEMOS_PAGE_SIZE
}
from
"@/helpers/consts"
;
import
{
DEFAULT_LIST_MEMOS_PAGE_SIZE
}
from
"@/helpers/consts"
;
import
useResponsiveWidth
from
"@/hooks/useResponsiveWidth"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
Memo
}
from
"@/types/proto/api/v1/memo_service"
;
import
{
Memo
}
from
"@/types/proto/api/v1/memo_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
...
@@ -22,6 +23,7 @@ interface State {
...
@@ -22,6 +23,7 @@ interface State {
const
PagedMemoList
=
(
props
:
Props
)
=>
{
const
PagedMemoList
=
(
props
:
Props
)
=>
{
const
t
=
useTranslate
();
const
t
=
useTranslate
();
const
{
md
}
=
useResponsiveWidth
();
const
memoStore
=
useMemoStore
();
const
memoStore
=
useMemoStore
();
const
memoList
=
useMemoList
();
const
memoList
=
useMemoList
();
const
[
state
,
setState
]
=
useState
<
State
>
({
const
[
state
,
setState
]
=
useState
<
State
>
({
...
@@ -29,17 +31,9 @@ const PagedMemoList = (props: Props) => {
...
@@ -29,17 +31,9 @@ const PagedMemoList = (props: Props) => {
nextPageToken
:
""
,
nextPageToken
:
""
,
});
});
const
sortedMemoList
=
props
.
listSort
?
props
.
listSort
(
memoList
.
value
)
:
memoList
.
value
;
const
sortedMemoList
=
props
.
listSort
?
props
.
listSort
(
memoList
.
value
)
:
memoList
.
value
;
const
handleRefresh
=
async
()
=>
{
memoList
.
reset
();
setState
((
state
)
=>
({
...
state
,
nextPageToken
:
""
}));
fetchMoreMemos
(
""
);
};
const
setIsRequesting
=
(
isRequesting
:
boolean
)
=>
{
setState
((
state
)
=>
({
...
state
,
isRequesting
}));
};
const
fetchMoreMemos
=
async
(
nextPageToken
:
string
)
=>
{
const
fetchMoreMemos
=
async
(
nextPageToken
:
string
)
=>
{
set
IsRequesting
(
true
);
set
State
((
state
)
=>
({
...
state
,
isRequesting
:
true
})
);
const
response
=
await
memoStore
.
fetchMemos
({
const
response
=
await
memoStore
.
fetchMemos
({
filter
:
props
.
filter
||
""
,
filter
:
props
.
filter
||
""
,
pageSize
:
props
.
pageSize
||
DEFAULT_LIST_MEMOS_PAGE_SIZE
,
pageSize
:
props
.
pageSize
||
DEFAULT_LIST_MEMOS_PAGE_SIZE
,
...
@@ -51,44 +45,61 @@ const PagedMemoList = (props: Props) => {
...
@@ -51,44 +45,61 @@ const PagedMemoList = (props: Props) => {
}));
}));
};
};
useEffect
(
()
=>
{
const
refreshList
=
useCallback
(
async
()
=>
{
memoList
.
reset
();
memoList
.
reset
();
setState
((
state
)
=>
({
...
state
,
nextPageToken
:
""
}));
setState
((
state
)
=>
({
...
state
,
nextPageToken
:
""
}));
fetchMoreMemos
(
""
);
fetchMoreMemos
(
""
);
},
[]);
useEffect
(()
=>
{
refreshList
();
},
[
props
.
filter
,
props
.
pageSize
]);
},
[
props
.
filter
,
props
.
pageSize
]);
const
children
=
(
<>
{
sortedMemoList
.
map
((
memo
)
=>
props
.
renderer
(
memo
))
}
{
state
.
isRequesting
&&
(
<
div
className=
"w-full flex flex-row justify-center items-center my-4"
>
<
LoaderIcon
className=
"animate-spin text-zinc-500"
/>
</
div
>
)
}
{
!
state
.
isRequesting
&&
state
.
nextPageToken
&&
(
<
div
className=
"w-full flex flex-row justify-center items-center my-4"
>
<
Button
variant=
"plain"
onClick=
{
()
=>
fetchMoreMemos
(
state
.
nextPageToken
)
}
>
{
t
(
"memo.load-more"
)
}
<
ArrowDownIcon
className=
"ml-2 w-4 h-auto"
/>
</
Button
>
</
div
>
)
}
{
!
state
.
isRequesting
&&
!
state
.
nextPageToken
&&
sortedMemoList
.
length
===
0
&&
(
<
div
className=
"w-full mt-12 mb-8 flex flex-col justify-center items-center italic"
>
<
Empty
/>
<
p
className=
"mt-2 text-gray-600 dark:text-gray-400"
>
{
t
(
"message.no-data"
)
}
</
p
>
</
div
>
)
}
</>
);
// In case of md screen, we don't need pull to refresh.
if
(
md
)
{
return
children
;
}
return
(
return
(
<
PullToRefresh
<
PullToRefresh
onRefresh=
{
handleRefresh
}
onRefresh=
{
()
=>
refreshList
()
}
pullingContent=
{
<></>
}
pullingContent=
{
<
div
className=
"w-full flex flex-row justify-center items-center my-4"
>
<
LoaderIcon
className=
"opacity-60"
/>
</
div
>
}
refreshingContent=
{
refreshingContent=
{
<
div
className=
"w-full flex flex-row justify-center items-center my-4"
>
<
div
className=
"w-full flex flex-row justify-center items-center my-4"
>
<
LoaderIcon
className=
"animate-spin"
/>
<
LoaderIcon
className=
"animate-spin"
/>
</
div
>
</
div
>
}
}
>
>
<>
{
children
}
{
sortedMemoList
.
map
((
memo
)
=>
props
.
renderer
(
memo
))
}
{
state
.
isRequesting
&&
(
<
div
className=
"w-full flex flex-row justify-center items-center my-4"
>
<
LoaderIcon
className=
"animate-spin text-zinc-500"
/>
</
div
>
)
}
{
!
state
.
isRequesting
&&
state
.
nextPageToken
&&
(
<
div
className=
"w-full flex flex-row justify-center items-center my-4"
>
<
Button
variant=
"plain"
onClick=
{
()
=>
fetchMoreMemos
(
state
.
nextPageToken
)
}
>
{
t
(
"memo.load-more"
)
}
<
ArrowDownIcon
className=
"ml-2 w-4 h-auto"
/>
</
Button
>
</
div
>
)
}
{
!
state
.
isRequesting
&&
!
state
.
nextPageToken
&&
sortedMemoList
.
length
===
0
&&
(
<
div
className=
"w-full mt-12 mb-8 flex flex-col justify-center items-center italic"
>
<
Empty
/>
<
p
className=
"mt-2 text-gray-600 dark:text-gray-400"
>
{
t
(
"message.no-data"
)
}
</
p
>
</
div
>
)
}
</>
</
PullToRefresh
>
</
PullToRefresh
>
);
);
};
};
...
...
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