Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 6d52272

Browse files
committed
Added userHandle to URL query.
1 parent c05a8ef commit 6d52272

File tree

15 files changed

+289
-264
lines changed

15 files changed

+289
-264
lines changed

src/components/SearchHandleField/index.jsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ const noOptionsMessage = () => "No suggestions";
2424
* @param {string} props.name name for input element
2525
* @param {'medium'|'small'} [props.size] field size
2626
* @param {function} props.onChange function called when input value changes
27+
* @param {function} [props.onInputChange] function called when input value changes
28+
* @param {function} [props.onBlur] function called when input is blurred
29+
* @param {function} [props.onMenuClose] function called when option list is closed
2730
* @param {string} props.value input value
2831
* @returns {JSX.Element}
2932
*/
@@ -33,6 +36,9 @@ const SearchHandleField = ({
3336
name,
3437
size = "medium",
3538
onChange,
39+
onInputChange,
40+
onBlur,
41+
onMenuClose,
3642
placeholder,
3743
value,
3844
}) => {
@@ -47,13 +53,13 @@ const SearchHandleField = ({
4753
[onChange]
4854
);
4955

50-
const onInputChange = useCallback(
56+
const onInputValueChange = useCallback(
5157
(value, { action }) => {
5258
if (action === "input-change") {
53-
onChange(value);
59+
onInputChange(value);
5460
}
5561
},
56-
[onChange]
62+
[onInputChange]
5763
);
5864

5965
return (
@@ -71,7 +77,9 @@ const SearchHandleField = ({
7177
value={null}
7278
inputValue={value}
7379
onChange={onValueChange}
74-
onInputChange={onInputChange}
80+
onInputChange={onInputValueChange}
81+
onBlur={onBlur}
82+
onMenuClose={onMenuClose}
7583
openMenuOnClick={false}
7684
placeholder={placeholder}
7785
noOptionsMessage={noOptionsMessage}
@@ -108,6 +116,9 @@ SearchHandleField.propTypes = {
108116
size: PT.oneOf(["medium", "small"]),
109117
name: PT.string.isRequired,
110118
onChange: PT.func.isRequired,
119+
onInputChange: PT.func,
120+
onBlur: PT.func,
121+
onMenuClose: PT.func,
111122
placeholder: PT.string,
112123
value: PT.oneOfType([PT.number, PT.string]),
113124
};

src/constants/workPeriods.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ export const API_CHALLENGE_PAYMENT_STATUS_MAP = {
9898
scheduled: PAYMENT_STATUS.SCHEDULED,
9999
};
100100

101+
export const URL_QUERY_PARAM_MAP = new Map([
102+
["startDate", "startDate"],
103+
["paymentStatuses", "status"],
104+
["userHandle", "user"],
105+
["criteria", "by"],
106+
["order", "order"],
107+
["pageSize", "perPage"],
108+
["pageNumber", "page"],
109+
]);
110+
101111
export const JOB_NAME_LOADING = "Loading...";
102112
export const JOB_NAME_NONE = "<Job is not assigned>";
103113
export const JOB_NAME_ERROR = "<Error loading job>";

src/root.component.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default function Root() {
1919

2020
return (
2121
<Provider store={store}>
22-
<Router primary={false}>
22+
<Router>
2323
<Redirect from={APP_BASE_PATH} to={WORK_PERIODS_PATH} exact noThrow />
2424
<WorkPeriods path={WORK_PERIODS_PATH} />
2525
<Freelancers path={FREELANCERS_PATH} />

src/routes/WorkPeriods/components/PeriodFilters/index.jsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import {
1414
setWorkPeriodsPaymentStatuses,
1515
setWorkPeriodsUserHandle,
1616
} from "store/actions/workPeriods";
17-
import { loadWorkPeriodsPage as loadWorkingPeriodsPage } from "store/thunks/workPeriods";
17+
import {
18+
loadWorkPeriodsPage,
19+
updateQueryFromState,
20+
} from "store/thunks/workPeriods";
1821
import { useUpdateEffect } from "utils/hooks";
1922
import styles from "./styles.module.scss";
2023

@@ -34,25 +37,39 @@ const PeriodFilters = ({ className }) => {
3437
const onUserHandleChange = useCallback(
3538
(value) => {
3639
dispatch(setWorkPeriodsUserHandle(value));
40+
dispatch(updateQueryFromState());
3741
},
3842
[dispatch]
3943
);
4044

45+
const onUserHandleInputChange = useCallback(
46+
(value) => {
47+
dispatch(setWorkPeriodsUserHandle(value));
48+
},
49+
[dispatch]
50+
);
51+
52+
const updateUrlQuery = useCallback(() => {
53+
dispatch(updateQueryFromState());
54+
}, [dispatch]);
55+
4156
const onPaymentStatusesChange = useCallback(
4257
(statuses) => {
4358
dispatch(setWorkPeriodsPaymentStatuses(statuses));
59+
dispatch(updateQueryFromState());
4460
},
4561
[dispatch]
4662
);
4763

4864
const onClearFilter = useCallback(() => {
4965
dispatch(resetWorkPeriodsFilters());
66+
dispatch(updateQueryFromState());
5067
}, [dispatch]);
5168

5269
const loadWorkingPeriodsFirstPage = useCallback(
5370
debounce(
5471
() => {
55-
dispatch(loadWorkingPeriodsPage(1));
72+
dispatch(loadWorkPeriodsPage);
5673
},
5774
300,
5875
{ leading: false }
@@ -71,6 +88,9 @@ const PeriodFilters = ({ className }) => {
7188
name="topcoder_handle"
7289
placeholder="Search Topcoder Handle"
7390
onChange={onUserHandleChange}
91+
onInputChange={onUserHandleInputChange}
92+
onBlur={updateUrlQuery}
93+
// onMenuClose={updateUrlQuery}
7494
value={userHandle}
7595
/>
7696
</div>

src/routes/WorkPeriods/components/PeriodListHead/index.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
setWorkPeriodsSorting,
1313
toggleWorkingPeriodsVisible,
1414
} from "store/actions/workPeriods";
15+
import { updateQueryFromState } from "store/thunks/workPeriods";
1516
import styles from "./styles.module.scss";
1617

1718
/**
@@ -29,6 +30,7 @@ const PeriodListHead = () => {
2930
const onSortingChange = useCallback(
3031
(sorting) => {
3132
dispatch(setWorkPeriodsSorting(sorting));
33+
dispatch(updateQueryFromState());
3234
},
3335
[dispatch]
3436
);

src/routes/WorkPeriods/components/PeriodWeekPicker/index.jsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import moment from "moment";
66
import WeekPicker from "components/WeekPicker";
77
import { getWorkPeriodsDateRange } from "store/selectors/workPeriods";
88
import { setWorkPeriodsDateRange } from "store/actions/workPeriods";
9+
import { updateQueryFromState } from "store/thunks/workPeriods";
910
import styles from "./styles.module.scss";
1011

1112
/**
@@ -22,16 +23,19 @@ const PeriodWeekPicker = ({ className }) => {
2223
const onWeekSelect = useCallback(
2324
(date) => {
2425
dispatch(setWorkPeriodsDateRange(moment(date)));
26+
dispatch(updateQueryFromState());
2527
},
2628
[dispatch]
2729
);
2830

2931
const onNextWeekSelect = useCallback(() => {
3032
dispatch(setWorkPeriodsDateRange(startDate.clone().add(1, "week")));
33+
dispatch(updateQueryFromState());
3134
}, [startDate, dispatch]);
3235

3336
const onPreviousWeekSelect = useCallback(() => {
3437
dispatch(setWorkPeriodsDateRange(startDate.clone().add(-1, "week")));
38+
dispatch(updateQueryFromState());
3539
}, [startDate, dispatch]);
3640

3741
return (

src/routes/WorkPeriods/components/Periods/index.jsx

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, { useEffect } from "react";
22
import { useSelector, useDispatch } from "react-redux";
3+
import { globalHistory } from "@reach/router";
34
import ContentMessage from "components/ContentMessage";
45
import PeriodList from "../PeriodList";
56
import {
@@ -8,8 +9,8 @@ import {
89
getWorkPeriodsPagination,
910
getWorkPeriodsSorting,
1011
} from "store/selectors/workPeriods";
12+
import { updateStateFromQuery } from "store/actions/workPeriods";
1113
import { loadWorkPeriodsPage } from "store/thunks/workPeriods";
12-
import { useUpdateEffect } from "utils/hooks";
1314

1415
/**
1516
* Displays working periods' list or a "Loading..." message or an error message.
@@ -23,20 +24,18 @@ const Periods = () => {
2324
const isLoading = useSelector(getWorkPeriodsIsLoading);
2425
const dispatch = useDispatch();
2526

26-
// Load working periods' page once the page is loaded.
27+
// Load working periods' page only if page number, page size or sorting changes.
2728
useEffect(() => {
28-
dispatch(loadWorkPeriodsPage());
29-
}, [dispatch]);
30-
31-
// Load working periods' first page only if page size or sorting changes.
32-
useUpdateEffect(() => {
33-
dispatch(loadWorkPeriodsPage(1));
34-
}, [dispatch, pagination.pageSize, sorting]);
29+
dispatch(loadWorkPeriodsPage);
30+
}, [dispatch, pagination.pageNumber, pagination.pageSize, sorting]);
3531

36-
// Load working periods' new page if page number changes.
37-
useUpdateEffect(() => {
38-
dispatch(loadWorkPeriodsPage());
39-
}, [dispatch, pagination.pageNumber]);
32+
useEffect(() => {
33+
return globalHistory.listen(({ action, location }) => {
34+
if (action === "POP") {
35+
dispatch(updateStateFromQuery(location.search));
36+
}
37+
});
38+
}, [dispatch]);
4039

4140
return (
4241
<>

src/routes/WorkPeriods/components/PeriodsPagination/index.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
setWorkPeriodsPageNumber,
99
setWorkPeriodsPageSize,
1010
} from "store/actions/workPeriods";
11+
import { updateQueryFromState } from "store/thunks/workPeriods";
1112
import styles from "./styles.module.scss";
1213

1314
/**
@@ -25,13 +26,15 @@ const PeriodsPagination = ({ className, id }) => {
2526
const onPageNumberClick = useCallback(
2627
(pageNumber) => {
2728
dispatch(setWorkPeriodsPageNumber(+pageNumber));
29+
dispatch(updateQueryFromState());
2830
},
2931
[dispatch]
3032
);
3133

3234
const onPageSizeChange = useCallback(
3335
(pageSize) => {
3436
dispatch(setWorkPeriodsPageSize(+pageSize));
37+
dispatch(updateQueryFromState());
3538
},
3639
[dispatch]
3740
);

src/routes/WorkPeriods/components/PeriodsUrl/index.jsx

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/routes/WorkPeriods/index.jsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import PeriodsContentHeader from "./components/PeriodsContentHeader";
88
import PeriodFilters from "./components/PeriodFilters";
99
import Periods from "./components/Periods";
1010
import PeriodCount from "./components/PeriodCount";
11-
import PeriodsUrl from "./components/PeriodsUrl";
1211
import PeriodsPagination from "./components/PeriodsPagination";
1312
import PeriodsSelectionMessage from "./components/PeriodsSelectionMessage";
1413
import PeriodWeekPicker from "./components/PeriodWeekPicker";
@@ -46,7 +45,6 @@ const WorkPeriods = () => (
4645
</div>
4746
</ContentBlock>
4847
</Content>
49-
<PeriodsUrl />
5048
</Page>
5149
);
5250

src/store/actions/workPeriods.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@ let nextErrorId = 1;
77
* Creates an action denoting the start of loading specific challenge page.
88
*
99
* @param {Object} cancelSource object that can be used to cancel network request
10-
* @param {number} pageNumber the requested challenge page number
1110
* @returns {Object}
1211
*/
13-
export const loadWorkPeriodsPagePending = (cancelSource, pageNumber) => ({
12+
export const loadWorkPeriodsPagePending = (cancelSource) => ({
1413
type: ACTION_TYPE.WP_LOAD_PAGE_PENDING,
15-
payload: { cancelSource, pageNumber },
14+
payload: cancelSource,
1615
});
1716

1817
/**

0 commit comments

Comments
 (0)