@peers-app/peers-ui 0.25.19 → 0.25.20

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.
@@ -1,5 +1,5 @@
1
1
  import { type IDoc, type IPackage } from "@peers-app/peers-sdk";
2
- /** Lists package versions with activate, promote, pin, edit-semver, and delete actions. */
2
+ /** Lists package versions with activate, promote, pin, and delete actions. */
3
3
  export declare const PackageVersionsList: (props: {
4
4
  pkg: IDoc<IPackage>;
5
5
  }) => import("react/jsx-runtime").JSX.Element;
@@ -39,7 +39,7 @@ function tagBadgeClass(tag) {
39
39
  return "text-bg-success";
40
40
  return "text-bg-secondary";
41
41
  }
42
- /** Lists package versions with activate, promote, pin, edit-semver, and delete actions. */
42
+ /** Lists package versions with activate, promote, pin, and delete actions. */
43
43
  const PackageVersionsList = (props) => {
44
44
  const { pkg } = props;
45
45
  const refreshKey = (0, hooks_1.useObservableState)(0);
@@ -157,35 +157,6 @@ const PackageVersionsList = (props) => {
157
157
  alert(`Failed to promote version: ${err instanceof Error ? err.message : String(err)}`);
158
158
  }
159
159
  }
160
- async function updateVersion(pv, newSemver) {
161
- try {
162
- const pvHash = (0, peers_sdk_1.computePackageVersionHash)(newSemver, pv.versionTag || "dev", pv.packageBundleFileHash, pv.routesBundleFileHash, pv.uiBundleFileHash);
163
- // Semver is part of the author-signed payload — re-sign or clear the old signature.
164
- const authorSig = await peers_sdk_1.rpcServerCalls.signPackageAuthorVersion({
165
- packageId: pv.packageId,
166
- packageVersionId: pv.packageVersionId,
167
- version: newSemver,
168
- versionTag: pv.versionTag,
169
- packageBundleFileHash: pv.packageBundleFileHash,
170
- routesBundleFileHash: pv.routesBundleFileHash,
171
- uiBundleFileHash: pv.uiBundleFileHash,
172
- appNavs: pv.appNavs,
173
- createdBy: pv.createdBy,
174
- createdAt: pv.createdAt,
175
- });
176
- const updated = {
177
- ...pv,
178
- version: newSemver,
179
- packageVersionHash: pvHash,
180
- packageAuthorSignature: authorSig,
181
- };
182
- await (0, peers_sdk_1.PackageVersions)().signAndSave(updated, { saveAsSnapshot: true });
183
- refreshKey(refreshKey() + 1);
184
- }
185
- catch (err) {
186
- alert(`Failed to update version: ${err instanceof Error ? err.message : String(err)}`);
187
- }
188
- }
189
160
  async function pinVersion() {
190
161
  setPinning(true);
191
162
  try {
@@ -216,7 +187,7 @@ const PackageVersionsList = (props) => {
216
187
  if (sorted.length === 0) {
217
188
  return ((0, jsx_runtime_1.jsxs)("div", { className: "text-muted text-center p-4", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-tag me-1" }), "No versions found for this package."] }));
218
189
  }
219
- return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: [sorted.length, " version", sorted.length !== 1 ? "s" : ""] }), (0, jsx_runtime_1.jsx)("div", { className: "list-group mt-2", children: sorted.map((pv) => ((0, jsx_runtime_1.jsx)(VersionRow, { pv: pv, isActive: pv.packageVersionId === effectiveActiveVersionId, isPinned: isPinned, pinning: pinning, activating: activating, deleting: deleting, userMap: userMap, onActivate: activateVersion, onDelete: deleteVersion, onPin: pinVersion, onPromote: promoteVersion, onUpdateVersion: updateVersion }, pv.packageVersionId))) })] }));
190
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: [sorted.length, " version", sorted.length !== 1 ? "s" : ""] }), (0, jsx_runtime_1.jsx)("div", { className: "list-group mt-2", children: sorted.map((pv) => ((0, jsx_runtime_1.jsx)(VersionRow, { pv: pv, isActive: pv.packageVersionId === effectiveActiveVersionId, isPinned: isPinned, pinning: pinning, activating: activating, deleting: deleting, userMap: userMap, onActivate: activateVersion, onDelete: deleteVersion, onPin: pinVersion, onPromote: promoteVersion }, pv.packageVersionId))) })] }));
220
191
  };
