@seamapi/react 4.13.0 → 4.13.2

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.
@@ -6,10 +6,9 @@ import { useAccessCodes } from '../../../../lib/seam/access-codes/use-access-cod
6
6
  import { NestedAccessCodeTable } from '../../../../lib/seam/components/AccessCodeTable/AccessCodeTable.js';
7
7
  import { DeviceInfo } from '../../../../lib/seam/components/DeviceDetails/DeviceInfo.js';
8
8
  import { DeviceModel } from '../../../../lib/seam/components/DeviceDetails/DeviceModel.js';
9
+ import { LockDeviceLockButtons } from '../../../../lib/seam/components/DeviceDetails/LockDeviceLockButtons.js';
9
10
  import { deviceErrorFilter, deviceWarningFilter } from '../../../../lib/seam/filters.js';
10
- import { useToggleLock } from '../../../../lib/seam/locks/use-toggle-lock.js';
11
11
  import { Alerts } from '../../../../lib/ui/Alert/Alerts.js';
12
- import { Button } from '../../../../lib/ui/Button.js';
13
12
  import { BatteryStatusIndicator } from '../../../../lib/ui/device/BatteryStatusIndicator.js';
14
13
  import { DeviceImage } from '../../../../lib/ui/device/DeviceImage.js';
15
14
  import { EditableDeviceName } from '../../../../lib/ui/device/EditableDeviceName.js';
@@ -24,22 +23,7 @@ export function LockDeviceDetails({ device, errorFilter, warningFilter, disableL
24
23
  });
25
24
  const [snackbarVisible, setSnackbarVisible] = useState(false);
26
25
  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
- });
37
- const lockStatus = device.properties.locked ? t.locked : t.unlocked;
38
- const toggleLockLabel = device.properties.locked ? t.unlock : t.lock;
39
- const accessCodeCount = accessCodes?.length;
40
- if (accessCodes == null) {
41
- return null;
42
- }
26
+ const accessCodeCount = accessCodes?.length ?? 0;
43
27
  if (accessCodesOpen) {
44
28
  return (_jsx(NestedAccessCodeTable, { deviceId: device.device_id, errorFilter: errorFilter, warningFilter: warningFilter, disableLockUnlock: disableLockUnlock, disableCreateAccessCode: disableCreateAccessCode, disableEditAccessCode: disableEditAccessCode, disableDeleteAccessCode: disableDeleteAccessCode, disableResourceIds: disableResourceIds, disableConnectedAccountInformation: disableConnectedAccountInformation, onBack: toggleAccessCodesOpen, className: className }));
45
29
  }
@@ -63,10 +47,9 @@ export function LockDeviceDetails({ device, errorFilter, warningFilter, disableL
63
47
  setSnackbarVisible(false);
64
48
  }, message: snackbarVariant === 'success'
65
49
  ? 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 })] })] })] }));
50
+ : 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: classNames('seam-content seam-access-codes', {
51
+ disabled: accessCodes == null,
52
+ }), onClick: accessCodes != null ? toggleAccessCodesOpen : undefined, children: [_jsxs("span", { className: 'seam-value', children: [accessCodes != null ? accessCodeCount : '–', " ", t.accessCodes] }), accessCodes != null && _jsx(ChevronRightIcon, {})] }) }), _jsxs("div", { className: 'seam-box', children: [_jsx(LockDeviceLockButtons, { setSnackbarVisible: setSnackbarVisible, setSnackbarVariant: setSnackbarVariant, device: device, disableLockUnlock: disableLockUnlock }), _jsx(AccessCodeLength, { supportedCodeLengths: device.properties?.supported_code_lengths ?? [] })] }), _jsx(DeviceInfo, { device: device, disableConnectedAccountInformation: disableConnectedAccountInformation, disableResourceIds: disableResourceIds })] })] })] }));
70
53
  }
71
54
  function AccessCodeLength(props) {
72
55
  const { supportedCodeLengths } = props;
@@ -80,14 +63,9 @@ function AccessCodeLength(props) {
80
63
  }
81
64
  const t = {
82
65
  device: 'Device',
83
- unlock: 'Unlock',
84
- lock: 'Lock',
85
- locked: 'Locked',
86
- unlocked: 'Unlocked',
87
66
  accessCodes: 'access codes',
88
67
  codeLength: 'Code length',
89
68
  digits: 'digits',
90
- lockStatus: 'Lock status',
91
69
  status: 'Status',
92
70
  power: 'Power',
93
71
  successfullyUpdated: 'Lock status has been successfully updated',
@@ -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":"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"}
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ import type { LockDevice } from '../../../../lib/seam/locks/lock-device.js';
3
+ import type { SnackbarVariant } from '../../../../lib/ui/Snackbar/Snackbar.js';
4
+ interface LockDeviceLockButtonsProps {
5
+ device: LockDevice;
6
+ disableLockUnlock: boolean;
7
+ setSnackbarVisible: (visible: boolean) => void;
8
+ setSnackbarVariant: (variant: SnackbarVariant) => void;
9
+ }
10
+ export declare function LockDeviceLockButtons({ device, setSnackbarVariant, setSnackbarVisible, disableLockUnlock, }: LockDeviceLockButtonsProps): JSX.Element | null;
11
+ export {};
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useLock } from '../../../../lib/seam/locks/use-lock-door.js';
3
+ import { useToggleLock } from '../../../../lib/seam/locks/use-toggle-lock.js';
4
+ import { useUnlock } from '../../../../lib/seam/locks/use-unlock-door.js';
5
+ import { Button } from '../../../../lib/ui/Button.js';
6
+ export function LockDeviceLockButtons({ device, setSnackbarVariant, setSnackbarVisible, disableLockUnlock, }) {
7
+ const lockStatus = device.properties.locked ? t.locked : t.unlocked;
8
+ const toggleLockLabel = device.properties.locked ? t.unlock : t.lock;
9
+ const toggleLock = useToggleLock({
10
+ onSuccess: () => {
11
+ setSnackbarVisible(true);
12
+ setSnackbarVariant('success');
13
+ },
14
+ onError: () => {
15
+ setSnackbarVisible(true);
16
+ setSnackbarVariant('error');
17
+ },
18
+ });
19
+ const lock = useLock({
20
+ onSuccess: () => {
21
+ setSnackbarVisible(true);
22
+ setSnackbarVariant('success');
23
+ },
24
+ onError: () => {
25
+ setSnackbarVisible(true);
26
+ setSnackbarVariant('error');
27
+ },
28
+ });
29
+ const unlock = useUnlock({
30
+ onSuccess: () => {
31
+ setSnackbarVisible(true);
32
+ setSnackbarVariant('success');
33
+ },
34
+ onError: () => {
35
+ setSnackbarVisible(true);
36
+ setSnackbarVariant('error');
37
+ },
38
+ });
39
+ if (disableLockUnlock) {
40
+ return null;
41
+ }
42
+ if (device.can_remotely_lock === true &&
43
+ device.can_remotely_unlock === true) {
44
+ return (_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: _jsx(Button, { size: 'small', onClick: () => {
45
+ toggleLock.mutate(device);
46
+ }, children: toggleLockLabel }) })] }));
47
+ }
48
+ if (device.can_remotely_lock === true) {
49
+ return (_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: _jsx(Button, { size: 'small', onClick: () => {
50
+ lock.mutate(device);
51
+ }, children: t.lock }) })] }));
52
+ }
53
+ if (device.can_remotely_unlock === true) {
54
+ return (_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: _jsx(Button, { size: 'small', onClick: () => {
55
+ unlock.mutate(device);
56
+ }, children: t.unlock }) })] }));
57
+ }
58
+ return null;
59
+ }
60
+ const t = {
61
+ unlock: 'Unlock',
62
+ lock: 'Lock',
63
+ locked: 'Locked',
64
+ unlocked: 'Unlocked',
65
+ lockStatus: 'Lock status',
66
+ statusUnknown: 'Unknown',
67
+ };
68
+ //# sourceMappingURL=LockDeviceLockButtons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LockDeviceLockButtons.js","sourceRoot":"","sources":["../../../../src/lib/seam/components/DeviceDetails/LockDeviceLockButtons.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { SeamActionAttemptFailedError, SeamActionAttemptTimeoutError, SeamHttpApiError } from '@seamapi/http/connect';
2
+ import type { ActionAttempt, Device } from '@seamapi/types/connect';
3
+ import { type UseMutationResult } from '@tanstack/react-query';
4
+ export type UseLockData = undefined;
5
+ export type UseLockMutationVariables = Pick<Device, 'device_id'> & {
6
+ properties: Required<Pick<Device['properties'], 'locked'>>;
7
+ };
8
+ type LockActionAttempt = Extract<ActionAttempt, {
9
+ action_type: 'LOCK_DOOR';
10
+ }>;
11
+ type MutationError = SeamHttpApiError | SeamActionAttemptFailedError<LockActionAttempt> | SeamActionAttemptTimeoutError<LockActionAttempt>;
12
+ interface UseLockParams {
13
+ onError?: () => void;
14
+ onSuccess?: () => void;
15
+ }
16
+ export declare function useLock(params?: UseLockParams): UseMutationResult<UseLockData, MutationError, UseLockMutationVariables>;
17
+ export {};
@@ -0,0 +1,60 @@
1
+ import { NullSeamClientError, useSeamClient } from '@seamapi/react-query';
2
+ import { useMutation, useQueryClient, } from '@tanstack/react-query';
3
+ export function useLock(params = {}) {
4
+ const { client } = useSeamClient();
5
+ const queryClient = useQueryClient();
6
+ return useMutation({
7
+ mutationFn: async (variables) => {
8
+ const { device_id: deviceId, properties: { locked }, } = variables;
9
+ if (client === null)
10
+ throw new NullSeamClientError();
11
+ if (locked == null)
12
+ return;
13
+ await client.locks.lockDoor({ device_id: deviceId });
14
+ },
15
+ onMutate: (variables) => {
16
+ queryClient.setQueryData(['devices', 'list', {}], (devices) => {
17
+ if (devices == null) {
18
+ return devices;
19
+ }
20
+ return devices.map((device) => {
21
+ if (device.device_id !== variables.device_id ||
22
+ device.properties.locked == null) {
23
+ return device;
24
+ }
25
+ return {
26
+ ...device,
27
+ properties: {
28
+ ...device.properties,
29
+ locked: !variables.properties.locked,
30
+ },
31
+ };
32
+ });
33
+ });
34
+ queryClient.setQueryData(['devices', 'get', { device_id: variables.device_id }], (device) => {
35
+ if (device?.properties.locked == null)
36
+ return device;
37
+ return {
38
+ ...device,
39
+ properties: {
40
+ ...device.properties,
41
+ locked: !variables.properties.locked,
42
+ },
43
+ };
44
+ });
45
+ },
46
+ onError: async (_error, variables) => {
47
+ params.onError?.();
48
+ await queryClient.invalidateQueries({
49
+ queryKey: ['devices', 'list'],
50
+ });
51
+ await queryClient.invalidateQueries({
52
+ queryKey: ['devices', 'get', { device_id: variables.device_id }],
53
+ });
54
+ },
55
+ onSuccess() {
56
+ params.onSuccess?.();
57
+ },
58
+ });
59
+ }
60
+ //# sourceMappingURL=use-lock-door.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-lock-door.js","sourceRoot":"","sources":["../../../src/lib/seam/locks/use-lock-door.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzE,OAAO,EACL,WAAW,EAEX,cAAc,GACf,MAAM,uBAAuB,CAAA;AAoB9B,MAAM,UAAU,OAAO,CACrB,SAAwB,EAAE;IAE1B,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,OAAO,WAAW,CAAuD;QACvE,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,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;QACtD,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"}
@@ -0,0 +1,17 @@
1
+ import type { SeamActionAttemptFailedError, SeamActionAttemptTimeoutError, SeamHttpApiError } from '@seamapi/http/connect';
2
+ import type { ActionAttempt, Device } from '@seamapi/types/connect';
3
+ import { type UseMutationResult } from '@tanstack/react-query';
4
+ export type UseUnlockData = undefined;
5
+ export type UseUnlockMutationVariables = Pick<Device, 'device_id'> & {
6
+ properties: Required<Pick<Device['properties'], 'locked'>>;
7
+ };
8
+ type UnlockActionAttempt = Extract<ActionAttempt, {
9
+ action_type: 'UNLOCK_DOOR';
10
+ }>;
11
+ type MutationError = SeamHttpApiError | SeamActionAttemptFailedError<UnlockActionAttempt> | SeamActionAttemptTimeoutError<UnlockActionAttempt>;
12
+ interface UseUnlockParams {
13
+ onError?: () => void;
14
+ onSuccess?: () => void;
15
+ }
16
+ export declare function useUnlock(params?: UseUnlockParams): UseMutationResult<UseUnlockData, MutationError, UseUnlockMutationVariables>;
17
+ export {};
@@ -0,0 +1,60 @@
1
+ import { NullSeamClientError, useSeamClient } from '@seamapi/react-query';
2
+ import { useMutation, useQueryClient, } from '@tanstack/react-query';
3
+ export function useUnlock(params = {}) {
4
+ const { client } = useSeamClient();
5
+ const queryClient = useQueryClient();
6
+ return useMutation({
7
+ mutationFn: async (variables) => {
8
+ const { device_id: deviceId, properties: { locked }, } = variables;
9
+ if (client === null)
10
+ throw new NullSeamClientError();
11
+ if (locked == null)
12
+ return;
13
+ await client.locks.unlockDoor({ device_id: deviceId });
14
+ },
15
+ onMutate: (variables) => {
16
+ queryClient.setQueryData(['devices', 'list', {}], (devices) => {
17
+ if (devices == null) {
18
+ return devices;
19
+ }
20
+ return devices.map((device) => {
21
+ if (device.device_id !== variables.device_id ||
22
+ device.properties.locked == null) {
23
+ return device;
24
+ }
25
+ return {
26
+ ...device,
27
+ properties: {
28
+ ...device.properties,
29
+ locked: !variables.properties.locked,
30
+ },
31
+ };
32
+ });
33
+ });
34
+ queryClient.setQueryData(['devices', 'get', { device_id: variables.device_id }], (device) => {
35
+ if (device?.properties.locked == null)
36
+ return device;
37
+ return {
38
+ ...device,
39
+ properties: {
40
+ ...device.properties,
41
+ locked: !variables.properties.locked,
42
+ },
43
+ };
44
+ });
45
+ },
46
+ onError: async (_error, variables) => {
47
+ params.onError?.();
48
+ await queryClient.invalidateQueries({
49
+ queryKey: ['devices', 'list'],
50
+ });
51
+ await queryClient.invalidateQueries({
52
+ queryKey: ['devices', 'get', { device_id: variables.device_id }],
53
+ });
54
+ },
55
+ onSuccess() {
56
+ params.onSuccess?.();
57
+ },
58
+ });
59
+ }
60
+ //# sourceMappingURL=use-unlock-door.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-unlock-door.js","sourceRoot":"","sources":["../../../src/lib/seam/locks/use-unlock-door.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzE,OAAO,EACL,WAAW,EAEX,cAAc,GACf,MAAM,uBAAuB,CAAA;AAuB9B,MAAM,UAAU,SAAS,CACvB,SAA0B,EAAE;IAE5B,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,OAAO,WAAW,CAA2D;QAC3E,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,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;QACxD,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"}
package/lib/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- declare const seamapiReactVersion = "4.13.0";
1
+ declare const seamapiReactVersion = "4.13.2";
2
2
  export default seamapiReactVersion;
