@peers-app/peers-ui 0.26.0 → 0.26.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.
Files changed (36) hide show
  1. package/dist/app-updates/app-update-controls.d.ts +23 -0
  2. package/dist/app-updates/app-update-controls.js +40 -0
  3. package/dist/app-updates/app-updates-consumer.d.ts +41 -0
  4. package/dist/app-updates/app-updates-consumer.js +96 -0
  5. package/dist/app-updates/app-updates-consumer.test.d.ts +1 -0
  6. package/dist/app-updates/app-updates-consumer.test.js +56 -0
  7. package/dist/app-updates/app-updates-settings.d.ts +5 -0
  8. package/dist/app-updates/app-updates-settings.js +44 -0
  9. package/dist/app-updates/app-updates-settings.test.d.ts +1 -0
  10. package/dist/app-updates/app-updates-settings.test.js +93 -0
  11. package/dist/app-updates/remote-app-update-panel.d.ts +18 -0
  12. package/dist/app-updates/remote-app-update-panel.js +125 -0
  13. package/dist/app-updates/remote-app-update-panel.test.d.ts +1 -0
  14. package/dist/app-updates/remote-app-update-panel.test.js +165 -0
  15. package/dist/app-updates/use-app-update-status.d.ts +8 -0
  16. package/dist/app-updates/use-app-update-status.js +17 -0
  17. package/dist/screens/devices/devices-list.js +2 -1
  18. package/dist/screens/network-viewer/device-details-modal.js +2 -1
  19. package/dist/screens/settings/settings-page.js +5 -0
  20. package/dist/tabs-layout/network-status-indicator.d.ts +12 -0
  21. package/dist/tabs-layout/network-status-indicator.js +33 -5
  22. package/dist/tabs-layout/network-status-indicator.test.js +90 -0
  23. package/package.json +3 -3
  24. package/src/app-updates/app-update-controls.tsx +73 -0
  25. package/src/app-updates/app-updates-consumer.test.ts +83 -0
  26. package/src/app-updates/app-updates-consumer.ts +121 -0
  27. package/src/app-updates/app-updates-settings.test.tsx +109 -0
  28. package/src/app-updates/app-updates-settings.tsx +136 -0
  29. package/src/app-updates/remote-app-update-panel.test.tsx +205 -0
  30. package/src/app-updates/remote-app-update-panel.tsx +210 -0
  31. package/src/app-updates/use-app-update-status.ts +16 -0
  32. package/src/screens/devices/devices-list.tsx +4 -0
  33. package/src/screens/network-viewer/device-details-modal.tsx +6 -0
  34. package/src/screens/settings/settings-page.tsx +5 -0
  35. package/src/tabs-layout/network-status-indicator.test.tsx +119 -1
  36. package/src/tabs-layout/network-status-indicator.tsx +56 -5
@@ -1,6 +1,13 @@
1
- import type { INetworkConnectionInfo, INetworkStatusSummary } from "@peers-app/peers-sdk";
1
+ import type {
2
+ IAppUpdateStatus,
3
+ INetworkConnectionInfo,
4
+ INetworkStatusSummary,
5
+ } from "@peers-app/peers-sdk";
2
6
  import moment from "moment";
3
7
  import { useEffect, useId, useRef, useState } from "react";
8
+ import { APP_UPDATE_ICON_CLASS, AppUpdatePopoverSection } from "../app-updates/app-update-controls";
9
+ import { describeAppUpdateStatus, hasAppUpdate } from "../app-updates/app-updates-consumer";
10
+ import { useAppUpdateStatus } from "../app-updates/use-app-update-status";
4
11
  import { IDENTITY_ACCEPT_PATH, IDENTITY_ACCOUNT_PATH } from "../screens/identity/identity-routes";
5
12
  import { getNetworkDiagnosticsConsumer } from "../screens/network-viewer/network-viewer-ipc";
6
13
  import { networkViewerSection } from "../screens/network-viewer/network-viewer-section";
@@ -50,6 +57,8 @@ interface INetworkStatusPresentation {
50
57
  * Green when > 0; red zero when connected devices exist but no groups are live.
51
58
  */
52
59
  connectedGroupsOverlay?: { count: number; colorClass: "text-success" | "text-danger" };
60
+ /** Bottom-left yellow upgrade arrow when this device has an app update available. */
61
+ updateAvailableOverlay?: boolean;
53
62
  }
54
63
 
55
64
  function disconnectedLabelSuffix(disconnectedContextCount: number): string {
@@ -191,6 +200,28 @@ export function getNetworkStatusPresentation(
191
200
  );
192
201
  }
193
202
 
203
+ /**
204
+ * Add the app-update badge and label to a network status presentation. Applies in every
205
+ * network state, offline included, because installing does not depend on connectivity.
206
+ *
207
+ * @param presentation - Presentation from {@link getNetworkStatusPresentation}.
208
+ * @param appUpdate - This device's update status, if known.
209
+ * @returns The presentation, with `updateAvailableOverlay` when an update is available.
210
+ */
211
+ export function withAppUpdate(
212
+ presentation: INetworkStatusPresentation,
213
+ appUpdate: IAppUpdateStatus | undefined,
214
+ ): INetworkStatusPresentation {
215
+ if (!appUpdate?.supported || !hasAppUpdate(appUpdate)) {
216
+ return presentation;
217
+ }
218
+ return {
219
+ ...presentation,
220
+ label: `${presentation.label}; ${describeAppUpdateStatus(appUpdate)}`,
221
+ updateAvailableOverlay: true,
222
+ };
223
+ }
224
+
194
225
  function statusMarkBgClass(colorClass: string): string {
195
226
  if (colorClass === "text-danger") {
196
227
  return "bg-danger";
@@ -363,6 +394,7 @@ function StatusCountRow({
363
394
  function NetworkStatusDetails({
364
395
  detailsId,
365
396
  status,
397
+ appUpdate,
366
398
  unavailable,
367
399
  connectionsLoadState,
368
400
  onUseInvite,
@@ -372,6 +404,7 @@ function NetworkStatusDetails({
372
404
  }: {
373
405
  detailsId: string;
374
406
  status?: INetworkStatusSummary;
407
+ appUpdate?: IAppUpdateStatus;
375
408
  unavailable: boolean;
376
409
  connectionsLoadState: ConnectionsLoadState;
377
410
  onUseInvite: () => void;
@@ -406,6 +439,7 @@ function NetworkStatusDetails({
406
439
  Identity
407
440
  </button>
408
441
  </div>
442
+ <AppUpdatePopoverSection status={appUpdate} />
409
443
  <h6 className="card-title mb-2">Network status</h6>
410
444
  {unavailable || !status ? (
411
445
  <p className="small text-muted mb-3">
@@ -481,6 +515,7 @@ function NetworkStatusDetails({
481
515
  /** Accessible reactive network status button and details popover. */
482
516
  export function NetworkStatusIndicator({ compact = false }: { compact?: boolean }) {
483
517
  const viewState = useNetworkStatus();
518
+ const appUpdate = useAppUpdateStatus();
484
519
  const [displaySyncing, setDisplaySyncing] = useState(false);
485
520
  const [syncingLongerThanGreenMs, setSyncingLongerThanGreenMs] = useState(false);
486
521
  const [open, setOpen] = useState(false);
@@ -553,10 +588,13 @@ export function NetworkStatusIndicator({ compact = false }: { compact?: boolean
553
588
  }, [open, diagnosticsReady, connectionCount]);
554
589
 
555
590
  const holdSyncingVisual = displaySyncing && !rawIsSyncing;
556
- const presentation = getNetworkStatusPresentation(viewState, {
557
- syncingLongerThanGreenMs,
558
- holdSyncingVisual,
559
- });
591
+ const presentation = withAppUpdate(
592
+ getNetworkStatusPresentation(viewState, {
593
+ syncingLongerThanGreenMs,
594
+ holdSyncingVisual,
595
+ }),
596
+ appUpdate,
597
+ );
560
598
 
561
599
  useEffect(() => {
562
600
  if (!open) {
@@ -640,6 +678,18 @@ export function NetworkStatusIndicator({ compact = false }: { compact?: boolean
640
678
  {presentation.disconnectedGroupsOverlay.count}
641
679
  </span>
642
680
  )}
681
+ {presentation.updateAvailableOverlay && (
682
+ <i
683
+ className={`network-status-update-badge bi ${APP_UPDATE_ICON_CLASS} text-warning position-absolute`}
684
+ style={{
685
+ fontSize: "0.5rem",
686
+ lineHeight: 1,
687
+ left: "-0.3rem",
688
+ bottom: "-0.32rem",
689
+ }}
690
+ aria-hidden="true"
691
+ />
692
+ )}
643
693
  </span>
644
694
  {!compact && (
645
695
  <span className="small">
@@ -652,6 +702,7 @@ export function NetworkStatusIndicator({ compact = false }: { compact?: boolean
652
702
  <NetworkStatusDetails
653
703
  detailsId={detailsId}
654
704
  status={viewState.status}
705
+ appUpdate={appUpdate}
655
706
  unavailable={viewState.availability !== "ready"}
656
707
  connectionsLoadState={connectionsLoadState}
657
708
  onUseInvite={() => {