Skip to content

Commit f5c7059

Browse files
Merge pull request #206 from toystars/typescript-declarations
Add Typescript types definition for all hooks
2 parents ec4920b + 75de156 commit f5c7059

File tree

4 files changed

+267
-2
lines changed

4 files changed

+267
-2
lines changed

index.d.ts

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
import React from "react";
2+
3+
export type BatteryManager = {
4+
supported: boolean;
5+
loading: boolean;
6+
level: number | null;
7+
charging: boolean | null;
8+
chargingTime: number | null;
9+
dischargingTime: number | null;
10+
}
11+
12+
export type GeolocationState = {
13+
loading: boolean;
14+
accuracy: number | null;
15+
altitude: number | null;
16+
altitudeAccuracy: number | null;
17+
heading: number | null;
18+
latitude: number | null;
19+
longitude: number | null;
20+
speed: number | null;
21+
timestamp: number | null;
22+
error: GeolocationPositionError | null;
23+
}
24+
25+
export type HistoryState<T> = {
26+
state: T;
27+
set: (newPresent: T) => void;
28+
undo: () => void;
29+
redo: () => void;
30+
clear: () => void;
31+
canUndo: boolean;
32+
canRedo: boolean;
33+
}
34+
35+
export type LongPressOptions = {
36+
threshold?: number;
37+
onStart?: (e: Event) => void;
38+
onFinish?: (e: Event) => void;
39+
onCancel?: (e: Event) => void;
40+
}
41+
42+
export type LongPressFns = {
43+
onMouseDown: (e: React.MouseEvent) => void;
44+
onMouseUp: (e: React.MouseEvent) => void;
45+
onMouseLeave: (e: React.MouseEvent) => void;
46+
onTouchStart: (e: React.TouchEvent) => void;
47+
onTouchEnd: (e: React.TouchEvent) => void;
48+
}
49+
50+
export type MousePosition = {
51+
x: number;
52+
y: number;
53+
elementX: number;
54+
elementY: number;
55+
elementPositionX: number;
56+
elementPositionY: number;
57+
}
58+
59+
export type NetworkState = {
60+
online: boolean;
61+
downlink: number | null;
62+
downlinkMax: number | null;
63+
effectiveType: string | null;
64+
rtt: number | null;
65+
saveData: boolean | null;
66+
type: string | null;
67+
}
68+
69+
export type CustomList<T> = {
70+
set: (l: T[]) => void;
71+
push: (element: T) => void;
72+
removeAt: (index: number) => void;
73+
insertAt: (index: number, element: T) => void;
74+
updateAt: (index: number, element: T) => void;
75+
clear: () => void;
76+
}
77+
78+
export type CustomQueue<T> = {
79+
add: (element: T) => void;
80+
remove: () => T | undefined;
81+
clear: () => void;
82+
first: T | undefined;
83+
last: T | undefined;
84+
size: number;
85+
}
86+
87+
export type RenderInfo = {
88+
name: string;
89+
renders: number;
90+
sinceLastRender: number;
91+
timestamp: number;
92+
}
93+
94+
export type SpeechOptions = {
95+
lang?: string;
96+
voice?: {
97+
lang?: string;
98+
name?: string;
99+
};
100+
rate?: number;
101+
pitch?: number;
102+
volume?: number;
103+
}
104+
105+
export type SpeechState = {
106+
isPlaying: boolean;
107+
status: "init" | "play" | "pause" | "stop";
108+
lang: string;
109+
voiceInfo: {
110+
lang: string;
111+
name: string;
112+
};
113+
rate: number;
114+
pitch: number;
115+
volume: number;
116+
}
117+
118+
declare module '@uidotdev/usehooks' {
119+
120+
export function useBattery(): BatteryManager;
121+
122+
export function useClickAway<T extends Element>(cb: (e: Event) => void): React.MutableRefObject<T>;
123+
124+
export function useCopyToClipboard(): [
125+
{
126+
error: Error | null;
127+
text: string | null;
128+
},
129+
(value: string) => Promise<void>
130+
];
131+
132+
export function useCounter(
133+
startingValue?: number,
134+
options?: {
135+
min?: number;
136+
max?: number;
137+
}
138+
): [
139+
number,
140+
{
141+
increment: () => void;
142+
decrement: () => void;
143+
set: (nextCount: number) => void;
144+
reset: () => void;
145+
}
146+
];
147+
148+
export function useDebounce<T>(value: T, delay: number): T;
149+
150+
export function useDefault<T>(initialValue: T, defaultValue: T): [T, React.Dispatch<React.SetStateAction<T>>];
151+
152+
export function useDocumentTitle(title: string): void;
153+
154+
export function useFavicon(url: string): void;
155+
156+
export function useGeolocation(options?: PositionOptions): GeolocationState;
157+
158+
export function useHistoryState<T>(initialPresent?: T): HistoryState<T>;
159+
160+
export function useHover<T extends Element>(): [React.MutableRefObject<T>, boolean];
161+
162+
export function useIdle(ms?: number): boolean;
163+
164+
export function useIntersectionObserver(options?: IntersectionObserverInit): [
165+
React.MutableRefObject<Element>,
166+
IntersectionObserverEntry | null
167+
];
168+
169+
export function useIsClient(): boolean;
170+
171+
export function useIsFirstRender(): boolean;
172+
173+
export function useList<T>(defaultList?: T[]): [T[], CustomList<T>];
174+
175+
export function useLockBodyScroll(): void;
176+
177+
export function useLongPress(callback: (e: Event) => void, options?: LongPressOptions): LongPressFns;
178+
179+
export function useMap<T>(initialState?: T): Map<T>;
180+
181+
export function useMeasure<T extends Element>(): [
182+
React.MutableRefObject<T>,
183+
{
184+
width: number | null;
185+
height: number | null;
186+
}
187+
];
188+
189+
export function useMediaQuery(query: string): boolean;
190+
191+
export function useMouse<T extends Element>(): [MousePosition, React.MutableRefObject<T>];
192+
193+
export function useNetworkState(): NetworkState;
194+
195+
export function useObjectState<T>(initialValue: T): [T, (arg: T) => void];
196+
197+
export function useOrientation(): {
198+
angle: number;
199+
type: string;
200+
};
201+
202+
export function usePreferredLanguage(): string;
203+
204+
export function usePrevious<T>(newValue: T): T;
205+
206+
export function useQueue<T>(initialValue?: T[]): CustomQueue<T>;
207+
208+
export function useRenderCount(): number;
209+
210+
export function useRenderInfo(name?: string): RenderInfo | undefined;
211+
212+
export function useScript(src: string, options?: {
213+
removeOnUnmount?: boolean;
214+
}): "idle" | "loading" | "ready" | "error";
215+
216+
export function useSet<T>(values?: T[]): Set<T>;
217+
218+
export function useSpeech(text: string, options?: SpeechOptions): SpeechState;
219+
220+
export function useThrottle<T>(value: T, delay: number): T;
221+
222+
export function useToggle(initialValue?: boolean): [boolean, (newValue?: boolean) => void];
223+
224+
export function useVisibilityChange(): boolean;
225+
226+
export function useWindowScroll(): [
227+
{
228+
x: number | null;
229+
y: number | null;
230+
},
231+
(args: unknown) => void
232+
];
233+
234+
export function useWindowSize(): {
235+
width: number | null;
236+
height: number | null;
237+
};
238+
}

package-lock.json

Lines changed: 15 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"repository": "uidotdev/usehooks",
77
"devDependencies": {
88
"react": "^18.2.0",
9-
"react-dom": "^18.2.0"
9+
"react-dom": "^18.2.0",
10+
"typescript": "^5.1.6"
1011
},
1112
"exports": {
1213
"default": "./index.js"

tsconfig.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"compilerOptions": {
3+
"target": "es5",
4+
"module": "ESNext",
5+
"esModuleInterop": true,
6+
"forceConsistentCasingInFileNames": true,
7+
"strict": true,
8+
"skipLibCheck": true,
9+
"noImplicitAny": true,
10+
"allowJs": true
11+
}
12+
}

0 commit comments

Comments
 (0)