package/lib/version.js CHANGED
@@ -1,3 +1,3 @@
1
- const seamapiReactVersion = '4.13.0';
1
+ const seamapiReactVersion = '4.13.2';
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.13.0",
3
+ "version": "4.13.2",
4
4
  "description": "Seam Components.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -7,11 +7,10 @@ import { NestedAccessCodeTable } from 'lib/seam/components/AccessCodeTable/Acces
7
7
  import type { NestedSpecificDeviceDetailsProps } from 'lib/seam/components/DeviceDetails/DeviceDetails.js'
8
8
  import { DeviceInfo } from 'lib/seam/components/DeviceDetails/DeviceInfo.js'
9
9
  import { DeviceModel } from 'lib/seam/components/DeviceDetails/DeviceModel.js'
10
+ import { LockDeviceLockButtons } from 'lib/seam/components/DeviceDetails/LockDeviceLockButtons.js'
10
11
  import { deviceErrorFilter, deviceWarningFilter } from 'lib/seam/filters.js'
11
12
  import type { LockDevice } from 'lib/seam/locks/lock-device.js'
12
- import { useToggleLock } from 'lib/seam/locks/use-toggle-lock.js'
13
13
  import { Alerts } from 'lib/ui/Alert/Alerts.js'
14
- import { Button } from 'lib/ui/Button.js'
15
14
  import { BatteryStatusIndicator } from 'lib/ui/device/BatteryStatusIndicator.js'
