Declarative routing for React Native applications with native-specific components and deep linking support
—
Enhanced URLSearchParams functionality adapted for React Native applications with mobile-optimized parameter handling and React hooks integration.
A convenient wrapper for accessing and modifying individual query parameters via the URLSearchParams interface. Provides React state integration for URL search parameters.
/**
* Hook for managing URL search parameters with React state integration
* Provides current search params and setter function
* @param defaultInit - Default parameters to merge when not present in URL
* @returns Tuple of [searchParams, setSearchParams]
*/
function useSearchParams(
defaultInit?: URLSearchParamsInit
): [URLSearchParams, SetURLSearchParams];
type SetURLSearchParams = (
nextInit?:
| URLSearchParamsInit
| ((prev: URLSearchParams) => URLSearchParamsInit),
navigateOpts?: NavigateOptions
) => void;Usage Examples:
import { useSearchParams } from "react-router-native";
import { View, Text, TextInput, TouchableOpacity } from "react-native";
import { useState } from "react";
// Basic search params usage
function SearchScreen() {
const [searchParams, setSearchParams] = useSearchParams();
const [query, setQuery] = useState(searchParams.get("q") || "");
const handleSearch = () => {
setSearchParams({ q: query });
};
return (
<View>
<Text>Current search: {searchParams.get("q") || "None"}</Text>
<TextInput
value={query}
onChangeText={setQuery}
placeholder="Search..."
/>
<TouchableOpacity onPress={handleSearch}>
<Text>Search</Text>
</TouchableOpacity>
</View>
);
}
// With default parameters
function FilteredList() {
const [searchParams, setSearchParams] = useSearchParams({
sort: "name",
page: "1"
});
const currentSort = searchParams.get("sort");
const currentPage = searchParams.get("page");
const updateSort = (newSort) => {
setSearchParams(prev => {
prev.set("sort", newSort);
prev.set("page", "1"); // Reset to first page
return prev;
});
};
return (
<View>
<Text>Sort: {currentSort}, Page: {currentPage}</Text>
<TouchableOpacity onPress={() => updateSort("date")}>
<Text>Sort by Date</Text>
</TouchableOpacity>
</View>
);
}
// Functional updates
function AdvancedFilters() {
const [searchParams, setSearchParams] = useSearchParams();
const addFilter = (key, value) => {
setSearchParams(prev => {
const newParams = new URLSearchParams(prev);
newParams.append(key, value);
return newParams;
});
};
const removeFilter = (key) => {
setSearchParams(prev => {
const newParams = new URLSearchParams(prev);
newParams.delete(key);
return newParams;
});
};
return (
<View>
<Text>Active filters: {searchParams.toString()}</Text>
<TouchableOpacity onPress={() => addFilter("category", "electronics")}>
<Text>Add Electronics Filter</Text>
</TouchableOpacity>
<TouchableOpacity onPress={() => removeFilter("category")}>
<Text>Remove Category Filter</Text>
</TouchableOpacity>
</View>
);
}
// With navigation options
function PaginatedList() {
const [searchParams, setSearchParams] = useSearchParams({ page: "1" });
const goToPage = (pageNum) => {
setSearchParams(
{ page: pageNum.toString() },
{ replace: true } // Replace instead of push to avoid back button issues
);
};
return (
<View>
<Text>Current page: {searchParams.get("page")}</Text>
<TouchableOpacity onPress={() => goToPage(2)}>
<Text>Go to Page 2</Text>
</TouchableOpacity>
</View>
);
}Creates a URLSearchParams object using the given initializer. This is identical to new URLSearchParams(init) except it also supports arrays as values in the object form.
/**
* Creates a URLSearchParams object with enhanced array support
* Supports string, array, object, and URLSearchParams initializers
* @param init - Initial parameters in various formats
* @returns URLSearchParams instance
*/
function createSearchParams(init?: URLSearchParamsInit): URLSearchParams;
type URLSearchParamsInit =
| string
| ParamKeyValuePair[]
| Record<string, string | string[]>
| URLSearchParams;
type ParamKeyValuePair = [string, string];Usage Examples:
import { createSearchParams } from "react-router-native";
// From string
const params1 = createSearchParams("q=search&sort=name");
console.log(params1.get("q")); // "search"
// From object with single values
const params2 = createSearchParams({
q: "search term",
sort: "date",
page: "1"
});
// From object with array values (multiple values for same key)
const params3 = createSearchParams({
categories: ["electronics", "books"],
tags: ["sale", "featured"]
});
console.log(params3.getAll("categories")); // ["electronics", "books"]
// From key-value pair arrays
const params4 = createSearchParams([
["sort", "name"],
["sort", "price"], // Multiple values for same key
["category", "electronics"]
]);
// From existing URLSearchParams
const existing = new URLSearchParams("a=1&b=2");
const params5 = createSearchParams(existing);
// Complex example with arrays
const filterParams = createSearchParams({
search: "laptop",
categories: ["electronics", "computers"],
priceRange: ["100", "500"],
inStock: "true"
});
// Results in: search=laptop&categories=electronics&categories=computers&priceRange=100&priceRange=500&inStock=truetype URLSearchParamsInit =
| string
| ParamKeyValuePair[]
| Record<string, string | string[]>
| URLSearchParams;
type ParamKeyValuePair = [string, string];
type SetURLSearchParams = (
nextInit?:
| URLSearchParamsInit
| ((prev: URLSearchParams) => URLSearchParamsInit),
navigateOpts?: NavigateOptions
) => void;
// Navigation options for setSearchParams
interface NavigateOptions {
replace?: boolean;
state?: any;
relative?: RelativeRoutingType;
}
type RelativeRoutingType = "route" | "path";// Typical search implementation
function useSearch() {
const [searchParams, setSearchParams] = useSearchParams({
q: "",
sort: "relevance",
page: "1"
});
const search = (query) => {
setSearchParams(prev => {
const newParams = new URLSearchParams(prev);
newParams.set("q", query);
newParams.set("page", "1"); // Reset pagination
return newParams;
});
};
return { searchParams, search };
}// Pagination with search params
function usePagination() {
const [searchParams, setSearchParams] = useSearchParams({ page: "1" });
const setPage = (page) => {
setSearchParams(prev => {
const newParams = new URLSearchParams(prev);
newParams.set("page", page.toString());
return newParams;
}, { replace: true }); // Replace to avoid cluttering history
};
return {
currentPage: parseInt(searchParams.get("page") || "1"),
setPage
};
}// Multi-select filter implementation
function useFilters() {
const [searchParams, setSearchParams] = useSearchParams();
const toggleFilter = (key, value) => {
setSearchParams(prev => {
const newParams = new URLSearchParams(prev);
const current = newParams.getAll(key);
if (current.includes(value)) {
// Remove the value
newParams.delete(key);
current.filter(v => v !== value).forEach(v => {
newParams.append(key, v);
});
} else {
// Add the value
newParams.append(key, value);
}
return newParams;
});
};
return { searchParams, toggleFilter };
}Install with Tessl CLI
npx tessl i tessl/npm-react-router-native