Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
dd7f0e8
feat: Add Noise Sensors
xplato Apr 30, 2024
40bcc9a
ci: Format code
seambot Apr 30, 2024
2a0e771
ci: Format code
seambot Apr 30, 2024
862b811
Add icon
xplato Apr 30, 2024
59a8fb6
Merge branch 'noise-sensors' of github.com:seamapi/react into noise-s…
xplato Apr 30, 2024
c801c73
ci: Format code
seambot Apr 30, 2024
ac8329d
Update row UI
xplato May 1, 2024
c29ad20
ci: Format code
seambot May 1, 2024
c9dc403
Add `None` UI
xplato May 1, 2024
a574a84
Merge branch 'noise-sensors' of github.com:seamapi/react into noise-s…
xplato May 1, 2024
ff6e9d6
Add time zone caption
xplato May 1, 2024
4f56d0e
ci: Format code
seambot May 1, 2024
44b9594
Add timezone caption
xplato May 1, 2024
0287a43
Merge branch 'noise-sensors' of github.com:seamapi/react into noise-s…
xplato May 1, 2024
1bd9c3d
ci: Format code
seambot May 1, 2024
8147f4d
Add device info
xplato May 1, 2024
ac46d75
Merge branch 'noise-sensors' of github.com:seamapi/react into noise-s…
xplato May 1, 2024
c5c1c5a
ci: Format code
seambot May 1, 2024
94b69e5
Update `tooltipContent` for device type
xplato May 1, 2024
d7396b9
Merge branch 'noise-sensors' of github.com:seamapi/react into noise-s…
xplato May 1, 2024
7e86eb9
Remove noise level status due to missing backend property
xplato May 1, 2024
a6b02d5
Add return type
xplato May 1, 2024
2f6939f
Fix format issues
xplato May 1, 2024
e3c3468
Rename to `getTimeZoneCaption`
xplato May 1, 2024
4954b15
Move content to `t`
xplato May 1, 2024
6daae19
Isolate thresholds list
xplato May 1, 2024
55a4e9f
Add comment for regex
xplato May 1, 2024
c236ddc
Change arch
xplato May 1, 2024
167f409
Use `zoned-time`
xplato May 1, 2024
e686a07
Add return type
xplato May 1, 2024
06c88f7
All times in, remove fragment
xplato May 2, 2024
3c4fcd7
Change timezone code
xplato May 2, 2024
a427b88
Update threshold names
xplato May 2, 2024
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
37 changes: 37 additions & 0 deletions .storybook/seed-fake.js
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,42 @@ export const seedFake = (db) => {
errors: [],
})

const device7 = db.addDevice({
workspace_id: ws2.workspace_id,
connected_account_id: ca.connected_account_id,
device_type: 'noiseaware_activity_zone',
created_at: '2023-05-15T15:08:53.000',
name: 'Living Room',
properties: {
online: true,
model: {
manufacturer_display_name: 'NoiseAware',
display_name: 'Indoor Sensor',
},
},
errors: [],
})

db.addNoiseThreshold({
device_id: device7.device_id,
workspace_id: ws2.workspace_id,
created_at: '2023-05-17T00:16:12.000',
noise_threshold_decibels: 70,
starts_daily_at: '22:00:00[America/Los_Angeles]',
ends_daily_at: '06:00:00[America/Los_Angeles]',
name: 'Quiet Hours',
})

db.addNoiseThreshold({
device_id: device7.device_id,
workspace_id: ws2.workspace_id,
created_at: '2023-05-17T00:16:12.000',
noise_threshold_decibels: 75,
starts_daily_at: '06:00:00[America/Los_Angeles]',
ends_daily_at: '22:00:00[America/Los_Angeles]',
name: 'Active Hours',
})

