ExpandedTemplate.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import React, { Component } from 'react';
  2. import styled from 'styled-components';
  3. import { PorterTemplate } from 'shared/types';
  4. import api from 'shared/api';
  5. import TemplateInfo from './TemplateInfo';
  6. import LaunchTemplate from './LaunchTemplate';
  7. import Loading from 'components/Loading';
  8. type PropsType = {
  9. currentTemplate: PorterTemplate,
  10. setCurrentTemplate: (x: PorterTemplate) => void,
  11. };
  12. type StateType = {
  13. showLaunchTemplate: boolean,
  14. form: any | null,
  15. values: any | null,
  16. loading: boolean,
  17. error: boolean,
  18. markdown: string | null,
  19. keywords: string[],
  20. };
  21. export default class ExpandedTemplate extends Component<PropsType, StateType> {
  22. state = {
  23. showLaunchTemplate: false,
  24. form: null as any | null,
  25. values: null as any | null,
  26. loading: true,
  27. error: false,
  28. markdown: null as string | null,
  29. keywords: [] as string[],
  30. }
  31. componentDidMount() {
  32. this.setState({ loading: true });
  33. api.getTemplateInfo('<token>', {}, {
  34. name: this.props.currentTemplate.name.toLowerCase().trim(),
  35. version: 'latest',
  36. }, (err: any, res: any) => {
  37. if (err) {
  38. this.setState({ loading: false, error: true });
  39. } else {
  40. let { form, values, markdown, metadata } = res.data;
  41. let keywords = metadata.keywords;
  42. this.setState({ form, values, markdown, keywords, loading: false, error: false });
  43. }
  44. });
  45. }
  46. renderContents = () => {
  47. if (this.state.loading) {
  48. return <LoadingWrapper><Loading /></LoadingWrapper>;
  49. }
  50. if (this.state.showLaunchTemplate) {
  51. return (
  52. <LaunchTemplate
  53. currentTemplate={this.props.currentTemplate}
  54. hideLaunch={() => this.setState({ showLaunchTemplate: false })}
  55. values={this.state.values}
  56. form={this.state.form}
  57. />
  58. );
  59. }
  60. return (
  61. <FadeWrapper>
  62. <TemplateInfo
  63. currentTemplate={this.props.currentTemplate}
  64. setCurrentTemplate={this.props.setCurrentTemplate}
  65. launchTemplate={() => this.setState({ showLaunchTemplate: true })}
  66. markdown={this.state.markdown}
  67. keywords={this.state.keywords}
  68. />
  69. </FadeWrapper>
  70. );
  71. }
  72. render() {
  73. return (
  74. <StyledExpandedTemplate>
  75. {this.renderContents()}
  76. </StyledExpandedTemplate>
  77. );
  78. }
  79. }
  80. const FadeWrapper = styled.div`
  81. animation: fadeIn 0.2s;
  82. @keyframes fadeIn {
  83. from: { opacity: 0 }
  84. to: { opacity: 1 }
  85. }
  86. `;
  87. const LoadingWrapper = styled.div`
  88. height: calc(100vh - 200px);
  89. width: 100%;
  90. `;
  91. const StyledExpandedTemplate = styled.div`
  92. width: calc(90% - 150px);
  93. min-width: 300px;
  94. padding-top: 75px;
  95. `;