@peers-app/peers-ui 0.27.3 → 0.27.4
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/screens/network-viewer/network-viewer-ipc.d.ts +3 -1
- package/dist/screens/network-viewer/network-viewer-ipc.js +6 -0
- package/dist/screens/network-viewer/sync-recovery.js +103 -1
- package/dist/screens/variables/variable-details.js +2 -1
- package/dist/tabs-layout/network-status-indicator.js +26 -12
- package/dist/tabs-layout/use-network-status.d.ts +6 -1
- package/dist/tabs-layout/use-network-status.js +27 -4
- package/package.json +9 -3
- package/.claude/settings.local.json +0 -34
- package/.github/README.md +0 -52
- package/.github/workflows/delete-all-artifacts.yml +0 -49
- package/.github/workflows/publish.yml +0 -51
- package/babel.config.js +0 -7
- package/biome.json +0 -198
- package/dist/app-updates/app-updates-consumer.test.d.ts +0 -1
- package/dist/app-updates/app-updates-consumer.test.js +0 -56
- package/dist/app-updates/app-updates-settings.test.d.ts +0 -1
- package/dist/app-updates/app-updates-settings.test.js +0 -93
- package/dist/app-updates/remote-app-update-panel.test.d.ts +0 -1
- package/dist/app-updates/remote-app-update-panel.test.js +0 -165
- package/dist/components/access-level-field.test.d.ts +0 -1
- package/dist/components/access-level-field.test.js +0 -28
- package/dist/components/message-logs/tool-access-approval-card.test.d.ts +0 -1
- package/dist/components/message-logs/tool-access-approval-card.test.js +0 -102
- package/dist/components/responsive-section-nav.test.d.ts +0 -1
- package/dist/components/responsive-section-nav.test.js +0 -45
- package/dist/globals-hash.test.d.ts +0 -1
- package/dist/globals-hash.test.js +0 -16
- package/dist/hooks/use-observable-state.test.d.ts +0 -1
- package/dist/hooks/use-observable-state.test.js +0 -64
- package/dist/hooks/use-observable.test.d.ts +0 -1
- package/dist/hooks/use-observable.test.js +0 -191
- package/dist/hooks/use-rows.test.d.ts +0 -1
- package/dist/hooks/use-rows.test.js +0 -175
- package/dist/hooks/use-tool.test.d.ts +0 -1
- package/dist/hooks/use-tool.test.js +0 -190
- package/dist/host-shell/host-shell-consumer.test.d.ts +0 -1
- package/dist/host-shell/host-shell-consumer.test.js +0 -28
- package/dist/root-layout/root-layout-host.test.d.ts +0 -1
- package/dist/root-layout/root-layout-host.test.js +0 -86
- package/dist/screens/account/account-screen.test.d.ts +0 -1
- package/dist/screens/account/account-screen.test.js +0 -51
- package/dist/screens/assistants/assistant-config.test.d.ts +0 -1
- package/dist/screens/assistants/assistant-config.test.js +0 -57
- package/dist/screens/contacts/contact-list.test.d.ts +0 -1
- package/dist/screens/contacts/contact-list.test.js +0 -48
- package/dist/screens/device-pairing/device-pairing.test.d.ts +0 -1
- package/dist/screens/device-pairing/device-pairing.test.js +0 -119
- package/dist/screens/devices/devices-list.test.d.ts +0 -1
- package/dist/screens/devices/devices-list.test.js +0 -53
- package/dist/screens/groups/group-list.test.d.ts +0 -1
- package/dist/screens/groups/group-list.test.js +0 -38
- package/dist/screens/identity/identity-routes.test.d.ts +0 -1
- package/dist/screens/identity/identity-routes.test.js +0 -51
- package/dist/screens/identity/identity-screen.test.d.ts +0 -1
- package/dist/screens/identity/identity-screen.test.js +0 -103
- package/dist/screens/invites/accept-invite.test.d.ts +0 -1
- package/dist/screens/invites/accept-invite.test.js +0 -103
- package/dist/screens/invites/activity-view.test.d.ts +0 -1
- package/dist/screens/invites/activity-view.test.js +0 -108
- package/dist/screens/invites/invite-classify.test.d.ts +0 -1
- package/dist/screens/invites/invite-classify.test.js +0 -115
- package/dist/screens/network-viewer/network-viewer-ipc.test.d.ts +0 -1
- package/dist/screens/network-viewer/network-viewer-ipc.test.js +0 -61
- package/dist/screens/network-viewer/network-viewer.section.test.d.ts +0 -1
- package/dist/screens/network-viewer/network-viewer.section.test.js +0 -63
- package/dist/screens/network-viewer/sync-recovery.test.d.ts +0 -1
- package/dist/screens/network-viewer/sync-recovery.test.js +0 -104
- package/dist/screens/packages/package-helpers.test.d.ts +0 -1
- package/dist/screens/packages/package-helpers.test.js +0 -53
- package/dist/screens/packages/package-runtime-status.test.d.ts +0 -1
- package/dist/screens/packages/package-runtime-status.test.js +0 -50
- package/dist/screens/packages/packages-ipc.test.d.ts +0 -1
- package/dist/screens/packages/packages-ipc.test.js +0 -43
- package/dist/screens/settings/settings-page.test.d.ts +0 -1
- package/dist/screens/settings/settings-page.test.js +0 -19
- package/dist/screens/tools/tool-access-ipc.test.d.ts +0 -1
- package/dist/screens/tools/tool-access-ipc.test.js +0 -40
- package/dist/screens/tools/tool-catalog-ipc.test.d.ts +0 -1
- package/dist/screens/tools/tool-catalog-ipc.test.js +0 -52
- package/dist/tabs-layout/network-status-indicator.test.d.ts +0 -1
- package/dist/tabs-layout/network-status-indicator.test.js +0 -665
- package/dist/tabs-layout/tabs-state.test.d.ts +0 -1
- package/dist/tabs-layout/tabs-state.test.js +0 -110
- package/dist/tabs-layout/use-network-status.test.d.ts +0 -1
- package/dist/tabs-layout/use-network-status.test.js +0 -45
- package/dist/ui-router/ui-loader.test.d.ts +0 -1
- package/dist/ui-router/ui-loader.test.js +0 -91
- package/jest.config.js +0 -25
- package/release-guard.js +0 -10
- package/src/app-updates/app-update-controls.tsx +0 -73
- package/src/app-updates/app-updates-consumer.test.ts +0 -83
- package/src/app-updates/app-updates-consumer.ts +0 -121
- package/src/app-updates/app-updates-settings.test.tsx +0 -109
- package/src/app-updates/app-updates-settings.tsx +0 -136
- package/src/app-updates/remote-app-update-panel.test.tsx +0 -205
- package/src/app-updates/remote-app-update-panel.tsx +0 -210
- package/src/app-updates/use-app-update-status.ts +0 -16
- package/src/command-palette/command-palette-ui.tsx +0 -564
- package/src/command-palette/command-palette.ts +0 -242
- package/src/components/access-level-field.test.tsx +0 -32
- package/src/components/access-level-field.tsx +0 -68
- package/src/components/checkbox.tsx +0 -25
- package/src/components/group-switcher.tsx +0 -526
- package/src/components/input-date.tsx +0 -29
- package/src/components/input-number.tsx +0 -83
- package/src/components/input.tsx +0 -25
- package/src/components/inverse-lazy-list.tsx +0 -107
- package/src/components/io-schema-values.tsx +0 -103
- package/src/components/io-schema.tsx +0 -259
- package/src/components/lazy-list.tsx +0 -115
- package/src/components/list-screen.tsx +0 -126
- package/src/components/loading-indicator.tsx +0 -7
- package/src/components/markdown-editor/autolink-plugin.tsx +0 -29
- package/src/components/markdown-editor/editor-inline.tsx +0 -9
- package/src/components/markdown-editor/editor.tsx +0 -158
- package/src/components/markdown-editor/markdown-plugin.tsx +0 -202
- package/src/components/markdown-editor/mention-node.ts +0 -204
- package/src/components/markdown-editor/mentions-plugin.tsx +0 -354
- package/src/components/markdown-editor/move-line-plugin.tsx +0 -186
- package/src/components/markdown-editor/select-line-boundary-plugin.tsx +0 -95
- package/src/components/markdown-editor/theme.ts +0 -46
- package/src/components/markdown-editor/toolbar.tsx +0 -269
- package/src/components/markdown-with-mentions.tsx +0 -198
- package/src/components/message-logs/message-logs.tsx +0 -523
- package/src/components/message-logs/tool-access-approval-card.test.tsx +0 -127
- package/src/components/message-logs/tool-access-approval-card.tsx +0 -178
- package/src/components/messages/avatar.tsx +0 -171
- package/src/components/messages/channel-message-list.tsx +0 -189
- package/src/components/messages/channel-view.tsx +0 -92
- package/src/components/messages/message-compose.tsx +0 -192
- package/src/components/messages/message-display.tsx +0 -231
- package/src/components/messages/thread-message-list.tsx +0 -135
- package/src/components/qr-scanner.tsx +0 -180
- package/src/components/responsive-section-nav.test.tsx +0 -88
- package/src/components/responsive-section-nav.tsx +0 -92
- package/src/components/router.tsx +0 -175
- package/src/components/save-button.tsx +0 -134
- package/src/components/sortable-list.tsx +0 -130
- package/src/components/tabs.tsx +0 -76
- package/src/components/tooltip.tsx +0 -43
- package/src/components/trust-level-badge.tsx +0 -44
- package/src/components/trust-level-dropdown.tsx +0 -136
- package/src/components/typeahead.tsx +0 -357
- package/src/globals-hash.test.ts +0 -19
- package/src/globals.tsx +0 -226
- package/src/hooks/index.ts +0 -8
- package/src/hooks/use-host-contract.ts +0 -75
- package/src/hooks/use-observable-state.test.tsx +0 -101
- package/src/hooks/use-observable-state.ts +0 -29
- package/src/hooks/use-observable.test.tsx +0 -258
- package/src/hooks/use-observable.ts +0 -67
- package/src/hooks/use-on-screen.ts +0 -24
- package/src/hooks/use-promise.ts +0 -34
- package/src/hooks/use-rows.test.tsx +0 -196
- package/src/hooks/use-rows.ts +0 -120
- package/src/hooks/use-subscription.ts +0 -24
- package/src/hooks/use-tool.test.tsx +0 -225
- package/src/hooks/use-tool.ts +0 -116
- package/src/host-shell/host-shell-consumer.test.ts +0 -32
- package/src/host-shell/host-shell-consumer.ts +0 -53
- package/src/index.tsx +0 -42
- package/src/mention-configs.ts +0 -185
- package/src/operator-console/operator-console-state.ts +0 -119
- package/src/operator-console/operator-console.tsx +0 -233
- package/src/peers-services-registration.ts +0 -6
- package/src/root-layout/global-overlays.ts +0 -50
- package/src/root-layout/layout-picker.tsx +0 -47
- package/src/root-layout/layouts/full-screen-layout.tsx +0 -144
- package/src/root-layout/layouts/tabs-with-console-layout.tsx +0 -260
- package/src/root-layout/root-layout-host.test.tsx +0 -108
- package/src/root-layout/root-layout-host.tsx +0 -147
- package/src/root-layout/root-layout-registry.ts +0 -51
- package/src/root-layout/root-layout-state.ts +0 -55
- package/src/root-layout/root-layout.ts +0 -32
- package/src/screens/account/account-screen.test.tsx +0 -65
- package/src/screens/account/account-screen.tsx +0 -942
- package/src/screens/assistants/assistant-config.test.tsx +0 -54
- package/src/screens/assistants/assistant-config.tsx +0 -121
- package/src/screens/assistants/assistant-details.tsx +0 -89
- package/src/screens/assistants/assistant-info.tsx +0 -66
- package/src/screens/assistants/assistant-list.tsx +0 -145
- package/src/screens/assistants/assistant-tools.tsx +0 -82
- package/src/screens/console-logs/console-logs-list.tsx +0 -374
- package/src/screens/console-logs/log-display.tsx +0 -137
- package/src/screens/console-logs/log-filters.tsx +0 -64
- package/src/screens/console-logs/mobile-log-card.tsx +0 -161
- package/src/screens/console-logs/resizable-table-header.tsx +0 -110
- package/src/screens/contacts/contact-details.tsx +0 -123
- package/src/screens/contacts/contact-list.test.tsx +0 -59
- package/src/screens/contacts/contact-list.tsx +0 -286
- package/src/screens/contacts/index.ts +0 -2
- package/src/screens/data-explorer/data-explorer.tsx +0 -633
- package/src/screens/data-explorer/index.ts +0 -6
- package/src/screens/data-explorer/query-executor.tsx +0 -520
- package/src/screens/device-pairing/device-pairing.test.tsx +0 -143
- package/src/screens/device-pairing/device-pairing.tsx +0 -461
- package/src/screens/device-pairing/identity-ipc.ts +0 -25
- package/src/screens/device-pairing/index.ts +0 -2
- package/src/screens/device-pairing/use-device-pairing-state.ts +0 -15
- package/src/screens/devices/devices-list.test.tsx +0 -68
- package/src/screens/devices/devices-list.tsx +0 -365
- package/src/screens/devices/index.ts +0 -1
- package/src/screens/groups/group-details.tsx +0 -160
- package/src/screens/groups/group-invite-panel.tsx +0 -311
- package/src/screens/groups/group-list.test.tsx +0 -44
- package/src/screens/groups/group-list.tsx +0 -317
- package/src/screens/groups/group-members.tsx +0 -343
- package/src/screens/groups/index.ts +0 -3
- package/src/screens/identity/identity-routes.test.ts +0 -70
- package/src/screens/identity/identity-routes.ts +0 -301
- package/src/screens/identity/identity-screen.test.tsx +0 -138
- package/src/screens/identity/identity-screen.tsx +0 -282
- package/src/screens/identity/index.ts +0 -2
- package/src/screens/identity/invite-contact-panel.tsx +0 -45
- package/src/screens/identity/profile-invite.tsx +0 -93
- package/src/screens/invites/accept-invite.test.tsx +0 -115
- package/src/screens/invites/accept-invite.tsx +0 -318
- package/src/screens/invites/activity-view.test.tsx +0 -127
- package/src/screens/invites/activity-view.tsx +0 -162
- package/src/screens/invites/index.ts +0 -6
- package/src/screens/invites/invite-capture.ts +0 -104
- package/src/screens/invites/invite-classify.test.ts +0 -129
- package/src/screens/invites/invite-share.tsx +0 -104
- package/src/screens/invites/invites-ipc.ts +0 -25
- package/src/screens/invites/pending-invites-list.tsx +0 -256
- package/src/screens/network-viewer/connection-troubleshooter.tsx +0 -395
- package/src/screens/network-viewer/cpu-usage-graph.tsx +0 -294
- package/src/screens/network-viewer/device-details-modal.tsx +0 -339
- package/src/screens/network-viewer/group-details-modal.tsx +0 -421
- package/src/screens/network-viewer/index.ts +0 -8
- package/src/screens/network-viewer/network-viewer-ipc.test.ts +0 -72
- package/src/screens/network-viewer/network-viewer-ipc.ts +0 -39
- package/src/screens/network-viewer/network-viewer-section.ts +0 -12
- package/src/screens/network-viewer/network-viewer.section.test.tsx +0 -68
- package/src/screens/network-viewer/network-viewer.tsx +0 -708
- package/src/screens/network-viewer/remote-logs-panel.tsx +0 -190
- package/src/screens/network-viewer/sync-recovery.test.tsx +0 -114
- package/src/screens/network-viewer/sync-recovery.tsx +0 -461
- package/src/screens/network-viewer/usage-graph.tsx +0 -455
- package/src/screens/packages/local-folder-grants-panel.tsx +0 -290
- package/src/screens/packages/local-folders-ipc.ts +0 -28
- package/src/screens/packages/package-details.tsx +0 -166
- package/src/screens/packages/package-helpers.test.ts +0 -57
- package/src/screens/packages/package-helpers.ts +0 -137
- package/src/screens/packages/package-info.tsx +0 -354
- package/src/screens/packages/package-list.tsx +0 -519
- package/src/screens/packages/package-network-panel.tsx +0 -82
- package/src/screens/packages/package-new-local.tsx +0 -100
- package/src/screens/packages/package-runtime-status.test.tsx +0 -58
- package/src/screens/packages/package-runtime-status.tsx +0 -68
- package/src/screens/packages/package-versions.tsx +0 -298
- package/src/screens/packages/packages-ipc.test.ts +0 -47
- package/src/screens/packages/packages-ipc.ts +0 -125
- package/src/screens/peer-types/peer-type-details.tsx +0 -172
- package/src/screens/peer-types/peer-type-list.tsx +0 -64
- package/src/screens/search/global-search.tsx +0 -406
- package/src/screens/settings/color-mode-dropdown.tsx +0 -82
- package/src/screens/settings/settings-page.test.tsx +0 -24
- package/src/screens/settings/settings-page.tsx +0 -426
- package/src/screens/setup-user.tsx +0 -355
- package/src/screens/tools/tool-access-ipc.test.ts +0 -55
- package/src/screens/tools/tool-access-ipc.ts +0 -27
- package/src/screens/tools/tool-catalog-ipc.test.ts +0 -52
- package/src/screens/tools/tool-catalog-ipc.ts +0 -51
- package/src/screens/tools/tool-details.tsx +0 -52
- package/src/screens/tools/tool-info.tsx +0 -45
- package/src/screens/tools/tool-list.tsx +0 -106
- package/src/screens/tools/tool-schema.tsx +0 -44
- package/src/screens/tools/tool-test-details.tsx +0 -89
- package/src/screens/tools/tool-test-list.tsx +0 -73
- package/src/screens/variables/variable-details.tsx +0 -289
- package/src/screens/variables/variable-list.tsx +0 -110
- package/src/screens/welcome-modal.tsx +0 -294
- package/src/screens/workflows/workflow-details.tsx +0 -115
- package/src/screens/workflows/workflow-info.tsx +0 -22
- package/src/screens/workflows/workflow-instructions.tsx +0 -134
- package/src/screens/workflows/workflow-list.tsx +0 -117
- package/src/setupTests.ts +0 -38
- package/src/system-apps/assistants.app.ts +0 -7
- package/src/system-apps/console-logs.app.ts +0 -7
- package/src/system-apps/data-explorer.app.ts +0 -8
- package/src/system-apps/identity.app.ts +0 -9
- package/src/system-apps/index.ts +0 -77
- package/src/system-apps/mobile-settings.app.ts +0 -7
- package/src/system-apps/network-viewer.app.ts +0 -8
- package/src/system-apps/packages.app.ts +0 -7
- package/src/system-apps/search.app.ts +0 -8
- package/src/system-apps/settings.app.ts +0 -7
- package/src/system-apps/threads.app.ts +0 -7
- package/src/system-apps/tools.app.ts +0 -7
- package/src/system-apps/types.app.ts +0 -7
- package/src/system-apps/variables.app.ts +0 -7
- package/src/system-apps/workflows.app.ts +0 -7
- package/src/tabs-layout/network-status-indicator.test.tsx +0 -799
- package/src/tabs-layout/network-status-indicator.tsx +0 -756
- package/src/tabs-layout/tabs-layout.tsx +0 -857
- package/src/tabs-layout/tabs-state.test.ts +0 -152
- package/src/tabs-layout/tabs-state.ts +0 -587
- package/src/tabs-layout/use-network-status.test.tsx +0 -58
- package/src/tabs-layout/use-network-status.ts +0 -68
- package/src/ui-defaults/index.ts +0 -2
- package/src/ui-defaults/list-screen.tsx +0 -94
- package/src/ui-defaults/markdown-field.tsx +0 -87
- package/src/ui-router/routes-loader.ts +0 -193
- package/src/ui-router/ui-loader.test.tsx +0 -108
- package/src/ui-router/ui-loader.tsx +0 -606
- package/src/utils.ts +0 -95
- package/tsconfig.json +0 -18
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
4
|
-
const peers_sdk_1 = require("@peers-app/peers-sdk");
|
|
5
|
-
const react_1 = require("@testing-library/react");
|
|
6
|
-
const group_list_1 = require("./group-list");
|
|
7
|
-
jest.mock("../../globals", () => ({
|
|
8
|
-
mainContentPath: jest.fn(),
|
|
9
|
-
}));
|
|
10
|
-
jest.mock("../../hooks", () => ({
|
|
11
|
-
usePromise: jest.fn(),
|
|
12
|
-
}));
|
|
13
|
-
jest.mock("../invites/activity-view", () => ({
|
|
14
|
-
PendingWorkLink: () => null,
|
|
15
|
-
}));
|
|
16
|
-
const summary = {
|
|
17
|
-
group: {
|
|
18
|
-
groupId: "zyxwvutsrqponmlkjihgfedcb",
|
|
19
|
-
name: "Neighborhood",
|
|
20
|
-
description: "**Local** projects and shared plans",
|
|
21
|
-
founderUserId: "abcdefghijklmnopqrstuvwxy",
|
|
22
|
-
publicKey: "signing-key",
|
|
23
|
-
publicBoxKey: "box-key",
|
|
24
|
-
signature: "signature",
|
|
25
|
-
},
|
|
26
|
-
memberCount: 7,
|
|
27
|
-
myRole: peers_sdk_1.GroupMemberRole.Admin,
|
|
28
|
-
};
|
|
29
|
-
describe("GroupSummaryRow", () => {
|
|
30
|
-
it("shows description, member count, and local role in a clickable row", () => {
|
|
31
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(group_list_1.GroupSummaryRow, { summary: summary }));
|
|
32
|
-
expect(react_1.screen.getByText("Neighborhood")).toBeInTheDocument();
|
|
33
|
-
expect(react_1.screen.getByText("Local projects and shared plans")).toBeInTheDocument();
|
|
34
|
-
expect(react_1.screen.getByText("7 members")).toBeInTheDocument();
|
|
35
|
-
expect(react_1.screen.getByText("Admin")).toBeInTheDocument();
|
|
36
|
-
expect(react_1.screen.getByRole("link")).toHaveAttribute("href", `#identity/groups/${summary.group.groupId}`);
|
|
37
|
-
});
|
|
38
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const identity_routes_1 = require("./identity-routes");
|
|
4
|
-
const PERSON_ID = "abcdefghijklmnopqrstuvwxy";
|
|
5
|
-
const GROUP_ID = "zyxwvutsrqponmlkjihgfedcb";
|
|
6
|
-
const DEVICE_ID = "0123456789abcdefghijklmno";
|
|
7
|
-
describe("canonicalizeRoute", () => {
|
|
8
|
-
it.each([
|
|
9
|
-
["contacts", identity_routes_1.IDENTITY_PEOPLE_PATH],
|
|
10
|
-
[`contacts/${PERSON_ID}`, `${identity_routes_1.IDENTITY_PEOPLE_PATH}/${PERSON_ID}`],
|
|
11
|
-
["groups", identity_routes_1.IDENTITY_GROUPS_PATH],
|
|
12
|
-
[`groups/${GROUP_ID}`, `${identity_routes_1.IDENTITY_GROUPS_PATH}/${GROUP_ID}`],
|
|
13
|
-
["devices", identity_routes_1.IDENTITY_DEVICES_PATH],
|
|
14
|
-
[`devices/${DEVICE_ID}`, `${identity_routes_1.IDENTITY_DEVICES_PATH}/${DEVICE_ID}`],
|
|
15
|
-
["devices?action=pair", identity_routes_1.IDENTITY_PAIR_PATH],
|
|
16
|
-
["devices?action=pair&foo=bar", `${identity_routes_1.IDENTITY_PAIR_PATH}?foo=bar`],
|
|
17
|
-
["invites", identity_routes_1.IDENTITY_ACTIVITY_PATH],
|
|
18
|
-
["invites/accept", identity_routes_1.IDENTITY_ACCEPT_PATH],
|
|
19
|
-
["account", identity_routes_1.IDENTITY_ACCOUNT_PATH],
|
|
20
|
-
["account?x=1", `${identity_routes_1.IDENTITY_ACCOUNT_PATH}?x=1`],
|
|
21
|
-
["identity/account", identity_routes_1.IDENTITY_ACCOUNT_PATH],
|
|
22
|
-
["identity/people/invite", identity_routes_1.IDENTITY_PEOPLE_INVITE_PATH],
|
|
23
|
-
["identity/people/SHARE", identity_routes_1.IDENTITY_PEOPLE_SHARE_PATH],
|
|
24
|
-
["identity/groups/new", identity_routes_1.IDENTITY_GROUP_NEW_PATH],
|
|
25
|
-
["identity", identity_routes_1.IDENTITY_ACTIVITY_PATH],
|
|
26
|
-
[`/#contacts/${PERSON_ID}?x=1`, `${identity_routes_1.IDENTITY_PEOPLE_PATH}/${PERSON_ID}?x=1`],
|
|
27
|
-
["tools/abc", "tools/abc"],
|
|
28
|
-
["", ""],
|
|
29
|
-
])("rewrites %s to %s", (input, expected) => {
|
|
30
|
-
expect((0, identity_routes_1.canonicalizeRoute)(input)).toBe(expected);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
describe("parseIdentityLocation", () => {
|
|
34
|
-
it("parses detail routes and activity filters", () => {
|
|
35
|
-
expect((0, identity_routes_1.parseIdentityLocation)(`contacts/${PERSON_ID}`)?.personId).toBe(PERSON_ID);
|
|
36
|
-
expect((0, identity_routes_1.parseIdentityLocation)(`groups/${GROUP_ID}`)?.groupId).toBe(GROUP_ID);
|
|
37
|
-
expect((0, identity_routes_1.parseIdentityLocation)("devices?action=pair")?.pairing).toBe(true);
|
|
38
|
-
expect((0, identity_routes_1.parseIdentityLocation)(`devices/${DEVICE_ID}`)?.deviceId).toBe(DEVICE_ID);
|
|
39
|
-
expect((0, identity_routes_1.parseIdentityLocation)("invites/accept")?.accepting).toBe(true);
|
|
40
|
-
expect((0, identity_routes_1.parseIdentityLocation)(identity_routes_1.IDENTITY_PEOPLE_INVITE_PATH)?.peopleAction).toBe("invite");
|
|
41
|
-
expect((0, identity_routes_1.parseIdentityLocation)(identity_routes_1.IDENTITY_PEOPLE_SHARE_PATH)?.peopleAction).toBe("share");
|
|
42
|
-
expect((0, identity_routes_1.parseIdentityLocation)(identity_routes_1.IDENTITY_GROUP_NEW_PATH)?.creatingGroup).toBe(true);
|
|
43
|
-
expect((0, identity_routes_1.parseIdentityLocation)((0, identity_routes_1.identityActivityFilterPath)("group", GROUP_ID))?.activityFilter).toEqual({
|
|
44
|
-
type: "group",
|
|
45
|
-
groupId: GROUP_ID,
|
|
46
|
-
});
|
|
47
|
-
expect((0, identity_routes_1.identitySectionFromPath)("contacts")).toBe("people");
|
|
48
|
-
expect((0, identity_routes_1.identitySectionFromPath)("account")).toBe("account");
|
|
49
|
-
expect((0, identity_routes_1.isIdentityPath)("settings")).toBe(false);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
-
const react_1 = require("@testing-library/react");
|
|
8
|
-
const user_event_1 = __importDefault(require("@testing-library/user-event"));
|
|
9
|
-
const globals_1 = require("../../globals");
|
|
10
|
-
const identity_screen_1 = require("./identity-screen");
|
|
11
|
-
jest.mock("../../globals", () => {
|
|
12
|
-
const { observable } = jest.requireActual("@peers-app/peers-sdk");
|
|
13
|
-
return {
|
|
14
|
-
isDesktop: observable(true),
|
|
15
|
-
mainContentPath: observable("identity/activity"),
|
|
16
|
-
};
|
|
17
|
-
});
|
|
18
|
-
jest.mock("../../ui-router/ui-loader", () => ({
|
|
19
|
-
registerInternalPeersUI: jest.fn(),
|
|
20
|
-
}));
|
|
21
|
-
jest.mock("../contacts/contact-list", () => ({
|
|
22
|
-
ContactList: () => (0, jsx_runtime_1.jsx)("div", { children: "People view" }),
|
|
23
|
-
}));
|
|
24
|
-
jest.mock("../contacts/contact-details", () => ({
|
|
25
|
-
ContactDetails: ({ userId }) => (0, jsx_runtime_1.jsxs)("div", { children: ["Person ", userId] }),
|
|
26
|
-
}));
|
|
27
|
-
jest.mock("../groups/group-list", () => ({
|
|
28
|
-
GroupList: () => (0, jsx_runtime_1.jsx)("div", { children: "Groups view" }),
|
|
29
|
-
}));
|
|
30
|
-
jest.mock("../groups/group-details", () => ({
|
|
31
|
-
GroupDetails: ({ groupId }) => (0, jsx_runtime_1.jsxs)("div", { children: ["Group ", groupId] }),
|
|
32
|
-
}));
|
|
33
|
-
jest.mock("../devices/devices-list", () => ({
|
|
34
|
-
DevicesSection: ({ mode }) => (0, jsx_runtime_1.jsxs)("div", { children: ["Devices ", mode] }),
|
|
35
|
-
}));
|
|
36
|
-
jest.mock("../invites/accept-invite", () => ({
|
|
37
|
-
AcceptInvite: () => (0, jsx_runtime_1.jsx)("div", { children: "Accept invite view" }),
|
|
38
|
-
}));
|
|
39
|
-
jest.mock("../invites/activity-view", () => ({
|
|
40
|
-
ActivityView: () => (0, jsx_runtime_1.jsx)("div", { children: "Activity view" }),
|
|
41
|
-
}));
|
|
42
|
-
jest.mock("../account/account-screen", () => ({
|
|
43
|
-
AccountScreen: () => (0, jsx_runtime_1.jsx)("div", { children: "Account view" }),
|
|
44
|
-
}));
|
|
45
|
-
jest.mock("../invites/pending-invites-list", () => ({
|
|
46
|
-
useInviteRows: () => ({
|
|
47
|
-
rows: [
|
|
48
|
-
{
|
|
49
|
-
inviteId: "inboundcontact0000000001",
|
|
50
|
-
type: "contact",
|
|
51
|
-
status: "pending",
|
|
52
|
-
direction: "in",
|
|
53
|
-
mode: "contact",
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
hasHistory: false,
|
|
57
|
-
}),
|
|
58
|
-
classifyInvite: (row) => row.status === "pending" && row.direction === "in" && row.type === "contact"
|
|
59
|
-
? "attention"
|
|
60
|
-
: "waiting",
|
|
61
|
-
}));
|
|
62
|
-
const PERSON_ID = "abcdefghijklmnopqrstuvwxy";
|
|
63
|
-
describe("IdentityScreen", () => {
|
|
64
|
-
beforeEach(() => {
|
|
65
|
-
(0, globals_1.isDesktop)(true);
|
|
66
|
-
(0, globals_1.mainContentPath)("identity/activity");
|
|
67
|
-
});
|
|
68
|
-
it("highlights the parent section for a person route and keeps Activity counted", () => {
|
|
69
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(identity_screen_1.IdentityScreen, { path: `identity/people/${PERSON_ID}` }));
|
|
70
|
-
expect(react_1.screen.getByRole("button", { name: /People/ })).toHaveAttribute("aria-current", "page");
|
|
71
|
-
expect(react_1.screen.getByText(`Person ${PERSON_ID}`)).toBeInTheDocument();
|
|
72
|
-
expect(react_1.screen.getByRole("button", { name: /Activity/ })).toHaveTextContent("1");
|
|
73
|
-
});
|
|
74
|
-
it("renders the accept flow on the activity section", () => {
|
|
75
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(identity_screen_1.IdentityScreen, { path: "invites/accept" }));
|
|
76
|
-
expect(react_1.screen.getByText("Accept invite view")).toBeInTheDocument();
|
|
77
|
-
expect(react_1.screen.getByRole("button", { name: /Activity/ })).toHaveAttribute("aria-current", "page");
|
|
78
|
-
});
|
|
79
|
-
it("renders registration on the account section", () => {
|
|
80
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(identity_screen_1.IdentityScreen, { path: "account" }));
|
|
81
|
-
expect(react_1.screen.getByText("Account view")).toBeInTheDocument();
|
|
82
|
-
expect(react_1.screen.getByRole("button", { name: /Account/ })).toHaveAttribute("aria-current", "page");
|
|
83
|
-
});
|
|
84
|
-
it("selects a section through the canonical route", async () => {
|
|
85
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(identity_screen_1.IdentityScreen, { path: "identity/activity" }));
|
|
86
|
-
await user_event_1.default.click(react_1.screen.getByRole("button", { name: /Devices/ }));
|
|
87
|
-
expect((0, globals_1.mainContentPath)()).toBe("identity/devices");
|
|
88
|
-
});
|
|
89
|
-
it("keeps all desktop quick actions route-backed", () => {
|
|
90
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(identity_screen_1.IdentityScreen, { path: "identity/activity" }));
|
|
91
|
-
expect(react_1.screen.getByRole("link", { name: /Add person/ })).toHaveAttribute("href", "#identity/people/invite");
|
|
92
|
-
expect(react_1.screen.getByRole("link", { name: /Create group/ })).toHaveAttribute("href", "#identity/groups/new");
|
|
93
|
-
expect(react_1.screen.getByRole("link", { name: /Add device/ })).toHaveAttribute("href", "#identity/devices/pair");
|
|
94
|
-
expect(react_1.screen.getByRole("link", { name: /Use invite/ })).toHaveAttribute("href", "#identity/activity/accept");
|
|
95
|
-
});
|
|
96
|
-
it("collapses add actions on a narrow screen", async () => {
|
|
97
|
-
(0, globals_1.isDesktop)(false);
|
|
98
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(identity_screen_1.IdentityScreen, { path: "identity/activity" }));
|
|
99
|
-
await user_event_1.default.click(react_1.screen.getByRole("button", { name: "Add" }));
|
|
100
|
-
expect(react_1.screen.getByRole("link", { name: /Add person/ })).toBeInTheDocument();
|
|
101
|
-
expect(react_1.screen.getByRole("link", { name: /Create group/ })).toBeInTheDocument();
|
|
102
|
-
});
|
|
103
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
-
const peers_sdk_1 = require("@peers-app/peers-sdk");
|
|
8
|
-
const react_1 = require("@testing-library/react");
|
|
9
|
-
const user_event_1 = __importDefault(require("@testing-library/user-event"));
|
|
10
|
-
const accept_invite_1 = require("./accept-invite");
|
|
11
|
-
const invites_ipc_1 = require("./invites-ipc");
|
|
12
|
-
jest.mock("@peers-app/peers-sdk", () => {
|
|
13
|
-
const actual = jest.requireActual("@peers-app/peers-sdk");
|
|
14
|
-
return {
|
|
15
|
-
...actual,
|
|
16
|
-
getUserContext: jest.fn(actual.getUserContext),
|
|
17
|
-
Invites: jest.fn(),
|
|
18
|
-
};
|
|
19
|
-
});
|
|
20
|
-
jest.mock("./invites-ipc", () => ({
|
|
21
|
-
inviteTools: jest.fn(),
|
|
22
|
-
}));
|
|
23
|
-
jest.mock("../../globals", () => ({
|
|
24
|
-
mainContentPath: jest.fn(),
|
|
25
|
-
}));
|
|
26
|
-
const preview = {
|
|
27
|
-
type: "group",
|
|
28
|
-
inviter: {
|
|
29
|
-
userId: "abcdefghijklmnopqrstuvwxy",
|
|
30
|
-
publicKey: "a".repeat(43),
|
|
31
|
-
publicBoxKey: "b".repeat(43),
|
|
32
|
-
displayName: "Ada",
|
|
33
|
-
},
|
|
34
|
-
expiresAt: "2026-10-01T00:00:00.000Z",
|
|
35
|
-
expired: false,
|
|
36
|
-
knownContact: false,
|
|
37
|
-
group: {
|
|
38
|
-
groupId: "zyxwvutsrqponmlkjihgfedcb",
|
|
39
|
-
name: "Neighbors",
|
|
40
|
-
role: 20,
|
|
41
|
-
mode: "open",
|
|
42
|
-
alreadyMember: false,
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
const pendingResult = {
|
|
46
|
-
inviteId: "openjoinrequest0000000001",
|
|
47
|
-
status: "pending",
|
|
48
|
-
deliveryState: "queued",
|
|
49
|
-
groupId: preview.group?.groupId,
|
|
50
|
-
};
|
|
51
|
-
function invite(status, deliveryState) {
|
|
52
|
-
return {
|
|
53
|
-
inviteId: pendingResult.inviteId,
|
|
54
|
-
direction: "in",
|
|
55
|
-
type: "group",
|
|
56
|
-
status,
|
|
57
|
-
mode: "open",
|
|
58
|
-
counterpart: preview.inviter,
|
|
59
|
-
groupId: preview.group?.groupId,
|
|
60
|
-
groupName: preview.group?.name,
|
|
61
|
-
role: preview.group?.role,
|
|
62
|
-
epoch: 0,
|
|
63
|
-
recipientUserId: preview.inviter.userId,
|
|
64
|
-
deliveryState,
|
|
65
|
-
createdAt: new Date("2026-09-22T00:00:00.000Z"),
|
|
66
|
-
expiresAt: new Date(preview.expiresAt),
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
describe("AcceptInvite", () => {
|
|
70
|
-
beforeEach(() => {
|
|
71
|
-
jest.clearAllMocks();
|
|
72
|
-
});
|
|
73
|
-
it("shows automatic progress and reacts when the delayed approval arrives", async () => {
|
|
74
|
-
let row = invite("pending", "queued");
|
|
75
|
-
let onDataChanged;
|
|
76
|
-
const table = {
|
|
77
|
-
get: jest.fn(async () => row),
|
|
78
|
-
dataChanged: {
|
|
79
|
-
subscribe: jest.fn((listener) => {
|
|
80
|
-
onDataChanged = listener;
|
|
81
|
-
return { unsubscribe: jest.fn() };
|
|
82
|
-
}),
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
peers_sdk_1.getUserContext.mockResolvedValue({ userDataContext: {} });
|
|
86
|
-
peers_sdk_1.Invites.mockReturnValue(table);
|
|
87
|
-
invites_ipc_1.inviteTools.mockResolvedValue({
|
|
88
|
-
previewInvite: jest.fn().mockResolvedValue({ preview }),
|
|
89
|
-
acceptInvite: jest.fn().mockResolvedValue({ result: pendingResult }),
|
|
90
|
-
});
|
|
91
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(accept_invite_1.AcceptInvite, { initialToken: "signed-token" }));
|
|
92
|
-
await user_event_1.default.click(await react_1.screen.findByRole("button", { name: "Join" }));
|
|
93
|
-
expect(await react_1.screen.findByText("Finishing your automatic join to Neighbors.")).toBeVisible();
|
|
94
|
-
expect(react_1.screen.getByText("Waiting for a route; Peers will retry automatically.")).toBeVisible();
|
|
95
|
-
expect(react_1.screen.queryByText(/once it is approved/i)).not.toBeInTheDocument();
|
|
96
|
-
row = invite("accepted", "sent");
|
|
97
|
-
await (0, react_1.act)(async () => {
|
|
98
|
-
onDataChanged?.({ dataObject: row });
|
|
99
|
-
});
|
|
100
|
-
await (0, react_1.waitFor)(() => expect(react_1.screen.getByText("You joined Neighbors.")).toBeVisible());
|
|
101
|
-
expect(react_1.screen.getByRole("button", { name: "Open group" })).toBeEnabled();
|
|
102
|
-
});
|
|
103
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
-
const react_1 = require("@testing-library/react");
|
|
8
|
-
const user_event_1 = __importDefault(require("@testing-library/user-event"));
|
|
9
|
-
const activity_view_1 = require("./activity-view");
|
|
10
|
-
const invites_ipc_1 = require("./invites-ipc");
|
|
11
|
-
const pending_invites_list_1 = require("./pending-invites-list");
|
|
12
|
-
jest.mock("./pending-invites-list", () => {
|
|
13
|
-
const actual = jest.requireActual("./pending-invites-list");
|
|
14
|
-
return {
|
|
15
|
-
...actual,
|
|
16
|
-
useInviteRows: jest.fn(),
|
|
17
|
-
};
|
|
18
|
-
});
|
|
19
|
-
jest.mock("./invites-ipc", () => ({
|
|
20
|
-
inviteTools: jest.fn(),
|
|
21
|
-
}));
|
|
22
|
-
function invite(partial) {
|
|
23
|
-
return {
|
|
24
|
-
status: "pending",
|
|
25
|
-
epoch: 1,
|
|
26
|
-
createdAt: new Date("2026-01-01T00:00:00Z"),
|
|
27
|
-
expiresAt: new Date("2026-02-01T00:00:00Z"),
|
|
28
|
-
counterpart: { userId: "abcdefghijklmnopqrstuvwxy", displayName: "Ada" },
|
|
29
|
-
...partial,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
const attention = invite({
|
|
33
|
-
inviteId: "inboundcontact0000000001",
|
|
34
|
-
direction: "in",
|
|
35
|
-
type: "contact",
|
|
36
|
-
mode: "contact",
|
|
37
|
-
});
|
|
38
|
-
const waiting = invite({
|
|
39
|
-
inviteId: "outboundcontact0000000001",
|
|
40
|
-
direction: "out",
|
|
41
|
-
type: "contact",
|
|
42
|
-
mode: "contact",
|
|
43
|
-
});
|
|
44
|
-
const joinRequest = invite({
|
|
45
|
-
inviteId: "groupjoinrequest000000001",
|
|
46
|
-
direction: "in",
|
|
47
|
-
type: "group",
|
|
48
|
-
mode: "approve",
|
|
49
|
-
groupId: "zyxwvutsrqponmlkjihgfedcb",
|
|
50
|
-
groupName: "Neighbors",
|
|
51
|
-
});
|
|
52
|
-
const history = invite({
|
|
53
|
-
inviteId: "oldcontact000000000000001",
|
|
54
|
-
direction: "in",
|
|
55
|
-
type: "contact",
|
|
56
|
-
mode: "contact",
|
|
57
|
-
status: "accepted",
|
|
58
|
-
});
|
|
59
|
-
const mockedRows = pending_invites_list_1.useInviteRows;
|
|
60
|
-
const acceptInvite = jest.fn();
|
|
61
|
-
const approveJoinRequest = jest.fn();
|
|
62
|
-
describe("ActivityView", () => {
|
|
63
|
-
beforeEach(() => {
|
|
64
|
-
acceptInvite.mockReset();
|
|
65
|
-
approveJoinRequest.mockReset();
|
|
66
|
-
invites_ipc_1.inviteTools.mockResolvedValue({
|
|
67
|
-
acceptInvite,
|
|
68
|
-
declineInvite: jest.fn(),
|
|
69
|
-
approveJoinRequest,
|
|
70
|
-
denyJoinRequest: jest.fn(),
|
|
71
|
-
revokeInvite: jest.fn(),
|
|
72
|
-
});
|
|
73
|
-
mockedRows.mockImplementation((filter) => ({
|
|
74
|
-
rows: filter.statuses?.includes("accepted") ? [history] : [attention, joinRequest, waiting],
|
|
75
|
-
hasHistory: true,
|
|
76
|
-
}));
|
|
77
|
-
});
|
|
78
|
-
it("offers approval for a received group join request", async () => {
|
|
79
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(activity_view_1.ActivityView, {}));
|
|
80
|
-
expect(react_1.screen.getByText("Ada wants to join Neighbors")).toBeInTheDocument();
|
|
81
|
-
await user_event_1.default.click(react_1.screen.getByRole("button", { name: "Approve" }));
|
|
82
|
-
await (0, react_1.waitFor)(() => expect(approveJoinRequest).toHaveBeenCalledWith({ inviteId: joinRequest.inviteId }));
|
|
83
|
-
});
|
|
84
|
-
it("splits pending invites and accepts a request from the inbox", async () => {
|
|
85
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(activity_view_1.ActivityView, {}));
|
|
86
|
-
expect(react_1.screen.getByRole("heading", { name: "Needs your attention" })).toBeInTheDocument();
|
|
87
|
-
expect(react_1.screen.getByRole("heading", { name: "Waiting on others" })).toBeInTheDocument();
|
|
88
|
-
expect(react_1.screen.getByText("Ada wants to connect")).toBeInTheDocument();
|
|
89
|
-
await user_event_1.default.click(react_1.screen.getByRole("button", { name: "Accept" }));
|
|
90
|
-
await (0, react_1.waitFor)(() => expect(acceptInvite).toHaveBeenCalledWith({ inviteId: attention.inviteId }));
|
|
91
|
-
});
|
|
92
|
-
it("switches to history and shows an empty pending inbox", async () => {
|
|
93
|
-
const view = (0, react_1.render)((0, jsx_runtime_1.jsx)(activity_view_1.ActivityView, {}));
|
|
94
|
-
await user_event_1.default.click(react_1.screen.getByRole("button", { name: "History" }));
|
|
95
|
-
expect(react_1.screen.getByRole("heading", { name: "History" })).toBeInTheDocument();
|
|
96
|
-
expect(react_1.screen.getByText(/accepted/i)).toBeInTheDocument();
|
|
97
|
-
expect(react_1.screen.queryByRole("heading", { name: "Needs your attention" })).not.toBeInTheDocument();
|
|
98
|
-
mockedRows.mockReturnValue({ rows: [], hasHistory: false });
|
|
99
|
-
view.rerender((0, jsx_runtime_1.jsx)(activity_view_1.ActivityView, {}));
|
|
100
|
-
await user_event_1.default.click(react_1.screen.getByRole("button", { name: "Pending" }));
|
|
101
|
-
expect(react_1.screen.getByText("No invites need attention.")).toBeInTheDocument();
|
|
102
|
-
});
|
|
103
|
-
it("shows the active filter", () => {
|
|
104
|
-
(0, react_1.render)((0, jsx_runtime_1.jsx)(activity_view_1.ActivityView, { filter: { type: "group", groupId: "zyxwvutsrqponmlkjihgfedcb" } }));
|
|
105
|
-
expect(react_1.screen.getByText("Showing invites for this group.")).toBeInTheDocument();
|
|
106
|
-
expect(react_1.screen.getByRole("link", { name: "Show all" })).toHaveAttribute("href", "#identity/activity");
|
|
107
|
-
});
|
|
108
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const pending_invites_list_1 = require("./pending-invites-list");
|
|
4
|
-
function invite(partial) {
|
|
5
|
-
return {
|
|
6
|
-
status: "pending",
|
|
7
|
-
epoch: 1,
|
|
8
|
-
createdAt: new Date("2026-01-01T00:00:00Z"),
|
|
9
|
-
expiresAt: new Date("2026-02-01T00:00:00Z"),
|
|
10
|
-
...partial,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
describe("classifyInvite", () => {
|
|
14
|
-
const counterpart = {
|
|
15
|
-
userId: "abcdefghijklmnopqrstuvwxy",
|
|
16
|
-
publicKey: "pk",
|
|
17
|
-
publicBoxKey: "box",
|
|
18
|
-
};
|
|
19
|
-
it("puts received decisions in attention", () => {
|
|
20
|
-
const profileRequest = invite({
|
|
21
|
-
inviteId: "1",
|
|
22
|
-
direction: "in",
|
|
23
|
-
type: "contact",
|
|
24
|
-
mode: "profile",
|
|
25
|
-
counterpart,
|
|
26
|
-
parentInviteId: "profileinvite0000000000001",
|
|
27
|
-
});
|
|
28
|
-
const directGroupInvite = invite({
|
|
29
|
-
inviteId: "2",
|
|
30
|
-
direction: "in",
|
|
31
|
-
type: "group",
|
|
32
|
-
mode: "direct",
|
|
33
|
-
counterpart,
|
|
34
|
-
});
|
|
35
|
-
const joinRequest = invite({
|
|
36
|
-
inviteId: "3",
|
|
37
|
-
direction: "in",
|
|
38
|
-
type: "group",
|
|
39
|
-
mode: "approve",
|
|
40
|
-
counterpart,
|
|
41
|
-
parentInviteId: "groupinvite00000000000001",
|
|
42
|
-
});
|
|
43
|
-
expect((0, pending_invites_list_1.classifyInvite)(profileRequest)).toBe("attention");
|
|
44
|
-
expect((0, pending_invites_list_1.actionsForInvite)(profileRequest)).toEqual(["accept", "decline"]);
|
|
45
|
-
expect((0, pending_invites_list_1.classifyInvite)(directGroupInvite)).toBe("attention");
|
|
46
|
-
expect((0, pending_invites_list_1.actionsForInvite)(directGroupInvite)).toEqual(["accept", "decline"]);
|
|
47
|
-
expect((0, pending_invites_list_1.classifyInvite)(joinRequest)).toBe("attention");
|
|
48
|
-
expect((0, pending_invites_list_1.actionsForInvite)(joinRequest)).toEqual(["approve", "deny"]);
|
|
49
|
-
});
|
|
50
|
-
it("keeps locally initiated requests and unsupported device rows waiting", () => {
|
|
51
|
-
const contactRequest = invite({
|
|
52
|
-
inviteId: "4",
|
|
53
|
-
direction: "in",
|
|
54
|
-
type: "contact",
|
|
55
|
-
mode: "profile",
|
|
56
|
-
counterpart,
|
|
57
|
-
recipientUserId: counterpart.userId,
|
|
58
|
-
});
|
|
59
|
-
const groupRequest = invite({
|
|
60
|
-
inviteId: "5",
|
|
61
|
-
direction: "in",
|
|
62
|
-
type: "group",
|
|
63
|
-
mode: "approve",
|
|
64
|
-
counterpart,
|
|
65
|
-
recipientUserId: counterpart.userId,
|
|
66
|
-
});
|
|
67
|
-
const outbound = invite({
|
|
68
|
-
inviteId: "6",
|
|
69
|
-
direction: "out",
|
|
70
|
-
type: "group",
|
|
71
|
-
mode: "open",
|
|
72
|
-
});
|
|
73
|
-
const device = invite({
|
|
74
|
-
inviteId: "7",
|
|
75
|
-
direction: "in",
|
|
76
|
-
type: "device",
|
|
77
|
-
mode: "direct",
|
|
78
|
-
counterpart,
|
|
79
|
-
});
|
|
80
|
-
expect((0, pending_invites_list_1.classifyInvite)(contactRequest)).toBe("waiting");
|
|
81
|
-
expect((0, pending_invites_list_1.actionsForInvite)(contactRequest)).toEqual([]);
|
|
82
|
-
expect((0, pending_invites_list_1.classifyInvite)(groupRequest)).toBe("waiting");
|
|
83
|
-
expect((0, pending_invites_list_1.actionsForInvite)(groupRequest)).toEqual([]);
|
|
84
|
-
expect((0, pending_invites_list_1.classifyInvite)(outbound)).toBe("waiting");
|
|
85
|
-
expect((0, pending_invites_list_1.actionsForInvite)(outbound)).toEqual(["revoke"]);
|
|
86
|
-
expect((0, pending_invites_list_1.classifyInvite)(device)).toBe("waiting");
|
|
87
|
-
expect((0, pending_invites_list_1.actionsForInvite)(device)).toEqual([]);
|
|
88
|
-
});
|
|
89
|
-
it("puts terminal rows in history", () => {
|
|
90
|
-
expect((0, pending_invites_list_1.classifyInvite)(invite({
|
|
91
|
-
inviteId: "8",
|
|
92
|
-
direction: "in",
|
|
93
|
-
type: "contact",
|
|
94
|
-
mode: "contact",
|
|
95
|
-
status: "accepted",
|
|
96
|
-
}))).toBe("history");
|
|
97
|
-
});
|
|
98
|
-
it("describes an open join as automatic rather than approval-gated", () => {
|
|
99
|
-
const openJoin = invite({
|
|
100
|
-
inviteId: "openjoinrequest0000000001",
|
|
101
|
-
direction: "in",
|
|
102
|
-
type: "group",
|
|
103
|
-
mode: "open",
|
|
104
|
-
counterpart: { ...counterpart, displayName: "Ada" },
|
|
105
|
-
recipientUserId: counterpart.userId,
|
|
106
|
-
groupName: "Neighbors",
|
|
107
|
-
deliveryState: "queued",
|
|
108
|
-
});
|
|
109
|
-
expect((0, pending_invites_list_1.describeInviteRow)(openJoin)).toEqual({
|
|
110
|
-
title: "Joining Neighbors",
|
|
111
|
-
detail: "Completing automatically; no approval is required.",
|
|
112
|
-
});
|
|
113
|
-
expect((0, pending_invites_list_1.classifyInvite)(openJoin)).toBe("waiting");
|
|
114
|
-
});
|
|
115
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const peers_sdk_1 = require("@peers-app/peers-sdk");
|
|
4
|
-
const network_viewer_ipc_1 = require("./network-viewer-ipc");
|
|
5
|
-
function setupHost(label) {
|
|
6
|
-
const [consumerTransport, providerTransport] = (0, peers_sdk_1.inProcessTransportPair)();
|
|
7
|
-
providerTransport.on(peers_sdk_1.CONTRACT_REQUEST_CHANNEL, (call) => {
|
|
8
|
-
if (call.member === "observable" && call.name === "status" && call.operation === "get") {
|
|
9
|
-
return {
|
|
10
|
-
state: "offline",
|
|
11
|
-
connectionCount: 0,
|
|
12
|
-
syncingContextCount: 0,
|
|
13
|
-
errorCount: 0,
|
|
14
|
-
disconnectedContextCount: 0,
|
|
15
|
-
connectedContextCount: 0,
|
|
16
|
-
errors: [],
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
if (call.member === "tool" && call.name === "getOverview") {
|
|
20
|
-
return { overview: { localDeviceId: label } };
|
|
21
|
-
}
|
|
22
|
-
if (call.member === "tool" && call.name === "refreshNetworkInfo") {
|
|
23
|
-
return { success: true, message: label };
|
|
24
|
-
}
|
|
25
|
-
return undefined;
|
|
26
|
-
});
|
|
27
|
-
return {
|
|
28
|
-
dispose: (0, peers_sdk_1.registerHostContractTransport)(consumerTransport),
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
describe("Network Viewer host consumers", () => {
|
|
32
|
-
it("caches consumers for one transport and recreates them after replacement", async () => {
|
|
33
|
-
const firstHost = setupHost((0, peers_sdk_1.newid)());
|
|
34
|
-
const firstDiagnostics = await (0, network_viewer_ipc_1.getNetworkDiagnosticsConsumer)();
|
|
35
|
-
expect(await (0, network_viewer_ipc_1.getNetworkDiagnosticsConsumer)()).toBe(firstDiagnostics);
|
|
36
|
-
const secondLabel = (0, peers_sdk_1.newid)();
|
|
37
|
-
const secondHost = setupHost(secondLabel);
|
|
38
|
-
const secondDiagnostics = await (0, network_viewer_ipc_1.getNetworkDiagnosticsConsumer)();
|
|
39
|
-
const control = await (0, network_viewer_ipc_1.getNetworkControlConsumer)();
|
|
40
|
-
expect(secondDiagnostics).not.toBe(firstDiagnostics);
|
|
41
|
-
await expect(firstDiagnostics.tools.getOverview()).rejects.toThrow("disposed");
|
|
42
|
-
await expect(control.tools.refreshNetworkInfo()).resolves.toEqual({
|
|
43
|
-
success: true,
|
|
44
|
-
message: secondLabel,
|
|
45
|
-
});
|
|
46
|
-
secondHost.dispose();
|
|
47
|
-
firstHost.dispose();
|
|
48
|
-
});
|
|
49
|
-
it("shares one consumer pair across concurrent callers", async () => {
|
|
50
|
-
const host = setupHost((0, peers_sdk_1.newid)());
|
|
51
|
-
const [first, second, third] = await Promise.all([
|
|
52
|
-
(0, network_viewer_ipc_1.getNetworkDiagnosticsConsumer)(),
|
|
53
|
-
(0, network_viewer_ipc_1.getNetworkDiagnosticsConsumer)(),
|
|
54
|
-
(0, network_viewer_ipc_1.getNetworkControlConsumer)(),
|
|
55
|
-
]);
|
|
56
|
-
expect(second).toBe(first);
|
|
57
|
-
const cachedControl = await (0, network_viewer_ipc_1.getNetworkControlConsumer)();
|
|
58
|
-
expect(third).toBe(cachedControl);
|
|
59
|
-
host.dispose();
|
|
60
|
-
});
|
|
61
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|