diff --git a/libs/pagination/Pagination.tsx b/libs/pagination/Pagination.tsx index c0392ba304..175ccfe712 100644 --- a/libs/pagination/Pagination.tsx +++ b/libs/pagination/Pagination.tsx @@ -5,6 +5,7 @@ * * Copyright Oxide Computer Company */ +import { useState } from 'react' import tunnel from 'tunnel-rat' import { @@ -29,3 +30,28 @@ export function Pagination({ inline = false, ...props }: PaginationProps) { } Pagination.Target = Tunnel.Out + +type PageToken = string | undefined + +export function usePagination() { + const [prevPages, setPrevPages] = useState([]) + const [currentPage, setCurrentPage] = useState() + + const goToPrevPage = () => { + const prevPage = prevPages.pop() + setCurrentPage(prevPage) + setPrevPages(prevPages) + } + + const goToNextPage = (nextPageToken: string) => { + setPrevPages([...prevPages, currentPage]) + setCurrentPage(nextPageToken) + } + + return { + currentPage, + goToNextPage, + goToPrevPage, + hasPrev: prevPages.length > 0, + } +} diff --git a/libs/pagination/__tests__/use-pagination.spec.ts b/libs/pagination/__tests__/use-pagination.spec.ts index 81c3523e89..27dd41ed0b 100644 --- a/libs/pagination/__tests__/use-pagination.spec.ts +++ b/libs/pagination/__tests__/use-pagination.spec.ts @@ -8,7 +8,7 @@ import { act, renderHook } from '@testing-library/react' import { describe, expect, it } from 'vitest' -import { usePagination } from '../use-pagination' +import { usePagination } from '../index.tsx' describe('usePagination', () => { it('starts with empty state', () => { diff --git a/libs/pagination/index.ts b/libs/pagination/index.ts deleted file mode 100644 index 6d3969ed29..0000000000 --- a/libs/pagination/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * Copyright Oxide Computer Company - */ - -export * from './Pagination' -export * from './use-pagination' diff --git a/libs/pagination/use-pagination.tsx b/libs/pagination/index.tsx similarity index 58% rename from libs/pagination/use-pagination.tsx rename to libs/pagination/index.tsx index 6e416153f6..175ccfe712 100644 --- a/libs/pagination/use-pagination.tsx +++ b/libs/pagination/index.tsx @@ -6,6 +6,30 @@ * Copyright Oxide Computer Company */ import { useState } from 'react' +import tunnel from 'tunnel-rat' + +import { + Pagination as UIPagination, + type PaginationProps as UIPaginationProps, +} from '@oxide/ui' + +const Tunnel = tunnel('pagination') + +interface PaginationProps extends UIPaginationProps { + /** If true pagination will be rendered wherever `Pagination.Target` is included */ + inline?: boolean +} +export function Pagination({ inline = false, ...props }: PaginationProps) { + if (inline) return + + return ( + + + + ) +} + +Pagination.Target = Tunnel.Out type PageToken = string | undefined diff --git a/tsconfig.json b/tsconfig.json index 757bc08ebd..118bf54022 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,7 @@ "@oxide/ui": ["libs/ui/index.ts"], "@oxide/util": ["libs/util/index.ts"], "@oxide/table": ["libs/table/index.ts"], - "@oxide/pagination": ["libs/pagination/index.ts"] + "@oxide/pagination": ["libs/pagination/index.tsx"] }, "resolveJsonModule": true, "rootDir": ".",