versionCheck.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import ApolloClient, { gql } from "apollo-boost"
  2. import React from "react"
  3. import ReactDOM from "react-dom"
  4. import { ApolloProvider, Query } from "react-apollo"
  5. const initVersionCheck = ({ elementId, errorMessage, loadingMessage, uri }) => {
  6. const element = document.getElementById(elementId)
  7. if (!element) console.error("Element with id " + element + "doesn't exist!")
  8. const client = new ApolloClient({
  9. credentials: "same-origin",
  10. uri: uri
  11. })
  12. ReactDOM.render(
  13. <ApolloProvider client={client}>
  14. <VersionCheck
  15. errorMessage={errorMessage}
  16. loadingMessage={loadingMessage}
  17. />
  18. </ApolloProvider>,
  19. element
  20. )
  21. }
  22. const getVersion = gql`
  23. query getVersion {
  24. version {
  25. status
  26. message
  27. description
  28. }
  29. }
  30. `
  31. const VersionCheck = ({ errorMessage, loadingMessage }) => {
  32. return (
  33. <Query query={getVersion}>
  34. {({ loading, error, data }) => {
  35. if (loading) return <Spinner {...loadingMessage} />
  36. if (error) return <Error {...errorMessage} />
  37. return <CheckMessage {...data.version} />
  38. }}
  39. </Query>
  40. )
  41. }
  42. const Spinner = ({ description, message }) => (
  43. <div className="media media-admin-check">
  44. <div className="media-check-icon">
  45. <div className="spinner-border" role="status">
  46. <span className="sr-only">Loading...</span>
  47. </div>
  48. </div>
  49. <div className="media-body">
  50. <h5>{message}</h5>
  51. {description}
  52. </div>
  53. </div>
  54. )
  55. const Error = ({ description, message }) => (
  56. <div className="media media-admin-check">
  57. <div className="media-check-icon media-check-icon-danger">
  58. <span className="fas fa-times" />
  59. </div>
  60. <div className="media-body">
  61. <h5>{message}</h5>
  62. {description}
  63. </div>
  64. </div>
  65. )
  66. const CheckMessage = ({ description, message, status }) => (
  67. <div className="media media-admin-check">
  68. <CheckIcon status={status} />
  69. <div className="media-body">
  70. <h5>{message}</h5>
  71. {description}
  72. </div>
  73. </div>
  74. )
  75. const CheckIcon = ({ status }) => {
  76. let className = "media-check-icon media-check-icon-"
  77. if (status === "SUCCESS") className += "success"
  78. if (status === "WARNING") className += "warning"
  79. if (status === "ERROR") className += "danger"
  80. return (
  81. <div className={className}>
  82. <CheckIconImage status={status} />
  83. </div>
  84. )
  85. }
  86. const CheckIconImage = ({ status }) => {
  87. if (status === "SUCCESS") return <span className="fas fa-check" />
  88. if (status === "WARNING") return <span className="fas fa-question" />
  89. if (status === "ERROR") return <span className="fas fa-times" />
  90. return null
  91. }
  92. export default initVersionCheck