221
192
  exports.PackageVersionsList = PackageVersionsList;
222
193
  /**
@@ -236,25 +207,7 @@ function getPromoteTargets(currentTag) {
236
207
  function VersionRow(props) {
237
208
  const { pv, isActive, isPinned, pinning, activating, deleting, userMap } = props;
238
209
  const creatorName = userMap.get(pv.createdBy);
239
- const [editingVersion, setEditingVersion] = (0, react_1.useState)(false);
240
- const [versionDraft, setVersionDraft] = (0, react_1.useState)(pv.version);
241
- function startEditing() {
242
- setVersionDraft(pv.version);
243
- setEditingVersion(true);
244
- }
245
- function commitVersion() {
246
- const trimmed = versionDraft.trim();
247
- if (trimmed && trimmed !== pv.version) {
248
- props.onUpdateVersion(pv, trimmed);
249
- }
250
- setEditingVersion(false);
251
- }
252
210
  const currentTag = pv.versionTag || "dev";
253
211
  const promoteTargets = getPromoteTargets(currentTag);
254
- return ((0, jsx_runtime_1.jsx)("div", { className: `list-group-item ${isActive ? "list-group-item-success" : ""}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center justify-content-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center flex-wrap", children: [editingVersion ? ((0, jsx_runtime_1.jsx)("input", { type: "text", className: "form-control form-control-sm me-2", style: { width: "7em" }, value: versionDraft, onChange: (e) => setVersionDraft(e.target.value), onBlur: commitVersion, onKeyDown: (e) => {
255
- if (e.key === "Enter")
256
- commitVersion();
257
- if (e.key === "Escape")
258
- setEditingVersion(false);
259
- } })) : ((0, jsx_runtime_1.jsxs)("strong", { className: "me-2", style: { cursor: "pointer" }, onClick: startEditing, title: "Click to edit version", children: ["v", pv.version] })), pv.versionTag && ((0, jsx_runtime_1.jsx)("span", { className: `badge ${tagBadgeClass(pv.versionTag)} me-2`, children: pv.versionTag })), (0, jsx_runtime_1.jsx)("code", { className: "text-muted small me-2", children: pv.packageVersionHash?.substring(0, 8) }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted me-2", children: formatDate(pv.createdAt) }), creatorName && (0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: ["by ", creatorName] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex gap-1 align-items-center", children: [promoteTargets.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "dropdown", children: [(0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-outline-info dropdown-toggle", "data-bs-toggle": "dropdown", "data-bs-popper-config": '{"strategy":"fixed"}', title: "Change version tag", children: "Promote" }), (0, jsx_runtime_1.jsx)("ul", { className: "dropdown-menu dropdown-menu-end", children: promoteTargets.map((tag) => ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)("button", { className: "dropdown-item", onClick: () => props.onPromote(pv, tag), children: [currentTag, " \u2192 ", tag] }) }, tag))) })] })), isActive ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("button", { className: "btn btn-sm btn-outline-secondary", disabled: isPinned || pinning, onClick: () => props.onPin(), title: isPinned ? "Already pinned" : "Pin to this version (disable auto-updates)", children: [pinning ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-pin-fill" })), isPinned ? " Pinned" : " Pin"] }), (0, jsx_runtime_1.jsx)("span", { className: "badge text-bg-info align-self-center", children: "active" })] })) : ((0, jsx_runtime_1.jsxs)("button", { className: "btn btn-sm btn-outline-primary", disabled: activating === pv.packageVersionId, onClick: () => props.onActivate(pv), children: [activating === pv.packageVersionId ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm me-1" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-check2-circle me-1" })), "Activate"] })), !isActive && ((0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-outline-danger", disabled: deleting === pv.packageVersionId, onClick: () => props.onDelete(pv), children: deleting === pv.packageVersionId ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-trash" })) }))] })] }) }));
212
+ return ((0, jsx_runtime_1.jsx)("div", { className: `list-group-item ${isActive ? "list-group-item-success" : ""}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center justify-content-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center flex-wrap", children: [(0, jsx_runtime_1.jsxs)("strong", { className: "me-2", children: ["v", pv.version] }), pv.versionTag && ((0, jsx_runtime_1.jsx)("span", { className: `badge ${tagBadgeClass(pv.versionTag)} me-2`, children: pv.versionTag })), (0, jsx_runtime_1.jsx)("code", { className: "text-muted small me-2", children: pv.packageVersionHash?.substring(0, 8) }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted me-2", children: formatDate(pv.createdAt) }), creatorName && (0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: ["by ", creatorName] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex gap-1 align-items-center", children: [promoteTargets.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "dropdown", children: [(0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-outline-info dropdown-toggle", "data-bs-toggle": "dropdown", "data-bs-popper-config": '{"strategy":"fixed"}', title: "Change version tag", children: "Promote" }), (0, jsx_runtime_1.jsx)("ul", { className: "dropdown-menu dropdown-menu-end", children: promoteTargets.map((tag) => ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)("button", { className: "dropdown-item", onClick: () => props.onPromote(pv, tag), children: [currentTag, " \u2192 ", tag] }) }, tag))) })] })), isActive ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("button", { className: "btn btn-sm btn-outline-secondary", disabled: isPinned || pinning, onClick: () => props.onPin(), title: isPinned ? "Already pinned" : "Pin to this version (disable auto-updates)", children: [pinning ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-pin-fill" })), isPinned ? " Pinned" : " Pin"] }), (0, jsx_runtime_1.jsx)("span", { className: "badge text-bg-info align-self-center", children: "active" })] })) : ((0, jsx_runtime_1.jsxs)("button", { className: "btn btn-sm btn-outline-primary", disabled: activating === pv.packageVersionId, onClick: () => props.onActivate(pv), children: [activating === pv.packageVersionId ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm me-1" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-check2-circle me-1" })), "Activate"] })), !isActive && ((0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-outline-danger", disabled: deleting === pv.packageVersionId, onClick: () => props.onDelete(pv), children: deleting === pv.packageVersionId ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-trash" })) }))] })] }) }));
260
213
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peers-app/peers-ui",
3
- "version": "0.25.19",
3
+ "version": "0.25.20",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/peers-app/peers-ui.git"
@@ -30,7 +30,7 @@
30
30
  "lint:fix": "biome check --write ."
31
31
  },
32
32
  "peerDependencies": {
33
- "@peers-app/peers-sdk": "^0.25.19",
33
+ "@peers-app/peers-sdk": "^0.25.20",
34
34
  "bootstrap": "^5.3.3",
35
35
  "react": "^18.0.0",
36
36
  "react-dom": "^18.0.0"
@@ -41,7 +41,7 @@
41
41
  "@babel/preset-react": "^7.24.1",
42
42
  "@babel/preset-typescript": "^7.27.1",
43
43
  "@biomejs/biome": "2.3.11",
44
- "@peers-app/peers-sdk": "0.25.19",
44
+ "@peers-app/peers-sdk": "0.25.20",
45
45
  "@testing-library/dom": "^10.4.0",
46
46
  "@testing-library/jest-dom": "^6.6.3",
47
47
  "@testing-library/react": "^16.3.0",
@@ -43,7 +43,7 @@ function tagBadgeClass(tag?: string): string {
43
43
  return "text-bg-secondary";
44
44
  }
45
45
 
46
- /** Lists package versions with activate, promote, pin, edit-semver, and delete actions. */
46
+ /** Lists package versions with activate, promote, pin, and delete actions. */
47
47
  export const PackageVersionsList = (props: { pkg: IDoc<IPackage> }) => {
48
48
  const { pkg } = props;
49
49
  const refreshKey = useObservableState(0);
@@ -174,41 +174,6 @@ export const PackageVersionsList = (props: { pkg: IDoc<IPackage> }) => {
174
174
  }
175
175
  }
