Skip to content
This repository has been archived by the owner on Dec 26, 2022. It is now read-only.

feat: Better user information #48

Merged
merged 40 commits into from
May 28, 2021

Conversation

pirquessa
Copy link
Collaborator

@pirquessa pirquessa commented May 24, 2021

Je voudrais améliorer le retour utilisateur une nouvelle fois...

Fait:

  • Refacto du code pour utiliser des classes plus lisibles
  • Permettre des checks plus rapide quand on a beaucoup de centres à surveiller (un toutes les 15s)
  • Limiter le temps entre deux checks d'un meme centre à 45s
  • Ajouter la raison du status dans le retour utilisateur
  • Faire expirer les status au bout de 10min

A faire:

  • Donner un historique pour chaque lieu (je ne sais pas trop comment le présenter finalement)

@pirquessa pirquessa changed the title Better user information feat: Better user information May 24, 2021
@pirquessa
Copy link
Collaborator Author

@dunglas Je continue ? La revue va être un poil lourde... M'enfin je progresse, le code back m'a l'air plus lisible :)

@dunglas
Copy link
Owner

dunglas commented May 24, 2021

Perso je ne suis pas super fan de l'utilisation des classes dans le code front sans TypeScript (je trouve que ça alourdit un peu, et que c'est un peu étrange dans un langage à héritage par prototype), après je n'ai pas d'avis tranché non plus.

background_scripts/AppStatus.js Outdated Show resolved Hide resolved
background_scripts/JobQueue.js Outdated Show resolved Hide resolved
background_scripts/JobQueue.js Outdated Show resolved Hide resolved
background_scripts/JobQueue.js Outdated Show resolved Hide resolved
background_scripts/LocalStatus.js Outdated Show resolved Hide resolved
background_scripts/LocalStatus.js Outdated Show resolved Hide resolved
background_scripts/index.js Outdated Show resolved Hide resolved
@pirquessa
Copy link
Collaborator Author

Perso je ne suis pas super fan de l'utilisation des classes dans le code front sans TypeScript (je trouve que ça alourdit un peu, et que c'est un peu étrange dans un langage à héritage par prototype), après je n'ai pas d'avis tranché non plus.

Bah ca sépare bien les responsabilités, l'index est beaucoup plus lisible quand tu débarques je pense. Clairement si on avait pu faire en TS, j'aurais préféré, je pensais pas que c'était possible. Mais avec les classes que j'ai rédigé là, la migration serait très rapide !

@dunglas
Copy link
Owner

dunglas commented May 24, 2021

La j'étais volontairement parti sur un style inspiré de la programmation fonctionnelle (avec quelques grosses divergences je l'accorde) et un seul fichier par page pour la simplicité. Je ne pense pas que la programmation fonctionnelle nuise plus à la séparation des responsabilités que la POO (on pourrait aussi utiliser des modules pour séparer les différents jeux de fonctions). Le fait de ne pas séparer c'était plutôt dans l'idée de garder le code le plus simple et concis possible (un peu à la manière d'un test e2e vu le sujet de l'extension).

@pirquessa
Copy link
Collaborator Author

Ha ben, faut qu'on statue rapidement sur le sujet, clairement je m'y perdais dans le code en un seul fichier, j'ai d'ailleurs corrigé plusieurs choses en passant aux classes.

Dans tous les cas, si tu t'y oppose, je préfère le savoir assez tot, il y a déjà pas mal de taff là, que je continue pas pour rien ;)

@dunglas
Copy link
Owner

dunglas commented May 24, 2021

Comme je te disais ce n'est pas une opposition forte. C'est plus que ce n'est pas le style que j'avais choisi (consciemment), mais après si ça te simplifie la tâche je m'en accommoderai bien !

T'as un avis là-dessus @julienw ?

Je pense à un truc aussi : il faut vérifier comment ça se comporte quand les nouveaux scripts contenant les classes sont exécutés plusieurs fois (il y a des cas ou ça arrive, par exemple quand on recharge ou mais à jour l'extension, d'où les propriétés garde-fous ajoutées à window dans les scripts existants).

(Ce ne sont que des background scripts don, ca devrait le faire)

@pirquessa
Copy link
Collaborator Author

Je pense à un truc aussi : il faut vérifier comment ça se comporte quand les nouveaux scripts contenant les classes sont exécutés plusieurs fois (il y a des cas ou ça arrive, par exemple quand on recharge ou mais à jour l'extension, d'où les propriétés garde-fous ajoutées à window dans les scripts existants).

J'avais pas vu ca comme un risque, je pensais que tout était reload ou rien...

(Ce ne sont que des background scripts don, ca devrait le faire)

