eletrotupi / tcc/ monografia/chapters/development.texbbd15db1275c4f1e8977a9d73c99fde74f1fe2d6
13.5 KB | 295 lines Raw
1
\chapter{Desenvolvimento}
2

3
Este capítulo detalha o funcionamento de algumas funcionalidades
4
desenvolvidas durante o projeto. Apenas algumas funcionalidades mais
5
chaves são abordadas neste capítulo, como o registro de humor, vinculo
6
de um gatilho, indicadores, e o registro de atividades.
7

8
\section{Processo de Login}
9

10
Logo ao abrir o aplicativo, o usuário é redirecionado para a tela de
11
login. A tela em si é relativamente simples, e contém os campos de
12
email e senha. Existe aqui um elemento proposital: uma forma de
13
garantir um certo nível de anonimato, em que o usuário não precisa se
14
identificar com um nome ou número de telefone, tampouco ativar a conta
15
através de uma plataforma de terceiro, como Google ou Facebook.
16

17
Isso se dá, em especial, por dois motivos. Primeiro, o uso de OAuth
18
exigiria uma conexão com plataformas de terceiro, que poderiam então
19
rastrear quais usuários têm acesso a qual aplicativo — algo que é
20
fartamente documentado na literatura sobre os mecanismos usados por
21
tais plataformas para rastrear e monitorar o acesso a dados de
22
usuários, com o fim de vender e monetizar essas informações.
23

24
% TODO: Write citations, link to news articles about it
25

26
Segundo, e retomando a proposta de oferecer ao usuário a possibilidade
27
de \textit{self-service}, aquele que decidisse manter uma instância
28
própria do aplicativo não precisaria de uma conta em uma plataforma de
29
terceiro, nem se cadastrar nelas.
30

31
\begin{figure}[H]
32
\centering
33
\caption{Tela de login}
34
\label{fig:screenshot-login}
35
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-login.jpeg}
36
\source{O autor, 2026}
37
\end{figure}
38

39
Por fim, destaca-se aqui que, conforme mencionado anteriormente na
40
modelagem de casos de uso (figura \ref{fig:use-cases}), ao realizar o
41
login pela primeira vez é enviado um email com um código de
42
verificação, seguindo a lógica dos \textit{magic links}. Isso adiciona
43
uma camada extra de segurança, garantindo que apenas o usuário que
44
solicitou o login possa acessar a conta.
45

46
\section{Página de Consulta de Registros}
47

48
A tela inicial é a tela nomeada apenas como ``Novo''. A proposta aqui
49
é ser a tela de cadastro rápido de um humor, e também é a tela que
50
visualmente mais destoa das demais. O usuário é apresentado com três
51
seções distintas:
52

53
\begin{itemize}
54
    \item Cadastro rápido de um humor
55
    \item Entre ontem e hoje
56
    \item Registros recentes
57
\end{itemize}
58

59
Respectivamente: uma seção em que o usuário é convidado a ``escolher
60
um humor'' e iniciar o processo de registro de uma nova entrada; a
61
seção em que são apresentados os indicadores de nível de energia
62
acumulado entre o dia anterior e o dia atual, além da média de sono do
63
dia comparada com a do dia anterior; e, por fim, a listagem dos dez
64
últimos registros de humor cadastrados pelo usuário.
65

66
\begin{figure}[H]
67
\centering
68
\caption{Tela de Consulta de Registros}
69
\label{fig:screenshot-consulta-registros}
70
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-initial-page.jpeg}
71
\source{O autor, 2026}
72
\end{figure}
73

74
Aqui já é introduzido ao usuário um padrão de organização e hierarquia:
75
todos os elementos centrais são organizados em \textit{cards}, exibidos
76
em no máximo duas colunas. Também é introduzido, caso o usuário já
77
possua registros de humor cadastrados, o padrão pelo qual esses
78
registros são resumidos em todas as seções do aplicativo: geralmente
79
um ícone, um título e alguma informação adicional em destaque.
80

81
\section{Criação de Registros de Humor}
82

83
Nesta seção, o usuário pode criar novos registros de humor, escolhendo
84
entre uma lista de opções pré-definidas. O humor selecionado na tela
85
anterior é mostrado aqui, e o usuário é convidado a julgar, em uma
86
escala de 1 a 10, como se sente em relação aos níveis de energia,
87
estresse e ansiedade, respectivamente.
88

89
\begin{figure}[H]
90
\centering
91
\caption{Criação de Registros de Humor}
92
\label{fig:screenshot-consulta-humor}
93
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-create-mood.jpeg}
94
\source{O autor, 2026}
95
\end{figure}
96

97
Naturalmente, é uma questão difícil de responder — e, como o próprio
98
aplicativo procura deixar claro, é importante que seja um momento
99
reflexivo, não necessariamente preciso.
100

101
O usuário pode adicionar uma anotação sobre aquele registro em
102
específico, padrão que se repete em outras telas do aplicativo.
103

104
Por fim, o usuário pode escolher o que compõe aquele registro, ou
105
seja, selecionar emoções e estados/sentimentos que sente naquele
106
momento. É apresentada uma listagem mista desses elementos, na qual o
107
usuário seleciona os que mais se aplicam a ele e atribui um nível de
108
intensidade para cada um. Aqui a escala é menor e mais simples, visando
109
facilitar a escolha e o julgamento do usuário, entre ``Leve'',
110
``Moderado'' e ``Intenso'', conforme a figura
111
\ref{fig:screenshot-add-components}.
112

113
\begin{figure}[H]
114
\centering
115
\caption{Adicionando sentimentos/emoções}
116
\label{fig:screenshot-add-components}
117
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-add-components.jpeg}
118
\source{O autor, 2026}
119
\end{figure}
120

121
Ao concluir esse processo e salvar, é apresentada ao usuário uma tela
122
de confirmação, na qual ele pode, opcionalmente, vincular o registro a
123
um gatilho específico — que pode ter ocorrido antes de ele salvar o
124
registro — ou criar um novo gatilho. O projeto novamente se ancora no
125
EMA, enriquecendo o registro de humor com mais contexto sobre o que
126
aconteceu.
127

128
\begin{figure}[H]
129
\centering
130
\caption{Vinculando um humor com um gatilho}
131
\label{fig:screenshot-link-mood-trigger}
132
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-link-mood-with-trigger.jpeg}
133
\source{O autor, 2026}
134
\end{figure}
135

136
Em seguida, o usuário pode indicar o impacto que aquele gatilho
137
exerceu sobre o registro de humor em questão. Novamente, trata-se de
138
uma estimativa subjetiva, sem pretensão de precisão.
139

140
\begin{figure}[H]
141
\centering
142
\caption{Avaliando o impacto de um gatilho no humor}
143
\label{fig:screenshot-assess-trigger-mood-impact}
144
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-link-mood-assess-impact.jpeg}
145
\source{O autor, 2026}
146
\end{figure}
147

148
Por fim, vale mencionar que, após esse processo, é enfileirado
149
internamente um \textit{background job} que recalcula, sob demanda, o
150
indicador de energia daquele dia, apresentado na figura
151
\ref{fig:screenshot-consulta-registros}. Diferentemente deste, os
152
indicadores semanais — como a correlação entre sono e energia,
153
descrita na seção \ref{sec:insights} — não são recalculados a cada
154
registro individual, sendo processados apenas pelo job semanal
155
agendado (seção \ref{sec:insights}).
156

157
\section{Indicadores}\label{sec:insights}
158

159
Nessa tela é apresentado um conjunto de indicadores construídos a partir
160
dos registros de humor, sono e gatilho do usuário. Diferente das demais
161
telas do aplicativo, que operam sobre dados em tempo real, os indicadores
162
são artefatos pré-computados: um \textit{worker} assíncrono (\textit{BullMQ})
163
percorre semanalmente todos os usuários ativos e enfileira, para cada
164
um, um conjunto de \textit{jobs} — um por tipo de indicador — que
165
processam a janela dos últimos sete dias e persistem o resultado em uma
166
tabela dedicada. Vale notar que nem todos os indicadores seguem esse
167
fluxo agendado: os indicadores diários (energia e sono) são recalculados
168
sob demanda, no momento em que o usuário registra um novo humor ou
169
sessão de sono, enquanto os indicadores semanais dependem
170
exclusivamente do \textit{job} de \textit{fan-out} de segunda-feira.
171

172
O aplicativo móvel apenas consulta esse resultado já
173
calculado, o que evita repetir cálculos custosos a cada abertura da tela
174
e desacopla a lógica analítica do restante da API.
175

176
\begin{figure}[H]
177
\centering
178
\caption{Tela de indicadores}
179
\label{fig:screenshot-insights}
180
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-insights.jpeg}
181
\source{O autor, 2026}
182
\end{figure}
183

184
% TODO: referenciar EMA / momentary assessment como justificativa da janela de 7 dias
185

186
São três os indicadores semanais exibidos: tendência de humor, correlação
187
entre sono e energia, e padrão de gatilhos.
188

189
\begin{itemize}
190
    \item \textbf{Tendência de humor}: compara a média de humor da
191
    primeira metade da semana com a da segunda metade, expressando a
192
    diferença como uma variação percentual. O resultado é classificado
193
    como melhora, piora ou estabilidade a partir de uma margem de $\pm10\%$.
194

195
    \item \textbf{Correlação entre sono e energia}: relaciona a duração
196
    do sono de uma noite com o nível de energia relatado na manhã
197
    seguinte, através do coeficiente de correlação de Pearson. Exige um
198
    mínimo de observações pareadas para ser calculado — caso contrário,
199
    o indicador simplesmente não é exibido.
200

201
    \item \textbf{Padrão de gatilhos}: identifica a categoria de gatilho
202
    mais frequente na semana e expressa sua predominância como percentual
203
    do total de registros.
204
\end{itemize}
205

206
É intencional, na figura \ref{fig:screenshot-insights}, que o bloco de
207
``Energia'' apareça vazio: o cálculo da correlação depende da existência
208
simultânea de registros de sono \emph{e} de humor em quantidade mínima,
209
e no período retratado o usuário ainda não havia acumulado dados
210
suficientes de ambos os tipos. Optou-se por não exibir uma correlação
211
calculada com poucos pontos, preferindo comunicar a ausência de dado a
212
apresentar um número pouco confiável.
213

214
O bloco maior no topo da tela, o ``Resumo Semanal'', condensa os
215
indicadores mais centrais — média de sono do período e um rótulo de
216
humor (``Estável'', no exemplo). Esse rótulo, no entanto, é o elemento
217
mais delicado de toda a funcionalidade. Embora exista uma fórmula capaz
218
de produzir uma classificação de estabilidade a partir da variância dos
219
registros de humor, atribuir esse tipo de afirmação a um usuário —
220
especialmente em um aplicativo que é utilizado por pessoas com
221
Transtorno Afetivo Bipolar, para quem uma leitura equivocada de
222
``estabilidade'' pode mascarar justamente o início de um episódio —
223
exige um embasamento mais cuidadoso do que uma regra estatística
224
simples. Por esse motivo, o rótulo apresentado nesta versão do
225
aplicativo é estático (não deriva de fato do cálculo de estabilidade) e
226
a funcionalidade pode ser inteiramente desabilitada pelo usuário nas
227
configurações. A decisão de manter ou não uma afirmação automatizada
228
desse tipo, e sob quais critérios, permanece um ponto em aberto que
229
mereceria revisão de literatura específica antes de ser tratado como
230
funcionalidade definitiva.
231

232
% TODO: literatura sobre riscos de auto-monitoramento automatizado de humor / mood-tracking apps e TAB
233

234
\section{Histórico}
235

236

237
Nessa tela é apresentado o histórico consolidado de registros de humor,
238
sono, gatilho e ações de cuidado (como sessões de terapia), organizados
239
cronologicamente e agrupados por dia, conforme a figura
240
\ref{fig:screenshot-history}. O usuário pode ainda filtrar a listagem por
241
categoria (``Humor'', ``Sono'', ``Gatilho'' e ``Ações de Cuidado''),
242
reduzindo o volume de informação exibida.
243

244
\begin{figure}[H]
245
\centering
246
\caption{Tela de Histórico}
247
\label{fig:screenshot-history}
248
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-history.jpeg}
249
\source{O autor, 2026}
250
\end{figure}
251

252
Como os quatro tipos de dado residem em recursos distintos da API, a
253
tela consulta os respectivos \textit{endpoints} em paralelo e, em
254
seguida, processa o resultado no próprio aplicativo. Para isso, é
255
utilizado um pequeno serviço que atua como \textit{mapper}, transformando
256
os dados de cada \textit{endpoint} em um formato comum, apresentado no
257
código \ref{lst:history-card}.
258

259
\newpage
260

261
\begin{lstlisting}[caption={Formato comum da tela de histórico}, label={lst:history-card}]
262
export type HistoryCard = {
263
  id: string; // "<category>-<id>" to avoid collisions
264
  category: HistoryCategory;
265
  subtype?: CareActionSubtype; // only set when category === "care_action"
266
  timestamp: string; // ISO string — used for sorting and display
267
  title: string;
268
  summary: string;
269
  badge?: HistoryBadge;
270
  raw: MoodEntry | SleepRecord | Trigger | CareAction;
271
};
272
\end{lstlisting}
273

274
Após a normalização, os quatro conjuntos de dados são combinados em uma
275
única lista ordenada pelo campo \texttt{timestamp} e reagrupados por dia
276
para exibição, conforme visto na figura \ref{fig:screenshot-history}, nos
277
cabeçalhos ``terça-feira, 14 de julho'' e ``segunda-feira, 13 de julho''.
278
Essa unificação é proposital: ao invés de apresentar quatro telas
279
separadas por tipo de dado, o histórico busca reconstruir uma narrativa
280
única do dia do usuário, aproximando-se do princípio de \textit{Ecological
281
Momentary Assessment} já mencionado anteriormente — o contexto de um
282
registro de humor (por exemplo, o gatilho ``Interno'' registrado três
283
minutos antes, na mesma figura) fica visualmente próximo do evento que
284
possivelmente o motivou.
285

286
A propriedade \texttt{raw} armazena o dado original, permitindo que a
287
listagem redirecione o usuário para a tela de detalhe correta ao tocar em
288
um card, independentemente da categoria. Já a propriedade \texttt{badge}
289
reaproveita o mesmo mecanismo já descrito na seção de indicadores: para
290
um registro de sono, sinaliza se a duração foi insuficiente; para um
291
registro de humor, destaca a dimensão mais relevante daquele registro
292
(como ``Ansiedade alta'' na figura \ref{fig:screenshot-history}); para um
293
gatilho, indica sua categoria, e assim por diante.
294

295
\FloatBarrier