Open BOCOVO opened 7 months ago
const Skill = ({ name }: SkillProps) => {
switch (name) {
case SkillEnum.typescript:
return (
<TypesScriptIcon />
)
case SkillEnum.express:
return (
<ExpressIcon />
)
default:
return null
}
}
Tu vas remarquer TypesScriptIcon
et ExpressIcon
c'est que je te propose de créer des composants pour change icône de skill afin d'alléger ton composant Skill
.
Une autre proposition est d'utiliser un objet key-value dont la key est de type SkillEnum
et la value le composant de l'icone en question. Cette proposition va réduire davantage le poids ( en termes de nbre de lignes de code ) du composant Skill
.
const SkillIconMap: Record<SkillEnum, React.Component> = {
[SkillEnum.typescript]: TsIcon,
// les autres composants ici
}
const Skill = ({ name }: SkillProps) => {
return SkillIconMap[name]
}
[!WARNING] J'espere que je t'enbrouille pas 😆 . Tu peux adopter la premiere proposition pour faire simple. Tiens moi au courant si tu veux plus de précision.
Skill
ne fait pas comprendre ça. Je te propose SkillIcon
.SkillEnum
plutôt.
interface SkillIconProps {
name: SkillEnum
}
Same as above ( ou presque ) SocialButton
Pour assurer une bonne accessibilité, ajouter les types sur les boutons.
Type submit
pour celui de soumission et reset
pour l'autre.
disabled={disabled}
sur le button de submit, donc pas besoin de le retirer du DOM quand disabled est true.
https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/components/layout/contact-me.tsx#L108-L114Problème de bonne semantic.
Tu n'utilises pas les bonnes balises. Pas de h
ni de p
. Tu fais une utilisation exagérer de balise div
.
Tout ce qui peut être considéré comme un titre doit être dans une balise h
et tout ce qui peut être vu comme un corpus de texte dans un p
.
[!> [!IMPORTANT] ] Attaches du prix au point 21.
Ton implémentation ici fonctionne, mais ... Il te faut nettoyer les timeout lors du démontage du composant. La actu ( en dev mode, car le strict mode est activé) tu dois avoir un timer de plus que voulu. Ton useEffect sera appele deux fois. https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/838cc60e17ed80bca1fbe3d1f3b221617968f690/components/layout/hero.tsx#L12
Les indexs en tant que key n'est pas recommandé. Tu en fais beaucoup usage.
https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/838cc60e17ed80bca1fbe3d1f3b221617968f690/components/layout/testimonials.tsx#L16
Il faut que le key permette d'identifier une itération de façons unique. Tu peux voir ça comme un id.
L'index n'en ai pas un. On peut en reparler si tu veux.
Ce que fait d'hab faute de mieux est de composer de clé avec plusieurs autres valeurs. Par exemple, que peut faire key={`${index}-${testimonial.name}`}
Ça permet d'éviter les incohérences de rendu possible, mais faire plus travailler React. ....
Il y a pas mal de corrections à faire.J'ai noté un gros défaut d'utilisation de bonne sémantique. Si tu devrais corriger une seule chose, que ce soit celui-là.
@vivienogoun j'ai toujours pas compris ton explication sur le point 15
La première icone est l'icone par défaut. La seconde icone est l'icone au hover (l'apparence de l'icone change)
Les icones sont par défaut en blanc sur noir et au hover, ça devient noir sur blanc. Je ne suis pas arrivé à gérer ça juste avec les classnames puisque les icones sont en svg et les couleurs sont directement dans le svg Donc j'utilise un prop hover pour changer les couleurs de l'icone selon l'état par défaut ou l'état hover Puisque je ne peut pas faire apparaitre le prop hover au hover (j'espère que c'est compréhensible) je mets deux icones; l'un étant dans l'état par défaut et l'autre étant dans l'état hover puis je fais apparaitre ou disparaitre l'un ou l'autre selon l'état que je veut afficher https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/components/skill.tsx#L20-L29 https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/lib/constants.ts#L1-L2
@BOCOVO
disabled={disabled}
. Je préfère faire disparaître le bouton pour ne pas agir négativement sur l'ui
Missing
Readme
C'est important d'avoir un readme explicite dans son projetLe dossier
.vscode
devrait être ignoré. Tu pourrais me dire ce qui t'a obligé à le conserver.Irrégularité dans le message de commit Le type de commit est précisé des fois d'autre fois non. May be helpful
Des dépendances inutilisées Ces dépendances ne semblent pas être utilisées
@radix-ui/react-dialog
,@radix-ui/react-separator
...Le href ne devrait pas être optionnel pour une bonne cohérence. https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/types/nav.ts#L3 Et ça t'éviterait d'ailleurs cette vérification https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/components/layout/site-header.tsx#L48
Mieux serait que tu crées le type et qu'ensuite tu l'utilises pour construire ton objet. Cela te permet de garantir que ton object suis un type bien défini et c'est plus sûr. https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/config/site.ts#L1
Tu utilises vraiment ceci ? https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/config/site.ts#L24-L28
Ce hook n'est pas utilisé et n'est pas explicite. https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/hooks/use-media-query.tsx#L3 Je pense que le nommé
useMatchesMediaQuery
est plus explicite, car il correspond au type de retours quitrue
oufalse
selon que la query est matches ou non. Et aussi la façon dont tu importes React n'est pas top. Import juste ce dont tu as besoin. Quelques ça optimise le sizing de ton build.No commented code and No unsed imports Il faut éviter les codes commenter, c'est vu comme sale. https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/lib/fonts.ts#L12-L15
Les modules
lib/constants
etlib/data
ne sont pas des libs donc n'ont pas leur place dans le dossierlib
. Tu n'as pas besoin du dossierlib
dans ton projet, je trouve.Tu peux créer un dossier
utils
et déplacer ce modulelib/utils
dedans, mais il faudra renommer le fichier ( maybecn.ts
).Pour une bonne organisation, je te propose de mettre tes images dans un dossier
assets
dans le dossierpublic
.Je propose de découper les icônes dans différents fichiers pour simplifier la maintenance. https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/components/icons.tsx#L1 L'autre risque est de finir avec des icônes non utiliser et augment la taille de ton build pour rien. Car tu importes l'object Icones qui inclura toutes les icônes dans ton build.
Mauvaise pratique. Cette directive
use client
que tu as ajouté vas rendre toute ta page client component. Alors qu'elle pourrait être constituée en bonne partie de RSC ( React Server Component ). Il faut le retirer et l'ajouter une uniquement ou c'est nécessaire. https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/app/page.tsx#L1 Tu peux extraire ce bout de code dans un autre composent et rendre ce dernier client component https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/app/page.tsx#L15-L22Je ne sais pas pourquoi tu met toujours deux icones (. tu me diras ) https://github.com/vivienogoun/FigmaToCode-Challenge-Week4-vivien/blob/06df5b3e901753214557697e04b01d1d5928e9ca/components/social-buttons.tsx#L26-L33
Je pense que l'utilisation du hook
useTheme
peut être éviter car tu as les classdark:
de tailwinds pour appliquer des styles pour le dark mode....Pas encore terminé, je continuerai demain.