Skip to main content

LineChart

Example

LineChart

import {
IRenderHeader,
IRenderSectionItem,
LineChart,
IDataset,
ICoordinates
} from '@lad-tech/mobydick-chart';
import RenderSectionItem from '...';
import RenderHeader from '...';

const random = Math.random() * 100;

const mockChart = (n: number) =>
new Array(n).fill(0).map<ICoordinates>((_value, index) => {
return {
x: random * index,
y: 10 + Math.random() * index,
};
});

const mockChartDataset: IDataset = {
'period 1': [
{
coordinates: mockChart(20),
name: '1 line',
colors: [
'#ff0000',
'#f4e91d',
]
},
{
coordinates: mockChart(10),
name: '2 line',
},
{
coordinates: mockChart(5),
name: '3 line',
colors: [
'#33135b',
'#9BE1DA',
'#c5cd56',
'#3b3f8e',
]
},
],
period: [
{
coordinates: mockChart(20),
name: '1 line',
colors: [
'#ba80ff',
'#9BE1DA',
'#56CDCB',
'#3B8B8E',
]
},
{
coordinates: mockChart(10),
name: '2 line',
colors: [
'#E0F5E9',
'#e1db9b',
'#abcd56',
'#768e3b',
'#1cef38',
'#1df488',
'#1de7f9',
'#5787ff',
],
},
{
coordinates: mockChart(5),
name: '3 line',
colors: [
'#ee80ff',
'#e19b9b',
'#5ecd56',
'#833b8e',
]
},
],
};


const renderSectionItem: IRenderSectionItem = (
{period, transition, state},
index,
) => (
<RenderSectionItem
period={period}
state={state}
transition={transition}
index={index}
/>
);

const renderHeader: IRenderHeader = headerData => (
<RenderHeader header={headerData} />
);

const LineChartScreen = () => {

return (
<LineChart
renderHeader={renderHeader}
dataset={mockChartDataset}
renderSectionItem={renderSectionItem}
/>
);
};

export default LineChartScreen;

RenderSectionItem

import Animated, {
interpolateColor,
useAnimatedStyle,
} from 'react-native-reanimated';

import {
createStyles,
Typography,
useStyles,
} from '@lad-tech/mobydick-core';

import {
IChartTransition,
ISharedChartState,
} from '@lad-tech/mobydick-chart';

interface IProps {
period: string;
state: ISharedChartState;
transition: IChartTransition;
index: number;
}

const RenderSectionItem = ({period, state, transition, index}: IProps) => {
const [styles, {colors}] = useStyles(createStyleFn);
const animationStyles = useAnimatedStyle(() => {
const {current, next} = state.value;

if (index !== current && index !== next) {
return {backgroundColor: colors.BgAccent};
}

if (index === current && index === next) {
return {backgroundColor: colors.BgAccentHard};
}

return {
backgroundColor: interpolateColor(
transition.value,
index === next ? [0, 1] : [1, 0],
[colors.BgAccent, colors.BgAccentHard],
),
};
});

return (
<Animated.View style={[styles.container, animationStyles]}>
<Typography style={styles.text}>{period}</Typography>
</Animated.View>
);
};

const createStyleFn = createStyles(({spaces}) => ({
container: {
flexGrow: 1,
padding: spaces.Space8,
borderRadius: spaces.Space16,
margin: spaces.Space4,
},
text: {
textAlign: 'center',
textAlignVertical: 'center',
},
}));

export default RenderSectionItem;

RenderHeader

import Animated, {useAnimatedProps} from 'react-native-reanimated';
import {TextInput} from 'react-native';

import {IRenderHeader} from '@lad-tech/mobydick-chart';
import {Typography, View} from '@lad-tech/mobydick-core';

interface IRenderHeaderProps {
header: Parameters<IRenderHeader>[number];
}

export const AnimatedText = Animated.createAnimatedComponent(TextInput);
Animated.addWhitelistedNativeProps({text: true});

const RenderHeader = ({header}: IRenderHeaderProps) => {
const animatedPropsPeriod = useAnimatedProps(() => {
return {
text: header.selectedPeriodName.value,
defaultValue: header.selectedPeriodName.value,
};
});

const animatedPropsRecord = useAnimatedProps(() => {
const lastRecord = header.selectedValues.value[0]?.y.toString() ?? '';

return {
text: lastRecord,
defaultValue: lastRecord,
};
});

return (
<View>
<AnimatedText
animatedProps={animatedPropsPeriod}
editable={false}
underlineColorAndroid="transparent"
/>
<Typography>Last record</Typography>
<AnimatedText
animatedProps={animatedPropsRecord}
editable={false}
underlineColorAndroid="transparent"
/>
</View>
);
};

export default RenderHeader;

Props

Required
dataset

TYPE
IDataset

All data for chart

title

TYPE
string

Title for chart

renderSectionItem

TYPE
IRenderSectionItem

Render for sections components

sectionContainerStyles

TYPE
ViewStyle

Custom section container styles

formatterX

TYPE
IFormatter

Custom format for x

formatterY

TYPE
IFormatter

Custom format for y

hideDataPoints

TYPEDEFAULT
booleanfalse

Hide data points on lineChart

hidePointer

TYPEDEFAULT
booleanfalse

Hide pointer on lineChart