diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss index c20dd43daf..62cbdb910a 100644 --- a/res/css/views/rooms/_MessageComposer.scss +++ b/res/css/views/rooms/_MessageComposer.scss @@ -252,6 +252,10 @@ limitations under the License. mask-image: url('$(res)/img/element-icons/room/composer/attach.svg'); } +.mx_MessageComposer_poll::before { + mask-image: url('$(res)/img/element-icons/room/composer/poll.svg'); +} + .mx_MessageComposer_voiceMessage::before { mask-image: url('$(res)/img/voip/mic-on-mask.svg'); } diff --git a/res/img/element-icons/room/composer/poll.svg b/res/img/element-icons/room/composer/poll.svg new file mode 100644 index 0000000000..063edab7ab --- /dev/null +++ b/res/img/element-icons/room/composer/poll.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/components/views/rooms/MessageComposer.tsx b/src/components/views/rooms/MessageComposer.tsx index f14af69a6d..e092081e6a 100644 --- a/src/components/views/rooms/MessageComposer.tsx +++ b/src/components/views/rooms/MessageComposer.tsx @@ -52,6 +52,8 @@ import EditorModel from "../../../editor/model"; import EmojiPicker from '../emojipicker/EmojiPicker'; import MemberStatusMessageAvatar from "../avatars/MemberStatusMessageAvatar"; import UIStore, { UI_EVENTS } from '../../../stores/UIStore'; +import Modal from "../../../Modal"; +import InfoDialog from "../dialogs/InfoDialog"; let instanceCount = 0; const NARROW_MODE_BREAKPOINT = 500; @@ -193,6 +195,31 @@ class UploadButton extends React.Component { } } +// TODO: [polls] Make this component actually do something +class PollButton extends React.PureComponent { + private onCreateClick = () => { + Modal.createTrackedDialog('Polls', 'Not Yet Implemented', InfoDialog, { + // XXX: Deliberately not translated given this dialog is meant to be replaced and we don't + // want to clutter the language files with short-lived strings. + title: "Polls are currently in development", + description: "" + + "Thanks for testing polls! We haven't quite gotten a chance to write the feature yet " + + "though. Check back later for updates.", + hasCloseButton: true, + }); + }; + + render() { + return ( + + ); + } +} + interface IProps { room: Room; resizeNotifier: ResizeNotifier; @@ -432,6 +459,11 @@ export default class MessageComposer extends React.Component { private renderButtons(menuPosition): JSX.Element | JSX.Element[] { const buttons: JSX.Element[] = []; if (!this.state.haveRecording) { + if (SettingsStore.getValue("feature_polls")) { + buttons.push( + + ); + } buttons.push( , ); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index bdc86a9e08..c9573a69db 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -823,6 +823,7 @@ "Show message previews for reactions in all rooms": "Show message previews for reactions in all rooms", "Offline encrypted messaging using dehydrated devices": "Offline encrypted messaging using dehydrated devices", "Send pseudonymous analytics data": "Send pseudonymous analytics data", + "Polls (under active development)": "Polls (under active development)", "Show info about bridges in room settings": "Show info about bridges in room settings", "New layout switcher (with message bubbles)": "New layout switcher (with message bubbles)", "Don't send read receipts": "Don't send read receipts", @@ -1575,6 +1576,7 @@ "Emoji picker": "Emoji picker", "Add emoji": "Add emoji", "Upload file": "Upload file", + "Create poll": "Create poll", "Reply to encrypted thread…": "Reply to encrypted thread…", "Reply to thread…": "Reply to thread…", "Send an encrypted reply…": "Send an encrypted reply…", diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx index 9fba69a63b..d36ea2ac94 100644 --- a/src/settings/Settings.tsx +++ b/src/settings/Settings.tsx @@ -246,6 +246,12 @@ export const SETTINGS: {[setting: string]: ISetting} = { default: false, controller: new PseudonymousAnalyticsController(), }, + "feature_polls": { + isFeature: true, + supportedLevels: LEVELS_FEATURE, + displayName: _td("Polls (under active development)"), + default: false, + }, "doNotDisturb": { supportedLevels: [SettingLevel.DEVICE], default: false,