// add climate setting schedules
db.addClimateSettingSchedule({
device_id: device5.device_id,
Expand Down Expand Up @@ -532,5 +568,6 @@ export const seedFake = (db) => {
device4,
device5,
device6,
device7,
})
}
6 changes: 6 additions & 0 deletions assets/icons/noise-levels.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 31 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,8 @@
"queue": "^7.0.0",
"react-hook-form": "^7.46.1",
"seamapi": "^8.22.0",
"uuid": "^9.0.0"
"uuid": "^9.0.0",
"zoned-time": "^1.1.2"
},
"devDependencies": {
"@emotion/styled": "^11.10.6",
Expand Down
5 changes: 5 additions & 0 deletions src/lib/dates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ export const formatTimeZone = (timeZone: string): string => {
return `${timeZone.replaceAll('_', ' ')} (${offset})`
}

export const formatTime = (time: string): string => {
const dateTime = DateTime.fromISO(time)
return dateTime.isValid ? dateTime.toLocaleString(DateTime.TIME_SIMPLE) : ''
}

export const serializeDateTimePickerValue = (
dateTime: DateTime,
timeZone: string
Expand Down
31 changes: 31 additions & 0 deletions src/lib/icons/NoiseLevels.tsx

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,7 @@ export const DeviceOffline: Story = {
export const ThermostatDevice: Story = {
render: (props) => <DeviceDetails {...props} deviceId='device5' />,
}

export const NoiseSensorDevice: Story = {
render: (props) => <DeviceDetails {...props} deviceId='device7' />,
}
7 changes: 6 additions & 1 deletion src/lib/seam/components/DeviceDetails/DeviceDetails.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { isLockDevice, isThermostatDevice } from 'seamapi'
import { isLockDevice, isNoiseSensorDevice, isThermostatDevice } from 'seamapi'

import {
type CommonProps,
withRequiredCommonProps,
} from 'lib/seam/components/common-props.js'
import { LockDeviceDetails } from 'lib/seam/components/DeviceDetails/LockDeviceDetails.js'
import { NoiseSensorDeviceDetails } from 'lib/seam/components/DeviceDetails/NoiseSensorDeviceDetails.js'
import { ThermostatDeviceDetails } from 'lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js'
import { useDevice } from 'lib/seam/devices/use-device.js'
import { useComponentTelemetry } from 'lib/telemetry/index.js'
Expand Down Expand Up @@ -67,5 +68,9 @@ export function DeviceDetails({
return <ThermostatDeviceDetails device={device} {...props} />
}

if (isNoiseSensorDevice(device)) {
return <NoiseSensorDeviceDetails device={device} {...props} />
}

return null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import type { NoiseSensorDevice } from 'seamapi'

import type { NestedSpecificDeviceDetailsProps } from 'lib/seam/components/DeviceDetails/DeviceDetails.js'
import { DeviceInfo } from 'lib/seam/components/DeviceDetails/DeviceInfo.js'
import { DeviceModel } from 'lib/seam/components/DeviceDetails/DeviceModel.js'
import { DeviceImage } from 'lib/ui/device/DeviceImage.js'
import { OnlineStatus } from 'lib/ui/device/OnlineStatus.js'
import { NoiseThresholdsList } from 'lib/ui/noise-sensor/NoiseThresholdsList.js'

interface NoiseSensorDeviceDetailsProps
extends NestedSpecificDeviceDetailsProps {
device: NoiseSensorDevice
}

export function NoiseSensorDeviceDetails({
device,
disableConnectedAccountInformation,
disableResourceIds,
}: NoiseSensorDeviceDetailsProps): JSX.Element | null {
return (
<div className='seam-device-details'>
<div className='seam-body'>
<div className='seam-summary'>
<div className='seam-content'>
<div className='seam-image'>
<DeviceImage device={device} />
</div>
<div className='seam-info'>
<span className='seam-label'>{t.noiseSensor}</span>
<h4 className='seam-device-name'>{device.properties.name}</h4>
<div className='seam-properties'>
<span className='seam-label'>{t.status}:</span>{' '}
<OnlineStatus device={device} />
<DeviceModel device={device} />
</div>
</div>
</div>
</div>

<NoiseThresholdsList device={device} />

<DeviceInfo
device={device}
disableConnectedAccountInformation={
disableConnectedAccountInformation
}
disableResourceIds={disableResourceIds}
/>
</div>
</div>
)
}

const t = {
noiseSensor: 'Noise Sensor',
status: 'Status',
noiseLevel: 'Noise level',
}
46 changes: 46 additions & 0 deletions src/lib/seam/noise-sensors/use-noise-thresholds.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { useQuery, useQueryClient } from '@tanstack/react-query'
import type {
NoiseThresholds,
NoiseThresholdsListRequest,
NoiseThresholdsListResponse,
SeamError,
} from 'seamapi'

import { useSeamClient } from 'lib/seam/use-seam-client.js'
import type { UseSeamQueryResult } from 'lib/seam/use-seam-query-result.js'

export type UseNoiseThresholdsParams = NoiseThresholdsListRequest
export type UseNoiseThresholdsData = NoiseThresholds[]

export function useNoiseThresholds(
params: UseNoiseThresholdsParams
): UseSeamQueryResult<'noiseThresholds', UseNoiseThresholdsData> {
const { client } = useSeamClient()
const queryClient = useQueryClient()

const { data, ...rest } = useQuery<
NoiseThresholdsListResponse['noise_thresholds'],
SeamError
>({
enabled: client != null,
queryKey: ['noise_thresholds', 'list', params],
queryFn: async () => {
if (client == null) return []
return await client.noiseThresholds.list(params)
},
onSuccess: (noiseThresholds) => {
for (const noiseThreshold of noiseThresholds) {
queryClient.setQueryData(
[
'noise_thresholds',
'get',
{ noise_threshold_id: noiseThreshold.noise_threshold_id },
],
noiseThreshold
)
}
},
})

return { ...rest, noiseThresholds: data }
}
2 changes: 1 addition & 1 deletion src/lib/ui/layout/DetailRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import classNames from 'classnames'
import type { PropsWithChildren } from 'react'

interface DetailRowProps {
label: string
label: JSX.Element | string
sublabel?: string
onClick?: () => void
}
Expand Down
2 changes: 1 addition & 1 deletion src/lib/ui/layout/DetailSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Tooltip } from 'lib/ui/Tooltip/Tooltip.js'

interface DetailSectionProps {
label?: string
tooltipContent?: string
tooltipContent?: JSX.Element | string
}

export function DetailSection({
Expand Down
Loading