L'objectif final est bien d'utiliser les classes utilitaires des deux cotés. C'est ce que je teste en ce moment.

@dunglas
Copy link
Owner

dunglas commented May 24, 2021

Pour tester facilement : tu lances la page de la liste des centres, et tu recharges l'extension. Tu verras que le script est exécuté à nouveau alors que la page n'a pas été rechargée (au début ça m'ajoutait deux fois les boutons "ajouter à ma liste", c'est comme ça que j'ai découvert cette particularité, et d'où le test de la propriété sur window que j'ai ajouté).

Aussi pour les content scripts, je pense qu'il faut éviter de polluer le namespace global, ça pourrait entrer en conflit avec les futurs développements faits par Doctolib (on est quand même dans le contexte d'exécution de leurs pages). C'est pour ça que j'ai wrappé tout le code dans une fonction anonyme, comme ça on ne pollue pas le contexte global de la page.

@pirquessa
Copy link
Collaborator Author

Ca marche, je prend en compte tout ca, thx :)

@pirquessa
Copy link
Collaborator Author

image

Ca avance bien :) Et c'est beaucoup plus rapide !

* Clean destroy or resources in popup => LOT OF ERROR are gone form console \o/
window.addEventListener("unload", function (e) {
vCLStorage.destroy();
browser.storage.onChanged.removeListener(onStorageChange);
});
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

On détruit proprement les resources (les listeners), ca nous évite des zombies et plein d'erreur dans la console 👍

if (
!confirm(
"Êtes-vous sur de vouloir supprimer toutes les données de l'extension ?"
)
)
return;

await browser.storage.sync.clear();
browser.storage.sync.clear();
vCLStorage.clear();
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

On clear bien les données locales aussi

@pirquessa
Copy link
Collaborator Author

Done, fini le refacto, on utilise bien les memes modèles coté back & front :)

@pirquessa pirquessa requested a review from dunglas May 26, 2021 20:02
@pirquessa
Copy link
Collaborator Author

image

Une console, qu'elle est belle :)

@pirquessa
Copy link
Collaborator Author

Quelqu'un aura le temps de faire une passe sur cette PR ? Je vois les autres s'accumuler, tant que je peux merger ça va, quand il va y avoir des conflits ça sera moins rigolo 😭. il y a aussi des fix qui arrivent par d'autres PR, c'est dmg de faire les choses 2 fois 😢

Copy link
Collaborator

@julienw julienw left a comment

Choose a reason for hiding this comment

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

Bon, j'ai fait une passe.
Ça a le mérite de fonctionner, ce qui est déjà pas mal vu le niveau de réécriture ! Alors bravo pour ça !

J'ai fait quelques remarques, certaines optionnelles, d'autres moins (utiliser un paramètre "options" dans un constructeur un peu compliqué, ajout de commentaires). Ça me va aussi très bien si tu préfères traiter ces remarques dans un ou des patchs séparés, pour pouvoir sortir celui-là, vu que tout marche correctement.

Bon boulot !

*/
constructor(delayBetweenJobs, minDelayRetryJob, onJobStart) {
/** @type {number} en millisecondes */
this.delayBetweenJobs = delayBetweenJobs * 1000;
Copy link
Collaborator

Choose a reason for hiding this comment

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

Avis perso: je préfèrerais aussi qu'on garde tout en ms (je trouve ça plus parlant notamment si on veut des demi-secondes, et puis en JS on a l'habitude des ms)
mais ne change pas maintenant alors que ça marche, il y a un risque de péter des trucs.

background_scripts/JobQueue.js Show resolved Hide resolved
background_scripts/JobQueue.js Outdated Show resolved Hide resolved
background_scripts/JobQueue.js Outdated Show resolved Hide resolved
background_scripts/JobQueue.js Show resolved Hide resolved
background_scripts/JobQueue.js Outdated Show resolved Hide resolved
background_scripts/JobQueue.js Outdated Show resolved Hide resolved
browser_action/index.js Show resolved Hide resolved
Comment on lines +22 to +24
* listenChanges? = false;
* onLocationsChanged?: (locations: LocationStatus[]) => void;
* onLogsChanged?: (logs: string[]) => void;
Copy link
Collaborator

Choose a reason for hiding this comment

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

En typescript, tu peux utiliser Partial<> pour faire ce genre d'objets dont toutes les propriétés sont optionnelles.

(remarque optionnelle pour cette PR)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Ca marche en JS doc ca ?

Copy link
Collaborator

Choose a reason for hiding this comment

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

Pas en JSdoc pur bien sûr, mais en typescript-en-JSDoc oui pas de souci

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

typescript-en-JSDoc je vois pas bien ce que tu veux dire

commons/VCLocalStorage.js Show resolved Hide resolved
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants