@seamapi/react 0.18.0 → 0.19.1

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.
Files changed (71) hide show
  1. package/lib/seam/access-codes/use-access-code.d.ts +3 -2
  2. package/lib/seam/access-codes/use-access-code.js +4 -3
  3. package/lib/seam/access-codes/use-access-code.js.map +1 -1
  4. package/lib/seam/access-codes/use-access-codes.d.ts +1 -5
  5. package/lib/seam/access-codes/use-access-codes.js +2 -1
  6. package/lib/seam/access-codes/use-access-codes.js.map +1 -1
  7. package/lib/seam/devices/use-device.d.ts +2 -2
  8. package/lib/seam/devices/use-device.js.map +1 -1
  9. package/lib/seam/devices/use-devices.js +2 -1
  10. package/lib/seam/devices/use-devices.js.map +1 -1
  11. package/lib/sort-by.d.ts +5 -0
  12. package/lib/sort-by.js +9 -0
  13. package/lib/sort-by.js.map +1 -0
  14. package/lib/ui/AccessCodeDetails/AccessCodeDetails.d.ts +1 -1
  15. package/lib/ui/AccessCodeDetails/AccessCodeDetails.js +4 -2
  16. package/lib/ui/AccessCodeDetails/AccessCodeDetails.js.map +1 -1
  17. package/lib/ui/AccessCodeDetails/AccessCodeDevice.d.ts +1 -1
  18. package/lib/ui/AccessCodeDetails/AccessCodeDevice.js +1 -2
  19. package/lib/ui/AccessCodeDetails/AccessCodeDevice.js.map +1 -1
  20. package/lib/ui/AccessCodeTable/AccessCodeTable.d.ts +1 -1
  21. package/lib/ui/AccessCodeTable/AccessCodeTable.js +5 -4
  22. package/lib/ui/AccessCodeTable/AccessCodeTable.js.map +1 -1
  23. package/lib/ui/AccessCodeTable/AccessCodeTableContent.js.map +1 -1
  24. package/lib/ui/AccessCodeTable/CodeDetails.js +3 -1
  25. package/lib/ui/AccessCodeTable/CodeDetails.js.map +1 -1
  26. package/lib/ui/Button.d.ts +1 -1
  27. package/lib/ui/DeviceDetails/DeviceDetails.js +4 -4
  28. package/lib/ui/DeviceDetails/DeviceDetails.js.map +1 -1
  29. package/lib/ui/DeviceDetails/DeviceModel.js +1 -1
  30. package/lib/ui/DeviceDetails/DeviceModel.js.map +1 -1
  31. package/lib/ui/DeviceTable/DeviceTable.d.ts +1 -1
  32. package/lib/ui/DeviceTable/DeviceTable.js +9 -5
  33. package/lib/ui/DeviceTable/DeviceTable.js.map +1 -1
  34. package/lib/ui/Table/TableCell.d.ts +1 -1
  35. package/lib/ui/Table/TableCell.js +2 -2
  36. package/lib/ui/Table/TableCell.js.map +1 -1
  37. package/lib/ui/TextField/SearchTextField.d.ts +1 -1
  38. package/lib/ui/TextField/SearchTextField.js +2 -2
  39. package/lib/ui/TextField/SearchTextField.js.map +1 -1
  40. package/lib/ui/device/BatteryStatus.d.ts +1 -1
  41. package/lib/ui/layout/ContentHeader.js +1 -1
  42. package/lib/ui/layout/ContentHeader.js.map +1 -1
  43. package/lib/use-interval.d.ts +1 -0
  44. package/lib/use-interval.js +15 -0
  45. package/lib/use-interval.js.map +1 -0
  46. package/lib/use-is-date-in-past.d.ts +1 -0
  47. package/lib/use-is-date-in-past.js +20 -0
  48. package/lib/use-is-date-in-past.js.map +1 -0
  49. package/package.json +2 -3
  50. package/src/lib/seam/access-codes/use-access-code.ts +18 -8
  51. package/src/lib/seam/access-codes/use-access-codes.ts +8 -10
  52. package/src/lib/seam/devices/use-device.ts +4 -1
  53. package/src/lib/seam/devices/use-devices.ts +2 -4
  54. package/src/lib/sort-by.ts +11 -0
  55. package/src/lib/ui/AccessCodeDetails/AccessCodeDetails.tsx +9 -4
  56. package/src/lib/ui/AccessCodeDetails/AccessCodeDevice.tsx +2 -3
  57. package/src/lib/ui/AccessCodeTable/AccessCodeTable.tsx +6 -8
  58. package/src/lib/ui/AccessCodeTable/AccessCodeTableContent.tsx +1 -5
  59. package/src/lib/ui/AccessCodeTable/CodeDetails.tsx +6 -1
  60. package/src/lib/ui/Button.tsx +1 -1
  61. package/src/lib/ui/DeviceDetails/DeviceDetails.tsx +7 -4
  62. package/src/lib/ui/DeviceDetails/DeviceModel.tsx +1 -1
  63. package/src/lib/ui/DeviceTable/DeviceTable.tsx +20 -7
  64. package/src/lib/ui/Table/TableCell.tsx +2 -4
  65. package/src/lib/ui/TextField/SearchTextField.tsx +2 -2
  66. package/src/lib/ui/device/BatteryStatus.tsx +2 -2
  67. package/src/lib/ui/device/LockStatus.tsx +1 -1
  68. package/src/lib/ui/device/OnlineStatus.tsx +1 -1
  69. package/src/lib/ui/layout/ContentHeader.tsx +1 -1
  70. package/src/lib/use-interval.ts +20 -0
  71. package/src/lib/use-is-date-in-past.ts +25 -0
@@ -1,4 +1,5 @@
1
1
  import type { AccessCode, AccessCodeGetRequest } from 'seamapi';
2
+ import type { UseSeamQueryResult } from '../../../lib/seam/use-seam-query-result.js';
2
3
  export type UseAccessCodeParams = AccessCodeGetRequest | string;
3
- export type UseAccessCodeData = AccessCode;
4
- export declare function useAccessCode(params: UseAccessCodeParams): import("@tanstack/react-query").UseQueryResult<AccessCode | null, unknown>;
4
+ export type UseAccessCodeData = AccessCode | null;
5
+ export declare function useAccessCode(params: UseAccessCodeParams): UseSeamQueryResult<'accessCode', UseAccessCodeData>;
@@ -1,16 +1,17 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
2
  import { useSeamClient } from '../../../lib/seam/use-seam-client.js';
