Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions src/lib/NavigationView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useNavigation, type View } from 'lib/NavigationProvider.js'
import AccessCodeDetails from 'lib/ui/AccessCodeDetails/AccessCodeDetails.js'

interface NavigationViewProps {
children: JSX.Element
children: React.ReactNode
}

export function NavigationView({ children: rootView }: NavigationViewProps) {
Expand All @@ -19,14 +19,18 @@ export function NavigationView({ children: rootView }: NavigationViewProps) {
}

function Subview({ view }: { view: View }) {
const { goBack } = useNavigation()

switch (view.name) {
case 'device_detail':
return <DeviceDetails deviceId={view.deviceId} />
return <DeviceDetails deviceId={view.deviceId} onBack={goBack} />
case 'access_code_detail':
return <AccessCodeDetails accessCodeId={view.accessCodeId} />
return (
<AccessCodeDetails accessCodeId={view.accessCodeId} onBack={goBack} />
)
case 'device_table':
return <DeviceTable />
return <DeviceTable onBack={goBack} />
case 'access_code_table':
return <AccessCodeTable deviceId={view.deviceId} />
return <AccessCodeTable deviceId={view.deviceId} onBack={goBack} />
}
}
9 changes: 8 additions & 1 deletion src/lib/SeamProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import {
} from 'react'
import type { Seam, SeamClientOptions } from 'seamapi'

import NavigationProvider from 'lib/NavigationProvider.js'
import { NavigationView } from 'lib/NavigationView.js'

declare global {
// eslint-disable-next-line no-var
var seam: SeamProviderProps | undefined
Expand Down Expand Up @@ -68,7 +71,11 @@ export function SeamProvider({
return (
<div className='seam-components'>
<QueryClientProvider client={queryClientRef.current}>
<Provider value={{ ...contextRef.current }}>{children}</Provider>
<NavigationProvider>
<Provider value={{ ...contextRef.current }}>
<NavigationView>{children}</NavigationView>
</Provider>
</NavigationProvider>
</QueryClientProvider>
</div>
)
Expand Down
4 changes: 3 additions & 1 deletion src/lib/ui/AccessCodeDetails/AccessCodeDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'

export interface AccessCodeDetailsProps {
accessCodeId: string
onBack?: () => void
}

export default function AccessCodeDetails({
accessCodeId,
onBack,
}: AccessCodeDetailsProps) {
const { isLoading, data: accessCode } = useFakeAccessCode({
access_code_id: accessCodeId,
Expand All @@ -25,7 +27,7 @@ export default function AccessCodeDetails({

return (
<div className='seam-access-code-details'>
<ContentHeader title='Access code' />
<ContentHeader title='Access code' onBack={onBack} />
<div className='seam-summary'>
<div className='seam-top'>
<span className='seam-label'>{t.accessCode}</span>
Expand Down
14 changes: 11 additions & 3 deletions src/lib/ui/AccessCodeTable/AccessCodeTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,17 @@ import { TableTitle } from 'lib/ui/Table/TableTitle.js'
import { Caption } from 'lib/ui/typography/Caption.js'
import { Title } from 'lib/ui/typography/Title.js'

export function AccessCodeTable(props: { deviceId: string }): JSX.Element {
interface AccessCodeTableProps {
deviceId: string
onBack?: () => void
}

export function AccessCodeTable({
deviceId,
onBack,
}: AccessCodeTableProps): JSX.Element {
const { accessCodes } = useAccessCodes({
device_id: props.deviceId,
device_id: deviceId,
})

const { show } = useNavigation()
Expand All @@ -22,7 +30,7 @@ export function AccessCodeTable(props: { deviceId: string }): JSX.Element {

return (
<div className='seam-access-code-table'>
<ContentHeader />
<ContentHeader onBack={onBack} />
<TableHeader>
<TableTitle>
{t.accessCodes} <Caption>({accessCodes.length})</Caption>
Expand Down
5 changes: 3 additions & 2 deletions src/lib/ui/DeviceDetails/DeviceDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'

export interface DeviceDetailsProps {
deviceId: string
onBack?: () => void
}

export function DeviceDetails(props: DeviceDetailsProps): JSX.Element | null {
const { deviceId } = props
const { deviceId, onBack } = props

const { isLoading: isLoadingDevice, device } = useFakeDevice({
device_id: deviceId,
Expand Down Expand Up @@ -46,7 +47,7 @@ export function DeviceDetails(props: DeviceDetailsProps): JSX.Element | null {

return (
<div className='seam-device-details'>
<ContentHeader title='Device' />
<ContentHeader title='Device' onBack={onBack} />
<div className='seam-body'>
<div className='seam-summary'>
<div className='seam-content'>
Expand Down
8 changes: 1 addition & 7 deletions src/lib/ui/DeviceTable/DeviceTable.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { Button, Dialog, DialogActions } from '@mui/material'
import type { Meta, StoryObj } from '@storybook/react'

import NavigationProvider from 'lib/NavigationProvider.js'
import { NavigationView } from 'lib/NavigationView.js'
import {
DeviceTable,
type DeviceTableProps,
Expand Down Expand Up @@ -65,11 +63,7 @@ function WithNavigationComponent(props: DeviceTableProps) {
<Button onClick={toggleOpen}>Open Modal</Button>
<Dialog open={open} fullWidth maxWidth='sm' onClose={toggleOpen}>
<div className='seam-components'>
<NavigationProvider>
<NavigationView>
<DeviceTable {...props} />
</NavigationView>
</NavigationProvider>
<DeviceTable {...props} />
</div>
<DialogActions
sx={{
Expand Down
2 changes: 1 addition & 1 deletion src/lib/ui/DeviceTable/DeviceTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export function DeviceTable({ onBack, ...props }: DeviceTableProps) {

return (
<div className='seam-device-table'>
<ContentHeader />
<ContentHeader onBack={onBack} />
<TableHeader>
<TableTitle>
{t.devices} <Caption>({deviceCount})</Caption>
Expand Down
13 changes: 7 additions & 6 deletions src/lib/ui/layout/ContentHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import { ArrowBackIcon } from 'lib/icons/ArrowBack.js'
import { useNavigation } from 'lib/NavigationProvider.js'

export function ContentHeader(props: { title?: string }): JSX.Element | null {
const { title } = props
export function ContentHeader(props: {
title?: string
onBack?: () => void
}): JSX.Element | null {
const { title, onBack } = props

const { goBack } = useNavigation()
if (!title && !goBack) {
if (!title && !onBack) {
return null
}

return (
<div className='seam-content-header'>
{goBack && <BackIcon onClick={goBack} />}
{onBack && <BackIcon onClick={onBack} />}
<span className='seam-title'>{title}</span>
</div>
)
Expand Down