# Criação de Loja - Passo a passo
## Instalação
Caso você ainda não tenha um projeto FastStore rodando, poderá seguir o seguinte [passo-a-passo](https://www.faststore.dev/quickstart) para ter uma loja base, você poderá optar por **Gatsby** ou **Next.js**.
## Configuração
Agora você pode configurar o seu ambiente na loja. Neste pequeno [guia](https://www.faststore.dev/tutorials/gatsby/3#step-2-connecting-to-your-vtex-account) você encontrará tudo que precisa no momento. Em resumo, você irá configurar a sua **plataforma**, **conta** e **ambiente** no arquivo `store.config.js`.
Após isso, a loja já pode ser executada com o comando `yarn develop` e os produtos cadastrados no catálogo da sua conta já devem ser exibidos no site.
## Estilização
Para customização de estilo das páginas e componentes da loja, a FastStore faz uso de *tokens*. Os *tokens* globais definem o estilo base que formam o tema da loja e a partir deles, os *tokens* locais definem os estilos dos componentes e layout das páginas.
> Exemplos de *tokens* de cores utilizados pela biblioteca: `--fs-color-main-0`, `--fs-color-main-1`, `--fs-color-accent-0`, `--fs-color-accent-1`.
Além disso, os *tokens* seguem um esquema de nomenclatura para auxiliar na identificação e uso deles, como pode ser observado nos exemplos acima. Mais detalhes sobre os *tokens* podem ser encontrados na página [*Theming*](https://www.faststore.dev/how-to-guides/theming) da documentação da FastStore.
Para um uso eficiente dos *tokens*, recomenda-se definir bem os *tokens* globais, uma vez que eles servirão de base para estilizar especificamente cada componente e página. Para essa definição, deve-se utilizar o *design system* da marca da loja, uma vez que a partir dela as cores, fontes e outras regras de estilo serão definidas e encaminharão o estilo final da loja. Além disso, qualquer mudança no *design system* da marca terá apenas um ponto de alteração no código, reduzindo possíveis trabalhos futuros.
Para facilitar a estilização condicional dos componentes, a FastStore utiliza de *data-attributes* que são exemplificados na [documentação de princípios de design](https://www.faststore.dev/how-to-guides/contributing/design-principles#data-attributes-for-styling).
```jsx
<List data-list>
<li data-list-item>
<Checkbox data-checkbox onChange={onChange} />
</li>
</List>
```
> No exemplo acima, cada componente apresenta um *data-attribute*, sendo `data-list`, `data-list-item` e `data-checkbox` para os respectivos componentes: `List`, `li` e `Checkbox`
## Componentes
Para facilitar a customização da loja, a biblioteca FastStore oferece diversos componentes genéricos que podem ser encontrados na [seção UI da documentação](https://www.faststore.dev/reference/ui/components). A partir deles, implementou-se modificações que podem ser encontradas na pasta `src/components` no template da loja. Além dessas modificações, outros componentes mais específicos podem ser encontrados na pasta.
Para implementação de componentes, recomenda-se observar quais componentes já estão presentes na biblioteca ou na loja e a partir deles realizar modificações ou composições, evitando retrabalho.
### Utilizando o Storybook
A Faststore utiliza o [Storybook](https://storybook.js.org/) para documentar os componentes, seguindo a classificação [Atomic Design](https://bradfrost.com/blog/post/atomic-web-design/). Alguns componentes da FastStore já estão presentes no Storybook, mas você pode adicionar os componentes que você criou e está trabalhando, seguindo esse [guia](https://github.com/vtex/styleguide/blob/master/.github/CONTRIBUTING.md#storybook-organization).
Recomendamos olhar os componentes do template no Storybook para você conhecer e ter uma ideia geral dos componentes que você pode utilizar na sua loja.
Para utilizar o **Storybook**, abra seu terminal e digite `$ yarn storybook`, e o resultado irá aparecer em http://localhost:3000/ para uma loja Next.js ou na porta `8000` para o Gatsby.
### Criando componentes de forma eficiente
A partir do conhecimento dos componentes já ofertados, talvez seja necessário modificá-los ou até criar algum do zero para atingir o resultado desejado. Para criação de um componente eficiente, deve-se seguir algumas boas práticas que auxiliam na legibilidade e manutenção do código escrito.
Uma recomendação para estruturar um componente complexo é dividi-lo em três partes:
1. Um componente responsável apenas pela apresentação;
2. Um *hook* para obtenção de dados e controle de estados;
3. Outro componente responsável pela renderização do componente de apresentação.
Essa divisão ajuda a composição de componentes, além de se direcionar para o princípio da responsabilidade única ([SRP](https://en.wikipedia.org/wiki/Single-responsibility_principle)) e separação das responsabilidades ([SOC](https://en.wikipedia.org/wiki/Separation_of_concerns)). Para exemplificação dessa divisão e melhor entendimento, recomenda-se acessar a [documentação de componentes da FastStore](https://www.faststore.dev/how-to-guides/contributing/component).
## Obtenção de dados
### Estendendo o esquema GraphQL
A [**FastStore API**](https://www.faststore.dev/reference/api/faststore-api) usa [GraphQL](https://graphql.org/) para trazer as informações da sua plataforma de e-commerce ou *Headless* CMS para a aplicação frontend.
Por exemplo, para obtenção dos dados de um produto, pode-se utilizar a *query* `product` que oferece informações como o nome, a descrição, as ofertas, entre outras.
Caso precise de algum dado ou operação que não esteja presente nas [*queries*](https://www.faststore.dev/reference/api/queries) e [*mutations*](https://www.faststore.dev/reference/api/mutations) já fornecidas, pode-se estender o esquema GraphQL. Recomenda-se seguir esse [guia](https://www.faststore.dev/how-to-guides/faststore-api/extending-the-faststore-api#complete-code-example) para mais detalhes de como realizar essa extensão.
De forma resumida, define-se os novos tipos GraphQL que serão utilizados, como também a *query* que será utilizada:
```typescript
const typeDefs = `
type Category {
id: ID!
name: String!
}
type Query {
categories: [Categories!]!
}
`
```
Além disso, define-se a função *resolver* que será responsável por processar a *query* desejada:
```typescript
const resolvers = {
Query: {
categories: async () => {
const categories = await getCategoriesFromDb()
return categories
}
}
}
```
Depois de qualquer mudança no esquema GraphQL, suba o servidor de desenvolvimento, para isso, abra seu terminal e digite:
`$ yarn develop`
Em seguida, abra outro terminal e digite:
`$ yarn generate`
Feito isso, as *queries* e fragmentos GraphQL estarão disponíveis para serem consumidas, disponibilizando os dados desejados para os componentes da aplicação.
### VTEX REST API
Ao utilizar a plataforma de catálogo da VTEX, alguns dados desejados podem estar indisponíveis na FastStore API. Se este for o caso, utilize-se das rotas definidas na [VTEX API Reference](https://developers.vtex.com/docs/api-reference) para obtê-los e estenda o esquema GraphQL, como citado acima, para disponibilizá-los para os componentes.
As chamadas para os *endpoints* da API REST podem ser realizadas nas funções *resolvers*, que foram exemplificadas acima.
Atente-se que apenas algumas rotas são públicas. Sendo assim, outras precisam de autenticação para serem utilizadas.