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 { 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));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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({
|
||||||
|
|
|
@ -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