Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/hito3api #10

Open
wants to merge 49 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
5f443a0
hito1, ruta
Jul 29, 2024
d5eb142
Merge pull request #1 from estefanymoramellado/hito1ruta
Johana-Gonzalez-Gamboa Jul 29, 2024
0fd29b2
prueba
Jul 29, 2024
dec5c3a
Merge pull request #2 from estefanymoramellado/hito1ruta
estefanymoramellado Jul 29, 2024
96b8090
cambios en ruta
Jul 30, 2024
dd0f7d6
.
Jul 30, 2024
7bbe5f9
Merge pull request #3 from estefanymoramellado/hito1ruta
estefanymoramellado Jul 30, 2024
880d1e7
SPA, pasos completados
Jul 30, 2024
7ff2abd
Merge pull request #4 from estefanymoramellado/hito1ruta
Johana-Gonzalez-Gamboa Jul 31, 2024
1647988
cambios en ruta hasta paso 6
Johana-Gonzalez-Gamboa Jul 31, 2024
769055e
Merge remote-tracking branch 'origin' into feature/hito1-rutas
Johana-Gonzalez-Gamboa Jul 31, 2024
717cc15
Merge pull request #5 from Johana-Gonzalez-Gamboa/feature/hito1-rutas
estefanymoramellado Jul 31, 2024
0feda00
Término de hito 1
Aug 6, 2024
4996ec6
se agrego codigo de data, data function
Aug 7, 2024
2fcb917
Merge pull request #7 from estefanymoramellado/feature/hito2visualiza…
estefanymoramellado Aug 7, 2024
1f56d95
migracion de datos, dataOrdenada, data y corregir rutas
Johana-Gonzalez-Gamboa Aug 8, 2024
d8a14d5
Merge pull request #8 from Johana-Gonzalez-Gamboa/feature/hito2-migra…
estefanymoramellado Aug 8, 2024
d069b0c
se visualizan las cards
Aug 14, 2024
ee64b53
Merge pull request #9 from estefanymoramellado/feature/hito2visualiza…
estefanymoramellado Aug 14, 2024
6538088
Filtros de la data
Aug 14, 2024
3f6f96b
Merge pull request #10 from estefanymoramellado/feature/hito2visualiz…
estefanymoramellado Aug 14, 2024
0fed13b
creación de view chat y view api
Aug 22, 2024
e8d637b
Merge pull request #11 from estefanymoramellado/feature/hito3api
estefanymoramellado Aug 22, 2024
3d5ce2c
cree id para chat
Aug 23, 2024
2b5730f
Merge pull request #12 from estefanymoramellado/feature/hito3api
estefanymoramellado Aug 23, 2024
9d3c06e
diseño css home
Aug 25, 2024
bf421d8
Merge pull request #13 from estefanymoramellado/feature/hito3api
estefanymoramellado Aug 25, 2024
c870dc6
diseño home, chat y cards
Aug 25, 2024
04485e0
diseño completo de home cards, vista notebook
Aug 26, 2024
274ba31
Merge pull request #14 from estefanymoramellado/feature/hito3api
estefanymoramellado Aug 26, 2024
f45175d
conexion de ia con api, con id
Aug 28, 2024
3f4bfee
Merge pull request #15 from estefanymoramellado/feature/hito3api
estefanymoramellado Aug 28, 2024
c17a997
cree test de api y de filtros, integré estadisticas.
Aug 30, 2024
f18a957
Merge pull request #16 from estefanymoramellado/feature/hito3api
estefanymoramellado Aug 30, 2024
1592350
cosas pendientes: cambiar id undefined por name de personaje en chat,…
Sep 3, 2024
152b09c
Merge pull request #17 from estefanymoramellado/feature/hito3api
estefanymoramellado Sep 3, 2024
e3113cc
pequeños ajustes
Sep 4, 2024
ac5d379
Merge pull request #18 from estefanymoramellado/feature/hito3api
estefanymoramellado Sep 5, 2024
5feb7fe
ajustes en el historial de enrutamiento
Sep 5, 2024
3b81558
Merge pull request #19 from estefanymoramellado/feature/hito3api
estefanymoramellado Sep 5, 2024
14dcea1
ultimos ajustes
Sep 6, 2024
00f346d
Merge pull request #20 from estefanymoramellado/feature/hito3api
estefanymoramellado Sep 6, 2024
da13017
DESPLIEGUE
Sep 9, 2024
d5debac
Merge pull request #21 from estefanymoramellado/feature/hito3api
estefanymoramellado Sep 9, 2024
9bf6f70
2 intento deploy
Sep 9, 2024
1b01728
Merge pull request #22 from estefanymoramellado/feature/hito3api
estefanymoramellado Sep 9, 2024
05c1e91
3 intento
Sep 9, 2024
fe35281
Merge pull request #23 from estefanymoramellado/feature/hito3api
estefanymoramellado Sep 9, 2024
96bfd5b
despliegue4
Sep 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
857 changes: 71 additions & 786 deletions README.md

