Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refatoração do componente Content #378

Merged
merged 13 commits into from
May 25, 2022

Conversation

filipedeschamps
Copy link
Owner

PR para forçar deploy em Preview do PR #370 feito por @aprendendofelipe

@vercel
Copy link

vercel bot commented May 24, 2022

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Updated
tabnews ✅ Ready (Inspect) Visit Preview May 24, 2022 at 3:25AM (UTC)

…tion correction

Re-reading the function to open the editor when reloading the page if it is saved in localStorage.
Function correction to avoid reloading them
@vercel
Copy link

vercel bot commented May 24, 2022

@andreghisleni is attempting to deploy a commit to the TabNews Team on Vercel.

To accomplish this, @andreghisleni needs to request access to the Team.

Afterwards, an owner of the Team is required to accept their membership request.

If you're already a member of the respective Vercel Team, make sure that your Personal Vercel Account is connected to your GitHub account.

@andreghisleni
Copy link
Contributor

andreghisleni commented May 24, 2022

Opaaa desculpa só ter enviado agora, eu só modifiquei as funções para evitar o recarregamento desnecessário das funções e adicionei novamente a verificação de que se existe conteúdo salvo no localstorage ele carregue o editor

@filipedeschamps

@filipedeschamps
Copy link
Owner Author

@andreghisleni por favor, peço que rode um npm run lint:fix para o commit possa passar no CI 🤝

Copy link
Collaborator

@aprendendofelipe aprendendofelipe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oi @andreghisleni, não estava mais abrindo automaticamente o editor por questão de performance e também sugestão do @filipedeschamps aqui: #364 (comment)

Talvez seja interessante removermos o recurso de automaticamente abrir o modo de edição se for encontrado algo no localStorage e só se focar em carregar essas informações quando entrar nesse modo de fato, seja pelo clique no botão, ou seja por esse ser o modo padrão de um conteúdo root. O que acham?

