@peers-app/peers-ui 0.7.2 → 0.7.3
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/components/group-switcher.js +7 -8
- package/dist/globals.d.ts +1 -1
- package/dist/screens/contacts/contact-details.js +21 -2
- package/dist/screens/contacts/contact-list.js +2 -1
- package/dist/screens/groups/group-details.js +5 -5
- package/dist/screens/groups/group-list.js +6 -7
- package/dist/screens/groups/group-members.js +7 -9
- package/dist/screens/setup-user.js +1 -0
- package/dist/tabs-layout/tabs-layout.js +1 -4
- package/package.json +3 -3
- package/src/components/group-switcher.tsx +9 -9
- package/src/screens/contacts/contact-details.tsx +26 -4
- package/src/screens/contacts/contact-list.tsx +7 -5
- package/src/screens/groups/group-details.tsx +5 -5
- package/src/screens/groups/group-list.tsx +8 -8
- package/src/screens/groups/group-members.tsx +10 -12
- package/src/screens/setup-user.tsx +2 -0
- package/src/tabs-layout/tabs-layout.tsx +1 -5
|
@@ -170,14 +170,13 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }) {
|
|
|
170
170
|
isSecret: true,
|
|
171
171
|
value: { value: groupKeys.secretKey },
|
|
172
172
|
});
|
|
173
|
-
// Add current user to the group's users table
|
|
174
|
-
await (0, peers_sdk_1.Users)(groupDataContext).save(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
});
|
|
173
|
+
// Add current user to the group's users table
|
|
174
|
+
await (0, peers_sdk_1.Users)(groupDataContext).save(me);
|
|
175
|
+
// Set trust level for current user in the group context
|
|
176
|
+
await (0, peers_sdk_1.setUserTrustLevel)(me.userId, peers_sdk_1.TrustLevel.Trusted, groupDataContext);
|
|
178
177
|
// Create group in both user's and group's context
|
|
179
178
|
const groupsTable = (0, peers_sdk_1.Groups)(userContext.userDataContext);
|
|
180
|
-
const newGroup = await groupsTable.
|
|
179
|
+
const newGroup = await groupsTable.signAndSave({
|
|
181
180
|
groupId,
|
|
182
181
|
name: trimmedName,
|
|
183
182
|
description: description.trim(),
|
|
@@ -186,9 +185,9 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }) {
|
|
|
186
185
|
disabled: false,
|
|
187
186
|
publicKey: groupKeys.publicKey,
|
|
188
187
|
publicBoxKey: groupKeys.publicBoxKey,
|
|
189
|
-
signature: '', // Will be
|
|
188
|
+
signature: '', // Will be set by signAndSave()
|
|
190
189
|
});
|
|
191
|
-
await (0, peers_sdk_1.Groups)(groupDataContext).
|
|
190
|
+
await (0, peers_sdk_1.Groups)(groupDataContext).signAndSave(newGroup);
|
|
192
191
|
// Auto-install peers-core for the new group
|
|
193
192
|
await peers_sdk_1.rpcServerCalls.addOrUpdatePackage(peers_sdk_1.peersCorePackageId, { dataContextId: groupId }).catch((err) => {
|
|
194
193
|
console.error('Error auto-installing peers-core for group:', err);
|
package/dist/globals.d.ts
CHANGED
|
@@ -16,9 +16,9 @@ export declare const groups: import("@peers-app/peers-sdk").Observable<{
|
|
|
16
16
|
description: string;
|
|
17
17
|
signature: string;
|
|
18
18
|
publicKey: string;
|
|
19
|
+
publicBoxKey: string;
|
|
19
20
|
groupId: string;
|
|
20
21
|
founderUserId: string;
|
|
21
|
-
publicBoxKey: string;
|
|
22
22
|
disabled?: boolean | undefined;
|
|
23
23
|
iconClassName?: string | undefined;
|
|
24
24
|
publicRole?: import("@peers-app/peers-sdk").GroupMemberRole | undefined;
|
|
@@ -66,6 +66,22 @@ const ContactInfo = (props) => {
|
|
|
66
66
|
};
|
|
67
67
|
const TrustLevelSelector = (props) => {
|
|
68
68
|
const { contact } = props;
|
|
69
|
+
const [trustLevel, setTrustLevelState] = react_1.default.useState(peers_sdk_1.TrustLevel.Unknown);
|
|
70
|
+
const [loading, setLoading] = react_1.default.useState(true);
|
|
71
|
+
react_1.default.useEffect(() => {
|
|
72
|
+
async function loadTrustLevel() {
|
|
73
|
+
const userContext = await (0, peers_sdk_1.getUserContext)();
|
|
74
|
+
const level = await (0, peers_sdk_1.getUserTrustLevel)(userContext.userDataContext, contact.userId);
|
|
75
|
+
setTrustLevelState(level);
|
|
76
|
+
setLoading(false);
|
|
77
|
+
}
|
|
78
|
+
loadTrustLevel();
|
|
79
|
+
}, [contact.userId]);
|
|
80
|
+
async function handleTrustLevelChange(newLevel) {
|
|
81
|
+
const userContext = await (0, peers_sdk_1.getUserContext)();
|
|
82
|
+
await (0, peers_sdk_1.setUserTrustLevel)(contact.userId, newLevel, userContext.userDataContext);
|
|
83
|
+
setTrustLevelState(newLevel);
|
|
84
|
+
}
|
|
69
85
|
const trustLevels = [
|
|
70
86
|
{ value: peers_sdk_1.TrustLevel.Self, label: 'Self', color: 'success' },
|
|
71
87
|
{ value: peers_sdk_1.TrustLevel.Trusted, label: 'Trusted', color: 'success' },
|
|
@@ -76,9 +92,12 @@ const TrustLevelSelector = (props) => {
|
|
|
76
92
|
{ value: peers_sdk_1.TrustLevel.Untrusted, label: 'Untrusted', color: 'danger' },
|
|
77
93
|
{ value: peers_sdk_1.TrustLevel.Malicious, label: 'Malicious', color: 'danger' },
|
|
78
94
|
];
|
|
79
|
-
|
|
95
|
+
if (loading) {
|
|
96
|
+
return react_1.default.createElement(loading_indicator_1.LoadingIndicator, null);
|
|
97
|
+
}
|
|
98
|
+
return (react_1.default.createElement("div", { className: "d-flex flex-wrap gap-2" }, trustLevels.map(level => (react_1.default.createElement("button", { key: level.value, className: `btn btn-sm ${trustLevel === level.value
|
|
80
99
|
? `btn-${level.color}`
|
|
81
|
-
: `btn-outline-${level.color}`}`, onClick: () =>
|
|
100
|
+
: `btn-outline-${level.color}`}`, onClick: () => handleTrustLevelChange(level.value) }, level.label)))));
|
|
82
101
|
};
|
|
83
102
|
(0, ui_loader_1.registerInternalPeersUI)({
|
|
84
103
|
peersUIId: '00contact00details00component',
|
|
@@ -87,9 +87,10 @@ function ContactList() {
|
|
|
87
87
|
name: 'New User',
|
|
88
88
|
publicKey: '',
|
|
89
89
|
publicBoxKey: '',
|
|
90
|
-
trustLevel: peers_sdk_1.TrustLevel.NewUser
|
|
91
90
|
});
|
|
92
91
|
await usersTable.save(newContact);
|
|
92
|
+
// Set initial trust level
|
|
93
|
+
await (0, peers_sdk_1.setUserTrustLevel)(userId.trim(), peers_sdk_1.TrustLevel.NewUser, userContext.userDataContext);
|
|
93
94
|
// Navigate to the details screen for the new contact
|
|
94
95
|
(0, globals_1.mainContentPath)(`contacts/${userId.trim()}`);
|
|
95
96
|
}
|
|
@@ -56,14 +56,14 @@ const GroupDetails = (props) => {
|
|
|
56
56
|
}
|
|
57
57
|
(0, tabs_state_1.updateActiveTabTitle)(group.name || "Group");
|
|
58
58
|
const groupDoc = userGroupTable.initDoc(group);
|
|
59
|
-
//
|
|
60
|
-
const originalSave = groupDoc.save;
|
|
59
|
+
// saves go to both the group and user db
|
|
61
60
|
groupDoc.save = async () => {
|
|
62
|
-
const saveResult = await originalSave();
|
|
63
61
|
const groupDataContext = userContext.getDataContext(group.groupId);
|
|
64
62
|
const groupGroupTable = (0, peers_sdk_1.Groups)(groupDataContext);
|
|
65
|
-
|
|
66
|
-
|
|
63
|
+
const groupData = groupDoc.toJS();
|
|
64
|
+
await groupGroupTable.signAndSave(groupData);
|
|
65
|
+
await userGroupTable.signAndSave(groupData);
|
|
66
|
+
return groupDoc.load();
|
|
67
67
|
};
|
|
68
68
|
const originalDelete = groupDoc.delete;
|
|
69
69
|
groupDoc.delete = async () => {
|
|
@@ -127,12 +127,11 @@ function GroupList() {
|
|
|
127
127
|
});
|
|
128
128
|
// add me to the group's users table
|
|
129
129
|
const me = await (0, peers_sdk_1.getMe)();
|
|
130
|
-
await (0, peers_sdk_1.Users)(groupDataContext).save(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
});
|
|
130
|
+
await (0, peers_sdk_1.Users)(groupDataContext).save(me);
|
|
131
|
+
// Set trust level for current user in the group context
|
|
132
|
+
await (0, peers_sdk_1.setUserTrustLevel)(me.userId, peers_sdk_1.TrustLevel.Trusted, groupDataContext);
|
|
134
133
|
// create group in both the user's and group's context
|
|
135
|
-
const group = await (0, peers_sdk_1.Groups)(userContext.userDataContext).
|
|
134
|
+
const group = await (0, peers_sdk_1.Groups)(userContext.userDataContext).signAndSave({
|
|
136
135
|
groupId,
|
|
137
136
|
name: groupName,
|
|
138
137
|
description: '',
|
|
@@ -141,9 +140,9 @@ function GroupList() {
|
|
|
141
140
|
disabled: false,
|
|
142
141
|
publicKey: groupKeys.publicKey,
|
|
143
142
|
publicBoxKey: groupKeys.publicBoxKey,
|
|
144
|
-
signature: '', //
|
|
143
|
+
signature: '', // will be set via signAndSave
|
|
145
144
|
});
|
|
146
|
-
await (0, peers_sdk_1.Groups)(groupDataContext).
|
|
145
|
+
await (0, peers_sdk_1.Groups)(groupDataContext).signAndSave(group);
|
|
147
146
|
// Auto-install peers-core for the new group
|
|
148
147
|
await peers_sdk_1.rpcServerCalls.addOrUpdatePackage(peers_sdk_1.peersCorePackageId, { dataContextId: groupId }).catch((err) => {
|
|
149
148
|
console.error('Error auto-installing peers-core for group:', err);
|
|
@@ -28,14 +28,12 @@ const GroupMembersUI = (props) => {
|
|
|
28
28
|
// If user found from external source, save to current group
|
|
29
29
|
if (user && user.source !== 'currentDataContext') {
|
|
30
30
|
try {
|
|
31
|
-
const newGroupUser =
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
publicKey: user.publicKey || '',
|
|
35
|
-
publicBoxKey: user.publicBoxKey || '',
|
|
36
|
-
trustLevel: peers_sdk_1.TrustLevel.NewUser
|
|
37
|
-
});
|
|
31
|
+
const newGroupUser = { ...user };
|
|
32
|
+
delete newGroupUser.source;
|
|
33
|
+
delete newGroupUser.trustLevel;
|
|
38
34
|
await groupUsersTable.save(newGroupUser);
|
|
35
|
+
// Set trust level for this user in the group context
|
|
36
|
+
await (0, peers_sdk_1.setUserTrustLevel)(user.userId, peers_sdk_1.TrustLevel.NewUser, groupDataContext);
|
|
39
37
|
// Update user reference to reflect it's now in current group
|
|
40
38
|
user.trustLevel = peers_sdk_1.TrustLevel.NewUser;
|
|
41
39
|
user.source = 'currentDataContext';
|
|
@@ -153,7 +151,7 @@ const GroupMembersUI = (props) => {
|
|
|
153
151
|
role: newMemberRole
|
|
154
152
|
});
|
|
155
153
|
}
|
|
156
|
-
await groupMembersTable.
|
|
154
|
+
await groupMembersTable.signAndSave(member);
|
|
157
155
|
}
|
|
158
156
|
// Reset form
|
|
159
157
|
setSelectedContacts([]);
|
|
@@ -176,7 +174,7 @@ const GroupMembersUI = (props) => {
|
|
|
176
174
|
const member = await groupMembersTable.get(memberId);
|
|
177
175
|
if (member) {
|
|
178
176
|
member.role = newRole;
|
|
179
|
-
await groupMembersTable.
|
|
177
|
+
await groupMembersTable.signAndSave(member);
|
|
180
178
|
setRefreshKey(prev => prev + 1);
|
|
181
179
|
}
|
|
182
180
|
}
|
|
@@ -46,6 +46,7 @@ const SetupUser = () => {
|
|
|
46
46
|
const [secretKey, setSecretKey] = (0, react_1.useState)('');
|
|
47
47
|
const [error, setError] = (0, react_1.useState)('');
|
|
48
48
|
const [isValidating, setIsValidating] = (0, react_1.useState)(false);
|
|
49
|
+
document.getElementById('appLoadingDiv')?.remove();
|
|
49
50
|
const isDark = _colorMode === 'dark';
|
|
50
51
|
const handleNewUser = async () => {
|
|
51
52
|
setError('');
|
|
@@ -57,7 +57,6 @@ function TabsLayoutApp() {
|
|
|
57
57
|
if (userId === undefined) {
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
|
-
document.getElementById('appLoadingDiv')?.remove();
|
|
61
60
|
if (!userId) {
|
|
62
61
|
return react_1.default.createElement(setup_user_1.SetupUser, null);
|
|
63
62
|
}
|
|
@@ -84,9 +83,7 @@ function TabsLayout(props) {
|
|
|
84
83
|
});
|
|
85
84
|
if (!loaded)
|
|
86
85
|
return false;
|
|
87
|
-
|
|
88
|
-
return react_1.default.createElement(setup_user_1.SetupUser, null);
|
|
89
|
-
}
|
|
86
|
+
document.getElementById('appLoadingDiv')?.remove();
|
|
90
87
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
91
88
|
react_1.default.createElement(TabsLayoutInternal, null),
|
|
92
89
|
react_1.default.createElement(command_palette_ui_1.CommandPaletteOverlay, null)));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peers-app/peers-ui",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.3",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/peers-app/peers-ui.git"
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"bootstrap": "^5.3.3",
|
|
30
|
-
"@peers-app/peers-sdk": "^0.7.
|
|
30
|
+
"@peers-app/peers-sdk": "^0.7.3",
|
|
31
31
|
"react": "^18.0.0",
|
|
32
32
|
"react-dom": "^18.0.0"
|
|
33
33
|
},
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"jest": "^29.7.0",
|
|
58
58
|
"jest-environment-jsdom": "^30.0.5",
|
|
59
59
|
"path-browserify": "^1.0.1",
|
|
60
|
-
"@peers-app/peers-sdk": "0.7.
|
|
60
|
+
"@peers-app/peers-sdk": "0.7.3",
|
|
61
61
|
"react": "^18.0.0",
|
|
62
62
|
"react-dom": "^18.0.0",
|
|
63
63
|
"string-width": "^7.1.0",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getMe, getUserContext, Groups, IGroup, newid, newKeys, peersCorePackageId, rpcServerCalls, TrustLevel, UserContext, Users } from "@peers-app/peers-sdk";
|
|
1
|
+
import { getMe, getUserContext, Groups, IGroup, newid, newKeys, peersCorePackageId, rpcServerCalls, setUserTrustLevel, TrustLevel, UserContext, Users } from "@peers-app/peers-sdk";
|
|
2
2
|
import React, { useEffect, useState } from 'react';
|
|
3
3
|
import { usePromise } from '../hooks';
|
|
4
4
|
|
|
@@ -229,15 +229,15 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
|
|
|
229
229
|
value: { value: groupKeys.secretKey },
|
|
230
230
|
});
|
|
231
231
|
|
|
232
|
-
// Add current user to the group's users table
|
|
233
|
-
await Users(groupDataContext).save(
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
232
|
+
// Add current user to the group's users table
|
|
233
|
+
await Users(groupDataContext).save(me);
|
|
234
|
+
|
|
235
|
+
// Set trust level for current user in the group context
|
|
236
|
+
await setUserTrustLevel(me.userId, TrustLevel.Trusted, groupDataContext);
|
|
237
237
|
|
|
238
238
|
// Create group in both user's and group's context
|
|
239
239
|
const groupsTable = Groups(userContext.userDataContext);
|
|
240
|
-
const newGroup = await groupsTable.
|
|
240
|
+
const newGroup = await groupsTable.signAndSave({
|
|
241
241
|
groupId,
|
|
242
242
|
name: trimmedName,
|
|
243
243
|
description: description.trim(),
|
|
@@ -246,10 +246,10 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
|
|
|
246
246
|
disabled: false,
|
|
247
247
|
publicKey: groupKeys.publicKey,
|
|
248
248
|
publicBoxKey: groupKeys.publicBoxKey,
|
|
249
|
-
signature: '', // Will be
|
|
249
|
+
signature: '', // Will be set by signAndSave()
|
|
250
250
|
});
|
|
251
251
|
|
|
252
|
-
await Groups(groupDataContext).
|
|
252
|
+
await Groups(groupDataContext).signAndSave(newGroup);
|
|
253
253
|
|
|
254
254
|
// Auto-install peers-core for the new group
|
|
255
255
|
await rpcServerCalls.addOrUpdatePackage(peersCorePackageId, { dataContextId: groupId }).catch((err: any) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getUserContext, IDoc, IUser, TrustLevel, Users } from "@peers-app/peers-sdk";
|
|
1
|
+
import { getUserContext, getUserTrustLevel, IDoc, IUser, setUserTrustLevel, TrustLevel, Users } from "@peers-app/peers-sdk";
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { Input } from "../../components/input";
|
|
4
4
|
import { LoadingIndicator } from "../../components/loading-indicator";
|
|
@@ -124,6 +124,24 @@ const ContactInfo = (props: { contact: IDoc<IUser> }) => {
|
|
|
124
124
|
|
|
125
125
|
const TrustLevelSelector = (props: { contact: IDoc<IUser> }) => {
|
|
126
126
|
const { contact } = props;
|
|
127
|
+
const [trustLevel, setTrustLevelState] = React.useState<TrustLevel>(TrustLevel.Unknown);
|
|
128
|
+
const [loading, setLoading] = React.useState(true);
|
|
129
|
+
|
|
130
|
+
React.useEffect(() => {
|
|
131
|
+
async function loadTrustLevel() {
|
|
132
|
+
const userContext = await getUserContext();
|
|
133
|
+
const level = await getUserTrustLevel(userContext.userDataContext, contact.userId);
|
|
134
|
+
setTrustLevelState(level);
|
|
135
|
+
setLoading(false);
|
|
136
|
+
}
|
|
137
|
+
loadTrustLevel();
|
|
138
|
+
}, [contact.userId]);
|
|
139
|
+
|
|
140
|
+
async function handleTrustLevelChange(newLevel: TrustLevel) {
|
|
141
|
+
const userContext = await getUserContext();
|
|
142
|
+
await setUserTrustLevel(contact.userId, newLevel, userContext.userDataContext);
|
|
143
|
+
setTrustLevelState(newLevel);
|
|
144
|
+
}
|
|
127
145
|
|
|
128
146
|
const trustLevels = [
|
|
129
147
|
{ value: TrustLevel.Self, label: 'Self', color: 'success' },
|
|
@@ -136,17 +154,21 @@ const TrustLevelSelector = (props: { contact: IDoc<IUser> }) => {
|
|
|
136
154
|
{ value: TrustLevel.Malicious, label: 'Malicious', color: 'danger' },
|
|
137
155
|
];
|
|
138
156
|
|
|
157
|
+
if (loading) {
|
|
158
|
+
return <LoadingIndicator />;
|
|
159
|
+
}
|
|
160
|
+
|
|
139
161
|
return (
|
|
140
162
|
<div className="d-flex flex-wrap gap-2">
|
|
141
163
|
{trustLevels.map(level => (
|
|
142
164
|
<button
|
|
143
165
|
key={level.value}
|
|
144
166
|
className={`btn btn-sm ${
|
|
145
|
-
|
|
146
|
-
? `btn-${level.color}`
|
|
167
|
+
trustLevel === level.value
|
|
168
|
+
? `btn-${level.color}`
|
|
147
169
|
: `btn-outline-${level.color}`
|
|
148
170
|
}`}
|
|
149
|
-
onClick={() =>
|
|
171
|
+
onClick={() => handleTrustLevelChange(level.value)}
|
|
150
172
|
>
|
|
151
173
|
{level.label}
|
|
152
174
|
</button>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getUserContext, ICursorIterable, IUserWithSource, observable, TrustLevel, Users, usersCursor } from "@peers-app/peers-sdk";
|
|
1
|
+
import { getUserContext, ICursorIterable, IUserWithSource, observable, setUserTrustLevel, TrustLevel, Users, usersCursor } from "@peers-app/peers-sdk";
|
|
2
2
|
import React, { useEffect, useState } from 'react';
|
|
3
3
|
import { Input } from '../../components/input';
|
|
4
4
|
import { LazyList } from '../../components/lazy-list';
|
|
@@ -49,17 +49,19 @@ export function ContactList() {
|
|
|
49
49
|
try {
|
|
50
50
|
const userContext = await getUserContext();
|
|
51
51
|
const usersTable = Users(userContext.userDataContext);
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
const newContact = await usersTable.initRecord({
|
|
54
54
|
userId: userId.trim(),
|
|
55
55
|
name: 'New User',
|
|
56
56
|
publicKey: '',
|
|
57
57
|
publicBoxKey: '',
|
|
58
|
-
trustLevel: TrustLevel.NewUser
|
|
59
58
|
});
|
|
60
|
-
|
|
59
|
+
|
|
61
60
|
await usersTable.save(newContact);
|
|
62
|
-
|
|
61
|
+
|
|
62
|
+
// Set initial trust level
|
|
63
|
+
await setUserTrustLevel(userId.trim(), TrustLevel.NewUser, userContext.userDataContext);
|
|
64
|
+
|
|
63
65
|
// Navigate to the details screen for the new contact
|
|
64
66
|
mainContentPath(`contacts/${userId.trim()}`);
|
|
65
67
|
} catch (error) {
|
|
@@ -26,14 +26,14 @@ export const GroupDetails = (props: IProps) => {
|
|
|
26
26
|
}
|
|
27
27
|
updateActiveTabTitle(group.name || "Group");
|
|
28
28
|
const groupDoc = userGroupTable.initDoc(group);
|
|
29
|
-
//
|
|
30
|
-
const originalSave = groupDoc.save;
|
|
29
|
+
// saves go to both the group and user db
|
|
31
30
|
groupDoc.save = async () => {
|
|
32
|
-
const saveResult = await originalSave();
|
|
33
31
|
const groupDataContext = userContext.getDataContext(group.groupId);
|
|
34
32
|
const groupGroupTable = Groups(groupDataContext);
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
const groupData = groupDoc.toJS();
|
|
34
|
+
await groupGroupTable.signAndSave(groupData);
|
|
35
|
+
await userGroupTable.signAndSave(groupData);
|
|
36
|
+
return groupDoc.load();
|
|
37
37
|
}
|
|
38
38
|
const originalDelete = groupDoc.delete;
|
|
39
39
|
groupDoc.delete = async () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getMe, getUserContext, Groups, ICursorIterable, IGroup, newid, newKeys, observable, peersCorePackageId, rpcServerCalls, TrustLevel, Users } from "@peers-app/peers-sdk";
|
|
1
|
+
import { getMe, getUserContext, Groups, ICursorIterable, IGroup, newid, newKeys, observable, peersCorePackageId, rpcServerCalls, setUserTrustLevel, TrustLevel, Users } from "@peers-app/peers-sdk";
|
|
2
2
|
import React, { useEffect, useState } from 'react';
|
|
3
3
|
import { Input } from '../../components/input';
|
|
4
4
|
import { LazyList } from '../../components/lazy-list';
|
|
@@ -98,13 +98,13 @@ export function GroupList() {
|
|
|
98
98
|
|
|
99
99
|
// add me to the group's users table
|
|
100
100
|
const me = await getMe();
|
|
101
|
-
await Users(groupDataContext).save(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
101
|
+
await Users(groupDataContext).save(me);
|
|
102
|
+
|
|
103
|
+
// Set trust level for current user in the group context
|
|
104
|
+
await setUserTrustLevel(me.userId, TrustLevel.Trusted, groupDataContext);
|
|
105
105
|
|
|
106
106
|
// create group in both the user's and group's context
|
|
107
|
-
const group = await Groups(userContext.userDataContext).
|
|
107
|
+
const group = await Groups(userContext.userDataContext).signAndSave({
|
|
108
108
|
groupId,
|
|
109
109
|
name: groupName,
|
|
110
110
|
description: '',
|
|
@@ -113,9 +113,9 @@ export function GroupList() {
|
|
|
113
113
|
disabled: false,
|
|
114
114
|
publicKey: groupKeys.publicKey,
|
|
115
115
|
publicBoxKey: groupKeys.publicBoxKey,
|
|
116
|
-
signature: '', //
|
|
116
|
+
signature: '', // will be set via signAndSave
|
|
117
117
|
});
|
|
118
|
-
await Groups(groupDataContext).
|
|
118
|
+
await Groups(groupDataContext).signAndSave(group);
|
|
119
119
|
|
|
120
120
|
// Auto-install peers-core for the new group
|
|
121
121
|
await rpcServerCalls.addOrUpdatePackage(peersCorePackageId, { dataContextId: groupId }).catch((err: any) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GroupMembers, getUserContext, IUserWithSource, usersCursor, getUserById, Users, TrustLevel, GroupMemberRole, getUserRole, getRoleLabel, Groups, UserContext } from "@peers-app/peers-sdk";
|
|
1
|
+
import { GroupMembers, getUserContext, IUserWithSource, usersCursor, getUserById, Users, TrustLevel, GroupMemberRole, getUserRole, getRoleLabel, Groups, UserContext, setUserTrustLevel, IUser } from "@peers-app/peers-sdk";
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { LoadingIndicator } from "../../components/loading-indicator";
|
|
4
4
|
import { Typeahead, TypeaheadItem } from "../../components/typeahead";
|
|
@@ -34,16 +34,14 @@ export const GroupMembersUI = (props: GroupMembersUIProps) => {
|
|
|
34
34
|
// If user found from external source, save to current group
|
|
35
35
|
if (user && user.source !== 'currentDataContext') {
|
|
36
36
|
try {
|
|
37
|
-
const newGroupUser =
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
publicKey: user.publicKey || '',
|
|
41
|
-
publicBoxKey: user.publicBoxKey || '',
|
|
42
|
-
trustLevel: TrustLevel.NewUser
|
|
43
|
-
});
|
|
44
|
-
|
|
37
|
+
const newGroupUser: IUser = { ...user };
|
|
38
|
+
delete (newGroupUser as any).source;
|
|
39
|
+
delete (newGroupUser as any).trustLevel;
|
|
45
40
|
await groupUsersTable.save(newGroupUser);
|
|
46
|
-
|
|
41
|
+
|
|
42
|
+
// Set trust level for this user in the group context
|
|
43
|
+
await setUserTrustLevel(user.userId, TrustLevel.NewUser, groupDataContext);
|
|
44
|
+
|
|
47
45
|
// Update user reference to reflect it's now in current group
|
|
48
46
|
user.trustLevel = TrustLevel.NewUser;
|
|
49
47
|
user.source = 'currentDataContext';
|
|
@@ -183,7 +181,7 @@ export const GroupMembersUI = (props: GroupMembersUIProps) => {
|
|
|
183
181
|
role: newMemberRole
|
|
184
182
|
});
|
|
185
183
|
}
|
|
186
|
-
await groupMembersTable.
|
|
184
|
+
await groupMembersTable.signAndSave(member);
|
|
187
185
|
}
|
|
188
186
|
|
|
189
187
|
// Reset form
|
|
@@ -210,7 +208,7 @@ export const GroupMembersUI = (props: GroupMembersUIProps) => {
|
|
|
210
208
|
const member = await groupMembersTable.get(memberId);
|
|
211
209
|
if (member) {
|
|
212
210
|
member.role = newRole;
|
|
213
|
-
await groupMembersTable.
|
|
211
|
+
await groupMembersTable.signAndSave(member);
|
|
214
212
|
setRefreshKey(prev => prev + 1);
|
|
215
213
|
}
|
|
216
214
|
} catch (err) {
|
|
@@ -14,6 +14,8 @@ export const SetupUser = () => {
|
|
|
14
14
|
const [error, setError] = useState('');
|
|
15
15
|
const [isValidating, setIsValidating] = useState(false);
|
|
16
16
|
|
|
17
|
+
document.getElementById('appLoadingDiv')?.remove();
|
|
18
|
+
|
|
17
19
|
const isDark = _colorMode === 'dark';
|
|
18
20
|
|
|
19
21
|
const handleNewUser = async () => {
|
|
@@ -23,8 +23,6 @@ export function TabsLayoutApp() {
|
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
document.getElementById('appLoadingDiv')?.remove();
|
|
27
|
-
|
|
28
26
|
if (!userId) {
|
|
29
27
|
return <SetupUser />;
|
|
30
28
|
} else {
|
|
@@ -53,9 +51,7 @@ export function TabsLayout(props: { userId: string }) {
|
|
|
53
51
|
|
|
54
52
|
if (!loaded) return false;
|
|
55
53
|
|
|
56
|
-
|
|
57
|
-
return <SetupUser />
|
|
58
|
-
}
|
|
54
|
+
document.getElementById('appLoadingDiv')?.remove();
|
|
59
55
|
|
|
60
56
|
return (
|
|
61
57
|
<>
|