Large diffs are not rendered by default.

9,184 changes: 9,184 additions & 0 deletions package-lock.json

Large diffs are not rendered by default.

13 changes: 8 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,27 @@
"license": "MIT",
"scripts": {
"htmlhint": "htmlhint src/*.html test/*.html",
"eslint": "eslint --ext .js src/ test/",
"pretest": "npm run eslint && npm run htmlhint",
"test": "jest --verbose --coverage test/",
"pretest": "npm run eslint",
"test": "jest",
"eslint": "eslint --ext .js src/",
"open-coverage-report": "opener ./coverage/lcov-report/index.html",
"start": "serve src/ -s"
},
"devDependencies": {
"@babel/core": "^7.6.2",
"@babel/plugin-transform-modules-commonjs": "^7.6.0",
"@playwright/test": "^1.46.1",
"acorn": "^8.8.2",
"babel-jest": "^27.0.1",
"css": "^3.0.0",
"eslint": "^8.3.0",
"eslint-plugin-import": "^2.29.1",
"gh-pages": "^3.1.0",
"htmlhint": "^1.0.0",
"jest": "^27.0.1",
"jest": "^27.5.1",
"jsdom": "^22.1.0",
"opener": "^1.5.1",
"prettier": "^3.3.3",
"serve": "^14.2.1"
},
"engines": {
Expand All @@ -36,4 +39,4 @@
"version": "9.1.1",
"commit": "1843c213affffa12aa456fa8842b6d28f97de2d3"
}
}
}
404 changes: 404 additions & 0 deletions src/Data/dataset.js

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions src/components/card.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
export default function renderCard(item) {
const li = document.createElement("li");
li.classList.add("card-list");
li.innerHTML = `
<div>
<h2 itemprop="nombre">${item.name} (${item.shortDescription})</h2>

<div class="div-item">
<img itemprop="image" src="${item.imageUrl}" alt="${item.name}">

<div class="item-facts">
<p class="date"><strong>Fecha de nacimiento:</strong> <span itemprop="birthDate">${item.facts.fechaDeNacimiento}</span></p>
<p class="sign"><strong>Signo Zodiacal:</strong> <span itemprop="zodiacSign">${item.facts.signoZodiacal}</span></p>

</div>
</div>
<div class="description">
<p class="type"><strong>Tipo de Guardiana:</strong> <span itemprop="guardianType">${item.facts.tipoDeGuardiana}</span></p>
<h3 itemprop="description"> ${item.description}</h3>
</div>
</div>
`;
return li;
}
15 changes: 15 additions & 0 deletions src/components/filters.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export default function filterComponent() {
const filterEl = document.createElement("select");
filterEl.setAttribute("id", "filterBy");
filterEl.innerHTML = `
<option value="">Tipo Guardián</option>
<option value="">Selecciona una opción</option>
<option value="guardian sistema solar interno">Guardian Sistema Solar Interno</option>
<option value="guardian sistema solar externo">Guardian Sistema Solar Externo</option>
<option value="guardian fuera del sistema solar">Guardian Fuera Sistema Solar</option>
<option value="protectores">Protectores</option>
<option value="gato guardian">Gato Guardian</option>
<option value="enemigos">Enemigos</option>
`;
return filterEl;
}
11 changes: 11 additions & 0 deletions src/components/order.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export default function Order() {
const sortEl = document.createElement("select");
sortEl.setAttribute("id", "sortBy");
sortEl.innerHTML = `
<option value="vacio">Orden</option>
<option value="vacio">Selecciona una opción</option>
<option value="asc"> Orden A-Z </option>
<option value="desc"> Orden Z-A </option>
`;
return sortEl;
}
Binary file added src/images/banner.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/images/cat.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/images/cats.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/images/logobanner.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/images/logosailor1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/images/prototipo.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
48 changes: 39 additions & 9 deletions src/index.html
Original file line number Diff line number Diff line change
@@ -1,12 +1,42 @@
<!DOCTYPE html>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Dataverse Chat</title>
<!--Aquí puedes importar tu archivo de CSS para agregar estilos.-->
</head>
<body>

