@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.
- package/dist/app-updates/app-update-controls.d.ts +23 -0
- package/dist/app-updates/app-update-controls.js +40 -0
- package/dist/app-updates/app-updates-consumer.d.ts +41 -0
- package/dist/app-updates/app-updates-consumer.js +96 -0
- package/dist/app-updates/app-updates-consumer.test.d.ts +1 -0
- package/dist/app-updates/app-updates-consumer.test.js +56 -0
- package/dist/app-updates/app-updates-settings.d.ts +5 -0
- package/dist/app-updates/app-updates-settings.js +44 -0
- package/dist/app-updates/app-updates-settings.test.d.ts +1 -0
- package/dist/app-updates/app-updates-settings.test.js +93 -0
- package/dist/app-updates/remote-app-update-panel.d.ts +18 -0
- package/dist/app-updates/remote-app-update-panel.js +125 -0
- package/dist/app-updates/remote-app-update-panel.test.d.ts +1 -0
- package/dist/app-updates/remote-app-update-panel.test.js +165 -0
- package/dist/app-updates/use-app-update-status.d.ts +8 -0
- package/dist/app-updates/use-app-update-status.js +17 -0
- package/dist/screens/devices/devices-list.js +2 -1
- package/dist/screens/network-viewer/device-details-modal.js +2 -1
- package/dist/screens/settings/settings-page.js +5 -0
- package/dist/tabs-layout/network-status-indicator.d.ts +12 -0
- package/dist/tabs-layout/network-status-indicator.js +33 -5
- package/dist/tabs-layout/network-status-indicator.test.js +90 -0
- package/package.json +3 -3
- package/src/app-updates/app-update-controls.tsx +73 -0
- package/src/app-updates/app-updates-consumer.test.ts +83 -0
- package/src/app-updates/app-updates-consumer.ts +121 -0
- package/src/app-updates/app-updates-settings.test.tsx +109 -0
- package/src/app-updates/app-updates-settings.tsx +136 -0
- package/src/app-updates/remote-app-update-panel.test.tsx +205 -0
- package/src/app-updates/remote-app-update-panel.tsx +210 -0
- package/src/app-updates/use-app-update-status.ts +16 -0
- package/src/screens/devices/devices-list.tsx +4 -0
- package/src/screens/network-viewer/device-details-modal.tsx +6 -0
- package/src/screens/settings/settings-page.tsx +5 -0
- package/src/tabs-layout/network-status-indicator.test.tsx +119 -1
- package/src/tabs-layout/network-status-indicator.tsx +56 -5
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import type {
|
|
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 =
|
|
557
|
-
|
|
558
|
-
|
|
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={() => {
|