eletrotupi / tcc/ monografia/chapters/development.texace6a69e3b01b391a10ce43025d9d4dbe0ec2e81
12.9 KB | 279 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 contem os campos de
12
email e senha. Existe um elemento proposital aqui, uma forma de gerar
13
um certo nível de anonicidade, onde o usuário não precisa se identificar
14
com um nome ou número de telefone, ou mesmo ativar através de uma conta
15
de outra plataforma, como por exemplo, Google ou Facebook.
16

17
Em especial por dois motivos, (1) necessitaria uma conexão OAuth, de
18
forma que as plataformas de terceiro poderiam rastrear dados de qual
19
usuário tem acesso a qual aplicativo. Isso é importante porque existe,
20
e é fartamente documentado, sobre os mecanismos usados por tais plataformas
21
para rastrear e monitorar o acesso aos dados dos usuários, de forma a
22
vender e monetizar os dados dos usuários.
23

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

26
Por fim, ainda retomando a proposta de oferecer a possibilidade de
27
\textit{self-service} para o usuário, o usuário que decidisse
28
ter uma instância do aplicativo própria para si, não precisaria de uma
29
conta em uma plataforma de terceiro, como Google ou Facebook e tampouco
30
precisaria registrar-se nessas plataformas.
31

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

40
Por fim, destaca-se aqui que, conforme mencionado anteriormente, na
41
modelagem de casos de uso \ref{fig:use-cases}, ao realizar o login,
42
no primeiro acesso é enviado um email com um código de verificação,
43
seguindo a logistica de \textit{magic links}, onde adiciona uma camada
44
extra de segurança, garantindo que apenas o usuário que solicitou o login
45
possa acessar a conta.
46

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

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

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

60
Sendo respectivamente, uma seção onde o usuário é convidado a
61
``escolher um humor'', e iniciar o processo de registro de uma nova entrada
62
de humor, a seção onde é computado os indicadores do nível de energia
63
acumulado entre o dia de ontem e hoje, além da informação da média de
64
sono do dia atual e comparada com o dia anterior. Por fim, também é
65
listado os últimos dez registros de humor que o usuário cadastrou.
66

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

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

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

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

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

98
Naturalmente, é uma questão dificil de responder, porém é importante
99
que seja um momento reflexivo e tampouco, como descreve o aplicativo,
100
não necessariamente sendo preciso.
101

102
O usuário pode adicionar uma anotação sobre aquele registro em
103
específico, que igualmente é um padrão que se repete/apresenta durante
104
outras telas.
105

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

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

122
Ao concluir esse processo, e salvar, é apresentado para o usuário
123
uma tela de confirmação, onde ele pode opcionalmente vincular
124
esse registro a um gatilho em específico, que pode ter ocorrido
125
antes de ele salvar o registro, ou opcionalmente, criar um novo
126
gatilho. Aqui o projeto novamente, se ancora no EMA, recheando o registro
127
de humor com mais contexto sobre o que aconteceu.
128

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

137
Posteriormente, o usuário pode delimitar o impacto que aquele gatilho
138
pode ter exercído naquele registro de humor em especial. Aqui, é,
139
novamente o processo de chute de impacto, nada com muita precisão.
140

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

149
Por fim, vale mencionar que após esse processo, internamente, é enfileirado
150
um \textit{background job} que processa alguns indicadores: recalcular
151
o nível de energia daquele dia, apresentado na figura \ref{fig:screenshot-consulta-registros},
152
recalcular o indicador de correlação entre humor e energia, e agendar
153
o \textit{background job} que recalculará o nível de energia daquele
154
período (os últimos sete dias), apresentado na figura \ref{fig:screenshot-consulta-registros}.
155

156
\section{Indicadores}
157

158
Nessa tela é apresentado um conjunto de indicadores construídos a partir
159
dos registros de humor, sono e gatilho do usuário. Diferente das demais
160
telas do aplicativo, que operam sobre dados em tempo real, os indicadores
161
são artefatos pré-computados: um \textit{worker} assíncrono (BullMQ)
162
percorre semanalmente todos os usuários ativos e enfileira, para cada
163
um, um conjunto de \textit{jobs} — um por tipo de indicador — que
164
processam a janela dos últimos sete dias e persistem o resultado em uma
165
tabela dedicada. O aplicativo móvel apenas consulta esse resultado já
166
calculado, o que evita repetir cálculos custosos a cada abertura da tela
167
e desacopla a lógica analítica do restante da API.
168

169
\begin{figure}[H]
170
\centering
171
\caption{Tela de indicadores}
172
\label{fig:screenshot-insights}
173
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-insights.jpeg}
174
\source{O autor, 2026}
175
\end{figure}
176

177
% TODO: referenciar EMA / momentary assessment como justificativa da janela de 7 dias
178

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

182
\begin{itemize}
183
    \item \textbf{Tendência de humor}: compara a média de humor da
184
    primeira metade da semana com a da segunda metade, expressando a
185
    diferença como uma variação percentual. O resultado é classificado
186
    como melhora, piora ou estabilidade a partir de uma margem de $\pm10\%$.
187

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

194
    \item \textbf{Padrão de gatilhos}: identifica a categoria de gatilho
195
    mais frequente na semana e expressa sua predominância como percentual
196
    do total de registros.
197
\end{itemize}
198

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

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

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

227
\section{Histórico}
228

229
Nessa tela é apresentado o histórico de registros de humor, sono, gatilho,
230
e ações de cuidado. Como os dados são diferentes, é consultado os
231
\textit{endpoints} respectivos de cada dado, paralelamente, e então é
232
processado no aplicativo.
233

234
\begin{figure}[H]
235
\centering
236
\caption{Tela de Histórico}
237
\label{fig:screenshot-history}
238
\includegraphics[width=0.70\textwidth,height=0.60\textheight,keepaspectratio]{screenshot-history.jpeg}
239
\source{O autor, 2026}
240
\end{figure}
241

242
Para fazer isso, é utilizado um pequeno serviço que atua com o padrão
243
de \textit{mappers} para transformar os dados de cada \textit{endpoint}
244
em um formato comum, que é utilizado pelo restante da tela.
245

246
\begin{lstlisting}[caption={Formato comum da tela de histórico}, label={lst:history-card}]
247
export type HistoryCard = {
248
  id: string; // "<category>-<id>" to avoid collisions
249
  category: HistoryCategory;
250
  subtype?: CareActionSubtype; // only set when category === "care_action"
251
  timestamp: string; // ISO string — used for sorting and display
252
  title: string;
253
  summary: string;
254
  badge?: HistoryBadge;
255
  raw: MoodEntry | SleepRecord | Trigger | CareAction;
256
};
257
\end{lstlisting}
258

259
Conforme pode-se ver no código \ref{lst:history-card}, o formato comum
260
utilizado na tela de histórico, mapeia em essencialmente quatro propriedades
261
do dado original, além de uma propriedade adicional para identificar a categoria.
262

263
A propriedade \texttt{raw} é utilizada para armazenar o dado original,
264
permitindo que seja recuperado posteriormente quando necessário. A
265
propriedade \texttt{badge} é utilizada para armazenar qual dado é mostrado
266
como um ``indicador'' mais importante para aquele dado em específico,
267
por exemplo, que um determinado registro de sono foi ``Insuficiente'', se for
268
menor que 7 horas, mostrar se existem vínculos com aquele registro em
269
especial, ou mostrar qual nível de um determinado registro de humor
270
é considerado importante prestar atenção, como ``Ansiedade alta'',
271
``Energia alta'', etc. O último é importante também saber, por que uma
272
pessoa com TAB, pode estar com a energia alta e significar que ela está
273
em um período de mania, o que é útil para se detectar alguma alteração
274
ou mudança de ciclos.
275

276
Vale notar também que o badge é similar ao \textit{badge} que aparece na
277
tela de consulta de registros, apresentado na figura \ref{fig:screenshot-consulta-registros}.
278

279
\FloatBarrier