forked from fedi/mastodon
retrieve custom emoji list via API instead of before page load (#7047)
This commit is contained in:
parent
f1867a7388
commit
b08ab329f4
37
app/javascript/mastodon/actions/custom_emojis.js
Normal file
37
app/javascript/mastodon/actions/custom_emojis.js
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import api from '../api';
|
||||||
|
|
||||||
|
export const CUSTOM_EMOJIS_FETCH_REQUEST = 'CUSTOM_EMOJIS_FETCH_REQUEST';
|
||||||
|
export const CUSTOM_EMOJIS_FETCH_SUCCESS = 'CUSTOM_EMOJIS_FETCH_SUCCESS';
|
||||||
|
export const CUSTOM_EMOJIS_FETCH_FAIL = 'CUSTOM_EMOJIS_FETCH_FAIL';
|
||||||
|
|
||||||
|
export function fetchCustomEmojis() {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(fetchCustomEmojisRequest());
|
||||||
|
|
||||||
|
api(getState).get('/api/v1/custom_emojis').then(response => {
|
||||||
|
dispatch(fetchCustomEmojisSuccess(response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchCustomEmojisFail(error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchCustomEmojisRequest() {
|
||||||
|
return {
|
||||||
|
type: CUSTOM_EMOJIS_FETCH_REQUEST,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchCustomEmojisSuccess(custom_emojis) {
|
||||||
|
return {
|
||||||
|
type: CUSTOM_EMOJIS_FETCH_SUCCESS,
|
||||||
|
custom_emojis,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchCustomEmojisFail(error) {
|
||||||
|
return {
|
||||||
|
type: CUSTOM_EMOJIS_FETCH_FAIL,
|
||||||
|
error,
|
||||||
|
};
|
||||||
|
};
|
|
@ -6,6 +6,7 @@ import { showOnboardingOnce } from '../actions/onboarding';
|
||||||
import { BrowserRouter, Route } from 'react-router-dom';
|
import { BrowserRouter, Route } from 'react-router-dom';
|
||||||
import { ScrollContext } from 'react-router-scroll-4';
|
import { ScrollContext } from 'react-router-scroll-4';
|
||||||
import UI from '../features/ui';
|
import UI from '../features/ui';
|
||||||
|
import { fetchCustomEmojis } from '../actions/custom_emojis';
|
||||||
import { hydrateStore } from '../actions/store';
|
import { hydrateStore } from '../actions/store';
|
||||||
import { connectUserStream } from '../actions/streaming';
|
import { connectUserStream } from '../actions/streaming';
|
||||||
import { IntlProvider, addLocaleData } from 'react-intl';
|
import { IntlProvider, addLocaleData } from 'react-intl';
|
||||||
|
@ -19,6 +20,9 @@ export const store = configureStore();
|
||||||
const hydrateAction = hydrateStore(initialState);
|
const hydrateAction = hydrateStore(initialState);
|
||||||
store.dispatch(hydrateAction);
|
store.dispatch(hydrateAction);
|
||||||
|
|
||||||
|
// load custom emojis
|
||||||
|
store.dispatch(fetchCustomEmojis());
|
||||||
|
|
||||||
export default class Mastodon extends React.PureComponent {
|
export default class Mastodon extends React.PureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
|
|
|
@ -1,16 +1,15 @@
|
||||||
import { List as ImmutableList } from 'immutable';
|
import { List as ImmutableList, fromJS as ConvertToImmutable } from 'immutable';
|
||||||
import { STORE_HYDRATE } from '../actions/store';
|
import { CUSTOM_EMOJIS_FETCH_SUCCESS } from '../actions/custom_emojis';
|
||||||
import { search as emojiSearch } from '../features/emoji/emoji_mart_search_light';
|
import { search as emojiSearch } from '../features/emoji/emoji_mart_search_light';
|
||||||
import { buildCustomEmojis } from '../features/emoji/emoji';
|
import { buildCustomEmojis } from '../features/emoji/emoji';
|
||||||
|
|
||||||
const initialState = ImmutableList();
|
const initialState = ImmutableList([]);
|
||||||
|
|
||||||
export default function custom_emojis(state = initialState, action) {
|
export default function custom_emojis(state = initialState, action) {
|
||||||
switch(action.type) {
|
if(action.type === CUSTOM_EMOJIS_FETCH_SUCCESS) {
|
||||||
case STORE_HYDRATE:
|
state = ConvertToImmutable(action.custom_emojis);
|
||||||
emojiSearch('', { custom: buildCustomEmojis(action.state.get('custom_emojis', [])) });
|
emojiSearch('', { custom: buildCustomEmojis(state) });
|
||||||
return action.state.get('custom_emojis');
|
|
||||||
default:
|
|
||||||
return state;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,12 +4,6 @@ class InitialStateSerializer < ActiveModel::Serializer
|
||||||
attributes :meta, :compose, :accounts,
|
attributes :meta, :compose, :accounts,
|
||||||
:media_attachments, :settings, :push_subscription
|
:media_attachments, :settings, :push_subscription
|
||||||
|
|
||||||
has_many :custom_emojis, serializer: REST::CustomEmojiSerializer
|
|
||||||
|
|
||||||
def custom_emojis
|
|
||||||
CustomEmoji.local.where(disabled: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
def meta
|
def meta
|
||||||
store = {
|
store = {
|
||||||
streaming_api_base_url: Rails.configuration.x.streaming_api_base_url,
|
streaming_api_base_url: Rails.configuration.x.streaming_api_base_url,
|
||||||
|
|
Loading…
Reference in a new issue