matrix-js-sdk
Version:
Matrix Client-Server SDK for Javascript
183 lines (172 loc) • 6.98 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PollStartEvent = exports.PollAnswerSubevent = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _matrixEventsSdk = require("matrix-events-sdk");
var _MessageEvent = require("./MessageEvent");
var _extensible_events = require("../@types/extensible_events");
var _polls = require("../@types/polls");
var _InvalidEventError = require("./InvalidEventError");
var _ExtensibleEvent = require("./ExtensibleEvent");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
/**
* Represents a poll answer. Note that this is represented as a subtype and is
* not registered as a parsable event - it is implied for usage exclusively
* within the PollStartEvent parsing.
*/
class PollAnswerSubevent extends _MessageEvent.MessageEvent {
/**
* The answer ID.
*/
constructor(wireFormat) {
super(wireFormat);
(0, _defineProperty2.default)(this, "id", void 0);
const id = wireFormat.content.id;
if (!id || typeof id !== "string") {
throw new _InvalidEventError.InvalidEventError("Answer ID must be a non-empty string");
}
this.id = id;
}
serialize() {
return {
type: "org.matrix.sdk.poll.answer",
content: _objectSpread({
id: this.id
}, this.serializeMMessageOnly())
};
}
/**
* Creates a new PollAnswerSubevent from ID and text.
* @param id - The answer ID (unique within the poll).
* @param text - The text.
* @returns The representative answer.
*/
static from(id, text) {
return new PollAnswerSubevent({
type: "org.matrix.sdk.poll.answer",
content: {
id: id,
[_extensible_events.M_TEXT.name]: text
}
});
}
}
/**
* Represents a poll start event.
*/
exports.PollAnswerSubevent = PollAnswerSubevent;
class PollStartEvent extends _ExtensibleEvent.ExtensibleEvent {
/**
* The question being asked, as a MessageEvent node.
*/
/**
* The interpreted kind of poll. Note that this will infer a value that is known to the
* SDK rather than verbatim - this means unknown types will be represented as undisclosed
* polls.
*
* To get the raw kind, use rawKind.
*/
/**
* The true kind as provided by the event sender. Might not be valid.
*/
/**
* The maximum number of selections a user is allowed to make.
*/
/**
* The possible answers for the poll.
*/
/**
* Creates a new PollStartEvent from a pure format. Note that the event is *not*
* parsed here: it will be treated as a literal m.poll.start primary typed event.
* @param wireFormat - The event.
*/
constructor(wireFormat) {
super(wireFormat);
(0, _defineProperty2.default)(this, "question", void 0);
(0, _defineProperty2.default)(this, "kind", void 0);
(0, _defineProperty2.default)(this, "rawKind", void 0);
(0, _defineProperty2.default)(this, "maxSelections", void 0);
(0, _defineProperty2.default)(this, "answers", void 0);
const poll = _polls.M_POLL_START.findIn(this.wireContent);
if (!(poll !== null && poll !== void 0 && poll.question)) {
throw new _InvalidEventError.InvalidEventError("A question is required");
}
this.question = new _MessageEvent.MessageEvent({
type: "org.matrix.sdk.poll.question",
content: poll.question
});
this.rawKind = poll.kind;
if (_polls.M_POLL_KIND_DISCLOSED.matches(this.rawKind)) {
this.kind = _polls.M_POLL_KIND_DISCLOSED;
} else {
this.kind = _polls.M_POLL_KIND_UNDISCLOSED; // default & assumed value
}
this.maxSelections = Number.isFinite(poll.max_selections) && poll.max_selections > 0 ? poll.max_selections : 1;
if (!Array.isArray(poll.answers)) {
throw new _InvalidEventError.InvalidEventError("Poll answers must be an array");
}
const answers = poll.answers.slice(0, 20).map(a => new PollAnswerSubevent({
type: "org.matrix.sdk.poll.answer",
content: a
}));
if (answers.length <= 0) {
throw new _InvalidEventError.InvalidEventError("No answers available");
}
this.answers = answers;
}
isEquivalentTo(primaryEventType) {
return (0, _extensible_events.isEventTypeSame)(primaryEventType, _polls.M_POLL_START);
}
serialize() {
return {
type: _polls.M_POLL_START.name,
content: {
[_polls.M_POLL_START.name]: {
question: this.question.serialize().content,
kind: this.rawKind,
max_selections: this.maxSelections,
answers: this.answers.map(a => a.serialize().content)
},
[_extensible_events.M_TEXT.name]: `${this.question.text}\n${this.answers.map((a, i) => `${i + 1}. ${a.text}`).join("\n")}`
}
};
}
/**
* Creates a new PollStartEvent from question, answers, and metadata.
* @param question - The question to ask.
* @param answers - The answers. Should be unique within each other.
* @param kind - The kind of poll.
* @param maxSelections - The maximum number of selections. Must be 1 or higher.
* @returns The representative poll start event.
*/
static from(question, answers, kind, maxSelections = 1) {
return new PollStartEvent({
type: _polls.M_POLL_START.name,
content: {
[_extensible_events.M_TEXT.name]: question,
// unused by parsing
[_polls.M_POLL_START.name]: {
question: {
[_extensible_events.M_TEXT.name]: question
},
kind: kind instanceof _matrixEventsSdk.NamespacedValue ? kind.name : kind,
max_selections: maxSelections,
answers: answers.map(a => ({
id: makeId(),
[_extensible_events.M_TEXT.name]: a
}))
}
}
});
}
}
exports.PollStartEvent = PollStartEvent;
const LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
function makeId() {
return [...Array(16)].map(() => LETTERS.charAt(Math.floor(Math.random() * LETTERS.length))).join("");
}
//# sourceMappingURL=PollStartEvent.js.map