<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Dataverse Chat</title>

<link rel="stylesheet" href="styles/styles.css" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Fresca&display=swap" rel="stylesheet" />
<link
href="https://fonts.googleapis.com/css2?family=Handjet:[email protected]&family=Libre+Franklin:ital,wght@0,100..900;1,100..900&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
rel="stylesheet" />
<link rel="stylesheet" href="styles/styleCards.css" />
</head>

<body>
<nav>
<a href="/" data-link>Home</a>
<a href="/character" data-link>Personajes</a>
<a href="/groupChat" data-link>Chat Sailor</a>
<a href="/viewApi" data-link>ApiKey</a>
</nav>

<main>
<div id="root"></div>
<script src="index.js" type="module"></script>
</body>
</main>

<footer>
<p>Creación: Estefany Mora &copy; 2024</p>
</footer>

<script src="index.js" type="module"></script>

</body>

</html>
40 changes: 25 additions & 15 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
// En este archivo definirás tus rutas e importarás los componentes que vas a renderizar.
import Home from "./views/home.js";
import Character from "./views/characterOld.js";
import ErrorView from "./views/errorView.js";
import viewApi from "./views/viewApi.js";
import renderChat from "./views/chat.js";
import { setRootEl, setRoutes, onURLChange } from "./router.js";

/*
import Example from './views/Example.js';

Ejemplo de definición de rutas:
//CONFIGURAR EL ROUTER

// Define las rutas
const routes = {
"/": Example,
...
}
*/
"/": Home,
"/character": Character,
"/errorView": ErrorView,
"/viewApi": viewApi,
"/chat": renderChat,
};

// Asigna rutas
setRoutes(routes);

/*
TODO:
1.- Definir rutas en router.
2.- Pasar "root element" a router.
3.- Invocar el router para renderizar la vista correcta.
*/
// Configura el elemento raíz
window.addEventListener("DOMContentLoaded", () => {
const rootElement = document.getElementById("root");
if (rootElement) {
setRootEl(rootElement);
onURLChange(window.location); // Entrega la ubicacion actual
}
});
8 changes: 8 additions & 0 deletions src/lib/apiKey.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export const getApiKey = () => {
const apiKey = localStorage.getItem("apiKey");
return apiKey;
};

export const setApiKey = (key) => {
localStorage.setItem("apiKey", key);
};
42 changes: 42 additions & 0 deletions src/lib/comunicateApiKey.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { getApiKey } from "./apiKey.js";

