|
18 | 18 | * SPDX-License-Identifier: Apache-2.0 |
19 | 19 | */ |
20 | 20 |
|
| 21 | +import _ from "lodash"; |
| 22 | +import { useMemo } from "react"; |
21 | 23 | import { FormattedDate, FormattedMessage } from "react-intl"; |
22 | 24 | import { graphql, useFragment } from "react-relay/hooks"; |
23 | 25 |
|
24 | 26 | import type { |
25 | | - DeploymentTargetsTable_CampaignTargetsFragment$data, |
26 | | - DeploymentTargetsTable_CampaignTargetsFragment$key, |
27 | | -} from "@/api/__generated__/DeploymentTargetsTable_CampaignTargetsFragment.graphql"; |
| 27 | + DeploymentTargetsTable_CampaignTargetEdgeFragment$data, |
| 28 | + DeploymentTargetsTable_CampaignTargetEdgeFragment$key, |
| 29 | +} from "@/api/__generated__/DeploymentTargetsTable_CampaignTargetEdgeFragment.graphql"; |
28 | 30 |
|
29 | | -import { createColumnHelper } from "@/components/Table"; |
30 | | -import InfiniteTable from "@/components/InfiniteTable"; |
31 | 31 | import DeploymentEventMessage from "@/components/DeploymentEventMessage"; |
32 | | -import DeploymentStateComponent from "@/components/DeploymentState"; |
33 | 32 | import DeploymentReadiness from "@/components/DeploymentReadiness"; |
| 33 | +import DeploymentStateComponent from "@/components/DeploymentState"; |
| 34 | +import InfiniteTable from "@/components/InfiniteTable"; |
| 35 | +import { createColumnHelper } from "@/components/Table"; |
34 | 36 | import { Link, Route } from "@/Navigation"; |
35 | 37 |
|
36 | 38 | // We use graphql fields below in columns configuration |
37 | 39 | /* eslint-disable relay/unused-fields */ |
38 | 40 | const CAMPAIGN_TARGETS_TABLE_FRAGMENT = graphql` |
39 | | - fragment DeploymentTargetsTable_CampaignTargetsFragment on CampaignTarget |
40 | | - @relay(plural: true) { |
41 | | - device { |
42 | | - id |
43 | | - name |
44 | | - } |
45 | | - retryCount |
46 | | - latestAttempt |
47 | | - completionTimestamp |
48 | | - deployment { |
49 | | - state |
50 | | - isReady |
51 | | - events( |
52 | | - filter: { type: { eq: ERROR } } |
53 | | - sort: [{ field: INSERTED_AT, order: DESC }] |
54 | | - first: 1 |
55 | | - ) { |
56 | | - edges { |
57 | | - node { |
58 | | - message |
59 | | - type |
60 | | - insertedAt |
61 | | - addInfo |
| 41 | + fragment DeploymentTargetsTable_CampaignTargetEdgeFragment on CampaignTargetConnection { |
| 42 | + edges { |
| 43 | + node { |
| 44 | + device { |
| 45 | + id |
| 46 | + name |
| 47 | + } |
| 48 | + retryCount |
| 49 | + latestAttempt |
| 50 | + completionTimestamp |
| 51 | + deployment { |
| 52 | + state |
| 53 | + isReady |
| 54 | + events( |
| 55 | + filter: { type: { eq: ERROR } } |
| 56 | + sort: [{ field: INSERTED_AT, order: DESC }] |
| 57 | + first: 1 |
| 58 | + ) { |
| 59 | + edges { |
| 60 | + node { |
| 61 | + message |
| 62 | + type |
| 63 | + insertedAt |
| 64 | + addInfo |
| 65 | + } |
| 66 | + } |
62 | 67 | } |
63 | 68 | } |
64 | 69 | } |
65 | 70 | } |
66 | 71 | } |
67 | 72 | `; |
68 | 73 |
|
69 | | -type TableRecord = DeploymentTargetsTable_CampaignTargetsFragment$data[number]; |
| 74 | +type TableRecord = NonNullable< |
| 75 | + NonNullable<DeploymentTargetsTable_CampaignTargetEdgeFragment$data>["edges"] |
| 76 | +>[number]["node"]; |
70 | 77 | const columnIds = [ |
71 | 78 | "deviceName", |
72 | 79 | "state", |
@@ -219,31 +226,34 @@ const columns = [ |
219 | 226 | type Props = { |
220 | 227 | className?: string; |
221 | 228 | hiddenColumns?: ColumnId[]; |
222 | | - campaignTargetsRef: DeploymentTargetsTable_CampaignTargetsFragment$key; |
223 | | - isLoadingNext: boolean; |
224 | | - hasNext: boolean; |
225 | | - loadNextCampaignTargets: () => void; |
| 229 | + campaignTargetsRef: DeploymentTargetsTable_CampaignTargetEdgeFragment$key; |
| 230 | + loading?: boolean; |
| 231 | + onLoadMore?: () => void; |
226 | 232 | }; |
227 | 233 |
|
228 | 234 | const DeploymentTargetsTable = ({ |
229 | 235 | className, |
230 | 236 | campaignTargetsRef, |
231 | 237 | hiddenColumns = [], |
232 | | - isLoadingNext, |
233 | | - hasNext, |
234 | | - loadNextCampaignTargets, |
| 238 | + loading = false, |
| 239 | + onLoadMore, |
235 | 240 | }: Props) => { |
236 | | - const campaignTargets = useFragment( |
| 241 | + const campaignTargetsFragment = useFragment( |
237 | 242 | CAMPAIGN_TARGETS_TABLE_FRAGMENT, |
238 | 243 | campaignTargetsRef, |
239 | 244 | ); |
| 245 | + |
| 246 | + const campaignTargets = useMemo<TableRecord[]>(() => { |
| 247 | + return _.compact(campaignTargetsFragment?.edges?.map((e) => e?.node)) ?? []; |
| 248 | + }, [campaignTargetsFragment]); |
| 249 | + |
240 | 250 | return ( |
241 | 251 | <InfiniteTable |
242 | 252 | className={className} |
243 | 253 | columns={columns} |
244 | | - data={[...campaignTargets]} |
245 | | - loading={isLoadingNext} |
246 | | - onLoadMore={hasNext ? loadNextCampaignTargets : undefined} |
| 254 | + data={campaignTargets} |
| 255 | + loading={loading} |
| 256 | + onLoadMore={onLoadMore} |
247 | 257 | hiddenColumns={hiddenColumns} |
248 | 258 | hideSearch |
249 | 259 | /> |
|
0 commit comments