reducers/scheduled_statuses: TypeScript

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
virtuoso-debug
marcin mikołajczak 2022-06-23 20:45:46 +02:00
rodzic 7f8594d05e
commit b9fc2c6e58
5 zmienionych plików z 73 dodań i 53 usunięć

Wyświetl plik

@ -3,28 +3,29 @@ import { Map as ImmutableMap } from 'immutable';
import { normalizeStatus } from 'soapbox/normalizers/status'; import { normalizeStatus } from 'soapbox/normalizers/status';
import { calculateStatus } from 'soapbox/reducers/statuses'; import { calculateStatus } from 'soapbox/reducers/statuses';
import { makeGetAccount } from 'soapbox/selectors'; import { makeGetAccount } from 'soapbox/selectors';
import { RootState } from 'soapbox/store';
export const buildStatus = (state: RootState, scheduledStatus: ImmutableMap<string, any>) => { import type { ScheduledStatus } from 'soapbox/reducers/scheduled_statuses';
import type { RootState } from 'soapbox/store';
export const buildStatus = (state: RootState, scheduledStatus: ScheduledStatus) => {
const getAccount = makeGetAccount(); const getAccount = makeGetAccount();
const me = state.me as string; const me = state.me as string;
const params = scheduledStatus.get('params');
const account = getAccount(state, me); const account = getAccount(state, me);
const status = ImmutableMap({ const status = ImmutableMap({
account, account,
content: params.get('text', '').replace(new RegExp('\n', 'g'), '<br>'), /* eslint-disable-line no-control-regex */ content: scheduledStatus.text.replace(new RegExp('\n', 'g'), '<br>'), /* eslint-disable-line no-control-regex */
created_at: params.get('scheduled_at'), created_at: scheduledStatus.scheduled_at,
id: scheduledStatus.get('id'), id: scheduledStatus.id,
in_reply_to_id: params.get('in_reply_to_id'), in_reply_to_id: scheduledStatus.in_reply_to_id,
media_attachments: scheduledStatus.get('media_attachments'), media_attachments: scheduledStatus.media_attachments,
poll: params.get('poll'), poll: scheduledStatus.poll,
sensitive: params.get('sensitive'), sensitive: scheduledStatus.sensitive,
uri: `/scheduled_statuses/${scheduledStatus.get('id')}`, uri: `/scheduled_statuses/${scheduledStatus.id}`,
url: `/scheduled_statuses/${scheduledStatus.get('id')}`, url: `/scheduled_statuses/${scheduledStatus.id}`,
visibility: params.get('visibility'), visibility: scheduledStatus.visibility,
}); });
return calculateStatus(normalizeStatus(status)); return calculateStatus(normalizeStatus(status));

Wyświetl plik

@ -20,7 +20,7 @@ interface IScheduledStatus {
} }
const ScheduledStatus: React.FC<IScheduledStatus> = ({ statusId, ...other }) => { const ScheduledStatus: React.FC<IScheduledStatus> = ({ statusId, ...other }) => {
const status = useAppSelector((state) => buildStatus(state, state.scheduled_statuses.get(statusId))) as StatusEntity; const status = useAppSelector((state) => buildStatus(state, state.scheduled_statuses.get(statusId)!)) as StatusEntity;
if (!status) return null; if (!status) return null;

Wyświetl plik

@ -1,11 +1,11 @@
import { List as ImmutableList, Map as ImmutableMap, Record as ImmutableRecord, fromJS } from 'immutable'; import { List as ImmutableList, Map as ImmutableMap, Record as ImmutableRecord, fromJS } from 'immutable';
import { AnyAction } from 'redux';
import { import {
STATUS_CREATE_REQUEST, STATUS_CREATE_REQUEST,
STATUS_CREATE_SUCCESS, STATUS_CREATE_SUCCESS,
} from 'soapbox/actions/statuses'; } from 'soapbox/actions/statuses';
import type { AnyAction } from 'redux';
import type { StatusVisibility } from 'soapbox/normalizers/status'; import type { StatusVisibility } from 'soapbox/normalizers/status';
const PendingStatusRecord = ImmutableRecord({ const PendingStatusRecord = ImmutableRecord({

Wyświetl plik

@ -1,38 +0,0 @@
import { Map as ImmutableMap, fromJS } from 'immutable';
import {
SCHEDULED_STATUSES_FETCH_SUCCESS,
SCHEDULED_STATUS_CANCEL_REQUEST,
SCHEDULED_STATUS_CANCEL_SUCCESS,
} from 'soapbox/actions/scheduled_statuses';
import { STATUS_CREATE_SUCCESS } from 'soapbox/actions/statuses';
import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer';
const importStatus = (state, status) => {
if (!status.scheduled_at) return state;
return state.set(status.id, fromJS(status));
};
const importStatuses = (state, statuses) =>
state.withMutations(mutable => statuses.forEach(status => importStatus(mutable, status)));
const deleteStatus = (state, id) => state.delete(id);
const initialState = ImmutableMap();
export default function scheduled_statuses(state = initialState, action) {
switch (action.type) {
case STATUS_IMPORT:
case STATUS_CREATE_SUCCESS:
return importStatus(state, action.status);
case STATUSES_IMPORT:
case SCHEDULED_STATUSES_FETCH_SUCCESS:
return importStatuses(state, action.statuses);
case SCHEDULED_STATUS_CANCEL_REQUEST:
case SCHEDULED_STATUS_CANCEL_SUCCESS:
return deleteStatus(state, action.id);
default:
return state;
}
}

Wyświetl plik

@ -0,0 +1,57 @@
import { List as ImmutableList, Map as ImmutableMap, Record as ImmutableRecord, fromJS } from 'immutable';
import { STATUS_IMPORT, STATUSES_IMPORT } from 'soapbox/actions/importer';
import {
SCHEDULED_STATUSES_FETCH_SUCCESS,
SCHEDULED_STATUS_CANCEL_REQUEST,
SCHEDULED_STATUS_CANCEL_SUCCESS,
} from 'soapbox/actions/scheduled_statuses';
import { STATUS_CREATE_SUCCESS } from 'soapbox/actions/statuses';
import type { AnyAction } from 'redux';
import type { StatusVisibility } from 'soapbox/normalizers/status';
import type { APIEntity } from 'soapbox/types/entities';
const ScheduledStatusRecord = ImmutableRecord({
id: '',
scheduled_at: new Date(),
media_attachments: null as ImmutableList<ImmutableMap<string, any>> | null,
text: '',
in_reply_to_id: null as string | null,
media_ids: null as ImmutableList<string> | null,
sensitive: false,
spoiler_text: '',
visibility: 'public' as StatusVisibility,
poll: null as ImmutableMap<string, any> | null,
});
export type ScheduledStatus = ReturnType<typeof ScheduledStatusRecord>;
type State = ImmutableMap<string, ScheduledStatus>;
const initialState: State = ImmutableMap();
const importStatus = (state: State, { params, ...status }: APIEntity) => {
if (!status.scheduled_at) return state;
return state.set(status.id, ScheduledStatusRecord(ImmutableMap(fromJS({ ...status, ...params }))));
};
const importStatuses = (state: State, statuses: APIEntity[]) =>
state.withMutations(mutable => statuses.forEach(status => importStatus(mutable, status)));
const deleteStatus = (state: State, id: string) => state.delete(id);
export default function scheduled_statuses(state: State = initialState, action: AnyAction) {
switch (action.type) {
case STATUS_IMPORT:
case STATUS_CREATE_SUCCESS:
return importStatus(state, action.status);
case STATUSES_IMPORT:
case SCHEDULED_STATUSES_FETCH_SUCCESS:
return importStatuses(state, action.statuses);
case SCHEDULED_STATUS_CANCEL_REQUEST:
case SCHEDULED_STATUS_CANCEL_SUCCESS:
return deleteStatus(state, action.id);
default:
return state;
}
}