Ecrã em React Native com Expo e TypeScript com todos os estados

Gere um ecrã de app móvel em React Native e TypeScript com estados de carregamento, vazio, erro e sem ligação, lista otimizada, acessibilidade, área segura e testes com Testing Library. Pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Inclui 4 variáveis personalizáveis e pode copiá-lo gratuitamente com um clique.

Intermédio · Código · Pendente de revisão editorial

Prompt

Atua como programador mobile sénior especializado em React Native, Expo e TypeScript, com atenção ao desempenho e à acessibilidade em iOS e Android.

Contexto:
- Objetivo do ecrã e ações do utilizador: {{ecra}}
- Origem dos dados (endpoint, forma da resposta, autenticação): {{dados}}
- Biblioteca de navegação: {{navegacao}}
- Estilo visual e bibliotecas já existentes no projeto: {{estilo}}

Entregáveis:
1. Estrutura de ficheiros: ecrã, componentes filhos, hook de dados e tipos.
2. Tipos TypeScript para a resposta da API e as props, sem any.
3. Hook de dados com carregamento, erro, nova tentativa, pull-to-refresh e cancelamento ao desmontar o ecrã. Se o projeto já usar uma biblioteca de obtenção de dados, adapta-te a ela; se não, explica quando compensaria usá-la.
4. Ecrã completo com estados claros: a carregar (esqueleto), vazio com apelo à ação, erro com botão para tentar de novo e sem ligação.
5. Listas com FlatList ou equivalente otimizado: keyExtractor estável, itens memorizados, paginação ou scroll infinito se fizer sentido.
6. Acessibilidade: accessibilityLabel e accessibilityRole, tamanhos mínimos de toque, suporte a tamanho de texto dinâmico e leitura correta com VoiceOver e TalkBack.
7. Layout adaptável: SafeAreaView ou insets, teclado (KeyboardAvoidingView se houver formulários), modo escuro e diferenças entre iOS e Android.
8. Testes com React Native Testing Library para os estados de carregamento, erro e sucesso, com a API simulada.

Restrições:
- Não inventes endpoints nem campos: se faltar a forma da resposta, usa um tipo marcado como [PREENCHER] e pergunta-me.
- Não acrescentes dependências sem justificar porquê e sem indicar a alternativa sem dependência.
- Se o ecrã ou o fluxo não forem claros, pergunta-me antes de escrever o código.

Formato: secções numeradas, um bloco de código por ficheiro e notas breves sobre as decisões.

Como utilizar

Cola um exemplo real da resposta JSON da tua API e indica as bibliotecas que já usas. Testa o ecrã num dispositivo iOS e num Android, em modo de avião e com o tamanho de letra no máximo.

Exemplo de utilização

Ecrã: lista de encomendas do utilizador com filtro por estado e detalhe ao tocar · Dados: GET /orders paginado com token · Navegação: Expo Router · Estilo: StyleSheet com as cores da marca.

Exemplo de resultado

3. Hook de dados — hooks/useReceitas.ts

import { useCallback, useEffect, useRef, useState } from 'react';

export type Receita = { id: string; titulo: string; imagem: string; minutos: number }; // tipo do id: [COMPLETAR]
type RespostaReceitas = { items: Receita[]; total: number };
type Estado = 'a_carregar' | 'erro' | 'ok';

const API_URL = process.env.EXPO_PUBLIC_API_URL;

export function useReceitas(pesquisa: string) {
  const [receitas, setReceitas] = useState<Receita[]>([]);
  const [estado, setEstado] = useState<Estado>('a_carregar');
  const [aAtualizar, setAAtualizar] = useState(false);
  const controlador = useRef<AbortController | null>(null);

  const carregar = useCallback(async (eRefresh = false) => {
    controlador.current?.abort();                       // cancela o pedido anterior
    const ctrl = new AbortController();
    controlador.current = ctrl;
    if (eRefresh) setAAtualizar(true); else setEstado('a_carregar');
    try {
      // Nome do parâmetro de pesquisa: [COMPLETAR]
      const params = new URLSearchParams({ pagina: '1', q: pesquisa });
      const res = await fetch(`${API_URL}/api/receitas?${params}`, { signal: ctrl.signal });
      if (!res.ok) throw new Error(`HTTP ${res.status}`);
      const dados = (await res.json()) as RespostaReceitas;
      setReceitas(dados.items);
      setEstado('ok');
    } catch {
      if (!ctrl.signal.aborted) setEstado('erro');
    } finally {
      if (!ctrl.signal.aborted) setAAtualizar(false);
    }
  }, [pesquisa]);

  useEffect(() => {
    carregar();
    return () => controlador.current?.abort();          // quando o ecrã é desmontado
  }, [carregar]);

  return { receitas, estado, aAtualizar, tentarDeNovo: () => carregar(), atualizar: () => carregar(true) };
}

Sem dependências novas: se a app crescer (cache entre ecrãs, paginação infinita), passa a compensar uma biblioteca de data fetching. O ecrã usa estado para mostrar o skeleton, o erro com botão «Tentar de novo» ou a FlatList…

Dados-chave

Categoria
Programação e desenvolvimento · Aplicações móveis
Tipo de resultado
Código
Nível
Intermédio
Pensado para
ChatGPT, Claude, Gemini e Microsoft Copilot
Verificado em
Pendente de verificação editorial
Variáveis
Objetivo do ecrã, Origem dos dados, Navegação e Estilo e bibliotecas
Idioma
Português
Preço
Gratuito, sem registo
Atualizado
07/11/2026

Perguntas frequentes

O código serve para uma app sem Expo?

Quase todo, porque os componentes e hooks são de React Native. Mudam as partes que usam módulos do Expo, como a deteção de ligação ou as fontes; pede ao modelo a alternativa para React Native CLI.

Porquê tantos estados para um só ecrã?

Porque a rede móvel falha muitas vezes e um ecrã em branco parece uma app avariada. Mostrar carregamento, vazio, erro e sem ligação melhora a experiência e reduz avaliações negativas.

Para que serve este prompt?

Gere um ecrã de app móvel em React Native e TypeScript com estados de carregamento, vazio, erro e sem ligação, lista otimizada, acessibilidade, área segura e testes com Testing Library.

Com que ferramentas de IA funciona?

Foi pensado para ChatGPT, Claude, Gemini e Microsoft Copilot. Ainda não o verificámos nestas ferramentas, pelo que os resultados podem variar entre elas.

Como personalizo o prompt?

Clique em “Personalizar” e preencha as variáveis (Objetivo do ecrã, Origem dos dados, Navegação e Estilo e bibliotecas). O texto atualiza-se instantaneamente e pode depois copiá-lo com um clique. Os valores ficam guardados apenas no seu navegador.

Preciso de experiência para o utilizar?

É de nível intermédio: convém conhecer o tema para fornecer bom contexto e rever o resultado com sentido crítico.

Este prompt é gratuito?

Sim. Todos os prompts do HomeCasa Prompts são gratuitos, sem registo nem subscrição. Pode também utilizá-los em projetos profissionais.

Posso confiar no resultado da IA?

Trate-o como um rascunho de qualidade: verifique sempre os dados, os números e as afirmações importantes antes de publicar ou tomar decisões.

Prompts relacionados