Proyecto guifOS
Arquitectura
Arquitectura General
guifOS
SPA
HTML
CSS
JS
Layout
Theme Day
Theme Night
API Services
DOM Handling
GIF Rendering
Style Handling
Video Recorder
Visit Counter
Init
Arquitectura Javascript
Punto de Partida
Pensar el programa como un flujo de información que parte desde un Input y busca un resultado (Output)
Input
Output
Programa
Como lo utilizo?
Que resultado espero?
Arquitectura Javascript
Reglas
Evitar variables globales
DRY (Don't Repeat Yourself)
SRP (Single Responsibility Principle)
Arquitectura Javascript
Funciones
Input
unaFuncion()
otraFuncion()
otraMas()
yOtra()
laUltima()
Output
Arquitectura en base a objetos
const giphyApi = {
searchEndpoint: "https://api.giphy.com/v1/gifs/search",
trendEndpoint: "https://api.giphy.com/v1/gifs/trending",
uploadEndpoint: "https://upload.giphy.com/v1/gifs?",
idEndpoint: "https://api.giphy.com/v1/gifs/",
apiKey: "eiVo3MScNwrZJfkUOIP0WHzIV8uOQesx",
abortController: new AbortController(),
getSearchResults: (url, requestType, limit = 20) => {
const API_KEY = giphyApi.apiKey;
const found = fetch(
url + requestType + "&api_key=" + API_KEY + "&limit=" + limit
).then(response => {
return response.json();
});
return found;
},
postGif: async () => {
try {
const API_ENDPOINT = giphyApi.uploadEndpoint;
const API_KEY = giphyApi.apiKey;
const heading = new Headers();
const uploadFile = createGif.createFormData();
const response = await fetch(API_ENDPOINT + "api_key=" + API_KEY, {
method: "POST",
headers: heading,
body: uploadFile,
cors: "no-cors",
signal: giphyApi.abortController.signal
});
const json = await response.json();
const gifId = json.data.id;
giphyApi.getUploadedGif(gifId);
} catch (error) {
domHandling.showErrorMsg(error);
domHandling.handleUploadWindows();
domHandling.handleRecordField();
domHandling.handleStartWindows();
domHandling.handleGifsSection();
myGuifos.renderMyGuifos();
}
},
getUploadedGif: async id => {
const API_ENDPOINT = giphyApi.idEndpoint + id + "?";
const API_KEY = giphyApi.apiKey;
const response = await fetch(API_ENDPOINT + "&api_key=" + API_KEY);
const json = await response.json();
const gifUrl = await json.data.images.original.url;
createGif.saveGif(gifUrl);
domHandling.handleSuccessWindows(gifUrl);
}
};
Ejemplo 1
Busqueda de Gifs
1. Evento Onsubmit
const domHandling = {
// ASINGACION DEL ELEMENTO HTML DENTRO DEL OBJETO.
searchForm: document.querySelector("#search-form"),
....
// CREO UN METODO PARA MANEJAR LOS EVENTOS.
handlerEvents: () => {
domHandling.searchForm.onsubmit = event => {
renderGifs.cleanRenderedGifs(); // LIMPIA LOS GIFS RENDERIZADOS ANTERIORMENTE
domHandling.removeRelatedButtons(); // REMUEVE LOS BOTONES
//AZULES DE LA BUSQUEDA ANTERIOR
domHandling.printSearchTitle(domHandling.getUserInput()); // IMPRIME EL
//TITULO DE LA BUSQUEDA EN EL ENCABEZADO
renderGifs.renderResultGifs(
giphyApi.searchEndpoint, // LO VEMOS A CONTINUACION
`?q=${domHandling.getUserInput()}`
);
event.preventDefault(); //IMPIDE QUE SE RECARGUE LA PAGINA
};
}
};
2. Function renderResultGifs( )
renderResultGifs: async (url, requestType) => {
domHandling.resetSearchField(); // LIMPIA EL INPUT DE BUSQUEDA
const gifsObject = await giphyApi.getSearchResults(url, requestType); // FETCH A GIPHY.
const printedTags = []; // ALMACENA LOS TITULOS YA IMPRESOS
//COMO TAGS RELACIONADOS PARA QUE NO SE REPITAN
let gifCounter = 0; // ESTE COUNTER ME PERMITE ASIGNARLE ID A LOS
//ELEMENTOS DINAMICOS PARA MANIPULARLOS EN EL DOM.
let spanCounter = 0; // CON ESTO SE LIMITA EL NUMERO DE
//IMAGENES DOBLES A UNA CANTIDAD MAXIMA (LINEA 46)
gifsObject.data.forEach(data => {
const gifUrl = data.images.original.url;
const gifWidth = data.images.original.width; /// OBTENGO DATOS DEL OBJETO
const gifHeigth = data.images.original.height;
const gifDescription = data.title.toLowerCase();
renderGifs.printGifs(gifUrl, gifCounter); //IMPRIME GIFS
renderGifs.printGifTags(gifDescription, gifCounter); // IMPRIME LOS TAGS
if (
url === giphyApi.searchEndpoint &&
!printedTags.includes(gifDescription) &&
gifDescription.length > 3
) {
domHandling.printRelatedButtons(gifDescription); // IMPRIME BOTONES AZULES
printedTags.push(gifDescription);
domHandling.resultsTitle.scrollIntoView();
}
if (spanCounter < 4 && +gifWidth > +gifHeigth * 1.2) {
renderGifs.applySpan(gifCounter); // APLICA SPAN DOBLE
spanCounter++;
}
gifCounter++;
});
},
renderResultGifs( )
resetSearchField( )
getSearchResults( )
printGifs( )
printGifsTags( )
printRelatedButtons( )
applySpan( )
Flujo de la Función
printGifs( )
printGifsTags( )
applySpan( )
printRelatedButtons( )
resetSearchField( )
Output
Ejemplo 2
Crear Gifs
(DOM)
1. Evento Onclick
const domHandling = {
createBtn: document.querySelector("#create-gif"),
....
handlerEvents: () => {
.....
domHandling.createBtn.onclick = () => {
domHandling.handleCreateSection();
domHandling.handleStartWindows();
domHandling.handleSuggestedGifs();
domHandling.handleSearchSection();
domHandling.handleNavBar();
domHandling.handleArrowBack();
myGuifos.renderMyGuifos();
};
}
}
2. Handlers
handleSuggestedGifs: () => {
const $SUGGESTED_SECTION = document.querySelector("#gifs-suggested");
$SUGGESTED_SECTION.className !== "hidden"
? ($SUGGESTED_SECTION.className = "hidden")
: ($SUGGESTED_SECTION.className = "suggested-gifs");
},
handleCreateSection: () => {
const $CREATE_SECTION = document.querySelector("#create-gif-section");
$CREATE_SECTION.className !== "hidden"
? ($CREATE_SECTION.className = "hidden")
: ($CREATE_SECTION.className = "create-gifos");
},
handleSearchSection: () => {
const $SEARCH_SECTION = document.querySelector("#search-section");
$SEARCH_SECTION.className !== "hidden"
? ($SEARCH_SECTION.className = "hidden")
: ($SEARCH_SECTION.className = "gifs-search");
},
handleNavBar: () => {
const $NAV_BAR = document.querySelector("nav");
$NAV_BAR.className !== "hidden"
? ($NAV_BAR.className = "hidden")
: ($NAV_BAR.className = "gifs-search");
},
handleSuggestedGifs( )
handleSearchSection( )
handleNavbar( )
3. Output (Ocultar)
handleCreateSetion( )
handleStartWindows( )
handleArrowback( )
handleMyGuifos( )
3. Output (Mostrar)
Proyecto guifOS
By Alexis Lazzuri
Proyecto guifOS
- 2,271