Skip to content

Commit

Permalink
Merge branch 'cb/ts-select-menu' of github.com:primer/components into…
Browse files Browse the repository at this point in the history
… cb/ts-select-menu
  • Loading branch information
colebemis committed Feb 19, 2021
2 parents c0ee5af + e4dc08b commit 35d0d75
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 17 deletions.
5 changes: 5 additions & 0 deletions .changeset/nervous-lamps-fold.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@primer/components": patch
---

Migrate `Pagination` to TypeScript
43 changes: 33 additions & 10 deletions src/Pagination/Pagination.js → src/Pagination/Pagination.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'
import styled from 'styled-components'
import sx from '../sx'
import {get, COMMON} from '../constants'
import {ComponentProps} from '../utils/types'
import theme from '../theme'
import Box from '../Box'
import {buildPaginationModel, buildComponentData} from './model'
Expand Down Expand Up @@ -109,6 +110,17 @@ const Page = styled.a`
${COMMON};
`

type UsePaginationPagesParameters = {
theme?: object // set to theme type once /src/theme.js is converted
pageCount: number
currentPage: number
onPageChange: (e: React.MouseEvent, n: number) => void
hrefBuilder: (n: number) => string
marginPageCount: number
showPages?: boolean
surroundingPageCount: number
}

function usePaginationPages({
theme,
pageCount,
Expand All @@ -118,11 +130,11 @@ function usePaginationPages({
marginPageCount,
showPages,
surroundingPageCount
}) {
const pageChange = React.useCallback(n => e => onPageChange(e, n), [onPageChange])
}: UsePaginationPagesParameters) {
const pageChange = React.useCallback(n => (e: React.MouseEvent) => onPageChange(e, n), [onPageChange])

const model = React.useMemo(() => {
return buildPaginationModel(pageCount, currentPage, showPages, marginPageCount, surroundingPageCount)
return buildPaginationModel(pageCount, currentPage, !!showPages, marginPageCount, surroundingPageCount)
}, [pageCount, currentPage, showPages, marginPageCount, surroundingPageCount])

const children = React.useMemo(() => {
Expand All @@ -146,17 +158,28 @@ const PaginationContainer = styled.nav`
${sx};
`

export type PaginationProps = {
theme: object
pageCount: number
currentPage: number
onPageChange?: (e: React.MouseEvent, n: number) => void
hrefBuilder?: (n: number) => string
marginPageCount: number
showPages?: boolean
surroundingPageCount?: number
}

function Pagination({
theme,
pageCount,
currentPage,
onPageChange,
hrefBuilder,
marginPageCount,
showPages,
surroundingPageCount,
onPageChange = noop,
hrefBuilder = defaultHrefBuilder,
marginPageCount = 1,
showPages = true,
surroundingPageCount = 2,
...rest
}) {
}: PaginationProps) {
const pageElements = usePaginationPages({
theme,
pageCount,
Expand All @@ -176,7 +199,7 @@ function Pagination({
)
}

function defaultHrefBuilder(pageNum) {
function defaultHrefBuilder(pageNum: number) {
return `#${pageNum}`
}

Expand Down
File renamed without changes.
27 changes: 22 additions & 5 deletions src/Pagination/model.js → src/Pagination/model.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
export function buildPaginationModel(pageCount, currentPage, showPages, marginPageCount, surroundingPageCount) {
export function buildPaginationModel(
pageCount: number,
currentPage: number,
showPages: boolean,
marginPageCount: number,
surroundingPageCount: number
) {
const pages = []

if (showPages) {
const pageNums = []
const addPage = n => {
const pageNums: Array<number> = []
const addPage = (n: number) => {
if (n >= 1 && n <= pageCount) {
pageNums.push(n)
}
Expand Down Expand Up @@ -113,7 +119,18 @@ export function buildPaginationModel(pageCount, currentPage, showPages, marginPa
return [prev, ...pages, next]
}

export function buildComponentData(page, hrefBuilder, onClick) {
type PageType = {
type: string
num: number
disabled?: boolean
selected?: boolean
}

export function buildComponentData(
page: PageType,
hrefBuilder: (n: number) => string,
onClick: (e: React.MouseEvent) => void
) {
const props = {}
let content = ''
let key = ''
Expand Down Expand Up @@ -151,7 +168,7 @@ export function buildComponentData(page, hrefBuilder, onClick) {
}
case 'NUM': {
key = `page-${page.num}`
content = page.num
content = String(page.num)
if (page.selected) {
Object.assign(props, {as: 'em', 'aria-current': 'page'})
} else {
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import 'babel-polyfill'
import {buildPaginationModel} from '../../Pagination/model'

function first(array, count = 1) {
function first(array: Array<any>, count = 1) {
const slice = array.slice(0, count)
return count === 1 ? slice[0] : slice
}

function last(array, count = 1) {
function last(array: Array<any>, count = 1) {
const len = array.length
const slice = array.slice(len - count, len)
return count === 1 ? slice[0] : slice
Expand Down

0 comments on commit 35d0d75

Please sign in to comment.