1 import FileSaver from 'file-saver';
2 import PropTypes from 'prop-types';
3 import React from 'react';
4 import { Button, Col, Container, Row } from 'react-bootstrap';
5 import { withTranslation } from 'react-i18next';
6 import toastr from 'toastr';
8 import BaseRomButton from './BaseRomButton';
9 import { useAlttpBaseRom } from '../../helpers/AlttpBaseRomContext';
10 import BPS from '../../helpers/bps';
11 import i18n from '../../i18n';
13 const applyPatch = (rom, patch, filename) => {
15 const bps = new BPS();
18 const result = bps.applyPatch();
19 FileSaver.saveAs(new Blob([result], { type: 'application/octet-stream' }), filename);
21 toastr.error(i18n.t('alttpSeeds.patchError', { msg: e.message }));
25 const isDefaultSetting = () => false;
27 const Seed = ({ onRetry, patch, seed }) => {
28 const { rom } = useAlttpBaseRom();
31 <h1>{i18n.t('alttpSeeds.heading')}</h1>
33 <Col md={{ order: 2 }}>
36 disabled={!seed || seed.status !== 'generated' || !patch}
37 onClick={() => applyPatch(
40 `${i18n.t('alttpSeeds.filename', {
47 {i18n.t(patch ? 'alttpSeeds.patch' : 'alttpSeeds.fetchingPatch')}
53 <Col md={{ order: 1 }}>
55 {i18n.t('alttpSeeds.preset')}:
57 <strong>{i18n.t(`alttpSeeds.presets.${seed.preset}`)}</strong>
61 {i18n.t('alttpSeeds.seed')}:
63 <strong>{seed.seed}</strong>
67 <p>{i18n.t('alttpSeeds.race')}</p>
70 <p>{i18n.t('alttpSeeds.mystery')}</p>
72 {seed.status === 'generated' ?
74 {i18n.t('alttpSeeds.generated')}:
77 {i18n.t('alttpSeeds.date', { date: new Date(seed.updated_at) })}
82 {i18n.t('alttpSeeds.status')}:
84 <strong>{i18n.t(`alttpSeeds.statuses.${seed.status}`)}</strong>
87 {seed.status === 'error' ?
93 {i18n.t('button.retry')}
99 <h2 className="mt-5">{i18n.t('alttpSeeds.generator')}</h2>
100 <p>{i18n.t(`alttpSeeds.generators.${seed.generator}`)}</p>
102 <h2 className="mt-5">{i18n.t('alttpSeeds.settings')}</h2>
104 {Object.entries(seed.settings).map(([key, value]) =>
105 <Col key={key} sm={4} md={3} lg={2} className="mb-2">
106 <small className="text-muted">
107 {i18n.t(`alttpSeeds.settingName.${key}`)}
110 {isDefaultSetting(key, value) ?
111 i18n.t(`alttpSeeds.settingValue.${key}.${value}`)
113 <strong>{i18n.t(`alttpSeeds.settingValue.${key}.${value}`)}</strong>
123 onRetry: PropTypes.func,
124 patch: PropTypes.instanceOf(ArrayBuffer),
125 seed: PropTypes.shape({
126 generator: PropTypes.string,
127 hash: PropTypes.string,
128 mystery: PropTypes.bool,
129 preset: PropTypes.string,
130 race: PropTypes.bool,
131 seed: PropTypes.string,
132 settings: PropTypes.shape({
134 status: PropTypes.string,
135 updated_at: PropTypes.string,
139 export default withTranslation()(Seed);