176
176
 
177
- async function updateVersion(pv: IPackageVersion, newSemver: string) {
178
- try {
179
- const pvHash = computePackageVersionHash(
180
- newSemver,
181
- pv.versionTag || "dev",
182
- pv.packageBundleFileHash,
183
- pv.routesBundleFileHash,
184
- pv.uiBundleFileHash,
185
- );
186
- // Semver is part of the author-signed payload — re-sign or clear the old signature.
187
- const authorSig = await rpcServerCalls.signPackageAuthorVersion({
188
- packageId: pv.packageId,
189
- packageVersionId: pv.packageVersionId,
190
- version: newSemver,
191
- versionTag: pv.versionTag,
192
- packageBundleFileHash: pv.packageBundleFileHash,
193
- routesBundleFileHash: pv.routesBundleFileHash,
194
- uiBundleFileHash: pv.uiBundleFileHash,
195
- appNavs: pv.appNavs,
196
- createdBy: pv.createdBy,
197
- createdAt: pv.createdAt,
198
- });
199
- const updated: IPackageVersion = {
200
- ...pv,
201
- version: newSemver,
202
- packageVersionHash: pvHash,
203
- packageAuthorSignature: authorSig,
204
- };
205
- await PackageVersions().signAndSave(updated, { saveAsSnapshot: true });
206
- refreshKey(refreshKey() + 1);
207
- } catch (err: unknown) {
208
- alert(`Failed to update version: ${err instanceof Error ? err.message : String(err)}`);
209
- }
210
- }
211
-
212
177
  async function pinVersion() {
213
178
  setPinning(true);
214
179
  try {
@@ -270,7 +235,6 @@ export const PackageVersionsList = (props: { pkg: IDoc<IPackage> }) => {
270
235
  onDelete={deleteVersion}
271
236
  onPin={pinVersion}
272
237
  onPromote={promoteVersion}
273
- onUpdateVersion={updateVersion}
274
238
  />
275
239
  ))}
276
240
  </div>
@@ -305,26 +269,9 @@ function VersionRow(props: {
305
269
  onDelete: (pv: IPackageVersion) => void;
306
270
  onPin: () => void;
307
271
  onPromote: (pv: IPackageVersion, newTag: string) => void;
308
- onUpdateVersion: (pv: IPackageVersion, newSemver: string) => void;
309
272
  }) {
310
273
  const { pv, isActive, isPinned, pinning, activating, deleting, userMap } = props;
311
274
  const creatorName = userMap.get(pv.createdBy);
312
- const [editingVersion, setEditingVersion] = useState(false);
313
- const [versionDraft, setVersionDraft] = useState(pv.version);
314
-
315
- function startEditing() {
316
- setVersionDraft(pv.version);
317
- setEditingVersion(true);
318
- }
319
-
320
- function commitVersion() {
321
- const trimmed = versionDraft.trim();
322
- if (trimmed && trimmed !== pv.version) {
323
- props.onUpdateVersion(pv, trimmed);
324
- }
325
- setEditingVersion(false);
326
- }
327
-
328
275
  const currentTag = pv.versionTag || "dev";
329
276
  const promoteTargets = getPromoteTargets(currentTag);
330
277
 
@@ -332,29 +279,8 @@ function VersionRow(props: {
332
279
  <div className={`list-group-item ${isActive ? "list-group-item-success" : ""}`}>
333
280
  <div className="d-flex align-items-center justify-content-between">
334
281
  <div className="d-flex align-items-center flex-wrap">
335
- {editingVersion ? (
336
- <input
337
- type="text"
338
- className="form-control form-control-sm me-2"
339
- style={{ width: "7em" }}
340
- value={versionDraft}
341
- onChange={(e) => setVersionDraft(e.target.value)}
342
- onBlur={commitVersion}
343
- onKeyDown={(e) => {
344
- if (e.key === "Enter") commitVersion();
345
- if (e.key === "Escape") setEditingVersion(false);
346
- }}
347
- />
348
- ) : (
349
- <strong
350
- className="me-2"
351
- style={{ cursor: "pointer" }}
352
- onClick={startEditing}
353
- title="Click to edit version"
354
- >
355
- v{pv.version}
356
- </strong>
357
- )}
282
+ {/* The number is the version baked into the bundle. Relabeling it desyncs isolated packages. */}
283
+ <strong className="me-2">v{pv.version}</strong>
358
284
  {pv.versionTag && (
359
285
  <span className={`badge ${tagBadgeClass(pv.versionTag)} me-2`}>{pv.versionTag}</span>
360
286
  )}