/** * @format */ import * as React from 'react' import {Box, Heading, HStack, Text} from '@chakra-ui/react' import { Line, CartesianGrid, XAxis, YAxis, Tooltip, Area, ComposedChart, ResponsiveContainer, Pie, PieChart, Cell, Legend } from 'recharts' import {nFormatter} from '../common/utils' import {KeyValue} from '../types/types' const transactionPrice = [ { TRANSACTION_YEAR: '2018', MEDIAN_TRANSACTION_PRICE: '496000', MIN_TRANSACTION_PRICE: '120000', MAX_TRANSACTION_PRICE: '1300000' }, { TRANSACTION_YEAR: '2019', MEDIAN_TRANSACTION_PRICE: '550000', MIN_TRANSACTION_PRICE: '230000', MAX_TRANSACTION_PRICE: '1220000' }, { TRANSACTION_YEAR: '2020', MEDIAN_TRANSACTION_PRICE: '580000', MIN_TRANSACTION_PRICE: '100000', MAX_TRANSACTION_PRICE: '3800000' }, { TRANSACTION_YEAR: '2021', MEDIAN_TRANSACTION_PRICE: '501500', MIN_TRANSACTION_PRICE: '270000', MAX_TRANSACTION_PRICE: '1575000' }, { TRANSACTION_YEAR: '2022', MEDIAN_TRANSACTION_PRICE: '757500', MIN_TRANSACTION_PRICE: '272000', MAX_TRANSACTION_PRICE: '1170000' } ] const PSFMedianData = [ { TRANSACTION_YEAR: '2018', MEDIAN_TRANSACTION_PRICE: '496000', MAX_TRANSACTION_PRICE: '586000', MIN_TRANSACTION_PRICE: '386000' }, { TRANSACTION_YEAR: '2019', MEDIAN_TRANSACTION_PRICE: '550000', MAX_TRANSACTION_PRICE: '660000', MIN_TRANSACTION_PRICE: '440000' }, { TRANSACTION_YEAR: '2020', MEDIAN_TRANSACTION_PRICE: '580000', MAX_TRANSACTION_PRICE: '690000', MIN_TRANSACTION_PRICE: '470000' }, { TRANSACTION_YEAR: '2021', MEDIAN_TRANSACTION_PRICE: '501500', MAX_TRANSACTION_PRICE: '621500', MIN_TRANSACTION_PRICE: '400500' }, { TRANSACTION_YEAR: '2022', MEDIAN_TRANSACTION_PRICE: '757500', MAX_TRANSACTION_PRICE: '867500', MIN_TRANSACTION_PRICE: '647500' } ] const PieData = [ {name: 'Only Residential For Sale in Mont Kiara, Kuala Lumpur', value: 408}, {name: 'Also Have Other Demand', value: 502} ] // Processing data into a range transactionPrice.forEach((obj: any) => { obj.price = [obj.MAX_TRANSACTION_PRICE, obj.MIN_TRANSACTION_PRICE] }) PSFMedianData.forEach((obj: any) => { obj.price = [obj.MAX_TRANSACTION_PRICE, obj.MIN_TRANSACTION_PRICE] }) const customizedYAxisTick = (props: any) => { const {x, y, payload} = props return ( {nFormatter(payload.value, 3)} ) } const customizedToolTip = (props: any) => { const {payload} = props return ( <> {payload && payload.length && ( {payload[0].payload.TRANSACTION_YEAR} Min: {payload[0].payload.MIN_TRANSACTION_PRICE} Median: {payload[0].payload.MEDIAN_TRANSACTION_PRICE} Max: {payload[0].payload.MAX_TRANSACTION_PRICE} )} ) } const xAxisProperties = { tickLine: false, height: 50, axisLine: false, tickMargin: 25, padding: {left: 10, right: 10}, tick: {fontFamily: 'Roboto-Medium', fontSize: '14px'} } const YAxisProperties = { axisLine: false, tickLine: false, tick: customizedYAxisTick } const AreaProperties = { type: 'monotone', stroke: '#E1EFFE', fill: '#E1EFFE' } const MedianLineProperties = { type: 'monotone', strokeWidth: 3, stroke: '#233876' } interface medianDataUnit { TRANSACTION_YEAR: string MEDIAN_TRANSACTION_PRICE: string MAX_TRANSACTION_PRICE: string MIN_TRANSACTION_PRICE: string } interface MedianTypes { data: Array width?: number height?: number showXAxis?: boolean showYAxis?: boolean showArea?: boolean showGrid?: boolean showToolTip?: boolean } export const MedianChart = ({ data, width = 500, height = 500, showXAxis = true, showYAxis = true, showArea = true, showGrid = true, showToolTip = true }: MedianTypes) => ( {showGrid && } {showArea && } {showXAxis && } {showYAxis && } {showToolTip && } ) export const MedianChartTransactionPrice = () => ( ) interface ChartDataInterface { /** * Width of the pie chart */ width?: number /** * height of the pie chart */ height?: number data?: Array colors?: Array } export const VantagePieChart = ({ width = 300, height = 300, colors }: ChartDataInterface) => { const COLORS = colors || [ '#2AB8E1', '#062472', '#00C49F', '#FFBB28', '#FF8042' ] const RADIAN = Math.PI / 180 const renderCustomizedLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, index }: { cx: number cy: number midAngle: number innerRadius: number outerRadius: number percent: number index: number }) => { const radius = innerRadius + (outerRadius - innerRadius) * 0.5 const x = cx + radius * Math.cos(-midAngle * RADIAN) const y = cy + radius * Math.sin(-midAngle * RADIAN) return ( cx ? 'start' : 'end'} dominantBaseline="central" > {`${(percent * 100).toFixed(0)}%`} ) } const renderLegend = (props: any) => { const {payload} = props return (
    {payload.map((entry: any, index: number) => (
  • {entry.value}
  • ))}
) } return ( {PieData.map((entry, index) => ( ))} ) } export const MedianChartPSF = () =>