Skip to content

Commit

Permalink
Merge pull request #4369 from webkom/ivarnakken/aba-696-refactor-meet…
Browse files Browse the repository at this point in the history
…ings-to-support-react-router-v6

Refactor /meetings to support `react-router` v6
  • Loading branch information
ivarnakken committed Dec 17, 2023
2 parents 35f8bb3 + b00bf1f commit 9080fc4
Show file tree
Hide file tree
Showing 16 changed files with 503 additions and 749 deletions.
52 changes: 20 additions & 32 deletions app/actions/GroupActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import { push } from 'redux-first-history';
import callAPI from 'app/actions/callAPI';
import { groupSchema, membershipSchema } from 'app/reducers';
import { Group, Membership } from './ActionTypes';
import type { GroupType } from 'app/models';
import type { AppDispatch } from 'app/store/createStore';
import type { ID } from 'app/store/models';
import type MembershipType from 'app/store/models/Membership';
import type { CurrentUser } from 'app/store/models/User';
import type { RoleType } from 'app/utils/constants';

export type AddMemberArgs = {
Expand All @@ -29,6 +31,7 @@ export function addMember({ groupId, userId, role }: AddMemberArgs) {
},
});
}

export function removeMember(membership: MembershipType) {
return callAPI({
types: Membership.REMOVE,
Expand All @@ -42,6 +45,7 @@ export function removeMember(membership: MembershipType) {
},
});
}

