diff --git a/src/App.js b/src/App.js
index d483825..a56931a 100644
--- a/src/App.js
+++ b/src/App.js
@@ -2,8 +2,8 @@ import React from 'react';
import {
ChakraProvider,
Box,
- theme,
} from '@chakra-ui/react';
+import theme from './theme.js';
import Pokedex from './Pokedex.js';
diff --git a/src/Pokedex.js b/src/Pokedex.js
index 6aedfef..6d9bbeb 100644
--- a/src/Pokedex.js
+++ b/src/Pokedex.js
@@ -1,32 +1,11 @@
import React from 'react';
import {
- Box,
- Button,
Center,
- Drawer,
- DrawerBody,
- DrawerHeader,
- DrawerOverlay,
- DrawerContent,
- DrawerCloseButton,
Flex,
- Image,
- Modal,
- ModalOverlay,
- ModalContent,
- ModalHeader,
- ModalBody,
- ModalCloseButton,
- ModalFooter,
- Stat,
- StatLabel,
- StatNumber,
- StatGroup,
} from '@chakra-ui/react';
import Utilities from './Utilities.js';
import { Pokeball } from './Pokeball.js';
-import typeImages from './images.js';
-import pokemonImages from './pokemonImages.js';
+import PokedexCard from './PokedexCard.js';
@@ -72,7 +51,7 @@ class Pokedex extends React.Component {
{this.state.pokedexes.map(dex => (
-
+
))}
)
@@ -83,573 +62,6 @@ class Pokedex extends React.Component {
}
}
-class SinglePokedexCard extends React.Component {
-
- constructor(props) {
- super(props);
- this.state = {
- name: props.name,
- url: props.url,
- isModalOpen: false,
- }
- }
-
- openModal = () => {
- this.setState({ isModalOpen: true })
- }
-
- closeModal = () => {
- this.setState({ isModalOpen: false })
- }
-
- render() {
-
- return (
-
- <>
-
-
-
-
-
-
-
- {this.props.name}
-
-
-
-
-
-
-
-
- >
-
- );
- }
-}
-
-class SinglePokedex extends React.Component {
-
- constructor(props) {
- super(props);
- this.state = {
- loading: true,
- isDrawerOpen: false,
- name: props.name,
- url: props.url,
- desc: "",
- pokemon_entries: [],
- selectedPokemonName: "",
- selectedPokemonUrl: "",
- }
- }
-
- openDrawer = (name, url) => {
- this.setState({selectedPokemonName: name, selectedPokemonUrl: url});
- this.setState({ isDrawerOpen: true });
- }
-
- closeDrawer = () => {
- this.setState({ isDrawerOpen: false })
- }
-
- async componentDidMount() {
- try {
- const singlePokedexRequest = await fetch(this.props.url).then(Utilities.checkResponse);
- const singlePokedexJson = await singlePokedexRequest.json();
-
- let pokedexDescription = "";
-
- for (let i = 0; i < singlePokedexJson.descriptions.length; i++) {
-
- if (singlePokedexJson.descriptions[i].language.name === "en") {
- pokedexDescription = singlePokedexJson.descriptions[i].description;
-
- }
- }
- let entries = [];
- for (let i = 0; i < singlePokedexJson.pokemon_entries.length; i++) {
- let pokemon = singlePokedexJson.pokemon_entries[i].pokemon_species;
- entries.push([pokemon.name, pokemon.url]);
- }
-
- this.setState({pokemon_entries: entries, desc: pokedexDescription, loading: false});
- } catch(e) {
- console.log(e);
- }
-
- }
-
- render() {
-
-
-
- return(
- <>
-
- {this.state.loading ? () : (
- <>
- {this.state.desc}
-
-
-
-
- {this.state.pokemon_entries.map(pokemon => (
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
- {Utilities.formatName(this.state.selectedPokemonName)}
-
-
-
-
-
-
-
-
- >
-
- )}
-
- >
- );
- }
-}
-
-class Pokemon extends React.Component {
-
- constructor(props) {
- super(props);
- this.state = {
- loading: true,
- isAbilityModalOpen: false,
- isTypeModalOpen: false,
- name: "",
- url: "",
- pokedexUrl: "",
- id: 0,
- varieties: [],
- desc: "",
- types: [],
- color: "",
- height: 0,
- weight: 0,
- abilities: [],
- evolvesFrom: "",
- habitat: "",
- isMythical: false,
- isLegendary: false,
- stats: [],
- selectedAbility: "",
- selectedType: ""
- }
- }
-
-
- openAbilityModal = (url) => {
- this.setState({ selectedAbility: url })
- this.setState({ isAbilityModalOpen: true })
- }
-
- closeAbilityModal = () => {
- this.setState({ isAbilityModalOpen: false })
- }
-
- openTypeModal = (url) => {
- this.setState({ selectedType: url })
- this.setState({ isTypeModalOpen: true })
- }
-
- closeTypeModal = () => {
- this.setState({ isTypeModalOpen: false })
- }
-
- async componentDidMount() {
- const pokemonUrl = "https://pokeapi.co/api/v2/pokemon/";
- try {
- const speciesRequest = await fetch(this.props.url).then(Utilities.checkResponse);
- const speciesJson = await speciesRequest.json();
-
- let speciesIdArray = this.props.url.split("/");
- let speciesId = speciesIdArray[6];
-
- let varietiesData = [];
- for (let i = 0; i < speciesJson.varieties.length; i++) {
- varietiesData.push(speciesJson.varieties[i]);
- }
-
- let descData = "";
- for (let i = 0; i < speciesJson.flavor_text_entries.length; i++) {
- if (speciesJson.flavor_text_entries[i].language.name === "en") {
- descData = speciesJson.flavor_text_entries[i].flavor_text;
- }
- }
-
- let colorData = "";
- if (speciesJson.color) {
- colorData = speciesJson.color.name;
- }
-
- let evolvesFromData = "";
- if (speciesJson.evolves_from_species) {
- evolvesFromData = speciesJson.evolves_from_species.name;
- }
-
- let habitatData = "";
- if (speciesJson.habitat) {
- habitatData = speciesJson.habitat.name;
- }
-
- let isMythicalData = speciesJson.is_mythical;
- let isLegendaryData = speciesJson.is_legendary;
-
- const pokemonRequest = await fetch(pokemonUrl + speciesId).then(Utilities.checkResponse);
- const pokemonJson = await pokemonRequest.json();
-
- let typesData = [];
- for (let i = 0; i < pokemonJson.types.length; i++) {
- typesData.push([pokemonJson.types[i].type.name, pokemonJson.types[i].type.url]);
- }
-
- let heightData = pokemonJson.height;
- let weightData = pokemonJson.weight;
-
- let abilitiesData = [];
- for (let i = 0; i < pokemonJson.abilities.length; i++) {
- abilitiesData.push([pokemonJson.abilities[i].ability.name, pokemonJson.abilities[i].ability.url]);
- }
-
- let statsData = {};
- for (let i = 0; i < pokemonJson.stats.length; i++) {
- statsData[pokemonJson.stats[i].stat.name] = pokemonJson.stats[i].base_stat;
- }
-
-
-
- this.setState({
- id: speciesId,
- varieties: varietiesData,
- desc: descData,
- types: typesData,
- color: colorData,
- height: heightData,
- weight: weightData,
- abilities: abilitiesData,
- evolvesFrom: evolvesFromData,
- habitat: habitatData,
- isMythical: isMythicalData,
- isLegendary: isLegendaryData,
- stats: statsData,
- loading: false
- });
-
-
- } catch(e) {
- console.log(e);
- }
- }
-
- render() {
-
-
-
- return (
- <>
-
- {this.state.loading ? () : (
-
- <>
-
-
- {this.state.desc}
-
-
-
-
- Abilities:
-
-
- {this.state.abilities.map(ability => (
-
- ))}
-
-
-
-
- {this.state.types.map(pType => (
-
- ))}
-
-
-
-
- Height
- {Utilities.calculatePokemonHeight(this.state.height)}
-
-
-
- Weight
- {Utilities.calculatePokemonWeight(this.state.weight)}
-
-
-
-
- {(this.state.habitat === "") ? "" : "Habitat: " + (Utilities.formatName(this.state.habitat))}
-
-
-
- {(this.state.evolvesFrom === "") ? "" : "Evolves from: " + (Utilities.formatName(this.state.evolvesFrom))}
-
-
-
-
-
- {/* Abilities Modal */}
-
-
-
-
-
-
-
-
-
- {/* Types Modal */}
-
-
-
-
-
-
-
-
-
- >
-
- )}
-
- >
- );
- }
-}
-
-class PokemonType extends React.Component {
-
- constructor(props) {
- super(props);
-
- this.state = {
- loading: true,
- name: "",
- url: props.url,
- doubleDamageFrom: [],
- doubleDamageTo: [],
- halfDamageFrom: [],
- halfDamageTo: [],
- noDamageFrom: [],
- noDamageTo: [],
- };
- }
-
- async componentDidMount() {
- const typeRequest = await fetch(this.props.url).then(Utilities.checkResponse);
- const typeJson = await typeRequest.json();
-
- let nameData = typeJson.name;
-
- let damageRelationsData = typeJson.damage_relations;
-
- this.setState({
- name: nameData,
- doubleDamageFrom: damageRelationsData.double_damage_from,
- doubleDamageTo: damageRelationsData.double_damage_to,
- halfDamageFrom: damageRelationsData.half_damage_from,
- halfDamageTo: damageRelationsData.half_damage_to,
- noDamageFrom: damageRelationsData.no_damage_from,
- noDamageTo: damageRelationsData.no_damage_to,
- loading: false,
- });
- }
-
- render() {
- const prefix = "m_";
-
- return (
- <>
- {this.state.loading ? () : (
- <>
- {Utilities.formatName(this.state.name)}
-
-
-
-
- Double damage from:
-
- {this.state.doubleDamageFrom.length > 0 ? (
- this.state.doubleDamageFrom.map(pType => (
-
-
-
- ))
- ) : (None
)}
-
-
-
-
- Double damage to:
-
- {this.state.doubleDamageTo.length > 0 ? (
- this.state.doubleDamageTo.map(pType => (
-
-
-
- ))
- ) : (None
)}
-
-
-
-
- Half damage from:
-
- {this.state.halfDamageFrom.length > 0 ? (
- this.state.halfDamageFrom.map(pType => (
-
-
-
- ))
- ) : (None
)}
-
-
-
-
- Half damage to:
-
- {this.state.halfDamageTo.length > 0 ? (
- this.state.halfDamageTo.map(pType => (
-
-
-
- ))
- ) : (None
)}
-
-
-
-
- No damage from:
-
- {this.state.noDamageFrom.length > 0 ? (
- this.state.noDamageFrom.map(pType => (
-
-
-
- ))
- ) : (None
)}
-
-
-
-
- No damage to:
-
- {this.state.noDamageTo.length > 0 ? (
- this.state.noDamageTo.map(pType => (
-
-
-
- ))
- ) : (None
)}
-
-
-
-
-
- >
- )}
- >
- )
- }
-}
-
-class Ability extends React.Component {
- constructor(props) {
- super(props);
-
- this.state = {
- loading: true,
- name: props.name,
- url: props.url,
- description: "",
- };
- }
-
-
- async componentDidMount() {
- const abilityRequest = await fetch(this.props.url).then(Utilities.checkResponse);
- const abilityJson = await abilityRequest.json();
-
- let nameData = abilityJson.name;
- let descriptionData = "";
-
- for (let i = 0; i < abilityJson.flavor_text_entries.length; i++) {
- if (abilityJson.flavor_text_entries[i].language.name === 'en')
- descriptionData = abilityJson.flavor_text_entries[i].flavor_text;
- }
-
- this.setState({
- name: nameData,
- description: descriptionData,
- loading: false
-
- });
- }
-
- render() {
-
- return (
- <>
- {this.state.loading ? () : (
- <>
- {Utilities.formatName(this.state.name)}
-
-
-
- {this.state.description}
-
-
-
- >
- )}
- >
-
- )
-
- }
-}
export default Pokedex;
\ No newline at end of file
diff --git a/src/PokedexCard.js b/src/PokedexCard.js
new file mode 100644
index 0000000..d3ea21d
--- /dev/null
+++ b/src/PokedexCard.js
@@ -0,0 +1,68 @@
+import React from 'react';
+import {
+ Box,
+ Button,
+ Flex,
+ Modal,
+ ModalOverlay,
+ ModalContent,
+ ModalHeader,
+ ModalBody,
+ ModalCloseButton,
+} from '@chakra-ui/react';
+import { Pokeball } from './Pokeball.js';
+import SinglePokedex from './SinglePokedex.js';
+
+class PokedexCard extends React.Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ name: props.name,
+ url: props.url,
+ isModalOpen: false,
+ }
+ }
+
+ openModal = () => {
+ this.setState({ isModalOpen: true })
+ }
+
+ closeModal = () => {
+ this.setState({ isModalOpen: false })
+ }
+
+ render() {
+
+ return (
+
+ <>
+
+
+
+
+
+
+
+ {this.props.name}
+
+
+
+
+
+
+
+
+ >
+
+ );
+ }
+}
+
+
+export default PokedexCard;
\ No newline at end of file
diff --git a/src/Pokemon.js b/src/Pokemon.js
new file mode 100644
index 0000000..dee4e7c
--- /dev/null
+++ b/src/Pokemon.js
@@ -0,0 +1,284 @@
+import React from 'react';
+import {
+ Box,
+ Button,
+ Center,
+ Flex,
+ Image,
+ Modal,
+ ModalOverlay,
+ ModalContent,
+ Stat,
+ StatLabel,
+ StatNumber,
+ StatGroup,
+} from '@chakra-ui/react';
+import Utilities from './Utilities.js';
+import { Pokeball } from './Pokeball.js';
+import typeImages from './images.js';
+import pokemonImages from './pokemonImages.js';
+
+import PokemonAbility from './PokemonAbility.js';
+import PokemonType from './PokemonType.js';
+import PokemonMove from './PokemonMove.js';
+
+class Pokemon extends React.Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ loading: true,
+ isAbilityModalOpen: false,
+ isTypeModalOpen: false,
+ name: "",
+ url: "",
+ pokedexUrl: "",
+ id: 0,
+ varieties: [],
+ desc: "",
+ types: [],
+ color: "",
+ height: 0,
+ weight: 0,
+ abilities: [],
+ evolvesFrom: "",
+ habitat: "",
+ isMythical: false,
+ isLegendary: false,
+ stats: [],
+ moves: [],
+ selectedAbility: "",
+ selectedType: "",
+ selectedMove: "",
+ }
+ }
+
+
+ openAbilityModal = (url) => {
+ this.setState({ selectedAbility: url })
+ this.setState({ isAbilityModalOpen: true })
+ }
+
+ closeAbilityModal = () => {
+ this.setState({ isAbilityModalOpen: false })
+ }
+
+ openTypeModal = (url) => {
+ this.setState({ selectedType: url })
+ this.setState({ isTypeModalOpen: true })
+ }
+
+ closeTypeModal = () => {
+ this.setState({ isTypeModalOpen: false })
+ }
+
+ openMoveModal = (url) => {
+ this.setState({ selectedMove: url })
+ this.setState({ isMoveModalOpen: true })
+ }
+
+ closeMoveModal = () => {
+ this.setState({ isMoveModalOpen: false })
+ }
+
+ async componentDidMount() {
+ const pokemonUrl = "https://pokeapi.co/api/v2/pokemon/";
+ try {
+ const speciesRequest = await fetch(this.props.url).then(Utilities.checkResponse);
+ const speciesJson = await speciesRequest.json();
+
+ let speciesIdArray = this.props.url.split("/");
+ let speciesId = speciesIdArray[6];
+
+ let varietiesData = [];
+ for (let i = 0; i < speciesJson.varieties.length; i++) {
+ varietiesData.push(speciesJson.varieties[i]);
+ }
+
+ let descData = "";
+ for (let i = 0; i < speciesJson.flavor_text_entries.length; i++) {
+ if (speciesJson.flavor_text_entries[i].language.name === "en") {
+ descData = speciesJson.flavor_text_entries[i].flavor_text;
+ }
+ }
+
+ let colorData = "";
+ if (speciesJson.color) {
+ colorData = speciesJson.color.name;
+ }
+
+ let evolvesFromData = "";
+ if (speciesJson.evolves_from_species) {
+ evolvesFromData = speciesJson.evolves_from_species.name;
+ }
+
+ let habitatData = "";
+ if (speciesJson.habitat) {
+ habitatData = speciesJson.habitat.name;
+ }
+
+ let isMythicalData = speciesJson.is_mythical;
+ let isLegendaryData = speciesJson.is_legendary;
+
+ const pokemonRequest = await fetch(pokemonUrl + speciesId).then(Utilities.checkResponse);
+ const pokemonJson = await pokemonRequest.json();
+
+ let typesData = [];
+ for (let i = 0; i < pokemonJson.types.length; i++) {
+ typesData.push([pokemonJson.types[i].type.name, pokemonJson.types[i].type.url]);
+ }
+
+ let heightData = pokemonJson.height;
+ let weightData = pokemonJson.weight;
+
+ let abilitiesData = [];
+ for (let i = 0; i < pokemonJson.abilities.length; i++) {
+ abilitiesData.push([pokemonJson.abilities[i].ability.name, pokemonJson.abilities[i].ability.url]);
+ }
+
+ let statsData = {};
+ for (let i = 0; i < pokemonJson.stats.length; i++) {
+ statsData[pokemonJson.stats[i].stat.name] = pokemonJson.stats[i].base_stat;
+ }
+
+ let movesData = [];
+ for (let i = 0; i < pokemonJson.moves.length; i++) {
+ movesData.push([pokemonJson.moves[i].move.name, pokemonJson.moves[i].move.url]);
+ }
+
+
+
+ this.setState({
+ id: speciesId,
+ varieties: varietiesData,
+ desc: descData,
+ types: typesData,
+ color: colorData,
+ height: heightData,
+ weight: weightData,
+ abilities: abilitiesData,
+ evolvesFrom: evolvesFromData,
+ habitat: habitatData,
+ isMythical: isMythicalData,
+ isLegendary: isLegendaryData,
+ stats: statsData,
+ moves: movesData,
+ loading: false
+ });
+
+
+ } catch(e) {
+ console.log(e);
+ }
+ }
+
+ render() {
+
+
+
+ return (
+ <>
+
+ {this.state.loading ? () : (
+
+ <>
+
+
+ {this.state.desc}
+
+
+
+
+ Abilities:
+
+
+ {this.state.abilities.map(ability => (
+
+ ))}
+
+
+
+
+ {this.state.types.map(pType => (
+
+ ))}
+
+
+
+
+ Height
+ {Utilities.calculatePokemonHeight(this.state.height)}
+
+
+
+ Weight
+ {Utilities.calculatePokemonWeight(this.state.weight)}
+
+
+
+
+ {(this.state.habitat === "") ? "" : "Habitat: " + (Utilities.formatName(this.state.habitat))}
+
+
+
+ {(this.state.evolvesFrom === "") ? "" : "Evolves from: " + (Utilities.formatName(this.state.evolvesFrom))}
+
+
+ Moves:
+
+
+ {this.state.moves.map(move => (
+
+ ))}
+
+
+
+
+
+
+ {/* Abilities Modal */}
+
+
+
+
+
+
+
+
+
+ {/* Types Modal */}
+
+
+
+
+
+
+
+
+
+ {/* Moves Modal */}
+
+
+
+
+
+
+
+
+
+ >
+
+ )}
+
+ >
+ );
+ }
+}
+
+export default Pokemon;
\ No newline at end of file
diff --git a/src/PokemonAbility.js b/src/PokemonAbility.js
new file mode 100644
index 0000000..b7bf153
--- /dev/null
+++ b/src/PokemonAbility.js
@@ -0,0 +1,68 @@
+import React from 'react';
+import {
+ Center,
+ ModalHeader,
+ ModalBody,
+ ModalCloseButton,
+ ModalFooter,
+} from '@chakra-ui/react';
+import Utilities from './Utilities.js';
+import { Pokeball } from './Pokeball.js';
+
+class PokemonAbility extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ loading: true,
+ name: props.name,
+ url: props.url,
+ description: "",
+ };
+ }
+
+
+ async componentDidMount() {
+ const abilityRequest = await fetch(this.props.url).then(Utilities.checkResponse);
+ const abilityJson = await abilityRequest.json();
+
+ let nameData = abilityJson.name;
+ let descriptionData = "";
+
+ for (let i = 0; i < abilityJson.flavor_text_entries.length; i++) {
+ if (abilityJson.flavor_text_entries[i].language.name === 'en')
+ descriptionData = abilityJson.flavor_text_entries[i].flavor_text;
+ }
+
+ this.setState({
+ name: nameData,
+ description: descriptionData,
+ loading: false
+
+ });
+ }
+
+ render() {
+
+ return (
+ <>
+ {this.state.loading ? () : (
+ <>
+ {Utilities.formatName(this.state.name)}
+
+
+
+ {this.state.description}
+
+
+
+ >
+ )}
+ >
+
+ )
+
+ }
+}
+
+export default PokemonAbility;
\ No newline at end of file
diff --git a/src/PokemonMove.js b/src/PokemonMove.js
new file mode 100644
index 0000000..1feb550
--- /dev/null
+++ b/src/PokemonMove.js
@@ -0,0 +1,179 @@
+import React from 'react';
+import {
+ Box,
+ Center,
+ Flex,
+ Image,
+ Stat,
+ StatLabel,
+ StatNumber,
+ StatGroup,
+} from '@chakra-ui/react';
+import Utilities from './Utilities.js';
+import { Pokeball } from './Pokeball.js';
+import typeImages from './images.js';
+
+class PokemonMove extends React.Component {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ loading: true,
+ name: "",
+ url: "",
+ pokedex: "",
+ desc: "",
+ moveType: "",
+ accuracy: 0,
+ power: 0,
+ pp: 0,
+ damageClass: "",
+ effectChance: 0,
+ effects: [],
+ machines: [],
+ learnedByPokemon: [],
+ };
+ }
+
+ async componentDidMount() {
+ try {
+ let moveRequest = await fetch(this.props.url).then(Utilities.checkResponse);
+ let moveJson = await moveRequest.json();
+
+ let nameData = "";
+ if (moveJson.name) {
+ nameData = moveJson.name;
+ }
+
+ let descData = "";
+ for (let i = 0; i < moveJson.flavor_text_entries.length; i++) {
+ if (moveJson.flavor_text_entries[i].language.name === "en") {
+ descData = moveJson.flavor_text_entries[i].flavor_text;
+ }
+ }
+
+ let typeData = "";
+ if (moveJson.type) {
+ typeData = moveJson.type.name;
+ }
+
+ let accuracyData = 0;
+ if (moveJson.accuracy) {
+ accuracyData = moveJson.accuracy;
+ }
+
+ let powerData = 0;
+ if (moveJson.power) {
+ powerData = moveJson.power;
+ }
+
+ let ppData = 0;
+ if (moveJson.pp) {
+ ppData = moveJson.pp;
+ }
+
+ let damageClassData = "";
+ if (moveJson.damage_class) {
+ damageClassData = moveJson.damage_class.name;
+ }
+
+
+ let effectChanceData = 0;
+ if (moveJson.effect_chance) {
+ effectChanceData = moveJson.effect_chance;
+ }
+
+ let effectsData = [];
+ if (moveJson.effect_entries) {
+ for (let i = 0; i < moveJson.effect_entries.length; i++) {
+ effectsData.push(moveJson.effect_entries[i].effect);
+ }
+ }
+
+ let machinesData = [];
+ if (moveJson.machines) {
+ for (let i = 0; i < moveJson.machines.length; i++) {
+ machinesData.push(moveJson.machines[i].machine.url);
+ }
+ }
+
+ let learnedByPokemonData = [];
+ if (moveJson.learned_by_pokemon) {
+ for (let i = 0; i < moveJson.learned_by_pokemon.length; i++) {
+ learnedByPokemonData.push([moveJson.learned_by_pokemon[i].name, moveJson.learned_by_pokemon[i].url]);
+ }
+ }
+
+
+ this.setState({
+ name: nameData,
+ desc: descData,
+ type: typeData,
+ accuracy: accuracyData,
+ power: powerData,
+ pp: ppData,
+ damageClass: damageClassData,
+ effectChance: effectChanceData,
+ effects: effectsData,
+ machines: machinesData,
+ learnedByPokemon: learnedByPokemonData,
+ loading: false,
+ });
+ } catch(e) {
+ console.log(e);
+ }
+ }
+
+ render() {
+
+
+ return (
+ <>
+
+ {this.state.loading ? () : (
+
+ <>
+
+ {Utilities.formatName(this.state.name)}
+ {this.state.desc}
+
+ {Utilities.formatName(this.state.damageClass)}
+
+
+ Accuracy
+ {this.state.accuracy}
+
+
+
+ Power
+ {this.state.power}
+
+
+
+ PP
+ {this.state.pp}
+
+
+ {(this.state.effectChance === undefined) ? "" : (
+
+ Effect chance
+ {this.state.effectChance}
+
+ )}
+
+
+
+
+
+
+
+ >
+ )}
+
+ >
+ )
+ }
+}
+
+export default PokemonMove;
\ No newline at end of file
diff --git a/src/PokemonType.js b/src/PokemonType.js
new file mode 100644
index 0000000..7cd5767
--- /dev/null
+++ b/src/PokemonType.js
@@ -0,0 +1,153 @@
+import React from 'react';
+import {
+ Box,
+ Center,
+ Flex,
+ Image,
+ ModalHeader,
+ ModalBody,
+ ModalCloseButton,
+ ModalFooter,
+} from '@chakra-ui/react';
+import Utilities from './Utilities.js';
+import { Pokeball } from './Pokeball.js';
+import typeImages from './images.js';
+
+class PokemonType extends React.Component {
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ loading: true,
+ name: "",
+ url: props.url,
+ doubleDamageFrom: [],
+ doubleDamageTo: [],
+ halfDamageFrom: [],
+ halfDamageTo: [],
+ noDamageFrom: [],
+ noDamageTo: [],
+ };
+ }
+
+ async componentDidMount() {
+ const typeRequest = await fetch(this.props.url).then(Utilities.checkResponse);
+ const typeJson = await typeRequest.json();
+
+ let nameData = typeJson.name;
+
+ let damageRelationsData = typeJson.damage_relations;
+
+ this.setState({
+ name: nameData,
+ doubleDamageFrom: damageRelationsData.double_damage_from,
+ doubleDamageTo: damageRelationsData.double_damage_to,
+ halfDamageFrom: damageRelationsData.half_damage_from,
+ halfDamageTo: damageRelationsData.half_damage_to,
+ noDamageFrom: damageRelationsData.no_damage_from,
+ noDamageTo: damageRelationsData.no_damage_to,
+ loading: false,
+ });
+ }
+
+ render() {
+ const prefix = "m_";
+
+ return (
+ <>
+ {this.state.loading ? () : (
+ <>
+ {Utilities.formatName(this.state.name)}
+
+
+
+
+ Double damage from:
+
+ {this.state.doubleDamageFrom.length > 0 ? (
+ this.state.doubleDamageFrom.map(pType => (
+
+
+
+ ))
+ ) : (None
)}
+
+
+
+
+ Double damage to:
+
+ {this.state.doubleDamageTo.length > 0 ? (
+ this.state.doubleDamageTo.map(pType => (
+
+
+
+ ))
+ ) : (None
)}
+
+
+
+
+ Half damage from:
+
+ {this.state.halfDamageFrom.length > 0 ? (
+ this.state.halfDamageFrom.map(pType => (
+
+
+
+ ))
+ ) : (None
)}
+
+
+
+
+ Half damage to:
+
+ {this.state.halfDamageTo.length > 0 ? (
+ this.state.halfDamageTo.map(pType => (
+
+
+
+ ))
+ ) : (None
)}
+
+
+
+
+ No damage from:
+
+ {this.state.noDamageFrom.length > 0 ? (
+ this.state.noDamageFrom.map(pType => (
+
+
+
+ ))
+ ) : (None
)}
+
+
+
+
+ No damage to:
+
+ {this.state.noDamageTo.length > 0 ? (
+ this.state.noDamageTo.map(pType => (
+
+
+
+ ))
+ ) : (None
)}
+
+
+
+
+
+ >
+ )}
+ >
+ )
+ }
+}
+
+
+export default PokemonType;
\ No newline at end of file
diff --git a/src/SinglePokedex.js b/src/SinglePokedex.js
new file mode 100644
index 0000000..9c102c8
--- /dev/null
+++ b/src/SinglePokedex.js
@@ -0,0 +1,142 @@
+import React from 'react';
+import {
+ Box,
+ Button,
+ Center,
+ Drawer,
+ DrawerBody,
+ DrawerHeader,
+ DrawerOverlay,
+ DrawerContent,
+ DrawerCloseButton,
+ Flex,
+ Image,
+} from '@chakra-ui/react';
+import Utilities from './Utilities.js';
+import { Pokeball } from './Pokeball.js';
+import pokemonImages from './pokemonImages.js';
+
+import Pokemon from './Pokemon.js';
+
+class SinglePokedex extends React.Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ loading: true,
+ isDrawerOpen: false,
+ name: props.name,
+ url: props.url,
+ desc: "",
+ versions: [],
+ pokemon_entries: [],
+ selectedPokemonName: "",
+ selectedPokemonUrl: "",
+ }
+ }
+
+ openDrawer = (name, url) => {
+ this.setState({selectedPokemonName: name, selectedPokemonUrl: url});
+ this.setState({ isDrawerOpen: true });
+ }
+
+ closeDrawer = () => {
+ this.setState({ isDrawerOpen: false })
+ }
+
+ async componentDidMount() {
+ try {
+ const singlePokedexRequest = await fetch(this.props.url).then(Utilities.checkResponse);
+ const singlePokedexJson = await singlePokedexRequest.json();
+
+ let descData = "";
+ for (let i = 0; i < singlePokedexJson.descriptions.length; i++) {
+
+ if (singlePokedexJson.descriptions[i].language.name === "en") {
+ descData = singlePokedexJson.descriptions[i].description;
+
+ }
+ }
+ let entriesData = [];
+ for (let i = 0; i < singlePokedexJson.pokemon_entries.length; i++) {
+ let pokemon = singlePokedexJson.pokemon_entries[i].pokemon_species;
+ entriesData.push([pokemon.name, pokemon.url]);
+ }
+
+ let versionsData = [];
+ for (let i = 0; i < singlePokedexJson.version_groups.length; i++) {
+ let version = singlePokedexJson.version_groups[i];
+ versionsData.push([version.name, version.url]);
+ }
+
+
+ this.setState({
+ pokemon_entries: entriesData,
+ desc: descData,
+ versions: versionsData,
+ loading: false
+ });
+ } catch(e) {
+ console.log(e);
+ }
+
+ }
+
+ render() {
+
+
+
+ return(
+ <>
+
+ {this.state.loading ? () : (
+ <>
+ {this.state.desc}
+ {(this.state.versions.length === 0) ? "" :
+ Versions: {this.state.versions.map(version => (
+ {Utilities.formatName(version[0])}
+ ))}
+ }
+
+
+
+
+ {this.state.pokemon_entries.map(pokemon => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+ {Utilities.formatName(this.state.selectedPokemonName)}
+
+
+
+
+
+
+
+
+ >
+
+ )}
+
+ >
+ );
+ }
+}
+
+export default SinglePokedex;
\ No newline at end of file
diff --git a/src/theme.js b/src/theme.js
new file mode 100644
index 0000000..d59521b
--- /dev/null
+++ b/src/theme.js
@@ -0,0 +1,24 @@
+import { extendTheme } from "@chakra-ui/react";
+
+const theme = extendTheme({
+ colors: {
+ primary: "#1688e6",
+ secondary: "#00c9df",
+ highlight: "#00e1b5",
+ warning: "#f9f871",
+ danger: "#9360ab",
+ },
+ components: {
+ Button: {
+ baseStyle: {
+ _hover: {
+ boxShadow: "md",
+ transform: "scale(1.02)",
+ background: "highlight"
+ }
+ },
+ },
+ }
+})
+
+export default theme;
\ No newline at end of file