tests i can't run locally for now

Signed-off-by: marcin mikolajczak <git@mkljczk.pl>
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
environments/review-compose-fe5g2p/deployments/978
marcin mikolajczak 2 years ago committed by marcin mikołajczak
parent 6cce0a0291
commit b38e5ec8e3

@ -2,6 +2,7 @@ import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet } from 'immutabl
import { mockStore, rootState } from 'soapbox/jest/test-helpers'; import { mockStore, rootState } from 'soapbox/jest/test-helpers';
import { InstanceRecord } from 'soapbox/normalizers'; import { InstanceRecord } from 'soapbox/normalizers';
import { ReducerCompose } from 'soapbox/reducers/compose';
import { uploadCompose, submitCompose } from '../compose'; import { uploadCompose, submitCompose } from '../compose';
import { STATUS_CREATE_REQUEST } from '../statuses'; import { STATUS_CREATE_REQUEST } from '../statuses';
@ -26,7 +27,8 @@ describe('uploadCompose()', () => {
const state = rootState const state = rootState
.set('me', '1234') .set('me', '1234')
.set('instance', instance); .set('instance', instance)
.setIn(['compose', 'home'], ReducerCompose());
store = mockStore(state); store = mockStore(state);
files = [{ files = [{
@ -43,7 +45,7 @@ describe('uploadCompose()', () => {
} as unknown as IntlShape; } as unknown as IntlShape;
const expectedActions = [ const expectedActions = [
{ type: 'COMPOSE_UPLOAD_REQUEST', skipLoading: true }, { type: 'COMPOSE_UPLOAD_REQUEST', id: 'home', skipLoading: true },
{ {
type: 'ALERT_SHOW', type: 'ALERT_SHOW',
message: 'Image exceeds the current file size limit (10 Bytes)', message: 'Image exceeds the current file size limit (10 Bytes)',
@ -51,10 +53,10 @@ describe('uploadCompose()', () => {
actionLink: undefined, actionLink: undefined,
severity: 'error', severity: 'error',
}, },
{ type: 'COMPOSE_UPLOAD_FAIL', error: true, skipLoading: true }, { type: 'COMPOSE_UPLOAD_FAIL', id: 'home', error: true, skipLoading: true },
]; ];
await store.dispatch(uploadCompose(files, mockIntl)); await store.dispatch(uploadCompose('home', files, mockIntl));
const actions = store.getActions(); const actions = store.getActions();
expect(actions).toEqual(expectedActions); expect(actions).toEqual(expectedActions);
@ -78,7 +80,8 @@ describe('uploadCompose()', () => {
const state = rootState const state = rootState
.set('me', '1234') .set('me', '1234')
.set('instance', instance); .set('instance', instance)
.setIn(['compose', 'home'], ReducerCompose());
store = mockStore(state); store = mockStore(state);
files = [{ files = [{
@ -95,7 +98,7 @@ describe('uploadCompose()', () => {
} as unknown as IntlShape; } as unknown as IntlShape;
const expectedActions = [ const expectedActions = [
{ type: 'COMPOSE_UPLOAD_REQUEST', skipLoading: true }, { type: 'COMPOSE_UPLOAD_REQUEST', id: 'home', skipLoading: true },
{ {
type: 'ALERT_SHOW', type: 'ALERT_SHOW',
message: 'Video exceeds the current file size limit (10 Bytes)', message: 'Video exceeds the current file size limit (10 Bytes)',
@ -103,10 +106,10 @@ describe('uploadCompose()', () => {
actionLink: undefined, actionLink: undefined,
severity: 'error', severity: 'error',
}, },
{ type: 'COMPOSE_UPLOAD_FAIL', error: true, skipLoading: true }, { type: 'COMPOSE_UPLOAD_FAIL', id: 'home', error: true, skipLoading: true },
]; ];
await store.dispatch(uploadCompose(files, mockIntl)); await store.dispatch(uploadCompose('home', files, mockIntl));
const actions = store.getActions(); const actions = store.getActions();
expect(actions).toEqual(expectedActions); expect(actions).toEqual(expectedActions);
@ -118,10 +121,10 @@ describe('submitCompose()', () => {
it('inserts mentions from text', async() => { it('inserts mentions from text', async() => {
const state = rootState const state = rootState
.set('me', '123') .set('me', '123')
.setIn(['compose', 'text'], '@alex hello @mkljczk@pl.fediverse.pl @gg@汉语/漢語.com alex@alexgleason.me'); .setIn(['compose', 'home'], ReducerCompose({ text: '@alex hello @mkljczk@pl.fediverse.pl @gg@汉语/漢語.com alex@alexgleason.me' }));
const store = mockStore(state); const store = mockStore(state);
await store.dispatch(submitCompose()); await store.dispatch(submitCompose('home'));
const actions = store.getActions(); const actions = store.getActions();
const statusCreateRequest = actions.find(action => action.type === STATUS_CREATE_REQUEST); const statusCreateRequest = actions.find(action => action.type === STATUS_CREATE_REQUEST);

@ -121,6 +121,7 @@ describe('deleteStatus()', () => {
version: '0.0.0', version: '0.0.0',
}, },
withRedraft: true, withRedraft: true,
id: 'compose-modal',
}, },
{ type: 'MODAL_OPEN', modalType: 'COMPOSE', modalProps: undefined }, { type: 'MODAL_OPEN', modalType: 'COMPOSE', modalProps: undefined },
]; ];

@ -105,6 +105,7 @@ const setComposeToStatus = (status: Status, rawText: string, spoilerText?: strin
dispatch({ dispatch({
type: COMPOSE_SET_STATUS, type: COMPOSE_SET_STATUS,
id: 'compose-modal',
status, status,
rawText, rawText,
explicitAddressing, explicitAddressing,
@ -129,6 +130,7 @@ const replyCompose = (status: Status) =>
dispatch({ dispatch({
type: COMPOSE_REPLY, type: COMPOSE_REPLY,
id: 'compose-modal',
status: status, status: status,
account: state.accounts.get(state.me), account: state.accounts.get(state.me),
explicitAddressing, explicitAddressing,
@ -139,6 +141,7 @@ const replyCompose = (status: Status) =>
const cancelReplyCompose = () => ({ const cancelReplyCompose = () => ({
type: COMPOSE_REPLY_CANCEL, type: COMPOSE_REPLY_CANCEL,
id: 'compose-modal',
}); });
const quoteCompose = (status: Status) => const quoteCompose = (status: Status) =>
@ -149,6 +152,7 @@ const quoteCompose = (status: Status) =>
dispatch({ dispatch({
type: COMPOSE_QUOTE, type: COMPOSE_QUOTE,
id: 'compose-modal',
status: status, status: status,
account: state.accounts.get(state.me), account: state.accounts.get(state.me),
explicitAddressing, explicitAddressing,
@ -159,16 +163,19 @@ const quoteCompose = (status: Status) =>
const cancelQuoteCompose = () => ({ const cancelQuoteCompose = () => ({
type: COMPOSE_QUOTE_CANCEL, type: COMPOSE_QUOTE_CANCEL,
id: 'compose-modal',
}); });
const resetCompose = () => ({ const resetCompose = (composeId = 'compose-modal') => ({
type: COMPOSE_RESET, type: COMPOSE_RESET,
id: composeId,
}); });
const mentionCompose = (account: Account) => const mentionCompose = (account: Account) =>
(dispatch: AppDispatch) => { (dispatch: AppDispatch) => {
dispatch({ dispatch({
type: COMPOSE_MENTION, type: COMPOSE_MENTION,
id: 'compose-modal',
account: account, account: account,
}); });
@ -179,6 +186,7 @@ const directCompose = (account: Account) =>
(dispatch: AppDispatch) => { (dispatch: AppDispatch) => {
dispatch({ dispatch({
type: COMPOSE_DIRECT, type: COMPOSE_DIRECT,
id: 'compose-modal',
account: account, account: account,
}); });
@ -191,6 +199,7 @@ const directComposeById = (accountId: string) =>
dispatch({ dispatch({
type: COMPOSE_DIRECT, type: COMPOSE_DIRECT,
id: 'compose-modal',
account: account, account: account,
}); });
@ -323,7 +332,7 @@ const uploadCompose = (composeId: string, files: FileList, intl: IntlShape) =>
return; return;
} }
dispatch(uploadComposeRequest()); dispatch(uploadComposeRequest(composeId));
Array.from(files).forEach(async(f, i) => { Array.from(files).forEach(async(f, i) => {
if (media.size + i > attachmentLimit - 1) return; if (media.size + i > attachmentLimit - 1) return;
@ -336,18 +345,18 @@ const uploadCompose = (composeId: string, files: FileList, intl: IntlShape) =>
const limit = formatBytes(maxImageSize); const limit = formatBytes(maxImageSize);
const message = intl.formatMessage(messages.exceededImageSizeLimit, { limit }); const message = intl.formatMessage(messages.exceededImageSizeLimit, { limit });
dispatch(snackbar.error(message)); dispatch(snackbar.error(message));
dispatch(uploadComposeFail(true)); dispatch(uploadComposeFail(composeId, true));
return; return;
} else if (isVideo && maxVideoSize && (f.size > maxVideoSize)) { } else if (isVideo && maxVideoSize && (f.size > maxVideoSize)) {
const limit = formatBytes(maxVideoSize); const limit = formatBytes(maxVideoSize);
const message = intl.formatMessage(messages.exceededVideoSizeLimit, { limit }); const message = intl.formatMessage(messages.exceededVideoSizeLimit, { limit });
dispatch(snackbar.error(message)); dispatch(snackbar.error(message));
dispatch(uploadComposeFail(true)); dispatch(uploadComposeFail(composeId, true));
return; return;
} else if (isVideo && maxVideoDuration && (videoDurationInSeconds > maxVideoDuration)) { } else if (isVideo && maxVideoDuration && (videoDurationInSeconds > maxVideoDuration)) {
const message = intl.formatMessage(messages.exceededVideoDurationLimit, { limit: maxVideoDuration }); const message = intl.formatMessage(messages.exceededVideoDurationLimit, { limit: maxVideoDuration });
dispatch(snackbar.error(message)); dispatch(snackbar.error(message));
dispatch(uploadComposeFail(true)); dispatch(uploadComposeFail(composeId, true));
return; return;
} }
@ -361,7 +370,7 @@ const uploadCompose = (composeId: string, files: FileList, intl: IntlShape) =>
const onUploadProgress = ({ loaded }: any) => { const onUploadProgress = ({ loaded }: any) => {
progress[i] = loaded; progress[i] = loaded;
dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total)); dispatch(uploadComposeProgress(composeId, progress.reduce((a, v) => a + v, 0), total));
}; };
return dispatch(uploadMedia(data, onUploadProgress)) return dispatch(uploadMedia(data, onUploadProgress))
@ -369,98 +378,107 @@ const uploadCompose = (composeId: string, files: FileList, intl: IntlShape) =>
// If server-side processing of the media attachment has not completed yet, // If server-side processing of the media attachment has not completed yet,
// poll the server until it is, before showing the media attachment as uploaded // poll the server until it is, before showing the media attachment as uploaded
if (status === 200) { if (status === 200) {
dispatch(uploadComposeSuccess(data, f)); dispatch(uploadComposeSuccess(composeId, data, f));
} else if (status === 202) { } else if (status === 202) {
const poll = () => { const poll = () => {
dispatch(fetchMedia(data.id)).then(({ status, data }) => { dispatch(fetchMedia(data.id)).then(({ status, data }) => {
if (status === 200) { if (status === 200) {
dispatch(uploadComposeSuccess(data, f)); dispatch(uploadComposeSuccess(composeId, data, f));
} else if (status === 206) { } else if (status === 206) {
setTimeout(() => poll(), 1000); setTimeout(() => poll(), 1000);
} }
}).catch(error => dispatch(uploadComposeFail(error))); }).catch(error => dispatch(uploadComposeFail(composeId, error)));
}; };
poll(); poll();
} }
}); });
}).catch(error => dispatch(uploadComposeFail(error))); }).catch(error => dispatch(uploadComposeFail(composeId, error)));
/* eslint-enable no-loop-func */ /* eslint-enable no-loop-func */
}); });
}; };
const changeUploadCompose = (id: string, params: Record<string, any>) => const changeUploadCompose = (composeId: string, id: string, params: Record<string, any>) =>
(dispatch: AppDispatch, getState: () => RootState) => { (dispatch: AppDispatch, getState: () => RootState) => {
if (!isLoggedIn(getState)) return; if (!isLoggedIn(getState)) return;
dispatch(changeUploadComposeRequest()); dispatch(changeUploadComposeRequest(composeId));
dispatch(updateMedia(id, params)).then(response => { dispatch(updateMedia(id, params)).then(response => {
dispatch(changeUploadComposeSuccess(response.data)); dispatch(changeUploadComposeSuccess(composeId, response.data));
}).catch(error => { }).catch(error => {
dispatch(changeUploadComposeFail(id, error)); dispatch(changeUploadComposeFail(composeId, id, error));
}); });
}; };
const changeUploadComposeRequest = () => ({ const changeUploadComposeRequest = (composeId: string) => ({
type: COMPOSE_UPLOAD_CHANGE_REQUEST, type: COMPOSE_UPLOAD_CHANGE_REQUEST,
id: composeId,
skipLoading: true, skipLoading: true,
}); });
const changeUploadComposeSuccess = (media: APIEntity) => ({ const changeUploadComposeSuccess = (composeId: string, media: APIEntity) => ({
type: COMPOSE_UPLOAD_CHANGE_SUCCESS, type: COMPOSE_UPLOAD_CHANGE_SUCCESS,
id: composeId,
media: media, media: media,
skipLoading: true, skipLoading: true,
}); });
const changeUploadComposeFail = (id: string, error: AxiosError) => ({ const changeUploadComposeFail = (composeId: string, id: string, error: AxiosError) => ({
type: COMPOSE_UPLOAD_CHANGE_FAIL, type: COMPOSE_UPLOAD_CHANGE_FAIL,
composeId,
id, id,
error: error, error: error,
skipLoading: true, skipLoading: true,
}); });
const uploadComposeRequest = () => ({ const uploadComposeRequest = (composeId: string) => ({
type: COMPOSE_UPLOAD_REQUEST, type: COMPOSE_UPLOAD_REQUEST,
id: composeId,
skipLoading: true, skipLoading: true,
}); });
const uploadComposeProgress = (loaded: number, total: number) => ({ const uploadComposeProgress = (composeId: string, loaded: number, total: number) => ({
type: COMPOSE_UPLOAD_PROGRESS, type: COMPOSE_UPLOAD_PROGRESS,
id: composeId,
loaded: loaded, loaded: loaded,
total: total, total: total,
}); });
const uploadComposeSuccess = (media: APIEntity, file: File) => ({ const uploadComposeSuccess = (composeId: string, media: APIEntity, file: File) => ({
type: COMPOSE_UPLOAD_SUCCESS, type: COMPOSE_UPLOAD_SUCCESS,
id: composeId,
media: media, media: media,
file, file,
skipLoading: true, skipLoading: true,
}); });
const uploadComposeFail = (error: AxiosError | true) => ({ const uploadComposeFail = (composeId: string, error: AxiosError | true) => ({
type: COMPOSE_UPLOAD_FAIL, type: COMPOSE_UPLOAD_FAIL,
id: composeId,
error: error, error: error,
skipLoading: true, skipLoading: true,
}); });
const undoUploadCompose = (media_id: string) => ({ const undoUploadCompose = (composeId: string, media_id: string) => ({
type: COMPOSE_UPLOAD_UNDO, type: COMPOSE_UPLOAD_UNDO,
id: composeId,
media_id: media_id, media_id: media_id,
}); });
const clearComposeSuggestions = () => { const clearComposeSuggestions = (composeId: string) => {
if (cancelFetchComposeSuggestionsAccounts) { if (cancelFetchComposeSuggestionsAccounts) {
cancelFetchComposeSuggestionsAccounts(); cancelFetchComposeSuggestionsAccounts();
} }
return { return {
type: COMPOSE_SUGGESTIONS_CLEAR, type: COMPOSE_SUGGESTIONS_CLEAR,
id: composeId,
}; };
}; };
const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => { const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, composeId, token) => {
if (cancelFetchComposeSuggestionsAccounts) { if (cancelFetchComposeSuggestionsAccounts) {
cancelFetchComposeSuggestionsAccounts(); cancelFetchComposeSuggestionsAccounts(composeId);
} }
api(getState).get('/api/v1/accounts/search', { api(getState).get('/api/v1/accounts/search', {
cancelToken: new CancelToken(cancel => { cancelToken: new CancelToken(cancel => {
@ -473,7 +491,7 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) =>
}, },
}).then(response => { }).then(response => {
dispatch(importFetchedAccounts(response.data)); dispatch(importFetchedAccounts(response.data));
dispatch(readyComposeSuggestionsAccounts(token, response.data)); dispatch(readyComposeSuggestionsAccounts(composeId, token, response.data));
}).catch(error => { }).catch(error => {
if (!isCancel(error)) { if (!isCancel(error)) {
dispatch(showAlertForError(error)); dispatch(showAlertForError(error));
@ -481,46 +499,48 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) =>
}); });
}, 200, { leading: true, trailing: true }); }, 200, { leading: true, trailing: true });
const fetchComposeSuggestionsEmojis = (dispatch: AppDispatch, getState: () => RootState, token: string) => { const fetchComposeSuggestionsEmojis = (dispatch: AppDispatch, getState: () => RootState, composeId: string, token: string) => {
const results = emojiSearch(token.replace(':', ''), { maxResults: 5 } as any); const results = emojiSearch(token.replace(':', ''), { maxResults: 5 } as any);
dispatch(readyComposeSuggestionsEmojis(token, results)); dispatch(readyComposeSuggestionsEmojis(composeId, token, results));
}; };
const fetchComposeSuggestionsTags = (dispatch: AppDispatch, getState: () => RootState, token: string) => { const fetchComposeSuggestionsTags = (dispatch: AppDispatch, getState: () => RootState, composeId: string, token: string) => {
const state = getState(); const state = getState();
const currentTrends = state.trends.items; const currentTrends = state.trends.items;
dispatch(updateSuggestionTags(token, currentTrends)); dispatch(updateSuggestionTags(composeId, token, currentTrends));
}; };
const fetchComposeSuggestions = (token: string) => const fetchComposeSuggestions = (composeId: string, token: string) =>
(dispatch: AppDispatch, getState: () => RootState) => { (dispatch: AppDispatch, getState: () => RootState) => {
switch (token[0]) { switch (token[0]) {
case ':': case ':':
fetchComposeSuggestionsEmojis(dispatch, getState, token); fetchComposeSuggestionsEmojis(dispatch, getState, composeId, token);
break; break;
case '#': case '#':
fetchComposeSuggestionsTags(dispatch, getState, token); fetchComposeSuggestionsTags(dispatch, getState, composeId, token);
break; break;
default: default:
fetchComposeSuggestionsAccounts(dispatch, getState, token); fetchComposeSuggestionsAccounts(dispatch, getState, composeId, token);
break; break;
} }
}; };
const readyComposeSuggestionsEmojis = (token: string, emojis: Emoji[]) => ({ const readyComposeSuggestionsEmojis = (composeId: string, token: string, emojis: Emoji[]) => ({
type: COMPOSE_SUGGESTIONS_READY, type: COMPOSE_SUGGESTIONS_READY,
id: composeId,
token, token,
emojis, emojis,
}); });
const readyComposeSuggestionsAccounts = (token: string, accounts: APIEntity[]) => ({ const readyComposeSuggestionsAccounts = (composeId: string, token: string, accounts: APIEntity[]) => ({
type: COMPOSE_SUGGESTIONS_READY, type: COMPOSE_SUGGESTIONS_READY,
id: composeId,
token, token,
accounts, accounts,
}); });
const selectComposeSuggestion = (position: number, token: string | null, suggestion: AutoSuggestion, path: Array<string | number>) => const selectComposeSuggestion = (composeId: string, position: number, token: string | null, suggestion: AutoSuggestion, path: Array<string | number>) =>
(dispatch: AppDispatch, getState: () => RootState) => { (dispatch: AppDispatch, getState: () => RootState) => {
let completion, startPosition; let completion, startPosition;
@ -539,6 +559,7 @@ const selectComposeSuggestion = (position: number, token: string | null, suggest
dispatch({ dispatch({
type: COMPOSE_SUGGESTION_SELECT, type: COMPOSE_SUGGESTION_SELECT,
id: composeId,
position: startPosition, position: startPosition,
token, token,
completion, completion,
@ -546,14 +567,16 @@ const selectComposeSuggestion = (position: number, token: string | null, suggest
}); });
}; };
const updateSuggestionTags = (token: string, currentTrends: ImmutableList<Tag>) => ({ const updateSuggestionTags = (composeId: string, token: string, currentTrends: ImmutableList<Tag>) => ({
type: COMPOSE_SUGGESTION_TAGS_UPDATE, type: COMPOSE_SUGGESTION_TAGS_UPDATE,
id: composeId,
token, token,
currentTrends, currentTrends,
}); });
const updateTagHistory = (tags: string[]) => ({ const updateTagHistory = (composeId: string, tags: string[]) => ({
type: COMPOSE_TAG_HISTORY_UPDATE, type: COMPOSE_TAG_HISTORY_UPDATE,
id: composeId,
tags, tags,
}); });
@ -572,7 +595,7 @@ const insertIntoTagHistory = (composeId: string, recognizedTags: APIEntity[], te
const newHistory = names.slice(0, 1000); const newHistory = names.slice(0, 1000);
tagHistory.set(me as string, newHistory); tagHistory.set(me as string, newHistory);
dispatch(updateTagHistory(newHistory)); dispatch(updateTagHistory(composeId, newHistory));
}; };
const changeComposeSensitivity = (composeId: string) => ({ const changeComposeSensitivity = (composeId: string) => ({
@ -665,29 +688,31 @@ const changePollSettings = (composeId: string, expiresIn?: string | number, isMu
const openComposeWithText = (composeId: string, text = '') => const openComposeWithText = (composeId: string, text = '') =>
(dispatch: AppDispatch) => { (dispatch: AppDispatch) => {
dispatch(resetCompose()); dispatch(resetCompose(composeId));
dispatch(openModal('COMPOSE')); dispatch(openModal('COMPOSE'));
dispatch(changeCompose(composeId, text)); dispatch(changeCompose(composeId, text));
}; };
const addToMentions = (accountId: string) => const addToMentions = (composeId: string, accountId: string) =>
(dispatch: AppDispatch, getState: () => RootState) => { (dispatch: AppDispatch, getState: () => RootState) => {
const state = getState(); const state = getState();
const acct = state.accounts.get(accountId)!.acct; const acct = state.accounts.get(accountId)!.acct;
return dispatch({ return dispatch({
type: COMPOSE_ADD_TO_MENTIONS, type: COMPOSE_ADD_TO_MENTIONS,
id: composeId,
account: acct, account: acct,
}); });
}; };
const removeFromMentions = (accountId: string) => const removeFromMentions = (composeId: string, accountId: string) =>
(dispatch: AppDispatch, getState: () => RootState) => { (dispatch: AppDispatch, getState: () => RootState) => {
const state = getState(); const state = getState();
const acct = state.accounts.get(accountId)!.acct; const acct = state.accounts.get(accountId)!.acct;
return dispatch({ return dispatch({
type: COMPOSE_REMOVE_FROM_MENTIONS, type: COMPOSE_REMOVE_FROM_MENTIONS,
id: composeId,
account: acct, account: acct,
}); });
}; };

@ -149,19 +149,19 @@ const ComposeForm: React.FC<IComposeForm> = ({ id, shouldCondense, autoFocus, cl
}; };
const onSuggestionsClearRequested = () => { const onSuggestionsClearRequested = () => {
dispatch(clearComposeSuggestions()); dispatch(clearComposeSuggestions(id));
}; };
const onSuggestionsFetchRequested = (token: string | number) => { const onSuggestionsFetchRequested = (token: string | number) => {
dispatch(fetchComposeSuggestions(token as string)); dispatch(fetchComposeSuggestions(id, token as string));
}; };
const onSuggestionSelected = (tokenStart: number, token: string | null, value: string | undefined) => { const onSuggestionSelected = (tokenStart: number, token: string | null, value: string | undefined) => {
if (value) dispatch(selectComposeSuggestion(tokenStart, token, value, ['text'])); if (value) dispatch(selectComposeSuggestion(id, tokenStart, token, value, ['text']));
}; };
const onSpoilerSuggestionSelected = (tokenStart: number, token: string | null, value: AutoSuggestion) => { const onSpoilerSuggestionSelected = (tokenStart: number, token: string | null, value: AutoSuggestion) => {
dispatch(selectComposeSuggestion(tokenStart, token, value, ['spoiler_text'])); dispatch(selectComposeSuggestion(id, tokenStart, token, value, ['spoiler_text']));
}; };
const handleChangeSpoilerText: React.ChangeEventHandler<HTMLInputElement> = (e) => { const handleChangeSpoilerText: React.ChangeEventHandler<HTMLInputElement> = (e) => {

@ -115,7 +115,6 @@ const EmojiPickerDropdown: React.FC<IEmojiPickerDropdown> = ({ onPickEmoji, butt
}; };
const handlePickEmoji = (emoji: EmojiType) => { const handlePickEmoji = (emoji: EmojiType) => {
console.log(emoji);
// eslint-disable-next-line react-hooks/rules-of-hooks // eslint-disable-next-line react-hooks/rules-of-hooks
dispatch(useEmoji(emoji)); dispatch(useEmoji(emoji));

@ -61,13 +61,13 @@ const Option: React.FC<IOption> = ({
} }
}; };
const onSuggestionsClearRequested = () => dispatch(clearComposeSuggestions()); const onSuggestionsClearRequested = () => dispatch(clearComposeSuggestions(composeId));
const onSuggestionsFetchRequested = (token: string) => dispatch(fetchComposeSuggestions(token)); const onSuggestionsFetchRequested = (token: string) => dispatch(fetchComposeSuggestions(composeId, token));
const onSuggestionSelected = (tokenStart: number, token: string | null, value: AutoSuggestion) => { const onSuggestionSelected = (tokenStart: number, token: string | null, value: AutoSuggestion) => {
if (token && typeof token === 'string') { if (token && typeof token === 'string') {
dispatch(selectComposeSuggestion(tokenStart, token, value, ['poll', 'options', index])); dispatch(selectComposeSuggestion(composeId, tokenStart, token, value, ['poll', 'options', index]));
} }
}; };

@ -22,8 +22,8 @@ const ScheduleButton: React.FC<IScheduleButton> = ({ composeId, disabled }) => {
const compose = useCompose(composeId); const compose = useCompose(composeId);
const active = compose.schedule; const active = !!compose.schedule;
const unavailable = compose.id; const unavailable = !!compose.id;
const handleClick = () => { const handleClick = () => {
if (active) { if (active) {

@ -91,7 +91,7 @@ const Upload: React.FC<IUpload> = ({ composeId, id }) => {
const handleUndoClick: React.MouseEventHandler = e => { const handleUndoClick: React.MouseEventHandler = e => {
e.stopPropagation(); e.stopPropagation();
dispatch(undoUploadCompose(media.id)); dispatch(undoUploadCompose(composeId, media.id));
}; };
const handleInputChange: React.ChangeEventHandler<HTMLTextAreaElement> = e => { const handleInputChange: React.ChangeEventHandler<HTMLTextAreaElement> = e => {
@ -119,7 +119,7 @@ const Upload: React.FC<IUpload> = ({ composeId, id }) => {
setDirtyDescription(null); setDirtyDescription(null);
if (dirtyDescription !== null) { if (dirtyDescription !== null) {
dispatch(changeUploadCompose(media.id, { dirtyDescription })); dispatch(changeUploadCompose(composeId, media.id, { dirtyDescription }));
} }
}; };

@ -9,7 +9,7 @@ import type { AppDispatch, RootState } from 'soapbox/store';
const mapStateToProps = (state: RootState, { composeId }: { composeId: string }) => ({ const mapStateToProps = (state: RootState, { composeId }: { composeId: string }) => ({
disabled: state.compose.get(composeId)?.is_uploading, disabled: state.compose.get(composeId)?.is_uploading,
resetFileKey: state.compose.get(composeId)?.resetFileKey, resetFileKey: state.compose.get(composeId)?.resetFileKey!,
}); });
const mapDispatchToProps = (dispatch: AppDispatch, { composeId }: { composeId: string }) => ({ const mapDispatchToProps = (dispatch: AppDispatch, { composeId }: { composeId: string }) => ({

@ -26,11 +26,13 @@ const Account: React.FC<IAccount> = ({ composeId, accountId, author }) => {
const intl = useIntl(); const intl = useIntl();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const compose = useCompose(composeId);
const account = useAppSelector((state) => getAccount(state, accountId)); const account = useAppSelector((state) => getAccount(state, accountId));
const added = !!account && useCompose(composeId).to?.includes(account.acct); const added = !!account && compose.to?.includes(account.acct);
const onRemove = () => dispatch(removeFromMentions(accountId)); const onRemove = () => dispatch(removeFromMentions(composeId, accountId));
const onAdd = () => dispatch(addToMentions(accountId)); const onAdd = () => dispatch(addToMentions(composeId, accountId));
useEffect(() => { useEffect(() => {
if (accountId && !account) { if (accountId && !account) {

File diff suppressed because it is too large Load Diff

@ -278,7 +278,7 @@ const updateSetting = (compose: Compose, path: string[], value: string) => {
const updateCompose = (state: State, key: string, updater: (compose: Compose) => Compose) => const updateCompose = (state: State, key: string, updater: (compose: Compose) => Compose) =>
state.update(key, state.get('default')!, updater); state.update(key, state.get('default')!, updater);
const initialState: State = ImmutableMap({ export const initialState: State = ImmutableMap({
default: ReducerCompose({ idempotencyKey: uuid(), resetFileKey: getResetFileKey() }), default: ReducerCompose({ idempotencyKey: uuid(), resetFileKey: getResetFileKey() }),
}); });
@ -361,11 +361,11 @@ export default function compose(state = initialState, action: AnyAction) {
case COMPOSE_QUOTE_CANCEL: case COMPOSE_QUOTE_CANCEL:
case COMPOSE_RESET: case COMPOSE_RESET:
case COMPOSE_SUBMIT_SUCCESS: case COMPOSE_SUBMIT_SUCCESS:
return state.get('default')!.set('idempotencyKey', uuid()); return updateCompose(state, action.id, () => state.get('default')!.set('idempotencyKey', uuid()));
case COMPOSE_SUBMIT_FAIL: case COMPOSE_SUBMIT_FAIL:
return updateCompose(state, action.id, compose => compose.set('is_submitting', false)); return updateCompose(state, action.id, compose => compose.set('is_submitting', false));
case COMPOSE_UPLOAD_CHANGE_FAIL: case COMPOSE_UPLOAD_CHANGE_FAIL:
return updateCompose(state, action.id, compose => compose.set('is_changing_upload', false)); return updateCompose(state, action.composeId, compose => compose.set('is_changing_upload', false));
case COMPOSE_UPLOAD_REQUEST: case COMPOSE_UPLOAD_REQUEST:
return updateCompose(state, action.id, compose => compose.set('is_uploading', true)); return updateCompose(state, action.id, compose => compose.set('is_uploading', true));
case COMPOSE_UPLOAD_SUCCESS: case COMPOSE_UPLOAD_SUCCESS:
@ -392,7 +392,7 @@ export default function compose(state = initialState, action: AnyAction) {
map.set('idempotencyKey', uuid()); map.set('idempotencyKey', uuid());
})); }));
case COMPOSE_SUGGESTIONS_CLEAR: case COMPOSE_SUGGESTIONS_CLEAR:
return updateCompose(state, action.id, compose => compose.update('suggestions', list => list.clear()).set('suggestion_token', null)); return updateCompose(state, action.id, compose => compose.update('suggestions', list => list?.clear()).set('suggestion_token', null));
case COMPOSE_SUGGESTIONS_READY: case COMPOSE_SUGGESTIONS_READY:
return updateCompose(state, action.id, compose => compose.set('suggestions', ImmutableList(action.accounts ? action.accounts.map((item: APIEntity) => item.id) : action.emojis)).set('suggestion_token', action.token)); return updateCompose(state, action.id, compose => compose.set('suggestions', ImmutableList(action.accounts ? action.accounts.map((item: APIEntity) => item.id) : action.emojis)).set('suggestion_token', action.token));
case COMPOSE_SUGGESTION_SELECT: case COMPOSE_SUGGESTION_SELECT:
@ -402,7 +402,7 @@ export default function compose(state = initialState, action: AnyAction) {
case COMPOSE_TAG_HISTORY_UPDATE: case COMPOSE_TAG_HISTORY_UPDATE:
return updateCompose(state, action.id, compose => compose.set('tagHistory', ImmutableList(fromJS(action.tags)) as ImmutableList<string>)); return updateCompose(state, action.id, compose => compose.set('tagHistory', ImmutableList(fromJS(action.tags)) as ImmutableList<string>));
case TIMELINE_DELETE: case TIMELINE_DELETE:
return updateCompose(state, action.id, compose => { return updateCompose(state, 'compose-modal', compose => {
if (action.id === compose.in_reply_to) { if (action.id === compose.in_reply_to) {
return compose.set('in_reply_to', null); return compose.set('in_reply_to', null);
} if (action.id === compose.quote) { } if (action.id === compose.quote) {

@ -157,7 +157,6 @@ const rootReducer: typeof appReducer = (state, action) => {
case AUTH_LOGGED_OUT: case AUTH_LOGGED_OUT:
return appReducer(logOut(state), action); return appReducer(logOut(state), action);
default: default:
console.log(action.type);
return appReducer(state, action); return appReducer(state, action);
} }
}; };

Loading…
Cancel
Save