mirror of https://github.com/vector-im/riot-web
Merge branch 'develop' into matthew/slate
commit
b60ccad29b
80
CHANGELOG.md
80
CHANGELOG.md
|
@ -1,3 +1,83 @@
|
|||
Changes in [0.12.4-rc.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4-rc.3) (2018-05-11)
|
||||
===============================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4-rc.2...v0.12.4-rc.3)
|
||||
|
||||
* Instant Sticker Picker :zap:
|
||||
[\#1888](https://github.com/matrix-org/matrix-react-sdk/pull/1888)
|
||||
|
||||
Changes in [0.12.4-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4-rc.2) (2018-05-09)
|
||||
===============================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.4-rc.1...v0.12.4-rc.2)
|
||||
|
||||
* Improve appearance of short-lived widget loading spinner
|
||||
* Make sticker picker fully-fledged feature
|
||||
* Fix incorrect positioning with widget loading indicator
|
||||
|
||||
Changes in [0.12.4-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.4-rc.1) (2018-05-09)
|
||||
===============================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.3...v0.12.4-rc.1)
|
||||
|
||||
* Update from Weblate.
|
||||
[\#1881](https://github.com/matrix-org/matrix-react-sdk/pull/1881)
|
||||
* Pin lolex at 2.3.2 to avoid bug causing tests to fail
|
||||
[\#1880](https://github.com/matrix-org/matrix-react-sdk/pull/1880)
|
||||
* Replies: un-break click-to-mention on SenderProfile for reply&preview
|
||||
[\#1878](https://github.com/matrix-org/matrix-react-sdk/pull/1878)
|
||||
* Add tests for RoomList
|
||||
[\#1877](https://github.com/matrix-org/matrix-react-sdk/pull/1877)
|
||||
* Fix crash when browser doesn't report page change measurement
|
||||
[\#1874](https://github.com/matrix-org/matrix-react-sdk/pull/1874)
|
||||
* fix thinko when changing from ClientPeg to context in static method (DUH)
|
||||
[\#1875](https://github.com/matrix-org/matrix-react-sdk/pull/1875)
|
||||
* Fix Replies :D
|
||||
[\#1873](https://github.com/matrix-org/matrix-react-sdk/pull/1873)
|
||||
* Update eslint-plugin-react
|
||||
[\#1871](https://github.com/matrix-org/matrix-react-sdk/pull/1871)
|
||||
* relax lint for jsx-curly-spacing and arrow-parens
|
||||
[\#1872](https://github.com/matrix-org/matrix-react-sdk/pull/1872)
|
||||
* Use develop js-sdk in jenkins build
|
||||
[\#1870](https://github.com/matrix-org/matrix-react-sdk/pull/1870)
|
||||
* Replies
|
||||
[\#1741](https://github.com/matrix-org/matrix-react-sdk/pull/1741)
|
||||
* Use the right js-sdk branch when testing
|
||||
[\#1869](https://github.com/matrix-org/matrix-react-sdk/pull/1869)
|
||||
* Prevent error responses wedging group request concurrency limit
|
||||
[\#1867](https://github.com/matrix-org/matrix-react-sdk/pull/1867)
|
||||
* Refresh group rooms and members when selecting a tag
|
||||
[\#1868](https://github.com/matrix-org/matrix-react-sdk/pull/1868)
|
||||
* Refactor GroupStores into one global GroupStore
|
||||
[\#1866](https://github.com/matrix-org/matrix-react-sdk/pull/1866)
|
||||
* Switch back to using blob URLs for rendering e2e attachments
|
||||
[\#1864](https://github.com/matrix-org/matrix-react-sdk/pull/1864)
|
||||
* Hide inline encryption icons except when hovering over a message
|
||||
[\#1845](https://github.com/matrix-org/matrix-react-sdk/pull/1845)
|
||||
* UI fixes in SessionRestoreErrorDialog
|
||||
[\#1860](https://github.com/matrix-org/matrix-react-sdk/pull/1860)
|
||||
* Fix UX issues with bug report dialog
|
||||
[\#1863](https://github.com/matrix-org/matrix-react-sdk/pull/1863)
|
||||
* fix ugly img errors and correctly render SVG thumbnails
|
||||
[\#1865](https://github.com/matrix-org/matrix-react-sdk/pull/1865)
|
||||
* Fix error handling on session restore
|
||||
[\#1859](https://github.com/matrix-org/matrix-react-sdk/pull/1859)
|
||||
* Add tests for GroupView
|
||||
[\#1862](https://github.com/matrix-org/matrix-react-sdk/pull/1862)
|
||||
* Update version of hoek
|
||||
[\#1861](https://github.com/matrix-org/matrix-react-sdk/pull/1861)
|
||||
* Fix bug that caused crash when analytics HS/IS whitelists not specified
|
||||
[\#1858](https://github.com/matrix-org/matrix-react-sdk/pull/1858)
|
||||
* Fix Analytics to not import DEFAULTS, therefore avoiding NPE
|
||||
[\#1857](https://github.com/matrix-org/matrix-react-sdk/pull/1857)
|
||||
* Null check piwik config before using it
|
||||
[\#1856](https://github.com/matrix-org/matrix-react-sdk/pull/1856)
|
||||
* Track actual window location origin and hash
|
||||
[\#1853](https://github.com/matrix-org/matrix-react-sdk/pull/1853)
|
||||
* Replace document.origin with window.location.origin
|
||||
[\#1855](https://github.com/matrix-org/matrix-react-sdk/pull/1855)
|
||||
* Optionally hide widget popout button.
|
||||
[\#1854](https://github.com/matrix-org/matrix-react-sdk/pull/1854)
|
||||
* Add a button to 'pop out' widgets in to their own tab.
|
||||
[\#1851](https://github.com/matrix-org/matrix-react-sdk/pull/1851)
|
||||
|
||||
Changes in [0.12.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.3) (2018-04-30)
|
||||
=====================================================================================================
|
||||
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.3-rc.3...v0.12.3)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "matrix-react-sdk",
|
||||
"version": "0.12.3",
|
||||
"version": "0.12.4-rc.3",
|
||||
"description": "SDK for matrix.org using React",
|
||||
"author": "matrix.org",
|
||||
"repository": {
|
||||
|
|
|
@ -14,8 +14,13 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
*/
|
||||
|
||||
.mx_ReplyThread {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.mx_ReplyThread .mx_DateSeparator {
|
||||
font-size: 1em !important;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
padding-bottom: 1px;
|
||||
bottom: -5px;
|
||||
|
|
|
@ -116,6 +116,12 @@ export default class FromWidgetPostMessageApi {
|
|||
return; // don't log this - debugging APIs like to spam postMessage which floods the log otherwise
|
||||
}
|
||||
|
||||
// Although the requestId is required, we don't use it. We'll be nice and process the message
|
||||
// if the property is missing, but with a warning for widget developers.
|
||||
if (!event.data.requestId) {
|
||||
console.warn("fromWidget action '" + event.data.action + "' does not have a requestId");
|
||||
}
|
||||
|
||||
const action = event.data.action;
|
||||
const widgetId = event.data.widgetId;
|
||||
if (action === 'content_loaded') {
|
||||
|
|
|
@ -51,11 +51,11 @@ export default class ToWidgetPostMessageApi {
|
|||
if (payload.response === undefined) {
|
||||
return;
|
||||
}
|
||||
const promise = this._requestMap[payload._id];
|
||||
const promise = this._requestMap[payload.requestId];
|
||||
if (!promise) {
|
||||
return;
|
||||
}
|
||||
delete this._requestMap[payload._id];
|
||||
delete this._requestMap[payload.requestId];
|
||||
promise.resolve(payload);
|
||||
}
|
||||
|
||||
|
@ -64,21 +64,21 @@ export default class ToWidgetPostMessageApi {
|
|||
targetWindow = targetWindow || window.parent; // default to parent window
|
||||
targetOrigin = targetOrigin || "*";
|
||||
this._counter += 1;
|
||||
action._id = Date.now() + "-" + Math.random().toString(36) + "-" + this._counter;
|
||||
action.requestId = Date.now() + "-" + Math.random().toString(36) + "-" + this._counter;
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
this._requestMap[action._id] = {resolve, reject};
|
||||
this._requestMap[action.requestId] = {resolve, reject};
|
||||
targetWindow.postMessage(action, targetOrigin);
|
||||
|
||||
if (this._timeoutMs > 0) {
|
||||
setTimeout(() => {
|
||||
if (!this._requestMap[action._id]) {
|
||||
if (!this._requestMap[action.requestId]) {
|
||||
return;
|
||||
}
|
||||
console.error("postMessage request timed out. Sent object: " + JSON.stringify(action),
|
||||
this._requestMap);
|
||||
this._requestMap[action._id].reject(new Error("Timed out"));
|
||||
delete this._requestMap[action._id];
|
||||
this._requestMap[action.requestId].reject(new Error("Timed out"));
|
||||
delete this._requestMap[action.requestId];
|
||||
}, this._timeoutMs);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -44,6 +44,8 @@ export default class WidgetMessaging {
|
|||
}
|
||||
|
||||
messageToWidget(action) {
|
||||
action.widgetId = this.widgetId; // Required to be sent for all outbound requests
|
||||
|
||||
return this.toWidget.exec(action, this.target).then((data) => {
|
||||
// Check for errors and reject if found
|
||||
if (data.response === undefined) { // null is valid
|
||||
|
|
|
@ -80,6 +80,7 @@ const SIMPLE_SETTINGS = [
|
|||
{ id: "TextualBody.disableBigEmoji" },
|
||||
{ id: "VideoView.flipVideoHorizontally" },
|
||||
{ id: "TagPanel.disableTagPanel" },
|
||||
{ id: "enableWidgetScreenshots" },
|
||||
];
|
||||
|
||||
// These settings must be defined in SettingsStore
|
||||
|
|
|
@ -85,7 +85,7 @@ export default class AppTile extends React.Component {
|
|||
|
||||
/**
|
||||
* Does the widget support a given capability
|
||||
* @param {[type]} capability Capability to check for
|
||||
* @param {string} capability Capability to check for
|
||||
* @return {Boolean} True if capability supported
|
||||
*/
|
||||
_hasCapability(capability) {
|
||||
|
@ -364,9 +364,7 @@ export default class AppTile extends React.Component {
|
|||
if (!this.widgetMessaging) {
|
||||
this._onInitialLoad();
|
||||
}
|
||||
if (this._exposeWidgetMessaging) {
|
||||
this._exposeWidgetMessaging(this.widgetMessaging);
|
||||
}
|
||||
this.setState({loading: false});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -404,8 +402,6 @@ export default class AppTile extends React.Component {
|
|||
}).catch((err) => {
|
||||
console.log(`Failed to get capabilities for widget type ${this.props.type}`, this.props.id, err);
|
||||
});
|
||||
|
||||
this.setState({loading: false});
|
||||
}
|
||||
|
||||
_onWidgetAction(payload) {
|
||||
|
@ -607,7 +603,7 @@ export default class AppTile extends React.Component {
|
|||
}
|
||||
|
||||
// Picture snapshot - only show button when apps are maximised.
|
||||
const showPictureSnapshotButton = this._hasCapability('screenshot') && this.props.show;
|
||||
const showPictureSnapshotButton = this._hasCapability('m.capability.screenshot') && this.props.show;
|
||||
const showPictureSnapshotIcon = 'img/camera_green.svg';
|
||||
const popoutWidgetIcon = 'img/button-new-window.svg';
|
||||
const windowStateIcon = (this.props.show ? 'img/minimize.svg' : 'img/maximize.svg');
|
||||
|
@ -711,7 +707,7 @@ AppTile.propTypes = {
|
|||
showDelete: PropTypes.bool,
|
||||
// Optionally hide the popout widget icon
|
||||
showPopout: PropTypes.bool,
|
||||
// Widget apabilities to allow by default (without user confirmation)
|
||||
// Widget capabilities to allow by default (without user confirmation)
|
||||
// NOTE -- Use with caution. This is intended to aid better integration / UX
|
||||
// basic widget capabilities, e.g. injecting sticker message events.
|
||||
whitelistCapabilities: PropTypes.array,
|
||||
|
|
|
@ -107,6 +107,16 @@ export default class MStickerBody extends MImageBody {
|
|||
placeholderFixupHeight = content.info.h + 'px';
|
||||
}
|
||||
|
||||
// The pixel size of sticker images is generally larger than their intended display
|
||||
// size so they render at native reolution on HiDPI displays. We therefore need to
|
||||
// explicity set the size so they render at the intended size.
|
||||
// XXX: This will be clobberred when we run fixupHeight(), but we need to do it
|
||||
// here otherwise the stickers are momentarily displayed at the pixel size.
|
||||
const imageStyle = {
|
||||
height: content.info.h,
|
||||
// leave the browser the calculate the width automatically
|
||||
};
|
||||
|
||||
placeholderSize = placeholderSize + 'px';
|
||||
|
||||
// Body 'ref' required by MImageBody
|
||||
|
@ -132,6 +142,7 @@ export default class MStickerBody extends MImageBody {
|
|||
<img
|
||||
className={'mx_MStickerBody_image ' + this.state.imageClasses}
|
||||
src={contentUrl}
|
||||
style={imageStyle}
|
||||
ref='image'
|
||||
alt={content.body}
|
||||
onLoad={this._onImageLoad}
|
||||
|
|
|
@ -227,6 +227,8 @@ module.exports = React.createClass({
|
|||
},
|
||||
|
||||
render: function() {
|
||||
const enableScreenshots = SettingsStore.getValue("enableWidgetScreenshots", this.props.room.room_id);
|
||||
|
||||
const apps = this.state.apps.map(
|
||||
(app, index, arr) => {
|
||||
return (<AppTile
|
||||
|
@ -242,6 +244,7 @@ module.exports = React.createClass({
|
|||
creatorUserId={app.creatorUserId}
|
||||
widgetPageTitle={(app.data && app.data.title) ? app.data.title : ''}
|
||||
waitForIframeLoad={app.waitForIframeLoad}
|
||||
whitelistCapabilities={enableScreenshots ? ["m.capability.screenshot"] : []}
|
||||
/>);
|
||||
});
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@ export default class Stickerpicker extends React.Component {
|
|||
this._onHideStickersClick = this._onHideStickersClick.bind(this);
|
||||
this._launchManageIntegrations = this._launchManageIntegrations.bind(this);
|
||||
this._removeStickerpickerWidgets = this._removeStickerpickerWidgets.bind(this);
|
||||
this._updateWidget = this._updateWidget.bind(this);
|
||||
this._onWidgetAction = this._onWidgetAction.bind(this);
|
||||
this._onResize = this._onResize.bind(this);
|
||||
this._onFinished = this._onFinished.bind(this);
|
||||
|
@ -90,11 +91,12 @@ export default class Stickerpicker extends React.Component {
|
|||
if (!this.state.imError) {
|
||||
this.dispatcherRef = dis.register(this._onWidgetAction);
|
||||
}
|
||||
const stickerpickerWidget = Widgets.getStickerpickerWidgets()[0];
|
||||
this.setState({
|
||||
stickerpickerWidget,
|
||||
widgetId: stickerpickerWidget ? stickerpickerWidget.id : null,
|
||||
});
|
||||
|
||||
// Track updates to widget state in account data
|
||||
MatrixClientPeg.get().on('accountData', this._updateWidget);
|
||||
|
||||
// Initialise widget state from current account data
|
||||
this._updateWidget();
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
|
@ -116,11 +118,28 @@ export default class Stickerpicker extends React.Component {
|
|||
});
|
||||
}
|
||||
|
||||
_updateWidget() {
|
||||
const stickerpickerWidget = Widgets.getStickerpickerWidgets()[0];
|
||||
this.setState({
|
||||
stickerpickerWidget,
|
||||
widgetId: stickerpickerWidget ? stickerpickerWidget.id : null,
|
||||
});
|
||||
}
|
||||
|
||||
_onWidgetAction(payload) {
|
||||
if (payload.action === "user_widget_updated") {
|
||||
this.forceUpdate();
|
||||
} else if (payload.action === "stickerpicker_close") {
|
||||
this.setState({showStickers: false});
|
||||
switch (payload.action) {
|
||||
case "user_widget_updated":
|
||||
this.forceUpdate();
|
||||
break;
|
||||
case "stickerpicker_close":
|
||||
this.setState({showStickers: false});
|
||||
break;
|
||||
case "show_right_panel":
|
||||
case "hide_right_panel":
|
||||
case "show_left_panel":
|
||||
case "hide_left_panel":
|
||||
this.setState({showStickers: false});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -223,7 +242,6 @@ export default class Stickerpicker extends React.Component {
|
|||
);
|
||||
} else {
|
||||
// Default content to show if stickerpicker widget not added
|
||||
console.warn("No available sticker picker widgets");
|
||||
stickersContent = this._defaultStickerpickerContent();
|
||||
}
|
||||
return stickersContent;
|
||||
|
@ -235,16 +253,33 @@ export default class Stickerpicker extends React.Component {
|
|||
* @param {Event} e Event that triggered the function
|
||||
*/
|
||||
_onShowStickersClick(e) {
|
||||
// XXX: Simplify by using a context menu that is positioned relative to the sticker picker button
|
||||
|
||||
const buttonRect = e.target.getBoundingClientRect();
|
||||
|
||||
// The window X and Y offsets are to adjust position when zoomed in to page
|
||||
const x = buttonRect.right + window.pageXOffset - 42;
|
||||
let x = buttonRect.right + window.pageXOffset - 41;
|
||||
|
||||
// Amount of horizontal space between the right of menu and the right of the viewport
|
||||
// (10 = amount needed to make chevron centrally aligned)
|
||||
const rightPad = 10;
|
||||
|
||||
// When the sticker picker would be displayed off of the viewport, adjust x
|
||||
// (302 = width of context menu, including borders)
|
||||
x = Math.min(x, document.body.clientWidth - (302 + rightPad));
|
||||
|
||||
// Offset the chevron location, which is relative to the left of the context menu
|
||||
// (10 = offset when context menu would not be displayed off viewport)
|
||||
// (8 = value required in practice (possibly 10 - 2 where the 2 = context menu borders)
|
||||
const stickerPickerChevronOffset = Math.max(10, 8 + window.pageXOffset + buttonRect.left - x);
|
||||
|
||||
const y = (buttonRect.top + (buttonRect.height / 2) + window.pageYOffset) - 19;
|
||||
|
||||
this.setState({
|
||||
showStickers: true,
|
||||
stickerPickerX: x,
|
||||
stickerPickerY: y,
|
||||
stickerPickerChevronOffset,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -297,7 +332,7 @@ export default class Stickerpicker extends React.Component {
|
|||
|
||||
const stickerPicker = <ContextualMenu
|
||||
elementClass={GenericElementContextMenu}
|
||||
chevronOffset={10}
|
||||
chevronOffset={this.state.stickerPickerChevronOffset}
|
||||
chevronFace={'bottom'}
|
||||
left={this.state.stickerPickerX}
|
||||
top={this.state.stickerPickerY}
|
||||
|
|
|
@ -62,9 +62,9 @@
|
|||
"Whether or not you're logged in (we don't record your user name)": "Независимо дали сте влезли с профила си или не (не записваме Вашето потребителско име)",
|
||||
"Your language of choice": "Вашият език по избор",
|
||||
"Which officially provided instance you are using, if any": "Кой официално-предоставен сървър използвате, ако има такъв",
|
||||
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Независимо дали използвате Richtext режим на Rich Text Editor",
|
||||
"Your homeserver's URL": "Адрес на Вашия Home сървър",
|
||||
"Your identity server's URL": "Адрес на Вашия сървър за самоличност",
|
||||
"Whether or not you're using the Richtext mode of the Rich Text Editor": "Дали използвате Richtext режим на Rich Text Editor",
|
||||
"Your homeserver's URL": "Адресът на Вашия Home сървър",
|
||||
"Your identity server's URL": "Адресът на Вашия сървър за самоличност",
|
||||
"Analytics": "Статистика",
|
||||
"The information being sent to us to help make Riot.im better includes:": "За да направим Riot по-добър, информацията изпратена до нас включва:",
|
||||
"Call Failed": "Неуспешно повикване",
|
||||
|
@ -796,7 +796,7 @@
|
|||
"%(count)s new messages|one": "%(count)s ново съобщение",
|
||||
"Active call": "Активен разговор",
|
||||
"Use with caution": "Внимавайте при използване",
|
||||
"There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Няма никой друг тук! Желаете ли да <inviteText>поканите други</inviteText> или да <nowarnText>изключите предупреждението, че стаята е празна</nowarnText>?",
|
||||
"There's no one else here! Would you like to <inviteText>invite others</inviteText> or <nowarnText>stop warning about the empty room</nowarnText>?": "Няма никой друг тук! <inviteText>Поканете други</inviteText> или <nowarnText>изключете предупреждението, че стаята е празна</nowarnText>?",
|
||||
"You seem to be uploading files, are you sure you want to quit?": "Изглежда, че качвате файлове. Сигурни ли сте, че искате да затворите програмата?",
|
||||
"You seem to be in a call, are you sure you want to quit?": "Изглежда, че сте в разговор. Сигурни ли сте, че искате да излезете от програмата?",
|
||||
"Failed to upload file": "Неуспешно качване на файлове",
|
||||
|
@ -1158,5 +1158,14 @@
|
|||
"Checking for an update...": "Проверяване за нова версия...",
|
||||
"There are advanced notifications which are not shown here": "Съществуват разширени настройки за известия, които не са показани тук",
|
||||
"Missing roomId.": "Липсва идентификатор на стая.",
|
||||
"Picture": "Изображение"
|
||||
"Picture": "Изображение",
|
||||
"Every page you use in the app": "Всяка използвана страница от приложението",
|
||||
"e.g. <CurrentPageURL>": "например: <CurrentPageURL>",
|
||||
"Your User Agent": "Вашият браузър",
|
||||
"Your device resolution": "Разделителната способност на устройството Ви",
|
||||
"Always show encryption icons": "Винаги показвай икони за шифроване",
|
||||
"At this time it is not possible to reply with a file so this will be sent without being a reply.": "В момента не може да се отговаря с файл, така че това ще се изпрати без да бъде отговор.",
|
||||
"Unable to reply": "Не може да се отговори",
|
||||
"At this time it is not possible to reply with an emote.": "В момента не може да се отговори с емотикона.",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не може да се зареди събитието, на което е отговорено. Или не съществува или нямате достъп да го видите."
|
||||
}
|
||||
|
|
|
@ -1176,5 +1176,6 @@
|
|||
"We encountered an error trying to restore your previous session.": "Wir haben ein Problem beim Wiederherstellen deiner vorherigen Sitzung festgestellt.",
|
||||
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Den Browser-Speicher zu löschen kann das Problem lösen, wird dich aber abmelden und verschlüsselte Chats unlesbar machen.",
|
||||
"Collapse Reply Thread": "Antwort-Thread zusammenklappen",
|
||||
"At this time it is not possible to reply with an emote.": "An dieser Stelle ist es nicht möglich mit einer Umschreibung zu antworten."
|
||||
"At this time it is not possible to reply with an emote.": "An dieser Stelle ist es nicht möglich mit einer Umschreibung zu antworten.",
|
||||
"Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren"
|
||||
}
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
"%(senderDisplayName)s removed the room name.": "Ο %(senderDisplayName)s διέγραψε το όνομα του δωματίου.",
|
||||
"Changes your display nickname": "Αλλάζει το ψευδώνυμο χρήστη",
|
||||
"Conference call failed.": "Η κλήση συνδιάσκεψης απέτυχε.",
|
||||
"powered by Matrix": "βασισμένο στο πρωτόκολλο Matrix",
|
||||
"powered by Matrix": "βασισμένο στο Matrix",
|
||||
"Confirm password": "Επιβεβαίωση κωδικού πρόσβασης",
|
||||
"Confirm your new password": "Επιβεβαίωση του νέου κωδικού πρόσβασης",
|
||||
"Continue": "Συνέχεια",
|
||||
|
@ -772,5 +772,15 @@
|
|||
"Collapse panel": "Ελαχιστοποίηση καρτέλας",
|
||||
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Με τον τρέχον περιηγητή, η εμφάνιση και η αίσθηση της εφαρμογής ενδέχεται να είναι εντελώς εσφαλμένη και ορισμένες ή όλες οι λειτουργίες ενδέχεται να μην λειτουργούν. Εάν θέλετε να το δοκιμάσετε ούτως ή άλλως μπορείτε να συνεχίσετε, αλλά είστε μόνοι σας σε ό, τι αφορά τα προβλήματα που μπορεί να αντιμετωπίσετε!",
|
||||
"Checking for an update...": "Γίνεται έλεγχος για ενημέρωση...",
|
||||
"There are advanced notifications which are not shown here": "Υπάρχουν προχωρημένες ειδοποιήσεις οι οποίες δεν εμφανίζονται εδώ"
|
||||
"There are advanced notifications which are not shown here": "Υπάρχουν προχωρημένες ειδοποιήσεις οι οποίες δεν εμφανίζονται εδώ",
|
||||
"Your identity server's URL": "Το URL του διακομιστή ταυτοποίησής σας",
|
||||
"The platform you're on": "Η πλατφόρμα στην οποία βρίσκεστε",
|
||||
"The version of Riot.im": "Η έκδοση του Riot.im",
|
||||
"Your language of choice": "Η γλώσσα επιλογής σας",
|
||||
"Your homeserver's URL": "Το URL του διακομιστή σας",
|
||||
"Every page you use in the app": "Κάθε σελίδα που χρησιμοποιείτε στην εφαρμογή",
|
||||
"e.g. <CurrentPageURL>": "π.χ. <CurrentPageURL>",
|
||||
"Your device resolution": "Η ανάλυση της συσκευής σας",
|
||||
"The information being sent to us to help make Riot.im better includes:": "Οι πληροφορίες που στέλνονται σε εμάς με σκοπό την βελτίωση του Riot.im περιλαμβάνουν:",
|
||||
"Call Failed": "Η κλήση απέτυχε"
|
||||
}
|
||||
|
|
|
@ -217,6 +217,7 @@
|
|||
"Enable URL previews for this room (only affects you)": "Enable URL previews for this room (only affects you)",
|
||||
"Enable URL previews by default for participants in this room": "Enable URL previews by default for participants in this room",
|
||||
"Room Colour": "Room Colour",
|
||||
"Enable widget screenshots on supported widgets": "Enable widget screenshots on supported widgets",
|
||||
"Collecting app version information": "Collecting app version information",
|
||||
"Collecting logs": "Collecting logs",
|
||||
"Uploading report": "Uploading report",
|
||||
|
|
|
@ -1176,5 +1176,6 @@
|
|||
"Unable to reply": "Impossible de répondre",
|
||||
"At this time it is not possible to reply with an emote.": "Pour le moment il n'est pas possible de répondre avec un émoji.",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Impossible de charger l'événement auquel il a été répondu, soit il n'existe pas, soit vous n'avez pas l'autorisation de le voir.",
|
||||
"Collapse Reply Thread": "Dévoiler le fil de réponse"
|
||||
"Collapse Reply Thread": "Dévoiler le fil de réponse",
|
||||
"Enable widget screenshots on supported widgets": "Activer les captures d'écran des widgets pris en charge"
|
||||
}
|
||||
|
|
|
@ -1156,5 +1156,25 @@
|
|||
"Collapse panel": "Agochar panel",
|
||||
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Co seu navegador actual a apareciencia e uso do aplicativo poderían estar totalmente falseadas, e algunhas características poderían non funcionar. Se quere pode continuar, pero debe ser consciente de que poden haber fallos!",
|
||||
"Checking for an update...": "Comprobando as actualizacións...",
|
||||
"There are advanced notifications which are not shown here": "Existen notificacións avanzadas que non se mostran aquí"
|
||||
"There are advanced notifications which are not shown here": "Existen notificacións avanzadas que non se mostran aquí",
|
||||
"Every page you use in the app": "Cada páxina que vostede utiliza no aplicativo",
|
||||
"e.g. <CurrentPageURL>": "ex. <CurrentPageURL>",
|
||||
"Your User Agent": "User Agent",
|
||||
"Your device resolution": "Resolución do dispositivo",
|
||||
"Missing roomId.": "Falta o id da sala.",
|
||||
"Always show encryption icons": "Mostra sempre iconas de cifrado",
|
||||
"At this time it is not possible to reply with a file so this will be sent without being a reply.": "En este intre non é posible respostar con un ficheiro así que este será enviado sin ser considerado resposta.",
|
||||
"Unable to reply": "Non puido respostar",
|
||||
"At this time it is not possible to reply with an emote.": "En este intre non é posible respostar con un emote.",
|
||||
"Popout widget": "Widget emerxente",
|
||||
"Picture": "Imaxe",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Non se cargou o evento ao que respostaba, ou non existe ou non ten permiso para velo.",
|
||||
"Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Os fallos de Riot séguense en GitHub: <a>crear un informe en GitHub</a>.",
|
||||
"Log out and remove encryption keys?": "Desconectar e eliminar as chaves de cifrado?",
|
||||
"Send Logs": "Enviar informes",
|
||||
"Clear Storage and Sign Out": "Limpar o almacenamento e Desconectar",
|
||||
"Refresh": "Actualizar",
|
||||
"We encountered an error trying to restore your previous session.": "Atopamos un fallo intentando restablecer a súa sesión anterior.",
|
||||
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Limpando o almacenamento do navegador podería resolver o problema, pero desconectarao e non poderá ler o historial cifrado da conversa.",
|
||||
"Collapse Reply Thread": "Comprimir o fío de respostas"
|
||||
}
|
||||
|
|
|
@ -1176,5 +1176,6 @@
|
|||
"Unable to reply": "Nem lehet válaszolni",
|
||||
"At this time it is not possible to reply with an emote.": "Jelenleg nem lehet emodzsival válaszolni.",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Nem lehet betölteni azt az eseményt amire válaszoltál, mert vagy nem létezik, vagy nincs jogod megnézni.",
|
||||
"Collapse Reply Thread": "Beszélgetés szál becsukása"
|
||||
"Collapse Reply Thread": "Beszélgetés szál becsukása",
|
||||
"Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott ott képernyőkép készítés engedélyezése"
|
||||
}
|
||||
|
|
|
@ -1173,5 +1173,7 @@
|
|||
"We encountered an error trying to restore your previous session.": "Произошла ошибка при попытке восстановить предыдущий сеанс.",
|
||||
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Очистка хранилища вашего браузера может устранить проблему, но при этом ваша сессия будет завершена и зашифрованная история чата станет нечитаемой.",
|
||||
"Unable to reply": "Не удается ответить",
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не удается загрузить событие, на которое был дан ответ, либо оно не существует, либо у вас нет разрешения на его просмотр."
|
||||
"Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не удается загрузить событие, на которое был дан ответ, либо оно не существует, либо у вас нет разрешения на его просмотр.",
|
||||
"Enable widget screenshots on supported widgets": "Включить скриншоты виджета в поддерживаемых виджетах",
|
||||
"Collapse Reply Thread": "Ответить с цитированием"
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
"Advanced": "Avancerat",
|
||||
"Algorithm": "Algoritm",
|
||||
"Always show message timestamps": "Visa alltid tidsstämpel för meddelanden",
|
||||
"Hide removed messages": "Göm raderade meddelanden",
|
||||
"Hide removed messages": "Dölj borttagna meddelanden",
|
||||
"Authentication": "Autentisering",
|
||||
"%(items)s and %(lastItem)s": "%(items)s och %(lastItem)s",
|
||||
"and %(count)s others...|other": "och %(count)s andra...",
|
||||
|
@ -301,7 +301,7 @@
|
|||
"%(senderName)s requested a VoIP conference.": "%(senderName)s begärde en VoIP-konferens.",
|
||||
"Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Om du återställer ditt lösenord kommer alla krypteringsnycklar på alla enheter att återställas, vilket gör krypterad meddelandehistorik oläsbar om du inte först exporterar dina rumsnycklar och sedan importerar dem igen. I framtiden kommer det här att förbättras.",
|
||||
"Results from DuckDuckGo": "Resultat från DuckDuckGo",
|
||||
"Return to login screen": "TIllbaka till login-skärmen",
|
||||
"Return to login screen": "Tillbaka till login-skärmen",
|
||||
"Riot does not have permission to send you notifications - please check your browser settings": "Riot har inte tillstånd att skicka aviseringar - kontrollera webbläsarens inställningar",
|
||||
"Riot was not given permission to send notifications - please try again": "Riot fick inte tillstånd att skicka aviseringar - försök igen",
|
||||
"riot-web version:": "riot-web -version:",
|
||||
|
@ -649,7 +649,108 @@
|
|||
"(~%(count)s results)|one": "(~%(count)s resultat)",
|
||||
"Upload avatar": "Ladda upp profilbild",
|
||||
"Remove avatar": "Ta bort profilbild",
|
||||
"This invitation was sent to an email address which is not associated with this account:": "Den här inbjudan skickades till en emailadress som inte är kopplad till detta konto:",
|
||||
"This invitation was sent to an email address which is not associated with this account:": "Den här inbjudan skickades till en epostadress som inte är kopplad till detta konto:",
|
||||
"To link to a room it must have <a>an address</a>.": "För att länka till ett rum behöver det <a>en adress</a>.",
|
||||
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nivå %(powerLevelNumber)s)"
|
||||
"%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nivå %(powerLevelNumber)s)",
|
||||
"Unknown Address": "Okänd adress",
|
||||
"%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s",
|
||||
"%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s har gått med %(count)s gånger",
|
||||
"%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sgick med",
|
||||
"%(oneUser)sjoined %(count)s times|other": "%(oneUser)s har gått med %(count)s gånger",
|
||||
"%(oneUser)sjoined %(count)s times|one": "%(oneUser)sgick med",
|
||||
"%(severalUsers)sleft %(count)s times|other": "%(severalUsers)shar lämnat %(count)s gånger",
|
||||
"%(severalUsers)sleft %(count)s times|one": "%(severalUsers)slämnade",
|
||||
"%(oneUser)sleft %(count)s times|other": "%(oneUser)shar lämnat %(count)s gånger",
|
||||
"%(oneUser)sleft %(count)s times|one": "%(oneUser)slämnade",
|
||||
"%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)shar gått med och lämnat %(count)s gånger",
|
||||
"%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)shar gått med och lämnat",
|
||||
"%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)shar gått med och lämnat %(count)s gånger",
|
||||
"%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)shar gått med och lämnat",
|
||||
"And %(count)s more...|other": "Och %(count)s till...",
|
||||
"ex. @bob:example.com": "t.ex. @kalle:exempel.com",
|
||||
"Add User": "Lägg till användare",
|
||||
"Matrix ID": "Matrix-ID",
|
||||
"Matrix Room ID": "Matrix-rums-ID",
|
||||
"email address": "epostadress",
|
||||
"Try using one of the following valid address types: %(validTypesList)s.": "Prova att använda någon av följande giltiga adresstyper: %(validTypesList)s.",
|
||||
"You have entered an invalid address.": "Du har angett en ogiltig adress.",
|
||||
"Preparing to send logs": "Förbereder att skicka loggar",
|
||||
"Logs sent": "Loggar skickade",
|
||||
"Failed to send logs: ": "Det gick inte att skicka loggar: ",
|
||||
"Submit debug logs": "Skicka felsökningsloggar",
|
||||
"Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Felsökningsloggar innehåller användningsdata för applikationen inklusive ditt användarnamn, ID:n eller alias för de rum och grupper du har besökt och användarnamn för andra användare. De innehåller inte meddelanden.",
|
||||
"Riot bugs are tracked on GitHub: <a>create a GitHub issue</a>.": "Riot-buggar hanteras på GitHub: <a>skapa en GitHub-issue</a>.",
|
||||
"GitHub issue link:": "Länk till GitHub-issue:",
|
||||
"Notes:": "Noteringar:",
|
||||
"Start new chat": "Starta ny chatt",
|
||||
"Default server": "Standardserver",
|
||||
"Custom server": "Anpassad server",
|
||||
"Home server URL": "Hemserver-URL",
|
||||
"Identity server URL": "Identitetsserver-URL",
|
||||
"What does this mean?": "Vad betyder det här?",
|
||||
"User name": "Användarnamn",
|
||||
"Username on %(hs)s": "Användarnamn på %(hs)s",
|
||||
"An email has been sent to %(emailAddress)s": "Ett epostmeddelande har skickats till %(emailAddress)s",
|
||||
"To continue, please enter your password.": "För att fortsätta, vänligen ange ditt lösenord.",
|
||||
"Please check your email to continue registration.": "Vänligen kolla din epost för att fortsätta registreringen.",
|
||||
"Token incorrect": "Ogiltig token",
|
||||
"A text message has been sent to %(msisdn)s": "Ett textmeddelande har skickats till %(msisdn)s",
|
||||
"Please enter the code it contains:": "Vänligen ange koden det innehåller:",
|
||||
"Code": "Kod",
|
||||
"I already have an account": "Jag har redan ett konto",
|
||||
"Sign in to get started": "Logga in för att komma igång",
|
||||
"Set a display name:": "Ange ett visningsnamn:",
|
||||
"Upload an avatar:": "Ladda upp en avatar:",
|
||||
"This server does not support authentication with a phone number.": "Denna server har inte support för autentisering via telefonnummer.",
|
||||
"Missing password.": "Lösenord saknas.",
|
||||
"Passwords don't match.": "Lösenorden matchar inte.",
|
||||
"Password too short (min %(MIN_PASSWORD_LENGTH)s).": "Lösenordet är för kort (min %(MIN_PASSWORD_LENGTH)s).",
|
||||
"This doesn't look like a valid email address.": "Det här ser inte ut vara en giltig epostadress.",
|
||||
"This doesn't look like a valid phone number.": "Det här ser inte ut att vara ett giltigt telefonnummer.",
|
||||
"You need to enter a user name.": "Du måste ange ett användarnamn.",
|
||||
"An unknown error occurred.": "Ett okänt fel uppstod.",
|
||||
"Hide avatar changes": "Dölj avatarändringar",
|
||||
"Hide display name changes": "Dölj visningsnamnsändringar",
|
||||
"Uploading %(filename)s and %(count)s others|other": "Laddar upp %(filename)s och %(count)s andra",
|
||||
"Uploading %(filename)s and %(count)s others|zero": "Laddar upp %(filename)s",
|
||||
"Uploading %(filename)s and %(count)s others|one": "Laddar upp %(filename)s och %(count)s annan",
|
||||
"Light theme": "Ljust tema",
|
||||
"Dark theme": "Mörkt tema",
|
||||
"Status.im theme": "Status.im-tema",
|
||||
"You already have existing direct chats with this user:": "Du har redan existerande direkt-chattar med den här användaren:",
|
||||
"Start chatting": "Börja chatta",
|
||||
"Click on the button below to start chatting!": "Klicka på knappen nedanför för att börja chatta!",
|
||||
"Start Chatting": "Börja chatta",
|
||||
"This doesn't appear to be a valid email address": "Det här verkar inte vara en giltig epostadress",
|
||||
"Verification Pending": "Avvaktar verifiering",
|
||||
"Unable to add email address": "Det gick inte att lägga till epostadress",
|
||||
"Unable to verify email address.": "Det gick inte att verifiera epostadressen.",
|
||||
"Skip": "Hoppa över",
|
||||
"User names may only contain letters, numbers, dots, hyphens and underscores.": "Användarnamn får endast innehålla bokstäver, siffror, punkter, bindestreck och understreck.",
|
||||
"Username not available": "Användarnamn inte tillgängligt",
|
||||
"Username invalid: %(errMessage)s": "Ogiltigt användarnamn: %(errMessage)s",
|
||||
"An error occurred: %(error_string)s": "Ett fel uppstod: %(error_string)s",
|
||||
"Username available": "Användarnamn tillgängligt",
|
||||
"To get started, please pick a username!": "För att komma igång, vänligen välj ett användarnamn!",
|
||||
"This will be your account name on the <span></span> homeserver, or you can pick a <a>different server</a>.": "Det här kommer bli ditt kontonamn på hemservern <span></span>, eller så kan du välja en <a>annan server</a>.",
|
||||
"If you already have a Matrix account you can <a>log in</a> instead.": "Om du redan har ett Matrix-konto kan du <a>logga in</a> istället.",
|
||||
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Vänligen installera <chromeLink>Chrome</chromeLink> eller <firefoxLink>Firefox</firefoxLink> för den bästa upplevelsen.",
|
||||
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> och <operaLink>Opera</operaLink> funkar också.",
|
||||
"Topic": "Ämne",
|
||||
"Make this room private": "Gör det här rummet privat",
|
||||
"Share message history with new users": "Dela meddelandehistoriken med nya användare",
|
||||
"Encrypt room": "Kryptera rum",
|
||||
"You must <a>register</a> to use this functionality": "Du måste <a>registrera dig</a> för att använda den här funktionaliteten",
|
||||
"You must join the room to see its files": "Du måste gå med i rummet för att se tillhörande filer",
|
||||
"There are no visible files in this room": "Det finns inga synliga filer i det här rummet",
|
||||
"Your password has been reset": "Ditt lösenord har återställts",
|
||||
"To reset your password, enter the email address linked to your account": "För att återställa ditt lösenord, ange epostadressen som är kopplad till ditt konto",
|
||||
"This Home Server does not support login using email address.": "Den här hemservern har inte support för inloggning med epostadress.",
|
||||
"Desktop specific": "Skrivbordsspecifikt",
|
||||
"Start automatically after system login": "Starta automatiskt vid systeminloggning",
|
||||
"User Interface": "Användargränssnitt",
|
||||
"This will allow you to reset your password and receive notifications.": "Det här låter dig återställa lösenordet och ta emot aviseringar.",
|
||||
"You have no visible notifications": "Du har inga synliga aviseringar",
|
||||
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ditt lösenord har ändrats. Du kommer inte att få push-aviseringar på andra enheter förrän du har loggat in på dem igen",
|
||||
"Failed to upload image": "Det gick inte att ladda upp bild"
|
||||
}
|
||||
|
|
|
@ -358,7 +358,7 @@
|
|||
"Device Name": "设备名称",
|
||||
"Device key": "设备密钥",
|
||||
"Verify device": "验证设备",
|
||||
"I verify that the keys match": "我验证密钥匹配",
|
||||
"I verify that the keys match": "我验证此密钥匹配",
|
||||
"Unable to restore session": "无法恢复会话",
|
||||
"Continue anyway": "无论如何都继续",
|
||||
"Blacklist": "列入黑名单",
|
||||
|
@ -409,7 +409,7 @@
|
|||
"Remove Contact Information?": "移除联系人信息?",
|
||||
"Remove %(threePid)s?": "移除 %(threePid)s?",
|
||||
"Results from DuckDuckGo": "来自 DuckDuckGo 的结果",
|
||||
"Room contains unknown devices": "聊天室有未知设备",
|
||||
"Room contains unknown devices": "聊天室包含未知设备",
|
||||
"%(roomName)s does not exist.": "%(roomName)s 不存在。",
|
||||
"Save": "保存",
|
||||
"Send anyway": "无论任何都发送",
|
||||
|
|
|
@ -1176,5 +1176,6 @@
|
|||
"Refresh": "重新整理",
|
||||
"We encountered an error trying to restore your previous session.": "我們在嘗試復原您先前的工作階段時遇到了一點錯誤。",
|
||||
"Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "清除您瀏覽器的儲存的東西也許可以修復問題,但會將您登出並造成任何已加密的聊天都無法讀取。",
|
||||
"Collapse Reply Thread": "摺疊回覆討論串"
|
||||
"Collapse Reply Thread": "摺疊回覆討論串",
|
||||
"Enable widget screenshots on supported widgets": "在支援的小工具上啟用小工具螢幕快照"
|
||||
}
|
||||
|
|
|
@ -265,4 +265,9 @@ export const SETTINGS = {
|
|||
default: true,
|
||||
controller: new AudioNotificationsEnabledController(),
|
||||
},
|
||||
"enableWidgetScreenshots": {
|
||||
supportedLevels: LEVELS_ACCOUNT_SETTINGS,
|
||||
displayName: _td('Enable widget screenshots on supported widgets'),
|
||||
default: false,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -58,8 +58,7 @@ function getUserWidgetsArray() {
|
|||
*/
|
||||
function getStickerpickerWidgets() {
|
||||
const widgets = getUserWidgetsArray();
|
||||
const stickerpickerWidgets = widgets.filter((widget) => widget.type='m.stickerpicker');
|
||||
return stickerpickerWidgets;
|
||||
return widgets.filter((widget) => widget.content && widget.content.type === "m.stickerpicker");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -73,7 +72,7 @@ function removeStickerpickerWidgets() {
|
|||
}
|
||||
const userWidgets = client.getAccountData('m.widgets').getContent() || {};
|
||||
Object.entries(userWidgets).forEach(([key, widget]) => {
|
||||
if (widget.type === 'm.stickerpicker') {
|
||||
if (widget.content && widget.content.type === 'm.stickerpicker') {
|
||||
delete userWidgets[key];
|
||||
}
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue