@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,130 +0,0 @@
|
|
|
1
|
-
import { type Observable, unwrapObservable } from "@peers-app/peers-sdk";
|
|
2
|
-
import { last, sortBy } from "lodash";
|
|
3
|
-
import React from "react";
|
|
4
|
-
import Sortable from "sortablejs";
|
|
5
|
-
|
|
6
|
-
export interface ISortable {
|
|
7
|
-
sortOrder: number;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
interface ISortableListProps<T extends ISortable> {
|
|
11
|
-
items: Observable<T[]> | T[];
|
|
12
|
-
renderItem: (props: { item: T; listId: string; sortHandle: string }) => React.ReactNode;
|
|
13
|
-
listsGroup?: string;
|
|
14
|
-
onAdd?: (itemId: string, sortOrder: number) => void;
|
|
15
|
-
onUpdate?: (args: { items: T[]; ixMoved: number[] }) => void;
|
|
16
|
-
hidden?: boolean;
|
|
17
|
-
containerProps?: Record<string, unknown>;
|
|
18
|
-
dragHandleClassName?: string;
|
|
19
|
-
sortDirection?: "asc" | "desc";
|
|
20
|
-
minHeight?: string | number;
|
|
21
|
-
paddingBottom?: string | number;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export class SortableList<T extends ISortable> extends React.Component<
|
|
25
|
-
ISortableListProps<T>,
|
|
26
|
-
Record<string, never>
|
|
27
|
-
> {
|
|
28
|
-
constructor(props: ISortableListProps<T>) {
|
|
29
|
-
super(props);
|
|
30
|
-
this.sortHandle =
|
|
31
|
-
(this.props.dragHandleClassName && `.${this.props.dragHandleClassName}`) || this.sortHandle;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
items: T[] = [];
|
|
35
|
-
|
|
36
|
-
listId = `${Date.now()}_${Math.round(Math.random() * 100000)}`;
|
|
37
|
-
sortHandle = `.sort-handle-${this.listId}`;
|
|
38
|
-
|
|
39
|
-
calculateSortOrder(index: number) {
|
|
40
|
-
const items = this.items;
|
|
41
|
-
if (index === 0) return Date.now();
|
|
42
|
-
if (index >= items.length) {
|
|
43
|
-
const tail = last(items);
|
|
44
|
-
return (tail?.sortOrder ?? Date.now()) - 10000;
|
|
45
|
-
}
|
|
46
|
-
const above = items[index - 1].sortOrder ?? Date.now();
|
|
47
|
-
const below = items[index].sortOrder ?? Number.MIN_VALUE;
|
|
48
|
-
if (above === below)
|
|
49
|
-
alert(
|
|
50
|
-
"sort order has converged to the same number in this area. Try moving items to the top or bottom of the list to fix it",
|
|
51
|
-
);
|
|
52
|
-
return above - (above - below) / 2;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
componentDidMount() {
|
|
56
|
-
const listDiv = document.getElementById(this.listId);
|
|
57
|
-
if (!listDiv) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
Sortable.create(listDiv, {
|
|
62
|
-
handle: this.sortHandle,
|
|
63
|
-
group: { name: this.props.listsGroup || this.listId, put: !!this.props.onAdd },
|
|
64
|
-
animation: 100,
|
|
65
|
-
|
|
66
|
-
onUpdate: (evt) => {
|
|
67
|
-
const oldIndex = evt.oldIndex;
|
|
68
|
-
const newIndex = evt.newIndex;
|
|
69
|
-
if (oldIndex === undefined || newIndex === undefined) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
const items = this.items;
|
|
73
|
-
const item = items.splice(oldIndex, 1)[0];
|
|
74
|
-
if (!item) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
item.sortOrder = this.calculateSortOrder(newIndex);
|
|
78
|
-
items.splice(newIndex, 0, item);
|
|
79
|
-
// console.log(items.map(i => i.toJS()));
|
|
80
|
-
if (this.props.onUpdate) {
|
|
81
|
-
this.props.onUpdate({ items, ixMoved: [newIndex] });
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
|
|
85
|
-
onAdd: (evt) => {
|
|
86
|
-
const itemEl = evt.item; // dragged HTMLElement
|
|
87
|
-
if (evt.to !== evt.from) {
|
|
88
|
-
// first restore html hierarchy so html doesn't get out of sync with react
|
|
89
|
-
evt.to.removeChild(itemEl);
|
|
90
|
-
evt.from.appendChild(itemEl);
|
|
91
|
-
|
|
92
|
-
// now if we were given an `onAdd` function, call it
|
|
93
|
-
if (this.props.onAdd && evt.newIndex !== undefined) {
|
|
94
|
-
const itemId = evt.item.id;
|
|
95
|
-
this.props.onAdd(itemId, this.calculateSortOrder(evt.newIndex));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
public render() {
|
|
103
|
-
let items = unwrapObservable(this.props.items);
|
|
104
|
-
if (this.props.sortDirection === "asc") {
|
|
105
|
-
items = sortBy(items, (i) => i.sortOrder ?? -Infinity);
|
|
106
|
-
} else {
|
|
107
|
-
// @ts-expect-error
|
|
108
|
-
items = sortBy(items, (i) => -i.sortOrder ?? Infinity);
|
|
109
|
-
}
|
|
110
|
-
this.items = items;
|
|
111
|
-
return (
|
|
112
|
-
<div
|
|
113
|
-
id={this.listId}
|
|
114
|
-
style={{
|
|
115
|
-
minHeight: this.props.minHeight ?? "25px",
|
|
116
|
-
paddingBottom: this.props.paddingBottom ?? "10px",
|
|
117
|
-
}}
|
|
118
|
-
{...this.props.containerProps}
|
|
119
|
-
>
|
|
120
|
-
{items.map((item) =>
|
|
121
|
-
this.props.renderItem({
|
|
122
|
-
item,
|
|
123
|
-
listId: this.listId,
|
|
124
|
-
sortHandle: this.sortHandle.substring(1),
|
|
125
|
-
}),
|
|
126
|
-
)}
|
|
127
|
-
</div>
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
}
|
package/src/components/tabs.tsx
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import type React from "react";
|
|
2
|
-
import { useState } from "react";
|
|
3
|
-
import { queryParam } from "../globals";
|
|
4
|
-
|
|
5
|
-
interface ITabsProps {
|
|
6
|
-
tabs: {
|
|
7
|
-
name: string;
|
|
8
|
-
content: JSX.Element;
|
|
9
|
-
active?: true;
|
|
10
|
-
}[];
|
|
11
|
-
contentClassName?: string;
|
|
12
|
-
activeTabName?: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
let lastActive = "";
|
|
16
|
-
|
|
17
|
-
export const Tabs = (props: ITabsProps) => {
|
|
18
|
-
const { tabs } = props;
|
|
19
|
-
|
|
20
|
-
const [activeTab, _setActiveTab] = useState(() => {
|
|
21
|
-
let activeTabName = tabs.find((tab) => tab.active)?.name || queryParam("tab") || lastActive;
|
|
22
|
-
activeTabName = activeTabName.toLowerCase();
|
|
23
|
-
const _activeTab = tabs.find((tab) => tab.name.toLowerCase() === activeTabName) || tabs[0];
|
|
24
|
-
lastActive = _activeTab.name;
|
|
25
|
-
return _activeTab;
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
// Allow parent to control the active tab imperatively
|
|
29
|
-
const resolvedActiveTab = props.activeTabName
|
|
30
|
-
? (tabs.find((tab) => tab.name.toLowerCase() === props.activeTabName?.toLowerCase()) ??
|
|
31
|
-
activeTab)
|
|
32
|
-
: activeTab;
|
|
33
|
-
|
|
34
|
-
function setActiveTab(tab: { name: string; content: JSX.Element }) {
|
|
35
|
-
_setActiveTab(tab);
|
|
36
|
-
lastActive = tab.name;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<>
|
|
41
|
-
<ul className="nav nav-tabs">
|
|
42
|
-
{tabs.map((tab) => {
|
|
43
|
-
return (
|
|
44
|
-
<li key={tab.name} className="nav-item">
|
|
45
|
-
<a
|
|
46
|
-
href="#"
|
|
47
|
-
className={`nav-link ${resolvedActiveTab.name === tab.name ? "active" : ""}`}
|
|
48
|
-
onClick={(evt) => {
|
|
49
|
-
evt.preventDefault();
|
|
50
|
-
setActiveTab(tab);
|
|
51
|
-
}}
|
|
52
|
-
>
|
|
53
|
-
{tab.name}
|
|
54
|
-
</a>
|
|
55
|
-
</li>
|
|
56
|
-
);
|
|
57
|
-
})}
|
|
58
|
-
</ul>
|
|
59
|
-
<div className={`tab-content ${props.contentClassName ?? "mt-3"}`}>
|
|
60
|
-
{tabs.map((tab) => {
|
|
61
|
-
return (
|
|
62
|
-
<div key={tab.name} hidden={resolvedActiveTab.name !== tab.name}>
|
|
63
|
-
{tab.content}
|
|
64
|
-
</div>
|
|
65
|
-
);
|
|
66
|
-
})}
|
|
67
|
-
</div>
|
|
68
|
-
</>
|
|
69
|
-
);
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export const ScreenTabBody = (props: React.PropsWithChildren) => {
|
|
73
|
-
return (
|
|
74
|
-
<div style={{ maxHeight: "calc(100vh - 138px)", overflowY: "auto" }}>{props.children}</div>
|
|
75
|
-
);
|
|
76
|
-
};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { Observable } from "@peers-app/peers-sdk";
|
|
2
|
-
import type React from "react";
|
|
3
|
-
import { Popover } from "react-tiny-popover";
|
|
4
|
-
import { useObservable, useObservableState } from "../hooks";
|
|
5
|
-
import { MarkdownWithMentions } from "./markdown-with-mentions";
|
|
6
|
-
|
|
7
|
-
interface IProps {
|
|
8
|
-
markdownContent?: string | Observable<string> | Observable<string | undefined>;
|
|
9
|
-
handle?: React.ReactNode;
|
|
10
|
-
handleClassName?: string;
|
|
11
|
-
positions?: ("right" | "bottom" | "left" | "top")[];
|
|
12
|
-
genericContent?: React.ReactNode;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const Tooltip = (props: IProps) => {
|
|
16
|
-
const { handle } = props;
|
|
17
|
-
let [markdownContent] = useObservable(props.markdownContent);
|
|
18
|
-
|
|
19
|
-
markdownContent = markdownContent ?? "";
|
|
20
|
-
|
|
21
|
-
const showPopover = useObservableState(false);
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<Popover
|
|
25
|
-
isOpen={showPopover()}
|
|
26
|
-
onClickOutside={() => showPopover(false)}
|
|
27
|
-
positions={props.positions ?? ["right", "bottom", "left", "top"]}
|
|
28
|
-
content={() => (
|
|
29
|
-
<div
|
|
30
|
-
className="card p-2 bg-light-subtle"
|
|
31
|
-
style={{ maxWidth: 500, maxHeight: 400, overflowY: "auto", zIndex: 1000001 }}
|
|
32
|
-
>
|
|
33
|
-
{props.genericContent || <MarkdownWithMentions content={markdownContent} />}
|
|
34
|
-
</div>
|
|
35
|
-
)}
|
|
36
|
-
>
|
|
37
|
-
<span className={props.handleClassName ?? "p-2"} onClick={() => showPopover(!showPopover())}>
|
|
38
|
-
{handle ?? <i className="bi bi-info-circle" style={{ cursor: "pointer" }}></i>}
|
|
39
|
-
{/* <i className="fa-solid fa-note-sticky" onClick={() => showPopover(!showPopover())}></i> */}
|
|
40
|
-
</span>
|
|
41
|
-
</Popover>
|
|
42
|
-
);
|
|
43
|
-
};
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { TrustLevel } from "@peers-app/peers-sdk";
|
|
2
|
-
|
|
3
|
-
interface TrustLevelBadgeProps {
|
|
4
|
-
level: TrustLevel;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export const TrustLevelBadge = ({ level }: TrustLevelBadgeProps) => {
|
|
8
|
-
// Define trust level configurations with their numeric values
|
|
9
|
-
const trustLevelConfigs = [
|
|
10
|
-
{ value: TrustLevel.Self, color: "success", icon: "bi-shield-fill-check", text: "Self" },
|
|
11
|
-
{ value: TrustLevel.Trusted, color: "success", icon: "bi-shield-check", text: "Trusted" },
|
|
12
|
-
{ value: TrustLevel.Known, color: "primary", icon: "bi-shield-check", text: "Known" },
|
|
13
|
-
{ value: TrustLevel.NewDevice, color: "info", icon: "bi-shield-plus", text: "New Device" },
|
|
14
|
-
{ value: TrustLevel.NewUser, color: "info", icon: "bi-shield-plus", text: "New User" },
|
|
15
|
-
{ value: TrustLevel.Unknown, color: "warning", icon: "bi-shield-exclamation", text: "Unknown" },
|
|
16
|
-
{
|
|
17
|
-
value: TrustLevel.Untrusted,
|
|
18
|
-
color: "danger",
|
|
19
|
-
icon: "bi-shield-exclamation",
|
|
20
|
-
text: "Untrusted",
|
|
21
|
-
},
|
|
22
|
-
{ value: TrustLevel.Malicious, color: "danger", icon: "bi-shield-x", text: "Malicious" },
|
|
23
|
-
];
|
|
24
|
-
|
|
25
|
-
// Sort by trust level value (ascending, so lowest first)
|
|
26
|
-
const sortedConfigs = trustLevelConfigs.sort((a, b) => a.value - b.value);
|
|
27
|
-
|
|
28
|
-
// Find the highest trust level that is at or below the current level
|
|
29
|
-
let config = { color: "secondary", icon: "bi-shield", text: "Unknown" };
|
|
30
|
-
for (const trustConfig of sortedConfigs) {
|
|
31
|
-
if (level >= trustConfig.value) {
|
|
32
|
-
config = trustConfig;
|
|
33
|
-
} else {
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return (
|
|
39
|
-
<span className={`badge bg-${config.color} d-flex align-items-center gap-1`}>
|
|
40
|
-
<i className={config.icon} />
|
|
41
|
-
{config.text}
|
|
42
|
-
</span>
|
|
43
|
-
);
|
|
44
|
-
};
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type DataContext,
|
|
3
|
-
getUserContext,
|
|
4
|
-
getUserTrustLevel,
|
|
5
|
-
setUserTrustLevel,
|
|
6
|
-
TrustLevel,
|
|
7
|
-
} from "@peers-app/peers-sdk";
|
|
8
|
-
import { useEffect, useState } from "react";
|
|
9
|
-
import { LoadingIndicator } from "./loading-indicator";
|
|
10
|
-
|
|
11
|
-
interface TrustLevelDropdownProps {
|
|
12
|
-
userId: string;
|
|
13
|
-
dataContext?: DataContext;
|
|
14
|
-
onChange?: (newLevel: TrustLevel) => void;
|
|
15
|
-
type?: "user" | "device";
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/** Select a context-scoped user or device trust level, including the full-access Self grant. */
|
|
19
|
-
export const TrustLevelDropdown = ({
|
|
20
|
-
userId,
|
|
21
|
-
dataContext,
|
|
22
|
-
onChange,
|
|
23
|
-
type = "user",
|
|
24
|
-
}: TrustLevelDropdownProps) => {
|
|
25
|
-
const [trustLevel, setTrustLevelState] = useState<TrustLevel>(TrustLevel.Unknown);
|
|
26
|
-
const [loading, setLoading] = useState(true);
|
|
27
|
-
|
|
28
|
-
const allTrustLevelConfigs = [
|
|
29
|
-
{
|
|
30
|
-
value: TrustLevel.Self,
|
|
31
|
-
color: "success",
|
|
32
|
-
icon: "bi-shield-fill-check",
|
|
33
|
-
text: "Self (full remote contract access)",
|
|
34
|
-
},
|
|
35
|
-
{ value: TrustLevel.Trusted, color: "success", icon: "bi-shield-check", text: "Trusted" },
|
|
36
|
-
{ value: TrustLevel.Known, color: "primary", icon: "bi-shield-check", text: "Known" },
|
|
37
|
-
{
|
|
38
|
-
value: TrustLevel.NewDevice,
|
|
39
|
-
color: "info",
|
|
40
|
-
icon: "bi-shield-plus",
|
|
41
|
-
text: "New Device",
|
|
42
|
-
showFor: "device",
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
value: TrustLevel.NewUser,
|
|
46
|
-
color: "info",
|
|
47
|
-
icon: "bi-shield-plus",
|
|
48
|
-
text: "New User",
|
|
49
|
-
showFor: "user",
|
|
50
|
-
},
|
|
51
|
-
{ value: TrustLevel.Unknown, color: "warning", icon: "bi-shield-exclamation", text: "Unknown" },
|
|
52
|
-
{
|
|
53
|
-
value: TrustLevel.Untrusted,
|
|
54
|
-
color: "danger",
|
|
55
|
-
icon: "bi-shield-exclamation",
|
|
56
|
-
text: "Untrusted",
|
|
57
|
-
},
|
|
58
|
-
{ value: TrustLevel.Malicious, color: "danger", icon: "bi-shield-x", text: "Malicious" },
|
|
59
|
-
];
|
|
60
|
-
|
|
61
|
-
// Filter configs based on type
|
|
62
|
-
const trustLevelConfigs = allTrustLevelConfigs.filter(
|
|
63
|
-
(config) => !config.showFor || config.showFor === type,
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
useEffect(() => {
|
|
67
|
-
async function loadTrustLevel() {
|
|
68
|
-
const userContext = await getUserContext();
|
|
69
|
-
const contextToUse = dataContext || userContext.userDataContext;
|
|
70
|
-
const level = await getUserTrustLevel(contextToUse, userId);
|
|
71
|
-
setTrustLevelState(level);
|
|
72
|
-
setLoading(false);
|
|
73
|
-
}
|
|
74
|
-
loadTrustLevel();
|
|
75
|
-
}, [userId, dataContext]);
|
|
76
|
-
|
|
77
|
-
async function handleTrustLevelChange(newLevel: TrustLevel) {
|
|
78
|
-
const userContext = await getUserContext();
|
|
79
|
-
const contextToUse = dataContext || userContext.userDataContext;
|
|
80
|
-
await setUserTrustLevel(userId, newLevel, contextToUse);
|
|
81
|
-
setTrustLevelState(newLevel);
|
|
82
|
-
if (onChange) {
|
|
83
|
-
onChange(newLevel);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Find current config
|
|
88
|
-
const sortedConfigs = trustLevelConfigs.sort((a, b) => a.value - b.value);
|
|
89
|
-
let currentConfig = { color: "secondary", icon: "bi-shield", text: "Unknown" };
|
|
90
|
-
for (const config of sortedConfigs) {
|
|
91
|
-
if (trustLevel >= config.value) {
|
|
92
|
-
currentConfig = config;
|
|
93
|
-
} else {
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (loading) {
|
|
99
|
-
return <LoadingIndicator />;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return (
|
|
103
|
-
<div className="dropdown">
|
|
104
|
-
<button
|
|
105
|
-
className={`btn btn-sm btn-${currentConfig.color} dropdown-toggle d-flex align-items-center gap-1`}
|
|
106
|
-
type="button"
|
|
107
|
-
data-bs-toggle="dropdown"
|
|
108
|
-
data-bs-auto-close="true"
|
|
109
|
-
data-bs-popper-config='{"strategy":"fixed"}'
|
|
110
|
-
aria-expanded="false"
|
|
111
|
-
>
|
|
112
|
-
<i className={currentConfig.icon} />
|
|
113
|
-
{currentConfig.text}
|
|
114
|
-
</button>
|
|
115
|
-
<ul className="dropdown-menu">
|
|
116
|
-
{trustLevelConfigs.map((config) => (
|
|
117
|
-
<li key={config.value}>
|
|
118
|
-
<button
|
|
119
|
-
className="dropdown-item p-2"
|
|
120
|
-
onClick={() => handleTrustLevelChange(config.value)}
|
|
121
|
-
>
|
|
122
|
-
<span
|
|
123
|
-
className={`badge bg-${config.color} d-flex align-items-center gap-2 w-100 py-2 px-3 fs-6 ${
|
|
124
|
-
trustLevel === config.value ? "border border-dark border-2" : ""
|
|
125
|
-
}`}
|
|
126
|
-
>
|
|
127
|
-
<i className={config.icon} />
|
|
128
|
-
{config.text}
|
|
129
|
-
</span>
|
|
130
|
-
</button>
|
|
131
|
-
</li>
|
|
132
|
-
))}
|
|
133
|
-
</ul>
|
|
134
|
-
</div>
|
|
135
|
-
);
|
|
136
|
-
};
|