Tópicos
- Introdução a Sections (dev)
- Primeira alteração e seleção de ambiente
- Resumo: Para alterar e testar uma
section
Introdução a Sections (dev)
A Section representa um elemento de UI configurável para um Site deco. Agora, é preciso entender o que isso representa em termos de desenvolvimento.
Uma Section é um código tsx
dentro da pasta sections
e que:
- é um componente Preact
- tem propriedades serializáveis
- exporta o tipo de suas propriedades
Um componente Preact, é uma função exportada por padrão (export default
) que recebe propriedades, retorna um JSX e é invocada a cada renderização do elemento que é definido. Como exemplo, abra, no VSCode, a section sections/Hero.tsx
do template de ecommerce. Este arquivo também está acessível no github da deco.
O código deste elemento é escrito em HTML com JS, como no exemplo abaixo.
import type { ImageWidget } from "apps/admin/widgets.ts";
/** @title {{{title}}} - {{{href}}} */
export interface Link {
title: string;
href: string;
}
export interface Props {
logo?: ImageWidget;
title?: string;
/** @format textarea */
headline?: string;
links?: Array<Link>;
}
export default function Hero({
title = "deco.cx",
logo = "/logo.svg",
headline =
"The digital experience platform that combines performance and personalization for the ultimate sales results.",
links = [
{ title: "Official website", "href": "https://deco.cx/" },
{ title: "Linkedin", "href": "https://www.linkedin.com/company/deco-cx/" },
{ title: "Discord", "href": "https://deco.cx/discord" },
],
}: Props) {
return (
<header class="lg:container mx-8 md:mx-16 lg:mx-auto mt-8 md:mt-12 mb-28 text-xl md:text-base">
<div class="mb-10 md:mb-20">
<img
class="object-cover w-20"
src={logo}
alt={title}
/>
</div>
<div class="font-bold text-3xl lg:text-6xl leading-tight lg:leading-none xl:w-5/6">
{headline}
</div>
{!!links?.length && (
<ul class="mt-8 flex flex-col md:flex-row gap-2 md:gap-4">
{links.map(({ href, title }) => (
<li>
<a target="_blank" href={href} aria-label={title} class="link">
{title}
</a>
</li>
))}
</ul>
)}
</header>
);
}
Observe os tipos exportados neste arquivo. Estes mesmos tipos são acessíveis no Admin ao criar um bloco Intro. No Admin, selecione a Sections, o bloco Hero
e a opção de criar de bloco para visualizar as mesmas propriedades em um formulário de edição.
As propriedades do código de um bloco se refletem no Admin.
/** @title {{{title}}} - {{{href}}} */
export interface Link {
title: string;
href: string;
}
export interface Props {
logo?: ImageWidget;
title?: string;
/** @format textarea */
headline?: string;
links?: Array<Link>;
}
Tipos no arquivo de uma Section
Um projeto deco faz uso do tipo das propriedades de um componente para gerar automáticamente o formulário de preenchimento de bloco no Admin. Na figura a seguir é possível visualizar como o Admin conhece as informações a serem colocadas no formulário. Para isto, o Admin entra em contato com o Site em produção para pegar os dados das propriedades das Sections daquele projeto. Por sua vez, o código em um Site é oriundo do GitHub, o mesmo que o desenvolvedor utiliza.
Primeira alteração e seleção de ambiente
Execute o projeto localmente (deno task start
) e altere o código da Hero
para receber uma nova propriedade opcional, o hightlight
de um link. Para isso, altere o tipo Link
e o código JSX do componente, lembrando de salvar o arquivo após a alteração.
import type { ImageWidget } from "apps/admin/widgets.ts";
import Image from "apps/website/components/Image.tsx";
export interface Props {
/**
* @title Post image.
*/
photo?: ImageWidget;
/**
* @title Post body.
*/
post: string;
/**
* @title Publish date.
* @format datetime
*/
datetime: string;
/**
* @title Post title.
*/
title: string;
}
export default function LatestPosts({ title, photo }: Props) {
return (
<div>
{photo && <Image
src={photo}
alt={`${title} image`}
height={500}
width={500}
class="rounded"
/>}
<h1 class="font-bold">{title}</h1>
<p>This is an example section</p>
</div>
);
}
Alterando o tipo Link e o JSX com a nova propriedade hightlight
Ao realizar esta alteração localmente, ela não afeta ou impacta o Site em produção. No entanto, com o projeto localmente (deno task start
), é possível visualizar tal alteração no próprio Admin. Para isto, é importante ir no seletor de ambiente, e escolher o localhost:8000
como referência.
Ao apontar para o localhost
, o admin consulta agora a versão rodando localmente para detectar as propriedades e sections
disponíveis.
Para que outras pessoas possam ver a alteração, é preciso realizar o commit
e push
das alterações. A branch main
tem o código que é exibido no domínio padrão do Site, mas é possível fazer a visualização de outras branches do repositório, bastando selecionar a branch em questão no seletor de ambientes.
section
Resumo: Para alterar e testar uma De forma sucinta, para testar alterações na Section Hero.tsx
:
Execute
deno task start
no Terminal. (Você não precisa executar novamente se já estiver rodando)Realize alterações localmente no arquivo
sections/Hero.tsx
.Acesse o Admin de deco.cx em https://deco.cx/admin, selecione seu Site e vá em
Sections
.Certifique-se de que
localhost:8000
esteja selecionado no Seletor de Ambiente no canto superior direito da página.Procure
Hero
dentre os blocos.Pronto! Agora você pode configurar
props
para essa Section e ver como ela está sendo renderizada. O preview atualizará automaticamente se você alterar o código da Section localmente.
Lembre-se de salvar o seu arquivo. Caso haja algum erro de tipagem ou transformação, o mesmo será sinalizado na linha de comando ou no próprio VSCode. Quando estiver confortável com as alterações, faça o envio do arquivo alterado ao repositório do GitHub.