Skip to content

Project Structure - Estrutura do Projeto

Stack Tecnologico

CategoriaTecnologiaVersao
FrameworkReact Native0.81.5
PlataformaExpo SDK54
LinguagemTypeScript5.9
RoteamentoExpo Router6.x
EstadoZustandlatest
UI LibraryReact Native Reusableslatest
CSS FrameworkNativeWind (Tailwind CSS)4.x
HTTP ClientAxios1.x
i18ni18next + react-i18nextlatest
IconesLucide React Nativelatest
ArmazenamentoExpo SecureStorelatest
CameraExpo Cameralatest
AuthExpo AuthSession + WebBrowserlatest

Convencoes de Nomenclatura

ElementoPadraoExemplo
ComponentesPascalCase (pasta + ComponentName.tsx)BorrowerHeader/BorrowerHeader.tsx
UI ComponentsPascalCase (pasta + ComponentName.tsx)Card/Card.tsx
HookscamelCase com prefixo useuse-auth.ts
ServicescamelCase com sufixo ServicegetActiveContractService
ContextsPascalCase (pasta + index.tsx)AuthContext/index.tsx
Types/InterfacesPascalCaseProviderContract
EnumsPascalCaseContractStatus
Pages/Screenskebab-case (Expo Router)complete-profile.tsx
Arquivos de estilostyles.ts dentro da pastaBorrowerHeader/styles.ts
Localeslinguagem-PAISpt-BR.json, en.json

Estrutura de Pastas

/
├── app/                    # Rotas (Expo Router file-based routing)
│   ├── _layout.tsx         # Root: providers + auth gate
│   ├── (auth)/             # Grupo de rotas de autenticacao
│   │   ├── _layout.tsx
│   │   ├── login.tsx
│   │   ├── complete-profile.tsx
│   │   └── select-company.tsx
│   ├── (tabs)/             # Grupo de rotas com bottom tabs
│   │   ├── _layout.tsx     # Bottom tabs (5 abas)
│   │   ├── index.tsx       # Home
│   │   ├── hours/          # Stack dentro da tab
│   │   ├── compliance/     # Stack dentro da tab
│   │   ├── history.tsx
│   │   └── profile.tsx
│   ├── notifications.tsx   # Modal
│   └── qr-scanner.tsx      # Modal
├── components/             # UI compartilhada entre modulos (2+ consumidores)
│   ├── ui/                 # Primitivos e compostos reutilizaveis (React Native Reusables + app)
│   │   ├── Button/
│   │   ├── Card/
│   │   ├── Badge/
│   │   ├── Avatar/
│   │   ├── Input/
│   │   ├── Text/
│   │   └── Progress/
│   └── HapticTab/
├── config/                 # Configuracoes (API, i18n)
│   ├── api.ts              # Instancia Axios + interceptors
│   └── i18n.ts             # Configuracao i18next
├── locales/                # Arquivos de traducao
│   ├── pt-BR.json
│   └── en.json
├── domain/                 # Tipos, enums e constantes de dominio
│   ├── common/
│   │   ├── types.ts
│   │   ├── enums.ts
│   │   └── index.ts
│   ├── auth/
│   │   ├── types.ts
│   │   ├── enums.ts
│   │   ├── constants.ts
│   │   └── index.ts
│   ├── contract/
│   │   ├── types.ts
│   │   ├── enums.ts
│   │   └── index.ts
│   ├── compliance/
│   │   ├── types.ts
│   │   ├── enums.ts
│   │   └── index.ts
│   ├── hours/
│   │   ├── types.ts
│   │   └── index.ts
│   └── index.ts
├── modules/                # Modulos de features
│   ├── auth/
│   │   ├── components/
│   │   ├── contexts/
│   │   │   └── AuthContext/
│   │   ├── hooks/
│   │   │   ├── use-auth.ts
│   │   │   └── use-oauth.ts
│   │   └── services/
│   │       └── auth.ts
│   └── provider/
│       ├── components/
│       │   ├── BorrowerHeader/
│       │   ├── DocumentListItem/
│       │   ├── HoursSummaryCard/
│       │   ├── ComplianceSummaryCard/
│       │   ├── ComplianceStepRow/
│       │   ├── PeriodHistoryItem/
│       │   ├── ProfileField/
│       │   └── ContractInfoRow/
│       ├── contexts/
│       │   └── ContractContext/
│       ├── hooks/
│       │   ├── use-contract.ts
│       │   ├── use-hours.ts
│       │   ├── use-compliance.ts
│       │   └── use-compliance-screen.ts
│       ├── stores/
│       │   └── compliance.ts
│       └── services/
│           └── provider.ts
├── lib/                    # Utilitarios do framework
│   ├── utils.ts            # cn() - clsx + tailwind-merge
│   └── theme.ts            # NAV_THEME para React Navigation
├── hooks/                  # Hooks globais
│   ├── use-color-scheme.ts
│   └── use-theme-color.ts
├── utils/                  # Funcoes utilitarias puras
│   ├── string.ts
│   ├── date.ts
│   ├── file.ts
│   └── compliance.ts
├── assets/                 # Imagens, fontes, etc.
├── docs/                   # Documentacao
│   ├── architecture/
│   └── business/
└── constants/              # Constantes globais (legado - migrar para domain/)

Arquitetura Modular

Cada modulo segue a estrutura:

modules/[nome-modulo]/
├── components/             # UI exclusiva do modulo
│   └── ComponentName/      # PascalCase
│       ├── ComponentName.tsx
│       └── styles.ts       # ClassNames e variantes (NativeWind)
├── constants/              # Constantes do modulo
├── contexts/               # React Context do modulo
│   └── ContextName/
│       └── index.tsx
├── helpers/                # Funcoes puras internas
├── hooks/                  # Estado Zustand + hooks de tela (use-*.ts)
├── models/                 # Types, props e state shapes
├── screens/                # Telas exportadas
├── services/               # Chamadas de API
└── utils/                  # Funcoes puras do modulo (opcional)

Regras de colocacao:

  • UI usada por 2 ou mais moduloscomponents/ui/, nunca dentro de um modulo feature
  • UI, skeletons e layouts de um unico modulomodules/[modulo]/components/
  • Proibido pasta stores/ — estado somente em hooks/use-*.ts

Padrao de Componentes

Todos os componentes seguem:

ComponentName/
├── ComponentName.tsx       # export const ComponentName: FC<Props> = () => {}
└── styles.ts               # export const containerClassName = '...'

Regras:

  • PascalCase para nomes de componentes e pastas
  • Um componente por arquivo (proibido componentes aninhados)
  • export const para componentes (nunca export default, exceto screens)
  • FC type para tipagem do componente
  • styles.ts exporta className strings (NativeWind) ou variantes cva
  • Proibido StyleSheet.create() e style= inline

Ordem dos providers no root (app/_layout.tsx)

GestureHandlerRootView
  UpdateProvider
    ThemeProvider
      SwrProvider
        ConnectivityProvider
          AuthProvider
            ContractProvider
              BottomSheetModalProvider   <- portal host dos sheets
                <View className="flex-1"> ... Stack ... </View>
                PortalHost               <- portal host do rn-primitives

BottomSheetModalProvider e PortalHost precisam ficar por dentro de AuthProvider. O BottomSheetModalProvider monta um PortalProvider/PortalHost interno, e todo BottomSheetModal teleporta seu conteudo para essa altura da arvore React. Se o provider estiver acima do AuthProvider, qualquer componente montado dentro de um sheet que chame useAuth (direto ou via useTheme, que le company para o branding) estoura com useAuth must be used within an AuthProvider.

O sintoma engana: o sheet abre normalmente enquanto o conteudo so recebe cores por prop (o hook rodou no componente pai, que esta na arvore normal). O crash so aparece quando um componente de dentro do sheet chama o hook no proprio corpo, como TemplateEditorFaithfulDocument no preview de documento.

Variaveis de Ambiente

env
EXPO_PUBLIC_API_URL="https://api.contrasync.com"

Scripts de Desenvolvimento

ScriptDescricao
npx expo startServidor de desenvolvimento
npx expo start --androidIniciar no Android
npx expo start --iosIniciar no iOS
npx expo lintLint com ESLint