export const communicateWithApi = (messages, characterId, name) => {
return fetch("https://api.openai.com/v1/chat/completions", {
method: "POST",
headers: {
Authorization: `Bearer ${getApiKey()}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-3.5-turbo",
messages: [
{
role: "system",
content: `Eres una sailor ${name}. Responde como si fueras ${name}`,
},
{
role: "user",
content: `Character ID: ${characterId}. Message: ${messages}`,
},
],
max_tokens: 150,
}),
})
.then((response) => response.json()) // La solicitud se completó sin errores. then maneja el resultado de una promesa.
.then((data) => {

if (data && data.choices && data.choices.length > 0) {
return data.choices[0].message.content.trim();
} else {
throw new Error(
"No se encontraron respuestas en la respuesta de la API.",
);
}
})
.catch((error) => {
throw new Error(
"Error en la comunicación con la API: " +
(error.response ? error.response.data : error.message)
);
});
};
70 changes: 70 additions & 0 deletions src/lib/dataFunction.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// Crear funcion filterData
export const filterData = (data, filterBy, value) => {
return data.filter(
(item) =>
item.extraInfo[filterBy] &&
item.extraInfo[filterBy].toLowerCase() === value.toLowerCase(),
);
};
// Crear funcion sortData
export const sortData = (data, sortBy, sortOrder) => {
if (sortOrder === "asc") {
data.sort((a, b) => {
if (a[sortBy] < b[sortBy]) {
return -1;
}
if (a[sortBy] > b[sortBy]) {
return 1;
}
return 0;
});
}
if (sortOrder === "desc") {
data.sort((a, b) => {
if (a[sortBy] > b[sortBy]) {
return -1;
}
if (a[sortBy] < b[sortBy]) {
return 1;
}
return 0;
});
}
return data;
};

// Crear funcion computeStats
export function computeStats(dataFiltrada, totalPersonajes) {
// Se declara objeto para usar en la funcion reduce
const elementeReduce = {
totalTipoGuardian: 0,
tipoGuardian: [],
};

// Obtengo total tipo de guardian (totalTipoGuardian) y listado de guardianes (tipoGuardian)
const { totalTipoGuardian, tipoGuardian } = dataFiltrada.reduce(
(acumulador, personajes) => {
// Contador
acumulador.totalTipoGuardian += 1;

// Almacena el tipo de personaje
acumulador.tipoGuardian.push(personajes);

return acumulador;
},
elementeReduce,
);

// Calcula porcentaje
const porcentajeTipoGuardian = (totalTipoGuardian / totalPersonajes) * 100;

// Almacena los nombres
const nombreTipoPersonaje = tipoGuardian.map((guardian) => guardian.name);

return {
totalPersonajes,
totalTipoGuardian,
porcentajeTipoGuardian,
tipoGuardian: nombreTipoPersonaje,
};
}
76 changes: 76 additions & 0 deletions src/router.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import renderChat from "./views/chat.js";

let routes = {};
let rootEl = null;

export function setRoutes(ROUTES) {
routes = ROUTES;
}

export function setRootEl(rootElement) {
rootEl = rootElement;
}

// Convierte la cadena de consulta en un objeto
export function queryStringToObject(queryString) {
const queryParams = new URLSearchParams(queryString);
const result = {}; // Va ha almacenar los parametros de búsqueda.
queryParams.forEach((value, key) => {
result[key] = value;
});
return result;
}

// Actualiza el historial del navegador y renderiza la vista
export function navigateTo(pathname, props = {}) {

const queryParams = new URLSearchParams(props).toString();
const newPath = `${window.location.origin}${pathname}${queryParams ? `?${queryParams}` : ''}`;
// Actualizar la URL sin recargar la página
history.pushState(props, '', newPath);

// Obtener la nueva ruta y propiedades desde la URL
const newPathname = location.pathname; // Nuevo pathname
const newProps = queryStringToObject(location.search); // Convertir la query string a objeto

// Renderizar la vista correspondiente
renderView(newPathname, newProps);
}


function renderView(pathname, queryParams) {
// Verifica si la ruta es exactamente igual a una ruta en el objeto routes
if (routes[pathname]) {
const view = routes[pathname];
const viewElement = view(queryParams);
rootEl.innerHTML = ""; // Limpia el contenido actual de root
rootEl.appendChild(viewElement);
} else {
// Manejo de rutas dinámicas como /chat/:id
const chatRouteMatch = pathname.match(/^\/chat\/(\d+)(?:\/([^/]+))?$/);
if (chatRouteMatch) {
const characterId = chatRouteMatch[1]; // Extrae el ID del personaje
const viewElement = renderChat({ id: characterId });
rootEl.innerHTML = "";
rootEl.appendChild(viewElement);
} else {
// Si no coincide con ninguna ruta, renderiza la vista de error
const errorView = routes["/errorView"];
const viewElement = errorView();
rootEl.innerHTML = "";
rootEl.appendChild(viewElement);
}
}
}

// Controla lo cambios en la URL
export function onURLChange(location) {
const path = location.pathname;
const queryParams = queryStringToObject(location.search); // Convierte la cadena de consulta (query string) de la URL en un objeto
renderView(path, queryParams);
}

window.addEventListener("popstate", () => {
onURLChange(window.location);
});

Loading