@powerhousedao/vetra-builder-package 0.0.25 → 0.0.26

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.
@@ -4,6 +4,7 @@ interface MembersSectionProps {
4
4
  members: BuilderTeamDocument["state"]["global"]["members"];
5
5
  onAddMember: (profileData: MemberProfileData) => boolean;
6
6
  onRemoveMember: (id: string) => void;
7
+ onUpdateMember: (id: string, profileData: Partial<MemberProfileData>) => void;
7
8
  }
8
- export declare function MembersSection({ members, onAddMember, onRemoveMember, }: MembersSectionProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function MembersSection({ members, onAddMember, onRemoveMember, onUpdateMember, }: MembersSectionProps): import("react/jsx-runtime").JSX.Element;
9
10
  export {};
@@ -4,7 +4,7 @@ import { useState } from "react";
4
4
  import { config } from "../config.js";
5
5
  import { getProfile, searchProfileOptions, getProfileOption, } from "../services/renown-api.js";
6
6
  import { truncateAddress } from "../utils/format.js";
7
- export function MembersSection({ members, onAddMember, onRemoveMember, }) {
7
+ export function MembersSection({ members, onAddMember, onRemoveMember, onUpdateMember, }) {
8
8
  const [selectedProfile, setSelectedProfile] = useState(null);
9
9
  const handleAddMember = () => {
10
10
  if (selectedProfile) {
@@ -25,9 +25,8 @@ export function MembersSection({ members, onAddMember, onRemoveMember, }) {
25
25
  : null;
26
26
  const handleUpdateMember = () => {
27
27
  if (selectedProfile && existingMember) {
28
- // Remove the old member and add the updated one
29
- onRemoveMember(existingMember.id);
30
- onAddMember({
28
+ // Update the member with new profile data
29
+ onUpdateMember(existingMember.id, {
31
30
  phid: selectedProfile.documentId,
32
31
  ethAddress: selectedProfile.ethAddress,
33
32
  name: selectedProfile.username,
@@ -75,5 +75,5 @@ export function Editor(props) {
75
75
  vetraDriveUrl: packageInfo.vetraDriveUrl,
76
76
  }));
77
77
  packageHandlers.handleCancelPackageEdit();
78
- }, onCancelPackageEdit: packageHandlers.handleCancelPackageEdit, onReorderSpaces: handleReorderSpaces, onReorderPackages: handleReorderPackages }), isAddingPackage && (_jsx(PackageForm, { spaceId: selectedSpaceForPackage, onSave: handleSavePackage, onCancel: handleCancelAddPackage }))] }), _jsxs("div", { className: "space-y-6", children: [_jsx(MembersSection, { members: members, onAddMember: memberHandlers.handleAddMember, onRemoveMember: memberHandlers.handleRemoveMember }), _jsx(QuickStats, { spaces: spaces, members: members })] })] }) })] }));
78
+ }, onCancelPackageEdit: packageHandlers.handleCancelPackageEdit, onReorderSpaces: handleReorderSpaces, onReorderPackages: handleReorderPackages }), isAddingPackage && (_jsx(PackageForm, { spaceId: selectedSpaceForPackage, onSave: handleSavePackage, onCancel: handleCancelAddPackage }))] }), _jsxs("div", { className: "space-y-6", children: [_jsx(MembersSection, { members: members, onAddMember: memberHandlers.handleAddMember, onRemoveMember: memberHandlers.handleRemoveMember, onUpdateMember: memberHandlers.handleUpdateMember }), _jsx(QuickStats, { spaces: spaces, members: members })] })] }) })] }));
79
79
  }
