[questions][fix] fix search params loading wrongly

pull/468/head
Jeff Sieu 3 years ago
parent c42bb9c8e8
commit 7a2886f876

@ -118,7 +118,7 @@ export default function LandingComponent({
onClick={() => { onClick={() => {
if (company !== undefined && location !== undefined) { if (company !== undefined && location !== undefined) {
return handleLandingQuery({ return handleLandingQuery({
company: company.value, company: company.label,
location: location.value, location: location.value,
questionType, questionType,
}); });

@ -9,7 +9,6 @@ import { Button, SlideOut } from '@tih/ui';
import QuestionOverviewCard from '~/components/questions/card/question/QuestionOverviewCard'; import QuestionOverviewCard from '~/components/questions/card/question/QuestionOverviewCard';
import ContributeQuestionCard from '~/components/questions/ContributeQuestionCard'; import ContributeQuestionCard from '~/components/questions/ContributeQuestionCard';
import type { FilterOption } from '~/components/questions/filter/FilterSection';
import FilterSection from '~/components/questions/filter/FilterSection'; import FilterSection from '~/components/questions/filter/FilterSection';
import QuestionSearchBar from '~/components/questions/QuestionSearchBar'; import QuestionSearchBar from '~/components/questions/QuestionSearchBar';
import CompanyTypeahead from '~/components/questions/typeahead/CompanyTypeahead'; import CompanyTypeahead from '~/components/questions/typeahead/CompanyTypeahead';
@ -195,17 +194,17 @@ export default function QuestionsBrowsePage() {
const [loaded, setLoaded] = useState(false); const [loaded, setLoaded] = useState(false);
const [filterDrawerOpen, setFilterDrawerOpen] = useState(false); const [filterDrawerOpen, setFilterDrawerOpen] = useState(false);
const [selectedCompanyOptions, setSelectedCompanyOptions] = useState< // Const [selectedCompanyOptions, setSelectedCompanyOptions] = useState<
Array<FilterOption> // Array<FilterOption>
>([]); // >([]);
const [selectedRoleOptions, setSelectedRoleOptions] = useState< // const [selectedRoleOptions, setSelectedRoleOptions] = useState<
Array<FilterOption> // Array<FilterOption>
>([]); // >([]);
const [selectedLocationOptions, setSelectedLocationOptions] = useState< // const [selectedLocationOptions, setSelectedLocationOptions] = useState<
Array<FilterOption> // Array<FilterOption>
>([]); // >([]);
const questionTypeFilterOptions = useMemo(() => { const questionTypeFilterOptions = useMemo(() => {
return QUESTION_TYPES.map((questionType) => ({ return QUESTION_TYPES.map((questionType) => ({
@ -275,9 +274,37 @@ export default function QuestionsBrowsePage() {
sortType, sortType,
]); ]);
const selectedCompanyOptions = useMemo(() => {
return selectedCompanies.map((company) => ({
checked: true,
id: company,
label: company,
value: company,
}));
}, [selectedCompanies]);
const selectedRoleOptions = useMemo(() => {
return selectedRoles.map((role) => ({
checked: true,
id: role,
label: role,
value: role,
}));
}, [selectedRoles]);
const selectedLocationOptions = useMemo(() => {
return selectedLocations.map((location) => ({
checked: true,
id: location,
label: location,
value: location,
}));
}, [selectedLocations]);
if (!loaded) { if (!loaded) {
return null; return null;
} }
const filterSidebar = ( const filterSidebar = (
<div className="divide-y divide-slate-200 px-4"> <div className="divide-y divide-slate-200 px-4">
<Button <Button
@ -293,9 +320,9 @@ export default function QuestionsBrowsePage() {
setSelectedQuestionAge('all'); setSelectedQuestionAge('all');
setSelectedRoles([]); setSelectedRoles([]);
setSelectedLocations([]); setSelectedLocations([]);
setSelectedCompanyOptions([]); // SetSelectedCompanyOptions([]);
setSelectedRoleOptions([]); // setSelectedRoleOptions([]);
setSelectedLocationOptions([]); // setSelectedLocationOptions([]);
}} }}
/> />
<FilterSection <FilterSection
@ -306,8 +333,8 @@ export default function QuestionsBrowsePage() {
{...field} {...field}
clearOnSelect={true} clearOnSelect={true}
filterOption={(option) => { filterOption={(option) => {
return !selectedCompanyOptions.some((selectedOption) => { return !selectedCompanies.some((company) => {
return selectedOption.value === option.value; return company === option.value;
}); });
}} }}
isLabelHidden={true} isLabelHidden={true}
@ -323,19 +350,10 @@ export default function QuestionsBrowsePage() {
onOptionChange={(option) => { onOptionChange={(option) => {
if (option.checked) { if (option.checked) {
setSelectedCompanies([...selectedCompanies, option.label]); setSelectedCompanies([...selectedCompanies, option.label]);
setSelectedCompanyOptions((prevOptions) => [
...prevOptions,
{ ...option, checked: true },
]);
} else { } else {
setSelectedCompanies( setSelectedCompanies(
selectedCompanies.filter((company) => company !== option.label), selectedCompanies.filter((company) => company !== option.label),
); );
setSelectedCompanyOptions((prevOptions) =>
prevOptions.filter(
(prevOption) => prevOption.label !== option.label,
),
);
} }
}} }}
/> />
@ -347,8 +365,8 @@ export default function QuestionsBrowsePage() {
{...field} {...field}
clearOnSelect={true} clearOnSelect={true}
filterOption={(option) => { filterOption={(option) => {
return !selectedRoleOptions.some((selectedOption) => { return !selectedRoles.some((role) => {
return selectedOption.value === option.value; return role === option.value;
}); });
}} }}
isLabelHidden={true} isLabelHidden={true}
@ -364,19 +382,10 @@ export default function QuestionsBrowsePage() {
onOptionChange={(option) => { onOptionChange={(option) => {
if (option.checked) { if (option.checked) {
setSelectedRoles([...selectedRoles, option.value]); setSelectedRoles([...selectedRoles, option.value]);
setSelectedRoleOptions((prevOptions) => [
...prevOptions,
{ ...option, checked: true },
]);
} else { } else {
setSelectedRoles( setSelectedRoles(
selectedCompanies.filter((role) => role !== option.value), selectedCompanies.filter((role) => role !== option.value),
); );
setSelectedRoleOptions((prevOptions) =>
prevOptions.filter(
(prevOption) => prevOption.value !== option.value,
),
);
} }
}} }}
/> />
@ -413,8 +422,8 @@ export default function QuestionsBrowsePage() {
{...field} {...field}
clearOnSelect={true} clearOnSelect={true}
filterOption={(option) => { filterOption={(option) => {
return !selectedLocationOptions.some((selectedOption) => { return !selectedLocations.some((location) => {
return selectedOption.value === option.value; return location === option.value;
}); });
}} }}
isLabelHidden={true} isLabelHidden={true}
@ -430,19 +439,10 @@ export default function QuestionsBrowsePage() {
onOptionChange={(option) => { onOptionChange={(option) => {
if (option.checked) { if (option.checked) {
setSelectedLocations([...selectedLocations, option.value]); setSelectedLocations([...selectedLocations, option.value]);
setSelectedLocationOptions((prevOptions) => [
...prevOptions,
{ ...option, checked: true },
]);
} else { } else {
setSelectedLocations( setSelectedLocations(
selectedLocations.filter((role) => role !== option.value), selectedLocations.filter((role) => role !== option.value),
); );
setSelectedLocationOptions((prevOptions) =>
prevOptions.filter(
(prevOption) => prevOption.value !== option.value,
),
);
} }
}} }}
/> />

@ -25,7 +25,7 @@ export const useSearchParam = <Value = string>(
const [isInitialized, setIsInitialized] = useState(false); const [isInitialized, setIsInitialized] = useState(false);
const router = useRouter(); const router = useRouter();
const [filters, setFilters] = useState<Array<Value>>(defaultValues || []); const [params, setParams] = useState<Array<Value>>(defaultValues || []);
useEffect(() => { useEffect(() => {
if (router.isReady && !isInitialized) { if (router.isReady && !isInitialized) {
@ -33,7 +33,7 @@ export const useSearchParam = <Value = string>(
const query = router.query[name]; const query = router.query[name];
if (query) { if (query) {
const queryValues = Array.isArray(query) ? query : [query]; const queryValues = Array.isArray(query) ? query : [query];
setFilters( setParams(
queryValues queryValues
.map(stringToParam) .map(stringToParam)
.filter((value) => value !== null) as Array<Value>, .filter((value) => value !== null) as Array<Value>,
@ -43,27 +43,27 @@ export const useSearchParam = <Value = string>(
const localStorageValue = localStorage.getItem(name); const localStorageValue = localStorage.getItem(name);
if (localStorageValue !== null) { if (localStorageValue !== null) {
const loadedFilters = JSON.parse(localStorageValue); const loadedFilters = JSON.parse(localStorageValue);
setFilters(loadedFilters); setParams(loadedFilters);
} }
} }
setIsInitialized(true); setIsInitialized(true);
} }
}, [isInitialized, name, stringToParam, router]); }, [isInitialized, name, stringToParam, router]);
const setFiltersCallback = useCallback( const setParamsCallback = useCallback(
(newFilters: Array<Value>) => { (newParams: Array<Value>) => {
setFilters(newFilters); setParams(newParams);
localStorage.setItem( localStorage.setItem(
name, name,
JSON.stringify( JSON.stringify(
newFilters.map(valueToQueryParam).filter((param) => param !== null), newParams.map(valueToQueryParam).filter((param) => param !== null),
), ),
); );
}, },
[name, valueToQueryParam], [name, valueToQueryParam],
); );
return [filters, setFiltersCallback, isInitialized] as const; return [params, setParamsCallback, isInitialized] as const;
}; };
export const useSearchParamSingle = <Value = string>( export const useSearchParamSingle = <Value = string>(
@ -73,14 +73,14 @@ export const useSearchParamSingle = <Value = string>(
}, },
) => { ) => {
const { defaultValue, ...restOpts } = opts ?? {}; const { defaultValue, ...restOpts } = opts ?? {};
const [filters, setFilters, isInitialized] = useSearchParam<Value>(name, { const [params, setParams, isInitialized] = useSearchParam<Value>(name, {
defaultValues: defaultValue !== undefined ? [defaultValue] : undefined, defaultValues: defaultValue !== undefined ? [defaultValue] : undefined,
...restOpts, ...restOpts,
} as SearchParamOptions<Value>); } as SearchParamOptions<Value>);
return [ return [
filters[0], params[0],
(value: Value) => setFilters([value]), (value: Value) => setParams([value]),
isInitialized, isInitialized,
] as const; ] as const;
}; };

Loading…
Cancel
Save