-
Notifications
You must be signed in to change notification settings - Fork 253
/
Copy pathScheduleList.tsx
86 lines (81 loc) · 2.2 KB
/
ScheduleList.tsx
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import React, { Suspense, useState } from 'react'
import { gql, useQuery } from 'urql'
import ScheduleCreateDialog from './ScheduleCreateDialog'
import { useURLParam } from '../actions'
import { ScheduleConnection } from '../../schema'
import ListPageControls from '../lists/ListPageControls'
import Search from '../util/Search'
import FlatList from '../lists/FlatList'
import { FavoriteIcon } from '../util/SetFavoriteButton'
const query = gql`
query schedulesQuery($input: ScheduleSearchOptions) {
schedules(input: $input) {
nodes {
id
name
description
isFavorite
}
pageInfo {
hasNextPage
endCursor
}
}
}
`
const context = { suspense: false }
export default function ScheduleList(): JSX.Element {
const [search] = useURLParam<string>('search', '')
const [create, setCreate] = useState(false)
const [cursor, setCursor] = useState('')
const inputVars = {
favoritesFirst: true,
search,
after: cursor,
}
const [q] = useQuery<{ schedules: ScheduleConnection }>({
query,
variables: { input: inputVars },
context,
})
const nextCursor = q.data?.schedules.pageInfo.hasNextPage
? q.data?.schedules.pageInfo.endCursor
: ''
// cache the next page
useQuery({
query,
variables: { input: { ...inputVars, after: nextCursor } },
context,
pause: !nextCursor,
})
return (
<React.Fragment>
<Suspense>
{create && <ScheduleCreateDialog onClose={() => setCreate(false)} />}
</Suspense>
<ListPageControls
createLabel='Schedule'
nextCursor={nextCursor}
onCursorChange={setCursor}
loading={q.fetching}
onCreateClick={() => setCreate(true)}
slots={{
search: <Search />,
list: (
<FlatList
emptyMessage='No results'
items={
q.data?.schedules.nodes.map((u) => ({
title: u.name,
subText: u.description,
url: u.id,
secondaryAction: u.isFavorite ? <FavoriteIcon /> : undefined,
})) || []
}
/>
),
}}
/>
</React.Fragment>
)
}