From b9fc2c6e587aefeb96b02448101530aa11c58da8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Thu, 23 Jun 2022 20:45:46 +0200 Subject: [PATCH] reducers/scheduled_statuses: TypeScript MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- .../features/scheduled_statuses/builder.tsx | 27 ++++----- .../components/scheduled_status.tsx | 2 +- app/soapbox/reducers/pending_statuses.ts | 2 +- app/soapbox/reducers/scheduled_statuses.js | 38 ------------- app/soapbox/reducers/scheduled_statuses.ts | 57 +++++++++++++++++++ 5 files changed, 73 insertions(+), 53 deletions(-) delete mode 100644 app/soapbox/reducers/scheduled_statuses.js create mode 100644 app/soapbox/reducers/scheduled_statuses.ts diff --git a/app/soapbox/features/scheduled_statuses/builder.tsx b/app/soapbox/features/scheduled_statuses/builder.tsx index 2927c8984..9db827412 100644 --- a/app/soapbox/features/scheduled_statuses/builder.tsx +++ b/app/soapbox/features/scheduled_statuses/builder.tsx @@ -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) => { +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'), '
'), /* 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'), '
'), /* 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)); diff --git a/app/soapbox/features/scheduled_statuses/components/scheduled_status.tsx b/app/soapbox/features/scheduled_statuses/components/scheduled_status.tsx index 15a8e1ed9..2e7763126 100644 --- a/app/soapbox/features/scheduled_statuses/components/scheduled_status.tsx +++ b/app/soapbox/features/scheduled_statuses/components/scheduled_status.tsx @@ -20,7 +20,7 @@ interface IScheduledStatus { } const ScheduledStatus: React.FC = ({ 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; diff --git a/app/soapbox/reducers/pending_statuses.ts b/app/soapbox/reducers/pending_statuses.ts index 090b8694a..e0df9f07d 100644 --- a/app/soapbox/reducers/pending_statuses.ts +++ b/app/soapbox/reducers/pending_statuses.ts @@ -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({ diff --git a/app/soapbox/reducers/scheduled_statuses.js b/app/soapbox/reducers/scheduled_statuses.js deleted file mode 100644 index f96573e88..000000000 --- a/app/soapbox/reducers/scheduled_statuses.js +++ /dev/null @@ -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; - } -} diff --git a/app/soapbox/reducers/scheduled_statuses.ts b/app/soapbox/reducers/scheduled_statuses.ts new file mode 100644 index 000000000..13b4a934d --- /dev/null +++ b/app/soapbox/reducers/scheduled_statuses.ts @@ -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> | null, + text: '', + in_reply_to_id: null as string | null, + media_ids: null as ImmutableList | null, + sensitive: false, + spoiler_text: '', + visibility: 'public' as StatusVisibility, + poll: null as ImmutableMap | null, +}); + +export type ScheduledStatus = ReturnType; +type State = ImmutableMap; + +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; + } +}