Skip to content
Snippets Groups Projects
Commit 279ddfef authored by xaralis's avatar xaralis
Browse files

feat: more stats

parent 6ad9e229
Branches
No related tags found
No related merge requests found
...@@ -1421,6 +1421,11 @@ ...@@ -1421,6 +1421,11 @@
"prop-types": "^15.7.2" "prop-types": "^15.7.2"
} }
}, },
"@rooks/use-window-size": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/@rooks/use-window-size/-/use-window-size-4.5.0.tgz",
"integrity": "sha512-numJ/GJcBezv8OdA9ahNmYywAh3HTeGFKxdChSk2kPnLZhxHBODvyx5CKolJp+8FDruIGbe36TEyqE/ZOUGcJA=="
},
"@sentry/browser": { "@sentry/browser": {
"version": "5.23.0", "version": "5.23.0",
"resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.23.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.23.0.tgz",
...@@ -3573,6 +3578,12 @@ ...@@ -3573,6 +3578,12 @@
"node-int64": "^0.4.0" "node-int64": "^0.4.0"
} }
}, },
"btoa": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
"integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
"dev": true
},
"buffer": { "buffer": {
"version": "4.9.2", "version": "4.9.2",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
...@@ -4672,6 +4683,11 @@ ...@@ -4672,6 +4683,11 @@
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
}, },
"deepmerge": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
},
"default-gateway": { "default-gateway": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
...@@ -5050,6 +5066,15 @@ ...@@ -5050,6 +5066,15 @@
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
}, },
"ejs": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.5.tgz",
"integrity": "sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w==",
"dev": true,
"requires": {
"jake": "^10.6.1"
}
},
"electron-to-chromium": { "electron-to-chromium": {
"version": "1.3.567", "version": "1.3.567",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.567.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.567.tgz",
...@@ -6243,6 +6268,15 @@ ...@@ -6243,6 +6268,15 @@
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"optional": true "optional": true
}, },
"filelist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz",
"integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==",
"dev": true,
"requires": {
"minimatch": "^3.0.4"
}
},
"filesize": { "filesize": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz",
...@@ -7651,6 +7685,26 @@ ...@@ -7651,6 +7685,26 @@
"html-escaper": "^2.0.0" "html-escaper": "^2.0.0"
} }
}, },
"jake": {
"version": "10.8.2",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz",
"integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==",
"dev": true,
"requires": {
"async": "0.9.x",
"chalk": "^2.4.2",
"filelist": "^1.0.1",
"minimatch": "^3.0.4"
},
"dependencies": {
"async": {
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
"integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
"dev": true
}
}
},
"jest": { "jest": {
"version": "24.9.0", "version": "24.9.0",
"resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz",
...@@ -8429,6 +8483,11 @@ ...@@ -8429,6 +8483,11 @@
"strip-bom": "^3.0.0" "strip-bom": "^3.0.0"
} }
}, },
"load-script": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
"integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ="
},
"loader-fs-cache": { "loader-fs-cache": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz",
...@@ -8660,6 +8719,11 @@ ...@@ -8660,6 +8719,11 @@
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
}, },
"memoize-one": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz",
"integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA=="
},
"memory-fs": { "memory-fs": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
...@@ -11308,14 +11372,6 @@ ...@@ -11308,14 +11372,6 @@
} }
} }
}, },
"react-device-detect": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/react-device-detect/-/react-device-detect-1.13.1.tgz",
"integrity": "sha512-XTPgAMsUVHC5lMNUGiAeO2UfAfhMfjq0CBUM67eHnc9XfO7iESh6h/cffKV8VGgrZBX+dyuqJl23bLLHoav5Ig==",
"requires": {
"ua-parser-js": "^0.7.21"
}
},
"react-dom": { "react-dom": {
"version": "16.13.1", "version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
...@@ -11368,6 +11424,18 @@ ...@@ -11368,6 +11424,18 @@
"warning": "^4.0.3" "warning": "^4.0.3"
} }
}, },
"react-player": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/react-player/-/react-player-2.7.2.tgz",
"integrity": "sha512-4MqikwtVAxjDlgYp5Kgnz6Uptj/VpYE4VKvg2hOXlgz4zxorsxjBUE8Y3GUY6vpolEMPjpYIxSr1CP4TNrD1WA==",
"requires": {
"deepmerge": "^4.0.0",
"load-script": "^1.0.0",
"memoize-one": "^5.1.1",
"prop-types": "^15.7.2",
"react-fast-compare": "^3.0.1"
}
},
"react-router": { "react-router": {
"version": "5.2.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz",
...@@ -12883,6 +12951,175 @@ ...@@ -12883,6 +12951,175 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
}, },
"source-map-explorer": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.1.tgz",
"integrity": "sha512-sg60PIva7pOkvTqbLRGOB3Cp84I1pial0J6tUNs/bNGIz+0+WNw37oLXEDFHTDJhFh24rto8rESv4wCB7w9HVQ==",
"dev": true,
"requires": {
"btoa": "^1.2.1",
"chalk": "^4.1.0",
"convert-source-map": "^1.7.0",
"ejs": "^3.1.5",
"escape-html": "^1.0.3",
"glob": "^7.1.6",
"gzip-size": "^6.0.0",
"lodash": "^4.17.20",
"open": "^7.3.0",
"source-map": "^0.7.3",
"temp": "^0.9.4",
"yargs": "^16.1.1"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
},
"gzip-size": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
"integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
"dev": true,
"requires": {
"duplexer": "^0.1.2"
}
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"dev": true,
"requires": {
"is-docker": "^2.0.0"
}
},
"open": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz",
"integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==",
"dev": true,
"requires": {
"is-docker": "^2.0.0",
"is-wsl": "^2.1.1"
}
},
"source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"dev": true
},
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
"ansi-regex": "^5.0.0"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
}
},
"y18n": {
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
"integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
"dev": true
},
"yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
"requires": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
}
},
"yargs-parser": {
"version": "20.2.4",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
"dev": true
}
}
},
"source-map-resolve": { "source-map-resolve": {
"version": "0.5.3", "version": "0.5.3",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
...@@ -13468,6 +13705,16 @@ ...@@ -13468,6 +13705,16 @@
"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
}, },
"temp": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz",
"integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
"dev": true,
"requires": {
"mkdirp": "^0.5.1",
"rimraf": "~2.6.2"
}
},
"terser": { "terser": {
"version": "4.8.0", "version": "4.8.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
...@@ -13843,11 +14090,6 @@ ...@@ -13843,11 +14090,6 @@
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
}, },
"ua-parser-js": {
"version": "0.7.22",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz",
"integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q=="
},
"unfetch": { "unfetch": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz",
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
"private": true, "private": true,
"dependencies": { "dependencies": {
"@react-keycloak/web": "^2.1.4", "@react-keycloak/web": "^2.1.4",
"@rooks/use-window-size": "^4.5.0",
"@sentry/react": "^5.23.0", "@sentry/react": "^5.23.0",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"date-fns": "^2.16.1", "date-fns": "^2.16.1",
...@@ -12,11 +13,11 @@ ...@@ -12,11 +13,11 @@
"lodash": "^4.17.20", "lodash": "^4.17.20",
"pullstate": "^1.20.5", "pullstate": "^1.20.5",
"react": "^16.13.1", "react": "^16.13.1",
"react-device-detect": "^1.13.1",
"react-dom": "^16.13.1", "react-dom": "^16.13.1",
"react-intersection-observer": "^8.31.0", "react-intersection-observer": "^8.31.0",
"react-mde": "^11.0.0", "react-mde": "^11.0.0",
"react-modal": "^3.12.1", "react-modal": "^3.12.1",
"react-player": "^2.7.2",
"react-router-dom": "^5.2.0", "react-router-dom": "^5.2.0",
"react-scripts": "3.4.3", "react-scripts": "3.4.3",
"showdown": "^1.9.1", "showdown": "^1.9.1",
...@@ -30,7 +31,8 @@ ...@@ -30,7 +31,8 @@
"test": "react-scripts test --env=jsdom-fourteen", "test": "react-scripts test --env=jsdom-fourteen",
"eject": "react-scripts eject", "eject": "react-scripts eject",
"lint": "eslint --cache 'src/**/*.{js,jsx}'", "lint": "eslint --cache 'src/**/*.{js,jsx}'",
"lint:fix": "eslint --cache --fix 'src/**/*.{js,jsx}'" "lint:fix": "eslint --cache --fix 'src/**/*.{js,jsx}'",
"analyze": "source-map-explorer 'build/static/js/*.js'"
}, },
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [
...@@ -120,6 +122,7 @@ ...@@ -120,6 +122,7 @@
"eslint-plugin-react": "^7.20.6", "eslint-plugin-react": "^7.20.6",
"eslint-plugin-simple-import-sort": "^5.0.3", "eslint-plugin-simple-import-sort": "^5.0.3",
"eslint-plugin-testing-library": "^3.8.0", "eslint-plugin-testing-library": "^3.8.0",
"prettier": "^2.1.1" "prettier": "^2.1.1",
"source-map-explorer": "^2.5.1"
} }
} }
import React, { useCallback, useState } from "react"; import React, { useCallback, useState } from "react";
import { isBrowser } from "react-device-detect";
import { NavLink } from "react-router-dom"; import { NavLink } from "react-router-dom";
import { useKeycloak } from "@react-keycloak/web"; import { useKeycloak } from "@react-keycloak/web";
import useWindowSize from "@rooks/use-window-size";
import classNames from "classnames";
import Button from "components/Button"; import Button from "components/Button";
import { AuthStore } from "stores"; import { AuthStore, GlobalInfoStore } from "stores";
const Navbar = () => { const Navbar = () => {
const [showMenu, setShowMenu] = useState(isBrowser); const { innerWidth } = useWindowSize();
const [showMenu, setShowMenu] = useState();
const { keycloak } = useKeycloak(); const { keycloak } = useKeycloak();
const { isAuthenticated, user } = AuthStore.useState(); const { isAuthenticated, user } = AuthStore.useState();
const { connectionState } = GlobalInfoStore.useState();
const login = useCallback(() => { const login = useCallback(() => {
keycloak.login(); keycloak.login();
...@@ -18,6 +21,40 @@ const Navbar = () => { ...@@ -18,6 +21,40 @@ const Navbar = () => {
keycloak.logout(); keycloak.logout();
}, [keycloak]); }, [keycloak]);
const connectionStateCaption = {
connected: "Jste online",
offline: "Jste offline",
connecting: "Probíhá připojování",
}[connectionState];
const isLg = innerWidth >= 1024;
const indicatorClass = {
"bg-green-400": connectionState === "connected",
"bg-red-600": connectionState === "offline",
"bg-yellow-200": connectionState === "connecting",
};
const connectionIndicator = (
<span
className="relative inline-flex h-4 w-4 mr-4"
title={connectionStateCaption}
>
<span
className={classNames(
"animate-ping absolute inline-flex h-full w-full rounded-full opacity-75",
indicatorClass
)}
/>
<span
className={classNames(
"inline-flex rounded-full w-4 h-4",
indicatorClass
)}
/>
</span>
);
return ( return (
<nav className="navbar navbar--simple"> <nav className="navbar navbar--simple">
<div className="container container--wide navbar__content navbar__content--initialized"> <div className="container container--wide navbar__content navbar__content--initialized">
...@@ -44,7 +81,7 @@ const Navbar = () => { ...@@ -44,7 +81,7 @@ const Navbar = () => {
<i className="ico--menu text-3xl"></i> <i className="ico--menu text-3xl"></i>
</button> </button>
</div> </div>
{showMenu && ( {(showMenu || isLg) && (
<> <>
<div className="navbar__main navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto"> <div className="navbar__main navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto">
<ul className="navbar-menu text-white"> <ul className="navbar-menu text-white">
...@@ -60,7 +97,8 @@ const Navbar = () => { ...@@ -60,7 +97,8 @@ const Navbar = () => {
</li> </li>
</ul> </ul>
</div> </div>
<div className="navbar__actions navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto self-start flex flex-col sm:flex-row lg:flex-col sm:space-x-4 space-y-2 sm:space-y-0 lg:space-y-2 xl:flex-row xl:space-x-2 xl:space-y-0"> <div className="navbar__actions navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto self-start flex flex-row items-center">
{connectionIndicator}
{!isAuthenticated && ( {!isAuthenticated && (
<Button className="btn--white" onClick={login}> <Button className="btn--white" onClick={login}>
Přihlásit se Přihlásit se
......
import React from "react";
import { Link } from "react-router-dom";
import { format, isToday } from "date-fns";
import { GlobalInfoStore, ProgramStore } from "stores";
const GlobalStats = () => {
const { onlineUsers, onlineMembers } = GlobalInfoStore.useState();
const { currentId, scheduleIds, items } = ProgramStore.useState();
const nextProgramEntryId = scheduleIds
? scheduleIds[currentId ? scheduleIds.indexOf(currentId) + 1 : 0]
: null;
const nextProgramEntry = nextProgramEntryId
? items[nextProgramEntryId]
: null;
return (
<div className="bg-grey-50 flex space-x-4 leading-normal px-4 py-2 text-xs md:text-sm text-grey-300">
<div>
<strong>{onlineMembers}</strong> <span>členů online</span>
</div>
<div>
<strong>{onlineUsers}</strong> <span>online celkem</span>
</div>
{nextProgramEntry && (
<div className="flex-grow text-right hidden sm:block">
Následuje:{" "}
<Link to="/program" className="font-bold">
{nextProgramEntry.title} @{" "}
{format(
nextProgramEntry.expectedStartAt,
isToday(nextProgramEntry.expectedStartAt)
? "H:mm"
: "dd. MM. H:mm"
)}
</Link>
</div>
)}
</div>
);
};
export default GlobalStats;
import React from "react";
import classNames from "classnames";
import { Card, CardBody } from "components/cards";
import { GlobalInfoStore } from "stores";
const StatsCard = () => {
const { connectionState, onlineUsers } = GlobalInfoStore.useState();
const connectionIndicator = (
<div
className={classNames("inline-block rounded-full w-4 h-4 mr-2", {
"bg-green-400": connectionState === "connected",
"bg-red-600": connectionState === "offline",
"bg-yellow-200": connectionState === "connecting",
})}
/>
);
return (
<Card>
<CardBody className="leading-normal">
<div className="flex justify-between">
<span>Stav vašeho připojení</span>
<div className="flex items-center">
{connectionIndicator}
<strong>
{connectionState === "connected" && "on-line"}
{connectionState === "offline" && "off-line"}
{connectionState === "connecting" && "připojování"}
</strong>
</div>
</div>
<div className="flex justify-between">
<span>Počet on-line účastníků</span>
<strong>{onlineUsers}</strong>
</div>
</CardBody>
</Card>
);
};
export default StatsCard;
import React, { useState } from "react"; import React, { useState } from "react";
import ReactPlayer from "react-player/lazy";
import { format } from "date-fns"; import { format } from "date-fns";
import { import {
...@@ -15,9 +16,9 @@ import ProgramEntryEditModal from "components/program/ProgramEntryEditModal"; ...@@ -15,9 +16,9 @@ import ProgramEntryEditModal from "components/program/ProgramEntryEditModal";
import AddAnnouncementForm from "containers/AddAnnouncementForm"; import AddAnnouncementForm from "containers/AddAnnouncementForm";
import AddPostForm from "containers/AddPostForm"; import AddPostForm from "containers/AddPostForm";
import AnnouncementsContainer from "containers/AnnoucementsContainer"; import AnnouncementsContainer from "containers/AnnoucementsContainer";
import GlobalStats from "containers/GlobalStats";
import PostFilters from "containers/PostFilters"; import PostFilters from "containers/PostFilters";
import PostsContainer from "containers/PostsContainer"; import PostsContainer from "containers/PostsContainer";
import StatsCard from "containers/StatsCard";
import { useActionConfirm } from "hooks"; import { useActionConfirm } from "hooks";
import { AuthStore, GlobalInfoStore, ProgramStore } from "stores"; import { AuthStore, GlobalInfoStore, ProgramStore } from "stores";
...@@ -153,13 +154,13 @@ const Home = () => { ...@@ -153,13 +154,13 @@ const Home = () => {
return ( return (
<> <>
<article className="container container--wide pt-8 lg:py-24 cf2021"> <article className="container container--wide pt-8 lg:py-24 cf2021">
<section className="cf2021__video space-y-8"> <section className="cf2021__video">
<div className="flex items-center justify-between mb-4 lg:mb-8"> <div className="flex justify-between mb-4 lg:mb-8">
<h1 className="head-alt-md lg:head-alt-lg mb-0"> <h1 className="head-alt-md lg:head-alt-lg">
Bod č. {programEntry.number}: {programEntry.title} Bod č. {programEntry.number}: {programEntry.title}
</h1> </h1>
{displayActions && ( {displayActions && (
<DropdownMenu right triggerSize="lg" className="pl-4"> <DropdownMenu right triggerSize="lg" className="pl-4 pt-5">
<DropdownMenuItem <DropdownMenuItem
onClick={() => setShowProgramEditModal(true)} onClick={() => setShowProgramEditModal(true)}
icon="ico--edit-pencil" icon="ico--edit-pencil"
...@@ -196,16 +197,15 @@ const Home = () => { ...@@ -196,16 +197,15 @@ const Home = () => {
)} )}
</div> </div>
<div className="container-padding--zero md:container-padding--auto">
{streamUrl && ( {streamUrl && (
<div className="iframe-container"> <div className="iframe-container">
<iframe <ReactPlayer
width="560" url={streamUrl}
height="315"
src={streamUrl}
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen=""
title="Video stream" title="Video stream"
controls={true}
playing={false}
width="100%"
/> />
</div> </div>
)} )}
...@@ -215,10 +215,8 @@ const Home = () => { ...@@ -215,10 +215,8 @@ const Home = () => {
aktualizaci. aktualizaci.
</p> </p>
)} )}
</section> <GlobalStats />
</div>
<section className="cf2021__stats">
<StatsCard />
</section> </section>
<section className="cf2021__notifications"> <section className="cf2021__notifications">
......
...@@ -60,7 +60,8 @@ const Schedule = () => { ...@@ -60,7 +60,8 @@ const Schedule = () => {
</div> </div>
<div className="flex-grow w-full"> <div className="flex-grow w-full">
<h2 className="head-heavy-xs md:head-heavy-base mb-1"> <h2 className="head-heavy-xs md:head-heavy-base mb-1">
<Link to="/">{entry.title}</Link> {isCurrent && <Link to="/">{entry.title}</Link>}
{!isCurrent && entry.title}
</h2> </h2>
<div className="flex space-x-2"> <div className="flex space-x-2">
<strong>Navrhovatel:</strong> <strong>Navrhovatel:</strong>
......
...@@ -4,6 +4,7 @@ import { Store } from "pullstate"; ...@@ -4,6 +4,7 @@ import { Store } from "pullstate";
/** @type {CF2021.GlobalInfoStorePayload} */ /** @type {CF2021.GlobalInfoStorePayload} */
const globalInfoStoreInitial = { const globalInfoStoreInitial = {
connectionState: "connecting", connectionState: "connecting",
onlineMembers: 0,
onlineUsers: 0, onlineUsers: 0,
streamUrl: null, streamUrl: null,
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment