rn-cute-stocks 1.0.1-beta.2 → 1.0.1-beta.3

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.
@@ -262,7 +262,6 @@ const Cursor = ({ xPos, yPos }) => {
262
262
  };
263
263
  const styles = StyleSheet.create({
264
264
  home__main: {
265
- flex: 1,
266
265
  paddingVertical: 50,
267
266
  alignItems: "center",
268
267
  backgroundColor: "#fff",
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/math.js","../../src/rn.js"],"sourcesContent":["// FILE ka main goals kya hai ? =>\r\n// get the data\r\n// generate the skia-path for curve\r\n\r\nimport {\r\n curveBasis,\r\n curveBumpX,\r\n curveLinear,\r\n curveMonotoneX,\r\n curveNatural,\r\n line,\r\n} from \"d3-shape\";\r\n\r\nimport { max, min } from \"d3-array\";\r\nimport { scaleLinear, scaleTime } from \"d3-scale\";\r\n\r\nfunction getCurve(curveType) {\r\n let curve;\r\n\r\n // following are curves I believe are good matches for stock data\r\n switch (curveType) {\r\n case \"curveBasis\":\r\n curve = curveBasis;\r\n break;\r\n case \"curveBumpX\":\r\n curve = curveBumpX;\r\n break;\r\n case \"curveLinear\":\r\n curve = curveLinear;\r\n break;\r\n case \"curveMonotoneX\":\r\n curve = curveMonotoneX;\r\n break;\r\n case \"natural\":\r\n curve = curveNatural;\r\n break;\r\n default:\r\n curve = curveBasis;\r\n console.warn(\r\n \"Invalid curve, falling back to default bezier (curveBasis)\"\r\n );\r\n break;\r\n }\r\n return curve;\r\n}\r\n\r\nfunction GenerateStringPath(curveType, data, canvas_width, canvas_height) {\r\n const curve = getCurve(curveType);\r\n // const data = getPeriodData(period);\r\n\r\n const X_PADDING = Math.max(8, canvas_width * 0.05);\r\n // const CHART_HEIGHT = Math.round(canvas_width * 0.85);\r\n const CHART_HEIGHT = canvas_height;\r\n\r\n const min_x = min(data, (d) => {\r\n return d.timestamp;\r\n });\r\n const max_x = max(data, (d) => {\r\n return d.timestamp;\r\n });\r\n\r\n const x_func = scaleTime()\r\n .domain([min_x, max_x])\r\n .range([X_PADDING, canvas_width - X_PADDING]);\r\n // now we can call like x(someTimestampValue)\r\n // this is done while plotting the path like line().x((d) => x(d.timestamp))\r\n\r\n const min_y = min(data, (d) => {\r\n return d.price;\r\n });\r\n const max_y = max(data, (d) => {\r\n return d.price;\r\n });\r\n\r\n const y_padding = (max_y - min_y) * 0.1;\r\n\r\n const y_func = scaleLinear()\r\n .domain([min_y - y_padding, max_y + y_padding])\r\n .range([CHART_HEIGHT, 0]);\r\n\r\n const str_path = line()\r\n .x((d) => x_func(d.timestamp))\r\n .y((d) => y_func(d.price))\r\n .curve(curve)(data);\r\n\r\n return {\r\n str_path,\r\n x_func,\r\n y_func,\r\n data,\r\n x_range_min: X_PADDING,\r\n x_range_max: canvas_width - X_PADDING,\r\n };\r\n}\r\n\r\nlet path_config = null;\r\n\r\nfunction GetYForX(x_pos, canvas_width, data, canvas_height, y_search_alogorithm) {\r\n // IDEA BEHIND THIS FUNC. :\r\n // the curve is not linear so find two nearby points for the given X (timestamp)\r\n // then assume them as a linear line and get Y via linear interpolation\r\n // also cache the path configs\r\n\r\n if (\r\n !path_config || \r\n path_config.canvas_width !== canvas_width || \r\n path_config.canvas_height !== canvas_height ||\r\n path_config.data.length !== data.length\r\n ) {\r\n path_config = {\r\n ...GenerateStringPath(\"curveBumpX\", data, canvas_width, canvas_height),\r\n canvas_width,\r\n canvas_height\r\n };\r\n }\r\n\r\n const { x_func, y_func, x_range_min, x_range_max } = path_config;\r\n\r\n // keep x within bounds by clamping it\r\n let clamped_x_pos = Math.max(x_range_min, Math.min(x_range_max, x_pos));\r\n\r\n let res = searchStrategy(\r\n y_search_alogorithm,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n );\r\n\r\n return res;\r\n}\r\n\r\nconst searchStrategy = (\r\n search_strategy,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n) => {\r\n let res;\r\n switch (search_strategy) {\r\n case \"binarySearchWithInterpolation\":\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n\r\n // might add more strategies later\r\n // one might be using lookup tables\r\n // as for less data points interpolation fails\r\n\r\n default:\r\n console.warn(\r\n \"invalid search strategy, falling back to binary with interpolation\"\r\n );\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n }\r\n\r\n return res;\r\n};\r\n\r\nconst binarySearchWithInterpolation = (clamped_x_pos, x_func, data, y_func) => {\r\n let timestamp = x_func.invert(clamped_x_pos).getTime();\r\n\r\n let left_idx = 0;\r\n\r\n if (timestamp <= data[0].timestamp) {\r\n const p = data[0].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n if (timestamp >= data[data.length - 1].timestamp) {\r\n const p = data[data.length - 1].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n\r\n // Binary search (could have gone with linear search as well but lol why not better)\r\n let left = 0;\r\n let right = data.length - 1;\r\n\r\n while (left < right - 1) {\r\n const mid = Math.floor((left + right) / 2);\r\n if (data[mid].timestamp <= timestamp) {\r\n left = mid;\r\n } else {\r\n right = mid;\r\n }\r\n }\r\n\r\n if (left >= data.length - 1) left = data.length - 2;\r\n\r\n left_idx = left;\r\n\r\n const left_point = data[left_idx];\r\n const right_point = data[left_idx + 1];\r\n\r\n // do Linear interpolation here\r\n const denominator = right_point.timestamp - left_point.timestamp;\r\n const ratio =\r\n denominator !== 0 ? (timestamp - left_point.timestamp) / denominator : 0;\r\n const y_val =\r\n left_point.price + ratio * (right_point.price - left_point.price);\r\n\r\n let real_price = y_val;\r\n let y_coord = y_func(y_val);\r\n return { y_coord, real_price };\r\n};\r\n\r\nexport { GenerateStringPath, GetYForX };\r\n","import { Text, View, StyleSheet } from \"react-native\";\r\nimport {\r\n Canvas,\r\n LinearGradient,\r\n Path,\r\n vec,\r\n Skia,\r\n Circle,\r\n} from \"@shopify/react-native-skia\";\r\nimport { GenerateStringPath, GetYForX } from \"./math\";\r\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\r\nimport {\r\n useDerivedValue,\r\n useSharedValue,\r\n runOnJS,\r\n withTiming,\r\n} from \"react-native-reanimated\";\r\nimport { useState } from \"react\";\r\n\r\nexport const StockCharts = ({\r\n width,\r\n height,\r\n chartData,\r\n chartContainerStyles,\r\n priceTextStyles,\r\n curveType = \"curveBasis\",\r\n colors = [\"#000\"],\r\n cursorComponent,\r\n curveStrokeWidth = 2,\r\n curveFill = \"stroke\",\r\n ySearch = \"binarySearchWithInterpolation\",\r\n}) => {\r\n const { str_path, x_func, y_func, data, x_range_min, x_range_max } =\r\n GenerateStringPath(curveType, chartData, width, height);\r\n\r\n const skpath = Skia.Path.MakeFromSVGString(str_path);\r\n\r\n let init_x = x_func(data[0].timestamp);\r\n let init_y = y_func(data[0].price);\r\n\r\n const xPos = useSharedValue(init_x);\r\n const yPos = useSharedValue(init_y);\r\n const price_animated_val = useSharedValue(data[0].price);\r\n\r\n // not using toFixed() in next line would treat the init pricxe as number\r\n // casuing \"all text must be rendered within <Text> component error\"\r\n // this is cause it returns a number, toFixed() returns a string\r\n const [priceText, setPriceText] = useState(data[0].price.toFixed(2));\r\n\r\n useDerivedValue(() => {\r\n const txt = price_animated_val.value.toFixed(2);\r\n runOnJS(setPriceText)(txt);\r\n }, [price_animated_val]);\r\n\r\n const updateY = (clamped_x) => {\r\n let res_prices = GetYForX(clamped_x, width, data, height, ySearch);\r\n yPos.value = res_prices.y_coord;\r\n\r\n price_animated_val.value = withTiming(res_prices.real_price, {\r\n duration: 100,\r\n });\r\n };\r\n\r\n const pan = Gesture.Pan().onUpdate((evt) => {\r\n \"worklet\";\r\n const raw_x = Number(evt.x);\r\n const clamped = Math.max(x_range_min, Math.min(x_range_max, raw_x));\r\n xPos.value = clamped;\r\n\r\n runOnJS(updateY)(clamped);\r\n });\r\n\r\n if (!chartData || chartData.length === 0) {\r\n return null; // or a fallback view in future , maybe :)\r\n }\r\n\r\n return (\r\n <View style={[styles.home__main, chartContainerStyles]}>\r\n <Text style={[styles.home__price, priceTextStyles]}>${priceText}</Text>\r\n\r\n <GestureDetector gesture={pan}>\r\n <Canvas\r\n style={{\r\n width: width,\r\n height: height,\r\n }}\r\n >\r\n {cursorComponent ? (\r\n cursorComponent({ xPos, yPos })\r\n ) : (\r\n <Cursor xPos={xPos} yPos={yPos} />\r\n )}\r\n\r\n {skpath && (\r\n <Path\r\n path={skpath}\r\n style={curveFill}\r\n strokeWidth={curveStrokeWidth}\r\n color={\"#fff\"} // i forgot what's this :(\r\n >\r\n <LinearGradient\r\n start={vec(0, 0)}\r\n end={vec(width, height)}\r\n colors={colors}\r\n />\r\n </Path>\r\n )}\r\n </Canvas>\r\n </GestureDetector>\r\n </View>\r\n );\r\n};\r\n\r\nconst Cursor = ({ xPos, yPos }) => {\r\n return (\r\n <>\r\n <Circle style=\"fill\" color=\"#f69d69\" cx={xPos} cy={yPos} r={5} />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={12}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={18}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n home__main: {\r\n flex: 1,\r\n paddingVertical: 50,\r\n alignItems: \"center\",\r\n backgroundColor: \"#fff\",\r\n paddingHorizontal: 20,\r\n },\r\n home__price: {\r\n color: \"#000\",\r\n fontSize: 52,\r\n },\r\n});\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/math.js","../../src/rn.js"],"sourcesContent":["// FILE ka main goals kya hai ? =>\r\n// get the data\r\n// generate the skia-path for curve\r\n\r\nimport {\r\n curveBasis,\r\n curveBumpX,\r\n curveLinear,\r\n curveMonotoneX,\r\n curveNatural,\r\n line,\r\n} from \"d3-shape\";\r\n\r\nimport { max, min } from \"d3-array\";\r\nimport { scaleLinear, scaleTime } from \"d3-scale\";\r\n\r\nfunction getCurve(curveType) {\r\n let curve;\r\n\r\n // following are curves I believe are good matches for stock data\r\n switch (curveType) {\r\n case \"curveBasis\":\r\n curve = curveBasis;\r\n break;\r\n case \"curveBumpX\":\r\n curve = curveBumpX;\r\n break;\r\n case \"curveLinear\":\r\n curve = curveLinear;\r\n break;\r\n case \"curveMonotoneX\":\r\n curve = curveMonotoneX;\r\n break;\r\n case \"natural\":\r\n curve = curveNatural;\r\n break;\r\n default:\r\n curve = curveBasis;\r\n console.warn(\r\n \"Invalid curve, falling back to default bezier (curveBasis)\"\r\n );\r\n break;\r\n }\r\n return curve;\r\n}\r\n\r\nfunction GenerateStringPath(curveType, data, canvas_width, canvas_height) {\r\n const curve = getCurve(curveType);\r\n // const data = getPeriodData(period);\r\n\r\n const X_PADDING = Math.max(8, canvas_width * 0.05);\r\n // const CHART_HEIGHT = Math.round(canvas_width * 0.85);\r\n const CHART_HEIGHT = canvas_height;\r\n\r\n const min_x = min(data, (d) => {\r\n return d.timestamp;\r\n });\r\n const max_x = max(data, (d) => {\r\n return d.timestamp;\r\n });\r\n\r\n const x_func = scaleTime()\r\n .domain([min_x, max_x])\r\n .range([X_PADDING, canvas_width - X_PADDING]);\r\n // now we can call like x(someTimestampValue)\r\n // this is done while plotting the path like line().x((d) => x(d.timestamp))\r\n\r\n const min_y = min(data, (d) => {\r\n return d.price;\r\n });\r\n const max_y = max(data, (d) => {\r\n return d.price;\r\n });\r\n\r\n const y_padding = (max_y - min_y) * 0.1;\r\n\r\n const y_func = scaleLinear()\r\n .domain([min_y - y_padding, max_y + y_padding])\r\n .range([CHART_HEIGHT, 0]);\r\n\r\n const str_path = line()\r\n .x((d) => x_func(d.timestamp))\r\n .y((d) => y_func(d.price))\r\n .curve(curve)(data);\r\n\r\n return {\r\n str_path,\r\n x_func,\r\n y_func,\r\n data,\r\n x_range_min: X_PADDING,\r\n x_range_max: canvas_width - X_PADDING,\r\n };\r\n}\r\n\r\nlet path_config = null;\r\n\r\nfunction GetYForX(x_pos, canvas_width, data, canvas_height, y_search_alogorithm) {\r\n // IDEA BEHIND THIS FUNC. :\r\n // the curve is not linear so find two nearby points for the given X (timestamp)\r\n // then assume them as a linear line and get Y via linear interpolation\r\n // also cache the path configs\r\n\r\n if (\r\n !path_config || \r\n path_config.canvas_width !== canvas_width || \r\n path_config.canvas_height !== canvas_height ||\r\n path_config.data.length !== data.length\r\n ) {\r\n path_config = {\r\n ...GenerateStringPath(\"curveBumpX\", data, canvas_width, canvas_height),\r\n canvas_width,\r\n canvas_height\r\n };\r\n }\r\n\r\n const { x_func, y_func, x_range_min, x_range_max } = path_config;\r\n\r\n // keep x within bounds by clamping it\r\n let clamped_x_pos = Math.max(x_range_min, Math.min(x_range_max, x_pos));\r\n\r\n let res = searchStrategy(\r\n y_search_alogorithm,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n );\r\n\r\n return res;\r\n}\r\n\r\nconst searchStrategy = (\r\n search_strategy,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n) => {\r\n let res;\r\n switch (search_strategy) {\r\n case \"binarySearchWithInterpolation\":\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n\r\n // might add more strategies later\r\n // one might be using lookup tables\r\n // as for less data points interpolation fails\r\n\r\n default:\r\n console.warn(\r\n \"invalid search strategy, falling back to binary with interpolation\"\r\n );\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n }\r\n\r\n return res;\r\n};\r\n\r\nconst binarySearchWithInterpolation = (clamped_x_pos, x_func, data, y_func) => {\r\n let timestamp = x_func.invert(clamped_x_pos).getTime();\r\n\r\n let left_idx = 0;\r\n\r\n if (timestamp <= data[0].timestamp) {\r\n const p = data[0].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n if (timestamp >= data[data.length - 1].timestamp) {\r\n const p = data[data.length - 1].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n\r\n // Binary search (could have gone with linear search as well but lol why not better)\r\n let left = 0;\r\n let right = data.length - 1;\r\n\r\n while (left < right - 1) {\r\n const mid = Math.floor((left + right) / 2);\r\n if (data[mid].timestamp <= timestamp) {\r\n left = mid;\r\n } else {\r\n right = mid;\r\n }\r\n }\r\n\r\n if (left >= data.length - 1) left = data.length - 2;\r\n\r\n left_idx = left;\r\n\r\n const left_point = data[left_idx];\r\n const right_point = data[left_idx + 1];\r\n\r\n // do Linear interpolation here\r\n const denominator = right_point.timestamp - left_point.timestamp;\r\n const ratio =\r\n denominator !== 0 ? (timestamp - left_point.timestamp) / denominator : 0;\r\n const y_val =\r\n left_point.price + ratio * (right_point.price - left_point.price);\r\n\r\n let real_price = y_val;\r\n let y_coord = y_func(y_val);\r\n return { y_coord, real_price };\r\n};\r\n\r\nexport { GenerateStringPath, GetYForX };\r\n","import { Text, View, StyleSheet } from \"react-native\";\r\nimport {\r\n Canvas,\r\n LinearGradient,\r\n Path,\r\n vec,\r\n Skia,\r\n Circle,\r\n} from \"@shopify/react-native-skia\";\r\nimport { GenerateStringPath, GetYForX } from \"./math\";\r\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\r\nimport {\r\n useDerivedValue,\r\n useSharedValue,\r\n runOnJS,\r\n withTiming,\r\n} from \"react-native-reanimated\";\r\nimport { useState } from \"react\";\r\n\r\nexport const StockCharts = ({\r\n width,\r\n height,\r\n chartData,\r\n chartContainerStyles,\r\n priceTextStyles,\r\n curveType = \"curveBasis\",\r\n colors = [\"#000\"],\r\n cursorComponent,\r\n curveStrokeWidth = 2,\r\n curveFill = \"stroke\",\r\n ySearch = \"binarySearchWithInterpolation\",\r\n}) => {\r\n const { str_path, x_func, y_func, data, x_range_min, x_range_max } =\r\n GenerateStringPath(curveType, chartData, width, height);\r\n\r\n const skpath = Skia.Path.MakeFromSVGString(str_path);\r\n\r\n let init_x = x_func(data[0].timestamp);\r\n let init_y = y_func(data[0].price);\r\n\r\n const xPos = useSharedValue(init_x);\r\n const yPos = useSharedValue(init_y);\r\n const price_animated_val = useSharedValue(data[0].price);\r\n\r\n // not using toFixed() in next line would treat the init pricxe as number\r\n // casuing \"all text must be rendered within <Text> component error\"\r\n // this is cause it returns a number, toFixed() returns a string\r\n const [priceText, setPriceText] = useState(data[0].price.toFixed(2));\r\n\r\n useDerivedValue(() => {\r\n const txt = price_animated_val.value.toFixed(2);\r\n runOnJS(setPriceText)(txt);\r\n }, [price_animated_val]);\r\n\r\n const updateY = (clamped_x) => {\r\n let res_prices = GetYForX(clamped_x, width, data, height, ySearch);\r\n yPos.value = res_prices.y_coord;\r\n\r\n price_animated_val.value = withTiming(res_prices.real_price, {\r\n duration: 100,\r\n });\r\n };\r\n\r\n const pan = Gesture.Pan().onUpdate((evt) => {\r\n \"worklet\";\r\n const raw_x = Number(evt.x);\r\n const clamped = Math.max(x_range_min, Math.min(x_range_max, raw_x));\r\n xPos.value = clamped;\r\n\r\n runOnJS(updateY)(clamped);\r\n });\r\n\r\n if (!chartData || chartData.length === 0) {\r\n return null; // or a fallback view in future , maybe :)\r\n }\r\n\r\n return (\r\n <View style={[styles.home__main, chartContainerStyles]}>\r\n <Text style={[styles.home__price, priceTextStyles]}>${priceText}</Text>\r\n\r\n <GestureDetector gesture={pan}>\r\n <Canvas\r\n style={{\r\n width: width,\r\n height: height,\r\n }}\r\n >\r\n {cursorComponent ? (\r\n cursorComponent({ xPos, yPos })\r\n ) : (\r\n <Cursor xPos={xPos} yPos={yPos} />\r\n )}\r\n\r\n {skpath && (\r\n <Path\r\n path={skpath}\r\n style={curveFill}\r\n strokeWidth={curveStrokeWidth}\r\n color={\"#fff\"} // i forgot what's this :(\r\n >\r\n <LinearGradient\r\n start={vec(0, 0)}\r\n end={vec(width, height)}\r\n colors={colors}\r\n />\r\n </Path>\r\n )}\r\n </Canvas>\r\n </GestureDetector>\r\n </View>\r\n );\r\n};\r\n\r\nconst Cursor = ({ xPos, yPos }) => {\r\n return (\r\n <>\r\n <Circle style=\"fill\" color=\"#f69d69\" cx={xPos} cy={yPos} r={5} />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={12}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={18}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n home__main: {\r\n paddingVertical: 50,\r\n alignItems: \"center\",\r\n backgroundColor: \"#fff\",\r\n paddingHorizontal: 20,\r\n },\r\n home__price: {\r\n color: \"#000\",\r\n fontSize: 52,\r\n },\r\n});\r\n"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -264,7 +264,6 @@ const Cursor = ({ xPos, yPos }) => {
264
264
  };
265
265
  const styles = reactNative.StyleSheet.create({
266
266
  home__main: {
267
- flex: 1,
268
267
  paddingVertical: 50,
269
268
  alignItems: "center",
270
269
  backgroundColor: "#fff",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/math.js","../src/rn.js"],"sourcesContent":["// FILE ka main goals kya hai ? =>\r\n// get the data\r\n// generate the skia-path for curve\r\n\r\nimport {\r\n curveBasis,\r\n curveBumpX,\r\n curveLinear,\r\n curveMonotoneX,\r\n curveNatural,\r\n line,\r\n} from \"d3-shape\";\r\n\r\nimport { max, min } from \"d3-array\";\r\nimport { scaleLinear, scaleTime } from \"d3-scale\";\r\n\r\nfunction getCurve(curveType) {\r\n let curve;\r\n\r\n // following are curves I believe are good matches for stock data\r\n switch (curveType) {\r\n case \"curveBasis\":\r\n curve = curveBasis;\r\n break;\r\n case \"curveBumpX\":\r\n curve = curveBumpX;\r\n break;\r\n case \"curveLinear\":\r\n curve = curveLinear;\r\n break;\r\n case \"curveMonotoneX\":\r\n curve = curveMonotoneX;\r\n break;\r\n case \"natural\":\r\n curve = curveNatural;\r\n break;\r\n default:\r\n curve = curveBasis;\r\n console.warn(\r\n \"Invalid curve, falling back to default bezier (curveBasis)\"\r\n );\r\n break;\r\n }\r\n return curve;\r\n}\r\n\r\nfunction GenerateStringPath(curveType, data, canvas_width, canvas_height) {\r\n const curve = getCurve(curveType);\r\n // const data = getPeriodData(period);\r\n\r\n const X_PADDING = Math.max(8, canvas_width * 0.05);\r\n // const CHART_HEIGHT = Math.round(canvas_width * 0.85);\r\n const CHART_HEIGHT = canvas_height;\r\n\r\n const min_x = min(data, (d) => {\r\n return d.timestamp;\r\n });\r\n const max_x = max(data, (d) => {\r\n return d.timestamp;\r\n });\r\n\r\n const x_func = scaleTime()\r\n .domain([min_x, max_x])\r\n .range([X_PADDING, canvas_width - X_PADDING]);\r\n // now we can call like x(someTimestampValue)\r\n // this is done while plotting the path like line().x((d) => x(d.timestamp))\r\n\r\n const min_y = min(data, (d) => {\r\n return d.price;\r\n });\r\n const max_y = max(data, (d) => {\r\n return d.price;\r\n });\r\n\r\n const y_padding = (max_y - min_y) * 0.1;\r\n\r\n const y_func = scaleLinear()\r\n .domain([min_y - y_padding, max_y + y_padding])\r\n .range([CHART_HEIGHT, 0]);\r\n\r\n const str_path = line()\r\n .x((d) => x_func(d.timestamp))\r\n .y((d) => y_func(d.price))\r\n .curve(curve)(data);\r\n\r\n return {\r\n str_path,\r\n x_func,\r\n y_func,\r\n data,\r\n x_range_min: X_PADDING,\r\n x_range_max: canvas_width - X_PADDING,\r\n };\r\n}\r\n\r\nlet path_config = null;\r\n\r\nfunction GetYForX(x_pos, canvas_width, data, canvas_height, y_search_alogorithm) {\r\n // IDEA BEHIND THIS FUNC. :\r\n // the curve is not linear so find two nearby points for the given X (timestamp)\r\n // then assume them as a linear line and get Y via linear interpolation\r\n // also cache the path configs\r\n\r\n if (\r\n !path_config || \r\n path_config.canvas_width !== canvas_width || \r\n path_config.canvas_height !== canvas_height ||\r\n path_config.data.length !== data.length\r\n ) {\r\n path_config = {\r\n ...GenerateStringPath(\"curveBumpX\", data, canvas_width, canvas_height),\r\n canvas_width,\r\n canvas_height\r\n };\r\n }\r\n\r\n const { x_func, y_func, x_range_min, x_range_max } = path_config;\r\n\r\n // keep x within bounds by clamping it\r\n let clamped_x_pos = Math.max(x_range_min, Math.min(x_range_max, x_pos));\r\n\r\n let res = searchStrategy(\r\n y_search_alogorithm,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n );\r\n\r\n return res;\r\n}\r\n\r\nconst searchStrategy = (\r\n search_strategy,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n) => {\r\n let res;\r\n switch (search_strategy) {\r\n case \"binarySearchWithInterpolation\":\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n\r\n // might add more strategies later\r\n // one might be using lookup tables\r\n // as for less data points interpolation fails\r\n\r\n default:\r\n console.warn(\r\n \"invalid search strategy, falling back to binary with interpolation\"\r\n );\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n }\r\n\r\n return res;\r\n};\r\n\r\nconst binarySearchWithInterpolation = (clamped_x_pos, x_func, data, y_func) => {\r\n let timestamp = x_func.invert(clamped_x_pos).getTime();\r\n\r\n let left_idx = 0;\r\n\r\n if (timestamp <= data[0].timestamp) {\r\n const p = data[0].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n if (timestamp >= data[data.length - 1].timestamp) {\r\n const p = data[data.length - 1].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n\r\n // Binary search (could have gone with linear search as well but lol why not better)\r\n let left = 0;\r\n let right = data.length - 1;\r\n\r\n while (left < right - 1) {\r\n const mid = Math.floor((left + right) / 2);\r\n if (data[mid].timestamp <= timestamp) {\r\n left = mid;\r\n } else {\r\n right = mid;\r\n }\r\n }\r\n\r\n if (left >= data.length - 1) left = data.length - 2;\r\n\r\n left_idx = left;\r\n\r\n const left_point = data[left_idx];\r\n const right_point = data[left_idx + 1];\r\n\r\n // do Linear interpolation here\r\n const denominator = right_point.timestamp - left_point.timestamp;\r\n const ratio =\r\n denominator !== 0 ? (timestamp - left_point.timestamp) / denominator : 0;\r\n const y_val =\r\n left_point.price + ratio * (right_point.price - left_point.price);\r\n\r\n let real_price = y_val;\r\n let y_coord = y_func(y_val);\r\n return { y_coord, real_price };\r\n};\r\n\r\nexport { GenerateStringPath, GetYForX };\r\n","import { Text, View, StyleSheet } from \"react-native\";\r\nimport {\r\n Canvas,\r\n LinearGradient,\r\n Path,\r\n vec,\r\n Skia,\r\n Circle,\r\n} from \"@shopify/react-native-skia\";\r\nimport { GenerateStringPath, GetYForX } from \"./math\";\r\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\r\nimport {\r\n useDerivedValue,\r\n useSharedValue,\r\n runOnJS,\r\n withTiming,\r\n} from \"react-native-reanimated\";\r\nimport { useState } from \"react\";\r\n\r\nexport const StockCharts = ({\r\n width,\r\n height,\r\n chartData,\r\n chartContainerStyles,\r\n priceTextStyles,\r\n curveType = \"curveBasis\",\r\n colors = [\"#000\"],\r\n cursorComponent,\r\n curveStrokeWidth = 2,\r\n curveFill = \"stroke\",\r\n ySearch = \"binarySearchWithInterpolation\",\r\n}) => {\r\n const { str_path, x_func, y_func, data, x_range_min, x_range_max } =\r\n GenerateStringPath(curveType, chartData, width, height);\r\n\r\n const skpath = Skia.Path.MakeFromSVGString(str_path);\r\n\r\n let init_x = x_func(data[0].timestamp);\r\n let init_y = y_func(data[0].price);\r\n\r\n const xPos = useSharedValue(init_x);\r\n const yPos = useSharedValue(init_y);\r\n const price_animated_val = useSharedValue(data[0].price);\r\n\r\n // not using toFixed() in next line would treat the init pricxe as number\r\n // casuing \"all text must be rendered within <Text> component error\"\r\n // this is cause it returns a number, toFixed() returns a string\r\n const [priceText, setPriceText] = useState(data[0].price.toFixed(2));\r\n\r\n useDerivedValue(() => {\r\n const txt = price_animated_val.value.toFixed(2);\r\n runOnJS(setPriceText)(txt);\r\n }, [price_animated_val]);\r\n\r\n const updateY = (clamped_x) => {\r\n let res_prices = GetYForX(clamped_x, width, data, height, ySearch);\r\n yPos.value = res_prices.y_coord;\r\n\r\n price_animated_val.value = withTiming(res_prices.real_price, {\r\n duration: 100,\r\n });\r\n };\r\n\r\n const pan = Gesture.Pan().onUpdate((evt) => {\r\n \"worklet\";\r\n const raw_x = Number(evt.x);\r\n const clamped = Math.max(x_range_min, Math.min(x_range_max, raw_x));\r\n xPos.value = clamped;\r\n\r\n runOnJS(updateY)(clamped);\r\n });\r\n\r\n if (!chartData || chartData.length === 0) {\r\n return null; // or a fallback view in future , maybe :)\r\n }\r\n\r\n return (\r\n <View style={[styles.home__main, chartContainerStyles]}>\r\n <Text style={[styles.home__price, priceTextStyles]}>${priceText}</Text>\r\n\r\n <GestureDetector gesture={pan}>\r\n <Canvas\r\n style={{\r\n width: width,\r\n height: height,\r\n }}\r\n >\r\n {cursorComponent ? (\r\n cursorComponent({ xPos, yPos })\r\n ) : (\r\n <Cursor xPos={xPos} yPos={yPos} />\r\n )}\r\n\r\n {skpath && (\r\n <Path\r\n path={skpath}\r\n style={curveFill}\r\n strokeWidth={curveStrokeWidth}\r\n color={\"#fff\"} // i forgot what's this :(\r\n >\r\n <LinearGradient\r\n start={vec(0, 0)}\r\n end={vec(width, height)}\r\n colors={colors}\r\n />\r\n </Path>\r\n )}\r\n </Canvas>\r\n </GestureDetector>\r\n </View>\r\n );\r\n};\r\n\r\nconst Cursor = ({ xPos, yPos }) => {\r\n return (\r\n <>\r\n <Circle style=\"fill\" color=\"#f69d69\" cx={xPos} cy={yPos} r={5} />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={12}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={18}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n home__main: {\r\n flex: 1,\r\n paddingVertical: 50,\r\n alignItems: \"center\",\r\n backgroundColor: \"#fff\",\r\n paddingHorizontal: 20,\r\n },\r\n home__price: {\r\n color: \"#000\",\r\n fontSize: 52,\r\n },\r\n});\r\n"],"names":["curveBasis","curveBumpX","curveLinear","curveMonotoneX","curveNatural","min","max","scaleTime","scaleLinear","line","Skia","useSharedValue","useState","useDerivedValue","runOnJS","withTiming","Gesture","View","jsxs","Text","jsx","GestureDetector","Canvas","Path","LinearGradient","vec","Fragment","Circle","StyleSheet"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/math.js","../src/rn.js"],"sourcesContent":["// FILE ka main goals kya hai ? =>\r\n// get the data\r\n// generate the skia-path for curve\r\n\r\nimport {\r\n curveBasis,\r\n curveBumpX,\r\n curveLinear,\r\n curveMonotoneX,\r\n curveNatural,\r\n line,\r\n} from \"d3-shape\";\r\n\r\nimport { max, min } from \"d3-array\";\r\nimport { scaleLinear, scaleTime } from \"d3-scale\";\r\n\r\nfunction getCurve(curveType) {\r\n let curve;\r\n\r\n // following are curves I believe are good matches for stock data\r\n switch (curveType) {\r\n case \"curveBasis\":\r\n curve = curveBasis;\r\n break;\r\n case \"curveBumpX\":\r\n curve = curveBumpX;\r\n break;\r\n case \"curveLinear\":\r\n curve = curveLinear;\r\n break;\r\n case \"curveMonotoneX\":\r\n curve = curveMonotoneX;\r\n break;\r\n case \"natural\":\r\n curve = curveNatural;\r\n break;\r\n default:\r\n curve = curveBasis;\r\n console.warn(\r\n \"Invalid curve, falling back to default bezier (curveBasis)\"\r\n );\r\n break;\r\n }\r\n return curve;\r\n}\r\n\r\nfunction GenerateStringPath(curveType, data, canvas_width, canvas_height) {\r\n const curve = getCurve(curveType);\r\n // const data = getPeriodData(period);\r\n\r\n const X_PADDING = Math.max(8, canvas_width * 0.05);\r\n // const CHART_HEIGHT = Math.round(canvas_width * 0.85);\r\n const CHART_HEIGHT = canvas_height;\r\n\r\n const min_x = min(data, (d) => {\r\n return d.timestamp;\r\n });\r\n const max_x = max(data, (d) => {\r\n return d.timestamp;\r\n });\r\n\r\n const x_func = scaleTime()\r\n .domain([min_x, max_x])\r\n .range([X_PADDING, canvas_width - X_PADDING]);\r\n // now we can call like x(someTimestampValue)\r\n // this is done while plotting the path like line().x((d) => x(d.timestamp))\r\n\r\n const min_y = min(data, (d) => {\r\n return d.price;\r\n });\r\n const max_y = max(data, (d) => {\r\n return d.price;\r\n });\r\n\r\n const y_padding = (max_y - min_y) * 0.1;\r\n\r\n const y_func = scaleLinear()\r\n .domain([min_y - y_padding, max_y + y_padding])\r\n .range([CHART_HEIGHT, 0]);\r\n\r\n const str_path = line()\r\n .x((d) => x_func(d.timestamp))\r\n .y((d) => y_func(d.price))\r\n .curve(curve)(data);\r\n\r\n return {\r\n str_path,\r\n x_func,\r\n y_func,\r\n data,\r\n x_range_min: X_PADDING,\r\n x_range_max: canvas_width - X_PADDING,\r\n };\r\n}\r\n\r\nlet path_config = null;\r\n\r\nfunction GetYForX(x_pos, canvas_width, data, canvas_height, y_search_alogorithm) {\r\n // IDEA BEHIND THIS FUNC. :\r\n // the curve is not linear so find two nearby points for the given X (timestamp)\r\n // then assume them as a linear line and get Y via linear interpolation\r\n // also cache the path configs\r\n\r\n if (\r\n !path_config || \r\n path_config.canvas_width !== canvas_width || \r\n path_config.canvas_height !== canvas_height ||\r\n path_config.data.length !== data.length\r\n ) {\r\n path_config = {\r\n ...GenerateStringPath(\"curveBumpX\", data, canvas_width, canvas_height),\r\n canvas_width,\r\n canvas_height\r\n };\r\n }\r\n\r\n const { x_func, y_func, x_range_min, x_range_max } = path_config;\r\n\r\n // keep x within bounds by clamping it\r\n let clamped_x_pos = Math.max(x_range_min, Math.min(x_range_max, x_pos));\r\n\r\n let res = searchStrategy(\r\n y_search_alogorithm,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n );\r\n\r\n return res;\r\n}\r\n\r\nconst searchStrategy = (\r\n search_strategy,\r\n clamped_x_pos,\r\n x_func,\r\n data,\r\n y_func\r\n) => {\r\n let res;\r\n switch (search_strategy) {\r\n case \"binarySearchWithInterpolation\":\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n\r\n // might add more strategies later\r\n // one might be using lookup tables\r\n // as for less data points interpolation fails\r\n\r\n default:\r\n console.warn(\r\n \"invalid search strategy, falling back to binary with interpolation\"\r\n );\r\n res = binarySearchWithInterpolation(clamped_x_pos, x_func, data, y_func);\r\n break;\r\n }\r\n\r\n return res;\r\n};\r\n\r\nconst binarySearchWithInterpolation = (clamped_x_pos, x_func, data, y_func) => {\r\n let timestamp = x_func.invert(clamped_x_pos).getTime();\r\n\r\n let left_idx = 0;\r\n\r\n if (timestamp <= data[0].timestamp) {\r\n const p = data[0].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n if (timestamp >= data[data.length - 1].timestamp) {\r\n const p = data[data.length - 1].price;\r\n return { y_coord: y_func(p), real_price: p };\r\n }\r\n\r\n // Binary search (could have gone with linear search as well but lol why not better)\r\n let left = 0;\r\n let right = data.length - 1;\r\n\r\n while (left < right - 1) {\r\n const mid = Math.floor((left + right) / 2);\r\n if (data[mid].timestamp <= timestamp) {\r\n left = mid;\r\n } else {\r\n right = mid;\r\n }\r\n }\r\n\r\n if (left >= data.length - 1) left = data.length - 2;\r\n\r\n left_idx = left;\r\n\r\n const left_point = data[left_idx];\r\n const right_point = data[left_idx + 1];\r\n\r\n // do Linear interpolation here\r\n const denominator = right_point.timestamp - left_point.timestamp;\r\n const ratio =\r\n denominator !== 0 ? (timestamp - left_point.timestamp) / denominator : 0;\r\n const y_val =\r\n left_point.price + ratio * (right_point.price - left_point.price);\r\n\r\n let real_price = y_val;\r\n let y_coord = y_func(y_val);\r\n return { y_coord, real_price };\r\n};\r\n\r\nexport { GenerateStringPath, GetYForX };\r\n","import { Text, View, StyleSheet } from \"react-native\";\r\nimport {\r\n Canvas,\r\n LinearGradient,\r\n Path,\r\n vec,\r\n Skia,\r\n Circle,\r\n} from \"@shopify/react-native-skia\";\r\nimport { GenerateStringPath, GetYForX } from \"./math\";\r\nimport { Gesture, GestureDetector } from \"react-native-gesture-handler\";\r\nimport {\r\n useDerivedValue,\r\n useSharedValue,\r\n runOnJS,\r\n withTiming,\r\n} from \"react-native-reanimated\";\r\nimport { useState } from \"react\";\r\n\r\nexport const StockCharts = ({\r\n width,\r\n height,\r\n chartData,\r\n chartContainerStyles,\r\n priceTextStyles,\r\n curveType = \"curveBasis\",\r\n colors = [\"#000\"],\r\n cursorComponent,\r\n curveStrokeWidth = 2,\r\n curveFill = \"stroke\",\r\n ySearch = \"binarySearchWithInterpolation\",\r\n}) => {\r\n const { str_path, x_func, y_func, data, x_range_min, x_range_max } =\r\n GenerateStringPath(curveType, chartData, width, height);\r\n\r\n const skpath = Skia.Path.MakeFromSVGString(str_path);\r\n\r\n let init_x = x_func(data[0].timestamp);\r\n let init_y = y_func(data[0].price);\r\n\r\n const xPos = useSharedValue(init_x);\r\n const yPos = useSharedValue(init_y);\r\n const price_animated_val = useSharedValue(data[0].price);\r\n\r\n // not using toFixed() in next line would treat the init pricxe as number\r\n // casuing \"all text must be rendered within <Text> component error\"\r\n // this is cause it returns a number, toFixed() returns a string\r\n const [priceText, setPriceText] = useState(data[0].price.toFixed(2));\r\n\r\n useDerivedValue(() => {\r\n const txt = price_animated_val.value.toFixed(2);\r\n runOnJS(setPriceText)(txt);\r\n }, [price_animated_val]);\r\n\r\n const updateY = (clamped_x) => {\r\n let res_prices = GetYForX(clamped_x, width, data, height, ySearch);\r\n yPos.value = res_prices.y_coord;\r\n\r\n price_animated_val.value = withTiming(res_prices.real_price, {\r\n duration: 100,\r\n });\r\n };\r\n\r\n const pan = Gesture.Pan().onUpdate((evt) => {\r\n \"worklet\";\r\n const raw_x = Number(evt.x);\r\n const clamped = Math.max(x_range_min, Math.min(x_range_max, raw_x));\r\n xPos.value = clamped;\r\n\r\n runOnJS(updateY)(clamped);\r\n });\r\n\r\n if (!chartData || chartData.length === 0) {\r\n return null; // or a fallback view in future , maybe :)\r\n }\r\n\r\n return (\r\n <View style={[styles.home__main, chartContainerStyles]}>\r\n <Text style={[styles.home__price, priceTextStyles]}>${priceText}</Text>\r\n\r\n <GestureDetector gesture={pan}>\r\n <Canvas\r\n style={{\r\n width: width,\r\n height: height,\r\n }}\r\n >\r\n {cursorComponent ? (\r\n cursorComponent({ xPos, yPos })\r\n ) : (\r\n <Cursor xPos={xPos} yPos={yPos} />\r\n )}\r\n\r\n {skpath && (\r\n <Path\r\n path={skpath}\r\n style={curveFill}\r\n strokeWidth={curveStrokeWidth}\r\n color={\"#fff\"} // i forgot what's this :(\r\n >\r\n <LinearGradient\r\n start={vec(0, 0)}\r\n end={vec(width, height)}\r\n colors={colors}\r\n />\r\n </Path>\r\n )}\r\n </Canvas>\r\n </GestureDetector>\r\n </View>\r\n );\r\n};\r\n\r\nconst Cursor = ({ xPos, yPos }) => {\r\n return (\r\n <>\r\n <Circle style=\"fill\" color=\"#f69d69\" cx={xPos} cy={yPos} r={5} />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={12}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n <Circle\r\n style=\"stroke\"\r\n color=\"#f69d69\"\r\n cx={xPos}\r\n cy={yPos}\r\n r={18}\r\n strokeWidth={2}\r\n opacity={0.65}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n home__main: {\r\n paddingVertical: 50,\r\n alignItems: \"center\",\r\n backgroundColor: \"#fff\",\r\n paddingHorizontal: 20,\r\n },\r\n home__price: {\r\n color: \"#000\",\r\n fontSize: 52,\r\n },\r\n});\r\n"],"names":["curveBasis","curveBumpX","curveLinear","curveMonotoneX","curveNatural","min","max","scaleTime","scaleLinear","line","Skia","useSharedValue","useState","useDerivedValue","runOnJS","withTiming","Gesture","View","jsxs","Text","jsx","GestureDetector","Canvas","Path","LinearGradient","vec","Fragment","Circle","StyleSheet"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rn-cute-stocks",
3
- "version": "1.0.1-beta.2",
3
+ "version": "1.0.1-beta.3",
4
4
  "description": "",
5
5
  "homepage": "https://github.com/DivyanshuShekhar55/rn-cute-stocks#readme",
6
6
  "bugs": {