@@ -9,4 +9,5 @@ export interface MemberProfileData {
9
9
  export declare function useMemberHandlers(dispatch: DocumentDispatch<Action>): {
10
10
  handleAddMember: (profileData: MemberProfileData) => boolean;
11
11
  handleRemoveMember: (id: string) => void;
12
+ handleUpdateMember: (id: string, profileData: Partial<MemberProfileData>) => void;
12
13
  };
@@ -20,8 +20,18 @@ export function useMemberHandlers(dispatch) {
20
20
  const handleRemoveMember = useCallback((id) => {
21
21
  dispatch(actions.removeMember({ id }));
22
22
  }, [dispatch]);
23
+ const handleUpdateMember = useCallback((id, profileData) => {
24
+ dispatch(actions.updateMemberInfo({
25
+ id,
26
+ ...(profileData.phid !== undefined && { phid: profileData.phid }),
27
+ ...(profileData.ethAddress !== undefined && { ethAddress: profileData.ethAddress.trim() }),
28
+ ...(profileData.name !== undefined && { name: profileData.name }),
29
+ ...(profileData.profileImage !== undefined && { profileImage: profileData.profileImage }),
30
+ }));
31
+ }, [dispatch]);
23
32
  return {
24
33
  handleAddMember,
25
34
  handleRemoveMember,
35
+ handleUpdateMember,
26
36
  };
27
37
  }
@@ -1,6 +1,6 @@
1
- import type { DB } from "./schema.js";
2
1
  import type { IRelationalDb } from "document-drive";
3
- import { type BuilderTeamState, type BuilderTeamAction } from "document-models/builder-team/index.js";
2
+ import { type BuilderTeamAction, type BuilderTeamState } from "document-models/builder-team/index.js";
3
+ import type { DB } from "./schema.js";
4
4
  export declare class BuilderTeamHandlers {
5
5
  private db;
6
6
  private dbHelpers;
@@ -13,6 +13,7 @@ export declare class BuilderTeamHandlers {
13
13
  private handleUpdateSocials;
14
14
  private handleAddMember;
15
15
  private handleRemoveMember;
16
+ private handleUpdateMemberInfo;
16
17
  private handleAddSpace;
17
18
  private handleDeleteSpace;
18
19
  private handleUpdateSpaceInfo;
@@ -31,6 +31,9 @@ export class BuilderTeamHandlers {
31
31
  case "REMOVE_MEMBER":
32
32
  await this.handleRemoveMember(documentId, action, state);
33
33
  break;
34
+ case "UPDATE_MEMBER_INFO":
35
+ await this.handleUpdateMemberInfo(documentId, action, state);
36
+ break;
34
37
  // Spaces operations
35
38
  case "ADD_SPACE":
36
39
  await this.handleAddSpace(documentId, action, state);
@@ -99,6 +102,11 @@ export class BuilderTeamHandlers {
99
102
  return;
100
103
  // Find member in state to get full details
101
104
  const member = state.members.find((m) => m.id === action.input.id);
105
+ // If member not found in state, skip
106
+ if (!member) {
107
+ console.warn(`Member ${action.input.id} not found in state`);
108
+ return;
109
+ }
102
110
  const memberExists = await this.dbHelpers.memberExists(documentId, action.input.id);
103
111
  if (!memberExists) {
104
112
  await this.db
@@ -106,10 +114,10 @@ export class BuilderTeamHandlers {
106
114
  .values({
107
115
  id: action.input.id,
108
116
  builder_team_id: documentId,
109
- eth_address: member?.ethAddress || action.input.id,
110
- phid: member?.phid || null,
111
- name: member?.name || null,
112
- profile_image: member?.profileImage || null,
117
+ eth_address: member.ethAddress || "",
118
+ phid: member.phid || null,
119
+ name: member.name || null,
120
+ profile_image: member.profileImage || null,
113
121
  created_at: new Date(),
114
122
  })
115
123
  .execute();
@@ -119,10 +127,10 @@ export class BuilderTeamHandlers {
119
127
  await this.db
120
128
  .updateTable("builder_team_members")
121
129
  .set({
122
- eth_address: member?.ethAddress || action.input.id,
123
- phid: member?.phid || null,
124
- name: member?.name || null,
125
- profile_image: member?.profileImage || null,
130
+ eth_address: member.ethAddress || "",
131
+ phid: member.phid || null,
132
+ name: member.name || null,
133
+ profile_image: member.profileImage || null,
126
134
  })
127
135
  .where("id", "=", action.input.id)
128
136
  .where("builder_team_id", "=", documentId)
@@ -135,9 +143,43 @@ export class BuilderTeamHandlers {
135
143
  await this.db
136
144
  .deleteFrom("builder_team_members")
137
145
  .where("builder_team_id", "=", documentId)
138
- .where("eth_address", "=", action.input.id)
146
+ .where("id", "=", action.input.id)
139
147
  .execute();
140
148
  }
149
+ async handleUpdateMemberInfo(documentId, action, state) {
150
+ if (!action.input.id)
151
+ return;
152
+ // Find member in state to get full details
153
+ const member = state.members.find((m) => m.id === action.input.id);
154
+ // If member not found in state, skip
155
+ if (!member) {
156
+ console.warn(`Member ${action.input.id} not found in state for update`);
157
+ return;
158
+ }
159
+ const updates = {};
160
+ // Update fields from state
161
+ if (member.ethAddress !== undefined) {
162
+ updates.eth_address = member.ethAddress || "";
163
+ }
164
+ if (member.phid !== undefined) {
165
+ updates.phid = member.phid;
166
+ }
167
+ if (member.name !== undefined) {
168
+ updates.name = member.name;
169
+ }
170
+ if (member.profileImage !== undefined) {
171
+ updates.profile_image = member.profileImage;
172
+ }
173
+ // Only update if there are actual changes
174
+ if (Object.keys(updates).length > 0) {
175
+ await this.db
176
+ .updateTable("builder_team_members")
177
+ .set(updates)
178
+ .where("id", "=", action.input.id)
179
+ .where("builder_team_id", "=", documentId)
180
+ .execute();
181
+ }
182
+ }
141
183
  // Spaces operations
142
184
  async handleAddSpace(documentId, action, state) {
143
185
  await this.dbHelpers.ensureBuilderAccountExistsAndIsNotdeleted(documentId);
@@ -171,7 +213,8 @@ export class BuilderTeamHandlers {
171
213
  if (action.input.title !== undefined && action.input.title !== null) {
172
214
  updates.title = action.input.title;
173
215
  }
174
- if (action.input.description !== undefined && action.input.description !== null) {
216
+ if (action.input.description !== undefined &&
217
+ action.input.description !== null) {
175
218
  updates.description = action.input.description;
176
219
  }
177
220
  // Only update if there are actual changes
@@ -248,7 +291,8 @@ export class BuilderTeamHandlers {
248
291
  if (action.input.title !== undefined && action.input.title !== null) {
249
292
  updates.title = action.input.title;
250
293
  }
251
- if (action.input.description !== undefined && action.input.description !== null) {
294
+ if (action.input.description !== undefined &&
295
+ action.input.description !== null) {
252
296
  updates.description = action.input.description;
253
297
  }
254
298
  if (action.input.github !== undefined && action.input.github !== null) {
@@ -257,7 +301,8 @@ export class BuilderTeamHandlers {
257
301
  if (action.input.npm !== undefined && action.input.npm !== null) {
258
302
  updates.npm_url = action.input.npm;
259
303
  }
260
- if (action.input.vetraDriveUrl !== undefined && action.input.vetraDriveUrl !== null) {
304
+ if (action.input.vetraDriveUrl !== undefined &&
305
+ action.input.vetraDriveUrl !== null) {
261
306
  updates.vetra_drive_url = action.input.vetraDriveUrl;
262
307
  }
263
308
  if (action.input.spaceId !== undefined && action.input.spaceId !== null) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@powerhousedao/vetra-builder-package",
3
3
  "description": "",
4
- "version": "0.0.25",
4
+ "version": "0.0.26",
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",
7
7
  "files": [