export function fetchGroup(groupId: ID, { propagateError = true } = {}) {
return callAPI({
types: Group.FETCH,
Expand All @@ -53,6 +57,7 @@ export function fetchGroup(groupId: ID, { propagateError = true } = {}) {
propagateError,
});
}

export function fetchAll() {
return callAPI({
types: Group.FETCH,
Expand All @@ -64,7 +69,8 @@ export function fetchAll() {
propagateError: true,
});
}
export function fetchAllWithType(type: string) {

export function fetchAllWithType(type: GroupType) {
return callAPI({
types: Group.FETCH,
endpoint: `/groups/?type=${type}`,
Expand All @@ -75,6 +81,7 @@ export function fetchAllWithType(type: string) {
propagateError: true,
});
}

export function editGroup(group: Record<string, any>) {
return (dispatch: AppDispatch) =>
dispatch(
Expand Down Expand Up @@ -102,11 +109,8 @@ export function editGroup(group: Record<string, any>) {
: null
);
}
export function joinGroup(
groupId: number,
user: Record<string, any>,
role = 'member'
) {

export function joinGroup(groupId: ID, user: CurrentUser, role = 'member') {
return (dispatch: AppDispatch) =>
dispatch(
callAPI({
Expand All @@ -130,7 +134,8 @@ export function joinGroup(
return dispatch(fetchMemberships(groupId));
});
}
export function leaveGroup(membership: Record<string, any>, groupId: number) {

export function leaveGroup(membership: MembershipType, groupId: ID) {
return (dispatch: AppDispatch) => {
return dispatch(
callAPI({
Expand All @@ -150,7 +155,8 @@ export function leaveGroup(membership: Record<string, any>, groupId: number) {
});
};
}
export function fetchAllMemberships(groupId: number, descendants = false) {

export function fetchAllMemberships(groupId: ID, descendants = false) {
return (dispatch: AppDispatch) => {
return dispatch(
fetchMembershipsPagination({
Expand All @@ -164,8 +170,9 @@ export function fetchAllMemberships(groupId: number, descendants = false) {
);
};
}

export function fetchMemberships(
groupId: number,
groupId: ID,
descendants = false,
query: Record<string, any> = {}
) {
Expand All @@ -176,18 +183,19 @@ export function fetchMemberships(
query,
});
}

export function fetchMembershipsPagination({
groupId,
next,
descendants = false,
query = {},
}: {
groupId: number;
groupId: ID;
next: boolean;
descendants: boolean;
query?: Record<string, string | number | boolean>;
}) {
return callAPI({
return callAPI<MembershipType[]>({
types: Group.MEMBERSHIP_FETCH,
endpoint: `/groups/${groupId}/memberships/`,
schema: [membershipSchema],
Expand All @@ -202,6 +210,7 @@ export function fetchMembershipsPagination({
propagateError: true,
});
}

export function createGroup(group: Record<string, any>) {
return (dispatch: AppDispatch) => {
const { name, description, text, logo, type, showBadge, active } = group;
Expand Down Expand Up @@ -242,24 +251,3 @@ export function createGroup(group: Record<string, any>) {
});
};
}
export function removeGroup(id: string, group: Record<string, any>) {
return (dispatch: AppDispatch) =>
dispatch(
callAPI({
types: Group.REMOVE,
endpoint: `/groups/${id}/`,
method: 'DELETE',
meta: {
id,
errorMessage:
group.type === 'interesse'
? 'Sletting av interessegruppe feilet'
: 'Sletting av gruppe feilet',
successMessage:
group.type === 'interesse'
? 'Sletting av interessegruppe fullført'
: 'Sletting av gruppe fullført',
},
})
).then(() => dispatch(push('/interest-groups/')));
}
94 changes: 36 additions & 58 deletions app/actions/MeetingActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@ import moment from 'moment-timezone';
import { startSubmit, stopSubmit } from 'redux-form';
import callAPI from 'app/actions/callAPI';
import { meetingSchema } from 'app/reducers';
import createQueryString from 'app/utils/createQueryString';
import { Meeting } from './ActionTypes';
import type { UserEntity } from 'app/reducers/users';
import type { MeetingFormValues } from 'app/routes/meetings/components/MeetingEditor';
import type { RootState } from 'app/store/createRootReducer';
import type { AppDispatch } from 'app/store/createStore';
import type { ID } from 'app/store/models';
import type { DetailedMeeting, ListMeeting } from 'app/store/models/Meeting';
import type { MeetingInvitationStatus } from 'app/store/models/MeetingInvitation';
import type { GetState } from 'app/types';
import type { CurrentUser } from 'app/store/models/User';

export function fetchMeeting(meetingId: string) {
return callAPI<DetailedMeeting>({
Expand All @@ -25,74 +22,49 @@ export function fetchMeeting(meetingId: string) {
});
}

const getEndpoint = (
state: RootState,
loadNextPage: boolean | undefined,
queryString: string
) => {
const pagination = state.meetings.pagination;
export const getEndpoint = (
pagination: any,
queryString: string,
loadNextPage?: boolean
): string => {
let endpoint = `/meetings/${queryString}`;
const paginationObject = pagination[queryString];

if (
loadNextPage &&
paginationObject &&
paginationObject.queryString === queryString
paginationObject.queryString === queryString &&
paginationObject.nextPage
) {
endpoint = pagination[queryString].nextPage;
endpoint = paginationObject.nextPage;
}

return endpoint;
};

export function fetchAll({
dateAfter,
dateBefore,
ordering,
loadNextPage,
endpoint,
queryString,
}: {
dateAfter?: string;
dateBefore?: string;
ordering?: string;
refresh?: boolean;
loadNextPage?: boolean;
} = {}) {
return (dispatch: AppDispatch, getState: GetState) => {
const query: Record<string, string | undefined> = {
date_after: dateAfter,
date_before: dateBefore,
ordering,
};

if (dateBefore && dateAfter) {
query.page_size = '60';
}

const queryString = createQueryString(query);
const endpoint = getEndpoint(getState(), loadNextPage, queryString);

if (!endpoint) {
return Promise.resolve();
}

return dispatch(
callAPI<ListMeeting>({
types: Meeting.FETCH,
endpoint,
schema: [meetingSchema],
meta: {
queryString,
errorMessage: 'Henting av møter feilet',
},
propagateError: true,
})
);
};
endpoint: string;
queryString?: string;
}) {
return callAPI<ListMeeting[]>({
types: Meeting.FETCH,
endpoint,
schema: [meetingSchema],
meta: {
queryString,
errorMessage: 'Henting av møter feilet',
},
propagateError: true,
});
}

export function setInvitationStatus(
meetingId: number,
status: string,
user: UserEntity
meetingId: ID,
status: MeetingInvitationStatus,
user: CurrentUser
) {
return callAPI<{ status: MeetingInvitationStatus }>({
types: Meeting.SET_INVITATION_STATUS,
Expand All @@ -110,8 +82,9 @@ export function setInvitationStatus(
},
});
}
export function deleteMeeting(id: number) {
return callAPI<void>({

export function deleteMeeting(id: ID) {
return callAPI({
types: Meeting.DELETE,
endpoint: `/meetings/${id}/`,
method: 'DELETE',
Expand All @@ -121,6 +94,7 @@ export function deleteMeeting(id: number) {
},
});
}

export function createMeeting({
title,
report,
Expand Down Expand Up @@ -152,6 +126,7 @@ export function createMeeting({
},
});
}

export function inviteUsersAndGroups({
id,
users,
Expand Down Expand Up @@ -182,6 +157,7 @@ export function inviteUsersAndGroups({
},
});
}

export function answerMeetingInvitation(action: string, token: string) {
return (dispatch: AppDispatch) => {
dispatch(startSubmit('answerMeetingInvitation'));
Expand All @@ -203,6 +179,7 @@ export function answerMeetingInvitation(action: string, token: string) {
});
};
}

export function editMeeting({
title,
report,
Expand Down Expand Up @@ -236,6 +213,7 @@ export function editMeeting({
},
});
}

export function resetMeetingsToken() {
return {
type: Meeting.RESET_MEETINGS_TOKEN,
Expand Down
19 changes: 15 additions & 4 deletions app/components/Header/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ import moment from 'moment-timezone';
import { useEffect, useState } from 'react';
import { Modal } from 'react-overlays';
import { Link, NavLink, useHistory } from 'react-router-dom';
import { fetchAll as fetchMeetings } from 'app/actions/MeetingActions';
import {
fetchAll as fetchMeetings,
getEndpoint,
} from 'app/actions/MeetingActions';
import { toggleSearch } from 'app/actions/SearchActions';
import { logoutWithRedirect } from 'app/actions/UserActions';
import logoLightMode from 'app/assets/logo-dark.png';
Expand All @@ -15,6 +18,7 @@ import { selectCurrentUser, selectIsLoggedIn } from 'app/reducers/auth';
import { selectUpcomingMeetingId } from 'app/reducers/meetings';
import { useAppDispatch, useAppSelector } from 'app/store/hooks';
import utilStyles from 'app/styles/utilities.css';
import createQueryString from 'app/utils/createQueryString';
import { applySelectedTheme, getOSTheme, getTheme } from 'app/utils/themeUtils';
import Dropdown from '../Dropdown';
import NotificationsDropdown from '../HeaderNotifications';
Expand Down Expand Up @@ -78,19 +82,26 @@ const AccountDropdownItems = ({ onClose }: AccountDropdownItemsProps) => {
};

const UpcomingMeetingButton = () => {
const dispatch = useAppDispatch();
const upcomingMeetingId = useAppSelector(selectUpcomingMeetingId);
const history = useHistory();

const pagination = useAppSelector((state) => state.meetings.pagination);
const queryString = createQueryString({
date_after: moment().format('YYYY-MM-DD'),
});
const endpoint = getEndpoint(pagination, queryString);

const dispatch = useAppDispatch();

usePreparedEffect(
'fetchUpcomingMeeting',
() =>
dispatch(
fetchMeetings({
dateAfter: moment().format('YYYY-MM-DD'),
endpoint,
})
),
[]
[endpoint]
);

if (!upcomingMeetingId) return;
Expand Down

0 comments on commit 9080fc4

Please sign in to comment.