| 
									
										
										
										
											2024-02-03 20:23:31 -07:00
										 |  |  | import { useMemo } from "react"; | 
					
						
							| 
									
										
										
										
											2024-01-12 13:04:45 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-03 20:23:31 -07:00
										 |  |  | import { chartDefaults } from "./graph-config"; | 
					
						
							|  |  |  | import { GraphData, GraphProps, XValue, YAxisData } from "./graph-types"; | 
					
						
							| 
									
										
										
										
											2024-02-03 20:30:00 -07:00
										 |  |  | import { convertToGraphData } from "./graph-utils"; | 
					
						
							| 
									
										
										
										
											2024-01-12 13:04:45 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | interface useGraphDataInterface { | 
					
						
							| 
									
										
										
										
											2024-02-03 20:23:31 -07:00
										 |  |  | 	xValues: Array<XValue>; | 
					
						
							|  |  |  | 	yData: { | 
					
						
							|  |  |  | 		data: { | 
					
						
							|  |  |  | 			value: number; | 
					
						
							|  |  |  | 		}[]; | 
					
						
							|  |  |  | 		svg: { | 
					
						
							|  |  |  | 			fill: string; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	}[]; | 
					
						
							|  |  |  | 	yAxisLeftLabels: YAxisData; | 
					
						
							|  |  |  | 	yAxisRightLabels: YAxisData; | 
					
						
							|  |  |  | 	defaultProps: Partial<GraphProps>; | 
					
						
							| 
									
										
										
										
											2024-01-12 13:04:45 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // this version assumes string values for X, this isn't necessarily the case
 | 
					
						
							| 
									
										
										
										
											2024-01-12 16:21:40 -08:00
										 |  |  | // convertToGraphData is specifically tailored to bar/group bar graphs
 | 
					
						
							| 
									
										
										
										
											2024-01-12 13:04:45 -08:00
										 |  |  | // ultimately this component could be used by any x & y axis graph types (line/bar/scatter)
 | 
					
						
							| 
									
										
										
										
											2024-02-03 20:23:31 -07:00
										 |  |  | export const useGraphData = ( | 
					
						
							|  |  |  | 	graphData: GraphData, | 
					
						
							|  |  |  | 	props: Partial<GraphProps>, | 
					
						
							|  |  |  | ): useGraphDataInterface => { | 
					
						
							|  |  |  | 	const { yAxisProps = {}, ...otherProps } = props; | 
					
						
							|  |  |  | 	const defaultProps = { | 
					
						
							|  |  |  | 		...chartDefaults, | 
					
						
							|  |  |  | 		...otherProps, | 
					
						
							|  |  |  | 		// assign default values for yAxisProps + spread to override with values coming from props
 | 
					
						
							|  |  |  | 		yAxisProps: { | 
					
						
							|  |  |  | 			maxLeftYAxisValue: Math.max(...(graphData.yValues[0]?.values ?? [0])), | 
					
						
							|  |  |  | 			maxRightYAxisValue: | 
					
						
							|  |  |  | 				graphData.yValues.length > 1 | 
					
						
							|  |  |  | 					? Math.max(...graphData.yValues[1]?.values) | 
					
						
							|  |  |  | 					: undefined, | 
					
						
							|  |  |  | 			formatRightYAxisLabel: yAxisProps.formatRightYAxisLabel, | 
					
						
							|  |  |  | 			formatLeftYAxisLabel: yAxisProps.formatLeftYAxisLabel, | 
					
						
							|  |  |  | 			selectedLeftYAxisLabel: graphData.yValues[0]?.key, | 
					
						
							|  |  |  | 			selectedRightYAxisLabel: graphData.yValues[1]?.key, | 
					
						
							|  |  |  | 			...yAxisProps, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2024-01-12 13:04:45 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-03 20:23:31 -07:00
										 |  |  | 	const { yData, yAxisLeftLabels, yAxisRightLabels, xValues } = useMemo( | 
					
						
							|  |  |  | 		() => | 
					
						
							|  |  |  | 			convertToGraphData(graphData, { | 
					
						
							|  |  |  | 				...defaultProps.yAxisProps, | 
					
						
							|  |  |  | 				includeColors: defaultProps.includeColors, | 
					
						
							|  |  |  | 				barColors: defaultProps.barColors, | 
					
						
							|  |  |  | 			}), | 
					
						
							|  |  |  | 		[ | 
					
						
							|  |  |  | 			graphData, | 
					
						
							|  |  |  | 			defaultProps.yAxisProps, | 
					
						
							|  |  |  | 			defaultProps.includeColors, | 
					
						
							|  |  |  | 			defaultProps.barColors, | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2024-01-12 13:04:45 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-03 20:23:31 -07:00
										 |  |  | 	return { | 
					
						
							|  |  |  | 		xValues, | 
					
						
							|  |  |  | 		yData, | 
					
						
							|  |  |  | 		yAxisLeftLabels, | 
					
						
							|  |  |  | 		yAxisRightLabels, | 
					
						
							|  |  |  | 		defaultProps, | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2024-01-12 13:04:45 -08:00
										 |  |  | }; |