3
respostas

Criando novos elementos: Enviar Vídeos. Não consigo enviar novos vídeos

criaVideo.js

import { conectaApi } from "./conectaApi.js";/*Você está importando a função conectaApi do arquivo conectaApi.js. 
Isso é fundamental para que você possa utilizar as funcionalidades que foram definidas nesse arquivo, como a função que envia os dados
para a API. */

const formulario = document.querySelector("[data-formulario]");

async function criarVideo(evento){/*não função recebe o evento ou seja o que acontece quando eu clico*/
    evento.preventDefault();/*previne que a ação padrão do envio do formulário aconteça */

    const imagem = document.querySelector("[data-imagem]").value;/*value pega o valor do campo que acabamos de selecionar */
    const url = document.querySelector("[data-url]").value;
    const titulo = document.querySelector("[data-titulo]").value;
    const descricao = Math.floor(Math.random() * 10).toString(); /*Agora a questão da descrição, a descrição do nosso vídeo era o número
    de visualizações. Eu até já trouxe a problemática de que isso não poderia ser do controle do usuário, e como não temos um contador 
    a gente precisava definir um número.
    Para isso, vamos criar uma variável chamada descrição do tipo const const descricao = Math.floor(Math.random()*10).toString();.
    O que eu botei tanta coisa com matemática? Não se assuste, usamos map Math.random e ele traz o número aleatório entre zero e um. 
    Para transformar em um número inteiro, fizemos vezes dez, e ele retornou um número inteiro. O Math.floor ele tenta pegar o menor 
    número entre os valores que estiverem dentro do parênteses dele. Nós tendo finalmente um número, transformamos em string para 
    conseguir depois passar para a nossa requisição, não podia ser um número aqui para transformar na frase, precisávamos de uma string.
     */
    console.log(titulo, descricao, url, imagem);
    await conectaApi.criaVideos(titulo, descricao, url, imagem);
/* É importante também avisar que a ordem do que eu coloquei dentro do criarVideo faz sentido, porque se formos no conectaApi é nessa 
ordem que ele está esperando receber, é título, descrição, URL e imagem. Se eu colocasse em outra ordem eu poderia sem querer mandar a
imagem para o campo que ele está esperando uma URL, isso ia dar vários problemas. Então tem que prestar atenção quando estamos enviando
algo para uma função, que também está esperando receber algo. */

Window.location.href = "../pages/envio-concluido.html";
/*E para isso, vamos digitar aqui na linha 14, no lado inferior esquerdo da tela, mas dentro da criarVideo depois da await, é window.
location.href = "." e dentro das aspas duplas, vamos colocar o diretório do documento envio-concluido.html. Então para chegar lá vamos
 dar window.location.href = "../pages/envio-concluido.html". Com isso, conseguimos dar um feedback, de tipo conseguiu fazer esse envio,
  e aí ele vai ser enviado para página de envio concluído. */
}

formulario.addEventListener("submit", evento => criarVideo(evento));
/*O que eu fiz? Eu botei como diz a tradução do addEventListener, um ouvinte de ouvinte, é um fofoqueiro. Ele vê quando enviamos o 
formulário, que é quando enviamos o submit daquele formulário e quando isso acontece ele conta a fofoca, ele manda ali o evento, 
o que aconteceu para a função criarVideo. */ 

vou enviar os outros arquivos em seguida pois ultrapassa o limite devido aos comentários

3 respostas

conectaApi.js

async function listaVideos() {
    const conexao =await fetch("http://localhost:3000/videos");
    const conexaoConvertida = await conexao.json(); /*O que esse método json faz? Ele pega todos aqueles dados em formato de bytes,
    que estávamos recebendo antes e transforma em um json bonito. E lembra que um json, ele parece um objeto? Até que o nome dele em 
    JavaScript é object notation? Na tela, ele transformou em um objeto para conseguirmos ter acesso a todos os valores lá dentro. */
   // console.log(conexaoConvertida); não precisamos mais 
   return conexaoConvertida /*Quando chamar essa função ele vai retornar aquela lista cheia de coisas do db.json para onde for chamada */
}

//cria a funçao cria video
async function criaVideos(titulo, descricao, url, imagem) 
/*Agora precisamos fazer alguns ajustes. Como eu disse, quando botei titulo: título é porque esse segundo título que está sendo 
atribuído, era para recebermos como variável, para fazer isso, vamos lá na linha oito e dentro dos parênteses, vamos botar esses 
valores título, descrição, URL, vírgula imagem.
Agora vamos conseguir enviar para a variável, enviar para a função criarVideo esses valores, e esses valores vão ser atribuídos 
a essas propriedades do body. */
{
    const conexao = await fetch("http://localhost:3000/videos",{
         /*No nosso caso, agora vamos criar uma requisição POST. Mas não para por aí, temos outras coisas para colocar aqui dentro, 
        como bota uma vírgula depois do POST, dá um Enter e vamos vai colocar headers: {} e abre e fecha chaves, porque também 
        vai ter um conjunto de configurações que poderiam ser feitas, mas vamos botar um só, que é "Content-type":application/json". */
        
        method: "POST",
        /*Lembra que quando eu falei que quando fazíamos o fetch, o único parâmetro obrigatório era URL. E se não especificássemos mais
        nada, o método que estávamos usando, a requisição que estávamos fazendo era GET? Para declarar outros tipos de requisições, 
        é assim, vamos colocar várias outras configurações entre chaves. Inclusive, qual que vai ser o tipo de requisição, que é o método. */
       
        headers: {
            "content-type": "aplication/json"
            /*O Content-type que está dentro do headers ele serve para especificar que tipo de arquivo que está sendo enviado, ou 
            recebido. Então quando estamos enviando, ou quando estamos recebendo um arquivo de json, especificamos o tipo do conteúdo, 
            que é o Content-type, como application/json. */
        },

        /* tem mais coisa para colocar aqui? Tem. Então depois então do fechamento das chaves do headers, vamos botar uma vírgula, 
        dá um Enter para ficar embaixo, vamos botar body:JSON.stringify({}). Aqui dentro, vamos enviar os dados que queremos cadastrar 
        nesta requisição, que é título, descrição, URL e imagem. Então vamos botar título = título, que vamos receber uma variável 
        chamada título, não declaramos ainda, mas vamos. Depois vírgula embaixo, descricao =. Onde estou falando igual são dois pontos,
        url: url, imagem: imagem. 
        Então, o que estamos fazendo aqui? Estamos enviando um body, que como a tradução diz, ele é o corpo da requisição, e quando 
        colocamos as chaves com essas coisas ali dentro no lado superior esquerdo da tela, estamos enviando um objeto de variáveis, 
        de valores, indiferentes, pode ser um número, pode ser uma letra, estamos enviando um objeto de valor.
        Só que para enviar uma requisição, precisamos enviar uma string. Então esse JSON.stringify ele vai transformar em uma string 
        tudo aquilo ali que a gente estamos enviando. Assim, vai ser possível criar solicitação POST, a requisição POST.*/
        body: JSON.stringify({
            titulo: titulo,
            /*vamos alterar a descricao  - Também, vou ajustar um negócio aqui. Lembra que a descrição ela era tantas mil visualizações.
            Se eu conseguir colocar manualmente esse número de visualizações não faz sentido, porque quando vamos em outras plataformas 
            de compartilhamento de vídeo isso não é do controle do usuário, isso é de acordo com os cliques. Como ainda não vamos 
            implementar uma função que tem um contador, vamos fazer um número tais visualizações.*/
            //descricao: descricao,
            descricao: `${descricao} mil visualizações`,
            url: url,
            imagem: imagem
        })

       
    } );

    const conexaoConvertida = await conexao.json();
    return conexaoConvertida;
}

export const conectaApi = {
    listaVideos,
    criaVideosw

}/*ele vai exportar uma variável chamada conectaApi, que vai receber um objeto cheio de funções. Nós conseguimos passar tudo ali dentro
e usar só o que quisermos. */

enviar-videos.html

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="../css/reset.css">
    <link rel="stylesheet" href="../css/estilos.css">
    <link rel="stylesheet" href="../css/estilos-form.css">
    <link rel="stylesheet" href="../css/flexbox.css">
    <title>AluraPlay</title>
    <link rel="shortcut icon" href="./img/favicon.ico" type="image/x-icon">
</head>

<body>

    <!-- Cabecalho -->
    <header>

        <nav class="cabecalho">
            <a class="logo" href="../index.html"></a>

            <div class="cabecalho__icones">
                <a href="./enviar-video.html" class="cabecalho__videos"></a>
            </div>
        </nav>

    </header>

    <main class="container">

        <form class="container__formulario" data-formulario>
            <!--Os data attributes no HTML são uma forma de armazenar informações personalizadas em elementos HTML. 
            Eles permitem que você adicione dados extras a um elemento sem afetar a sua apresentação ou funcionalidade. 
            Esses atributos começam com o prefixo data-, seguido de um nome que você escolher.
            Por exemplo, se você tem um formulário e quer armazenar informações sobre o que cada campo representa.
            Organização: Eles ajudam a organizar informações relacionadas a um elemento de forma clara.
            Acessibilidade: Você pode acessar esses dados facilmente através do JavaScript, usando dataset.
            Flexibilidade: Permitem que você adicione informações personalizadas sem a necessidade de criar novos atributos HTML.
            -->
            <h2 class="formulario__titulo">Envie um vídeo!</h3>
                <div class="formulario__campo">
                    <label class="campo__etiqueta" for="url">Link embed</label> 
                    <input name="url" class="campo__escrita" required
                        placeholder="Por exemplo: https://www.youtube.com/embed/FAY1K2aUg5g" id='url' data-url />
                </div>


                <div class="formulario__campo">
                    <label class="campo__etiqueta" for="titulo">Titulo do vídeo</label>
                    <input name="titulo" class="campo__escrita" required placeholder="Neste campo, dê o nome do vídeo"
                        id='titulo' data-titulo />
                </div>

                <div class="formulario__campo">
                    <label class="campo__etiqueta" for="imagem">Imagem de perfil</label>
                    <input name="imagem" class="campo__escrita" required placeholder="Insira a url da imagem"
                        id='imagem' data-imagem />
                </div>

                <input class="formulario__botao" type="submit" />

        </form>

    </main>
<script src="../JS/criarVideo.js" type="module"></script>
<!--A declaração type="module" na linha de código <script src="../JS/criarVideo.js" type="module"></script> indica que o arquivo 
JavaScript que está sendo importado deve ser tratado como um módulo ES6 (ECMAScript 2015).
Aqui estão algumas características importantes sobre o uso de módulos:
Escopo de Módulo: Quando você utiliza type="module", o código dentro desse arquivo JavaScript é executado em um escopo de módulo. 
Isso significa que as variáveis e funções definidas dentro desse módulo não são acessíveis globalmente, evitando conflitos com outras 
partes do código.
Importação e Exportação: Módulos permitem que você importe e exporte funções, objetos ou variáveis entre diferentes arquivos JavaScript.
Isso facilita a organização do código e a reutilização de componentes. Por exemplo, você pode ter um arquivo que exporta uma função e
outro que a importa para utilizá-la.
Carregamento Assíncrono: Os módulos são carregados de forma assíncrona, o que significa que o navegador não bloqueia a renderização da
página enquanto o módulo está sendo carregado. Isso pode melhorar o desempenho da sua aplicação.
Uso de import e export: Dentro de um módulo, você pode usar as palavras-chave import e export para compartilhar funcionalidades entre
diferentes arquivos. 
Por exemplo:
// arquivo1.js
export function minhaFuncao() {
    console.log("Olá, mundo!");
}

// arquivo2.js
import { minhaFuncao } from './arquivo1.js';
minhaFuncao(); // Chama a função importada

Essas características tornam os módulos uma ferramenta poderosa para organizar e estruturar seu código JavaScript de forma mais eficiente.
-->
</body>

</html>

Olá, Alexandre. Tudo bem?

Alguns ajustes precisam ser feitos no código:

  1. Exportação de criaVideos: No arquivo conectaApi.js, há um erro de digitação ao nomear a função para ser exportada, no momento está como criaVideosw, corrija para criaVideos.
  2. Content-type: Também no conectaApi.js, tamém há erros de digitação no Content-type. Ajuste para: "Content-Type": "application/json"
  3. window.location.href: Aqui também há um erro de digitação, no seu código, window está com o w maiúculo. Corrija para o w minúsculo: window.location.href.

Com essas modificações o envio passar a funcionar corretamente!

Espero ter ajudado!

Siga firme nos seus estudos e conte com o fórum sempre que precisar!

Abraços :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado