index.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. //import initialData from '../initial-data'
  2. import { usePublishedTrainingsQuery } from '../src/gql'
  3. import { Training, TrainingArchive } from '../src/training'
  4. import { Page } from '../src/app'
  5. import { useState, useEffect } from 'react'
  6. import { TTraining } from '../src/training/types'
  7. import TrainingProgram from '../src/training/components/TrainingProgram'
  8. import TrainingMeta from '../src/training/components/TrainingMeta'
  9. import theme from '../src/styles/theme'
  10. import { formatTime, calculateDuration } from '../src/training/utils'
  11. const Home = () => {
  12. const { data, error, loading } = usePublishedTrainingsQuery()
  13. const [training, setTraining] = useState<undefined | TTraining>()
  14. useEffect(() => {
  15. if (data?.publishedTrainings && data.publishedTrainings.length > 0) {
  16. setTraining(data.publishedTrainings[0])
  17. }
  18. }, [data])
  19. return (
  20. <Page>
  21. <section className='next-training'>
  22. {training ? (
  23. <>
  24. <h1 className='training-title'>{training.title}</h1>
  25. <TrainingMeta training={training} />
  26. <TrainingProgram training={training} />
  27. </>
  28. ) : null}
  29. <TrainingArchive />
  30. <style jsx>
  31. {`
  32. .next-training {
  33. padding: 1em 0.3em;
  34. }
  35. .training-title {
  36. grid-area: title;
  37. margin: 0.3em 0;
  38. padding: 0;
  39. font-size: 3.4rem;
  40. font-weight: 300;
  41. text-transform: uppercase;
  42. color: ${theme.colors.blue};
  43. padding: 0;
  44. margin: 0.3em 0;
  45. position: relative;
  46. }
  47. .training-title::before {
  48. content: 'your next training:';
  49. text-transform: none;
  50. font-weight: 900;
  51. font-size: 1.1rem;
  52. display: block;
  53. position: absolute;
  54. top: -1rem;
  55. left: 01rem;
  56. color: ${theme.colors.darkerblue};
  57. }
  58. :global(.training-program) {
  59. grid-area: program;
  60. }
  61. :global(.training-archive) {
  62. grid-area: archive;
  63. }
  64. :global(.training-meta) {
  65. grid-area: info;
  66. }
  67. @media (min-width: 600px) {
  68. .next-training {
  69. display: grid;
  70. grid-template-columns: 1fr auto;
  71. grid-template-areas:
  72. 'title info'
  73. 'program program'
  74. 'archive archive';
  75. column-gap: 1em;
  76. padding: 2em 3em;
  77. }
  78. }
  79. @media (min-width: 1024px) {
  80. .next-training {
  81. display: grid;
  82. grid-template-columns: 2fr 1fr;
  83. grid-template-rows: auto 1fr auto;
  84. grid-template-areas:
  85. 'title program'
  86. 'info program'
  87. 'archive program';
  88. column-gap: 2em;
  89. padding: 2em 3em;
  90. }
  91. .training-title {
  92. font-size: 8rem;
  93. margin: 0;
  94. }
  95. .training-title::before {
  96. font-size: 1.4rem;
  97. display: block;
  98. position: absolute;
  99. top: -0.4rem;
  100. left: 2.4rem;
  101. color: ${theme.colors.darkerblue};
  102. }
  103. :global(.training-meta) {
  104. grid-area: info;
  105. height: 350px;
  106. background-image: url('/media/man_working_out.jpg');
  107. background-size: auto 100%;
  108. background-repeat: no-repeat;
  109. background-position: right center;
  110. clip-path: polygon(0% 0%, 95% 0%, 100% 50%, 95% 100%, 0% 100%, 0% 0%);
  111. }
  112. }
  113. `}
  114. </style>
  115. </section>
  116. </Page>
  117. )
  118. }
  119. export default Home