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 { calculateStatus } from 'soapbox/reducers/statuses';
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 me = state.me as string;
const params = scheduledStatus.get('params');
const account = getAccount(state, me);
const status = ImmutableMap({
account,
content: params.get('text', '').replace(new RegExp('\n', 'g'), '<br>'), /* eslint-disable-line no-control-regex */
created_at: params.get('scheduled_at'),
id: scheduledStatus.get('id'),
in_reply_to_id: params.get('in_reply_to_id'),
media_attachments: scheduledStatus.get('media_attachments'),
poll: params.get('poll'),
sensitive: params.get('sensitive'),
uri: `/scheduled_statuses/${scheduledStatus.get('id')}`,
url: `/scheduled_statuses/${scheduledStatus.get('id')}`,
visibility: params.get('visibility'),
content: scheduledStatus.text.replace(new RegExp('\n', 'g'), '<br>'), /* eslint-disable-line no-control-regex */
created_at: scheduledStatus.scheduled_at,
id: scheduledStatus.id,
in_reply_to_id: scheduledStatus.in_reply_to_id,
media_attachments: scheduledStatus.media_attachments,
poll: scheduledStatus.poll,
sensitive: scheduledStatus.sensitive,
uri: `/scheduled_statuses/${scheduledStatus.id}`,
url: `/scheduled_statuses/${scheduledStatus.id}`,
visibility: scheduledStatus.visibility,
});
return calculateStatus(normalizeStatus(status));

Wyświetl plik

@ -20,7 +20,7 @@ interface IScheduledStatus {
}
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;

Wyświetl plik

@ -1,11 +1,11 @@
import { List as ImmutableList, Map as ImmutableMap, Record as ImmutableRecord, fromJS } from 'immutable';
import { AnyAction } from 'redux';
import {
STATUS_CREATE_REQUEST,
STATUS_CREATE_SUCCESS,
} from 'soapbox/actions/statuses';
import type { AnyAction } from 'redux';
import type { StatusVisibility } from 'soapbox/normalizers/status';
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;
}
}