@wiggindev/hooks 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }