index.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import React from "react";
  2. import { Button } from "react-bootstrap";
  3. import Ranking from "./Ranking";
  4. import Back from "../Back";
  5. import moment from "moment";
  6. import Test from "./Test";
  7. import axios from "axios";
  8. interface IProps {
  9. assets: string[];
  10. providers: any[];
  11. tokenomics: {
  12. media: { channels: number; size: number; media_files: number };
  13. };
  14. }
  15. interface IState {}
  16. class Storage extends React.Component<IProps, IState> {
  17. constructor(props: IProps) {
  18. super(props);
  19. this.state = {
  20. startedAt: false,
  21. selectedAssets: [],
  22. hash: "",
  23. number: 10,
  24. loading: {},
  25. assets: [],
  26. speeds: {},
  27. showTest: false,
  28. };
  29. this.startTest = this.startTest.bind(this);
  30. this.setAssetStatus = this.setAssetStatus.bind(this);
  31. this.toggleShowTest = this.toggleShowTest.bind(this);
  32. this.handleChange = this.handleChange.bind(this);
  33. }
  34. componentDidMount() {
  35. this.fetchSpeeds();
  36. //setInterval(this.forceUpdate, 5000);
  37. }
  38. async fetchSpeeds() {
  39. const { data } = await axios.get(`/static/speeds2.json`);
  40. if (data.error) return;
  41. console.log(`received results for`, Object.keys(data).join(`, `));
  42. this.setState({ speeds: data });
  43. }
  44. toggleShowTest() {
  45. this.setState({ showTest: !this.state.showTest });
  46. }
  47. async startTest(test: number) {
  48. const { hash, number } = this.state;
  49. const { assets, providers } = this.props;
  50. const loading = {};
  51. let selectedAssets = [];
  52. if (test === 1) {
  53. selectedAssets.push(assets[0]);
  54. selectedAssets.push(hash);
  55. return this.setState({ loading, startedAt: moment(), selectedAssets });
  56. }
  57. for (let i = 0; i < number; i++) {
  58. const id = Math.round(Math.random() * assets.length);
  59. const asset = assets.slice(id, id + 1)[0];
  60. if (selectedAssets.find((a) => a === asset)) i--;
  61. else selectedAssets.push(asset);
  62. }
  63. loading[`${providers[0].url}-${selectedAssets[0]}`] = "loading";
  64. await this.setState({ loading, startedAt: moment(), selectedAssets });
  65. this.loadWaitingAsset(selectedAssets, providers);
  66. }
  67. setAssetStatus(id: string, provider: string, status: string) {
  68. console.debug(id, provider, status);
  69. const tag = `${provider}-${id}`;
  70. const { loading } = this.state;
  71. if (status === `loading`)
  72. loading[tag] = { provider, id, status, startedAt: moment() };
  73. else {
  74. loading[tag].finishedAt = moment();
  75. loading[tag].status = status;
  76. this.loadWaitingAsset();
  77. }
  78. this.setState({ loading });
  79. }
  80. loadWaitingAsset(
  81. selectedAssets = this.state.selectedAssets,
  82. providers = this.props.providers
  83. ) {
  84. const { loading } = this.state;
  85. let provider: string;
  86. const asset = selectedAssets.find((a) => {
  87. const waiting = providers.find((p) =>
  88. loading[`${p.url}-${a}`] ? false : true
  89. );
  90. if (!waiting) return false;
  91. provider = waiting.url;
  92. return true;
  93. });
  94. if (!asset) return this.testFinished();
  95. this.setAssetStatus(asset, provider, "loading");
  96. }
  97. testFinished() {
  98. // TODO
  99. }
  100. handleChange(e) {
  101. this.setState({ [e.target.name]: e.target.value });
  102. }
  103. render() {
  104. const {
  105. speeds,
  106. selectedAssets,
  107. hash,
  108. number,
  109. loading,
  110. showTest,
  111. } = this.state;
  112. const { providers, assets, tokenomics } = this.props;
  113. return (
  114. <div className="m-2 p-2 bg-light">
  115. <h2>Storage Providers</h2>
  116. {tokenomics ? (
  117. <div className="m-2 p-2">
  118. <div>Files: {tokenomics.media.media_files}</div>
  119. <div>Size: {(tokenomics.media.size / 1000000000).toFixed()} GB</div>
  120. </div>
  121. ) : (
  122. <div />
  123. )}
  124. <h3>Ranking</h3>
  125. {showTest ? (
  126. <Test
  127. handleChange={this.handleChange}
  128. startTest={this.startTest}
  129. setAssetStatus={this.setAssetStatus}
  130. assets={assets}
  131. hash={hash}
  132. loading={loading}
  133. number={number}
  134. providers={providers}
  135. selectedAssets={selectedAssets}
  136. />
  137. ) : (
  138. <Button
  139. variant="outline-dark float-right"
  140. onClick={this.toggleShowTest}
  141. >
  142. Perform your own test
  143. </Button>
  144. )}
  145. <div className="d-flex flex-wrap ">
  146. {Object.keys(speeds).map((location) => (
  147. <Ranking
  148. key={location}
  149. location={location}
  150. providers={speeds[location]}
  151. />
  152. ))}
  153. </div>
  154. <Back />
  155. </div>
  156. );
  157. }
  158. }
  159. export default Storage;