parent
46f69414a1
commit
fa9b98ec60
@ -1,21 +1,71 @@
|
||||
import { LOCATIONS } from '~/utils/questions/constants';
|
||||
import { useMemo, useState } from 'react';
|
||||
import type { TypeaheadOption } from '@tih/ui';
|
||||
|
||||
import { trpc } from '~/utils/trpc';
|
||||
|
||||
import type { ExpandedTypeaheadProps } from './ExpandedTypeahead';
|
||||
import ExpandedTypeahead from './ExpandedTypeahead';
|
||||
|
||||
import type { Location } from '~/types/questions';
|
||||
|
||||
export type LocationTypeaheadProps = Omit<
|
||||
ExpandedTypeaheadProps,
|
||||
'label' | 'onQueryChange' | 'options'
|
||||
>;
|
||||
'label' | 'onQueryChange' | 'onSelect' | 'onSuggestionClick' | 'options'
|
||||
> & {
|
||||
onSelect: (option: Location & TypeaheadOption) => void;
|
||||
onSuggestionClick?: (option: Location) => void;
|
||||
};
|
||||
|
||||
export default function LocationTypeahead({
|
||||
onSelect,
|
||||
onSuggestionClick,
|
||||
...restProps
|
||||
}: LocationTypeaheadProps) {
|
||||
const [query, setQuery] = useState('');
|
||||
|
||||
const { data: locations } = trpc.useQuery([
|
||||
'locations.cities.list',
|
||||
{
|
||||
name: query,
|
||||
},
|
||||
]);
|
||||
|
||||
const locationOptions = useMemo(() => {
|
||||
return (
|
||||
locations?.map(({ id, name, state }) => ({
|
||||
cityId: id,
|
||||
countryId: state.country.id,
|
||||
id,
|
||||
label: `${name}, ${state.name}, ${state.country.name}`,
|
||||
stateId: state.id,
|
||||
value: id,
|
||||
})) ?? []
|
||||
);
|
||||
}, [locations]);
|
||||
|
||||
export default function LocationTypeahead(props: LocationTypeaheadProps) {
|
||||
return (
|
||||
<ExpandedTypeahead
|
||||
{...(props as ExpandedTypeaheadProps)}
|
||||
{...({
|
||||
onSuggestionClick: onSuggestionClick
|
||||
? (option: TypeaheadOption) => {
|
||||
const location = locationOptions.find(
|
||||
(locationOption) => locationOption.id === option.id,
|
||||
)!;
|
||||
onSuggestionClick({
|
||||
...location,
|
||||
...option,
|
||||
});
|
||||
}
|
||||
: undefined,
|
||||
...restProps,
|
||||
} as ExpandedTypeaheadProps)}
|
||||
label="Location"
|
||||
options={LOCATIONS}
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
||||
onQueryChange={() => {}}
|
||||
options={locationOptions}
|
||||
onQueryChange={setQuery}
|
||||
onSelect={({ id }: TypeaheadOption) => {
|
||||
const location = locationOptions.find((option) => option.id === id)!;
|
||||
onSelect(location);
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
@ -1,7 +1,31 @@
|
||||
import type { FilterChoice } from '~/components/questions/filter/FilterSection';
|
||||
|
||||
import { LOCATIONS } from './constants';
|
||||
import { trpc } from '../trpc';
|
||||
|
||||
export default function useDefaultLocation(): FilterChoice | undefined {
|
||||
return LOCATIONS[0];
|
||||
import type { Location } from '~/types/questions';
|
||||
|
||||
export default function useDefaultLocation():
|
||||
| (FilterChoice & Location)
|
||||
| undefined {
|
||||
const { data: locations } = trpc.useQuery([
|
||||
'locations.cities.list',
|
||||
{
|
||||
name: 'singapore',
|
||||
},
|
||||
]);
|
||||
|
||||
if (locations === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const { id, name, state } = locations[0];
|
||||
|
||||
return {
|
||||
cityId: id,
|
||||
countryId: state.country.id,
|
||||
id,
|
||||
label: `${name}, ${state.name}, ${state.country.name}`,
|
||||
stateId: state.id,
|
||||
value: id,
|
||||
};
|
||||
}
|
||||
|
Loading…
Reference in new issue