aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/group-page.js')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/group-page.js17
1 files changed, 14 insertions, 3 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/group-page.js b/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
index a2d6c18..48b1c80 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
@@ -6,6 +6,7 @@ import { Icon } from './icon.js';
import { transfers } from './transfers.js';
import { downloadEntry } from './file-utils.js';
import { resolveLinkedPath } from './group-link.js';
+import { copyLink, entryPath, groupItemLink } from './copy-link.js';
import {
HUB, session, hubFetch, ensureFreshToken,
_loadBundleKey, _loadRecoveryKey, _storeBundleKey,
@@ -761,6 +762,14 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
if (onLinkOpened) onLinkOpened();
}, [openPath, status, groupId]);
+ // The link "Copy link" puts on the clipboard, for an entry or a folder path
+ // (group-link.js). Null until the hub's row for the group is in: the handle
+ // is its name and its owner's, and the node knows neither.
+ const linkFor = useCallback((target) => {
+ if (!group || !group.name || !group.owner_username || !target) return null;
+ return groupItemLink(group, typeof target === 'string' ? target : entryPath(target));
+ }, [group]);
+
const refreshIndex = useCallback(async () => {
const transport = transportRef.current;
if (!transport || !transport.connected) return;
@@ -891,7 +900,7 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
entries, availableEntries, nodeDirs, nodeRoots,
setEntries, setNodeDirs, setNodeRoots, applyIndex,
isNodeAdmin, operatorPaired, attachRoot, attachDir, userId, setError, onPreview,
- onRefreshIndex: refreshIndex, onActivity: touchActivity,
+ onRefreshIndex: refreshIndex, onActivity: touchActivity, linkFor,
// Plural everywhere, and built from the registry rather than a list of app
// names kept here: Videos and Music read a list, Photos always did, and an
// application added to `APPS` gets its own entry without this file
@@ -1060,7 +1069,8 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
transportRef=${transportRef}
gekRef=${gekRef}
onClose=${() => setPreviewEntry(null)}
- onDownload=${() => downloadFileForModal(previewEntry)} />
+ onDownload=${() => downloadFileForModal(previewEntry)}
+ onCopyLink=${linkFor(previewEntry) && (() => copyLink(linkFor(previewEntry)))} />
`}
${videoEntry && html`
<${VideoPlayer}
@@ -1068,7 +1078,8 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
transportRef=${transportRef}
gekRef=${gekRef}
onClose=${() => setVideoEntry(null)}
- onDownload=${() => downloadFileForModal(videoEntry)} />
+ onDownload=${() => downloadFileForModal(videoEntry)}
+ onCopyLink=${linkFor(videoEntry) && (() => copyLink(linkFor(videoEntry)))} />
`}
</div>
`;