Commit 0518ca87 authored by Alex Segers's avatar Alex Segers

[AFP-135] 🐛 Fix search bar (@asegers)

parent 4c3e5daf
...@@ -11,22 +11,22 @@ enum ResStatus { ...@@ -11,22 +11,22 @@ enum ResStatus {
} }
const initialConstraints: OrdersRequestBody = { const initialConstraints: OrdersRequestBody = {
pagination: { page: 0, size: 15}, pagination: { page: 0, size: 1000},
date: { start: null, end: null, filter: null }, date: { start: null, end: null, filter: null },
search: { by: 'orderTrackingCode', query: "" }, search: { by: 'customerEmailAddress', query: "" },
status: { received: false, fulfilled: false, cancelled: false } status: { received: false, fulfilled: false, cancelled: false }
} }
const useOrders = (args : OrdersRequestBody = initialConstraints) => { const useOrders = (args : OrdersRequestBody = initialConstraints) => {
const [status, setStatus] = useState<ResStatus>(ResStatus.IDLE); const [status, setStatus] = useState<ResStatus>(ResStatus.IDLE);
const [dataMap, setDataMap] = useState<{string: Order} | {}>({}); const [dataMap, setDataMap] = useState<{string: Order} | {}>({});
const [dataArr, setDataArr] = useState<Order[] | []>([]);
const [error, setError] = useState(null); const [error, setError] = useState(null);
const [pagFilters, setPagFilters] = useState(args.pagination) const [pagFilters, setPagFilters] = useState(args.pagination)
const [dateFilters, setDateFilters] = useState(args.date) const [dateFilters, setDateFilters] = useState(args.date)
const [searchFilters, setSearchFilters] = useState(args.search) const [searchFilters, setSearchFilters] = useState(args.search)
const [statusFilters, setStatusFilters] = useState(args.status) const [statusFilters, setStatusFilters] = useState(args.status)
// const [wipeData, setWipeData] = useState(false)
const buildDataMap = (ordersArr: Order[]) => { const buildDataMap = (ordersArr: Order[]) => {
const newDataMap: any = {} const newDataMap: any = {}
...@@ -35,18 +35,28 @@ const useOrders = (args : OrdersRequestBody = initialConstraints) => { ...@@ -35,18 +35,28 @@ const useOrders = (args : OrdersRequestBody = initialConstraints) => {
return newDataMap return newDataMap
} }
const fetchOrders = async (requestBody: OrdersRequestBody) => { const fetchOrders = async (requestBody: OrdersRequestBody) => {
setStatus(ResStatus.FETCHING); setStatus(ResStatus.FETCHING);
try { try {
const ordersData: Order[] = await OrderService.orders(requestBody) const ordersData: Order[] = await OrderService.orders(requestBody)
setDataMap(prevData => ({ ...prevData, ...buildDataMap(ordersData) })); // if (wipeData) {
setDataArr(ordersData);
// setWipeData(false)
// } else {
// setDataArr(prevDataArr => [...prevDataArr, ...ordersData]);
// }
// setDataMap(prevData => ({ ...prevData, ...buildDataMap(ordersData) }));
setStatus(ResStatus.SUCCESS) setStatus(ResStatus.SUCCESS)
} catch (err) { } catch (err) {
setError(err) setError(err)
setStatus(ResStatus.ERROR); setStatus(ResStatus.ERROR);
} }
}; };
// useEffect(() => {
// setPagFilters((prev: any) => ({...prev, page: 0}))
// }, [ statusFilters.status, searchFilters.by, dateFilters.end, dateFilters.start, searchFilters.query ])
useEffect(() => { useEffect(() => {
fetchOrders({ fetchOrders({
pagination: pagFilters, pagination: pagFilters,
...@@ -56,15 +66,17 @@ const useOrders = (args : OrdersRequestBody = initialConstraints) => { ...@@ -56,15 +66,17 @@ const useOrders = (args : OrdersRequestBody = initialConstraints) => {
}); });
}, [ pagFilters, dateFilters, searchFilters, statusFilters ]); }, [ pagFilters, dateFilters, searchFilters, statusFilters ]);
// const orders: Order[] = useMemo(() => {
// return Object.values(dataMap).sort((o1, o2) => o2.orderUpdatedAt - o1.orderUpdatedAt)
// }, [dataMap])
const orders: Order[] = useMemo(() => { const sortedOrders: Order[] = useMemo(() => {
return Object.values(dataMap).sort((o1, o2) => o2.orderUpdatedAt - o1.orderUpdatedAt) return dataArr.sort((o1, o2) => o2.orderUpdatedAt - o1.orderUpdatedAt)
}, [dataMap]) }, [dataArr])
return { return {
status, status,
orders, orders: sortedOrders,
error, error,
fetchOrders, fetchOrders,
ResStatus, ResStatus,
......
...@@ -16,10 +16,11 @@ const OrderSearchBar = ({ searchFilters, setSearchFilters, status, STATUSES } : ...@@ -16,10 +16,11 @@ const OrderSearchBar = ({ searchFilters, setSearchFilters, status, STATUSES } :
const handleInputChange = (e: any) => { const handleInputChange = (e: any) => {
const { currentTarget: { value } } = e const { currentTarget: { value } } = e
const trimmedValue = value.trim().toLowerCase() console.log(value)
if (trimmedValue.length) { // const trimmedValue = value.toLowerCase()
setSearchFilters({by: searchBy, query: trimmedValue }); // if (trimmedValue.length) {
} setSearchFilters({by: searchBy, query: value.toLowerCase() });
// }
setSearchQuery(value) setSearchQuery(value)
} }
...@@ -42,12 +43,10 @@ const OrderSearchBar = ({ searchFilters, setSearchFilters, status, STATUSES } : ...@@ -42,12 +43,10 @@ const OrderSearchBar = ({ searchFilters, setSearchFilters, status, STATUSES } :
// variant="filled" // variant="filled"
// focusBorderColor="telegram.400" // focusBorderColor="telegram.400"
value={searchQuery} value={searchQuery}
onChange={handleInputChange} onChange={handleInputChange}
onKeyDown={handleInputChange}
/> />
<InputRightElement children={<CheckIcon color="green.500" />} />
</InputGroup> </InputGroup>
<Select maxWidth="10rem" defaultValue="id" onChange={handleSelectChange}> <Select maxWidth="10rem" defaultValue="customerEmailAddress" onChange={handleSelectChange}>
<option value="id">Order #</option> <option value="id">Order #</option>
<option value="customerEmailAddress">Email</option> <option value="customerEmailAddress">Email</option>
<option value="orderTrackingCode">Tracking #</option> <option value="orderTrackingCode">Tracking #</option>
......
...@@ -9,7 +9,7 @@ import { ...@@ -9,7 +9,7 @@ import {
Tag, Tag,
VisuallyHidden VisuallyHidden
} from '@chakra-ui/react' } from '@chakra-ui/react'
// import { ChevronDownIcon } from '@chakra-ui/icons' import { Link } from 'react-router-dom'
import moment from 'moment' import moment from 'moment'
import { Order } from 'Order'; import { Order } from 'Order';
...@@ -26,11 +26,9 @@ const OrderRow = ({ ...@@ -26,11 +26,9 @@ const OrderRow = ({
orderItems orderItems
} }
}: { order: Order }) => { }: { order: Order }) => {
// const parseDate = (unixDate: number) => new Date(unixDate).toLocaleDateString()
return ( return (
<Tr> <Tr>
<Td fontSize="sm" fontWeight="semibold">{id}</Td> <Td fontSize="sm" fontWeight="semibold"><Link to={`/orders/${id}`}>{id}</Link></Td>
<Td><Tag colorScheme={tagColorMap.get(orderStatus)}>{orderStatus}</Tag></Td> <Td><Tag colorScheme={tagColorMap.get(orderStatus)}>{orderStatus}</Tag></Td>
<Td fontSize="sm" paddingX={10}>{orderItems.length} item{orderItems.length > 1 && "s"}</Td> <Td fontSize="sm" paddingX={10}>{orderItems.length} item{orderItems.length > 1 && "s"}</Td>
<Td fontSize="sm">{customerEmailAddress}</Td> <Td fontSize="sm">{customerEmailAddress}</Td>
...@@ -59,26 +57,26 @@ const OrdersPage = () => { ...@@ -59,26 +57,26 @@ const OrdersPage = () => {
const $loader = useRef<any>(); const $loader = useRef<any>();
const handleObserver = (entities: any) => { // const handleObserver = (entities: any) => {
const target = entities[0]; // const target = entities[0];
if (target.isIntersecting && !isLoading) { // if (target.isIntersecting && !isLoading) {
setPagFilters((prev: any) => ({...prev, page: prev.page + 1})) // setPagFilters((prev: any) => ({...prev, page: prev.page + 1}))
} // }
} // }
useEffect(() => { // useEffect(() => {
var options = { // var options = {
root: null, // root: null,
rootMargin: "20px", // rootMargin: "20px",
threshold: 1.0 // threshold: 1.0
}; // };
// initialize IntersectionObserver // // initialize IntersectionObserver
// and attaching to Load More div // // and attaching to Load More div
const observer = new IntersectionObserver(handleObserver, options); // const observer = new IntersectionObserver(handleObserver, options);
if ($loader.current) { // if ($loader.current) {
observer.observe($loader.current) // observer.observe($loader.current)
} // }
}, []); // }, []);
return ( return (
<div> <div>
......
...@@ -17,8 +17,8 @@ export const orderById = (apiUrl: string) => { ...@@ -17,8 +17,8 @@ export const orderById = (apiUrl: string) => {
export const orders = async (body: OrdersRequestBody): Promise<Order[]> => { export const orders = async (body: OrdersRequestBody): Promise<Order[]> => {
try { try {
await sleep(1200)
const response = await Axios.post(`${BASE_PATH}/filtered`, body) const response = await Axios.post(`${BASE_PATH}/filtered`, body)
await sleep(400)
return response.data; return response.data;
} catch (error) { } catch (error) {
error as AxiosError; error as AxiosError;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment