Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Desafio final concluído

App.jsx

import styled from "styled-components"
import EstilosGlobais from "./componentes/EstilosGlobais"
import Cabecalho from "./componentes/Cabecalho"
import BaraLateral from "./componentes/BarraLateral"
import Banner from "./componentes/Banner"
import BackgroundImg from "/imagens/banner.png"
import Galeria from "./componentes/Galeria"
import fotos from './fotos.json'
import { useEffect, useState } from "react"
import ModalZoom from "./componentes/ModalZoom"
import Rodape from "./componentes/Rodape"

const FundoGradiente = styled.div`...`
const AppContainer = styled.div`...`
const MainContainer = styled.main`...`
const ConteudoGaleria = styled.section`...`

const App = () => {
  const [fotosDaGaleria, setFotosDaGaleria] = useState(fotos)
  const [fotoSelecionada, setFotoSelecionada] = useState(null)
  const [busca, setBusca] = useState('')
  const [tag, setTags] = useState('')
  const aoAlternarFavorito = (foto) => {
    if (foto.id === fotoSelecionada?.id) {
      setFotoSelecionada({
        ...fotoSelecionada,
        favorita: !fotoSelecionada.favorita
      })      
    }
    setFotosDaGaleria(fotosDaGaleria.map(fotosDaGaleria => {
      return{
        ...fotosDaGaleria,
        favorita: fotosDaGaleria.id === foto.id ? !foto.favorita :fotosDaGaleria.favorita
      }
    }))
  }
  useEffect(() => {
    const resultadosDaBusca = fotos.filter(foto => foto.titulo.toLowerCase().includes(busca.toLowerCase()))
    setFotosDaGaleria(resultadosDaBusca)
  }, [busca])
  useEffect(() => {
    const fotosTag = fotos.filter(foto => !tag || foto.tagId ===tag)
    setFotosDaGaleria(fotosTag)
  },[tag])
  return (
    <FundoGradiente>
      <EstilosGlobais />
      <AppContainer>
        <Cabecalho aoPesquisar={evento =>setBusca(evento)}   />
        <MainContainer>
          <BaraLateral />
          <ConteudoGaleria>
            <Banner
              backgroundImage={BackgroundImg}
              texto={'A galeria mais completa de fotos do espaço'}
            />
            <Galeria 
              aoFiltrar={tag =>setTags(tag)}
              aoFotoSelecionada={foto => setFotoSelecionada(foto)} 
              aoAlternarFavorito={aoAlternarFavorito}
              fotos={fotosDaGaleria} 
            />
          </ConteudoGaleria>
        </MainContainer>
      </AppContainer>
      <ModalZoom 
        foto={fotoSelecionada}
        aoFechar={() => setFotoSelecionada(null)}
        aoAlternarFavorito={aoAlternarFavorito}
      />
      <Rodape />
    </FundoGradiente>
  )
}
export default App

CampoTexto

import styled from "styled-components";
import search from './search.png'

const ContainerEstilizado = styled.div`...`

const CampoTextoEstilizado = styled.input`...`
const IconeLupa = styled.img`...`
const CampoTexto = ({aoPesquisar}) => {
    return (
        <ContainerEstilizado>
            <CampoTextoEstilizado placeholder="O que você procura?" onChange={(evento) => aoPesquisar(evento.target.value)}  />
            <IconeLupa src={search} alt="ícone de lupa" />
        </ContainerEstilizado>
    )
}
export default CampoTexto

Tags

import styled from 'styled-components'
import tags from './tags.json'

const TagsContainer = styled.section`...`

const TagsTitulo = styled.h3`...`
const TagsBtn = styled.button`...`
const Div = styled.div`...`
const Tags = ({aoFiltrar}) => {
    return(
        <TagsContainer>
            <TagsTitulo>Busque por tags:</TagsTitulo>
            <Div>
                {tags.map(tag =><TagsBtn key={tag.id} onClick={()=> aoFiltrar(tag.id)}>{tag.titulo}</TagsBtn>)} 
            </Div>
        </TagsContainer>
    )
}
export default Tags

Componente Rodape

import styled from "styled-components"

const Footer = styled.footer`
    background-color: #04244F;  
    width:100%;
    height: 80px;
    margin-top: 73px;
    display: flex;
    justify-content: space-between;
    align-items: center;
`
 const RedesSociais = styled.div`
    display: flex;
    align-items: center;
    gap: 34px;
    padding-top: 5px;
    margin-left: 30px;
`
const Registro = styled.h3`
    color: #fff;
    font-size: 16px;   
    margin-right: 30px;
`
const Rodape = () => {
    return(
        <Footer>            
                <RedesSociais>
                    <a>
                        <img src="./imagens/sociais/facebook.svg"/>
                    </a>
                    <a>
                        <img src="./imagens/sociais/twitter.svg"/>
                    </a>
                    <a>
                        <img src="./imagens/sociais/instagram.svg"/>
                    </a>
                </RedesSociais>
                <Registro>Desenvolvido por Alura</Registro>           
        </Footer>
    )
}
export default Rodape

Link para repositório: https://github.com/daviizui/styledComponentesArquivosEstaticos

1 resposta
solução!

Olá Davi! Tudo bem?

Parabéns pela conclusão do desafio final, você fez um ótimo trabalho!

Agradecemos por compartilhar seu resultado com a comunidade Alura! Conte sempre com o apoio do fórum :)

Um abraço e bons estudos!