@wiggindev/hooks 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
package/.editorconfig ADDED
@@ -0,0 +1,10 @@
1
+ root = true
2
+
3
+ [*]
4
+ end_of_line = lf
5
+ insert_final_newline = true
6
+
7
+ [*.{js,json,yml}]
8
+ charset = utf-8
9
+ indent_style = space
10
+ indent_size = 2
package/.eslintrc.cjs ADDED
@@ -0,0 +1,54 @@
1
+ module.exports = {
2
+ root: true,
3
+ parser: '@typescript-eslint/parser',
4
+ parserOptions: {
5
+ ecmaFeatures: {
6
+ jsx: true,
7
+ },
8
+ },
9
+ plugins: ['@typescript-eslint', 'react', 'prettier'],
10
+ extends: ['eslint:recommended', 'plugin:react/recommended', 'prettier'],
11
+ rules: {
12
+ 'prefer-const': 'error',
13
+ 'no-unused-vars': 'off',
14
+ 'no-cond-assign': ['error', 'always'],
15
+ '@typescript-eslint/no-unused-vars': [
16
+ 'error',
17
+ { ignoreRestSiblings: true },
18
+ ],
19
+ '@typescript-eslint/no-explicit-any': 'error',
20
+ 'react/jsx-uses-react': 'error',
21
+ 'react/jsx-uses-vars': 'error',
22
+ '@next/next/no-html-link-for-pages': 'off',
23
+ 'prettier/prettier': 'error',
24
+ },
25
+ overrides: [
26
+ {
27
+ files: ['*.ts', '*.tsx'],
28
+ extends: [
29
+ 'plugin:@typescript-eslint/recommended',
30
+ 'plugin:@typescript-eslint/recommended-requiring-type-checking',
31
+ ],
32
+ parserOptions: {
33
+ tsconfigRootDir: __dirname,
34
+ project: ['./tsconfig.json'],
35
+ },
36
+ },
37
+ {
38
+ files: ['*.js'],
39
+ rules: {
40
+ '@typescript-eslint/no-var-requires': 'off',
41
+ },
42
+ },
43
+ ],
44
+ ignorePatterns: [
45
+ 'node_modules',
46
+ '.fleet',
47
+ '.yarn',
48
+ '.idea',
49
+ '.next',
50
+ '.vercel',
51
+ 'dist',
52
+ '.pnp.*',
53
+ ],
54
+ };
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env sh
2
+ . "$(dirname -- "$0")/_/husky.sh"
3
+
4
+ yarn lint-staged
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="CodeStream">
4
+ <option name="teamId" value="627c6dbe4df6f3ed8737f84c" />
5
+ <option name="webViewContext" value="{&quot;chatProviderAccess&quot;:&quot;strict&quot;,&quot;currentTeamId&quot;:&quot;627c6dbe4df6f3ed8737f84c&quot;,&quot;currentStreamId&quot;:&quot;&quot;,&quot;pullRequestCheckoutBranch&quot;:false,&quot;isRepositioning&quot;:false,&quot;onboardStep&quot;:0,&quot;panelStack&quot;:[&quot;landing-redirect&quot;],&quot;hasFocus&quot;:false,&quot;channelFilter&quot;:&quot;all&quot;,&quot;channelsMuteAll&quot;:false,&quot;codemarkFileFilter&quot;:&quot;all&quot;,&quot;codemarkTypeFilter&quot;:&quot;all&quot;,&quot;codemarkTagFilter&quot;:&quot;all&quot;,&quot;codemarkBranchFilter&quot;:&quot;all&quot;,&quot;codemarkAuthorFilter&quot;:&quot;all&quot;,&quot;codemarksFileViewStyle&quot;:&quot;inline&quot;,&quot;codemarksShowArchived&quot;:false,&quot;codemarksShowResolved&quot;:false,&quot;codemarksWrapComments&quot;:false,&quot;showFeedbackSmiley&quot;:true,&quot;route&quot;:{&quot;name&quot;:&quot;login&quot;,&quot;params&quot;:{}},&quot;spatialViewShowPRComments&quot;:false,&quot;__teamless__&quot;:{&quot;selectedRegion&quot;:&quot;us&quot;},&quot;sessionStart&quot;:1652466791260,&quot;isFirstPageview&quot;:false}" />
6
+ </component>
7
+ </project>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="WEB_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$">
5
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
6
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
7
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
8
+ </content>
9
+ <orderEntry type="inheritedJdk" />
10
+ <orderEntry type="sourceFolder" forTests="false" />
11
+ <orderEntry type="module" module-name="newportfolio" />
12
+ <orderEntry type="module" module-name="event-listener" />
13
+ </component>
14
+ </module>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/../event-listeners/.idea/event-listener.iml" filepath="$PROJECT_DIR$/../event-listeners/.idea/event-listener.iml" />
6
+ <module fileurl="file://$PROJECT_DIR$/.idea/hooks.iml" filepath="$PROJECT_DIR$/.idea/hooks.iml" />
7
+ <module fileurl="file://$PROJECT_DIR$/../portfolio/.idea/newportfolio.iml" filepath="$PROJECT_DIR$/../portfolio/.idea/newportfolio.iml" />
8
+ </modules>
9
+ </component>
10
+ </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ <mapping directory="$PROJECT_DIR$/../event-listeners" vcs="Git" />
6
+ </component>
7
+ </project>
@@ -0,0 +1,79 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ChangeListManager">
4
+ <list default="true" id="4964792f-b5d0-49fc-acf7-bc8ffeafca73" name="Changes" comment="">
5
+ <change beforePath="$PROJECT_DIR$/../event-listeners/.idea/event-listener.iml" beforeDir="false" afterPath="$PROJECT_DIR$/../event-listeners/.idea/event-listener.iml" afterDir="false" />
6
+ <change beforePath="$PROJECT_DIR$/.yarnrc.yml" beforeDir="false" afterPath="$PROJECT_DIR$/.yarnrc.yml" afterDir="false" />
7
+ <change beforePath="$PROJECT_DIR$/../portfolio/.idea/codestream.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../portfolio/.idea/codestream.xml" afterDir="false" />
8
+ <change beforePath="$PROJECT_DIR$/../portfolio/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/../portfolio/.idea/vcs.xml" afterDir="false" />
9
+ <change beforePath="$PROJECT_DIR$/../portfolio/.yarn/cache/@types-prettier-npm-2.6.0-68db36c8c1-946f1f82ce.zip" beforeDir="false" />
10
+ <change beforePath="$PROJECT_DIR$/../portfolio/.yarn/cache/axe-core-npm-4.4.1-95b0d6a519-ad14c5b710.zip" beforeDir="false" />
11
+ <change beforePath="$PROJECT_DIR$/../portfolio/.yarn/cache/glob-npm-7.2.0-bb4644d239-78a8ea9423.zip" beforeDir="false" />
12
+ <change beforePath="$PROJECT_DIR$/../portfolio/.yarn/cache/glob-npm-8.0.1-3485e1ee02-7ac782f3ef.zip" beforeDir="false" />
13
+ <change beforePath="$PROJECT_DIR$/../portfolio/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/../portfolio/package.json" afterDir="false" />
14
+ <change beforePath="$PROJECT_DIR$/../portfolio/pages/_app.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/../portfolio/pages/_app.tsx" afterDir="false" />
15
+ <change beforePath="$PROJECT_DIR$/../portfolio/src/hooks/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../portfolio/src/hooks/index.ts" afterDir="false" />
16
+ <change beforePath="$PROJECT_DIR$/../portfolio/src/hooks/useDocumentEventListener.ts" beforeDir="false" />
17
+ <change beforePath="$PROJECT_DIR$/../portfolio/src/hooks/useEventListener.ts" beforeDir="false" />
18
+ <change beforePath="$PROJECT_DIR$/../portfolio/src/hooks/useWindowDimensions.ts" beforeDir="false" afterPath="$PROJECT_DIR$/../portfolio/src/hooks/useWindowDimensions.ts" afterDir="false" />
19
+ <change beforePath="$PROJECT_DIR$/../portfolio/src/hooks/useWindowEventListener.ts" beforeDir="false" />
20
+ <change beforePath="$PROJECT_DIR$/../portfolio/yarn.lock" beforeDir="false" afterPath="$PROJECT_DIR$/../portfolio/yarn.lock" afterDir="false" />
21
+ </list>
22
+ <option name="SHOW_DIALOG" value="false" />
23
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
24
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
25
+ <option name="LAST_RESOLUTION" value="IGNORE" />
26
+ </component>
27
+ <component name="Git.Settings">
28
+ <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
29
+ </component>
30
+ <component name="MarkdownSettingsMigration">
31
+ <option name="stateVersion" value="1" />
32
+ </component>
33
+ <component name="ProjectId" id="297asfPdQivGT4C9paNuenxvTVF" />
34
+ <component name="ProjectLevelVcsManager" settingsEditedManually="true">
35
+ <ConfirmationsSetting value="2" id="Add" />
36
+ </component>
37
+ <component name="ProjectViewState">
38
+ <option name="hideEmptyMiddlePackages" value="true" />
39
+ <option name="showLibraryContents" value="true" />
40
+ </component>
41
+ <component name="PropertiesComponent"><![CDATA[{
42
+ "keyToString": {
43
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
44
+ "RunOnceActivity.ShowReadmeOnStart": "true",
45
+ "WebServerToolWindowFactoryState": "false",
46
+ "last_opened_file_path": "/Users/wiggindev/git/hooks",
47
+ "nodejs_package_manager_path": "yarn",
48
+ "prettierjs.PrettierConfiguration.Package": "yarn:package.json:prettier",
49
+ "ts.external.directory.path": "yarn:package.json:typescript",
50
+ "vue.rearranger.settings.migration": "true"
51
+ }
52
+ }]]></component>
53
+ <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
54
+ <component name="TaskManager">
55
+ <task active="true" id="Default" summary="Default task">
56
+ <changelist id="4964792f-b5d0-49fc-acf7-bc8ffeafca73" name="Changes" comment="" />
57
+ <created>1652466785863</created>
58
+ <option name="number" value="Default" />
59
+ <option name="presentableId" value="Default" />
60
+ <updated>1652466785863</updated>
61
+ <workItem from="1652466786963" duration="3281000" />
62
+ </task>
63
+ <servers />
64
+ </component>
65
+ <component name="TypeScriptGeneratedFilesManager">
66
+ <option name="version" value="3" />
67
+ </component>
68
+ <component name="Vcs.Log.Tabs.Properties">
69
+ <option name="TAB_STATES">
70
+ <map>
71
+ <entry key="MAIN">
72
+ <value>
73
+ <State />
74
+ </value>
75
+ </entry>
76
+ </map>
77
+ </option>
78
+ </component>
79
+ </project>
@@ -0,0 +1,2 @@
1
+ dist
2
+ **/.*
@@ -0,0 +1,9 @@
1
+ {
2
+ "semi": true,
3
+ "trailingComma": "es5",
4
+ "singleQuote": true,
5
+ "tabWidth": 4,
6
+ "useTabs": false,
7
+ "arrowParens": "avoid",
8
+ "bracketSpacing": true
9
+ }
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # hooks
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=/*#__PURE__*/e(require("react")),n="undefined"!=typeof window?t.default.useLayoutEffect:t.default.useEffect,u=function(e){var u=t.default.useRef(e);return n(function(){u.current=e}),t.default.useMemo(function(){return u.current},[])};exports.useDocumentEventListener=function(e,n){var r=u(n);t.default.useEffect(function(){if(document&&document.addEventListener)return document.addEventListener(e,r),function(){return document.addEventListener(e,r)}},[e,r])},exports.useEvent=u,exports.useEventListener=function(e,n,r){var f=u(n);t.default.useEffect(function(){var t=r.current;if(t&&t.addEventListener)return t.addEventListener(e,f),function(){return t.addEventListener(e,f)}},[r,e,f])},exports.useIsomorphicLayoutEffect=n,exports.useWindowEventListener=function(e,n){var r=u(n);t.default.useEffect(function(){if(window&&window.addEventListener)return window.addEventListener(e,r),function(){return window.addEventListener(e,r)}},[e,r])};
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/useIsomorphicLayoutEffect.ts","../src/useEvent.ts","../src/useDocumentEventListener.ts","../src/useEventListener.ts","../src/useWindowEventListener.ts"],"sourcesContent":["import React from 'react';\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n","import React from 'react';\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\ntype Callback = (...args: any[]) => any;\n\nexport const useEvent = <C extends Callback>(callback: C): C => {\n const callbackRef = React.useRef(callback);\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = callback;\n });\n return React.useMemo(() => callbackRef.current, []);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useDocumentEventListener = <K extends EventName<DocumentEventMap>>(\n eventName: K,\n listener: EventListener<DocumentEventMap, K>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n if (!document || !document.addEventListener) {\n return;\n }\n document.addEventListener(eventName, stableListener);\n return () => document.addEventListener(eventName, stableListener);\n }, [eventName, stableListener]);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useEventListener = <\n K extends EventName<HTMLElementEventMap>,\n E extends HTMLElement\n>(\n eventName: K,\n listener: EventListener<HTMLElementEventMap, K>,\n element: React.RefObject<E>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n const node = element.current;\n if (!node || !node.addEventListener) {\n return;\n }\n node.addEventListener(eventName, stableListener);\n return () => node.addEventListener(eventName, stableListener);\n }, [element, eventName, stableListener]);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useWindowEventListener = <K extends EventName<WindowEventMap>>(\n eventName: K,\n listener: EventListener<WindowEventMap, K>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n if (!window || !window.addEventListener) {\n return;\n }\n window.addEventListener(eventName, stableListener);\n return () => window.addEventListener(eventName, stableListener);\n }, [eventName, stableListener]);\n};\n"],"names":["useIsomorphicLayoutEffect","window","React","useLayoutEffect","useEffect","useEvent","callback","callbackRef","useRef","current","useMemo","eventName","listener","stableListener","document","addEventListener","element","node"],"mappings":"+GAEaA,EACS,oBAAXC,OAAyBC,EAAAA,QAAMC,gBAAkBD,EAAAA,QAAME,UCErDC,EAAW,SAAqBC,GACzC,IAAMC,EAAcL,EAAK,QAACM,OAAOF,GAIjC,OAHAN,EAA0B,WACtBO,EAAYE,QAAUH,IAEnBJ,UAAMQ,QAAQ,WAAA,OAAMH,EAAYE,SAAS,sCCNZ,SACpCE,EACAC,GAEA,IAAMC,EAAiBR,EAASO,GAChCV,EAAAA,QAAME,UAAU,WACZ,GAAKU,UAAaA,SAASC,iBAI3B,OADAD,SAASC,iBAAiBJ,EAAWE,GACxBC,WAAAA,OAAAA,SAASC,iBAAiBJ,EAAWE,KACnD,CAACF,EAAWE,iDCXa,SAI5BF,EACAC,EACAI,GAEA,IAAMH,EAAiBR,EAASO,GAChCV,UAAME,UAAU,WACZ,IAAMa,EAAOD,EAAQP,QACrB,GAAKQ,GAASA,EAAKF,iBAInB,OADAE,EAAKF,iBAAiBJ,EAAWE,GACpBI,WAAAA,OAAAA,EAAKF,iBAAiBJ,EAAWE,KAC/C,CAACG,EAASL,EAAWE,wEChBU,SAClCF,EACAC,GAEA,IAAMC,EAAiBR,EAASO,GAChCV,EAAAA,QAAME,UAAU,WACZ,GAAKH,QAAWA,OAAOc,iBAIvB,OADAd,OAAOc,iBAAiBJ,EAAWE,GACtBZ,WAAAA,OAAAA,OAAOc,iBAAiBJ,EAAWE,KACjD,CAACF,EAAWE"}
@@ -0,0 +1,5 @@
1
+ export * from './useIsomorphicLayoutEffect';
2
+ export * from './useEvent';
3
+ export * from './useEventListener';
4
+ export * from './useDocumentEventListener';
5
+ export * from './useWindowEventListener';
@@ -0,0 +1,2 @@
1
+ import e from"react";const t="undefined"!=typeof window?e.useLayoutEffect:e.useEffect,n=n=>{const d=e.useRef(n);return t(()=>{d.current=n}),e.useMemo(()=>d.current,[])},d=(t,d,r)=>{const s=n(d);e.useEffect(()=>{const e=r.current;if(e&&e.addEventListener)return e.addEventListener(t,s),()=>e.addEventListener(t,s)},[r,t,s])},r=(t,d)=>{const r=n(d);e.useEffect(()=>{if(document&&document.addEventListener)return document.addEventListener(t,r),()=>document.addEventListener(t,r)},[t,r])},s=(t,d)=>{const r=n(d);e.useEffect(()=>{if(window&&window.addEventListener)return window.addEventListener(t,r),()=>window.addEventListener(t,r)},[t,r])};export{r as useDocumentEventListener,n as useEvent,d as useEventListener,t as useIsomorphicLayoutEffect,s as useWindowEventListener};
2
+ //# sourceMappingURL=index.modern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.modern.js","sources":["../src/useIsomorphicLayoutEffect.ts","../src/useEvent.ts","../src/useEventListener.ts","../src/useDocumentEventListener.ts","../src/useWindowEventListener.ts"],"sourcesContent":["import React from 'react';\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n","import React from 'react';\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\ntype Callback = (...args: any[]) => any;\n\nexport const useEvent = <C extends Callback>(callback: C): C => {\n const callbackRef = React.useRef(callback);\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = callback;\n });\n return React.useMemo(() => callbackRef.current, []);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useEventListener = <\n K extends EventName<HTMLElementEventMap>,\n E extends HTMLElement\n>(\n eventName: K,\n listener: EventListener<HTMLElementEventMap, K>,\n element: React.RefObject<E>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n const node = element.current;\n if (!node || !node.addEventListener) {\n return;\n }\n node.addEventListener(eventName, stableListener);\n return () => node.addEventListener(eventName, stableListener);\n }, [element, eventName, stableListener]);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useDocumentEventListener = <K extends EventName<DocumentEventMap>>(\n eventName: K,\n listener: EventListener<DocumentEventMap, K>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n if (!document || !document.addEventListener) {\n return;\n }\n document.addEventListener(eventName, stableListener);\n return () => document.addEventListener(eventName, stableListener);\n }, [eventName, stableListener]);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useWindowEventListener = <K extends EventName<WindowEventMap>>(\n eventName: K,\n listener: EventListener<WindowEventMap, K>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n if (!window || !window.addEventListener) {\n return;\n }\n window.addEventListener(eventName, stableListener);\n return () => window.addEventListener(eventName, stableListener);\n }, [eventName, stableListener]);\n};\n"],"names":["useIsomorphicLayoutEffect","window","React","useLayoutEffect","useEffect","useEvent","callback","callbackRef","useRef","current","useMemo","useEventListener","eventName","listener","element","stableListener","node","addEventListener","useDocumentEventListener","document","useWindowEventListener"],"mappings":"qBAEaA,MAAAA,EACS,oBAAXC,OAAyBC,EAAMC,gBAAkBD,EAAME,UCErDC,EAAgCC,IACzC,MAAMC,EAAcL,EAAMM,OAAOF,GAIjC,OAHAN,EAA0B,KACtBO,EAAYE,QAAUH,IAEnBJ,EAAMQ,QAAQ,IAAMH,EAAYE,QAAS,KCNvCE,EAAmB,CAI5BC,EACAC,EACAC,KAEA,MAAMC,EAAiBV,EAASQ,GAChCX,EAAME,UAAU,KACZ,MAAMY,EAAOF,EAAQL,QACrB,GAAKO,GAASA,EAAKC,iBAInB,OADAD,EAAKC,iBAAiBL,EAAWG,GAC1B,IAAMC,EAAKC,iBAAiBL,EAAWG,IAC/C,CAACD,EAASF,EAAWG,KChBfG,EAA2B,CACpCN,EACAC,KAEA,MAAME,EAAiBV,EAASQ,GAChCX,EAAME,UAAU,KACZ,GAAKe,UAAaA,SAASF,iBAI3B,OADAE,SAASF,iBAAiBL,EAAWG,GAC9B,IAAMI,SAASF,iBAAiBL,EAAWG,IACnD,CAACH,EAAWG,KCXNK,EAAyB,CAClCR,EACAC,KAEA,MAAME,EAAiBV,EAASQ,GAChCX,EAAME,UAAU,KACZ,GAAKH,QAAWA,OAAOgB,iBAIvB,OADAhB,OAAOgB,iBAAiBL,EAAWG,GAC5B,IAAMd,OAAOgB,iBAAiBL,EAAWG,IACjD,CAACH,EAAWG"}
@@ -0,0 +1,2 @@
1
+ import n from"react";var e="undefined"!=typeof window?n.useLayoutEffect:n.useEffect,t=function(t){var r=n.useRef(t);return e(function(){r.current=t}),n.useMemo(function(){return r.current},[])},r=function(e,r,u){var i=t(r);n.useEffect(function(){var n=u.current;if(n&&n.addEventListener)return n.addEventListener(e,i),function(){return n.addEventListener(e,i)}},[u,e,i])},u=function(e,r){var u=t(r);n.useEffect(function(){if(document&&document.addEventListener)return document.addEventListener(e,u),function(){return document.addEventListener(e,u)}},[e,u])},i=function(e,r){var u=t(r);n.useEffect(function(){if(window&&window.addEventListener)return window.addEventListener(e,u),function(){return window.addEventListener(e,u)}},[e,u])};export{u as useDocumentEventListener,t as useEvent,r as useEventListener,e as useIsomorphicLayoutEffect,i as useWindowEventListener};
2
+ //# sourceMappingURL=index.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.module.js","sources":["../src/useIsomorphicLayoutEffect.ts","../src/useEvent.ts","../src/useEventListener.ts","../src/useDocumentEventListener.ts","../src/useWindowEventListener.ts"],"sourcesContent":["import React from 'react';\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n","import React from 'react';\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\ntype Callback = (...args: any[]) => any;\n\nexport const useEvent = <C extends Callback>(callback: C): C => {\n const callbackRef = React.useRef(callback);\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = callback;\n });\n return React.useMemo(() => callbackRef.current, []);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useEventListener = <\n K extends EventName<HTMLElementEventMap>,\n E extends HTMLElement\n>(\n eventName: K,\n listener: EventListener<HTMLElementEventMap, K>,\n element: React.RefObject<E>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n const node = element.current;\n if (!node || !node.addEventListener) {\n return;\n }\n node.addEventListener(eventName, stableListener);\n return () => node.addEventListener(eventName, stableListener);\n }, [element, eventName, stableListener]);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useDocumentEventListener = <K extends EventName<DocumentEventMap>>(\n eventName: K,\n listener: EventListener<DocumentEventMap, K>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n if (!document || !document.addEventListener) {\n return;\n }\n document.addEventListener(eventName, stableListener);\n return () => document.addEventListener(eventName, stableListener);\n }, [eventName, stableListener]);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useWindowEventListener = <K extends EventName<WindowEventMap>>(\n eventName: K,\n listener: EventListener<WindowEventMap, K>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n if (!window || !window.addEventListener) {\n return;\n }\n window.addEventListener(eventName, stableListener);\n return () => window.addEventListener(eventName, stableListener);\n }, [eventName, stableListener]);\n};\n"],"names":["useIsomorphicLayoutEffect","window","React","useLayoutEffect","useEffect","useEvent","callback","callbackRef","useRef","current","useMemo","useEventListener","eventName","listener","element","stableListener","node","addEventListener","useDocumentEventListener","document","useWindowEventListener"],"mappings":"qBAEaA,IAAAA,EACS,oBAAXC,OAAyBC,EAAMC,gBAAkBD,EAAME,UCErDC,EAAW,SAAqBC,GACzC,IAAMC,EAAcL,EAAMM,OAAOF,GAIjC,OAHAN,EAA0B,WACtBO,EAAYE,QAAUH,IAEnBJ,EAAMQ,QAAQ,WAAA,OAAMH,EAAYE,SAAS,KCNvCE,EAAmB,SAI5BC,EACAC,EACAC,GAEA,IAAMC,EAAiBV,EAASQ,GAChCX,EAAME,UAAU,WACZ,IAAMY,EAAOF,EAAQL,QACrB,GAAKO,GAASA,EAAKC,iBAInB,OADAD,EAAKC,iBAAiBL,EAAWG,GACpBC,WAAAA,OAAAA,EAAKC,iBAAiBL,EAAWG,KAC/C,CAACD,EAASF,EAAWG,KChBfG,EAA2B,SACpCN,EACAC,GAEA,IAAME,EAAiBV,EAASQ,GAChCX,EAAME,UAAU,WACZ,GAAKe,UAAaA,SAASF,iBAI3B,OADAE,SAASF,iBAAiBL,EAAWG,GACxBI,WAAAA,OAAAA,SAASF,iBAAiBL,EAAWG,KACnD,CAACH,EAAWG,KCXNK,EAAyB,SAClCR,EACAC,GAEA,IAAME,EAAiBV,EAASQ,GAChCX,EAAME,UAAU,WACZ,GAAKH,QAAWA,OAAOgB,iBAIvB,OADAhB,OAAOgB,iBAAiBL,EAAWG,GACtBd,WAAAA,OAAAA,OAAOgB,iBAAiBL,EAAWG,KACjD,CAACH,EAAWG"}
@@ -0,0 +1,2 @@
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],n):n((e||self).hooks={},e.react)}(this,function(e,n){function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=/*#__PURE__*/t(n),f="undefined"!=typeof window?u.default.useLayoutEffect:u.default.useEffect,r=function(e){var n=u.default.useRef(e);return f(function(){n.current=e}),u.default.useMemo(function(){return n.current},[])};e.useDocumentEventListener=function(e,n){var t=r(n);u.default.useEffect(function(){if(document&&document.addEventListener)return document.addEventListener(e,t),function(){return document.addEventListener(e,t)}},[e,t])},e.useEvent=r,e.useEventListener=function(e,n,t){var f=r(n);u.default.useEffect(function(){var n=t.current;if(n&&n.addEventListener)return n.addEventListener(e,f),function(){return n.addEventListener(e,f)}},[t,e,f])},e.useIsomorphicLayoutEffect=f,e.useWindowEventListener=function(e,n){var t=r(n);u.default.useEffect(function(){if(window&&window.addEventListener)return window.addEventListener(e,t),function(){return window.addEventListener(e,t)}},[e,t])}});
2
+ //# sourceMappingURL=index.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../src/useIsomorphicLayoutEffect.ts","../src/useEvent.ts","../src/useDocumentEventListener.ts","../src/useEventListener.ts","../src/useWindowEventListener.ts"],"sourcesContent":["import React from 'react';\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n","import React from 'react';\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\n\ntype Callback = (...args: any[]) => any;\n\nexport const useEvent = <C extends Callback>(callback: C): C => {\n const callbackRef = React.useRef(callback);\n useIsomorphicLayoutEffect(() => {\n callbackRef.current = callback;\n });\n return React.useMemo(() => callbackRef.current, []);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useDocumentEventListener = <K extends EventName<DocumentEventMap>>(\n eventName: K,\n listener: EventListener<DocumentEventMap, K>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n if (!document || !document.addEventListener) {\n return;\n }\n document.addEventListener(eventName, stableListener);\n return () => document.addEventListener(eventName, stableListener);\n }, [eventName, stableListener]);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useEventListener = <\n K extends EventName<HTMLElementEventMap>,\n E extends HTMLElement\n>(\n eventName: K,\n listener: EventListener<HTMLElementEventMap, K>,\n element: React.RefObject<E>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n const node = element.current;\n if (!node || !node.addEventListener) {\n return;\n }\n node.addEventListener(eventName, stableListener);\n return () => node.addEventListener(eventName, stableListener);\n }, [element, eventName, stableListener]);\n};\n","import React from 'react';\nimport { useEvent } from './useEvent';\nimport { EventName, EventListener } from './types';\n\nexport const useWindowEventListener = <K extends EventName<WindowEventMap>>(\n eventName: K,\n listener: EventListener<WindowEventMap, K>\n) => {\n const stableListener = useEvent(listener);\n React.useEffect(() => {\n if (!window || !window.addEventListener) {\n return;\n }\n window.addEventListener(eventName, stableListener);\n return () => window.addEventListener(eventName, stableListener);\n }, [eventName, stableListener]);\n};\n"],"names":["useIsomorphicLayoutEffect","window","React","useLayoutEffect","useEffect","useEvent","callback","callbackRef","useRef","current","useMemo","eventName","listener","stableListener","document","addEventListener","element","node"],"mappings":"kWAEaA,EACS,oBAAXC,OAAyBC,EAAAA,QAAMC,gBAAkBD,EAAAA,QAAME,UCErDC,EAAW,SAAqBC,GACzC,IAAMC,EAAcL,EAAK,QAACM,OAAOF,GAIjC,OAHAN,EAA0B,WACtBO,EAAYE,QAAUH,IAEnBJ,UAAMQ,QAAQ,WAAA,OAAMH,EAAYE,SAAS,gCCNZ,SACpCE,EACAC,GAEA,IAAMC,EAAiBR,EAASO,GAChCV,EAAAA,QAAME,UAAU,WACZ,GAAKU,UAAaA,SAASC,iBAI3B,OADAD,SAASC,iBAAiBJ,EAAWE,GACxBC,WAAAA,OAAAA,SAASC,iBAAiBJ,EAAWE,KACnD,CAACF,EAAWE,qCCXa,SAI5BF,EACAC,EACAI,GAEA,IAAMH,EAAiBR,EAASO,GAChCV,UAAME,UAAU,WACZ,IAAMa,EAAOD,EAAQP,QACrB,GAAKQ,GAASA,EAAKF,iBAInB,OADAE,EAAKF,iBAAiBJ,EAAWE,GACpBI,WAAAA,OAAAA,EAAKF,iBAAiBJ,EAAWE,KAC/C,CAACG,EAASL,EAAWE,4DChBU,SAClCF,EACAC,GAEA,IAAMC,EAAiBR,EAASO,GAChCV,EAAAA,QAAME,UAAU,WACZ,GAAKH,QAAWA,OAAOc,iBAIvB,OADAd,OAAOc,iBAAiBJ,EAAWE,GACtBZ,WAAAA,OAAAA,OAAOc,iBAAiBJ,EAAWE,KACjD,CAACF,EAAWE"}
@@ -0,0 +1 @@
1
+ {"program":{"fileNames":["../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es5.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2016.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2017.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2018.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2019.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2020.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2021.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2022.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.esnext.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.dom.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.dom.iterable.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.core.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.collection.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.generator.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.promise.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2017.object.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2017.string.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2017.intl.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2018.intl.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2018.promise.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2019.array.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2019.object.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2019.string.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2020.promise.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2020.string.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2020.intl.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2021.promise.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2021.string.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2021.intl.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2022.array.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2022.error.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2022.object.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.es2022.string.d.ts","../.yarn/cache/typescript-patch-e50fdcf519-1cb434fbc6.zip/node_modules/typescript/lib/lib.esnext.intl.d.ts","../.yarn/cache/@types-react-npm-18.0.9-4dccadcd56-162364dad7.zip/node_modules/@types/react/global.d.ts","../.yarn/cache/csstype-npm-3.0.11-b49897178d-95e56abfe9.zip/node_modules/csstype/index.d.ts","../.yarn/cache/@types-prop-types-npm-15.7.5-2aa48aa177-5b43b8b154.zip/node_modules/@types/prop-types/index.d.ts","../.yarn/cache/@types-scheduler-npm-0.16.2-ba3a7d8c68-b6b4dcfeae.zip/node_modules/@types/scheduler/tracing.d.ts","../.yarn/cache/@types-react-npm-18.0.9-4dccadcd56-162364dad7.zip/node_modules/@types/react/index.d.ts","../src/useIsomorphicLayoutEffect.ts","../src/useEvent.ts","../src/types.ts","../src/useEventListener.ts","../src/useDocumentEventListener.ts","../src/useWindowEventListener.ts","../src/index.ts"],"fileInfos":[{"version":"3ac1b83264055b28c0165688fda6dfcc39001e9e7828f649299101c23ad0a0c3","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","e6b724280c694a9f588847f754198fb96c43d805f065c3a5b28bbc9594541c84","e21c071ca3e1b4a815d5f04a7475adcaeea5d64367e840dd0154096d705c3940","746d62152361558ea6d6115cf0da4dd10ede041d14882ede3568bce5dc4b4f1f","2f93dda35dafec68ec217c9ce67f0f4fbbbb030c055ac312641565ad60dd7e26","aea179452def8a6152f98f63b191b84e7cbd69b0e248c91e61fb2e52328abe8c",{"version":"72704b10d97777e15f1a581b73f88273037ef752d2e50b72287bd0a90af64fe6","affectsGlobalScope":true},{"version":"dbb73d4d99be496175cb432c74c2615f78c76f4272f1d83cba11ee0ed6dbddf0","affectsGlobalScope":true},{"version":"d8996609230d17e90484a2dd58f22668f9a05a3bfe00bfb1d6271171e54a31fb","affectsGlobalScope":true},{"version":"43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"0d5f52b3174bee6edb81260ebcd792692c32c81fd55499d69531496f3f2b25e7","affectsGlobalScope":true},{"version":"810627a82ac06fb5166da5ada4159c4ec11978dfbb0805fe804c86406dab8357","affectsGlobalScope":true},{"version":"62d80405c46c3f4c527ee657ae9d43fda65a0bf582292429aea1e69144a522a6","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"75ec0bdd727d887f1b79ed6619412ea72ba3c81d92d0787ccb64bab18d261f14","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"12a310447c5d23c7d0d5ca2af606e3bd08afda69100166730ab92c62999ebb9d","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"1b3fe904465430e030c93239a348f05e1be80640d91f2f004c3512c2c2c89f34","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"5075b36ab861c8c0c45377cb8c96270d7c65f0eeaf105d53fac6850da61f1027","affectsGlobalScope":true},{"version":"6c55633c733c8378db65ac3da7a767c3cf2cf3057f0565a9124a16a3a2019e87","affectsGlobalScope":true},{"version":"fb4416144c1bf0323ccbc9afb0ab289c07312214e8820ad17d709498c865a3fe","affectsGlobalScope":true},{"version":"5b0ca94ec819d68d33da516306c15297acec88efeb0ae9e2b39f71dbd9685ef7","affectsGlobalScope":true},{"version":"e8c9f4e445a489991ca1a4232667de3ac36b07ba75ea335971fbeacf2d26fe67","affectsGlobalScope":true},{"version":"34478567f8a80171f88f2f30808beb7da15eac0538ae91282dd33dce928d98ed","affectsGlobalScope":true},{"version":"6ea9ab679ea030cf46c16a711a316078e9e02619ebaf07a7fcd16964aba88f2d","affectsGlobalScope":true},{"version":"aedb8de1abb2ff1095c153854a6df7deae4a5709c37297f9d6e9948b6806fa66","affectsGlobalScope":true},{"version":"11ffe3c281f375fff9ffdde8bbec7669b4dd671905509079f866f2354a788064","affectsGlobalScope":true},{"version":"10bbdc1981b8d9310ee75bfac28ee0477bb2353e8529da8cff7cb26c409cb5e8","affectsGlobalScope":true},{"version":"bbdf156fea2fabed31a569445835aeedcc33643d404fcbaa54541f06c109df3f","affectsGlobalScope":true},"ea0aa24a32c073b8639aa1f3130ba0add0f0f2f76b314d9ba988a5cb91d7e3c4","6a386ff939f180ae8ef064699d8b7b6e62bc2731a62d7fbf5e02589383838dea","f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",{"version":"4c4229a7fe27b87aba0b8bab7f7338bc63e74b814156ba6925b552f9bec83154","affectsGlobalScope":true},"0dfebd7a9a889c693e40e4f6951b33aadc47d4645b53d2510bb326f444533db1","bf7e1213717faab14f8928719c2dfaeb89ba63c9ef1e7fa1c58ac4423aa9cfaa","1ec0fe7df21853aac79d4ae0479928c4922e9fadc8dd32526bffc020b865eb87","577cc19407cde5cc329b6c0771d16ed8c28aa1e9ef7c2e2b3574a49ecfe0c062","0679dab9c4565a6e3df0857d3b35cffcb2e5fe283dc165d80b599a065cf8baff","2d24cbc3ea7ce11ee415450f1e2fe9a98775dd5cbd03f5d660569e1f5e0f3fa0","db2aeb3d66f5b802acc7e87d681e472f47a137cba63c952e99d138c62b758de6"],"options":{"esModuleInterop":true,"module":99,"outDir":"./","skipLibCheck":true,"strict":true,"target":99},"fileIdsList":[[52,53,54,55],[57,58,60,61,62],[56,58,59],[56,57],[56]],"referencedMap":[[56,1],[63,2],[61,3],[58,4],[60,3],[57,5],[62,3]],"exportedModulesMap":[[56,1],[63,2],[61,3],[58,4],[60,3],[57,5],[62,3]],"semanticDiagnosticsPerFile":[54,52,56,55,53,11,12,14,13,2,15,16,17,18,19,20,21,22,3,4,26,23,24,25,27,28,29,5,30,31,32,33,6,34,35,36,37,7,42,38,39,40,41,8,46,43,44,45,47,9,48,49,50,1,10,51,63,59,61,58,60,57,62],"affectedFilesPendingEmit":[[54,1],[52,1],[56,1],[55,1],[53,1],[2,1],[3,1],[4,1],[5,1],[6,1],[7,1],[8,1],[9,1],[10,1],[63,1],[59,1],[61,1],[58,1],[60,1],[57,1],[62,1]]},"version":"4.6.4"}
@@ -0,0 +1,4 @@
1
+ declare type EventMap = WindowEventMap | DocumentEventMap | HTMLElementEventMap;
2
+ export declare type EventName<M extends EventMap> = keyof M;
3
+ export declare type EventListener<M extends EventMap, N extends EventName<M>> = (event: M[N]) => void;
4
+ export {};
@@ -0,0 +1,2 @@
1
+ import { EventListener } from './types';
2
+ export declare const useDocumentEventListener: <K extends keyof DocumentEventMap>(eventName: K, listener: EventListener<DocumentEventMap, K>) => void;
@@ -0,0 +1,3 @@
1
+ declare type Callback = (...args: any[]) => any;
2
+ export declare const useEvent: <C extends Callback>(callback: C) => C;
3
+ export {};
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { EventListener } from './types';
3
+ export declare const useEventListener: <K extends keyof HTMLElementEventMap, E extends HTMLElement>(eventName: K, listener: EventListener<HTMLElementEventMap, K>, element: React.RefObject<E>) => void;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const useIsomorphicLayoutEffect: typeof React.useEffect;
@@ -0,0 +1,2 @@
1
+ import { EventListener } from './types';
2
+ export declare const useWindowEventListener: <K extends keyof WindowEventMap>(eventName: K, listener: EventListener<WindowEventMap, K>) => void;
@@ -0,0 +1,9 @@
1
+ module.exports = {
2
+ '**/*.ts': () => 'yarn tsc --noEmit',
3
+ '**/*.{ts,js}': filenames => [
4
+ `yarn eslint --fix ${filenames.join(' ')}`,
5
+ `yarn prettier --write ${filenames.join(' ')}`,
6
+ ],
7
+ '**/*.{md,json}': filenames =>
8
+ `yarn prettier --write ${filenames.join(' ')}`,
9
+ };
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@wiggindev/hooks",
3
+ "description": "Various hooks that I use in my projects",
4
+ "version": "0.1.0",
5
+ "author": {
6
+ "name": "Andrew Wiggin",
7
+ "email": "andrew@wiggin.dev",
8
+ "url": "https://wiggin.dev"
9
+ },
10
+ "type": "module",
11
+ "source": "src/index.ts",
12
+ "exports": {
13
+ "require": "./dist/index.cjs",
14
+ "default": "./dist/index.modern.js"
15
+ },
16
+ "main": "dist/index.cjs",
17
+ "module": "dist/index.module.js",
18
+ "unpkg": "dist/index.umd.js",
19
+ "types": "dist/types.d.ts",
20
+ "scripts": {
21
+ "prebuild": "rimraf dist",
22
+ "build": "microbundle",
23
+ "dev": "microbundle watch",
24
+ "_postinstall": "husky install",
25
+ "prepack": "pinst --disable",
26
+ "postpack": "pinst --enable",
27
+ "lint": "tsc --noEmit && yarn eslint",
28
+ "format": "yarn eslint --fix && yarn prettier --write ."
29
+ },
30
+ "peerDependencies": {
31
+ "react": ">= 18"
32
+ },
33
+ "devDependencies": {
34
+ "@types/react": "^18.0.9",
35
+ "@typescript-eslint/eslint-plugin": "^5.23.0",
36
+ "@typescript-eslint/parser": "^5.23.0",
37
+ "eslint": "^8.15.0",
38
+ "eslint-config-prettier": "^8.5.0",
39
+ "eslint-plugin-prettier": "^4.0.0",
40
+ "eslint-plugin-react": "^7.29.4",
41
+ "husky": "^8.0.1",
42
+ "lint-staged": "^12.4.1",
43
+ "microbundle": "^0.15.0",
44
+ "pinst": "^3.0.0",
45
+ "prettier": "^2.6.2",
46
+ "rimraf": "^3.0.2",
47
+ "typescript": "^4.6.4"
48
+ },
49
+ "packageManager": "yarn@3.2.1",
50
+ "publishConfig": {
51
+ "access": "public",
52
+ "registry": "https://registry.npmjs.org/"
53
+ }
54
+ }
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './useIsomorphicLayoutEffect';
2
+ export * from './useEvent';
3
+ export * from './useEventListener';
4
+ export * from './useDocumentEventListener';
5
+ export * from './useWindowEventListener';
package/src/types.ts ADDED
@@ -0,0 +1,6 @@
1
+ type EventMap = WindowEventMap | DocumentEventMap | HTMLElementEventMap;
2
+
3
+ export type EventName<M extends EventMap> = keyof M;
4
+ export type EventListener<M extends EventMap, N extends EventName<M>> = (
5
+ event: M[N]
6
+ ) => void;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { useEvent } from './useEvent';
3
+ import { EventName, EventListener } from './types';
4
+
5
+ export const useDocumentEventListener = <K extends EventName<DocumentEventMap>>(
6
+ eventName: K,
7
+ listener: EventListener<DocumentEventMap, K>
8
+ ) => {
9
+ const stableListener = useEvent(listener);
10
+ React.useEffect(() => {
11
+ if (!document || !document.addEventListener) {
12
+ return;
13
+ }
14
+ document.addEventListener(eventName, stableListener);
15
+ return () => document.addEventListener(eventName, stableListener);
16
+ }, [eventName, stableListener]);
17
+ };
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';
3
+
4
+ type Callback = (...args: any[]) => any;
5
+
6
+ export const useEvent = <C extends Callback>(callback: C): C => {
7
+ const callbackRef = React.useRef(callback);
8
+ useIsomorphicLayoutEffect(() => {
9
+ callbackRef.current = callback;
10
+ });
11
+ return React.useMemo(() => callbackRef.current, []);
12
+ };
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import { useEvent } from './useEvent';
3
+ import { EventName, EventListener } from './types';
4
+
5
+ export const useEventListener = <
6
+ K extends EventName<HTMLElementEventMap>,
7
+ E extends HTMLElement
8
+ >(
9
+ eventName: K,
10
+ listener: EventListener<HTMLElementEventMap, K>,
11
+ element: React.RefObject<E>
12
+ ) => {
13
+ const stableListener = useEvent(listener);
14
+ React.useEffect(() => {
15
+ const node = element.current;
16
+ if (!node || !node.addEventListener) {
17
+ return;
18
+ }
19
+ node.addEventListener(eventName, stableListener);
20
+ return () => node.addEventListener(eventName, stableListener);
21
+ }, [element, eventName, stableListener]);
22
+ };
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+
3
+ export const useIsomorphicLayoutEffect =
4
+ typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { useEvent } from './useEvent';
3
+ import { EventName, EventListener } from './types';
4
+
5
+ export const useWindowEventListener = <K extends EventName<WindowEventMap>>(
6
+ eventName: K,
7
+ listener: EventListener<WindowEventMap, K>
8
+ ) => {
9
+ const stableListener = useEvent(listener);
10
+ React.useEffect(() => {
11
+ if (!window || !window.addEventListener) {
12
+ return;
13
+ }
14
+ window.addEventListener(eventName, stableListener);
15
+ return () => window.addEventListener(eventName, stableListener);
16
+ }, [eventName, stableListener]);
17
+ };
package/tsconfig.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "compilerOptions": {
3
+ "baseUrl": "src",
4
+ "outDir": "dist",
5
+ "module": "esnext",
6
+ "target": "esnext",
7
+ "lib": ["dom", "dom.iterable", "esnext"],
8
+ "allowJs": true,
9
+ "skipLibCheck": true,
10
+ "strict": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "noEmit": true,
13
+ "esModuleInterop": true,
14
+ "moduleResolution": "node",
15
+ "resolveJsonModule": true,
16
+ "isolatedModules": true,
17
+ "incremental": true
18
+ },
19
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
20
+ "exclude": [
21
+ "node_modules",
22
+ ".fleet",
23
+ ".yarn",
24
+ ".idea",
25
+ ".next",
26
+ ".vercel",
27
+ "dist"
28
+ ]
29
+ }