feat(#787): added views peaks
parent
55e15e2b08
commit
24dc9cbf57
@ -0,0 +1,22 @@ |
|||||||
|
import { usePageParams } from 'hooks' |
||||||
|
import { useEffect, useState } from 'react' |
||||||
|
import { Peak, getViewPeaks } from 'requests/getViewPeaks' |
||||||
|
|
||||||
|
export const useViewsPeaks = () => { |
||||||
|
const { profileId, sportType } = usePageParams() |
||||||
|
|
||||||
|
const [peaks, setPeaks] = useState<Array<Peak>>([]) |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
(async () => { |
||||||
|
const res = await getViewPeaks({ match_id: profileId, sport_id: sportType }) |
||||||
|
if (res) { |
||||||
|
setPeaks(res) |
||||||
|
} |
||||||
|
})() |
||||||
|
}, [profileId, sportType]) |
||||||
|
|
||||||
|
return ( |
||||||
|
{ peaks } |
||||||
|
) |
||||||
|
} |
||||||
@ -0,0 +1,32 @@ |
|||||||
|
import { useMatchPageStore } from 'features/MatchPage/store' |
||||||
|
import { memo, useMemo } from 'react' |
||||||
|
|
||||||
|
import { |
||||||
|
PeakContainer, |
||||||
|
PeaksList, |
||||||
|
} from './styled' |
||||||
|
|
||||||
|
interface Props { |
||||||
|
duration: number, |
||||||
|
} |
||||||
|
|
||||||
|
export const Peaks: React.FC<Props> = memo(({ duration }) => { |
||||||
|
const { peaks } = useMatchPageStore() |
||||||
|
|
||||||
|
const peaksPrepared = useMemo(() => peaks.map((p) => ( |
||||||
|
{ |
||||||
|
...p, |
||||||
|
left: p.s / (duration / 1000) * 100, |
||||||
|
width: (p.e - p.s) / (duration / 1000) * 100, |
||||||
|
} |
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
)), [peaks.length, duration]) |
||||||
|
|
||||||
|
return ( |
||||||
|
<PeaksList> |
||||||
|
{peaksPrepared.map((p) => ( |
||||||
|
<PeakContainer style={{ left: `${p.left}%`, width: `${p.width}%` }} /> |
||||||
|
))} |
||||||
|
</PeaksList> |
||||||
|
) |
||||||
|
}) |
||||||
@ -0,0 +1,15 @@ |
|||||||
|
import styled from 'styled-components/macro' |
||||||
|
|
||||||
|
export const PeaksList = styled.div` |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
display: flex; |
||||||
|
position: absolute; |
||||||
|
z-index: 3; |
||||||
|
` |
||||||
|
|
||||||
|
export const PeakContainer = styled.div` |
||||||
|
position: relative; |
||||||
|
height: 100%; |
||||||
|
background-color: #5CDD86; |
||||||
|
` |
||||||
@ -0,0 +1,23 @@ |
|||||||
|
import { API_ROOT } from 'config' |
||||||
|
import { callApi } from 'helpers' |
||||||
|
|
||||||
|
export interface Peak { |
||||||
|
e: number, |
||||||
|
s: number, |
||||||
|
} |
||||||
|
|
||||||
|
export type Props = { |
||||||
|
match_id: number, |
||||||
|
sport_id: number, |
||||||
|
} |
||||||
|
|
||||||
|
export const getViewPeaks = async ({ match_id, sport_id }: Props): Promise<Array<Peak>> => { |
||||||
|
const config = { |
||||||
|
method: 'GET', |
||||||
|
} |
||||||
|
|
||||||
|
return callApi({ |
||||||
|
config, |
||||||
|
url: `${API_ROOT}/v1/views/peaks/${sport_id}/${match_id}`, |
||||||
|
}) |
||||||
|
} |
||||||
Loading…
Reference in new issue