16
15
  import { DeviceImage } from 'lib/ui/device/DeviceImage.js'
17
16
  import { EditableDeviceName } from 'lib/ui/device/EditableDeviceName.js'
@@ -48,25 +47,7 @@ export function LockDeviceDetails({
48
47
  const [snackbarVariant, setSnackbarVariant] =
49
48
  useState<SnackbarVariant>('success')
50
49
 
51
- const toggleLock = useToggleLock({
52
- onSuccess: () => {
53
- setSnackbarVisible(true)
54
- setSnackbarVariant('success')
55
- },
56
- onError: () => {
57
- setSnackbarVisible(true)
58
- setSnackbarVariant('error')
59
- },
60
- })
61
-
62
- const lockStatus = device.properties.locked ? t.locked : t.unlocked
63
- const toggleLockLabel = device.properties.locked ? t.unlock : t.lock
64
-
65
- const accessCodeCount = accessCodes?.length
66
-
67
- if (accessCodes == null) {
68
- return null
69
- }
50
+ const accessCodeCount = accessCodes?.length ?? 0
70
51
 
71
52
  if (accessCodesOpen) {
72
53
  return (
@@ -152,39 +133,25 @@ export function LockDeviceDetails({
152
133
  </div>
153
134
  <div className='seam-box'>
154
135
  <div
155
- className='seam-content seam-access-codes'
156
- onClick={toggleAccessCodesOpen}
136
+ className={classNames('seam-content seam-access-codes', {
137
+ disabled: accessCodes == null,
138
+ })}
139
+ onClick={accessCodes != null ? toggleAccessCodesOpen : undefined}
157
140
  >
158
141
  <span className='seam-value'>
159
- {accessCodeCount} {t.accessCodes}
142
+ {accessCodes != null ? accessCodeCount : '–'} {t.accessCodes}
160
143
  </span>
161
- <ChevronRightIcon />
144
+ {accessCodes != null && <ChevronRightIcon />}
162
145
  </div>
163
146
  </div>
164
147
 
165
148
  <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>
185
- </div>
186
- )}
187
-
149
+ <LockDeviceLockButtons
150
+ setSnackbarVisible={setSnackbarVisible}
151
+ setSnackbarVariant={setSnackbarVariant}
152
+ device={device}
153
+ disableLockUnlock={disableLockUnlock}
154
+ />
188
155
  <AccessCodeLength
189
156
  supportedCodeLengths={
190
157
  device.properties?.supported_code_lengths ?? []
@@ -230,14 +197,9 @@ function AccessCodeLength(props: {
230
197
 
231
198
  const t = {
232
199
  device: 'Device',
233
- unlock: 'Unlock',
234
- lock: 'Lock',
235
- locked: 'Locked',
236
- unlocked: 'Unlocked',
237
200
  accessCodes: 'access codes',
238
201
  codeLength: 'Code length',
239
202
  digits: 'digits',
240
- lockStatus: 'Lock status',
241
203
  status: 'Status',
242
204
  power: 'Power',
243
205
  successfullyUpdated: 'Lock status has been successfully updated',
@@ -0,0 +1,137 @@
1
+ import type { LockDevice } from 'lib/seam/locks/lock-device.js'
2
+ import { useLock } from 'lib/seam/locks/use-lock-door.js'
3
+ import { useToggleLock } from 'lib/seam/locks/use-toggle-lock.js'
4
+ import { useUnlock } from 'lib/seam/locks/use-unlock-door.js'
5
+ import { Button } from 'lib/ui/Button.js'
6
+ import type { SnackbarVariant } from 'lib/ui/Snackbar/Snackbar.js'
7
+
8
+ interface LockDeviceLockButtonsProps {
9
+ device: LockDevice
10
+ disableLockUnlock: boolean
11
+ setSnackbarVisible: (visible: boolean) => void
12
+ setSnackbarVariant: (variant: SnackbarVariant) => void
13
+ }
14
+
15
+ export function LockDeviceLockButtons({
16
+ device,
17
+ setSnackbarVariant,
18
+ setSnackbarVisible,
19
+ disableLockUnlock,
20
+ }: LockDeviceLockButtonsProps): JSX.Element | null {
21
+ const lockStatus = device.properties.locked ? t.locked : t.unlocked
22
+ const toggleLockLabel = device.properties.locked ? t.unlock : t.lock
23
+
24
+ const toggleLock = useToggleLock({
25
+ onSuccess: () => {
26
+ setSnackbarVisible(true)
27
+ setSnackbarVariant('success')
28
+ },
29
+ onError: () => {
30
+ setSnackbarVisible(true)
31
+ setSnackbarVariant('error')
32
+ },
33
+ })
34
+
35
+ const lock = useLock({
36
+ onSuccess: () => {
37
+ setSnackbarVisible(true)
38
+ setSnackbarVariant('success')
39
+ },
40
+ onError: () => {
41
+ setSnackbarVisible(true)
42
+ setSnackbarVariant('error')
43
+ },
44
+ })
45
+
46
+ const unlock = useUnlock({
47
+ onSuccess: () => {
48
+ setSnackbarVisible(true)
49
+ setSnackbarVariant('success')
50
+ },
51
+ onError: () => {
52
+ setSnackbarVisible(true)
53
+ setSnackbarVariant('error')
54
+ },
55
+ })
56
+
57
+ if (disableLockUnlock) {
58
+ return null
59
+ }
60
+
61
+ if (
62
+ device.can_remotely_lock === true &&
63
+ device.can_remotely_unlock === true
64
+ ) {
65
+ return (
66
+ <div className='seam-content seam-lock-status'>
67
+ <div>
68
+ <span className='seam-label'>{t.lockStatus}</span>
69
+ <span className='seam-value'>{lockStatus}</span>
70
+ </div>
71
+ <div className='seam-right'>
72
+ <Button
73
+ size='small'
74
+ onClick={() => {
75
+ toggleLock.mutate(device)
76
+ }}
77
+ >
78
+ {toggleLockLabel}
79
+ </Button>
80
+ </div>
81
+ </div>
82
+ )
83
+ }
84
+
85
+ if (device.can_remotely_lock === true) {
86
+ return (
87
+ <div className='seam-content seam-lock-status'>
88
+ <div>
89
+ <span className='seam-label'>{t.lockStatus}</span>
90
+ <span className='seam-value'>{lockStatus}</span>
91
+ </div>
92
+ <div className='seam-right'>
93
+ <Button
94
+ size='small'
95
+ onClick={() => {
96
+ lock.mutate(device)
97
+ }}
98
+ >
99
+ {t.lock}
100
+ </Button>
101
+ </div>
102
+ </div>
103
+ )
104
+ }
105
+
106
+ if (device.can_remotely_unlock === true) {
107
+ return (
108
+ <div className='seam-content seam-lock-status'>
109
+ <div>
110
+ <span className='seam-label'>{t.lockStatus}</span>
111
+ <span className='seam-value'>{lockStatus}</span>
112
+ </div>
113
+ <div className='seam-right'>
114
+ <Button
115
+ size='small'
116
+ onClick={() => {
117
+ unlock.mutate(device)
118
+ }}
119
+ >
120
+ {t.unlock}
121
+ </Button>
122
+ </div>
123
+ </div>
124
+ )
125
+ }
126
+
127
+ return null
128
+ }
129
+
130
+ const t = {
131
+ unlock: 'Unlock',
132
+ lock: 'Lock',
133
+ locked: 'Locked',
134
+ unlocked: 'Unlocked',
135
+ lockStatus: 'Lock status',
136
+ statusUnknown: 'Unknown',
137
+ }