3
3
  export function useAccessCode(params) {
4
- const { client } = useSeamClient();
5
4
  const normalizedParams = typeof params === 'string' ? { access_code_id: params } : params;
6
- return useQuery({
5
+ const { client } = useSeamClient();
6
+ const { data, ...rest } = useQuery({
7
7
  enabled: client != null,
8
- queryKey: ['access_code', 'get', normalizedParams],
8
+ queryKey: ['access_codes', 'get', normalizedParams],
9
9
  queryFn: async () => {
10
10
  if (client == null)
11
11
  return null;
12
12
  return await client?.accessCodes.get(normalizedParams);
13
13
  },
14
14
  });
15
+ return { ...rest, accessCode: data };
15
16
  }
16
17
  //# sourceMappingURL=use-access-code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-access-code.js","sourceRoot":"","sources":["../../../src/lib/seam/access-codes/use-access-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAK3D,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAElC,MAAM,gBAAgB,GACpB,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAElE,OAAO,QAAQ,CAAC;QACd,OAAO,EAAE,MAAM,IAAI,IAAI;QACvB,QAAQ,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,gBAAgB,CAAC;QAClD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAA;YAE/B,OAAO,MAAM,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACxD,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"use-access-code.js","sourceRoot":"","sources":["../../../src/lib/seam/access-codes/use-access-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAQhD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAM3D,MAAM,UAAU,aAAa,CAC3B,MAA2B;IAE3B,MAAM,gBAAgB,GACpB,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAElE,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAGhC;QACA,OAAO,EAAE,MAAM,IAAI,IAAI;QACvB,QAAQ,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,gBAAgB,CAAC;QACnD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAA;YAC/B,OAAO,MAAM,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACxD,CAAC;KACF,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;AACtC,CAAC"}
@@ -1,9 +1,5 @@
1
- import type { AccessCode } from 'seamapi';
1
+ import type { AccessCode, AccessCodesListRequest } from 'seamapi';
2
2
  import type { UseSeamQueryResult } from '../../../lib/seam/use-seam-query-result.js';
3
3
  export type UseAccessCodesParams = AccessCodesListRequest | string;
4
4
  export type UseAccessCodesData = AccessCode[];
5
5
  export declare function useAccessCodes(params: UseAccessCodesParams): UseSeamQueryResult<'accessCodes', UseAccessCodesData>;
6
- interface AccessCodesListRequest {
7
- device_id: string;
8
- }
9
- export {};
@@ -1,5 +1,6 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
2
  import { useSeamClient } from '../../../lib/seam/use-seam-client.js';
3
+ import { byCreatedAt } from '../../../lib/sort-by.js';
3
4
  export function useAccessCodes(params) {
4
5
  const normalizedParams = typeof params === 'string' ? { device_id: params } : params;
5
6
  const { client } = useSeamClient();
@@ -10,7 +11,7 @@ export function useAccessCodes(params) {
10
11
  if (client == null)
11
12
  return [];
12
13
  const accessCodes = await client?.accessCodes.list(normalizedParams);
13
- return accessCodes.sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
14
+ return accessCodes.sort(byCreatedAt);
14
15
  },
15
16
  });
16
17
  return { ...rest, accessCodes: data };
@@ -1 +1 @@
1
- {"version":3,"file":"use-access-codes.js","sourceRoot":"","sources":["../../../src/lib/seam/access-codes/use-access-codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAM3D,MAAM,UAAU,cAAc,CAC5B,MAA4B;IAE5B,MAAM,gBAAgB,GACpB,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAE7D,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAGhC;QACA,OAAO,EAAE,MAAM,IAAI,IAAI;QACvB,QAAQ,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,gBAAgB,CAAC;QACpD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAA;YAC7B,MAAM,WAAW,GAAG,MAAM,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACpE,OAAO,WAAW,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CACtE,CAAA;QACH,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;AACvC,CAAC"}
1
+ {"version":3,"file":"use-access-codes.js","sourceRoot":"","sources":["../../../src/lib/seam/access-codes/use-access-codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAQhD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAK5C,MAAM,UAAU,cAAc,CAC5B,MAA4B;IAE5B,MAAM,gBAAgB,GACpB,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAE7D,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAGhC;QACA,OAAO,EAAE,MAAM,IAAI,IAAI;QACvB,QAAQ,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,gBAAgB,CAAC;QACpD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAA;YAC7B,MAAM,WAAW,GAAG,MAAM,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACpE,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACtC,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;AACvC,CAAC"}
@@ -1,9 +1,9 @@
1
- import type { CommonDeviceProperties, Device, DeviceGetRequest, LockDevice } from 'seamapi';
1
+ import type { CommonDeviceProperties, Device, DeviceGetRequest } from 'seamapi';
2
2
  import type { UseSeamQueryResult } from '../../../lib/seam/use-seam-query-result.js';
3
3
  export type UseDeviceParams = DeviceGetRequest | string;
4
4
  export type UseDeviceData = Device<CommonDeviceProperties> | null;
5
5
  export declare function useDevice(params: DeviceGetRequest): UseSeamQueryResult<'device', UseDeviceData>;
6
6
  export declare function useFakeDevice(_params: DeviceGetRequest): {
7
7
  isLoading: boolean;
8
- device: LockDevice;
8
+ device: UseDeviceData;
9
9
  };
@@ -1 +1 @@
1
- {"version":3,"file":"use-device.js","sourceRoot":"","sources":["../../../src/lib/seam/devices/use-device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAUhD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAM3D,MAAM,UAAU,SAAS,CACvB,MAAwB;IAExB,MAAM,gBAAgB,GACpB,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAE7D,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAGhC;QACA,OAAO,EAAE,MAAM,IAAI,IAAI;QACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,gBAAgB,CAAC;QAC9C,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAA;YAC/B,OAAO,MAAM,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACpD,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAyB;IACrD,MAAM,MAAM,GAAe;QACzB,SAAS,EAAE,sCAAsC;QACjD,WAAW,EAAE,aAAa;QAC1B,sBAAsB,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/C,UAAU,EAAE;YACV,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,kBAAkB;YACjC,aAAa,EAAE,sCAAsC;YACrD,eAAe,EAAE;gBACf,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,SAAS;gBACnB,SAAS,EAAE,YAAY;gBACvB,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,UAAU;aACvB;YACD,sBAAsB,EAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE;gBACP,KAAK,EAAE,kBAAkB;gBACzB,MAAM,EAAE,MAAM;aACf;YACD,SAAS,EACP,mGAAmG;SACtG;QACD,QAAQ,EAAE;YACR,QAAQ,EAAE,qBAAqB;YAC/B,aAAa,EAAE,UAAU;SAC1B;QACD,oBAAoB,EAAE,sCAAsC;QAC5D,YAAY,EAAE,sCAAsC;QACpD,UAAU,EAAE,0BAA0B;QACtC,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;KACb,CAAA;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACrC,CAAC"}
1
+ {"version":3,"file":"use-device.js","sourceRoot":"","sources":["../../../src/lib/seam/devices/use-device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAUhD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAM3D,MAAM,UAAU,SAAS,CACvB,MAAwB;IAExB,MAAM,gBAAgB,GACpB,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAE7D,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAGhC;QACA,OAAO,EAAE,MAAM,IAAI,IAAI;QACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,gBAAgB,CAAC;QAC9C,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAA;YAC/B,OAAO,MAAM,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACpD,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAyB;IAIrD,MAAM,MAAM,GAAe;QACzB,SAAS,EAAE,sCAAsC;QACjD,WAAW,EAAE,aAAa;QAC1B,sBAAsB,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/C,UAAU,EAAE;YACV,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,kBAAkB;YACjC,aAAa,EAAE,sCAAsC;YACrD,eAAe,EAAE;gBACf,OAAO,EAAE,QAAQ;gBACjB,QAAQ,EAAE,SAAS;gBACnB,SAAS,EAAE,YAAY;gBACvB,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,UAAU;aACvB;YACD,sBAAsB,EAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE;gBACP,KAAK,EAAE,kBAAkB;gBACzB,MAAM,EAAE,MAAM;aACf;YACD,SAAS,EACP,mGAAmG;SACtG;QACD,QAAQ,EAAE;YACR,QAAQ,EAAE,qBAAqB;YAC/B,aAAa,EAAE,UAAU;SAC1B;QACD,oBAAoB,EAAE,sCAAsC;QAC5D,YAAY,EAAE,sCAAsC;QACpD,UAAU,EAAE,0BAA0B;QACtC,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;KACb,CAAA;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACrC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { useQuery } from '@tanstack/react-query';
2
2
  import { useSeamClient } from '../../../lib/seam/use-seam-client.js';
3
+ import { byCreatedAt } from '../../../lib/sort-by.js';
3
4
  export function useDevices(params) {
4
5
  const { client } = useSeamClient();
5
6
  const { data, ...rest } = useQuery({
@@ -9,7 +10,7 @@ export function useDevices(params) {
9
10
  if (client == null)
10
11
  return [];
11
12
  const devices = await client?.devices.list(params);
12
- return devices.sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime());
13
+ return devices.sort(byCreatedAt);
13
14
  },
14
15
  });
15
16
  return { ...rest, devices: data };
@@ -1 +1 @@
1
- {"version":3,"file":"use-devices.js","sourceRoot":"","sources":["../../../src/lib/seam/devices/use-devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAShD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAM3D,MAAM,UAAU,UAAU,CACxB,MAAyB;IAEzB,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAChC;QACE,OAAO,EAAE,MAAM,IAAI,IAAI;QACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;QACrC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAA;YAC7B,MAAM,OAAO,GAAG,MAAM,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAClD,OAAO,OAAO,CAAC,IAAI,CACjB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CACtE,CAAA;QACH,CAAC;KACF,CACF,CAAA;IAED,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACnC,CAAC"}
1
+ {"version":3,"file":"use-devices.js","sourceRoot":"","sources":["../../../src/lib/seam/devices/use-devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAShD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAK5C,MAAM,UAAU,UAAU,CACxB,MAAyB;IAEzB,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAChC;QACE,OAAO,EAAE,MAAM,IAAI,IAAI;QACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;QACrC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,EAAE,CAAA;YAC7B,MAAM,OAAO,GAAG,MAAM,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAClD,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAClC,CAAC;KACF,CACF,CAAA;IAED,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACnC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const byCreatedAt: (a: {
2
+ created_at: string;
3
+ }, b: {
4
+ created_at: string;
5
+ }) => number;
package/lib/sort-by.js ADDED
@@ -0,0 +1,9 @@
1
+ import { DateTime } from 'luxon';
2
+ export const byCreatedAt = (a, b) => {
3
+ const t1 = DateTime.fromISO(a.created_at);
4
+ const t2 = DateTime.fromISO(b.created_at);
5
+ if (!t1.isValid || !t2.isValid)
6
+ return 0;
7
+ return t1.toMillis() - t2.toMillis();
8
+ };
9
+ //# sourceMappingURL=sort-by.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort-by.js","sourceRoot":"","sources":["../src/lib/sort-by.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,CAAyB,EACzB,CAAyB,EACjB,EAAE;IACV,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IACzC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO;QAAE,OAAO,CAAC,CAAA;IACxC,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;AACtC,CAAC,CAAA"}
@@ -3,4 +3,4 @@ export interface AccessCodeDetailsProps {
3
3
  accessCode: AccessCode;
4
4
  onBack?: () => void;
5
5
  }
6
- export declare function AccessCodeDetails({ accessCode, onBack, }: AccessCodeDetailsProps): import("react/jsx-runtime").JSX.Element;
6
+ export declare function AccessCodeDetails({ accessCode, onBack, }: AccessCodeDetailsProps): JSX.Element;
@@ -4,10 +4,11 @@ import { useState } from 'react';
4
4
  import { AccessCodeDevice } from '../../../lib/ui/AccessCodeDetails/AccessCodeDevice.js';
5
5
  import { DeviceDetails } from '../../../lib/ui/DeviceDetails/DeviceDetails.js';
6
6
  import { ContentHeader } from '../../../lib/ui/layout/ContentHeader.js';
7
+ import { useIsDateInPast } from '../../../lib/use-is-date-in-past.js';
7
8
  export function AccessCodeDetails({ accessCode, onBack, }) {
8
9
  const name = accessCode.name ?? t.fallbackName;
9
10
  const [selectedDevice, selectDevice] = useState(null);
10
- if (selectedDevice) {
11
+ if (selectedDevice != null) {
11
12
  return (_jsx(DeviceDetails, { device: selectedDevice, onBack: () => {
12
13
  selectDevice(null);
13
14
  } }));
@@ -22,10 +23,11 @@ function ScheduleInfo({ accessCode }) {
22
23
  }
23
24
  function Duration(props) {
24
25
  const { accessCode } = props;
26
+ const hasStarted = useIsDateInPast('starts_at' in accessCode ? accessCode?.starts_at : null) ??
27
+ false;
25
28
  if (accessCode.type === 'ongoing') {
26
29
  return (_jsxs("span", { children: [_jsx("span", { className: 'seam-label', children: "Active" }), " (ongoing)"] }));
27
30
  }
28
- const hasStarted = new Date(accessCode.starts_at).valueOf() < Date.now();
29
31
  if (hasStarted) {
30
32
  return (_jsxs("span", { children: [_jsx("span", { className: 'seam-label', children: "Active" }), " until", ' ', formatDurationDate(accessCode.ends_at), " at", ' ', formatTime(accessCode.ends_at)] }));
31
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AccessCodeDetails.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeDetails/AccessCodeDetails.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AccessCodeDetails.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeDetails/AccessCodeDetails.tsx"],"names":[],"mappings":"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"}
@@ -2,4 +2,4 @@ import type { CommonDeviceProperties, Device } from 'seamapi';
2
2
  export declare function AccessCodeDevice({ deviceId, onSelectDevice, }: {
3
3
  deviceId: string;
4
4
  onSelectDevice: (device: Device<CommonDeviceProperties>) => void;
5
- }): import("react/jsx-runtime").JSX.Element | null;
5
+ }): JSX.Element | null;
@@ -8,8 +8,7 @@ import { TextButton } from '../../../lib/ui/TextButton.js';
8
8
  export function AccessCodeDevice({ deviceId, onSelectDevice, }) {
9
9
  // TODO: Replace with `useDevice()` once ready
10
10
  const { isLoading, device } = useFakeDevice({ device_id: deviceId });
11
- // TODO: Do we want to return a skeleton loader here instead?
12
- if (isLoading || !device || !isLockDevice(device)) {
11
+ if (isLoading || device == null || !isLockDevice(device)) {
13
12
  return null;
14
13
  }
15
14
  const model = getDeviceModel(device);
@@ -1 +1 @@
1
- {"version":3,"file":"AccessCodeDevice.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeDetails/AccessCodeDevice.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,GAIf;IACC,+CAA+C;IAC/C,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;IAEpE,6DAA6D;IAC7D,IAAI,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;QACjD,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IAEpC,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,cAAK,SAAS,EAAC,YAAY,YAAE,KAAK,GAAO,EACzC,KAAC,UAAU,IACT,OAAO,EAAE,GAAG,EAAE;4BACZ,cAAc,CAAC,MAAM,CAAC,CAAA;wBACxB,CAAC,YAEA,CAAC,CAAC,aAAa,GACL,IACT,EACN,KAAC,MAAM,yBAAgB,IACnB,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,aAAa,EAAE,gBAAgB;CAChC,CAAA"}
1
+ {"version":3,"file":"AccessCodeDevice.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeDetails/AccessCodeDevice.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,GAIf;IACC,+CAA+C;IAC/C,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;IAEpE,IAAI,SAAS,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;QACxD,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IAEpC,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,cAAK,SAAS,EAAC,YAAY,YAAE,KAAK,GAAO,EACzC,KAAC,UAAU,IACT,OAAO,EAAE,GAAG,EAAE;4BACZ,cAAc,CAAC,MAAM,CAAC,CAAA;wBACxB,CAAC,YAEA,CAAC,CAAC,aAAa,GACL,IACT,EACN,KAAC,MAAM,yBAAgB,IACnB,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,aAAa,EAAE,gBAAgB;CAChC,CAAA"}
@@ -1,4 +1,4 @@
1
1
  export declare function AccessCodeTable(props: {
2
2
  deviceId: string;
3
3
  onBack?: () => void;
4
- }): JSX.Element;
4
+ }): JSX.Element | null;
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import { AccessCodeKeyIcon } from '../../../lib/icons/AccessCodeKey.js';
4
4
  import { useAccessCodes } from '../../../lib/seam/access-codes/use-access-codes.js';
@@ -18,13 +18,14 @@ export function AccessCodeTable(props) {
18
18
  });
19
19
  const { onBack } = props;
20
20
  const [selectedAccessCode, selectAccessCode] = useState(null);
21
- if (selectedAccessCode) {
21
+ if (selectedAccessCode != null) {
22
22
  return (_jsx(AccessCodeDetails, { accessCode: selectedAccessCode, onBack: () => {
23
23
  selectAccessCode(null);
24
24
  } }));
25
25
  }
26
- if (!accessCodes)
27
- return _jsx(_Fragment, { children: null });
26
+ if (accessCodes == null) {
27
+ return null;
28
+ }
28
29
  return (_jsxs("div", { className: 'seam-access-code-table', children: [_jsx(ContentHeader, { onBack: onBack }), _jsx(TableHeader, { children: _jsxs(TableTitle, { children: [t.accessCodes, " ", _jsxs(Caption, { children: ["(", accessCodes.length, ")"] })] }) }), _jsx(TableBody, { children: accessCodes.map((code) => (_jsxs(TableRow, { onClick: () => {
29
30
  selectAccessCode(code);
30
31
  }, children: [_jsx(TableCell, { className: 'seam-icon-cell', children: _jsx("div", { children: _jsx(AccessCodeKeyIcon, {}) }) }), _jsxs(TableCell, { className: 'seam-name-cell', children: [_jsx(Title, { children: code.name }), _jsx(CodeDetails, { accessCode: code })] }), _jsx(TableCell, { className: 'seam-action-cell' })] }, code.access_code_id))) })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"AccessCodeTable.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeTable/AccessCodeTable.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAA;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAA;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAElD,MAAM,UAAU,eAAe,CAAC,KAG/B;IACC,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC;QACrC,SAAS,EAAE,KAAK,CAAC,QAAQ;KAC1B,CAAC,CAAA;IACF,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAExB,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CACrD,IAAI,CACL,CAAA;IAED,IAAI,kBAAkB,EAAE;QACtB,OAAO,CACL,KAAC,iBAAiB,IAChB,UAAU,EAAE,kBAAkB,EAC9B,MAAM,EAAE,GAAG,EAAE;gBACX,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACxB,CAAC,GACD,CACH,CAAA;KACF;IAED,IAAI,CAAC,WAAW;QAAE,OAAO,4BAAG,IAAI,GAAI,CAAA;IAEpC,OAAO,CACL,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,WAAW,cACV,MAAC,UAAU,eACR,CAAC,CAAC,WAAW,OAAE,MAAC,OAAO,oBAAG,WAAW,CAAC,MAAM,SAAY,IAC9C,GACD,EACd,KAAC,SAAS,cACP,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,MAAC,QAAQ,IAEP,OAAO,EAAE,GAAG,EAAE;wBACZ,gBAAgB,CAAC,IAAI,CAAC,CAAA;oBACxB,CAAC,aAED,KAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,YACnC,wBACE,KAAC,iBAAiB,KAAG,GACjB,GACI,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,cAAE,IAAI,CAAC,IAAI,GAAS,EAC1B,KAAC,WAAW,IAAC,UAAU,EAAE,IAAI,GAAI,IACvB,EACZ,KAAC,SAAS,IAAC,SAAS,EAAC,kBAAkB,GAI3B,KAlBP,IAAI,CAAC,cAAc,CAmBf,CACZ,CAAC,GACQ,IACR,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,WAAW,EAAE,cAAc;CAC5B,CAAA"}
1
+ {"version":3,"file":"AccessCodeTable.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeTable/AccessCodeTable.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAA;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAA;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAElD,MAAM,UAAU,eAAe,CAAC,KAG/B;IACC,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC;QACrC,SAAS,EAAE,KAAK,CAAC,QAAQ;KAC1B,CAAC,CAAA;IACF,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAExB,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CACrD,IAAI,CACL,CAAA;IAED,IAAI,kBAAkB,IAAI,IAAI,EAAE;QAC9B,OAAO,CACL,KAAC,iBAAiB,IAChB,UAAU,EAAE,kBAAkB,EAC9B,MAAM,EAAE,GAAG,EAAE;gBACX,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACxB,CAAC,GACD,CACH,CAAA;KACF;IAED,IAAI,WAAW,IAAI,IAAI,EAAE;QACvB,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,CACL,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,WAAW,cACV,MAAC,UAAU,eACR,CAAC,CAAC,WAAW,OAAE,MAAC,OAAO,oBAAG,WAAW,CAAC,MAAM,SAAY,IAC9C,GACD,EACd,KAAC,SAAS,cACP,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,MAAC,QAAQ,IAEP,OAAO,EAAE,GAAG,EAAE;wBACZ,gBAAgB,CAAC,IAAI,CAAC,CAAA;oBACxB,CAAC,aAED,KAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,YACnC,wBACE,KAAC,iBAAiB,KAAG,GACjB,GACI,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,cAAE,IAAI,CAAC,IAAI,GAAS,EAC1B,KAAC,WAAW,IAAC,UAAU,EAAE,IAAI,GAAI,IACvB,EACZ,KAAC,SAAS,IAAC,SAAS,EAAC,kBAAkB,GAAG,KAdrC,IAAI,CAAC,cAAc,CAef,CACZ,CAAC,GACQ,IACR,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,WAAW,EAAE,cAAc;CAC5B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"AccessCodeTableContent.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeTable/AccessCodeTableContent.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAOlD,MAAM,UAAU,sBAAsB,CACpC,KAAkC;IAElC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAErC,OAAO,CACL,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,WAAW,cACV,MAAC,UAAU,eACR,CAAC,CAAC,WAAW,OAAE,MAAC,OAAO,oBAAG,WAAW,CAAC,MAAM,SAAY,IAC9C,GACD,EACd,KAAC,SAAS,cACP,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,YACnC,wBACE,KAAC,iBAAiB,KAAG,GACjB,GACI,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,cAAE,IAAI,CAAC,IAAI,GAAS,EAC1B,KAAC,WAAW,IAAC,UAAU,EAAE,IAAI,GAAI,IACvB,EACZ,KAAC,SAAS,IAAC,SAAS,EAAC,kBAAkB,GAI3B,KAdC,IAAI,CAAC,cAAc,CAevB,CACZ,CAAC,GACQ,IACR,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,WAAW,EAAE,cAAc;CAC5B,CAAA"}
1
+ {"version":3,"file":"AccessCodeTableContent.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeTable/AccessCodeTableContent.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAOlD,MAAM,UAAU,sBAAsB,CACpC,KAAkC;IAElC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAErC,OAAO,CACL,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,WAAW,cACV,MAAC,UAAU,eACR,CAAC,CAAC,WAAW,OAAE,MAAC,OAAO,oBAAG,WAAW,CAAC,MAAM,SAAY,IAC9C,GACD,EACd,KAAC,SAAS,cACP,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,YACnC,wBACE,KAAC,iBAAiB,KAAG,GACjB,GACI,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,cAAE,IAAI,CAAC,IAAI,GAAS,EAC1B,KAAC,WAAW,IAAC,UAAU,EAAE,IAAI,GAAI,IACvB,EACZ,KAAC,SAAS,IAAC,SAAS,EAAC,kBAAkB,GAAG,KAV7B,IAAI,CAAC,cAAc,CAWvB,CACZ,CAAC,GACQ,IACR,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,WAAW,EAAE,cAAc;CAC5B,CAAA"}
@@ -1,16 +1,18 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { DateTime } from 'luxon';
3
3
  import { DotDivider } from '../../../lib/ui/layout/DotDivider.js';
4
+ import { useIsDateInPast } from '../../../lib/use-is-date-in-past.js';
4
5
  export function CodeDetails(props) {
5
6
  const { accessCode } = props;
6
7
  return (_jsxs("div", { className: 'seam-code-details', children: ["Unit 110", _jsx(DotDivider, {}), _jsx(Duration, { accessCode: accessCode }), _jsx(DotDivider, {}), t.code, ": ", accessCode.code] }));
7
8
  }
8
9
  function Duration(props) {
9
10
  const { accessCode } = props;
11
+ const hasStarted = useIsDateInPast('starts_at' in accessCode ? accessCode?.starts_at : null) ??
12
+ false;
10
13
  if (accessCode.type === 'ongoing') {
11
14
  return (_jsxs("span", { children: [t.ends, ": ", t.never] }));
12
15
  }
13
- const hasStarted = new Date(accessCode.starts_at).valueOf() < Date.now();
14
16
  if (hasStarted) {
15
17
  return (_jsxs("span", { children: [t.ends, ": ", formatDate(accessCode.ends_at), ' '] }));
16
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CodeDetails.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeTable/CodeDetails.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGhC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD,MAAM,UAAU,WAAW,CAAC,KAAiC;IAC3D,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAA;IAE5B,OAAO,CACL,eAAK,SAAS,EAAC,mBAAmB,yBAEhC,KAAC,UAAU,KAAG,EACd,KAAC,QAAQ,IAAC,UAAU,EAAE,UAAU,GAAI,EACpC,KAAC,UAAU,KAAG,EACb,CAAC,CAAC,IAAI,QAAI,UAAU,CAAC,IAAI,IACtB,CACP,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAiC;IACjD,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAA;IAC5B,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE;QACjC,OAAO,CACL,2BACG,CAAC,CAAC,IAAI,QAAI,CAAC,CAAC,KAAK,IACb,CACR,CAAA;KACF;IAED,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxE,IAAI,UAAU,EAAE;QACd,OAAO,CACL,2BACG,CAAC,CAAC,IAAI,QAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,IACzC,CACR,CAAA;KACF;IAED,OAAO,CACL,2BACG,CAAC,CAAC,MAAM,QAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IACxC,CACR,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC;QAC3C,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,GAAG;IACR,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACf,CAAA"}
1
+ {"version":3,"file":"CodeDetails.js","sourceRoot":"","sources":["../../../src/lib/ui/AccessCodeTable/CodeDetails.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGhC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,MAAM,UAAU,WAAW,CAAC,KAAiC;IAC3D,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAA;IAE5B,OAAO,CACL,eAAK,SAAS,EAAC,mBAAmB,yBAEhC,KAAC,UAAU,KAAG,EACd,KAAC,QAAQ,IAAC,UAAU,EAAE,UAAU,GAAI,EACpC,KAAC,UAAU,KAAG,EACb,CAAC,CAAC,IAAI,QAAI,UAAU,CAAC,IAAI,IACtB,CACP,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAiC;IACjD,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAA;IAE5B,MAAM,UAAU,GACd,eAAe,CAAC,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QACzE,KAAK,CAAA;IAEP,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE;QACjC,OAAO,CACL,2BACG,CAAC,CAAC,IAAI,QAAI,CAAC,CAAC,KAAK,IACb,CACR,CAAA;KACF;IAED,IAAI,UAAU,EAAE;QACd,OAAO,CACL,2BACG,CAAC,CAAC,IAAI,QAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,IACzC,CACR,CAAA;KACF;IAED,OAAO,CACL,2BACG,CAAC,CAAC,MAAM,QAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IACxC,CACR,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC;QAC3C,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,GAAG;IACR,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACf,CAAA"}
@@ -4,5 +4,5 @@ interface ButtonProps {
4
4
  size?: 'small' | 'medium' | 'large';
5
5
  disabled?: boolean;
6
6
  }
7
- export declare function Button({ variant, children, size, disabled, }: ButtonProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function Button({ variant, children, size, disabled, }: ButtonProps): JSX.Element;
8
8
  export {};
@@ -13,15 +13,15 @@ import { ContentHeader } from '../../../lib/ui/layout/ContentHeader.js';
13
13
  import useToggle from '../../../lib/use-toggle.js';
14
14
  export function DeviceDetails(props) {
15
15
  const { device, onBack } = props;
16
- const [showingAccessCodes, toggleAccessCodes] = useToggle();
16
+ const [accessCodesOpen, toggleAccessCodesOpen] = useToggle();
17
17
  const { isLoading, accessCodes } = useAccessCodes({
18
18
  device_id: device.device_id,
19
19
  });
20
20
  if (isLoading) {
21
21
  return null;
22
22
  }
23
- if (showingAccessCodes) {
24
- return (_jsx(AccessCodeTable, { deviceId: device.device_id, onBack: toggleAccessCodes }));
23
+ if (accessCodesOpen) {
24
+ return (_jsx(AccessCodeTable, { deviceId: device.device_id, onBack: toggleAccessCodesOpen }));
25
25
  }
26
26
  if (!isLockDevice(device)) {
27
27
  return null;
@@ -29,7 +29,7 @@ export function DeviceDetails(props) {
29
29
  const lockStatus = device.properties.locked ? t.locked : t.unlocked;
30
30
  const accessCodeCount = accessCodes?.length;
31
31
  const accessCodeLength = device.properties?.schlage_metadata?.access_code_length;
32
- return (_jsxs("div", { className: 'seam-device-details', children: [_jsx(ContentHeader, { title: 'Device', onBack: onBack }), _jsxs("div", { className: 'seam-body', children: [_jsx("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("h4", { className: 'seam-device-name', children: device.properties.name }), _jsxs("div", { className: 'seam-properties', children: [_jsxs("span", { className: 'seam-label', children: [t.status, ":"] }), ' ', _jsx(OnlineStatus, { device: device }), _jsxs("span", { className: 'seam-label', children: [t.power, ":"] }), ' ', _jsx(BatteryStatus, { device: device }), _jsx(DeviceModel, { device: device })] })] })] }) }), _jsx("div", { className: 'seam-box', children: _jsxs("div", { className: 'seam-content seam-access-codes', onClick: toggleAccessCodes, children: [_jsxs("span", { className: 'seam-value', children: [accessCodeCount, " ", t.accessCodes] }), _jsx(ChevronRightIcon, {})] }) }), _jsxs("div", { className: 'seam-box', children: [_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', children: t.unlock }) })] }), _jsx(AccessCodeLength, { accessCodeLength: accessCodeLength })] })] })] }));
32
+ return (_jsxs("div", { className: 'seam-device-details', children: [_jsx(ContentHeader, { title: 'Device', onBack: onBack }), _jsxs("div", { className: 'seam-body', children: [_jsx("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("h4", { className: 'seam-device-name', children: device.properties.name }), _jsxs("div", { className: 'seam-properties', children: [_jsxs("span", { className: 'seam-label', children: [t.status, ":"] }), ' ', _jsx(OnlineStatus, { device: device }), _jsxs("span", { className: 'seam-label', children: [t.power, ":"] }), ' ', _jsx(BatteryStatus, { device: device }), _jsx(DeviceModel, { device: device })] })] })] }) }), _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: [_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', children: t.unlock }) })] }), _jsx(AccessCodeLength, { accessCodeLength: accessCodeLength })] })] })] }));
33
33
  }
34
34
  function AccessCodeLength(props) {
35
35
  const { accessCodeLength } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceDetails.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceDetails/DeviceDetails.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA4C,MAAM,SAAS,CAAA;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAA;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,SAAS,MAAM,mBAAmB,CAAA;AAOzC,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAEhC,MAAM,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,GAAG,SAAS,EAAE,CAAA;IAE3D,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC;QAChD,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAA;IAEF,IAAI,SAAS,EAAE;QACb,OAAO,IAAI,CAAA;KACZ;IAED,IAAI,kBAAkB,EAAE;QACtB,OAAO,CACL,KAAC,eAAe,IAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAI,CAC3E,CAAA;KACF;IAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;QACzB,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IAEnE,MAAM,eAAe,GAAG,WAAW,EAAE,MAAM,CAAA;IAE3C,MAAM,gBAAgB,GACpB,MAAM,CAAC,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,CAAA;IAEzD,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,aAAa,IAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAE,MAAM,GAAI,EAChD,eAAK,SAAS,EAAC,WAAW,aACxB,cAAK,SAAS,EAAC,cAAc,YAC3B,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,aAAI,SAAS,EAAC,kBAAkB,YAAE,MAAM,CAAC,UAAU,CAAC,IAAI,GAAM,EAC9D,eAAK,SAAS,EAAC,iBAAiB,aAC9B,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,MAAM,SAAS,EAAC,GAAG,EACnD,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,EAChC,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,KAAK,SAAS,EAAC,GAAG,EAClD,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,IAC3B,IACF,IACF,GACF,EACN,cAAK,SAAS,EAAC,UAAU,YACvB,eACE,SAAS,EAAC,gCAAgC,EAC1C,OAAO,EAAE,iBAAiB,aAE1B,gBAAM,SAAS,EAAC,YAAY,aACzB,eAAe,OAAG,CAAC,CAAC,WAAW,IAC3B,EACP,KAAC,gBAAgB,KAAG,IAChB,GACF,EAEN,eAAK,SAAS,EAAC,UAAU,aACvB,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,YACzB,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,YAAE,CAAC,CAAC,MAAM,GAAU,GACpC,IACF,EACN,KAAC,gBAAgB,IAAC,gBAAgB,EAAE,gBAAgB,GAAI,IACpD,IACF,IACF,CACP,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAEzB;IACC,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAA;IAClC,IAAI,gBAAgB,IAAI,IAAI,EAAE;QAC5B,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,CACL,eAAK,SAAS,EAAC,sCAAsC,aACnD,eAAM,SAAS,EAAC,YAAY,YAAE,CAAC,CAAC,UAAU,GAAQ,EAClD,gBAAM,SAAS,EAAC,YAAY,aACzB,gBAAgB,OAAG,CAAC,CAAC,MAAM,IACvB,IACH,CACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,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;CACf,CAAA"}
1
+ {"version":3,"file":"DeviceDetails.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceDetails/DeviceDetails.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  export function DeviceModel({ device }) {
3
3
  const model = getDeviceModel(device);
4
- if (!model) {
4
+ if (model == null) {
5
5
  return null;
6
6
  }
7
7
  return (_jsxs(_Fragment, { children: [_jsxs("span", { className: 'seam-label', children: [t.model, ":"] }), ' ', _jsx("div", { className: 'seam-device-model', children: model })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceModel.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceDetails/DeviceModel.tsx"],"names":[],"mappings":";AAMA,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAoB;IACtD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,CACL,8BACE,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,KAAK,SAAS,EAAC,GAAG,EAClD,cAAK,SAAS,EAAC,mBAAmB,YAAE,KAAK,GAAO,IAC/C,CACJ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC7B,UAAU,GACC,EAAsB,EAAE;IACnC,OAAO,CACL,UAAU,EAAE,eAAe,EAAE,KAAK;QAClC,UAAU,EAAE,gBAAgB,EAAE,KAAK;QACnC,CAAC,CAAC,aAAa,CAChB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,GAAG;IACR,KAAK,EAAE,OAAO;IACd,aAAa,EAAE,cAAc;CAC9B,CAAA"}
1
+ {"version":3,"file":"DeviceModel.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceDetails/DeviceModel.tsx"],"names":[],"mappings":";AAMA,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAoB;IACtD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,CACL,8BACE,gBAAM,SAAS,EAAC,YAAY,aAAE,CAAC,CAAC,KAAK,SAAS,EAAC,GAAG,EAClD,cAAK,SAAS,EAAC,mBAAmB,YAAE,KAAK,GAAO,IAC/C,CACJ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC7B,UAAU,GACC,EAAsB,EAAE;IACnC,OAAO,CACL,UAAU,EAAE,eAAe,EAAE,KAAK;QAClC,UAAU,EAAE,gBAAgB,EAAE,KAAK;QACnC,CAAC,CAAC,aAAa,CAChB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,GAAG;IACR,KAAK,EAAE,OAAO;IACd,aAAa,EAAE,cAAc;CAC9B,CAAA"}
@@ -3,5 +3,5 @@ export type DeviceTableProps = Props & UseDevicesParams;
3
3
  interface Props {
4
4
  onBack?: () => void;
5
5
  }
6
- export declare function DeviceTable({ onBack, ...props }: DeviceTableProps): import("react/jsx-runtime").JSX.Element | null;
6
+ export declare function DeviceTable({ onBack, ...props }: DeviceTableProps): JSX.Element | null;
7
7
  export {};
@@ -19,17 +19,20 @@ import { Title } from '../../../lib/ui/typography/Title.js';
19
19
  export function DeviceTable({ onBack, ...props }) {
20
20
  const { devices, isLoading, isError, error } = useDevices(props);
21
21
  const [selectedDevice, selectDevice] = useState(null);
22
- if (selectedDevice) {
22
+ if (selectedDevice != null) {
23
23
  return (_jsx(DeviceDetails, { device: selectedDevice, onBack: () => {
24
24
  selectDevice(null);
25
25
  } }));
26
26
  }
27
- if (isLoading)
27
+ if (isLoading) {
28
28
  return _jsx("p", { children: "..." });
29
- if (isError)
29
+ }
30
+ if (isError) {
30
31
  return _jsx("p", { children: error?.message });
31
- if (devices == null)
32
+ }
33
+ if (devices == null) {
32
34
  return null;
35
+ }
33
36
  const deviceCount = devices.length;
34
37
  return (_jsxs("div", { className: 'seam-device-table', children: [_jsx(ContentHeader, { onBack: onBack }), _jsx(TableHeader, { children: _jsxs(TableTitle, { children: [t.devices, " ", _jsxs(Caption, { children: ["(", deviceCount, ")"] })] }) }), _jsx(TableBody, { children: devices.map((device) => (_jsx(DeviceRow, { device: device, onClick: () => {
35
38
  selectDevice(device);
@@ -37,8 +40,9 @@ export function DeviceTable({ onBack, ...props }) {
37
40
  }
38
41
  function DeviceRow(props) {
39
42
  const { device, onClick } = props;
40
- if (!isLockDevice(device))
43
+ if (!isLockDevice(device)) {
41
44
  return null;
45
+ }
42
46
  const deviceModel = getDeviceModel(device) ?? t.unknownLock;
43
47
  return (_jsxs(TableRow, { onClick: onClick, children: [_jsx(TableCell, { className: 'seam-image-cell', children: _jsx(DeviceImage, { device: device }) }), _jsxs(TableCell, { className: 'seam-body-cell', children: [_jsx(Title, { children: device.properties.name }), _jsxs("div", { className: 'seam-bottom', children: [_jsx("span", { className: 'seam-device-model', children: deviceModel }), _jsxs("div", { className: 'seam-device-statuses', children: [_jsx(OnlineStatus, { device: device }), _jsx(BatteryStatus, { device: device }), _jsx(LockStatus, { device: device })] })] })] })] }, device.device_id));
44
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceTable.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceTable.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGhC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EACL,UAAU,GAGX,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAQlD,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,EAAoB;IAChE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAEhE,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,GAClC,QAAQ,CAAwC,IAAI,CAAC,CAAA;IAEvD,IAAI,cAAc,EAAE;QAClB,OAAO,CACL,KAAC,aAAa,IACZ,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,GAAG,EAAE;gBACX,YAAY,CAAC,IAAI,CAAC,CAAA;YACpB,CAAC,GACD,CACH,CAAA;KACF;IAED,IAAI,SAAS;QAAE,OAAO,8BAAU,CAAA;IAChC,IAAI,OAAO;QAAE,OAAO,sBAAI,KAAK,EAAE,OAAO,GAAK,CAAA;IAC3C,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IAEhC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAA;IAElC,OAAO,CACL,eAAK,SAAS,EAAC,mBAAmB,aAChC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,WAAW,cACV,MAAC,UAAU,eACR,CAAC,CAAC,OAAO,OAAE,MAAC,OAAO,oBAAG,WAAW,SAAY,IACnC,GACD,EACd,KAAC,SAAS,cACP,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,KAAC,SAAS,IACR,MAAM,EAAE,MAAM,EAEd,OAAO,EAAE,GAAG,EAAE;wBACZ,YAAY,CAAC,MAAM,CAAC,CAAA;oBACtB,CAAC,IAHI,MAAM,CAAC,SAAS,CAIrB,CACH,CAAC,GACQ,IACR,CACP,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAGlB;IACC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAEjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IAEtC,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAA;IAE3D,OAAO,CACL,MAAC,QAAQ,IAAwB,OAAO,EAAE,OAAO,aAC/C,KAAC,SAAS,IAAC,SAAS,EAAC,iBAAiB,YACpC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GACrB,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,cAAE,MAAM,CAAC,UAAU,CAAC,IAAI,GAAS,EACvC,eAAK,SAAS,EAAC,aAAa,aAC1B,eAAM,SAAS,EAAC,mBAAmB,YAAE,WAAW,GAAQ,EACxD,eAAK,SAAS,EAAC,sBAAsB,aACnC,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,EAChC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,GAAI,IAC1B,IACF,IACI,KAdC,MAAM,CAAC,SAAS,CAepB,CACZ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,cAAc;CAC5B,CAAA"}
1
+ {"version":3,"file":"DeviceTable.js","sourceRoot":"","sources":["../../../src/lib/ui/DeviceTable/DeviceTable.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGhC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EACL,UAAU,GAGX,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAQlD,MAAM,UAAU,WAAW,CAAC,EAC1B,MAAM,EACN,GAAG,KAAK,EACS;IACjB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAEhE,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,GAClC,QAAQ,CAAwC,IAAI,CAAC,CAAA;IAEvD,IAAI,cAAc,IAAI,IAAI,EAAE;QAC1B,OAAO,CACL,KAAC,aAAa,IACZ,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,GAAG,EAAE;gBACX,YAAY,CAAC,IAAI,CAAC,CAAA;YACpB,CAAC,GACD,CACH,CAAA;KACF;IAED,IAAI,SAAS,EAAE;QACb,OAAO,8BAAU,CAAA;KAClB;IAED,IAAI,OAAO,EAAE;QACX,OAAO,sBAAI,KAAK,EAAE,OAAO,GAAK,CAAA;KAC/B;IAED,IAAI,OAAO,IAAI,IAAI,EAAE;QACnB,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAA;IAElC,OAAO,CACL,eAAK,SAAS,EAAC,mBAAmB,aAChC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,WAAW,cACV,MAAC,UAAU,eACR,CAAC,CAAC,OAAO,OAAE,MAAC,OAAO,oBAAG,WAAW,SAAY,IACnC,GACD,EACd,KAAC,SAAS,cACP,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,KAAC,SAAS,IACR,MAAM,EAAE,MAAM,EAEd,OAAO,EAAE,GAAG,EAAE;wBACZ,YAAY,CAAC,MAAM,CAAC,CAAA;oBACtB,CAAC,IAHI,MAAM,CAAC,SAAS,CAIrB,CACH,CAAC,GACQ,IACR,CACP,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAGlB;IACC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAEjC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;QACzB,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAA;IAE3D,OAAO,CACL,MAAC,QAAQ,IAAwB,OAAO,EAAE,OAAO,aAC/C,KAAC,SAAS,IAAC,SAAS,EAAC,iBAAiB,YACpC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,GAAI,GACrB,EACZ,MAAC,SAAS,IAAC,SAAS,EAAC,gBAAgB,aACnC,KAAC,KAAK,cAAE,MAAM,CAAC,UAAU,CAAC,IAAI,GAAS,EACvC,eAAK,SAAS,EAAC,aAAa,aAC1B,eAAM,SAAS,EAAC,mBAAmB,YAAE,WAAW,GAAQ,EACxD,eAAK,SAAS,EAAC,sBAAsB,aACnC,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,GAAI,EAChC,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,GAAI,EACjC,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,GAAI,IAC1B,IACF,IACI,KAdC,MAAM,CAAC,SAAS,CAepB,CACZ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,GAAG;IACR,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,cAAc;CAC5B,CAAA"}
@@ -1,2 +1,2 @@
1
1
  import type { DivProps } from '../../../lib/ui/types.js';
2
- export declare function TableCell({ className, ...otherProps }: DivProps): JSX.Element;
2
+ export declare function TableCell({ className, ...props }: DivProps): JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import classNames from 'classnames';
3
- export function TableCell({ className, ...otherProps }) {
4
- return (_jsx("div", { className: classNames('seam-table-cell', className), ...otherProps }));
3
+ export function TableCell({ className, ...props }) {
4
+ return _jsx("div", { className: classNames('seam-table-cell', className), ...props });
5
5
  }
6
6
  //# sourceMappingURL=TableCell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableCell.js","sourceRoot":"","sources":["../../../src/lib/ui/Table/TableCell.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAInC,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,UAAU,EAAY;IAC9D,OAAO,CACL,cAAK,SAAS,EAAE,UAAU,CAAC,iBAAiB,EAAE,SAAS,CAAC,KAAM,UAAU,GAAI,CAC7E,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"TableCell.js","sourceRoot":"","sources":["../../../src/lib/ui/Table/TableCell.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAInC,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAY;IACzD,OAAO,cAAK,SAAS,EAAE,UAAU,CAAC,iBAAiB,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAAA;AAChF,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import { type TextFieldProps } from '../../../lib/ui/TextField/TextField.js';
2
- export declare function SearchTextField({ className, ...otherProps }: TextFieldProps): JSX.Element;
2
+ export declare function SearchTextField({ className, ...props }: TextFieldProps): JSX.Element;
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import classNames from 'classnames';
3
3
  import { TextField } from '../../../lib/ui/TextField/TextField.js';
4
- export function SearchTextField({ className, ...otherProps }) {
5
- return (_jsx(TextField, { ...otherProps, className: classNames(className, 'seam-search-text-field') }));
4
+ export function SearchTextField({ className, ...props }) {
5
+ return (_jsx(TextField, { ...props, className: classNames(className, 'seam-search-text-field') }));
6
6
  }
7
7
  //# sourceMappingURL=SearchTextField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchTextField.js","sourceRoot":"","sources":["../../../src/lib/ui/TextField/SearchTextField.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAEnC,OAAO,EAAE,SAAS,EAAuB,MAAM,+BAA+B,CAAA;AAE9E,MAAM,UAAU,eAAe,CAAC,EAC9B,SAAS,EACT,GAAG,UAAU,EACE;IACf,OAAO,CACL,KAAC,SAAS,OACJ,UAAU,EACd,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,wBAAwB,CAAC,GAC1D,CACH,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"SearchTextField.js","sourceRoot":"","sources":["../../../src/lib/ui/TextField/SearchTextField.tsx"],"names":[],"mappings":";AAAA,OAAO,UAAU,MAAM,YAAY,CAAA;AAEnC,OAAO,EAAE,SAAS,EAAuB,MAAM,+BAA+B,CAAA;AAE9E,MAAM,UAAU,eAAe,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACO;IACf,OAAO,CACL,KAAC,SAAS,OACJ,KAAK,EACT,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,wBAAwB,CAAC,GAC1D,CACH,CAAA;AACH,CAAC"}
@@ -2,4 +2,4 @@ import type { LockDevice } from 'seamapi';
2
2
  export interface BatteryStatusProps {
3
3
  device: LockDevice;
4
4
  }
5
- export declare function BatteryStatus(props: BatteryStatusProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function BatteryStatus(props: BatteryStatusProps): JSX.Element;
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { ArrowBackIcon } from '../../../lib/icons/ArrowBack.js';
3
3
  export function ContentHeader(props) {
4
4
  const { title, onBack } = props;
5
- if (!title && !onBack) {
5
+ if (title == null && onBack == null) {
6
6
  return null;
7
7
  }
8
8
  return (_jsxs("div", { className: 'seam-content-header', children: [_jsx(BackIcon, { onClick: onBack }), _jsx("span", { className: 'seam-title', children: title })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"ContentHeader.js","sourceRoot":"","sources":["../../../src/lib/ui/layout/ContentHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,MAAM,UAAU,aAAa,CAAC,KAG7B;IACC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAC/B,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE;QACrB,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,QAAQ,IAAC,OAAO,EAAE,MAAM,GAAI,EAC7B,eAAM,SAAS,EAAC,YAAY,YAAE,KAAK,GAAQ,IACvC,CACP,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAA+B;IAC/C,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE;QACzB,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,KAAC,aAAa,IAAC,SAAS,EAAC,gBAAgB,EAAC,OAAO,EAAE,KAAK,CAAC,OAAO,GAAI,CAAA;AAC7E,CAAC"}
1
+ {"version":3,"file":"ContentHeader.js","sourceRoot":"","sources":["../../../src/lib/ui/layout/ContentHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,MAAM,UAAU,aAAa,CAAC,KAG7B;IACC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAC/B,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE;QACnC,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,QAAQ,IAAC,OAAO,EAAE,MAAM,GAAI,EAC7B,eAAM,SAAS,EAAC,YAAY,YAAE,KAAK,GAAQ,IACvC,CACP,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAA+B;IAC/C,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE;QACzB,OAAO,IAAI,CAAA;KACZ;IAED,OAAO,KAAC,aAAa,IAAC,SAAS,EAAC,gBAAgB,EAAC,OAAO,EAAE,KAAK,CAAC,OAAO,GAAI,CAAA;AAC7E,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function useInterval(callback: () => void, delay?: number): void;
@@ -0,0 +1,15 @@
1
+ import { Duration } from 'luxon';
2
+ import { useCallback, useEffect } from 'react';
3
+ const defaultDelay = Duration.fromObject({ minutes: 1 }).as('milliseconds');
4
+ export function useInterval(callback, delay = defaultDelay) {
5
+ const update = useCallback(() => {
6
+ callback();
7
+ }, [callback]);
8
+ useEffect(() => {
9
+ const timer = globalThis.setInterval(update, delay);
10
+ return () => {
11
+ globalThis.clearInterval(timer);
12
+ };
13
+ }, [update, delay]);
14
+ }
15
+ //# sourceMappingURL=use-interval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-interval.js","sourceRoot":"","sources":["../src/lib/use-interval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE9C,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAA;AAE3E,MAAM,UAAU,WAAW,CACzB,QAAoB,EACpB,QAAgB,YAAY;IAE5B,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,QAAQ,EAAE,CAAA;IACZ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEd,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACnD,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function useIsDateInPast(date: string | null | undefined): boolean | null;
@@ -0,0 +1,20 @@
1
+ import { DateTime } from 'luxon';
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { useInterval } from './use-interval.js';
4
+ export function useIsDateInPast(date) {
5
+ const [isDateInPast, setIsDateInPast] = useState(null);
6
+ const update = useCallback(() => {
7
+ if (date == null)
8
+ return;
9
+ setIsDateInPast(isInPast(DateTime.fromISO(date)));
10
+ }, [date]);
11
+ useEffect(update, [update]);
12
+ useInterval(update);
13
+ return isDateInPast;
14
+ }
15
+ const isInPast = (dt) => {
16
+ if (!dt.isValid)
17
+ return null;
18
+ return dt.diffNow().milliseconds < 0;
19
+ };
20
+ //# sourceMappingURL=use-is-date-in-past.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-is-date-in-past.js","sourceRoot":"","sources":["../src/lib/use-is-date-in-past.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,UAAU,eAAe,CAC7B,IAA+B;IAE/B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAA;IAEtE,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,IAAI,IAAI,IAAI,IAAI;YAAE,OAAM;QACxB,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAC3B,WAAW,CAAC,MAAM,CAAC,CAAA;IAEnB,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,EAAY,EAAkB,EAAE;IAChD,IAAI,CAAC,EAAE,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,CAAC,CAAA;AACtC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamapi/react",
3
- "version": "0.18.0",
3
+ "version": "0.19.1",
4
4
  "description": "Seam React component library.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -94,7 +94,7 @@
94
94
  "@tanstack/react-query": "^4.28.0",
95
95
  "classnames": "^2.3.2",
96
96
  "luxon": "^3.3.0",
97
- "seamapi": "^5.21.0",
97
+ "seamapi": "^5.21.1",
98
98
  "uuid": "^9.0.0"
99
99
  },
100
100
  "devDependencies": {
@@ -135,7 +135,6 @@
135
135
  "eslint-plugin-unused-imports": "^2.0.0",
136
136
  "fast-glob": "^3.2.12",
137
137
  "http-proxy-middleware": "^2.0.6",
138
- "isomorphic-fetch": "^3.0.0",
139
138
  "jest": "^29.5.0",
140
139
  "jest-environment-jsdom": "^29.5.0",
141
140
  "prettier": "^2.3.0",
@@ -1,24 +1,34 @@
1
1
  import { useQuery } from '@tanstack/react-query'
2
- import type { AccessCode, AccessCodeGetRequest } from 'seamapi'
2
+ import type {
3
+ AccessCode,
4
+ AccessCodeGetRequest,
5
+ AccessCodeGetResponse,
6
+ SeamError,
7
+ } from 'seamapi'
3
8
 
4
9
  import { useSeamClient } from 'lib/seam/use-seam-client.js'
10
+ import type { UseSeamQueryResult } from 'lib/seam/use-seam-query-result.js'
5
11
 
6
12
  export type UseAccessCodeParams = AccessCodeGetRequest | string
7
- export type UseAccessCodeData = AccessCode
8
-
9
- export function useAccessCode(params: UseAccessCodeParams) {
10
- const { client } = useSeamClient()
13
+ export type UseAccessCodeData = AccessCode | null
11
14
 
15
+ export function useAccessCode(
16
+ params: UseAccessCodeParams
17
+ ): UseSeamQueryResult<'accessCode', UseAccessCodeData> {
12
18
  const normalizedParams =
13
19
  typeof params === 'string' ? { access_code_id: params } : params
14
20
 
15
- return useQuery({
21
+ const { client } = useSeamClient()
22
+ const { data, ...rest } = useQuery<
23
+ AccessCodeGetResponse['access_code'] | null,
24
+ SeamError
25
+ >({
16
26
  enabled: client != null,
17
- queryKey: ['access_code', 'get', normalizedParams],
27
+ queryKey: ['access_codes', 'get', normalizedParams],
18
28
  queryFn: async () => {
19
29
  if (client == null) return null
20
-
21
30
  return await client?.accessCodes.get(normalizedParams)
22
31
  },
23
32
  })
33
+ return { ...rest, accessCode: data }
24
34
  }
@@ -1,8 +1,14 @@
1
1
  import { useQuery } from '@tanstack/react-query'
2
- import type { AccessCode, AccessCodesListResponse, SeamError } from 'seamapi'
2
+ import type {
3
+ AccessCode,
4
+ AccessCodesListRequest,
5
+ AccessCodesListResponse,
6
+ SeamError,
7
+ } from 'seamapi'
3
8
 
4
9
  import { useSeamClient } from 'lib/seam/use-seam-client.js'
5
10
  import type { UseSeamQueryResult } from 'lib/seam/use-seam-query-result.js'
11
+ import { byCreatedAt } from 'lib/sort-by.js'
6
12
 
7
13
  export type UseAccessCodesParams = AccessCodesListRequest | string
8
14
  export type UseAccessCodesData = AccessCode[]
@@ -23,17 +29,9 @@ export function useAccessCodes(
23
29
  queryFn: async () => {
24
30
  if (client == null) return []
25
31
  const accessCodes = await client?.accessCodes.list(normalizedParams)
26
- return accessCodes.sort(
27
- (a, b) =>
28
- new Date(a.created_at).getTime() - new Date(b.created_at).getTime()
29
- )
32
+ return accessCodes.sort(byCreatedAt)
30
33
  },
31
34
  })
32
35
 
33
36
  return { ...rest, accessCodes: data }
34
37
  }
35
-
36
- // UPSTREAM: https://github.com/seamapi/javascript/pull/200
37
- interface AccessCodesListRequest {
38
- device_id: string
39
- }
@@ -36,7 +36,10 @@ export function useDevice(
36
36
  return { ...rest, device: data }
37
37
  }
38
38
 
39
- export function useFakeDevice(_params: DeviceGetRequest) {
39
+ export function useFakeDevice(_params: DeviceGetRequest): {
40
+ isLoading: boolean
41
+ device: UseDeviceData
42
+ } {
40
43
  const device: LockDevice = {
41
44
  device_id: 'f9a9ab36-9e14-4390-a88c-b4c78304c6aa',
42
45
  device_type: 'august_lock',
@@ -9,6 +9,7 @@ import type {
9
9
 
10
10
  import { useSeamClient } from 'lib/seam/use-seam-client.js'
11
11
  import type { UseSeamQueryResult } from 'lib/seam/use-seam-query-result.js'
12
+ import { byCreatedAt } from 'lib/sort-by.js'
12
13
 
13
14
  export type UseDevicesParams = DevicesListRequest
14
15
  export type UseDevicesData = Array<Device<CommonDeviceProperties>>
@@ -24,10 +25,7 @@ export function useDevices(
24
25
  queryFn: async () => {
25
26
  if (client == null) return []
26
27
  const devices = await client?.devices.list(params)
27
- return devices.sort(
28
- (a, b) =>
29
- new Date(a.created_at).getTime() - new Date(b.created_at).getTime()
30
- )
28
+ return devices.sort(byCreatedAt)
31
29
  },
32
30
  }
33
31
  )
@@ -0,0 +1,11 @@
1
+ import { DateTime } from 'luxon'
2
+
3
+ export const byCreatedAt = (
4
+ a: { created_at: string },
5
+ b: { created_at: string }
6
+ ): number => {
7
+ const t1 = DateTime.fromISO(a.created_at)
8
+ const t2 = DateTime.fromISO(b.created_at)
9
+ if (!t1.isValid || !t2.isValid) return 0
10
+ return t1.toMillis() - t2.toMillis()
11
+ }
@@ -5,6 +5,7 @@ import type { AccessCode, CommonDeviceProperties, Device } from 'seamapi'
5
5
  import { AccessCodeDevice } from 'lib/ui/AccessCodeDetails/AccessCodeDevice.js'
6
6
  import { DeviceDetails } from 'lib/ui/DeviceDetails/DeviceDetails.js'
7
7
  import { ContentHeader } from 'lib/ui/layout/ContentHeader.js'
8
+ import { useIsDateInPast } from 'lib/use-is-date-in-past.js'
8
9
 
9
10
  export interface AccessCodeDetailsProps {
10
11
  accessCode: AccessCode
@@ -14,12 +15,12 @@ export interface AccessCodeDetailsProps {
14
15
  export function AccessCodeDetails({
15
16
  accessCode,
16
17
  onBack,
17
- }: AccessCodeDetailsProps) {
18
+ }: AccessCodeDetailsProps): JSX.Element {
18
19
  const name = accessCode.name ?? t.fallbackName
19
20
  const [selectedDevice, selectDevice] =
20
21
  useState<Device<CommonDeviceProperties> | null>(null)
21
22
 
22
- if (selectedDevice) {
23
+ if (selectedDevice != null) {
23
24
  return (
24
25
  <DeviceDetails
25
26
  device={selectedDevice}
@@ -70,7 +71,7 @@ export function AccessCodeDetails({
70
71
  )
71
72
  }
72
73
 
73
- function ScheduleInfo({ accessCode }: { accessCode: AccessCode }) {
74
+ function ScheduleInfo({ accessCode }: { accessCode: AccessCode }): JSX.Element {
74
75
  if (accessCode.type === 'ongoing') {
75
76
  return <span>{t.ongoing}</span>
76
77
  }
@@ -92,6 +93,11 @@ function ScheduleInfo({ accessCode }: { accessCode: AccessCode }) {
92
93
 
93
94
  function Duration(props: { accessCode: AccessCode }): JSX.Element {
94
95
  const { accessCode } = props
96
+
97
+ const hasStarted =
98
+ useIsDateInPast('starts_at' in accessCode ? accessCode?.starts_at : null) ??
99
+ false
100
+
95
101
  if (accessCode.type === 'ongoing') {
96
102
  return (
97
103
  <span>
@@ -100,7 +106,6 @@ function Duration(props: { accessCode: AccessCode }): JSX.Element {
100
106
  )
101
107
  }
102
108
 
103
- const hasStarted = new Date(accessCode.starts_at).valueOf() < Date.now()
104
109
  if (hasStarted) {
105
110
  return (
106
111
  <span>
@@ -13,12 +13,11 @@ export function AccessCodeDevice({
13
13
  }: {
14
14
  deviceId: string
15
15
  onSelectDevice: (device: Device<CommonDeviceProperties>) => void
16
- }) {
16
+ }): JSX.Element | null {
17
17
  // TODO: Replace with `useDevice()` once ready
18
18
  const { isLoading, device } = useFakeDevice({ device_id: deviceId })
19
19
 
20
- // TODO: Do we want to return a skeleton loader here instead?
21
- if (isLoading || !device || !isLockDevice(device)) {
20
+ if (isLoading || device == null || !isLockDevice(device)) {
22
21
  return null
23
22
  }
24
23
 
@@ -17,7 +17,7 @@ import { Title } from 'lib/ui/typography/Title.js'
17
17
  export function AccessCodeTable(props: {
18
18
  deviceId: string
19
19
  onBack?: () => void
20
- }): JSX.Element {
20
+ }): JSX.Element | null {
21
21
  const { accessCodes } = useAccessCodes({
22
22
  device_id: props.deviceId,
23
23
  })
@@ -27,7 +27,7 @@ export function AccessCodeTable(props: {
27
27
  null
28
28
  )
29
29
 
30
- if (selectedAccessCode) {
30
+ if (selectedAccessCode != null) {
31
31
  return (
32
32
  <AccessCodeDetails
33
33
  accessCode={selectedAccessCode}
@@ -38,7 +38,9 @@ export function AccessCodeTable(props: {
38
38
  )
39
39
  }
40
40
 
41
- if (!accessCodes) return <>{null}</>
41
+ if (accessCodes == null) {
42
+ return null
43
+ }
42
44
 
43
45
  return (
44
46
  <div className='seam-access-code-table'>
@@ -65,11 +67,7 @@ export function AccessCodeTable(props: {
65
67
  <Title>{code.name}</Title>
66
68
  <CodeDetails accessCode={code} />
67
69
  </TableCell>
68
- <TableCell className='seam-action-cell'>
69
- {/* <IconButton>
70
- <DotsEllipsisMoreIcon />
71
- </IconButton> */}
72
- </TableCell>
70
+ <TableCell className='seam-action-cell' />
73
71
  </TableRow>
74
72
  ))}
75
73
  </TableBody>
@@ -41,11 +41,7 @@ export function AccessCodeTableContent(
41
41
  <Title>{code.name}</Title>
42
42
  <CodeDetails accessCode={code} />
43
43
  </TableCell>
44
- <TableCell className='seam-action-cell'>
45
- {/* <IconButton>
46
- <DotsEllipsisMoreIcon />
47
- </IconButton> */}
48
- </TableCell>
44
+ <TableCell className='seam-action-cell' />
49
45
  </TableRow>
50
46
  ))}
51
47
  </TableBody>
@@ -2,6 +2,7 @@ import { DateTime } from 'luxon'
2
2
  import type { AccessCode } from 'seamapi'
3
3
 
4
4
  import { DotDivider } from 'lib/ui/layout/DotDivider.js'
5
+ import { useIsDateInPast } from 'lib/use-is-date-in-past.js'
5
6
 
6
7
  export function CodeDetails(props: { accessCode: AccessCode }): JSX.Element {
7
8
  const { accessCode } = props
@@ -19,6 +20,11 @@ export function CodeDetails(props: { accessCode: AccessCode }): JSX.Element {
19
20
 
20
21
  function Duration(props: { accessCode: AccessCode }): JSX.Element {
21
22
  const { accessCode } = props
23
+
24
+ const hasStarted =
25
+ useIsDateInPast('starts_at' in accessCode ? accessCode?.starts_at : null) ??
26
+ false
27
+
22
28
  if (accessCode.type === 'ongoing') {
23
29
  return (
24
30
  <span>
@@ -27,7 +33,6 @@ function Duration(props: { accessCode: AccessCode }): JSX.Element {
27
33
  )
28
34
  }
29
35
 
30
- const hasStarted = new Date(accessCode.starts_at).valueOf() < Date.now()
31
36
  if (hasStarted) {
32
37
  return (
33
38
  <span>
@@ -12,7 +12,7 @@ export function Button({
12
12
  children,
13
13
  size = 'medium',
14
14
  disabled,
15
- }: ButtonProps) {
15
+ }: ButtonProps): JSX.Element {
16
16
  return (
17
17
  <button
18
18
  className={classNames(`seam-btn seam-btn-${variant} seam-btn-${size}`, {
@@ -20,7 +20,7 @@ export interface DeviceDetailsProps {
20
20
  export function DeviceDetails(props: DeviceDetailsProps): JSX.Element | null {
21
21
  const { device, onBack } = props
22
22
 
23
- const [showingAccessCodes, toggleAccessCodes] = useToggle()
23
+ const [accessCodesOpen, toggleAccessCodesOpen] = useToggle()
24
24
 
25
25
  const { isLoading, accessCodes } = useAccessCodes({
26
26
  device_id: device.device_id,
@@ -30,9 +30,12 @@ export function DeviceDetails(props: DeviceDetailsProps): JSX.Element | null {
30
30
  return null
31
31
  }
32
32
 
33
- if (showingAccessCodes) {
33
+ if (accessCodesOpen) {
34
34
  return (
35
- <AccessCodeTable deviceId={device.device_id} onBack={toggleAccessCodes} />
35
+ <AccessCodeTable
36
+ deviceId={device.device_id}
37
+ onBack={toggleAccessCodesOpen}
38
+ />
36
39
  )
37
40
  }
38
41
 
@@ -72,7 +75,7 @@ export function DeviceDetails(props: DeviceDetailsProps): JSX.Element | null {
72
75
  <div className='seam-box'>
73
76
  <div
74
77
  className='seam-content seam-access-codes'
75
- onClick={toggleAccessCodes}
78
+ onClick={toggleAccessCodesOpen}
76
79
  >
77
80
  <span className='seam-value'>
78
81
  {accessCodeCount} {t.accessCodes}
@@ -6,7 +6,7 @@ interface DeviceModelProps {
6
6
 
7
7
  export function DeviceModel({ device }: DeviceModelProps): JSX.Element | null {
8
8
  const model = getDeviceModel(device)
9
- if (!model) {
9
+ if (model == null) {
10
10
  return null
11
11
  }
12
12
 
@@ -28,13 +28,16 @@ interface Props {
28
28
  onBack?: () => void
29
29
  }
30
30
 
31
- export function DeviceTable({ onBack, ...props }: DeviceTableProps) {
31
+ export function DeviceTable({
32
+ onBack,
33
+ ...props
34
+ }: DeviceTableProps): JSX.Element | null {
32
35
  const { devices, isLoading, isError, error } = useDevices(props)
33
36
 
34
37
  const [selectedDevice, selectDevice] =
35
38
  useState<Device<CommonDeviceProperties> | null>(null)
36
39
 
37
- if (selectedDevice) {
40
+ if (selectedDevice != null) {
38
41
  return (
39
42
  <DeviceDetails
40
43
  device={selectedDevice}
@@ -45,9 +48,17 @@ export function DeviceTable({ onBack, ...props }: DeviceTableProps) {
45
48
  )
46
49
  }
47
50
 
48
- if (isLoading) return <p>...</p>
49
- if (isError) return <p>{error?.message}</p>
50
- if (devices == null) return null
51
+ if (isLoading) {
52
+ return <p>...</p>
53
+ }
54
+
55
+ if (isError) {
56
+ return <p>{error?.message}</p>
57
+ }
58
+
59
+ if (devices == null) {
60
+ return null
61
+ }
51
62
 
52
63
  const deviceCount = devices.length
53
64
 
@@ -77,10 +88,12 @@ export function DeviceTable({ onBack, ...props }: DeviceTableProps) {
77
88
  function DeviceRow(props: {
78
89
  device: UseDevicesData[number]
79
90
  onClick: () => void
80
- }) {
91
+ }): JSX.Element | null {
81
92
  const { device, onClick } = props
82
93
 
83
- if (!isLockDevice(device)) return null
94
+ if (!isLockDevice(device)) {
95
+ return null
96
+ }
84
97
 
85
98
  const deviceModel = getDeviceModel(device) ?? t.unknownLock
86
99
 
@@ -2,8 +2,6 @@ import classNames from 'classnames'
2
2
 
3
3
  import type { DivProps } from 'lib/ui/types.js'
4
4
 
5
- export function TableCell({ className, ...otherProps }: DivProps): JSX.Element {
6
- return (
7
- <div className={classNames('seam-table-cell', className)} {...otherProps} />
8
- )
5
+ export function TableCell({ className, ...props }: DivProps): JSX.Element {
6
+ return <div className={classNames('seam-table-cell', className)} {...props} />
9
7
  }
@@ -4,11 +4,11 @@ import { TextField, type TextFieldProps } from 'lib/ui/TextField/TextField.js'
4
4
 
5
5
  export function SearchTextField({
6
6
  className,
7
- ...otherProps
7
+ ...props
8
8
  }: TextFieldProps): JSX.Element {
9
9
  return (
10
10
  <TextField
11
- {...otherProps}
11
+ {...props}
12
12
  className={classNames(className, 'seam-search-text-field')}
13
13
  />
14
14
  )
@@ -9,7 +9,7 @@ export interface BatteryStatusProps {
9
9
  device: LockDevice
10
10
  }
11
11
 
12
- export function BatteryStatus(props: BatteryStatusProps) {
12
+ export function BatteryStatus(props: BatteryStatusProps): JSX.Element {
13
13
  const {
14
14
  device: {
15
15
  properties: { battery_level: batteryLevel },
@@ -23,7 +23,7 @@ export function BatteryStatus(props: BatteryStatusProps) {
23
23
  )
24
24
  }
25
25
 
26
- function Content(props: { batteryLevel?: number }) {
26
+ function Content(props: { batteryLevel?: number }): JSX.Element | null {
27
27
  const { batteryLevel } = props
28
28
 
29
29
  if (batteryLevel == null) {
@@ -21,7 +21,7 @@ export function LockStatus(props: LockStatusProps): JSX.Element {
21
21
  )
22
22
  }
23
23
 
24
- function Content(props: { isLocked: boolean }) {
24
+ function Content(props: { isLocked: boolean }): JSX.Element {
25
25
  const { isLocked } = props
26
26
  if (isLocked) {
27
27
  return (
@@ -21,7 +21,7 @@ export function OnlineStatus(props: OnlineStatusProps): JSX.Element {
21
21
  )
22
22
  }
23
23
 
24
- function Content(props: { isOnline: boolean }) {
24
+ function Content(props: { isOnline: boolean }): JSX.Element {
25
25
  const { isOnline } = props
26
26
  if (isOnline) {
27
27
  return (
@@ -5,7 +5,7 @@ export function ContentHeader(props: {
5
5
  onBack?: () => void
6
6
  }): JSX.Element | null {
7
7
  const { title, onBack } = props
8
- if (!title && !onBack) {
8
+ if (title == null && onBack == null) {
9
9
  return null
10
10
  }
11
11
 
@@ -0,0 +1,20 @@
1
+ import { Duration } from 'luxon'
2
+ import { useCallback, useEffect } from 'react'
3
+
4
+ const defaultDelay = Duration.fromObject({ minutes: 1 }).as('milliseconds')
5
+
6
+ export function useInterval(
7
+ callback: () => void,
8
+ delay: number = defaultDelay
9
+ ) {
10
+ const update = useCallback(() => {
11
+ callback()
12
+ }, [callback])
13
+
14
+ useEffect(() => {
15
+ const timer = globalThis.setInterval(update, delay)
16
+ return () => {
17
+ globalThis.clearInterval(timer)
18
+ }
19
+ }, [update, delay])
20
+ }
@@ -0,0 +1,25 @@
1
+ import { DateTime } from 'luxon'
2
+ import { useCallback, useEffect, useState } from 'react'
3
+
4
+ import { useInterval } from './use-interval.js'
5
+
6
+ export function useIsDateInPast(
7
+ date: string | null | undefined
8
+ ): boolean | null {
9
+ const [isDateInPast, setIsDateInPast] = useState<boolean | null>(null)
10
+
11
+ const update = useCallback(() => {
12
+ if (date == null) return
13
+ setIsDateInPast(isInPast(DateTime.fromISO(date)))
14
+ }, [date])
15
+
16
+ useEffect(update, [update])
17
+ useInterval(update)
18
+
19
+ return isDateInPast
20
+ }
21
+
22
+ const isInPast = (dt: DateTime): boolean | null => {
23
+ if (!dt.isValid) return null
24
+ return dt.diffNow().milliseconds < 0
25
+ }