import React from 'react'; import {PixelRatio, View} from 'react-native'; import { Canvas, Path as SkiaPath, LinearGradient as SkiaLinearGradient, DashPathEffect, Group, PathDef, AnimatedProp, SkPoint, } from '@shopify/react-native-skia'; import {Line} from '../types'; import {parseDashArray} from './useGradient'; interface SkiaCanvasProps { skiaPath: any; line: Line; svgWidth: number; svgHeight: number; skiaGradient: { colors: string[]; positions: number[]; start: any; end: any; }; isRangedLineChart: boolean; } export const SkiaCanvas: React.FC = ({ skiaPath, line, svgWidth, svgHeight, skiaGradient, isRangedLineChart, }) => { const {canvasWidth, canvasHeight, scaleFactor} = React.useMemo(() => { const MAX_TEXTURE_SIZE = 4096; const pr = PixelRatio.get(); const sf = Math.min( 1, MAX_TEXTURE_SIZE / (svgWidth * pr), MAX_TEXTURE_SIZE / (svgHeight * pr), ); return { canvasWidth: Math.floor(svgWidth * sf), canvasHeight: Math.floor(svgHeight * sf), scaleFactor: sf, }; }, [svgWidth, svgHeight]); if (!skiaPath) return null; return ( } end={ skiaGradient.end as unknown as AnimatedProp } colors={skiaGradient.colors} positions={skiaGradient.positions} /> {line.strokeDasharray && parseDashArray(line.strokeDasharray).length >= 2 && ( )} {((line.isAreaChart !== undefined && line.isAreaChart === true) || isRangedLineChart) && ( } end={ skiaGradient.end as unknown as AnimatedProp } colors={skiaGradient.colors} positions={skiaGradient.positions} /> )} ); };