@seamapi/react 4.4.0 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,11 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
2
3
  import { useDevice } from '../../../../lib/seam/devices/use-device.js';
3
4
  import { isLockDevice } from '../../../../lib/seam/locks/lock-device.js';
4
5
  import { useToggleLock } from '../../../../lib/seam/locks/use-toggle-lock.js';
5
6
  import { Button } from '../../../../lib/ui/Button.js';
6
7
  import { DeviceImage } from '../../../../lib/ui/device/DeviceImage.js';
8
+ import { Snackbar } from '../../../../lib/ui/Snackbar/Snackbar.js';
7
9
  import { TextButton } from '../../../../lib/ui/TextButton.js';
8
10
  export function AccessCodeDevice({ deviceId, disableLockUnlock, onSelectDevice, }) {
9
11
  const { isPending, device } = useDevice({
@@ -25,17 +27,34 @@ export function AccessCodeDevice({ deviceId, disableLockUnlock, onSelectDevice,
25
27
  }
26
28
  function Content(props) {
27
29
  const { device, disableLockUnlock, onSelectDevice } = props;
28
- const toggleLock = useToggleLock();
30
+ const [snackbarVisible, setSnackbarVisible] = useState(false);
31
+ const [snackbarVariant, setSnackbarVariant] = useState('success');
32
+ const toggleLock = useToggleLock({
33
+ onSuccess: () => {
34
+ setSnackbarVisible(true);
35
+ setSnackbarVariant('success');
36
+ },
37
+ onError: () => {
38
+ setSnackbarVisible(true);
39
+ setSnackbarVariant('error');
40
+ },
41
+ });
29
42
  const toggleLockLabel = device.properties.locked ? t.unlock : t.lock;
30
- return (_jsxs("div", { className: 'seam-access-code-device', children: [_jsx("div", { className: 'seam-device-image', children: _jsx(DeviceImage, { device: device }) }), _jsxs("div", { className: 'seam-body', children: [_jsx("div", { children: device.properties.name }), _jsx(TextButton, { onClick: () => {
31
- onSelectDevice(device.device_id);
32
- }, children: t.deviceDetails })] }), !disableLockUnlock && device.properties.online && (_jsx(Button, { onClick: () => {
33
- toggleLock.mutate(device);
34
- }, children: toggleLockLabel }))] }));
43
+ return (_jsxs(_Fragment, { children: [_jsx(Snackbar, { variant: snackbarVariant, visible: snackbarVisible, onClose: () => {
44
+ setSnackbarVisible(false);
45
+ }, message: snackbarVariant === 'success'
46
+ ? t.successfullyUpdated
47
+ : t.failedToUpdate, autoDismiss: true }), _jsxs("div", { className: 'seam-access-code-device', children: [_jsx("div", { className: 'seam-device-image', children: _jsx(DeviceImage, { device: device }) }), _jsxs("div", { className: 'seam-body', children: [_jsx("div", { children: device.properties.name }), _jsx(TextButton, { onClick: () => {
48
+ onSelectDevice(device.device_id);
49
+ }, children: t.deviceDetails })] }), !disableLockUnlock && device.properties.online && (_jsx(Button, { onClick: () => {
50
+ toggleLock.mutate(device);
51
+ }, children: toggleLockLabel }))] })] }));
35
52
  }
36
53
  const t = {
37
54
  deviceDetails: 'Device details',
38
55
  unlock: 'Unlock',
39
56
  lock: 'Lock',
57
+ successfullyUpdated: 'Lock status has been successfully updated',
58
+ failedToUpdate: 'Failed to update lock status',
40
59
  };
41
60
  //# sourceMappingURL=AccessCodeDevice.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AccessCodeDevice.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/AccessCodeDetails/AccessCodeDevice.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAmB,MAAM,+BAA+B,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,iBAAiB,EACjB,cAAc,GAKf;IACC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QACtC,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAA;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,MAAM,CAAC,+BAA+B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CACL,KAAC,OAAO,IACN,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,cAAc,GAC9B,CACH,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAIhB;IACC,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;IAC3D,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAElC,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEpE,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,mBAAmB,YAChC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GAC3B,EACN,eAAK,SAAS,EAAC,WAAW,aACxB,wBAAM,MAAM,CAAC,UAAU,CAAC,IAAI,GAAO,EACnC,KAAC,UAAU,IACT,OAAO,EAAE,GAAG,EAAE;4BACZ,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;wBAClC,CAAC,YAEA,CAAC,CAAC,aAAa,GACL,IACT,EACL,CAAC,iBAAiB,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CACjD,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE;oBACZ,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBAC3B,CAAC,YAEA,eAAe,GACT,CACV,IACG,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,aAAa,EAAE,gBAAgB;IAC/B,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;CACb,CAAA"}
1
+ {"version":3,"file":"AccessCodeDevice.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/AccessCodeDetails/AccessCodeDevice.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAmB,MAAM,+BAA+B,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAwB,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,iBAAiB,EACjB,cAAc,GAKf;IACC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QACtC,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAA;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,MAAM,CAAC,+BAA+B,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CACL,KAAC,OAAO,IACN,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,cAAc,GAC9B,CACH,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAIhB;IACC,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;IAC3D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GACzC,QAAQ,CAAkB,SAAS,CAAC,CAAA;IAEtC,MAAM,UAAU,GAAG,aAAa,CAAC;QAC/B,SAAS,EAAE,GAAG,EAAE;YACd,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACxB,kBAAkB,CAAC,SAAS,CAAC,CAAA;QAC/B,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACxB,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAC7B,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEpE,OAAO,CACL,8BACE,KAAC,QAAQ,IACP,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,GAAG,EAAE;oBACZ,kBAAkB,CAAC,KAAK,CAAC,CAAA;gBAC3B,CAAC,EACD,OAAO,EACL,eAAe,KAAK,SAAS;oBAC3B,CAAC,CAAC,CAAC,CAAC,mBAAmB;oBACvB,CAAC,CAAC,CAAC,CAAC,cAAc,EAEtB,WAAW,SACX,EAEF,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,mBAAmB,YAChC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GAC3B,EACN,eAAK,SAAS,EAAC,WAAW,aACxB,wBAAM,MAAM,CAAC,UAAU,CAAC,IAAI,GAAO,EACnC,KAAC,UAAU,IACT,OAAO,EAAE,GAAG,EAAE;oCACZ,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;gCAClC,CAAC,YAEA,CAAC,CAAC,aAAa,GACL,IACT,EACL,CAAC,iBAAiB,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CACjD,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE;4BACZ,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;wBAC3B,CAAC,YAEA,eAAe,GACT,CACV,IACG,IACL,CACJ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,aAAa,EAAE,gBAAgB;IAC/B,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,mBAAmB,EAAE,2CAA2C;IAChE,cAAc,EAAE,8BAA8B;CAC/C,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import classNames from 'classnames';
3
+ import { useState } from 'react';
3
4
  import { ChevronRightIcon } from '../../../../lib/icons/ChevronRight.js';
4
5
  import { useAccessCodes } from '../../../../lib/seam/access-codes/use-access-codes.js';
5
6
  import { NestedAccessCodeTable } from '../../../../lib/seam/components/AccessCodeTable/AccessCodeTable.js';
@@ -14,13 +15,25 @@ import { DeviceImage } from '../../../../lib/ui/device/DeviceImage.js';
14
15
  import { EditableDeviceName } from '../../../../lib/ui/device/EditableDeviceName.js';
15
16
  import { OnlineStatus } from '../../../../lib/ui/device/OnlineStatus.js';
16
17
  import { ContentHeader } from '../../../../lib/ui/layout/ContentHeader.js';
18
+ import { Snackbar } from '../../../../lib/ui/Snackbar/Snackbar.js';
17
19
  import { useToggle } from '../../../../lib/ui/use-toggle.js';
18
20
  export function LockDeviceDetails({ device, errorFilter, warningFilter, disableLockUnlock, disableCreateAccessCode, disableEditAccessCode, disableDeleteAccessCode, disableResourceIds, disableConnectedAccountInformation, onBack, className, onEditName, }) {
19
21
  const [accessCodesOpen, toggleAccessCodesOpen] = useToggle();
20
- const toggleLock = useToggleLock();
21
22
  const { accessCodes } = useAccessCodes({
22
23
  device_id: device.device_id,
23
24
  });
25
+ const [snackbarVisible, setSnackbarVisible] = useState(false);
26
+ const [snackbarVariant, setSnackbarVariant] = useState('success');
27
+ const toggleLock = useToggleLock({
28
+ onSuccess: () => {
29
+ setSnackbarVisible(true);
30
+ setSnackbarVariant('success');
31
+ },
32
+ onError: () => {
33
+ setSnackbarVisible(true);
34
+ setSnackbarVariant('error');
35
+ },
36
+ });
24
37
  const lockStatus = device.properties.locked ? t.locked : t.unlocked;
25
38
  const toggleLockLabel = device.properties.locked ? t.unlock : t.lock;
26
39
  const accessCodeCount = accessCodes?.length;
@@ -46,10 +59,14 @@ export function LockDeviceDetails({ device, errorFilter, warningFilter, disableL
46
59
  message: warning.message,
47
60
  })),
48
61
  ];
49
- return (_jsxs("div", { className: classNames('seam-device-details', className), children: [_jsx(ContentHeader, { title: 'Device', onBack: onBack }), _jsxs("div", { className: 'seam-body', children: [_jsxs("div", { className: 'seam-summary', children: [_jsxs("div", { className: 'seam-content', children: [_jsx("div", { className: 'seam-image', children: _jsx(DeviceImage, { device: device }) }), _jsxs("div", { className: 'seam-info', children: [_jsx("span", { className: 'seam-label', children: t.device }), _jsx(EditableDeviceName, { tagName: 'h4', value: device.properties.name, className: 'seam-device-name', onEdit: onEditName }), _jsxs("div", { className: 'seam-properties', children: [_jsxs("span", { className: 'seam-label', children: [t.status, ":"] }), ' ', _jsx(OnlineStatus, { device: device }), device.properties.online && (_jsxs(_Fragment, { children: [_jsxs("span", { className: 'seam-label', children: [t.power, ":"] }), ' ', _jsx(BatteryStatusIndicator, { device: device })] })), _jsx(DeviceModel, { device: device })] })] })] }), _jsx(Alerts, { alerts: alerts, className: 'seam-alerts-space-top' })] }), _jsx("div", { className: 'seam-box', children: _jsxs("div", { className: 'seam-content seam-access-codes', onClick: toggleAccessCodesOpen, children: [_jsxs("span", { className: 'seam-value', children: [accessCodeCount, " ", t.accessCodes] }), _jsx(ChevronRightIcon, {})] }) }), _jsxs("div", { className: 'seam-box', children: [device.properties.locked && device.properties.online && (_jsxs("div", { className: 'seam-content seam-lock-status', children: [_jsxs("div", { children: [_jsx("span", { className: 'seam-label', children: t.lockStatus }), _jsx("span", { className: 'seam-value', children: lockStatus })] }), _jsx("div", { className: 'seam-right', children: !disableLockUnlock &&
50
- device.capabilities_supported.includes('lock') && (_jsx(Button, { size: 'small', onClick: () => {
51
- toggleLock.mutate(device);
52
- }, children: toggleLockLabel })) })] })), _jsx(AccessCodeLength, { supportedCodeLengths: device.properties?.supported_code_lengths ?? [] })] }), _jsx(DeviceInfo, { device: device, disableConnectedAccountInformation: disableConnectedAccountInformation, disableResourceIds: disableResourceIds })] })] }));
62
+ return (_jsxs(_Fragment, { children: [_jsx(Snackbar, { variant: snackbarVariant, visible: snackbarVisible, onClose: () => {
63
+ setSnackbarVisible(false);
64
+ }, message: snackbarVariant === 'success'
65
+ ? t.successfullyUpdated
66
+ : t.failedToUpdate, autoDismiss: true }), _jsxs("div", { className: classNames('seam-device-details', className), children: [_jsx(ContentHeader, { title: 'Device', onBack: onBack }), _jsxs("div", { className: 'seam-body', children: [_jsxs("div", { className: 'seam-summary', children: [_jsxs("div", { className: 'seam-content', children: [_jsx("div", { className: 'seam-image', children: _jsx(DeviceImage, { device: device }) }), _jsxs("div", { className: 'seam-info', children: [_jsx("span", { className: 'seam-label', children: t.device }), _jsx(EditableDeviceName, { tagName: 'h4', value: device.properties.name, className: 'seam-device-name', onEdit: onEditName }), _jsxs("div", { className: 'seam-properties', children: [_jsxs("span", { className: 'seam-label', children: [t.status, ":"] }), ' ', _jsx(OnlineStatus, { device: device }), device.properties.online && (_jsxs(_Fragment, { children: [_jsxs("span", { className: 'seam-label', children: [t.power, ":"] }), ' ', _jsx(BatteryStatusIndicator, { device: device })] })), _jsx(DeviceModel, { device: device })] })] })] }), _jsx(Alerts, { alerts: alerts, className: 'seam-alerts-space-top' })] }), _jsx("div", { className: 'seam-box', children: _jsxs("div", { className: 'seam-content seam-access-codes', onClick: toggleAccessCodesOpen, children: [_jsxs("span", { className: 'seam-value', children: [accessCodeCount, " ", t.accessCodes] }), _jsx(ChevronRightIcon, {})] }) }), _jsxs("div", { className: 'seam-box', children: [device.properties.locked && device.properties.online && (_jsxs("div", { className: 'seam-content seam-lock-status', children: [_jsxs("div", { children: [_jsx("span", { className: 'seam-label', children: t.lockStatus }), _jsx("span", { className: 'seam-value', children: lockStatus })] }), _jsx("div", { className: 'seam-right', children: !disableLockUnlock &&
67
+ device.capabilities_supported.includes('lock') && (_jsx(Button, { size: 'small', onClick: () => {
68
+ toggleLock.mutate(device);
69
+ }, children: toggleLockLabel })) })] })), _jsx(AccessCodeLength, { supportedCodeLengths: device.properties?.supported_code_lengths ?? [] })] }), _jsx(DeviceInfo, { device: device, disableConnectedAccountInformation: disableConnectedAccountInformation, disableResourceIds: disableResourceIds })] })] })] }));
53
70
  }
54
71
  function AccessCodeLength(props) {
55
72
  const { supportedCodeLengths } = props;
@@ -73,5 +90,7 @@ const t = {
73
90
  lockStatus: 'Lock status',
74
91
  status: 'Status',
75
92
  power: 'Power',
93
+ successfullyUpdated: 'Lock status has been successfully updated',
94
+ failedToUpdate: 'Failed to update lock status',
76
95
  };
77
96
  //# sourceMappingURL=LockDeviceDetails.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LockDeviceDetails.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceDetails/LockDeviceDetails.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LockDeviceDetails.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceDetails/LockDeviceDetails.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAA;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wDAAwD,CAAA;AAE9F,OAAO,EAAE,UAAU,EAAE,MAAM,iDAAiD,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAA;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAwB,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAOhD,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,kCAAkC,EAClC,MAAM,EACN,SAAS,EACT,UAAU,GACa;IACvB,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC,GAAG,SAAS,EAAE,CAAA;IAC5D,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAA;IAEF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GACzC,QAAQ,CAAkB,SAAS,CAAC,CAAA;IAEtC,MAAM,UAAU,GAAG,aAAa,CAAC;QAC/B,SAAS,EAAE,GAAG,EAAE;YACd,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACxB,kBAAkB,CAAC,SAAS,CAAC,CAAA;QAC/B,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,kBAAkB,CAAC,IAAI,CAAC,CAAA;YACxB,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAC7B,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IACnE,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEpE,MAAM,eAAe,GAAG,WAAW,EAAE,MAAM,CAAA;IAE3C,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,CACL,KAAC,qBAAqB,IACpB,QAAQ,EAAE,MAAM,CAAC,SAAS,EAC1B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB,EACpC,uBAAuB,EAAE,uBAAuB,EAChD,qBAAqB,EAAE,qBAAqB,EAC5C,uBAAuB,EAAE,uBAAuB,EAChD,kBAAkB,EAAE,kBAAkB,EACtC,kCAAkC,EAAE,kCAAkC,EACtE,MAAM,EAAE,qBAAqB,EAC7B,SAAS,EAAE,SAAS,GACpB,CACH,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG;QACb,GAAG,MAAM,CAAC,MAAM;aACb,MAAM,CAAC,iBAAiB,CAAC;aACzB,MAAM,CAAC,WAAW,CAAC;aACnB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,OAAO,EAAE,OAAgB;YACzB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACL,GAAG,MAAM,CAAC,QAAQ;aACf,MAAM,CAAC,mBAAmB,CAAC;aAC3B,MAAM,CAAC,aAAa,CAAC;aACrB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACjB,OAAO,EAAE,SAAkB;YAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;KACN,CAAA;IAED,OAAO,CACL,8BACE,KAAC,QAAQ,IACP,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,GAAG,EAAE;oBACZ,kBAAkB,CAAC,KAAK,CAAC,CAAA;gBAC3B,CAAC,EACD,OAAO,EACL,eAAe,KAAK,SAAS;oBAC3B,CAAC,CAAC,CAAC,CAAC,mBAAmB;oBACvB,CAAC,CAAC,CAAC,CAAC,cAAc,EAEtB,WAAW,SACX,EAEF,eAAK,SAAS,EAAE,UAAU,CAAC,qBAAqB,EAAE,SAAS,CAAC,aAC1D,KAAC,aAAa,IAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAE,MAAM,GAAI,EAChD,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,cAAc,aAC3B,eAAK,SAAS,EAAC,cAAc,aAC3B,cAAK,SAAS,EAAC,YAAY,YACzB,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GAC3B,EACN,eAAK,SAAS,EAAC,WAAW,aACxB,eAAM,SAAS,EAAC,YAAY,YAAE,CAAC,CAAC,MAAM,GAAQ,EAC9C,KAAC,kBAAkB,IACjB,OAAO,EAAC,IAAI,EACZ,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,EAC7B,SAAS,EAAC,kBAAkB,EAC5B,MAAM,EAAE,UAAU,GAClB,EACF,eAAK,SAAS,EAAC,iBAAiB,aAC9B,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,MAAM,SAAS,EAAC,GAAG,EACnD,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,EAC/B,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CAC3B,8BACE,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,KAAK,SAAS,EAAC,GAAG,EAClD,KAAC,sBAAsB,IAAC,MAAM,EAAE,MAAM,GAAI,IACzC,CACJ,EACD,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,IAC3B,IACF,IACF,EACN,KAAC,MAAM,IAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAC,uBAAuB,GAAG,IACxD,EACN,cAAK,SAAS,EAAC,UAAU,YACvB,eACE,SAAS,EAAC,gCAAgC,EAC1C,OAAO,EAAE,qBAAqB,aAE9B,gBAAM,SAAS,EAAC,YAAY,aACzB,eAAe,OAAG,CAAC,CAAC,WAAW,IAC3B,EACP,KAAC,gBAAgB,KAAG,IAChB,GACF,EAEN,eAAK,SAAS,EAAC,UAAU,aACtB,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CACvD,eAAK,SAAS,EAAC,+BAA+B,aAC5C,0BACE,eAAM,SAAS,EAAC,YAAY,YAAE,CAAC,CAAC,UAAU,GAAQ,EAClD,eAAM,SAAS,EAAC,YAAY,YAAE,UAAU,GAAQ,IAC5C,EACN,cAAK,SAAS,EAAC,YAAY,YACxB,CAAC,iBAAiB;oDACjB,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAChD,KAAC,MAAM,IACL,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,GAAG,EAAE;wDACZ,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;oDAC3B,CAAC,YAEA,eAAe,GACT,CACV,GACC,IACF,CACP,EAED,KAAC,gBAAgB,IACf,oBAAoB,EAClB,MAAM,CAAC,UAAU,EAAE,sBAAsB,IAAI,EAAE,GAEjD,IACE,EACN,KAAC,UAAU,IACT,MAAM,EAAE,MAAM,EACd,kCAAkC,EAChC,kCAAkC,EAEpC,kBAAkB,EAAE,kBAAkB,GACtC,IACE,IACF,IACL,CACJ,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAEzB;IACC,MAAM,EAAE,oBAAoB,EAAE,GAAG,KAAK,CAAA;IAEtC,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAA;IAE7C,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;IAEjD,OAAO,CACL,eAAK,SAAS,EAAC,sCAAsC,aACnD,eAAM,SAAS,EAAC,YAAY,YAAE,CAAC,CAAC,UAAU,GAAQ,EAClD,gBAAM,SAAS,EAAC,YAAY,aACzB,KAAK,OAAG,CAAC,CAAC,MAAM,IACZ,IACH,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,cAAc;IAC3B,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,mBAAmB,EAAE,2CAA2C;IAChE,cAAc,EAAE,8BAA8B;CAC/C,CAAA"}
@@ -1,7 +1,6 @@
1
1
  import type { SeamActionAttemptFailedError, SeamActionAttemptTimeoutError, SeamHttpApiError } from '@seamapi/http/connect';
2
2
  import type { ActionAttempt, Device } from '@seamapi/types/connect';
3
3
  import { type UseMutationResult } from '@tanstack/react-query';
4
- export type UseToggleLockParams = never;
5
4
  export type UseToggleLockData = undefined;
6
5
  export type UseToggleLockMutationVariables = Pick<Device, 'device_id'> & {
7
6
  properties: Required<Pick<Device['properties'], 'locked'>>;
@@ -12,5 +11,9 @@ type ToggleLockActionAttempt = Extract<ActionAttempt, {
12
11
  action_type: 'UNLOCK_DOOR';
13
12
  }>;
14
13
  type MutationError = SeamHttpApiError | SeamActionAttemptFailedError<ToggleLockActionAttempt> | SeamActionAttemptTimeoutError<ToggleLockActionAttempt>;
15
- export declare function useToggleLock(): UseMutationResult<UseToggleLockData, MutationError, UseToggleLockMutationVariables>;
14
+ interface UseToggleLockParams {
15
+ onError?: () => void;
16
+ onSuccess?: () => void;
17
+ }
18
+ export declare function useToggleLock(params?: UseToggleLockParams): UseMutationResult<UseToggleLockData, MutationError, UseToggleLockMutationVariables>;
16
19
  export {};
@@ -1,6 +1,6 @@
1
1
  import { useMutation, useQueryClient, } from '@tanstack/react-query';
2
2
  import { NullSeamClientError, useSeamClient } from '../../../lib/seam/use-seam-client.js';
3
- export function useToggleLock() {
3
+ export function useToggleLock(params = {}) {
4
4
  const { client } = useSeamClient();
5
5
  const queryClient = useQueryClient();
6
6
  return useMutation({
@@ -47,6 +47,7 @@ export function useToggleLock() {
47
47
  });
48
48
  },
49
49
  onError: async (_error, variables) => {
50
+ params.onError?.();
50
51
  await queryClient.invalidateQueries({
51
52
  queryKey: ['devices', 'list'],
52
53
  });
@@ -54,6 +55,9 @@ export function useToggleLock() {
54
55
  queryKey: ['devices', 'get', { device_id: variables.device_id }],
55
56
  });
56
57
  },
58
+ onSuccess() {
59
+ params.onSuccess?.();
60
+ },
57
61
  });
58
62
  }
59
63
  //# sourceMappingURL=use-toggle-lock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-toggle-lock.js","sourceRoot":"","sources":["../../../src/lib/seam/locks/use-toggle-lock.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,WAAW,EAEX,cAAc,GACf,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAmBhF,MAAM,UAAU,aAAa;IAK3B,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,OAAO,WAAW,CAIhB;QACA,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,MAAM,EACJ,SAAS,EAAE,QAAQ,EACnB,UAAU,EAAE,EAAE,MAAM,EAAE,GACvB,GAAG,SAAS,CAAA;YACb,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,IAAI,mBAAmB,EAAE,CAAA;YACpD,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAM;YAC1B,IAAI,MAAM;gBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,MAAM;gBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;QACnE,CAAC;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;YACtB,WAAW,CAAC,YAAY,CAAW,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE;gBACtE,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;oBACpB,OAAO,OAAO,CAAA;gBAChB,CAAC;gBAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC5B,IACE,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS;wBACxC,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,EAChC,CAAC;wBACD,OAAO,MAAM,CAAA;oBACf,CAAC;oBAED,OAAO;wBACL,GAAG,MAAM;wBACT,UAAU,EAAE;4BACV,GAAG,MAAM,CAAC,UAAU;4BACpB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM;yBACrC;qBACF,CAAA;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YAEF,WAAW,CAAC,YAAY,CACtB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,EACtD,CAAC,MAAM,EAAE,EAAE;gBACT,IAAI,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI;oBAAE,OAAO,MAAM,CAAA;gBAEpD,OAAO;oBACL,GAAG,MAAM;oBACT,UAAU,EAAE;wBACV,GAAG,MAAM,CAAC,UAAU;wBACpB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM;qBACrC;iBACF,CAAA;YACH,CAAC,CACF,CAAA;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;YACnC,MAAM,WAAW,CAAC,iBAAiB,CAAC;gBAClC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;aAC9B,CAAC,CAAA;YACF,MAAM,WAAW,CAAC,iBAAiB,CAAC;gBAClC,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;aACjE,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"use-toggle-lock.js","sourceRoot":"","sources":["../../../src/lib/seam/locks/use-toggle-lock.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,WAAW,EAEX,cAAc,GACf,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAsBhF,MAAM,UAAU,aAAa,CAC3B,SAA8B,EAAE;IAMhC,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,OAAO,WAAW,CAIhB;QACA,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,MAAM,EACJ,SAAS,EAAE,QAAQ,EACnB,UAAU,EAAE,EAAE,MAAM,EAAE,GACvB,GAAG,SAAS,CAAA;YACb,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,IAAI,mBAAmB,EAAE,CAAA;YACpD,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAM;YAC1B,IAAI,MAAM;gBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,MAAM;gBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;QACnE,CAAC;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;YACtB,WAAW,CAAC,YAAY,CAAW,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE;gBACtE,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;oBACpB,OAAO,OAAO,CAAA;gBAChB,CAAC;gBAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC5B,IACE,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS;wBACxC,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,EAChC,CAAC;wBACD,OAAO,MAAM,CAAA;oBACf,CAAC;oBAED,OAAO;wBACL,GAAG,MAAM;wBACT,UAAU,EAAE;4BACV,GAAG,MAAM,CAAC,UAAU;4BACpB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM;yBACrC;qBACF,CAAA;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YAEF,WAAW,CAAC,YAAY,CACtB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,EACtD,CAAC,MAAM,EAAE,EAAE;gBACT,IAAI,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI;oBAAE,OAAO,MAAM,CAAA;gBAEpD,OAAO;oBACL,GAAG,MAAM;oBACT,UAAU,EAAE;wBACV,GAAG,MAAM,CAAC,UAAU;wBACpB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM;qBACrC;iBACF,CAAA;YACH,CAAC,CACF,CAAA;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;YACnC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAA;YAElB,MAAM,WAAW,CAAC,iBAAiB,CAAC;gBAClC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;aAC9B,CAAC,CAAA;YACF,MAAM,WAAW,CAAC,iBAAiB,CAAC;gBAClC,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;aACjE,CAAC,CAAA;QACJ,CAAC;QACD,SAAS;YACP,MAAM,CAAC,SAAS,EAAE,EAAE,CAAA;QACtB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
- type SnackbarVariant = 'success' | 'error';
3
- interface SnackbarProps {
2
+ export type SnackbarVariant = 'success' | 'error';
3
+ export interface SnackbarProps {
4
4
  message: string;
5
5
  variant: SnackbarVariant;
6
6
  visible: boolean;
@@ -15,4 +15,3 @@ interface SnackbarProps {
15
15
  automaticVisibility?: boolean;
16
16
  }
17
17
  export declare function Snackbar({ message, variant, visible, action, autoDismiss, dismissAfterMs, disableCloseButton, automaticVisibility, onClose, }: SnackbarProps): JSX.Element;
18
- export {};
package/lib/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- declare const seamapiReactVersion = "4.4.0";
1
+ declare const seamapiReactVersion = "4.5.0";
2
2
  export default seamapiReactVersion;
package/lib/version.js CHANGED
@@ -1,3 +1,3 @@
1
- const seamapiReactVersion = '4.4.0';
1
+ const seamapiReactVersion = '4.5.0';
2
2
  export default seamapiReactVersion;
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamapi/react",
3
- "version": "4.4.0",
3
+ "version": "4.5.0",
4
4
  "description": "Seam Components.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -1,8 +1,11 @@
1
+ import { useState } from 'react'
2
+
1
3
  import { useDevice } from 'lib/seam/devices/use-device.js'
2
4
  import { isLockDevice, type LockDevice } from 'lib/seam/locks/lock-device.js'
3
5
  import { useToggleLock } from 'lib/seam/locks/use-toggle-lock.js'
4
6
  import { Button } from 'lib/ui/Button.js'
5
7
  import { DeviceImage } from 'lib/ui/device/DeviceImage.js'
8
+ import { Snackbar, type SnackbarVariant } from 'lib/ui/Snackbar/Snackbar.js'
6
9
  import { TextButton } from 'lib/ui/TextButton.js'
7
10
 
8
11
  export function AccessCodeDevice({
@@ -49,35 +52,64 @@ function Content(props: {
49
52
  onSelectDevice: (deviceId: string) => void
50
53
  }): JSX.Element {
51
54
  const { device, disableLockUnlock, onSelectDevice } = props
52
- const toggleLock = useToggleLock()
55
+ const [snackbarVisible, setSnackbarVisible] = useState(false)
56
+ const [snackbarVariant, setSnackbarVariant] =
57
+ useState<SnackbarVariant>('success')
58
+
59
+ const toggleLock = useToggleLock({
60
+ onSuccess: () => {
61
+ setSnackbarVisible(true)
62
+ setSnackbarVariant('success')
63
+ },
64
+ onError: () => {
65
+ setSnackbarVisible(true)
66
+ setSnackbarVariant('error')
67
+ },
68
+ })
53
69
 
54
70
  const toggleLockLabel = device.properties.locked ? t.unlock : t.lock
55
71
 
56
72
  return (
57
- <div className='seam-access-code-device'>
58
- <div className='seam-device-image'>
59
- <DeviceImage device={device} />
60
- </div>
61
- <div className='seam-body'>
62
- <div>{device.properties.name}</div>
63
- <TextButton
64
- onClick={() => {
65
- onSelectDevice(device.device_id)
66
- }}
67
- >
68
- {t.deviceDetails}
69
- </TextButton>
73
+ <>
74
+ <Snackbar
75
+ variant={snackbarVariant}
76
+ visible={snackbarVisible}
77
+ onClose={() => {
78
+ setSnackbarVisible(false)
79
+ }}
80
+ message={
81
+ snackbarVariant === 'success'
82
+ ? t.successfullyUpdated
83
+ : t.failedToUpdate
84
+ }
85
+ autoDismiss
86
+ />
87
+
88
+ <div className='seam-access-code-device'>
89
+ <div className='seam-device-image'>
90
+ <DeviceImage device={device} />
91
+ </div>
92
+ <div className='seam-body'>
93
+ <div>{device.properties.name}</div>
94
+ <TextButton
95
+ onClick={() => {
96
+ onSelectDevice(device.device_id)
97
+ }}
98
+ >
99
+ {t.deviceDetails}
100
+ </TextButton>
101
+ </div>
102
+ {!disableLockUnlock && device.properties.online && (
103
+ <Button
104
+ onClick={() => {
105
+ toggleLock.mutate(device)
106
+ }}
107
+ >
108
+ {toggleLockLabel}
109
+ </Button>
110
+ )}
70
111
  </div>
71
- {!disableLockUnlock && device.properties.online && (
72
- <Button
73
- onClick={() => {
74
- toggleLock.mutate(device)
75
- }}
76
- >
77
- {toggleLockLabel}
78
- </Button>
79
- )}
80
- </div>
112
+ </>
81
113
  )
82
114
  }
83
115
 
@@ -85,4 +117,6 @@ const t = {
85
117
  deviceDetails: 'Device details',
86
118
  unlock: 'Unlock',
87
119
  lock: 'Lock',
120
+ successfullyUpdated: 'Lock status has been successfully updated',
121
+ failedToUpdate: 'Failed to update lock status',
88
122
  }
@@ -1,4 +1,5 @@
1
1
  import classNames from 'classnames'
2
+ import { useState } from 'react'
2
3
 
3
4
  import { ChevronRightIcon } from 'lib/icons/ChevronRight.js'
4
5
  import { useAccessCodes } from 'lib/seam/access-codes/use-access-codes.js'
@@ -16,6 +17,7 @@ import { DeviceImage } from 'lib/ui/device/DeviceImage.js'
16
17
  import { EditableDeviceName } from 'lib/ui/device/EditableDeviceName.js'
17
18
  import { OnlineStatus } from 'lib/ui/device/OnlineStatus.js'
18
19
  import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
20
+ import { Snackbar, type SnackbarVariant } from 'lib/ui/Snackbar/Snackbar.js'
19
21
  import { useToggle } from 'lib/ui/use-toggle.js'
20
22
 
21
23
  interface LockDeviceDetailsProps extends NestedSpecificDeviceDetailsProps {
@@ -38,11 +40,25 @@ export function LockDeviceDetails({
38
40
  onEditName,
39
41
  }: LockDeviceDetailsProps): JSX.Element | null {
40
42
  const [accessCodesOpen, toggleAccessCodesOpen] = useToggle()
41
- const toggleLock = useToggleLock()
42
43
  const { accessCodes } = useAccessCodes({
43
44
  device_id: device.device_id,
44
45
  })
45
46
 
47
+ const [snackbarVisible, setSnackbarVisible] = useState(false)
48
+ const [snackbarVariant, setSnackbarVariant] =
49
+ useState<SnackbarVariant>('success')
50
+
51
+ const toggleLock = useToggleLock({
52
+ onSuccess: () => {
53
+ setSnackbarVisible(true)
54
+ setSnackbarVariant('success')
55
+ },
56
+ onError: () => {
57
+ setSnackbarVisible(true)
58
+ setSnackbarVariant('error')
59
+ },
60
+ })
61
+
46
62
  const lockStatus = device.properties.locked ? t.locked : t.unlocked
47
63
  const toggleLockLabel = device.properties.locked ? t.unlock : t.lock
48
64
 
@@ -88,87 +104,103 @@ export function LockDeviceDetails({
88
104
  ]
89
105
 
90
106
  return (
91
- <div className={classNames('seam-device-details', className)}>
92
- <ContentHeader title='Device' onBack={onBack} />
93
- <div className='seam-body'>
94
- <div className='seam-summary'>
95
- <div className='seam-content'>
96
- <div className='seam-image'>
97
- <DeviceImage device={device} />
98
- </div>
99
- <div className='seam-info'>
100
- <span className='seam-label'>{t.device}</span>
101
- <EditableDeviceName
102
- tagName='h4'
103
- value={device.properties.name}
104
- className='seam-device-name'
105
- onEdit={onEditName}
106
- />
107
- <div className='seam-properties'>
108
- <span className='seam-label'>{t.status}:</span>{' '}
109
- <OnlineStatus device={device} />
110
- {device.properties.online && (
111
- <>
112
- <span className='seam-label'>{t.power}:</span>{' '}
113
- <BatteryStatusIndicator device={device} />
114
- </>
115
- )}
116
- <DeviceModel device={device} />
107
+ <>
108
+ <Snackbar
109
+ variant={snackbarVariant}
110
+ visible={snackbarVisible}
111
+ onClose={() => {
112
+ setSnackbarVisible(false)
113
+ }}
114
+ message={
115
+ snackbarVariant === 'success'
116
+ ? t.successfullyUpdated
117
+ : t.failedToUpdate
118
+ }
119
+ autoDismiss
120
+ />
121
+
122
+ <div className={classNames('seam-device-details', className)}>
123
+ <ContentHeader title='Device' onBack={onBack} />
124
+ <div className='seam-body'>
125
+ <div className='seam-summary'>
126
+ <div className='seam-content'>
127
+ <div className='seam-image'>
128
+ <DeviceImage device={device} />
129
+ </div>
130
+ <div className='seam-info'>
131
+ <span className='seam-label'>{t.device}</span>
132
+ <EditableDeviceName
133
+ tagName='h4'
134
+ value={device.properties.name}
135
+ className='seam-device-name'
136
+ onEdit={onEditName}
137
+ />
138
+ <div className='seam-properties'>
139
+ <span className='seam-label'>{t.status}:</span>{' '}
140
+ <OnlineStatus device={device} />
141
+ {device.properties.online && (
142
+ <>
143
+ <span className='seam-label'>{t.power}:</span>{' '}
144
+ <BatteryStatusIndicator device={device} />
145
+ </>
146
+ )}
147
+ <DeviceModel device={device} />
148
+ </div>
117
149
  </div>
118
150
  </div>
151
+ <Alerts alerts={alerts} className='seam-alerts-space-top' />
119
152
  </div>
120
- <Alerts alerts={alerts} className='seam-alerts-space-top' />
121
- </div>
122
- <div className='seam-box'>
123
- <div
124
- className='seam-content seam-access-codes'
125
- onClick={toggleAccessCodesOpen}
126
- >
127
- <span className='seam-value'>
128
- {accessCodeCount} {t.accessCodes}
129
- </span>
130
- <ChevronRightIcon />
153
+ <div className='seam-box'>
154
+ <div
155
+ className='seam-content seam-access-codes'
156
+ onClick={toggleAccessCodesOpen}
157
+ >
158
+ <span className='seam-value'>
159
+ {accessCodeCount} {t.accessCodes}
160
+ </span>
161
+ <ChevronRightIcon />
162
+ </div>
131
163
  </div>
132
- </div>
133
164
 
134
- <div className='seam-box'>
135
- {device.properties.locked && device.properties.online && (
136
- <div className='seam-content seam-lock-status'>
137
- <div>
138
- <span className='seam-label'>{t.lockStatus}</span>
139
- <span className='seam-value'>{lockStatus}</span>
140
- </div>
141
- <div className='seam-right'>
142
- {!disableLockUnlock &&
143
- device.capabilities_supported.includes('lock') && (
144
- <Button
145
- size='small'
146
- onClick={() => {
147
- toggleLock.mutate(device)
148
- }}
149
- >
150
- {toggleLockLabel}
151
- </Button>
152
- )}
165
+ <div className='seam-box'>
166
+ {device.properties.locked && device.properties.online && (
167
+ <div className='seam-content seam-lock-status'>
168
+ <div>
169
+ <span className='seam-label'>{t.lockStatus}</span>
170
+ <span className='seam-value'>{lockStatus}</span>
171
+ </div>
172
+ <div className='seam-right'>
173
+ {!disableLockUnlock &&
174
+ device.capabilities_supported.includes('lock') && (
175
+ <Button
176
+ size='small'
177
+ onClick={() => {
178
+ toggleLock.mutate(device)
179
+ }}
180
+ >
181
+ {toggleLockLabel}
182
+ </Button>
183
+ )}
184
+ </div>
153
185
  </div>
154
- </div>
155
- )}
186
+ )}
156
187
 
157
- <AccessCodeLength
158
- supportedCodeLengths={
159
- device.properties?.supported_code_lengths ?? []
188
+ <AccessCodeLength
189
+ supportedCodeLengths={
190
+ device.properties?.supported_code_lengths ?? []
191
+ }
192
+ />
193
+ </div>
194
+ <DeviceInfo
195
+ device={device}
196
+ disableConnectedAccountInformation={
197
+ disableConnectedAccountInformation
160
198
  }
199
+ disableResourceIds={disableResourceIds}
161
200
  />
162
201
  </div>
163
- <DeviceInfo
164
- device={device}
165
- disableConnectedAccountInformation={
166
- disableConnectedAccountInformation
167
- }
168
- disableResourceIds={disableResourceIds}
169
- />
170
202
  </div>
171
- </div>
203
+ </>
172
204
  )
173
205
  }
174
206
 
@@ -208,4 +240,6 @@ const t = {
208
240
  lockStatus: 'Lock status',
209
241
  status: 'Status',
210
242
  power: 'Power',
243
+ successfullyUpdated: 'Lock status has been successfully updated',
244
+ failedToUpdate: 'Failed to update lock status',
211
245
  }
@@ -12,8 +12,6 @@ import {
12
12
 
13
13
  import { NullSeamClientError, useSeamClient } from 'lib/seam/use-seam-client.js'
14
14
 
15
- export type UseToggleLockParams = never
16
-
17
15
  export type UseToggleLockData = undefined
18
16
 
19
17
  export type UseToggleLockMutationVariables = Pick<Device, 'device_id'> & {
@@ -29,7 +27,14 @@ type MutationError =
29
27
  | SeamActionAttemptFailedError<ToggleLockActionAttempt>
30
28
  | SeamActionAttemptTimeoutError<ToggleLockActionAttempt>
31
29
 
32
- export function useToggleLock(): UseMutationResult<
30
+ interface UseToggleLockParams {
31
+ onError?: () => void
32
+ onSuccess?: () => void
33
+ }
34
+
35
+ export function useToggleLock(
36
+ params: UseToggleLockParams = {}
37
+ ): UseMutationResult<
33
38
  UseToggleLockData,
34
39
  MutationError,
35
40
  UseToggleLockMutationVariables
@@ -92,6 +97,8 @@ export function useToggleLock(): UseMutationResult<
92
97
  )
93
98
  },
94
99
  onError: async (_error, variables) => {
100
+ params.onError?.()
101
+
95
102
  await queryClient.invalidateQueries({
96
103
  queryKey: ['devices', 'list'],
97
104
  })
@@ -99,5 +106,8 @@ export function useToggleLock(): UseMutationResult<
99
106
  queryKey: ['devices', 'get', { device_id: variables.device_id }],
100
107
  })
101
108
  },
109
+ onSuccess() {
110
+ params.onSuccess?.()
111
+ },
102
112
  })
103
113
  }