matrix-react-sdk
Version:
SDK for matrix.org using React
63 lines (57 loc) • 8.43 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useBeacon = void 0;
var _react = require("react");
var _matrix = require("matrix-js-sdk/src/matrix");
var _MatrixClientContext = _interopRequireDefault(require("../../contexts/MatrixClientContext"));
var _useEventEmitter = require("../../hooks/useEventEmitter");
/*
Copyright 2024 New Vector Ltd.
Copyright 2022 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const useBeacon = beaconInfoEvent => {
const matrixClient = (0, _react.useContext)(_MatrixClientContext.default);
const [beacon, setBeacon] = (0, _react.useState)();
(0, _react.useEffect)(() => {
const roomId = beaconInfoEvent.getRoomId();
const beaconIdentifier = (0, _matrix.getBeaconInfoIdentifier)(beaconInfoEvent);
const room = matrixClient?.getRoom(roomId);
const beaconInstance = room?.currentState.beacons.get(beaconIdentifier);
// TODO could this be less stupid?
// Beacons are identified by their `state_key`,
// where `state_key` is always owner mxid for access control.
// Thus, only one beacon is allowed per-user per-room.
// See https://github.com/matrix-org/matrix-spec-proposals/pull/3672
// When a user creates a new beacon any previous
// beacon is replaced and should assume a 'stopped' state
// Here we check that this event is the latest beacon for this user
// If it is not the beacon instance is set to undefined.
// Retired beacons don't get a beacon instance.
if (beaconInstance?.beaconInfoId === beaconInfoEvent.getId()) {
setBeacon(beaconInstance);
} else {
setBeacon(undefined);
}
}, [beaconInfoEvent, matrixClient]);
// beacon update will fire when this beacon is superseded
// check the updated event id for equality to the matrix event
const beaconInstanceEventId = (0, _useEventEmitter.useEventEmitterState)(beacon, _matrix.BeaconEvent.Update, () => beacon?.beaconInfoId);
(0, _react.useEffect)(() => {
if (beaconInstanceEventId && beaconInstanceEventId !== beaconInfoEvent.getId()) {
setBeacon(undefined);
}
}, [beaconInstanceEventId, beaconInfoEvent]);
(0, _react.useEffect)(() => {
if (beacon) {
beacon.monitorLiveness();
}
}, [beacon]);
return beacon;
};
exports.useBeacon = useBeacon;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX21hdHJpeCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl91c2VFdmVudEVtaXR0ZXIiLCJ1c2VCZWFjb24iLCJiZWFjb25JbmZvRXZlbnQiLCJtYXRyaXhDbGllbnQiLCJ1c2VDb250ZXh0IiwiTWF0cml4Q2xpZW50Q29udGV4dCIsImJlYWNvbiIsInNldEJlYWNvbiIsInVzZVN0YXRlIiwidXNlRWZmZWN0Iiwicm9vbUlkIiwiZ2V0Um9vbUlkIiwiYmVhY29uSWRlbnRpZmllciIsImdldEJlYWNvbkluZm9JZGVudGlmaWVyIiwicm9vbSIsImdldFJvb20iLCJiZWFjb25JbnN0YW5jZSIsImN1cnJlbnRTdGF0ZSIsImJlYWNvbnMiLCJnZXQiLCJiZWFjb25JbmZvSWQiLCJnZXRJZCIsInVuZGVmaW5lZCIsImJlYWNvbkluc3RhbmNlRXZlbnRJZCIsInVzZUV2ZW50RW1pdHRlclN0YXRlIiwiQmVhY29uRXZlbnQiLCJVcGRhdGUiLCJtb25pdG9yTGl2ZW5lc3MiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2JlYWNvbi91c2VCZWFjb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgQmVhY29uLCBCZWFjb25FdmVudCwgTWF0cml4RXZlbnQsIGdldEJlYWNvbkluZm9JZGVudGlmaWVyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgdXNlRXZlbnRFbWl0dGVyU3RhdGUgfSBmcm9tIFwiLi4vLi4vaG9va3MvdXNlRXZlbnRFbWl0dGVyXCI7XG5cbmV4cG9ydCBjb25zdCB1c2VCZWFjb24gPSAoYmVhY29uSW5mb0V2ZW50OiBNYXRyaXhFdmVudCk6IEJlYWNvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgbWF0cml4Q2xpZW50ID0gdXNlQ29udGV4dChNYXRyaXhDbGllbnRDb250ZXh0KTtcbiAgICBjb25zdCBbYmVhY29uLCBzZXRCZWFjb25dID0gdXNlU3RhdGU8QmVhY29uPigpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3Qgcm9vbUlkID0gYmVhY29uSW5mb0V2ZW50LmdldFJvb21JZCgpO1xuICAgICAgICBjb25zdCBiZWFjb25JZGVudGlmaWVyID0gZ2V0QmVhY29uSW5mb0lkZW50aWZpZXIoYmVhY29uSW5mb0V2ZW50KTtcblxuICAgICAgICBjb25zdCByb29tID0gbWF0cml4Q2xpZW50Py5nZXRSb29tKHJvb21JZCk7XG4gICAgICAgIGNvbnN0IGJlYWNvbkluc3RhbmNlID0gcm9vbT8uY3VycmVudFN0YXRlLmJlYWNvbnMuZ2V0KGJlYWNvbklkZW50aWZpZXIpO1xuXG4gICAgICAgIC8vIFRPRE8gY291bGQgdGhpcyBiZSBsZXNzIHN0dXBpZD9cblxuICAgICAgICAvLyBCZWFjb25zIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGBzdGF0ZV9rZXlgLFxuICAgICAgICAvLyB3aGVyZSBgc3RhdGVfa2V5YCBpcyBhbHdheXMgb3duZXIgbXhpZCBmb3IgYWNjZXNzIGNvbnRyb2wuXG4gICAgICAgIC8vIFRodXMsIG9ubHkgb25lIGJlYWNvbiBpcyBhbGxvd2VkIHBlci11c2VyIHBlci1yb29tLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hdHJpeC1vcmcvbWF0cml4LXNwZWMtcHJvcG9zYWxzL3B1bGwvMzY3MlxuICAgICAgICAvLyBXaGVuIGEgdXNlciBjcmVhdGVzIGEgbmV3IGJlYWNvbiBhbnkgcHJldmlvdXNcbiAgICAgICAgLy8gYmVhY29uIGlzIHJlcGxhY2VkIGFuZCBzaG91bGQgYXNzdW1lIGEgJ3N0b3BwZWQnIHN0YXRlXG4gICAgICAgIC8vIEhlcmUgd2UgY2hlY2sgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBsYXRlc3QgYmVhY29uIGZvciB0aGlzIHVzZXJcbiAgICAgICAgLy8gSWYgaXQgaXMgbm90IHRoZSBiZWFjb24gaW5zdGFuY2UgaXMgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICAgICAgLy8gUmV0aXJlZCBiZWFjb25zIGRvbid0IGdldCBhIGJlYWNvbiBpbnN0YW5jZS5cbiAgICAgICAgaWYgKGJlYWNvbkluc3RhbmNlPy5iZWFjb25JbmZvSWQgPT09IGJlYWNvbkluZm9FdmVudC5nZXRJZCgpKSB7XG4gICAgICAgICAgICBzZXRCZWFjb24oYmVhY29uSW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0QmVhY29uKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9LCBbYmVhY29uSW5mb0V2ZW50LCBtYXRyaXhDbGllbnRdKTtcblxuICAgIC8vIGJlYWNvbiB1cGRhdGUgd2lsbCBmaXJlIHdoZW4gdGhpcyBiZWFjb24gaXMgc3VwZXJzZWRlZFxuICAgIC8vIGNoZWNrIHRoZSB1cGRhdGVkIGV2ZW50IGlkIGZvciBlcXVhbGl0eSB0byB0aGUgbWF0cml4IGV2ZW50XG4gICAgY29uc3QgYmVhY29uSW5zdGFuY2VFdmVudElkID0gdXNlRXZlbnRFbWl0dGVyU3RhdGUoYmVhY29uLCBCZWFjb25FdmVudC5VcGRhdGUsICgpID0+IGJlYWNvbj8uYmVhY29uSW5mb0lkKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChiZWFjb25JbnN0YW5jZUV2ZW50SWQgJiYgYmVhY29uSW5zdGFuY2VFdmVudElkICE9PSBiZWFjb25JbmZvRXZlbnQuZ2V0SWQoKSkge1xuICAgICAgICAgICAgc2V0QmVhY29uKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9LCBbYmVhY29uSW5zdGFuY2VFdmVudElkLCBiZWFjb25JbmZvRXZlbnRdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChiZWFjb24pIHtcbiAgICAgICAgICAgIGJlYWNvbi5tb25pdG9yTGl2ZW5lc3MoKTtcbiAgICAgICAgfVxuICAgIH0sIFtiZWFjb25dKTtcblxuICAgIHJldHVybiBiZWFjb247XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsb0JBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLGdCQUFBLEdBQUFKLE9BQUE7QUFaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFRTyxNQUFNSyxTQUFTLEdBQUlDLGVBQTRCLElBQXlCO0VBQzNFLE1BQU1DLFlBQVksR0FBRyxJQUFBQyxpQkFBVSxFQUFDQyw0QkFBbUIsQ0FBQztFQUNwRCxNQUFNLENBQUNDLE1BQU0sRUFBRUMsU0FBUyxDQUFDLEdBQUcsSUFBQUMsZUFBUSxFQUFTLENBQUM7RUFFOUMsSUFBQUMsZ0JBQVMsRUFBQyxNQUFNO0lBQ1osTUFBTUMsTUFBTSxHQUFHUixlQUFlLENBQUNTLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLE1BQU1DLGdCQUFnQixHQUFHLElBQUFDLCtCQUF1QixFQUFDWCxlQUFlLENBQUM7SUFFakUsTUFBTVksSUFBSSxHQUFHWCxZQUFZLEVBQUVZLE9BQU8sQ0FBQ0wsTUFBTSxDQUFDO0lBQzFDLE1BQU1NLGNBQWMsR0FBR0YsSUFBSSxFQUFFRyxZQUFZLENBQUNDLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDUCxnQkFBZ0IsQ0FBQzs7SUFFdkU7O0lBRUE7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsSUFBSUksY0FBYyxFQUFFSSxZQUFZLEtBQUtsQixlQUFlLENBQUNtQixLQUFLLENBQUMsQ0FBQyxFQUFFO01BQzFEZCxTQUFTLENBQUNTLGNBQWMsQ0FBQztJQUM3QixDQUFDLE1BQU07TUFDSFQsU0FBUyxDQUFDZSxTQUFTLENBQUM7SUFDeEI7RUFDSixDQUFDLEVBQUUsQ0FBQ3BCLGVBQWUsRUFBRUMsWUFBWSxDQUFDLENBQUM7O0VBRW5DO0VBQ0E7RUFDQSxNQUFNb0IscUJBQXFCLEdBQUcsSUFBQUMscUNBQW9CLEVBQUNsQixNQUFNLEVBQUVtQixtQkFBVyxDQUFDQyxNQUFNLEVBQUUsTUFBTXBCLE1BQU0sRUFBRWMsWUFBWSxDQUFDO0VBRTFHLElBQUFYLGdCQUFTLEVBQUMsTUFBTTtJQUNaLElBQUljLHFCQUFxQixJQUFJQSxxQkFBcUIsS0FBS3JCLGVBQWUsQ0FBQ21CLEtBQUssQ0FBQyxDQUFDLEVBQUU7TUFDNUVkLFNBQVMsQ0FBQ2UsU0FBUyxDQUFDO0lBQ3hCO0VBQ0osQ0FBQyxFQUFFLENBQUNDLHFCQUFxQixFQUFFckIsZUFBZSxDQUFDLENBQUM7RUFFNUMsSUFBQU8sZ0JBQVMsRUFBQyxNQUFNO0lBQ1osSUFBSUgsTUFBTSxFQUFFO01BQ1JBLE1BQU0sQ0FBQ3FCLGVBQWUsQ0FBQyxDQUFDO0lBQzVCO0VBQ0osQ0FBQyxFQUFFLENBQUNyQixNQUFNLENBQUMsQ0FBQztFQUVaLE9BQU9BLE1BQU07QUFDakIsQ0FBQztBQUFDc0IsT0FBQSxDQUFBM0IsU0FBQSxHQUFBQSxTQUFBIiwiaWdub3JlTGlzdCI6W119