Acho que a sugestão foi mais por causa do bug que estava ocorrendo naquele momento, mas pensei na questão de performance eu achei válida.
Por isso o acesso ao localStorage tinha sido movido para dentro do componente EditMode, para só ocorrer um acesso nos componentes já renderizados em modo de edição (ao clicar em "editar", "responder" ou Publicar novo conteúdo") ao invés de ocorrer um acesso a cada "conteúdo" ou "botão de responder" que for renderizado.

Pela experiência do usuário eu acho super válida a funcionalidade de abrir o modo de edição automaticamente sempre que carregar um conteúdo que contenha rascunho no loacalStorage, mas acredito que seja melhor essa decisão de iniciar o componente em modo de edição ser tomada por quem chama o componente Content, não dentro dele, pelo custo que a leitura do localStorage traz.
No caso de conteúdo root novo, ele sempre é carregado em modo de edição, então já vai ser carregado o rascunho.

No restante das alterações eu não percebi nenhum impacto positivo em utilizar useCallback nessas funções, já que elas não são passadas para outros componentes. Se tem algo que eu não estou enxergando, me dê uma clareada, por favor.

Por enquanto acredito que a versão do link abaixo está legal:
https://tabnews-git-refactor-content-preview3-tabnews.vercel.app/

Added check if the user is the owner of the publication to not check for all contents
@andreghisleni
Copy link
Contributor

andreghisleni commented May 25, 2022

Pronto agora adicionei a verificação de que se a publicação é do próprio usuário antes de buscar no localstorage.

Agora a questão de utilizar o useCallback é principalmente questão de boas praticas, alem de evitar o recarregamento desnecessário

Copy link
Collaborator

@aprendendofelipe aprendendofelipe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Edit: Tinha colocado resultados incorretos nos testes.

Agora a questão de utilizar o useCallback é principalmente questão de boas praticas, alem de evitar o recarregamento desnecessário

@andreghisleni, o useCallback evita a redefinição da função a cada renderização do componente onde ela é definida. Isso é mais útil para não causar o recarregamento de outros componentes que dependem da função. Mas em EditMode não temos outros componentes que dependem dessas funções, então a redefinição não causa nenhuma renderização extra.

Se quando diz recarregamento você está falando da redefinição das funções, então sim, isso pode ser reduzido mesmo no nosso caso. Fiz um teste para ter números para comparar os casos com e sem useCallback.

Utilizei esse código:

...
var funcCount = new Set()

export default function Content({ content, mode = 'view', viewFrame = false }) {
...
...
  function EditMode() {
...
...
    funcCount.add(loadLocalStorage);
    funcCount.add(clearErrors);
    funcCount.add(handleSubmit);
    funcCount.add(handleChange);
    funcCount.add(handleCancel);
    console.log("Count: ", funcCount.size);
...

Número de redefinições de funções em cada caso

Commit ee49e9e 0245a73 _
Ação \ useCallback Sem Com Funções redefinidas com useCallback
Ao clicar em responder 5 5 Definição inicial de todas as 5
Ao navegar para publicar novo conteúdo 15 15 Cada uma 3 vezes
No primeiro dígito escrito 10 2 handleSubmit e hancleCancel
A cada dígito extra 5 2 handleSubmit e hancleCancel
Ao voltar o foco para a aba 5 2 handleSubmit e hancleCancel

Imagino que cada redefinição seja menos custosa sem o useCallback, então para as renderizações iniciais o caso sem useCallback deve ser um pouco mais rápido. Mas, após o carregamento, durante a digitação do conteúdo, ocorrem menos redefinições das funções com o useCallback. Então isso me convence de que é melhor utilizá-lo.

Só vou dar uma analisada melhor depois se não podemos diminuir as variáveis no array de dependências de alguma delas. Acho que consigo fazer isso amanhã e dou um retorno aqui.

Agora se está lhe incomodando muito o fato de não estar entrando automaticamente no modo de edição, acho mais interessante fazer essa mudança em outro componente. Vamos conversar mais sobre isso.🤝

const localStorageContent = localStorage.getItem(localStorageKey);
if (isValidJsonString(localStorageContent)) {
setComponentMode('edit');
if (user?.id && !isLoading && contentObject?.owner_id === user?.id) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pronto agora adicionei a verificação de que se a publicação é do próprio usuário antes de buscar no localstorage.

Opa @andreghisleni, isso não funciona para todos os casos! Só vai abrir o modo de edição para as alterações de conteúdos já postados. Não vai funcionar para rascunhos de novas postagens em resposta de outro conteúdo.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pois é eu percebi que não funciona para todos os casos, mas pelo menos na edição ele funciona

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Então vamos deixar assim, funcionando parcialmente e futuramente podemos corrigir.

@andreghisleni
Copy link
Contributor

Realmente faz sentido eu acho que acabei me confundindo com o caso do useCallback

@filipedeschamps
Copy link
Owner Author

@aprendendofelipe como estou focado nas tarefas do backend, peço que feche esse PR e abra um na versão que devo fazer o merge na main e deploy. Depois disso podemos fazer outras melhorias nesse assunto, mas sugiro nos focarmos em outras que acredito ter mais impacto, seja as issues da milestone ou issues como essa que de fato é uma ótima ideia.

@aprendendofelipe
Copy link
Collaborator

@andreghisleni e @filipedeschamps me perdoem, mas o primeiro teste tinha um erro enorme. Editei a resposta com o resultado correto e comentários atualizados.

@vercel
Copy link

vercel bot commented May 25, 2022

@aprendendofelipe is attempting to deploy a commit to the TabNews Team on Vercel.

To accomplish this, @aprendendofelipe needs to request access to the Team.

Afterwards, an owner of the Team is required to accept their membership request.

If you're already a member of the respective Vercel Team, make sure that your Personal Vercel Account is connected to your GitHub account.

Copy link
Collaborator

@aprendendofelipe aprendendofelipe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@filipedeschamps considerando a revisão dos testes, pode fazer o merge na main com todos os commits dessa PR.

O @andreghisleni colocou de volta a funcionalidade de abrir a edição automaticamente quando encontrar rascunho no localStorage para o caso de edição de conteúdo já postado. Só não abre automaticamente para novas respostas deixadas em rascunho, mas se clicar em responder, o rascunho estará lá.

@filipedeschamps filipedeschamps changed the base branch from main to refactor-content-preview4 May 25, 2022 21:19
@filipedeschamps filipedeschamps merged commit 8372bb2 into refactor-content-preview4 May 25, 2022
@filipedeschamps filipedeschamps deleted the refactor-content-preview3 branch May 25, 2022 21:20
@filipedeschamps
Copy link
Owner Author

Show!! Feito o merge e o PR novo é este: #385

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants