Back to list
LionGab

react-native-reviewer

by LionGab

Nossa Maternidade - App mobile React Native + Expo com IA integrada (Gemini, Claude, OpenAI)

1🍴 0📅 Dec 6, 2025

SKILL.md


name: react-native-reviewer description: Review de codigo React Native para o projeto Nossa Maternidade. Detecta anti-patterns como ScrollView com .map() (usar FlatList), console.log (usar logger), any em TypeScript, cores hardcoded. Use ao revisar PRs, criar componentes, ou fazer code review. allowed-tools: Read, Grep, Glob

React Native Code Reviewer

Proposito

Detectar e corrigir anti-patterns comuns em codigo React Native para o projeto Nossa Maternidade.

Anti-Patterns a Detectar

1. ScrollView + .map() → FlatList

// ❌ ERRADO - ruim para performance com listas grandes
<ScrollView>
  {items.map(item => (
    <ItemComponent key={item.id} {...item} />
  ))}
</ScrollView>

// ✅ CORRETO - virtualizado, eficiente
<FlatList
  data={items}
  keyExtractor={item => item.id}
  renderItem={({ item }) => <ItemComponent {...item} />}
/>

Por que? ScrollView renderiza TODOS os itens de uma vez. FlatList virtualiza e renderiza apenas itens visiveis.

2. console.log → logger.*

// ❌ ERRADO - nao deve ir para producao
console.log('debug:', data);
console.warn('aviso');
console.error('erro:', error);

// ✅ CORRETO - logger centralizado
import { logger } from '@/utils/logger';
logger.debug('debug:', data);
logger.warn('aviso');
logger.error('erro:', error);

Por que? Logger centralizado permite controle de nivel, formatacao consistente, e facilita debug em producao.

3. Tipo any → Tipos Explicitos

// ❌ ERRADO - perde type safety
const data: any = fetchData();
function process(input: any): any { ... }

// ✅ CORRETO - tipos explicitos
const data: UserProfile = fetchData();
function process(input: UserInput): ProcessedResult { ... }

// Se realmente nao sabe o tipo, use unknown:
const unknownData: unknown = externalAPI();
if (isUserProfile(unknownData)) {
  // Agora TypeScript sabe o tipo
}

4. Cores Hardcoded → useThemeColors()

// ❌ ERRADO
<View style={{ backgroundColor: '#FFFFFF' }}>
<Text style={{ color: 'black' }}>

// ✅ CORRETO
const colors = useThemeColors();
<View style={{ backgroundColor: colors.background.card }}>
<Text style={{ color: colors.text.primary }}>

5. Inline Functions em Renders

// ❌ ERRADO - cria nova funcao a cada render
<TouchableOpacity onPress={() => handlePress(item.id)}>

// ✅ CORRETO - useCallback
const handleItemPress = useCallback((id: string) => {
  // logica
}, [dependencies]);

// ou extrair para componente filho:
<ItemButton itemId={item.id} onPress={handlePress} />

6. Falta de Memoizacao em Listas

// ❌ ERRADO - re-renderiza sempre
const ListItem = ({ item }) => { ... };

// ✅ CORRETO - memoizado
const ListItem = memo(({ item }) => { ... });

7. useEffect sem Cleanup

// ❌ ERRADO - pode causar memory leak
useEffect(() => {
  const subscription = api.subscribe(handler);
}, []);

// ✅ CORRETO - cleanup function
useEffect(() => {
  const subscription = api.subscribe(handler);
  return () => subscription.unsubscribe();
}, []);

Comandos de Grep para Detectar

# ScrollView com children (possivel .map)
grep -r "ScrollView" --include="*.tsx" | grep -v "FlatList"

# console.log/warn/error
grep -rE "console\.(log|warn|error)" --include="*.ts" --include="*.tsx"

# Tipo any explicito
grep -rE ":\s*any" --include="*.ts" --include="*.tsx"

# Cores hex em estilos
grep -rE "#[0-9A-Fa-f]{6}" --include="*.tsx"

Checklist de Code Review

Performance

  • Listas usam FlatList (nao ScrollView + map)
  • Componentes de lista sao memoizados
  • useCallback para handlers passados como props
  • useMemo para calculos pesados

TypeScript

  • Nenhum tipo any explicito
  • Todos parametros de funcao tipados
  • Interfaces para props de componentes

Logging

  • Nenhum console.log/warn/error
  • Usa logger.* para todos os logs

Design System

  • Cores via useThemeColors()
  • Spacing via Tokens.spacing
  • Typography via TextStyles

React Hooks

  • useEffect tem cleanup quando necessario
  • Dependencies array correto
  • Nao viola regras de hooks

Severidade

Anti-PatternSeveridadeDeve Bloquear PR?
ScrollView + map (listas grandes)AltaSim
console.logMediaSim
Tipo anyMediaDepende
Cores hardcodedMediaSim
Falta de memoBaixaNao
Inline functionsBaixaNao

Score

Total Score

50/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon