forked from parse-community/parse-dashboard
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAggregationPanel.js
More file actions
84 lines (78 loc) · 2.65 KB
/
AggregationPanel.js
File metadata and controls
84 lines (78 loc) · 2.65 KB
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
import React, { useEffect, useMemo } from 'react';
import LoaderDots from 'components/LoaderDots/LoaderDots.react';
import {
TextElement,
KeyValueElement,
TableElement,
ImageElement,
VideoElement,
AudioElement,
ButtonElement,
} from './AggregationPanelComponents';
import styles from './AggregationPanel.scss';
const AggregationPanel = ({
data,
isLoadingCloudFunction,
showAggregatedData,
setErrorAggregatedData,
errorAggregatedData,
showNote,
setSelectedObjectId,
selectedObjectId
}) => {
useEffect(() => {
if (Object.keys(errorAggregatedData).length !== 0) {
setSelectedObjectId(null);
setErrorAggregatedData({});
}
}, [errorAggregatedData, setSelectedObjectId, setErrorAggregatedData]);
const isLoading = useMemo(() =>
selectedObjectId && isLoadingCloudFunction && showAggregatedData,
[selectedObjectId, isLoadingCloudFunction, showAggregatedData]
);
const shouldShowAggregatedData = useMemo(() =>
selectedObjectId && showAggregatedData && Object.keys(data).length !== 0 && Object.keys(errorAggregatedData).length === 0, [selectedObjectId, showAggregatedData, data, errorAggregatedData]
);
return (
<>
{isLoading ? (
<div className={styles.center}>
<LoaderDots />
</div>
) : shouldShowAggregatedData ? (
data.panel.segments.map((segment, index) => (
<div key={index}>
<h2 className={styles.heading}>{segment.title}</h2>
<div className={styles.segmentItems}>
{segment.items.map((item, idx) => {
switch (item.type) {
case 'text':
return <TextElement key={idx} text={item.text} />;
case 'keyValue':
return <KeyValueElement key={idx} item={item} />;
case 'table':
return <TableElement key={idx} columns={item.columns} rows={item.rows} />;
case 'image':
return <ImageElement key={idx} url={item.url} />;
case 'video':
return <VideoElement key={idx} url={item.url} />;
case 'audio':
return <AudioElement key={idx} url={item.url} />;
case 'button':
return <ButtonElement key={idx} item={item} showNote={showNote} />;
default:
return null;
}
})}
</div>
</div>
))
) : (
<div className={styles.loading}>
No object selected. Select an object to see aggregated data.
</div>
)}
</>
);
};
export default AggregationPanel;