_document.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import React from "react";
  2. import Document, { Head, Main, NextScript } from "next/document";
  3. import { ServerStyleSheet } from "styled-components";
  4. import { Colors } from "../consts";
  5. interface Props {
  6. styleTags: any;
  7. }
  8. class AppDocument extends Document<Props> {
  9. static getInitialProps({ renderPage }) {
  10. const sheet = new ServerStyleSheet();
  11. const page = renderPage(App => props =>
  12. sheet.collectStyles(<App {...props} />)
  13. );
  14. const styleTags = sheet.getStyleElement();
  15. return { ...page, styleTags };
  16. }
  17. render() {
  18. return (
  19. <html lang="en">
  20. <Head>
  21. <meta charSet="utf-8" />
  22. <meta
  23. name="viewport"
  24. content="width=device-width, initial-scale=1, viewport-fit=cover"
  25. />
  26. <meta
  27. name="description"
  28. content={`${process.env.SITE_NAME} is a free and open source URL shortener with custom domains and stats.`}
  29. />
  30. <link
  31. href="https://fonts.googleapis.com/css?family=Nunito:300,400,700"
  32. rel="stylesheet"
  33. />
  34. <link rel="icon" sizes="196x196" href="/images/favicon-196x196.png" />
  35. <link rel="icon" sizes="32x32" href="/images/favicon-32x32.png" />
  36. <link rel="icon" sizes="16x16" href="/images/favicon-16x16.png" />
  37. <link rel="apple-touch-icon" href="/images/favicon-196x196.png" />
  38. <link rel="mask-icon" href="/images/icon.svg" color="blue" />
  39. <link rel="manifest" href="manifest.webmanifest" />
  40. <meta name="theme-color" content="#f3f3f3" />
  41. <meta property="fb:app_id" content="123456789" />
  42. <meta
  43. property="og:url"
  44. content={`https://${process.env.DEFAULT_DOMAIN}`}
  45. />
  46. <meta property="og:type" content="website" />
  47. <meta property="og:title" content={process.env.SITE_NAME} />
  48. <meta
  49. property="og:image"
  50. content={`https://${process.env.DEFAULT_DOMAIN}/images/card.png`}
  51. />
  52. <meta
  53. property="og:description"
  54. content="Free & Open Source Modern URL Shortener"
  55. />
  56. <meta
  57. name="twitter:url"
  58. content={`https://${process.env.DEFAULT_DOMAIN}`}
  59. />
  60. <meta name="twitter:title" content={process.env.SITE_NAME} />
  61. <meta
  62. name="twitter:description"
  63. content="Free & Open Source Modern URL Shortener"
  64. />
  65. <meta
  66. name="twitter:image"
  67. content={`https://${process.env.DEFAULT_DOMAIN}/images/card.png`}
  68. />
  69. {this.props.styleTags}
  70. <script
  71. dangerouslySetInnerHTML={{
  72. __html: `window.recaptchaCallback = function() { window.isCaptchaReady = true; }`
  73. }}
  74. />
  75. <script
  76. src="https://www.google.com/recaptcha/api.js?render=explicit"
  77. async
  78. defer
  79. />
  80. </Head>
  81. <body
  82. style={{
  83. margin: 0,
  84. backgroundColor: Colors.Bg,
  85. font: '16px/1.45 "Nunito", sans-serif',
  86. overflowX: "hidden",
  87. color: Colors.Text
  88. }}
  89. >
  90. <Main />
  91. <NextScript />
  92. </body>
  93. </html>
  94. );
  95. }
  96. }
  97. export default AppDocument;