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.js16
1 files changed, 15 insertions, 1 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 c6748f2..e897646 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
@@ -26,6 +26,12 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
onRefreshAuth, onJoined, onGroupUpdated, onPresence, onLeft,
onPlayQueue: parentOnPlayQueue, onStopMusic }) {
const [status, setStatus] = useState('idle');
+ // Whether this connection has identified a device to the node (`device_hello`).
+ // Held as state, not read off the transport at render time: it is settled
+ // inside connect() and re-settled by every reconnect, and the Chat composer
+ // gates on it — a value only a ref knows about leaves that composer disabled
+ // with no event to bring it back. Fed by transport.onDeviceIdentity below.
+ const [deviceReady, setDeviceReady] = useState(false);
const [entries, setEntries] = useState([]);
const [error, setError] = useState('');
@@ -282,6 +288,8 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
const connect = async () => {
setStatus('discovering');
setError('');
+ // Belongs to the connection about to be made, not the group just left.
+ setDeviceReady(false);
gekRef.current = null;
if (!session.bundleKey) session.bundleKey = await _loadBundleKey();
// Persisted (docs/auth-confirm.md §4.3) so a group joined in a later
@@ -325,6 +333,12 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
// connect() call can be stale by then, since the whole point is that
// some real time (screen lock, a dead NAT mapping) passed unnoticed.
transport.onNeedToken = async () => (await ensureFreshToken()) || token;
+ // Set before connect(), because connect() is where device_hello runs —
+ // and again on every reconnect it makes, which is the case this exists
+ // for: nothing else tells the page the answer changed.
+ transport.onDeviceIdentity = (ok) => {
+ if (!cancelled) setDeviceReady(ok);
+ };
const ack = await transport.connect(
nodeId, live, groupId, null, sessionKeys, session.bundleKey, username,
@@ -683,7 +697,7 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
musicbrainzConfig]);
const commonProps = {
- groupId, transportRef, gekRef, status, username,
+ groupId, transportRef, gekRef, status, username, deviceReady,
entries, availableEntries, nodeDirs, nodeRoots,
setEntries, setNodeDirs, setNodeRoots, applyIndex,
isNodeAdmin, operatorPaired, attachRoot, attachDir, userId, setError, onPreview,