npm package: @ptolemy2002/react-search-param-state
Description: This library works with `react-router-dom` to provide a hook that allows you to store and retrieve state in the URL search parameters, allowing users to share links with the state included and to refresh the page without losing the state.
Latest version: 3.2.3

# React Search Param State
This library works with `react-router-dom` to provide a hook that allows you to store and retrieve state in the URL search parameters, allowing users to share links with the state included and to refresh the page without losing the state.

The hook is exported as default, so you can import in one of the following ways:
```javascript
// ES6
import useSearchParamState from '@ptolemy2002/react-search-param-state';
// CommonJS
const useSearchParamState = require('@ptolemy2002/react-search-param-state');
```

## Type Reference
```typescript
type SetSearchParamAction<T extends Record<string, unknown>, K extends keyof T> = MaybeTransformer<T[K], [T[K]]>;
export type SetSearchParamFunction<T extends Record<string, unknown>> = (
    values: MaybeTransformer<
        MaybeTransformerRecord<SetSearchParamAction<T, keyof T>>,
        [TAndOthers<T>]
    >, options?: NavigateOptions
    ) => void
;

type ConvertFunctions<T extends Record<string, unknown>> = {
    [K in KeysNotMatchingEqualTypes<T, string | null>]:
        ((value: string | null) => T[K]) | {
            fromURL: (value: string | null) => T[K];
            toURL?: (value: T[K]) => string;
        }
} & {
    [K in KeysMatchingEqualTypes<T, string | null>]?:
        ((value: string | null) => T[K]) | {
            fromURL: (value: string | null) => T[K];
            toURL?: (value: T[K]) => string;
        }
};

type UseSearchParamResult<T extends Record<string, unknown>> = HookResultData<{
    currentValues: TAndOthers<T>;
    set: SetSearchParamFunction<T>;
}, readonly [TAndOthers<T>, SetSearchParamFunction<T>]>;
```
Note that the `HookResult` class comes from the `@ptolemy2002/react-hook-result` library, a peer dependency of this library. The `UseSearchParamResult` type combines itself with an array ONLY for the purpose of allowing destructuring to work correctly. Do not attempt to access array properties in `UseSearchParamResult` directly, as they do not actually exist.

## Hooks
The following hooks are available in the library:

### useSearchParamState<T extends Record<string, unknown>>
#### Description
With your specified `defaultVaues`, retrieve state from the URL parameters, converting values as specified. The hook will return with a funtion that can be used to update the state. T represents the type of the parameters you expect, though know that the result will include all parameters in the URL, even if they are not part of this type.

#### Parameters
- `defaultValues` (`Partial<T>`): An object containing the default values for the state. The keys are the names of the state variables, and the values are the default values. The values can be any type, but they will be converted to strings when stored in the URL.
- `converts` (`ConvertFunctions<T>`): An object containing functions to convert the values from strings to the desired type and back. The keys are the names of the state variables, and the values are functions that take a string and return the desired type. If a key is not present in this object, the value will be used as-is. The type for this requires a convert function to be present for any property that does not have `string | null` as its value type (EXACTLY) and makes the others optional. If `toURL` is not present, the value will be converted to a string using the `String` function.

#### Returns
- `HookResult`: A hook result containing the following values in this order:
    - `currentValues` (`TAndOthers<T>`): An object containing the current state values, including any default values that were not specified in the URL and any values that were specified in the URL, but not in the default values object.
    - `setState` (`SetSearchParamFunction<T>`): A function that can be used to update the state. You can specify a callable as either the parameter itself or one of the values, in both cases the current value of the state/variable will be passed as a parameter to the callable. Any variables that do not appear in the object passed to the function will be left unchanged. The second parameter is an object containing options for the navigation, which by default is `{ replace: true }`.

## Peer Dependencies
These should be installed in order to use the library, as npm does not automatically add peer dependencies to your project.
- react: ^18.3.1
- react-dom: ^18.3.1
- react-router-dom: ^6.26.2
- @ptolemy2002/react-hook-result: ^2.1.1
- @ptolemy2002/js-utils: ^3.0.2

## Commands
The following commands exist in the project:

- `npm run uninstall` - Uninstalls all dependencies for the library
- `npm run reinstall` - Uninstalls and then Reinstalls all dependencies for the library
- `npm run example-uninstall` - Uninstalls all dependencies for the example app
- `npm run example-install` - Installs all dependencies for the example app
- `npm run example-reinstall` - Uninstalls and then Reinstalls all dependencies for the example app
- `npm run example-start` - Starts the example app after building the library
- `npm run build` - Builds the library
- `npm run release` - Publishes the library to npm without changing the version
- `npm run release-patch` - Publishes the library to npm with a patch version bump
- `npm run release-minor` - Publishes the library to npm with a minor version bump
- `npm run release-major` - Publishes the library to npm with a major version bump