|
| 1 | +import { useState, useEffect } from "react" |
| 2 | +import { useLocation, useNavigate } from "react-router-dom" |
| 3 | + |
| 4 | +export const usePostsQueryState = () => { |
| 5 | + const navigate = useNavigate() |
| 6 | + const location = useLocation() |
| 7 | + const queryParams = new URLSearchParams(location.search) |
| 8 | + |
| 9 | + const [skip, setSkip] = useState(parseInt(queryParams.get("skip") || "0")) |
| 10 | + const [limit, setLimit] = useState(parseInt(queryParams.get("limit") || "10")) |
| 11 | + const [sortBy, setSortBy] = useState(queryParams.get("sortBy") || "") |
| 12 | + const [sortOrder, setSortOrder] = useState(queryParams.get("sortOrder") || "asc") |
| 13 | + const [searchQuery, setSearchQuery] = useState(queryParams.get("search") || "") |
| 14 | + const [selectedTag, setSelectedTag] = useState(queryParams.get("tag") || "") |
| 15 | + |
| 16 | + useEffect(() => { |
| 17 | + const params = new URLSearchParams() |
| 18 | + if (skip) params.set("skip", skip.toString()) |
| 19 | + if (limit) params.set("limit", limit.toString()) |
| 20 | + if (searchQuery) params.set("search", searchQuery) |
| 21 | + if (sortBy) params.set("sortBy", sortBy) |
| 22 | + if (sortOrder) params.set("sortOrder", sortOrder) |
| 23 | + if (selectedTag) params.set("tag", selectedTag) |
| 24 | + navigate(`?${params.toString()}`) |
| 25 | + }, [skip, limit, searchQuery, sortBy, sortOrder, selectedTag, navigate]) |
| 26 | + |
| 27 | + useEffect(() => { |
| 28 | + const params = new URLSearchParams(location.search) |
| 29 | + setSkip(parseInt(params.get("skip") || "0")) |
| 30 | + setLimit(parseInt(params.get("limit") || "10")) |
| 31 | + setSearchQuery(params.get("search") || "") |
| 32 | + setSortBy(params.get("sortBy") || "") |
| 33 | + setSortOrder(params.get("sortOrder") || "asc") |
| 34 | + setSelectedTag(params.get("tag") || "") |
| 35 | + }, [location.search]) |
| 36 | + |
| 37 | + return { |
| 38 | + skip, |
| 39 | + setSkip, |
| 40 | + limit, |
| 41 | + setLimit, |
| 42 | + sortBy, |
| 43 | + setSortBy, |
| 44 | + sortOrder, |
| 45 | + setSortOrder, |
| 46 | + searchQuery, |
| 47 | + setSearchQuery, |
| 48 | + selectedTag, |
| 49 | + setSelectedTag, |
| 50 | + } |
| 51 | +} |
0 commit comments