@bashem/rn-charts 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +35 -0
  3. package/lib/module/index.js +14 -0
  4. package/lib/module/index.js.map +1 -0
  5. package/lib/module/package.json +1 -0
  6. package/lib/module/skia/AreaChart/AreaChart.js +122 -0
  7. package/lib/module/skia/AreaChart/AreaChart.js.map +1 -0
  8. package/lib/module/skia/AreaChart/useAreaChart.js +141 -0
  9. package/lib/module/skia/AreaChart/useAreaChart.js.map +1 -0
  10. package/lib/module/skia/BarChart/BarChart.js +127 -0
  11. package/lib/module/skia/BarChart/BarChart.js.map +1 -0
  12. package/lib/module/skia/BarChart/useBarChart.js +172 -0
  13. package/lib/module/skia/BarChart/useBarChart.js.map +1 -0
  14. package/lib/module/skia/Common/VerticalLabel.js +73 -0
  15. package/lib/module/skia/Common/VerticalLabel.js.map +1 -0
  16. package/lib/module/skia/HeatMap/HeatMap.js +76 -0
  17. package/lib/module/skia/HeatMap/HeatMap.js.map +1 -0
  18. package/lib/module/skia/HeatMap/useHeatMap.js +139 -0
  19. package/lib/module/skia/HeatMap/useHeatMap.js.map +1 -0
  20. package/lib/module/skia/PieChart/PieChart.js +96 -0
  21. package/lib/module/skia/PieChart/PieChart.js.map +1 -0
  22. package/lib/module/skia/PieChart/usePieChart.js +103 -0
  23. package/lib/module/skia/PieChart/usePieChart.js.map +1 -0
  24. package/lib/module/skia/Popup.js +58 -0
  25. package/lib/module/skia/Popup.js.map +1 -0
  26. package/lib/module/skia/Progress/LinearProgress.js +69 -0
  27. package/lib/module/skia/Progress/LinearProgress.js.map +1 -0
  28. package/lib/module/skia/Progress/SemiCircleProgress.js +70 -0
  29. package/lib/module/skia/Progress/SemiCircleProgress.js.map +1 -0
  30. package/lib/module/skia/RadarChart/RadarChart.js +98 -0
  31. package/lib/module/skia/RadarChart/RadarChart.js.map +1 -0
  32. package/lib/module/skia/RadarChart/useRadarChart.js +164 -0
  33. package/lib/module/skia/RadarChart/useRadarChart.js.map +1 -0
  34. package/lib/module/skia/common.js +65 -0
  35. package/lib/module/skia/common.js.map +1 -0
  36. package/lib/module/util/colors.js +182 -0
  37. package/lib/module/util/colors.js.map +1 -0
  38. package/lib/module/util/util.js +71 -0
  39. package/lib/module/util/util.js.map +1 -0
  40. package/lib/typescript/index.d.ts +2 -0
  41. package/lib/typescript/index.d.ts.map +1 -0
  42. package/lib/typescript/package.json +1 -0
  43. package/lib/typescript/src/index.d.ts +10 -0
  44. package/lib/typescript/src/index.d.ts.map +1 -0
  45. package/lib/typescript/src/skia/AreaChart/AreaChart.d.ts +25 -0
  46. package/lib/typescript/src/skia/AreaChart/AreaChart.d.ts.map +1 -0
  47. package/lib/typescript/src/skia/AreaChart/useAreaChart.d.ts +47 -0
  48. package/lib/typescript/src/skia/AreaChart/useAreaChart.d.ts.map +1 -0
  49. package/lib/typescript/src/skia/BarChart/BarChart.d.ts +30 -0
  50. package/lib/typescript/src/skia/BarChart/BarChart.d.ts.map +1 -0
  51. package/lib/typescript/src/skia/BarChart/useBarChart.d.ts +41 -0
  52. package/lib/typescript/src/skia/BarChart/useBarChart.d.ts.map +1 -0
  53. package/lib/typescript/src/skia/Common/VerticalLabel.d.ts +17 -0
  54. package/lib/typescript/src/skia/Common/VerticalLabel.d.ts.map +1 -0
  55. package/lib/typescript/src/skia/HeatMap/HeatMap.d.ts +33 -0
  56. package/lib/typescript/src/skia/HeatMap/HeatMap.d.ts.map +1 -0
  57. package/lib/typescript/src/skia/HeatMap/useHeatMap.d.ts +25 -0
  58. package/lib/typescript/src/skia/HeatMap/useHeatMap.d.ts.map +1 -0
  59. package/lib/typescript/src/skia/PieChart/PieChart.d.ts +27 -0
  60. package/lib/typescript/src/skia/PieChart/PieChart.d.ts.map +1 -0
  61. package/lib/typescript/src/skia/PieChart/usePieChart.d.ts +13 -0
  62. package/lib/typescript/src/skia/PieChart/usePieChart.d.ts.map +1 -0
  63. package/lib/typescript/src/skia/Popup.d.ts +26 -0
  64. package/lib/typescript/src/skia/Popup.d.ts.map +1 -0
  65. package/lib/typescript/src/skia/Progress/LinearProgress.d.ts +18 -0
  66. package/lib/typescript/src/skia/Progress/LinearProgress.d.ts.map +1 -0
  67. package/lib/typescript/src/skia/Progress/SemiCircleProgress.d.ts +18 -0
  68. package/lib/typescript/src/skia/Progress/SemiCircleProgress.d.ts.map +1 -0
  69. package/lib/typescript/src/skia/RadarChart/RadarChart.d.ts +27 -0
  70. package/lib/typescript/src/skia/RadarChart/RadarChart.d.ts.map +1 -0
  71. package/lib/typescript/src/skia/RadarChart/useRadarChart.d.ts +41 -0
  72. package/lib/typescript/src/skia/RadarChart/useRadarChart.d.ts.map +1 -0
  73. package/lib/typescript/src/skia/common.d.ts +31 -0
  74. package/lib/typescript/src/skia/common.d.ts.map +1 -0
  75. package/lib/typescript/src/util/colors.d.ts +4 -0
  76. package/lib/typescript/src/util/colors.d.ts.map +1 -0
  77. package/lib/typescript/src/util/util.d.ts +33 -0
  78. package/lib/typescript/src/util/util.d.ts.map +1 -0
  79. package/package.json +172 -0
  80. package/src/index.tsx +12 -0
  81. package/src/skia/AreaChart/AreaChart.tsx +140 -0
  82. package/src/skia/AreaChart/useAreaChart.ts +180 -0
  83. package/src/skia/BarChart/BarChart.tsx +190 -0
  84. package/src/skia/BarChart/useBarChart.ts +210 -0
  85. package/src/skia/Common/VerticalLabel.tsx +91 -0
  86. package/src/skia/HeatMap/HeatMap.tsx +106 -0
  87. package/src/skia/HeatMap/useHeatMap.ts +175 -0
  88. package/src/skia/PieChart/PieChart.tsx +114 -0
  89. package/src/skia/PieChart/usePieChart.ts +156 -0
  90. package/src/skia/Popup.tsx +125 -0
  91. package/src/skia/Progress/LinearProgress.tsx +84 -0
  92. package/src/skia/Progress/SemiCircleProgress.tsx +82 -0
  93. package/src/skia/RadarChart/RadarChart.tsx +159 -0
  94. package/src/skia/RadarChart/useRadarChart.ts +208 -0
  95. package/src/skia/common.ts +82 -0
  96. package/src/util/colors.ts +186 -0
  97. package/src/util/util.ts +89 -0
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Bashem
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # rn-simple-charts
2
+
3
+ Experimental Charts Library
4
+
5
+ ## Installation
6
+
7
+
8
+ ```sh
9
+ npm install rn-simple-charts
10
+ ```
11
+
12
+
13
+ ## Usage
14
+
15
+
16
+ ```js
17
+ import { multiply } from 'rn-simple-charts';
18
+
19
+ // ...
20
+
21
+ const result = await multiply(3, 7);
22
+ ```
23
+
24
+
25
+ ## Contributing
26
+
27
+ See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow.
28
+
29
+ ## License
30
+
31
+ MIT
32
+
33
+ ---
34
+
35
+ Made with [create-react-native-library](https://github.com/callstack/react-native-builder-bob)
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ export function multiply(a, b) {
4
+ return a * b;
5
+ }
6
+ export { default as BarChart } from "./skia/BarChart/BarChart.js";
7
+ export * from "./skia/BarChart/BarChart.js";
8
+ export * from "./skia/PieChart/PieChart.js";
9
+ export * from "./skia/AreaChart/AreaChart.js";
10
+ export * from "./skia/Progress/LinearProgress.js";
11
+ export * from "./skia/RadarChart/RadarChart.js";
12
+ export { default as PieChart } from "./skia/PieChart/PieChart.js";
13
+ export { default as AreaChart } from "./skia/AreaChart/AreaChart.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["multiply","a","b","default","BarChart","PieChart","AreaChart"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAO,SAASA,QAAQA,CAACC,CAAS,EAAEC,CAAS,EAAU;EACrD,OAAOD,CAAC,GAAGC,CAAC;AACd;AAEA,SAASC,OAAO,IAAIC,QAAQ,QAAQ,6BAA0B;AAC9D,cAAc,6BAA0B;AACxC,cAAc,6BAA0B;AACxC,cAAc,+BAA4B;AAC1C,cAAc,mCAAgC;AAC9C,cAAc,iCAA8B;AAC5C,SAASD,OAAO,IAAIE,QAAQ,QAAQ,6BAA0B;AAC9D,SAASF,OAAO,IAAIG,SAAS,QAAQ,+BAA4B","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ // AreaChart.tsx
4
+ import { Canvas, Circle, Group, Path, Text } from '@shopify/react-native-skia';
5
+ import VerticalLabel from "../Common/VerticalLabel.js";
6
+ import { View } from 'react-native';
7
+ import useAreaChart from "./useAreaChart.js";
8
+ import { useState } from 'react';
9
+ import { lighten } from "../../util/colors.js";
10
+ import Popup from "../Popup.js";
11
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ function AreaChart(props) {
13
+ const {
14
+ minValue,
15
+ maxValue,
16
+ canvasHeight,
17
+ areaCanvasHeight,
18
+ labelWidth,
19
+ chartWidth,
20
+ paths,
21
+ xLabelsData,
22
+ paddingLeft,
23
+ paddingTop,
24
+ paddingHorizontal,
25
+ font,
26
+ touchLine,
27
+ touchHandler
28
+ } = useAreaChart(props);
29
+ const {
30
+ style,
31
+ popupStyle
32
+ } = props;
33
+ const [viewOffset, setViewOffset] = useState({
34
+ x: 0,
35
+ y: 0
36
+ });
37
+ console.log('AreaChart render', {
38
+ touchLine
39
+ });
40
+ return /*#__PURE__*/_jsxs(View, {
41
+ style: [style, {
42
+ flexDirection: 'row'
43
+ }],
44
+ ref: view => {
45
+ view?.measureInWindow((fx, fy) => {
46
+ setViewOffset(prev => {
47
+ if (prev.x === fx && prev.y === fy) {
48
+ return prev;
49
+ }
50
+ return {
51
+ x: fx,
52
+ y: fy
53
+ };
54
+ });
55
+ });
56
+ },
57
+ children: [/*#__PURE__*/_jsx(VerticalLabel, {
58
+ minValue: minValue,
59
+ maxValue: maxValue,
60
+ styles: {
61
+ height: areaCanvasHeight,
62
+ width: labelWidth,
63
+ fontSize: style?.fontSize
64
+ },
65
+ labelCount: 5
66
+ }), /*#__PURE__*/_jsxs(Canvas, {
67
+ style: {
68
+ width: chartWidth,
69
+ height: canvasHeight
70
+ },
71
+ onTouchStart: event => touchHandler(event.nativeEvent.locationX, event.nativeEvent.locationY),
72
+ children: [paths.map(({
73
+ path,
74
+ points,
75
+ color
76
+ }, index) => {
77
+ return /*#__PURE__*/_jsxs(Group, {
78
+ children: [/*#__PURE__*/_jsx(Path, {
79
+ path: path,
80
+ color: color
81
+ }), style?.showPoints && color && points.map(points => /*#__PURE__*/_jsx(Circle, {
82
+ cx: points.x,
83
+ cy: points.y,
84
+ r: style?.pointRadius ?? 3,
85
+ color: lighten(color, style?.lightenPointsBy ?? 0.3)
86
+ }, `${points.x}-${points.y}`))]
87
+ }, index);
88
+ }), xLabelsData.map(({
89
+ label,
90
+ xPosition
91
+ }, index) => {
92
+ return /*#__PURE__*/_jsx(Text, {
93
+ x: xPosition,
94
+ y: canvasHeight,
95
+ text: label,
96
+ font: font,
97
+ color: 'white'
98
+ }, index);
99
+ })]
100
+ }), touchLine && /*#__PURE__*/_jsx(Popup, {
101
+ popupData: touchLine.y.map((y, index) => ({
102
+ x: touchLine.x,
103
+ y: y,
104
+ data: {
105
+ rowIndex: index,
106
+ colIndex: touchLine.col,
107
+ value: touchLine.values[index]
108
+ }
109
+ })),
110
+ totalWidth: chartWidth + labelWidth + paddingHorizontal,
111
+ totalHeight: canvasHeight,
112
+ touchHandler: (x, y) => {
113
+ console.log('Popup touchHandler', x, y);
114
+ touchHandler(x - labelWidth - paddingLeft, y - paddingTop);
115
+ },
116
+ viewOffset: viewOffset,
117
+ popupStyle: popupStyle
118
+ })]
119
+ });
120
+ }
121
+ export default AreaChart;
122
+ //# sourceMappingURL=AreaChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Canvas","Circle","Group","Path","Text","VerticalLabel","View","useAreaChart","useState","lighten","Popup","jsx","_jsx","jsxs","_jsxs","AreaChart","props","minValue","maxValue","canvasHeight","areaCanvasHeight","labelWidth","chartWidth","paths","xLabelsData","paddingLeft","paddingTop","paddingHorizontal","font","touchLine","touchHandler","style","popupStyle","viewOffset","setViewOffset","x","y","console","log","flexDirection","ref","view","measureInWindow","fx","fy","prev","children","styles","height","width","fontSize","labelCount","onTouchStart","event","nativeEvent","locationX","locationY","map","path","points","color","index","showPoints","cx","cy","r","pointRadius","lightenPointsBy","label","xPosition","text","popupData","data","rowIndex","colIndex","col","value","values","totalWidth","totalHeight"],"sourceRoot":"../../../../src","sources":["skia/AreaChart/AreaChart.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+
3
+ import { Skia } from "@shopify/react-native-skia";
4
+ import { useMemo, useState } from "react";
5
+ import { getCommonStyleFont, getPaddings } from "../common.js";
6
+ import { isDefined } from "../../util/util.js";
7
+ function useAreaChart({
8
+ data,
9
+ xLabels,
10
+ maxValue,
11
+ minValue,
12
+ style
13
+ }) {
14
+ const height = style?.height ?? 200;
15
+ const width = style?.width ?? 200;
16
+ const {
17
+ paddingLeft,
18
+ paddingTop,
19
+ paddingHorizontal,
20
+ paddingVertical
21
+ } = getPaddings(style);
22
+ const canvasHeight = height - paddingVertical;
23
+ const labelWidth = 30;
24
+ const chartWidth = width - labelWidth - paddingHorizontal;
25
+ const xLabelHeight = xLabels && xLabels.length > 0 ? (style?.fontSize ?? 12) + 5 : 0;
26
+ const areaCanvasHeight = canvasHeight - xLabelHeight;
27
+ const {
28
+ font
29
+ } = getCommonStyleFont(style);
30
+ const {
31
+ maxValueCalculated,
32
+ minValueCalculated
33
+ } = useMemo(() => {
34
+ if (isDefined(maxValue) && isDefined(minValue)) {
35
+ return {
36
+ maxValueCalculated: maxValue,
37
+ minValueCalculated: minValue
38
+ };
39
+ }
40
+ let maxValueCalculated = Number.MIN_VALUE;
41
+ let minValueCalculated = Number.MAX_VALUE;
42
+ data.forEach(datum => {
43
+ datum.values.forEach(value => {
44
+ if (value > maxValueCalculated && !isDefined(maxValue)) {
45
+ maxValueCalculated = value;
46
+ }
47
+ if (value < minValueCalculated && !isDefined(minValue)) {
48
+ minValueCalculated = value;
49
+ }
50
+ });
51
+ });
52
+ return {
53
+ maxValueCalculated: maxValueCalculated + 10,
54
+ minValueCalculated
55
+ };
56
+ }, [data]);
57
+ const paths = useMemo(() => {
58
+ const pathData = [];
59
+ for (let datum of data) {
60
+ const areaData = datum.values;
61
+ const stepX = chartWidth / areaData.length;
62
+ const p = Skia.Path.Make();
63
+ p.moveTo(0, areaCanvasHeight);
64
+ const points = [];
65
+ const values = [];
66
+ areaData.forEach((y, i) => {
67
+ const xPos = i * stepX;
68
+ const yPos = Math.max(0, areaCanvasHeight - (y - minValueCalculated) / (maxValueCalculated - minValueCalculated) * areaCanvasHeight);
69
+ points.push({
70
+ x: xPos,
71
+ y: yPos
72
+ });
73
+ values.push(y);
74
+ p.lineTo(xPos, yPos);
75
+ });
76
+ p.lineTo(chartWidth, areaCanvasHeight);
77
+ p.close();
78
+ pathData.push({
79
+ path: p,
80
+ points,
81
+ values,
82
+ color: datum.color,
83
+ label: datum.label
84
+ });
85
+ }
86
+ return pathData;
87
+ }, [data, chartWidth, maxValueCalculated, minValueCalculated]);
88
+ const xLabelsData = useMemo(() => {
89
+ if (!xLabels || xLabels.length === 0) {
90
+ return [];
91
+ }
92
+ const stepX = chartWidth / xLabels.length;
93
+ const labels = xLabels.map((label, i) => {
94
+ return {
95
+ label,
96
+ xPosition: i * stepX + font.getSize()
97
+ };
98
+ });
99
+ return labels;
100
+ }, [xLabels, chartWidth]);
101
+ const [touchLine, setTouchLine] = useState(undefined);
102
+ const touchHandler = (touchedX, touchedY) => {
103
+ if (data.length === 0 || (data[0]?.values.length ?? 0) === 0 || touchedX < 0 || touchedY < 0 || touchedX >= chartWidth || touchedY >= areaCanvasHeight) {
104
+ setTouchLine(undefined);
105
+ return;
106
+ }
107
+ const stepX = chartWidth / data[0].values.length;
108
+ const xIndex = Math.round(touchedX / stepX);
109
+ if (xIndex < 0 || xIndex >= data[0].values.length) {
110
+ setTouchLine(undefined);
111
+ return;
112
+ }
113
+ const yValues = paths.map(path => path.points[xIndex].y);
114
+ const values = paths.map(path => path.values[xIndex]);
115
+ setTouchLine({
116
+ col: xIndex,
117
+ x: xIndex * stepX,
118
+ y: yValues,
119
+ values
120
+ });
121
+ };
122
+ return {
123
+ paths,
124
+ chartWidth,
125
+ canvasHeight,
126
+ paddingLeft,
127
+ paddingTop,
128
+ paddingHorizontal,
129
+ areaCanvasHeight,
130
+ labelWidth,
131
+ maxValue: maxValueCalculated,
132
+ minValue: minValueCalculated,
133
+ xLabelsData,
134
+ xLabelHeight,
135
+ font,
136
+ touchHandler,
137
+ touchLine
138
+ };
139
+ }
140
+ export default useAreaChart;
141
+ //# sourceMappingURL=useAreaChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Skia","useMemo","useState","getCommonStyleFont","getPaddings","isDefined","useAreaChart","data","xLabels","maxValue","minValue","style","height","width","paddingLeft","paddingTop","paddingHorizontal","paddingVertical","canvasHeight","labelWidth","chartWidth","xLabelHeight","length","fontSize","areaCanvasHeight","font","maxValueCalculated","minValueCalculated","Number","MIN_VALUE","MAX_VALUE","forEach","datum","values","value","paths","pathData","areaData","stepX","p","Path","Make","moveTo","points","y","i","xPos","yPos","Math","max","push","x","lineTo","close","path","color","label","xLabelsData","labels","map","xPosition","getSize","touchLine","setTouchLine","undefined","touchHandler","touchedX","touchedY","xIndex","round","yValues","col"],"sourceRoot":"../../../../src","sources":["skia/AreaChart/useAreaChart.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+
3
+ import { Fragment, useState } from 'react';
4
+ import { View } from 'react-native';
5
+ import { GestureDetector, Gesture, GestureHandlerRootView } from 'react-native-gesture-handler';
6
+ import { Canvas, Rect, Text, vec, Line } from '@shopify/react-native-skia';
7
+ import useBarChart from "./useBarChart.js";
8
+ import VerticalLabel from "../Common/VerticalLabel.js";
9
+ import Popup from "../Popup.js";
10
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ function BarChart(props) {
12
+ const {
13
+ maxValueCalculated,
14
+ minValueCalculated,
15
+ canvasHeight,
16
+ canvasWidth,
17
+ paddingRight,
18
+ paddingLeft,
19
+ paddingBottom,
20
+ paddingTop,
21
+ rectangles,
22
+ verticalLabelWidth,
23
+ chartHeight,
24
+ strokeWidth,
25
+ tooltip,
26
+ bottomLabelHeight,
27
+ font,
28
+ onScroll,
29
+ touchHandler,
30
+ totalHeight,
31
+ totalWidth
32
+ } = useBarChart(props);
33
+ const dragGesture = Gesture.Pan().runOnJS(true).onChange(event => {
34
+ onScroll(-event.changeX);
35
+ });
36
+ const [viewOffset, setViewOffset] = useState({
37
+ x: 0,
38
+ y: 0
39
+ });
40
+ return /*#__PURE__*/_jsx(GestureHandlerRootView, {
41
+ children: /*#__PURE__*/_jsxs(View, {
42
+ style: {
43
+ width: totalWidth,
44
+ flexDirection: 'row',
45
+ backgroundColor: props.style?.backgroundColor,
46
+ paddingLeft: paddingLeft,
47
+ paddingRight: paddingRight,
48
+ paddingTop: paddingTop,
49
+ paddingBottom: paddingBottom
50
+ },
51
+ ref: view => {
52
+ view?.measureInWindow((fx, fy) => {
53
+ setViewOffset(prev => {
54
+ if (prev.x === fx && prev.y === fy) {
55
+ return prev;
56
+ }
57
+ return {
58
+ x: fx,
59
+ y: fy
60
+ };
61
+ });
62
+ });
63
+ },
64
+ children: [/*#__PURE__*/_jsx(VerticalLabel, {
65
+ maxValue: maxValueCalculated,
66
+ minValue: minValueCalculated,
67
+ labelCount: 6,
68
+ styles: {
69
+ width: verticalLabelWidth,
70
+ height: chartHeight,
71
+ strokeWidth
72
+ }
73
+ }), /*#__PURE__*/_jsx(GestureDetector, {
74
+ gesture: dragGesture,
75
+ children: /*#__PURE__*/_jsxs(Canvas, {
76
+ style: {
77
+ width: canvasWidth,
78
+ height: canvasHeight,
79
+ paddingRight: 50,
80
+ backgroundColor: 'red'
81
+ },
82
+ onTouchStart: event => touchHandler(event.nativeEvent.locationX, event.nativeEvent.locationY),
83
+ children: [/*#__PURE__*/_jsx(Line, {
84
+ p1: vec(0, chartHeight),
85
+ p2: vec(canvasWidth, chartHeight),
86
+ color: "white",
87
+ strokeWidth: strokeWidth
88
+ }), rectangles.map((bar, xIndex) => {
89
+ if (bar.bars.length === 0) return null;
90
+ return /*#__PURE__*/_jsxs(Fragment, {
91
+ children: [/*#__PURE__*/_jsx(Text, {
92
+ x: bar.bars[0].x,
93
+ y: chartHeight + font.getSize() + (bottomLabelHeight - font.getSize()) / 2,
94
+ text: bar.label ?? '',
95
+ color: "white",
96
+ font: font
97
+ }), bar.bars.map((item, yIndex) => {
98
+ let currentData = props.data[xIndex].values[yIndex];
99
+ let color = props?.colors?.[currentData.id ?? currentData.label] || '#4A90E2';
100
+ return /*#__PURE__*/_jsx(Rect, {
101
+ x: item.x,
102
+ y: item.y,
103
+ width: item.width,
104
+ height: item.height,
105
+ color: color
106
+ }, xIndex + '-' + yIndex);
107
+ })]
108
+ }, xIndex);
109
+ })]
110
+ })
111
+ }), tooltip && /*#__PURE__*/_jsx(Popup, {
112
+ popupData: {
113
+ x: tooltip.centerX,
114
+ y: tooltip.centerY,
115
+ data: tooltip.data
116
+ },
117
+ popupStyle: props.popupStyle,
118
+ totalWidth: totalWidth,
119
+ totalHeight: totalHeight,
120
+ touchHandler: (x, y) => touchHandler(x - verticalLabelWidth - paddingLeft, y - paddingTop),
121
+ viewOffset: viewOffset
122
+ })]
123
+ })
124
+ });
125
+ }
126
+ export default BarChart;
127
+ //# sourceMappingURL=BarChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Fragment","useState","View","GestureDetector","Gesture","GestureHandlerRootView","Canvas","Rect","Text","vec","Line","useBarChart","VerticalLabel","Popup","jsx","_jsx","jsxs","_jsxs","BarChart","props","maxValueCalculated","minValueCalculated","canvasHeight","canvasWidth","paddingRight","paddingLeft","paddingBottom","paddingTop","rectangles","verticalLabelWidth","chartHeight","strokeWidth","tooltip","bottomLabelHeight","font","onScroll","touchHandler","totalHeight","totalWidth","dragGesture","Pan","runOnJS","onChange","event","changeX","viewOffset","setViewOffset","x","y","children","style","width","flexDirection","backgroundColor","ref","view","measureInWindow","fx","fy","prev","maxValue","minValue","labelCount","styles","height","gesture","onTouchStart","nativeEvent","locationX","locationY","p1","p2","color","map","bar","xIndex","bars","length","getSize","text","label","item","yIndex","currentData","data","values","colors","id","popupData","centerX","centerY","popupStyle"],"sourceRoot":"../../../../src","sources":["skia/BarChart/BarChart.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+
3
+ import { useMemo, useState } from "react";
4
+ import { rect } from "@shopify/react-native-skia";
5
+ import { arrayFrom, isDefined } from "../../util/util.js";
6
+ import { useWindowDimensions } from "react-native";
7
+ import { getCommonStyleFont, getPaddings } from "../common.js";
8
+ export default function useBarChart({
9
+ data,
10
+ style,
11
+ maxValue,
12
+ minValue
13
+ }) {
14
+ const {
15
+ maxValueCalculated,
16
+ minValueCalculated
17
+ } = useMemo(() => {
18
+ if (isDefined(maxValue) && isDefined(minValue)) {
19
+ return {
20
+ maxValueCalculated: maxValue,
21
+ minValueCalculated: minValue
22
+ };
23
+ }
24
+ if (data.length === 0) {
25
+ return {
26
+ maxValueCalculated: maxValue ?? 100,
27
+ minValueCalculated: minValue ?? 0
28
+ };
29
+ }
30
+ let maxValueCalculated = Number.MIN_VALUE;
31
+ let minValueCalculated = Number.MAX_VALUE;
32
+ data.forEach(item => {
33
+ const currentValue = item.values.reduce((acc, value) => {
34
+ minValueCalculated = Math.min(minValueCalculated, value.value);
35
+ return acc + value.value;
36
+ }, 0);
37
+ maxValueCalculated = Math.max(maxValueCalculated, currentValue);
38
+ });
39
+ if (isDefined(maxValue)) maxValueCalculated = maxValue;
40
+ if (isDefined(minValue)) minValueCalculated = minValue;
41
+ return {
42
+ maxValueCalculated,
43
+ minValueCalculated
44
+ };
45
+ }, [data, maxValue]);
46
+ const steps = useMemo(() => arrayFrom(1, 0.2), []);
47
+ const [tooltip, setTooltip] = useState(undefined);
48
+ const [startX, setStartX] = useState(0);
49
+ const {
50
+ paddingLeft,
51
+ paddingRight,
52
+ paddingTop,
53
+ paddingBottom
54
+ } = getPaddings(style);
55
+ const chartBarWidth = style?.barWidth ?? 100;
56
+ const chartBarSpacing = style?.barSpacing ?? 0;
57
+ const verticalLabelWidth = 35;
58
+ const chartHeight = style?.height ?? 200;
59
+ const strokeWidth = 2;
60
+ const bottomLabelHeight = 20;
61
+ const canvasHeight = chartHeight + bottomLabelHeight;
62
+ const {
63
+ width: windowWidth
64
+ } = useWindowDimensions();
65
+ const totalWidth = style?.width ?? windowWidth;
66
+ const totalHeight = chartHeight;
67
+ const initialSpacing = style?.firstBarLeadingSpacing ?? 0;
68
+ const endSpacing = style?.lastBarTrailingSpacing ?? chartBarSpacing;
69
+ const scrollAreaWidth = initialSpacing + data.length * chartBarWidth + Math.max(0, data.length - 1) * chartBarSpacing + endSpacing;
70
+ const canvasWidth = Math.min(scrollAreaWidth, totalWidth - verticalLabelWidth - paddingRight - paddingLeft);
71
+ const {
72
+ font
73
+ } = getCommonStyleFont(style);
74
+ const rectangles = useMemo(() => {
75
+ let leftBoundary = Math.max(0, startX);
76
+ let rightBoundary = startX + totalWidth;
77
+ let startArrayIndex = Math.floor(Math.max(leftBoundary - initialSpacing, 0) / (chartBarWidth + chartBarSpacing));
78
+ let endArrayIndex = Math.min(Math.ceil(rightBoundary / (chartBarWidth + chartBarSpacing)), data.length);
79
+ return data.slice(startArrayIndex, endArrayIndex).map((bar, xIndex) => {
80
+ let previousHeight = 0;
81
+ const x = initialSpacing + (xIndex + startArrayIndex) * (chartBarWidth + chartBarSpacing) - leftBoundary;
82
+ return {
83
+ bars: bar.values.map((item, yIndex) => {
84
+ const barHeight = (item.value - minValueCalculated) / (maxValueCalculated - minValueCalculated) * chartHeight;
85
+ const y = chartHeight - barHeight - previousHeight - strokeWidth;
86
+ previousHeight += barHeight;
87
+ return rect(x, y, chartBarWidth, barHeight);
88
+ }),
89
+ label: bar.label,
90
+ dataIndex: xIndex + startArrayIndex,
91
+ x: x
92
+ };
93
+ });
94
+ }, [data, chartBarWidth, chartBarSpacing, maxValueCalculated, minValueCalculated, strokeWidth, startX]);
95
+ const touchHandler = (touchedX, touchedY) => {
96
+ if (rectangles.length === 0 || touchedX < 0 || touchedY < 0 || touchedX >= canvasWidth || touchedY >= chartHeight) {
97
+ setTooltip(undefined);
98
+ return;
99
+ }
100
+ let xIndex = -1;
101
+ let startingXIndex = 0;
102
+ if (touchedX >= rectangles[0].x && touchedX <= rectangles[0].x + rectangles[0].bars[0].width) {
103
+ xIndex = 0;
104
+ startingXIndex = Math.max(0, rectangles[0].x);
105
+ } else if (touchedX >= rectangles[0].x) {
106
+ xIndex = Math.floor((touchedX - (rectangles[0].x + chartBarWidth) - chartBarSpacing) / (chartBarWidth + chartBarSpacing)) + 1;
107
+ startingXIndex = rectangles[xIndex].x;
108
+ }
109
+ if (xIndex === -1 || touchedX < rectangles[xIndex].x || touchedX > rectangles[xIndex].x + chartBarWidth) {
110
+ console.log('Touch is outside the bar width, ignoring.');
111
+ setTooltip(undefined);
112
+ return;
113
+ }
114
+ xIndex = rectangles[xIndex].dataIndex;
115
+ let yIndex = 0;
116
+ let yPassed = 0;
117
+ let categoryData = data[xIndex]?.values || [];
118
+ let lastBarHeight = 0;
119
+ while (yIndex < categoryData.length && yPassed < chartHeight - touchedY) {
120
+ const barHeight = (categoryData[yIndex].value - minValueCalculated) / (maxValueCalculated - minValueCalculated) * chartHeight;
121
+ yPassed += barHeight;
122
+ lastBarHeight = barHeight;
123
+ yIndex++;
124
+ }
125
+ if (yIndex === 0 || yIndex === categoryData.length && touchedY < chartHeight - yPassed) {
126
+ console.log('Touch is outside the bar height, ignoring.');
127
+ setTooltip(undefined);
128
+ return;
129
+ }
130
+ setTooltip({
131
+ centerX: startingXIndex + chartBarWidth / 2,
132
+ centerY: chartHeight - yPassed - strokeWidth + lastBarHeight / 2,
133
+ data: categoryData[yIndex - 1]
134
+ });
135
+ };
136
+ function onScroll(translateX) {
137
+ setTooltip(undefined);
138
+ setStartX(prev => {
139
+ let newX = prev + translateX;
140
+ if (newX < 0) return 0;
141
+ if (newX + canvasWidth > scrollAreaWidth) return Math.max(0, scrollAreaWidth - canvasWidth);
142
+ return newX;
143
+ });
144
+ }
145
+ return {
146
+ maxValueCalculated,
147
+ minValueCalculated,
148
+ canvasHeight,
149
+ canvasWidth,
150
+ steps,
151
+ scrollAreaWidth,
152
+ chartHeight,
153
+ paddingTop,
154
+ paddingBottom,
155
+ paddingLeft,
156
+ paddingRight,
157
+ verticalLabelWidth,
158
+ chartBarWidth,
159
+ chartBarSpacing,
160
+ strokeWidth,
161
+ rectangles,
162
+ tooltip,
163
+ bottomLabelHeight,
164
+ font,
165
+ setTooltip,
166
+ touchHandler,
167
+ onScroll,
168
+ totalHeight,
169
+ totalWidth
170
+ };
171
+ }
172
+ //# sourceMappingURL=useBarChart.js.map