Skip to content

Commit

Permalink
Type and clean up meeting components
Browse files Browse the repository at this point in the history
  • Loading branch information
eikhr committed Apr 16, 2023
1 parent f603095 commit 0e27d20
Show file tree
Hide file tree
Showing 25 changed files with 305 additions and 305 deletions.
2 changes: 1 addition & 1 deletion app/actions/ArticleActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type { ID } from 'app/store/models';
import type { ArticleEntity, Thunk } from 'app/types';
import { Article } from './ActionTypes';

export function fetchArticle(articleId: ID): Thunk<void> {
export function fetchArticle(articleId: ID): Thunk<Promise<void>> {
return callAPI({
types: Article.FETCH,
endpoint: `/articles/${articleId}/`,
Expand Down
10 changes: 5 additions & 5 deletions app/actions/MeetingActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { startSubmit, stopSubmit } from 'redux-form';
import callAPI from 'app/actions/callAPI';
import { meetingSchema } from 'app/reducers';
import type { UserEntity } from 'app/reducers/users';
import type { ID } from 'app/store/models';
import type { Thunk, Action } from 'app/types';
import createQueryString from 'app/utils/createQueryString';
import { Meeting } from './ActionTypes';
Expand Down Expand Up @@ -150,19 +151,18 @@ export function inviteUsersAndGroups({
users,
groups,
}: {
id: number;
id: ID;
users: [
{
value: number;
id: number;
id: ID;
}
];
groups: [
{
value: number;
value: ID;
}
];
}): Thunk<any> {
}): Thunk<Promise<void>> {
return callAPI({
types: Meeting.EDIT,
endpoint: `/meetings/${id}/bulk_invite/`,
Expand Down
2 changes: 1 addition & 1 deletion app/components/UserAttendance/AttendanceStatus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import withModal from './withModal';
import type { Pool } from './AttendanceModal';

type AttendancePool = Pool & {
capacity: number;
capacity?: number;
registrationCount?: number;
};

Expand Down
2 changes: 1 addition & 1 deletion app/components/UserAttendance/withModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ const ChildrenWithProps = ({
children,
...restProps
}: WithModalProps & {
children: ReactElement[];
children: ReactElement | ReactElement[];
}) => (
<div>
{Children.map(children, (child) => cloneElement(child, { ...restProps }))}
Expand Down
24 changes: 12 additions & 12 deletions app/reducers/__tests__/meetingsToken.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@ import meetingsToken from '../meetingsToken';

describe('reducers', () => {
const prevState = {
response: 'abc',
user: {},
meeting: null,
status: '',
response: undefined,
user: undefined,
meeting: undefined,
status: undefined,
};
describe('meetingsToken', () => {
it('Meeting.ANSWER_INVITATION_TOKEN.FAILURE', () => {
const action = {
type: Meeting.ANSWER_INVITATION_TOKEN.FAILURE,
};
expect(meetingsToken(prevState, action)).toEqual({
response: 'abc',
user: {},
meeting: null,
status: 'FAILURE',
response: 'FAILURE',
user: undefined,
meeting: undefined,
status: undefined,
});
});
it('Meeting.ANSWER_INVITATION_TOKEN.SUCCESS', () => {
Expand All @@ -41,10 +41,10 @@ describe('reducers', () => {
type: Meeting.RESET_MEETINGS_TOKEN,
};
expect(meetingsToken(prevState, action)).toEqual({
response: '',
user: {},
meeting: null,
status: '',
response: undefined,
user: undefined,
meeting: undefined,
status: undefined,
});
});
});
Expand Down
20 changes: 18 additions & 2 deletions app/reducers/meetingInvitations.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
import { produce } from 'immer';
import { createSelector } from 'reselect';
import type { User } from 'app/models';
import type { MeetingInvitationStatus } from 'app/store/models/MeetingInvitation';
import type { RootState } from 'app/store/createRootReducer';
import type { ID } from 'app/store/models';
import type {
MeetingInvitation,
MeetingInvitationStatus,
} from 'app/store/models/MeetingInvitation';
import type { PublicUser } from 'app/store/models/User';
import createEntityReducer from 'app/utils/createEntityReducer';
import { Meeting } from '../actions/ActionTypes';
import { selectMeetingById } from './meetings';
import type { Selector } from 'reselect';

export const statusesText: {
[value in MeetingInvitationStatus]: string;
Expand Down Expand Up @@ -48,7 +55,16 @@ export const selectMeetingInvitation = createSelector(
(meetingInvitationsById, meetingId, userId) =>
meetingInvitationsById[getMeetingInvitationId(meetingId, userId)]
);
export const selectMeetingInvitationsForMeeting = createSelector(

export type MeetingInvitationWithUser = Omit<MeetingInvitation, 'user'> & {
id: ID;
user: PublicUser;
};

export const selectMeetingInvitationsForMeeting: Selector<
RootState,
MeetingInvitationWithUser[]
> = createSelector(
selectMeetingById,
(state) => state.meetingInvitations.byId,
(state) => state.users.byId,
Expand Down
19 changes: 2 additions & 17 deletions app/reducers/meetings.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,15 @@
import moment from 'moment-timezone';
import { createSelector } from 'reselect';
import type { Dateish } from 'app/models';
import { mutateComments } from 'app/reducers/comments';
import type { ReactionsGrouped } from 'app/store/models/Reaction';
import type { ListMeeting } from 'app/store/models/Meeting';
import createEntityReducer from 'app/utils/createEntityReducer';
import joinReducers from 'app/utils/joinReducers';
import { Meeting } from '../actions/ActionTypes';
import { mutateReactions } from './reactions';

export type MeetingEntity = {
id: number;
title: string;
location: string;
startTime: Dateish;
endTime: Dateish;
report: string;
invitations: Array<number>;
reportAuthor: number;
createdBy: number;
mazemapPoi: number;
reactionsGrouped?: ReactionsGrouped[];
};

export type MeetingSection = {
title: string;
meetings: Array<MeetingEntity>;
meetings: ListMeeting[];
};

const mutate = joinReducers(
Expand Down
26 changes: 19 additions & 7 deletions app/reducers/meetingsToken.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
import { produce } from 'immer';
import type { ID } from 'app/store/models';
import type { MeetingInvitationStatus } from 'app/store/models/MeetingInvitation';
import type { PublicUser } from 'app/store/models/User';
import { Meeting } from '../actions/ActionTypes';
import type { Reducer } from '@reduxjs/toolkit';

const initialState = {
response: '',
user: {},
meeting: null,
status: '',
export type MeetingsTokenResponse = 'SUCCESS' | 'FAILURE';

type State = {
response?: MeetingsTokenResponse;
user?: PublicUser;
meeting?: ID;
status?: MeetingInvitationStatus;
};

const initialState: State = {
response: undefined,
user: undefined,
meeting: undefined,
status: undefined,
};
type State = typeof initialState;

const meetingsToken: Reducer<State> = produce((newState, action) => {
switch (action.type) {
case Meeting.ANSWER_INVITATION_TOKEN.FAILURE:
newState.status = 'FAILURE';
newState.response = 'FAILURE';
break;

case Meeting.ANSWER_INVITATION_TOKEN.SUCCESS: {
Expand Down
3 changes: 3 additions & 0 deletions app/routes/app/AppRoute.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ export const UserContext = createContext<{
loggedIn: false,
});

// Extract the type of the user context
export type UserContextType = ReturnType<typeof useUserContext>;

export const useUserContext = () => useContext(UserContext);

class AppChildren extends PureComponent<Props> {
Expand Down
2 changes: 1 addition & 1 deletion app/routes/articles/ArticleCreateRoute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { selectCurrentUser } from 'app/reducers/auth';
import replaceUnlessLoggedIn from 'app/utils/replaceUnlessLoggedIn';
import ArticleEditor from './components/ArticleEditor';

const mapStateToProps = (state, props) => {
const mapStateToProps = (state) => {
const currentUser = selectCurrentUser(state);
const authors = [currentUser];
return {
Expand Down
6 changes: 1 addition & 5 deletions app/routes/articles/ArticleListRoute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,9 @@ import { connect } from 'react-redux';
import { compose } from 'redux';
import { fetchAll } from 'app/actions/ArticleActions';
import { fetchPopular } from 'app/actions/TagActions';
import {
selectArticles,
selectArticlesWithAuthorDetails,
} from 'app/reducers/articles';
import { selectArticlesWithAuthorDetails } from 'app/reducers/articles';
import { selectPaginationNext } from 'app/reducers/selectors';
import { selectPopularTags } from 'app/reducers/tags';
import { selectUserById } from 'app/reducers/users';
import type { PublicArticle } from 'app/store/models/Article';
import type { PublicUser } from 'app/store/models/User';
import withPreparedDispatch from 'app/utils/withPreparedDispatch';
Expand Down
12 changes: 11 additions & 1 deletion app/routes/meetings/MeetingDetailLoginRoute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,26 @@ import {
selectCommentsForMeeting,
} from 'app/reducers/meetings';
import { selectUserById } from 'app/reducers/users';
import type { UserContextType } from 'app/routes/app/AppRoute';
import type { RootState } from 'app/store/createRootReducer';
import replaceUnlessLoggedIn from 'app/utils/replaceUnlessLoggedIn';
import MeetingDetail from './components/MeetingDetail';
import type { RouteChildrenProps } from 'react-router';

type Params = {
meetingId: string;
};

const mapDispatchToProps = {
setInvitationStatus,
fetchMeeting,
push,
};

const mapStateToProps = (state, props) => {
const mapStateToProps = (
state: RootState,
props: RouteChildrenProps<Params> & UserContextType
) => {
const { meetingId } = props.match.params;
const { currentUser } = props;
const meeting = selectMeetingById(state, {
Expand Down
30 changes: 19 additions & 11 deletions app/routes/meetings/MeetingDetailRoute.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,21 @@ import {
resetMeetingsToken,
} from 'app/actions/MeetingActions';
import { addReaction, deleteReaction } from 'app/actions/ReactionActions';
import type { User } from 'app/models';
import { selectEmojis } from 'app/reducers/emojis';
import { selectMeetingById } from 'app/reducers/meetings';
import type { ReactionsGrouped } from 'app/store/models/Reaction';
import type { MeetingsTokenResponse } from 'app/reducers/meetingsToken';
import type { UserContextType } from 'app/routes/app/AppRoute';
import type { ID } from 'app/store/models';
import type { MeetingInvitationStatus } from 'app/store/models/MeetingInvitation';
import type { PublicUser } from 'app/store/models/User';
import withPreparedDispatch from 'app/utils/withPreparedDispatch';
import MeetingDetailLoginRoute from './MeetingDetailLoginRoute';
import MeetingAnswer from './components/MeetingAnswer';
import type { RouteChildrenProps } from 'react-router';

type Params = {
meetingId: string;
};

const loadMeeting = (
{
Expand All @@ -31,7 +39,10 @@ const loadMeeting = (
? Promise.all([dispatch(fetchMeeting(meetingId), dispatch(fetchEmojis()))])
: Promise.resolve();

const loadData = (props, dispatch): any => {
const loadData = (
props: RouteChildrenProps<Params> & UserContextType,
dispatch
): any => {
const search = qs.parse(props.location.search, {
ignoreQueryPrefix: true,
});
Expand Down Expand Up @@ -85,24 +96,21 @@ const mapStateToProps = (state, props) => {
type Props = {
loggedIn: boolean;
meetingsToken: {
status: number;
user: User;
response: string;
meeting: number;
reactionsGrouped: ReactionsGrouped[];
user: PublicUser;
response: MeetingsTokenResponse;
meeting: ID;
status: MeetingInvitationStatus;
};
router: any;
resetMeetingsToken: () => void;
};

const MeetingComponent = (props: Props) => {
const { loggedIn, meetingsToken, router, resetMeetingsToken } = props;
const { loggedIn, meetingsToken, resetMeetingsToken } = props;

if (!loggedIn && meetingsToken.meeting) {
return (
<MeetingAnswer
{...meetingsToken}
router={router}
resetMeetingsToken={resetMeetingsToken}
/>
);
Expand Down
9 changes: 6 additions & 3 deletions app/routes/meetings/MeetingEditRoute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { LoginPage } from 'app/components/LoginForm';
import { selectMeetingInvitationsForMeeting } from 'app/reducers/meetingInvitations';
import { selectMeetingById } from 'app/reducers/meetings';
import { selectUserById } from 'app/reducers/users';
import type { UserContextType } from 'app/routes/app/AppRoute';
import type { RootState } from 'app/store/createRootReducer';
import replaceUnlessLoggedIn from 'app/utils/replaceUnlessLoggedIn';
import withPreparedDispatch from 'app/utils/withPreparedDispatch';
Expand All @@ -23,7 +24,7 @@ type Params = {

const mapStateToProps = (
state: RootState,
props: RouteChildrenProps<Params>
props: RouteChildrenProps<Params> & UserContextType
) => {
const { meetingId } = props.match.params;
const meeting = selectMeetingById(state, {
Expand Down Expand Up @@ -70,8 +71,10 @@ const mapDispatchToProps = {
};
export default compose(
replaceUnlessLoggedIn(LoginPage),
withPreparedDispatch('fetchMeetingEdit', (props, dispatch) =>
dispatch(fetchMeeting(props.match.params.meetingId))
withPreparedDispatch(
'fetchMeetingEdit',
(props: RouteChildrenProps<Params>, dispatch) =>
dispatch(fetchMeeting(props.match.params.meetingId))
),
connect(mapStateToProps, mapDispatchToProps)
)(MeetingEditor);
2 changes: 1 addition & 1 deletion app/routes/meetings/MeetingListRoute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import { compose } from 'redux';
import { fetchAll } from 'app/actions/MeetingActions';
import { LoginPage } from 'app/components/LoginForm';
import { selectGroupedMeetings } from 'app/reducers/meetings';
import { selectPagination } from 'app/reducers/selectors';
import createQueryString from 'app/utils/createQueryString';
import replaceUnlessLoggedIn from 'app/utils/replaceUnlessLoggedIn';
import withPreparedDispatch from 'app/utils/withPreparedDispatch';
import { selectPagination } from '../../reducers/selectors';
import MeetingList from './components/MeetingList';

const mapStateToProps = (state, props) => {
Expand Down

0 comments on commit 0e27d20

Please sign in to comment.