\chapter{Desenvolvimento} Este capítulo detalha o funcionamento de algumas funcionalidades desenvolvidas durante o projeto. Apenas algumas funcionalidades mais chaves são abordadas neste capítulo, como o registro de humor, vinculo de um gatilho, indicadores, e o registro de atividades. \section{Processo de Login} Logo ao abrir o aplicativo, o usuário é redirecionado para a tela de login. A tela em si é relativamente simples, e contem os campos de email e senha. Existe um elemento proposital aqui, uma forma de gerar um certo nível de anonicidade, onde o usuário não precisa se identificar com um nome ou número de telefone, ou mesmo ativar através de uma conta de outra plataforma, como por exemplo, Google ou Facebook. Em especial por dois motivos, (1) necessitaria uma conexão OAuth, de forma que as plataformas de terceiro poderiam rastrear dados de qual usuário tem acesso a qual aplicativo. Isso é importante porque existe, e é fartamente documentado, sobre os mecanismos usados por tais plataformas para rastrear e monitorar o acesso aos dados dos usuários, de forma a vender e monetizar os dados dos usuários. % TODO: Write citations, link to news articles about it Por fim, ainda retomando a proposta de oferecer a possibilidade de \textit{self-service} para o usuário, o usuário que decidisse ter uma instância do aplicativo própria para si, não precisaria de uma conta em uma plataforma de terceiro, como Google ou Facebook e tampouco precisaria registrar-se nessas plataformas. \begin{figure}[H] \centering \caption{Tela de login} \label{fig:screenshot-login} \includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-login.jpeg} \source{O autor, 2026} \end{figure} Por fim, destaca-se aqui que, conforme mencionado anteriormente, na modelagem de casos de uso \ref{fig:use-cases}, ao realizar o login, no primeiro acesso é enviado um email com um código de verificação, seguindo a logistica de \textit{magic links}, onde adiciona uma camada extra de segurança, garantindo que apenas o usuário que solicitou o login possa acessar a conta. \section{Página de Consulta de Registros} A tela inicial é a tela nomeada apenas como ``Novo''. A proposta aqui é ser a tela de cadastro rápido de um humor, e também é a tela que visualmente mais destoa das demais. O usuário é apresentado com três seções distintas: \begin{itemize} \item Cadastro rápido de um humor \item Entre ontem e hoje \item Registros recentes \end{itemize} Sendo respectivamente, uma seção onde o usuário é convidado a ``escolher um humor'', e iniciar o processo de registro de uma nova entrada de humor, a seção onde é computado os indicadores do nível de energia acumulado entre o dia de ontem e hoje, além da informação da média de sono do dia atual e comparada com o dia anterior. Por fim, também é listado os últimos dez registros de humor que o usuário cadastrou. \begin{figure}[H] \centering \caption{Tela de Consulta de Registros} \label{fig:screenshot-consulta-registros} \includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-initial-page.jpeg} \source{O autor, 2026} \end{figure} Aqui já é introduzido para o usuário um padrão de organização e hierarquia: todos elementos centrais são organizados em \textit{cards}, que são exibidos em no máximo duas colunas. Também é introduzido, caso o usuário já tenha registros de humor cadastrados, como será resumido esses registros cadastrados pelo usuário em todas as seções do aplicativo: geralmente, tendo um ícone, um título e alguma informação adicional destacada. \section{Criação de Registros de Humor} Nesta seção, o usuário pode criar novos registros de humor, escolhendo entre uma lista de opções pré-definidas. O humor selecionado na tela anterior é mostrado aqui, e o usuário é convidado a julgar como ele se sente referente a uma escala de 1 a 10, sobre os níveis de energia, estresse e ansiedade, respectivamente. \begin{figure}[H] \centering \caption{Criação de Registros de Humor} \label{fig:screenshot-consulta-humor} \includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-create-mood.jpeg} \source{O autor, 2026} \end{figure} Naturalmente, é uma questão dificil de responder, porém é importante que seja um momento reflexivo e tampouco, como descreve o aplicativo, não necessariamente sendo preciso. O usuário pode adicionar uma anotação sobre aquele registro em específico, que igualmente é um padrão que se repete/apresenta durante outras telas. Por fim, o usuário pode escolher "o que compõe aquele registro", que ou seja, escolher emoções e estados/sentimentos que ele sente naquele momento. Aqui uma listagem mista desses elementos é apresentado, e que cujo ele pode selecionar os que mais se aplica a ele, e julgar um nível de intensidade para cada um. Aqui a escala é menor e mais fácil, visando facilitar a escolha e julgamento do usuário, entre ``Leve'', ``Moderado'', e ``Intenso'', conforme a figura \ref{fig:screenshot-add-components}. \begin{figure}[H] \centering \caption{Adicionando sentimentos/emoções} \label{fig:screenshot-add-components} \includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-add-components.jpeg} \source{O autor, 2026} \end{figure} Ao concluir esse processo, e salvar, é apresentado para o usuário uma tela de confirmação, onde ele pode opcionalmente vincular esse registro a um gatilho em específico, que pode ter ocorrido antes de ele salvar o registro, ou opcionalmente, criar um novo gatilho. Aqui o projeto novamente, se ancora no EMA, recheando o registro de humor com mais contexto sobre o que aconteceu. \begin{figure}[H] \centering \caption{Vinculando um humor com um gatilho} \label{fig:screenshot-link-mood-trigger} \includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-link-mood-with-trigger.jpeg} \source{O autor, 2026} \end{figure} Posteriormente, o usuário pode delimitar o impacto que aquele gatilho pode ter exercído naquele registro de humor em especial. Aqui, é, novamente o processo de chute de impacto, nada com muita precisão. \begin{figure}[H] \centering \caption{Avaliando o impacto de um gatilho no humor} \label{fig:screenshot-assess-trigger-mood-impact} \includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-link-mood-assess-impact.jpeg} \source{O autor, 2026} \end{figure} Por fim, vale mencionar que após esse processo, internamente, é enfileirado um \textit{background job} que processa alguns indicadores: recalcular o nível de energia daquele dia, apresentado na figura \ref{fig:screenshot-consulta-registros}, recalcular o indicador de correlação entre humor e energia, e agendar o \textit{background job} que recalculará o nível de energia daquele período (os últimos sete dias), apresentado na figura \ref{fig:screenshot-consulta-registros}. \section{Indicadores} Nessa tela é apresentado um conjunto de indicadores construídos a partir dos registros de humor, sono e gatilho do usuário. Diferente das demais telas do aplicativo, que operam sobre dados em tempo real, os indicadores são artefatos pré-computados: um \textit{worker} assíncrono (BullMQ) percorre semanalmente todos os usuários ativos e enfileira, para cada um, um conjunto de \textit{jobs} — um por tipo de indicador — que processam a janela dos últimos sete dias e persistem o resultado em uma tabela dedicada. O aplicativo móvel apenas consulta esse resultado já calculado, o que evita repetir cálculos custosos a cada abertura da tela e desacopla a lógica analítica do restante da API. \begin{figure}[H] \centering \caption{Tela de indicadores} \label{fig:screenshot-insights} \includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-insights.jpeg} \source{O autor, 2026} \end{figure} % TODO: referenciar EMA / momentary assessment como justificativa da janela de 7 dias São três os indicadores semanais exibidos: tendência de humor, correlação entre sono e energia, e padrão de gatilhos. \begin{itemize} \item \textbf{Tendência de humor}: compara a média de humor da primeira metade da semana com a da segunda metade, expressando a diferença como uma variação percentual. O resultado é classificado como melhora, piora ou estabilidade a partir de uma margem de $\pm10\%$. \item \textbf{Correlação entre sono e energia}: relaciona a duração do sono de uma noite com o nível de energia relatado na manhã seguinte, através do coeficiente de correlação de Pearson. Exige um mínimo de observações pareadas para ser calculado — caso contrário, o indicador simplesmente não é exibido. \item \textbf{Padrão de gatilhos}: identifica a categoria de gatilho mais frequente na semana e expressa sua predominância como percentual do total de registros. \end{itemize} É intencional, na figura \ref{fig:screenshot-insights}, que o bloco de ``Energia'' apareça vazio: o cálculo da correlação depende da existência simultânea de registros de sono \emph{e} de humor em quantidade mínima, e no período retratado o usuário ainda não havia acumulado dados suficientes de ambos os tipos. Optou-se por não exibir uma correlação calculada com poucos pontos, preferindo comunicar a ausência de dado a apresentar um número pouco confiável. O bloco maior no topo da tela, o ``Resumo Semanal'', condensa os indicadores mais centrais — média de sono do período e um rótulo de humor (``Estável'', no exemplo). Esse rótulo, no entanto, é o elemento mais delicado de toda a funcionalidade. Embora exista uma fórmula capaz de produzir uma classificação de estabilidade a partir da variância dos registros de humor, atribuir esse tipo de afirmação a um usuário — especialmente em um aplicativo que é utilizado por pessoas com Transtorno Afetivo Bipolar, para quem uma leitura equivocada de ``estabilidade'' pode mascarar justamente o início de um episódio — exige um embasamento mais cuidadoso do que uma regra estatística simples. Por esse motivo, o rótulo apresentado nesta versão do aplicativo é estático (não deriva de fato do cálculo de estabilidade) e a funcionalidade pode ser inteiramente desabilitada pelo usuário nas configurações. A decisão de manter ou não uma afirmação automatizada desse tipo, e sob quais critérios, permanece um ponto em aberto que mereceria revisão de literatura específica antes de ser tratado como funcionalidade definitiva. % TODO: literatura sobre riscos de auto-monitoramento automatizado de humor / mood-tracking apps e TAB \section{Histórico} Nessa tela é apresentado o histórico consolidado de registros de humor, sono, gatilho e ações de cuidado (como sessões de terapia), organizados cronologicamente e agrupados por dia, conforme a figura \ref{fig:screenshot-history}. O usuário pode ainda filtrar a listagem por categoria (``Humor'', ``Sono'', ``Gatilho'' e ``Ações de Cuidado''), reduzindo o volume de informação exibida. \begin{figure}[H] \centering \caption{Tela de Histórico} \label{fig:screenshot-history} \includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-history.jpeg} \source{O autor, 2026} \end{figure} Como os quatro tipos de dado residem em recursos distintos da API, a tela consulta os respectivos \textit{endpoints} em paralelo e, em seguida, processa o resultado no próprio aplicativo. Para isso, é utilizado um pequeno serviço que atua como \textit{mapper}, transformando os dados de cada \textit{endpoint} em um formato comum, apresentado no código \ref{lst:history-card}. \newpage \begin{lstlisting}[caption={Formato comum da tela de histórico}, label={lst:history-card}] export type HistoryCard = { id: string; // "-" to avoid collisions category: HistoryCategory; subtype?: CareActionSubtype; // only set when category === "care_action" timestamp: string; // ISO string — used for sorting and display title: string; summary: string; badge?: HistoryBadge; raw: MoodEntry | SleepRecord | Trigger | CareAction; }; \end{lstlisting} Após a normalização, os quatro conjuntos de dados são combinados em uma única lista ordenada pelo campo \texttt{timestamp} e reagrupados por dia para exibição, conforme visto na figura \ref{fig:screenshot-history}, nos cabeçalhos ``terça-feira, 14 de julho'' e ``segunda-feira, 13 de julho''. Essa unificação é proposital: ao invés de apresentar quatro telas separadas por tipo de dado, o histórico busca reconstruir uma narrativa única do dia do usuário, aproximando-se do princípio de \textit{Ecological Momentary Assessment} já mencionado anteriormente — o contexto de um registro de humor (por exemplo, o gatilho ``Interno'' registrado três minutos antes, na mesma figura) fica visualmente próximo do evento que possivelmente o motivou. A propriedade \texttt{raw} armazena o dado original, permitindo que a listagem redirecione o usuário para a tela de detalhe correta ao tocar em um card, independentemente da categoria. Já a propriedade \texttt{badge} reaproveita o mesmo mecanismo já descrito na seção de indicadores: para um registro de sono, sinaliza se a duração foi insuficiente; para um registro de humor, destaca a dimensão mais relevante daquele registro (como ``Ansiedade alta'' na figura \ref{fig:screenshot-history}); para um gatilho, indica sua categoria, e assim por diante. \FloatBarrier