about summary refs log tree commit diff
path: root/app/javascript/flavours/glitch
diff options
context:
space:
mode:
Diffstat (limited to 'app/javascript/flavours/glitch')
-rw-r--r--app/javascript/flavours/glitch/actions/importer/index.js10
-rw-r--r--app/javascript/flavours/glitch/actions/importer/normalizer.js11
-rw-r--r--app/javascript/flavours/glitch/actions/polls.js11
-rw-r--r--app/javascript/flavours/glitch/components/poll.js4
-rw-r--r--app/javascript/flavours/glitch/reducers/polls.js4
-rw-r--r--app/javascript/flavours/glitch/styles/polls.scss4
6 files changed, 35 insertions, 9 deletions
diff --git a/app/javascript/flavours/glitch/actions/importer/index.js b/app/javascript/flavours/glitch/actions/importer/index.js
index abadee817..f4372fb31 100644
--- a/app/javascript/flavours/glitch/actions/importer/index.js
+++ b/app/javascript/flavours/glitch/actions/importer/index.js
@@ -1,4 +1,4 @@
-import { normalizeAccount, normalizeStatus } from './normalizer';
+import { normalizeAccount, normalizeStatus, normalizePoll } from './normalizer';
 
 export const ACCOUNT_IMPORT  = 'ACCOUNT_IMPORT';
 export const ACCOUNTS_IMPORT = 'ACCOUNTS_IMPORT';
@@ -71,7 +71,7 @@ export function importFetchedStatuses(statuses) {
       }
 
       if (status.poll && status.poll.id) {
-        pushUnique(polls, status.poll);
+        pushUnique(polls, normalizePoll(status.poll));
       }
     }
 
@@ -82,3 +82,9 @@ export function importFetchedStatuses(statuses) {
     dispatch(importStatuses(normalStatuses));
   };
 }
+
+export function importFetchedPoll(poll) {
+  return dispatch => {
+    dispatch(importPolls([normalizePoll(poll)]));
+  };
+}
diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js
index f57fb70b4..ccd84364e 100644
--- a/app/javascript/flavours/glitch/actions/importer/normalizer.js
+++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js
@@ -65,3 +65,14 @@ export function normalizeStatus(status, normalOldStatus) {
 
   return normalStatus;
 }
+
+export function normalizePoll(poll) {
+  const normalPoll = { ...poll };
+
+  normalPoll.options = poll.options.map(option => ({
+    ...option,
+    title_emojified: emojify(escapeTextContentForBrowser(option.title)),
+  }));
+
+  return normalPoll;
+}
diff --git a/app/javascript/flavours/glitch/actions/polls.js b/app/javascript/flavours/glitch/actions/polls.js
index bee4c48a6..8e8b82df5 100644
--- a/app/javascript/flavours/glitch/actions/polls.js
+++ b/app/javascript/flavours/glitch/actions/polls.js
@@ -1,4 +1,5 @@
 import api from '../api';
+import { importFetchedPoll } from './importer';
 
 export const POLL_VOTE_REQUEST = 'POLL_VOTE_REQUEST';
 export const POLL_VOTE_SUCCESS = 'POLL_VOTE_SUCCESS';
@@ -12,7 +13,10 @@ export const vote = (pollId, choices) => (dispatch, getState) => {
   dispatch(voteRequest());
 
   api(getState).post(`/api/v1/polls/${pollId}/votes`, { choices })
-    .then(({ data }) => dispatch(voteSuccess(data)))
+    .then(({ data }) => {
+      dispatch(importFetchedPoll(data));
+      dispatch(voteSuccess(data));
+    })
     .catch(err => dispatch(voteFail(err)));
 };
 
@@ -20,7 +24,10 @@ export const fetchPoll = pollId => (dispatch, getState) => {
   dispatch(fetchPollRequest());
 
   api(getState).get(`/api/v1/polls/${pollId}`)
-    .then(({ data }) => dispatch(fetchPollSuccess(data)))
+    .then(({ data }) => {
+      dispatch(importFetchedPoll(data));
+      dispatch(fetchPollSuccess(data));
+    })
     .catch(err => dispatch(fetchPollFail(err)));
 };
 
diff --git a/app/javascript/flavours/glitch/components/poll.js b/app/javascript/flavours/glitch/components/poll.js
index 182491af8..bfff7b601 100644
--- a/app/javascript/flavours/glitch/components/poll.js
+++ b/app/javascript/flavours/glitch/components/poll.js
@@ -7,6 +7,8 @@ import classNames from 'classnames';
 import { vote, fetchPoll } from 'mastodon/actions/polls';
 import Motion from 'mastodon/features/ui/util/optional_motion';
 import spring from 'react-motion/lib/spring';
+import escapeTextContentForBrowser from 'escape-html';
+import emojify from 'mastodon/features/emoji/emoji';
 
 const messages = defineMessages({
   moments: { id: 'time_remaining.moments', defaultMessage: 'Moments remaining' },
@@ -120,7 +122,7 @@ class Poll extends ImmutablePureComponent {
           {!showResults && <span className={classNames('poll__input', { checkbox: poll.get('multiple'), active })} />}
           {showResults && <span className='poll__number'>{Math.round(percent)}%</span>}
 
-          {option.get('title')}
+          <span dangerouslySetInnerHTML={{ __html: option.get('title_emojified', emojify(escapeTextContentForBrowser(option.get('title')))) }} />
         </label>
       </li>
     );
diff --git a/app/javascript/flavours/glitch/reducers/polls.js b/app/javascript/flavours/glitch/reducers/polls.js
index 53d9b1d8c..9956cf83f 100644
--- a/app/javascript/flavours/glitch/reducers/polls.js
+++ b/app/javascript/flavours/glitch/reducers/polls.js
@@ -1,4 +1,3 @@
-import { POLL_VOTE_SUCCESS, POLL_FETCH_SUCCESS } from 'mastodon/actions/polls';
 import { POLLS_IMPORT } from 'mastodon/actions/importer';
 import { Map as ImmutableMap, fromJS } from 'immutable';
 
@@ -10,9 +9,6 @@ export default function polls(state = initialState, action) {
   switch(action.type) {
   case POLLS_IMPORT:
     return importPolls(state, action.polls);
-  case POLL_VOTE_SUCCESS:
-  case POLL_FETCH_SUCCESS:
-    return importPolls(state, [action.poll]);
   default:
     return state;
   }
diff --git a/app/javascript/flavours/glitch/styles/polls.scss b/app/javascript/flavours/glitch/styles/polls.scss
index 7c6e61d63..ce324b36e 100644
--- a/app/javascript/flavours/glitch/styles/polls.scss
+++ b/app/javascript/flavours/glitch/styles/polls.scss
@@ -5,6 +5,7 @@
   li {
     margin-bottom: 10px;
     position: relative;
+    height: 18px + 12px;
   }
 
   &__chart {
@@ -27,6 +28,9 @@
     padding: 6px 0;
     line-height: 18px;
     cursor: default;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
 
     input[type=radio],
     input[type=checkbox] {