mirror of
https://github.com/kremalicious/portfolio.git
synced 2025-02-14 21:10:41 +01:00
52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
'use client'
|
|
|
|
import { createRef, useEffect } from 'react'
|
|
import ProjectType from '../../types/project'
|
|
import { Project } from './Project'
|
|
import styles from './index.module.css'
|
|
|
|
type Props = {
|
|
projects: ProjectType[]
|
|
currentSlug: string
|
|
}
|
|
|
|
export default function ProjectNav({ projects, currentSlug }: Props) {
|
|
// Always keep the scroll position centered
|
|
// to currently viewed project on mount.
|
|
const scrollContainer = createRef<HTMLDivElement>()
|
|
const currentItem = createRef<HTMLAnchorElement>()
|
|
|
|
useEffect(() => {
|
|
function scrollToCurrent() {
|
|
const activeItem = currentItem.current
|
|
const scrollRect = scrollContainer.current?.getBoundingClientRect()
|
|
const activeRect = activeItem && activeItem.getBoundingClientRect()
|
|
const newScrollLeftPosition =
|
|
activeRect &&
|
|
activeRect.left -
|
|
scrollRect.left -
|
|
scrollRect.width / 2 +
|
|
activeRect.width / 2
|
|
|
|
scrollContainer.current.scrollLeft += newScrollLeftPosition
|
|
}
|
|
scrollToCurrent()
|
|
}, [scrollContainer, currentItem])
|
|
|
|
return (
|
|
<nav className={styles.projectNav} ref={scrollContainer}>
|
|
{projects.map((project: ProjectType) => {
|
|
const isCurrent = project.slug === currentSlug
|
|
|
|
return (
|
|
<Project
|
|
key={project.slug}
|
|
project={project}
|
|
ref={isCurrent ? currentItem : null}
|
|
/>
|
|
)
|
|
})}
|
|
</nav>
|
|
)
|
|
}
|