sforkowany z mirror/soapbox
reducers/scheduled_statuses: TypeScript
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>virtuoso-debug
rodzic
7f8594d05e
commit
b9fc2c6e58
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
Ładowanie…
Reference in New Issue