add scroll to component
This commit is contained in:
		
							
								
								
									
										60
									
								
								components/ScrollTopAndComment.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								components/ScrollTopAndComment.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| import { useEffect, useState } from 'react' | ||||
| import smoothscroll from 'smoothscroll-polyfill' | ||||
|  | ||||
| const ScrollTopAndComment = () => { | ||||
|   const [show, setShow] = useState(false) | ||||
|  | ||||
|   useEffect(() => { | ||||
|     smoothscroll.polyfill() | ||||
|     const handleWindowScroll = () => { | ||||
|       if (window.scrollY > 50) setShow(true) | ||||
|       else setShow(false) | ||||
|     } | ||||
|  | ||||
|     window.addEventListener('scroll', handleWindowScroll) | ||||
|     return () => window.removeEventListener('scroll', handleWindowScroll) | ||||
|   }, []) | ||||
|  | ||||
|   const handleScrollTop = () => { | ||||
|     window.scrollTo({ top: 0, behavior: 'smooth' }) | ||||
|   } | ||||
|   const handleScrollToComment = () => { | ||||
|     document.getElementById('comment').scrollIntoView() | ||||
|   } | ||||
|   return ( | ||||
|     <div className="fixed flex-col hidden gap-3 right-8 bottom-8 md:flex"> | ||||
|       <button | ||||
|         aria-label="Scroll To Comment" | ||||
|         type="button" | ||||
|         onClick={handleScrollToComment} | ||||
|         style={{ opacity: show ? 1 : 0 }} | ||||
|         className="p-2 text-gray-500 transition-all bg-gray-200 rounded-full dark:text-gray-400 dark:bg-gray-700 dark:hover:bg-gray-600 hover:bg-gray-300" | ||||
|       > | ||||
|         <svg className="w-5 h-5" viewBox="0 0 20 20" fill="currentColor"> | ||||
|           <path | ||||
|             fillRule="evenodd" | ||||
|             d="M18 10c0 3.866-3.582 7-8 7a8.841 8.841 0 01-4.083-.98L2 17l1.338-3.123C2.493 12.767 2 11.434 2 10c0-3.866 3.582-7 8-7s8 3.134 8 7zM7 9H5v2h2V9zm8 0h-2v2h2V9zM9 9h2v2H9V9z" | ||||
|             clipRule="evenodd" | ||||
|           /> | ||||
|         </svg> | ||||
|       </button> | ||||
|       <button | ||||
|         aria-label="Scroll To Top" | ||||
|         type="button" | ||||
|         onClick={handleScrollTop} | ||||
|         style={{ opacity: show ? 1 : 0 }} | ||||
|         className="p-2 text-gray-500 transition-all bg-gray-200 rounded-full dark:text-gray-400 dark:bg-gray-700 dark:hover:bg-gray-600 hover:bg-gray-300" | ||||
|       > | ||||
|         <svg className="w-5 h-5" viewBox="0 0 20 20" fill="currentColor"> | ||||
|           <path | ||||
|             fillRule="evenodd" | ||||
|             d="M3.293 9.707a1 1 0 010-1.414l6-6a1 1 0 011.414 0l6 6a1 1 0 01-1.414 1.414L11 5.414V17a1 1 0 11-2 0V5.414L4.707 9.707a1 1 0 01-1.414 0z" | ||||
|             clipRule="evenodd" | ||||
|           /> | ||||
|         </svg> | ||||
|       </button> | ||||
|     </div> | ||||
|   ) | ||||
| } | ||||
|  | ||||
| export default ScrollTopAndComment | ||||
| @@ -37,7 +37,7 @@ const Comments = ({ frontMatter }) => { | ||||
|       break | ||||
|   } | ||||
|   return ( | ||||
|     <> | ||||
|     <div id="comment"> | ||||
|       {siteMetadata.comment && siteMetadata.comment.provider === 'giscus' && ( | ||||
|         <GiscusComponent mapping={term} /> | ||||
|       )} | ||||
| @@ -47,7 +47,7 @@ const Comments = ({ frontMatter }) => { | ||||
|       {siteMetadata.comment && siteMetadata.comment.provider === 'disqus' && ( | ||||
|         <DisqusComponent frontMatter={frontMatter} /> | ||||
|       )} | ||||
|     </> | ||||
|     </div> | ||||
|   ) | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import Image from '@/components/Image' | ||||
| import Tag from '@/components/Tag' | ||||
| import siteMetadata from '@/data/siteMetadata' | ||||
| import Comments from '@/components/comments' | ||||
| import ScrollTopAndComment from '@/components/ScrollTopAndComment' | ||||
|  | ||||
| const editUrl = (fileName) => `${siteMetadata.siteRepo}/blob/master/data/blog/${fileName}` | ||||
| const discussUrl = (slug) => | ||||
| @@ -25,6 +26,7 @@ export default function PostLayout({ frontMatter, authorDetails, next, prev, chi | ||||
|         authorDetails={authorDetails} | ||||
|         {...frontMatter} | ||||
|       /> | ||||
|       <ScrollTopAndComment /> | ||||
|       <article> | ||||
|         <div className="xl:divide-y xl:divide-gray-200 xl:dark:divide-gray-700"> | ||||
|           <header className="pt-6 xl:pb-6"> | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import { BlogSEO } from '@/components/SEO' | ||||
| import siteMetadata from '@/data/siteMetadata' | ||||
| import formatDate from '@/lib/utils/formatDate' | ||||
| import Comments from '@/components/comments' | ||||
| import ScrollTopAndComment from '@/components/ScrollTopAndComment' | ||||
|  | ||||
| export default function PostLayout({ frontMatter, authorDetails, next, prev, children }) { | ||||
|   const { date, title } = frontMatter | ||||
| @@ -12,6 +13,7 @@ export default function PostLayout({ frontMatter, authorDetails, next, prev, chi | ||||
|   return ( | ||||
|     <SectionContainer> | ||||
|       <BlogSEO url={`${siteMetadata.siteUrl}/blog/${frontMatter.slug}`} {...frontMatter} /> | ||||
|       <ScrollTopAndComment /> | ||||
|       <article> | ||||
|         <div> | ||||
|           <header> | ||||
|   | ||||
							
								
								
									
										133
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										133
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "tailwind-nextjs-starter-blog", | ||||
|   "version": "1.1.1", | ||||
|   "version": "1.1.2", | ||||
|   "lockfileVersion": 1, | ||||
|   "requires": true, | ||||
|   "dependencies": { | ||||
| @@ -1279,6 +1279,15 @@ | ||||
|       "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "@mailchimp/mailchimp_marketing": { | ||||
|       "version": "3.0.64", | ||||
|       "resolved": "https://registry.npmjs.org/@mailchimp/mailchimp_marketing/-/mailchimp_marketing-3.0.64.tgz", | ||||
|       "integrity": "sha512-L8qnnuHUkiV8j58Rx6QMsi8UY393Hswn29bT2j9xVFnsVGHupDz2ATg7O/8mKzptXW6Jg/Ik2vmarfpp7bOpEg==", | ||||
|       "requires": { | ||||
|         "dotenv": "^8.2.0", | ||||
|         "superagent": "3.8.1" | ||||
|       } | ||||
|     }, | ||||
|     "@napi-rs/triples": { | ||||
|       "version": "1.0.3", | ||||
|       "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz", | ||||
| @@ -2112,6 +2121,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/astring/-/astring-1.7.5.tgz", | ||||
|       "integrity": "sha512-lobf6RWXb8c4uZ7Mdq0U12efYmpD1UFnyOWVJPTa3ukqZrMopav+2hdNu0hgBF0JIBFK9QgrBDfwYvh3DFJDAA==" | ||||
|     }, | ||||
|     "asynckit": { | ||||
|       "version": "0.4.0", | ||||
|       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", | ||||
|       "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" | ||||
|     }, | ||||
|     "autoprefixer": { | ||||
|       "version": "10.3.1", | ||||
|       "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.1.tgz", | ||||
| @@ -2730,6 +2744,14 @@ | ||||
|       "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", | ||||
|       "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==" | ||||
|     }, | ||||
|     "combined-stream": { | ||||
|       "version": "1.0.8", | ||||
|       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", | ||||
|       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", | ||||
|       "requires": { | ||||
|         "delayed-stream": "~1.0.0" | ||||
|       } | ||||
|     }, | ||||
|     "comma-separated-tokens": { | ||||
|       "version": "2.0.2", | ||||
|       "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", | ||||
| @@ -2745,6 +2767,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", | ||||
|       "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" | ||||
|     }, | ||||
|     "component-emitter": { | ||||
|       "version": "1.3.0", | ||||
|       "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", | ||||
|       "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" | ||||
|     }, | ||||
|     "concat-map": { | ||||
|       "version": "0.0.1", | ||||
|       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", | ||||
| @@ -2815,6 +2842,11 @@ | ||||
|       "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", | ||||
|       "dev": true | ||||
|     }, | ||||
|     "cookiejar": { | ||||
|       "version": "2.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", | ||||
|       "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" | ||||
|     }, | ||||
|     "core-js-compat": { | ||||
|       "version": "3.16.1", | ||||
|       "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.1.tgz", | ||||
| @@ -3135,6 +3167,11 @@ | ||||
|       "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", | ||||
|       "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" | ||||
|     }, | ||||
|     "delayed-stream": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | ||||
|       "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" | ||||
|     }, | ||||
|     "delegates": { | ||||
|       "version": "1.0.0", | ||||
|       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", | ||||
| @@ -3259,6 +3296,11 @@ | ||||
|         "domelementtype": "1" | ||||
|       } | ||||
|     }, | ||||
|     "dotenv": { | ||||
|       "version": "8.6.0", | ||||
|       "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", | ||||
|       "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" | ||||
|     }, | ||||
|     "duplexer": { | ||||
|       "version": "0.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", | ||||
| @@ -4384,11 +4426,26 @@ | ||||
|       "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", | ||||
|       "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" | ||||
|     }, | ||||
|     "form-data": { | ||||
|       "version": "2.5.1", | ||||
|       "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", | ||||
|       "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", | ||||
|       "requires": { | ||||
|         "asynckit": "^0.4.0", | ||||
|         "combined-stream": "^1.0.6", | ||||
|         "mime-types": "^2.1.12" | ||||
|       } | ||||
|     }, | ||||
|     "format": { | ||||
|       "version": "0.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", | ||||
|       "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" | ||||
|     }, | ||||
|     "formidable": { | ||||
|       "version": "1.2.2", | ||||
|       "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", | ||||
|       "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" | ||||
|     }, | ||||
|     "forwarded": { | ||||
|       "version": "0.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", | ||||
| @@ -6187,8 +6244,7 @@ | ||||
|     "methods": { | ||||
|       "version": "1.1.2", | ||||
|       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", | ||||
|       "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", | ||||
|       "dev": true | ||||
|       "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" | ||||
|     }, | ||||
|     "micromark": { | ||||
|       "version": "3.0.3", | ||||
| @@ -6629,14 +6685,12 @@ | ||||
|     "mime-db": { | ||||
|       "version": "1.49.0", | ||||
|       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", | ||||
|       "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", | ||||
|       "dev": true | ||||
|       "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" | ||||
|     }, | ||||
|     "mime-types": { | ||||
|       "version": "2.1.32", | ||||
|       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", | ||||
|       "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", | ||||
|       "dev": true, | ||||
|       "requires": { | ||||
|         "mime-db": "1.49.0" | ||||
|       } | ||||
| @@ -7872,8 +7926,7 @@ | ||||
|     "qs": { | ||||
|       "version": "6.7.0", | ||||
|       "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", | ||||
|       "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", | ||||
|       "dev": true | ||||
|       "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" | ||||
|     }, | ||||
|     "querystring": { | ||||
|       "version": "0.2.1", | ||||
| @@ -8781,6 +8834,11 @@ | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "smoothscroll-polyfill": { | ||||
|       "version": "0.4.4", | ||||
|       "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", | ||||
|       "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==" | ||||
|     }, | ||||
|     "source-map": { | ||||
|       "version": "0.8.0-beta.0", | ||||
|       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", | ||||
| @@ -9097,6 +9155,65 @@ | ||||
|       "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", | ||||
|       "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" | ||||
|     }, | ||||
|     "superagent": { | ||||
|       "version": "3.8.1", | ||||
|       "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.1.tgz", | ||||
|       "integrity": "sha512-VMBFLYgFuRdfeNQSMLbxGSLfmXL/xc+OO+BZp41Za/NRDBet/BNbkRJrYzCUu0u4GU0i/ml2dtT8b9qgkw9z6Q==", | ||||
|       "requires": { | ||||
|         "component-emitter": "^1.2.0", | ||||
|         "cookiejar": "^2.1.0", | ||||
|         "debug": "^3.1.0", | ||||
|         "extend": "^3.0.0", | ||||
|         "form-data": "^2.3.1", | ||||
|         "formidable": "^1.1.1", | ||||
|         "methods": "^1.1.1", | ||||
|         "mime": "^1.4.1", | ||||
|         "qs": "^6.5.1", | ||||
|         "readable-stream": "^2.0.5" | ||||
|       }, | ||||
|       "dependencies": { | ||||
|         "debug": { | ||||
|           "version": "3.2.7", | ||||
|           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", | ||||
|           "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", | ||||
|           "requires": { | ||||
|             "ms": "^2.1.1" | ||||
|           } | ||||
|         }, | ||||
|         "mime": { | ||||
|           "version": "1.6.0", | ||||
|           "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", | ||||
|           "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" | ||||
|         }, | ||||
|         "readable-stream": { | ||||
|           "version": "2.3.7", | ||||
|           "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | ||||
|           "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", | ||||
|           "requires": { | ||||
|             "core-util-is": "~1.0.0", | ||||
|             "inherits": "~2.0.3", | ||||
|             "isarray": "~1.0.0", | ||||
|             "process-nextick-args": "~2.0.0", | ||||
|             "safe-buffer": "~5.1.1", | ||||
|             "string_decoder": "~1.1.1", | ||||
|             "util-deprecate": "~1.0.1" | ||||
|           } | ||||
|         }, | ||||
|         "safe-buffer": { | ||||
|           "version": "5.1.2", | ||||
|           "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||||
|           "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||||
|         }, | ||||
|         "string_decoder": { | ||||
|           "version": "1.1.1", | ||||
|           "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", | ||||
|           "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | ||||
|           "requires": { | ||||
|             "safe-buffer": "~5.1.0" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     "supports-color": { | ||||
|       "version": "5.5.0", | ||||
|       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", | ||||
|   | ||||
| @@ -36,6 +36,7 @@ | ||||
|     "remark-gfm": "^2.0.0", | ||||
|     "remark-math": "^5.0.0", | ||||
|     "sharp": "^0.28.3", | ||||
|     "smoothscroll-polyfill": "^0.4.4", | ||||
|     "tailwindcss": "^2.2.2", | ||||
|     "unist-util-visit": "^4.0.0" | ||||
|   }, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user