Skip to content

Commit 43bdbb4

Browse files
kadiryaziciseambotrazor-x
authored
feat: Add edit functionality to DeviceDetails (#670)
* feat: Add edit functionality to DeviceDetails * ci: Format code * add update call * ci: Format code * Fix type error * ci: Format code * Use mutation * ci: Format code * Update according to reviews * Format --------- Co-authored-by: Seam Bot <[email protected]> Co-authored-by: Evan Sosenko <[email protected]>
1 parent b55da40 commit 43bdbb4

File tree

11 files changed

+438
-40
lines changed

11 files changed

+438
-40
lines changed

assets/icons/edit.svg

Lines changed: 1 addition & 8 deletions
Loading

src/lib/icons/Edit.tsx

Lines changed: 6 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lib/seam/components/DeviceDetails/DeviceDetails.tsx

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { LockDeviceDetails } from 'lib/seam/components/DeviceDetails/LockDeviceD
66
import { NoiseSensorDeviceDetails } from 'lib/seam/components/DeviceDetails/NoiseSensorDeviceDetails.js'
77
import { ThermostatDeviceDetails } from 'lib/seam/components/DeviceDetails/ThermostatDeviceDetails.js'
88
import { useDevice } from 'lib/seam/devices/use-device.js'
9+
import { useUpdateDeviceName } from 'lib/seam/devices/use-update-device-name.js'
910
import { isLockDevice } from 'lib/seam/locks/lock-device.js'
1011
import { isNoiseSensorDevice } from 'lib/seam/noise-sensors/noise-sensor-device.js'
1112
import { isThermostatDevice } from 'lib/seam/thermostats/thermostat-device.js'
@@ -16,7 +17,6 @@ export interface DeviceDetailsProps extends CommonProps {
1617
}
1718

1819
export const NestedDeviceDetails = withRequiredCommonProps(DeviceDetails)
19-
2020
export interface NestedSpecificDeviceDetailsProps
2121
extends Required<Omit<CommonProps, 'onBack' | 'className'>> {
2222
onBack: (() => void) | undefined
@@ -42,6 +42,19 @@ export function DeviceDetails({
4242
device_id: deviceId,
4343
})
4444

45+
const { mutate: setDeviceName } = useUpdateDeviceName({
46+
device_id: deviceId,
47+
})
48+
49+
const updateDeviceName = (newName: string): void => {
50+
if (device != null) {
51+
setDeviceName({
52+
device_id: device.device_id,
53+
name: newName,
54+
})
55+
}
56+
}
57+
4558
if (device == null) {
4659
return null
4760
}
@@ -60,15 +73,33 @@ export function DeviceDetails({
6073
}
6174

6275
if (isLockDevice(device)) {
63-
return <LockDeviceDetails device={device} {...props} />
76+
return (
77+
<LockDeviceDetails
78+
device={device}
79+
onEditName={updateDeviceName}
80+
{...props}
81+
/>
82+
)
6483
}
6584

6685
if (isThermostatDevice(device)) {
67-
return <ThermostatDeviceDetails device={device} {...props} />
86+
return (
87+
<ThermostatDeviceDetails
88+
device={device}
89+
onEditName={updateDeviceName}
90+
{...props}
91+
/>
92+
)
6893
}
6994

7095
if (isNoiseSensorDevice(device)) {
71-
return <NoiseSensorDeviceDetails device={device} {...props} />
96+
return (
97+
<NoiseSensorDeviceDetails
98+
device={device}
99+
onEditName={updateDeviceName}
100+
{...props}
101+
/>
102+
)
72103
}
73104

74105
return null

src/lib/seam/components/DeviceDetails/LockDeviceDetails.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { NestedAccessCodeTable } from 'lib/seam/components/AccessCodeTable/Acces
66
import type { NestedSpecificDeviceDetailsProps } from 'lib/seam/components/DeviceDetails/DeviceDetails.js'
77
import { DeviceInfo } from 'lib/seam/components/DeviceDetails/DeviceInfo.js'
88
import { DeviceModel } from 'lib/seam/components/DeviceDetails/DeviceModel.js'
9+
import { SeamEditableDeviceName } from 'lib/seam/components/SeamEditableDeviceName/SeamEditableDeviceName.js'
910
import { deviceErrorFilter, deviceWarningFilter } from 'lib/seam/filters.js'
1011
import type { LockDevice } from 'lib/seam/locks/lock-device.js'
1112
import { useToggleLock } from 'lib/seam/locks/use-toggle-lock.js'
@@ -19,6 +20,7 @@ import { useToggle } from 'lib/ui/use-toggle.js'
1920

2021
interface LockDeviceDetailsProps extends NestedSpecificDeviceDetailsProps {
2122
device: LockDevice
23+
onEditName?: (newName: string) => void | Promise<void>
2224
}
2325

2426
export function LockDeviceDetails({
@@ -33,6 +35,7 @@ export function LockDeviceDetails({
3335
disableConnectedAccountInformation,
3436
onBack,
3537
className,
38+
onEditName,
3639
}: LockDeviceDetailsProps): JSX.Element | null {
3740
const [accessCodesOpen, toggleAccessCodesOpen] = useToggle()
3841
const toggleLock = useToggleLock()
@@ -95,7 +98,12 @@ export function LockDeviceDetails({
9598
</div>
9699
<div className='seam-info'>
97100
<span className='seam-label'>{t.device}</span>
98-
<h4 className='seam-device-name'>{device.properties.name}</h4>
101+
<SeamEditableDeviceName
102+
tagName='h4'
103+
value={device.properties.name}
104+
className='seam-device-name'
105+
onEdit={onEditName}
106+
/>
99107
<div className='seam-properties'>
100108
<span className='seam-label'>{t.status}:</span>{' '}
101109
<OnlineStatus device={device} />

src/lib/seam/components/DeviceDetails/NoiseSensorDeviceDetails.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { useState } from 'react'
44
import type { NestedSpecificDeviceDetailsProps } from 'lib/seam/components/DeviceDetails/DeviceDetails.js'
55
import { DeviceInfo } from 'lib/seam/components/DeviceDetails/DeviceInfo.js'
66
import { DeviceModel } from 'lib/seam/components/DeviceDetails/DeviceModel.js'
7+
import { SeamEditableDeviceName } from 'lib/seam/components/SeamEditableDeviceName/SeamEditableDeviceName.js'
78
import type { NoiseSensorDevice } from 'lib/seam/noise-sensors/noise-sensor-device.js'
89
import { DeviceImage } from 'lib/ui/device/DeviceImage.js'
910
import { NoiseLevelStatus } from 'lib/ui/device/NoiseLevelStatus.js'
@@ -18,6 +19,7 @@ type TabType = 'details' | 'activity'
1819
interface NoiseSensorDeviceDetailsProps
1920
extends NestedSpecificDeviceDetailsProps {
2021
device: NoiseSensorDevice
22+
onEditName?: (newName: string) => void | Promise<void>
2123
}
2224

2325
export function NoiseSensorDeviceDetails({
@@ -26,6 +28,7 @@ export function NoiseSensorDeviceDetails({
2628
disableResourceIds,
2729
onBack,
2830
className,
31+
onEditName,
2932
}: NoiseSensorDeviceDetailsProps): JSX.Element | null {
3033
const [tab, setTab] = useState<TabType>('details')
3134

@@ -45,7 +48,11 @@ export function NoiseSensorDeviceDetails({
4548
</div>
4649
<div className='seam-info'>
4750
<span className='seam-label'>{t.noiseSensor}</span>
48-
<h4 className='seam-device-name'>{device.properties.name}</h4>
51+
<SeamEditableDeviceName
52+
onEdit={onEditName}
53+
tagName='h4'
54+
value={device.properties.name}
55+
/>
4956
<div className='seam-properties'>
5057
<span className='seam-label'>{t.status}:</span>{' '}
5158
<OnlineStatus device={device} />

src/lib/seam/components/DeviceDetails/ThermostatDeviceDetails.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { ThermostatCard } from 'lib/ui/thermostat/ThermostatCard.js'
2929
interface ThermostatDeviceDetailsProps
3030
extends NestedSpecificDeviceDetailsProps {
3131
device: ThermostatDevice
32+
onEditName?: (newName: string) => void | Promise<void>
3233
}
3334

3435
export function ThermostatDeviceDetails({
@@ -37,6 +38,7 @@ export function ThermostatDeviceDetails({
3738
disableConnectedAccountInformation,
3839
onBack,
3940
className,
41+
onEditName,
4042
}: ThermostatDeviceDetailsProps): JSX.Element | null {
4143
if (device == null) {
4244
return null
@@ -47,7 +49,7 @@ export function ThermostatDeviceDetails({
4749
<ContentHeader title={t.thermostat} onBack={onBack} />
4850

4951
<div className='seam-body'>
50-
<ThermostatCard device={device} />
52+
<ThermostatCard device={device} onEditName={onEditName} />
5153

5254
<div className='seam-thermostat-device-details'>
5355
<DetailSectionGroup>

0 commit comments

Comments
 (0)