Skip to content

mise en place des pages projets #2

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

Closed
wants to merge 1 commit into from
Closed

Conversation

Nirdeo
Copy link
Owner

@Nirdeo Nirdeo commented Apr 6, 2025

Implémentation de la page d'accueil de présentation des projets, de la page de détails des projets, des likes et des filtres

Résumé par Sourcery

Implémentation de pages de projet avec des fonctionnalités complètes, notamment la liste des projets, la vue détaillée des projets, la recherche, le filtrage et la fonctionnalité "J'aime".

Nouvelles fonctionnalités :

  • Création d'une page de projets avec une vue en grille de tous les projets
  • Ajout d'une page de vue détaillée du projet
  • Implémentation de la recherche et du filtrage de projets par technologies
  • Ajout d'un système de "like" pour les projets

Améliorations :

  • Intégration de la récupération des données Airtable pour les projets
  • Ajout d'une conception réactive pour les pages de projet
  • Implémentation d'interactions côté client pour l'exploration des projets

Documentation :

  • Mise à jour de la navigation pour inclure le lien Projets
  • Ajout de définitions de type liées au projet
Original summary in English

Summary by Sourcery

Implement project pages with comprehensive features including project listing, detailed project view, search, filtering, and like functionality

New Features:

  • Create a projects page with a grid view of all projects
  • Add a detailed project view page
  • Implement project search and filtering by technologies
  • Add a like system for projects

Enhancements:

  • Integrate Airtable data fetching for projects
  • Add responsive design for project pages
  • Implement client-side interactions for project exploration

Documentation:

  • Update navigation to include Projects link
  • Add project-related type definitions

Implémentation de la page d'accueil de présentation des projets, de la page de détails des projets, des likes et des filtres
@Nirdeo Nirdeo requested review from Thivalaine and StephanG2a April 6, 2025 22:11
@Nirdeo Nirdeo self-assigned this Apr 6, 2025
Copy link

sourcery-ai bot commented Apr 6, 2025

Guide du relecteur par Sourcery

Cette pull request implémente la liste des projets et les pages de détails, y compris la fonctionnalité "j'aime", la recherche et le filtrage, et la prise en charge des images, en récupérant les données depuis Airtable. Elle ajoute également un lien vers la page des projets dans la barre de navigation.

Diagramme de séquence pour "Aimer" un projet

sequenceDiagram
  participant User
  participant LikeButton Component
  participant /api/projects/like Endpoint
  participant Airtable

  User->>LikeButton Component: Clic sur le bouton "j'aime"/"je n'aime plus"
  LikeButton Component->>/api/projects/like Endpoint: Envoie une requête avec projectId et action (add/remove)
  activate /api/projects/like Endpoint
  /api/projects/like Endpoint->>Airtable: Récupère les "j'aime" actuels pour le projet
  Airtable-->>/api/projects/like Endpoint: Renvoie les "j'aime" actuels
  /api/projects/like Endpoint->>Airtable: Met à jour les "j'aime" du projet dans Airtable
  Airtable-->>/api/projects/like Endpoint: Renvoie les données du projet mises à jour
  /api/projects/like Endpoint-->>LikeButton Component: Renvoie le succès et le nouveau nombre de "j'aime"
  deactivate /api/projects/like Endpoint
  LikeButton Component->>User: Met à jour l'interface utilisateur avec le nouveau nombre de "j'aime"
  LikeButton Component->>LikeButton Component: Met à jour localStorage
  LikeButton Component->>LikeButton Component: Actualise les données de la page
Loading

Diagramme de classes mis à jour pour le type Projet

classDiagram
  class Projet {
    id: string
    fields: ProjetFields
  }
  class ProjetFields {
    Nom: string
    Description: string
    Technologies: string
    Lien: string
    Visuels: AirtableAttachment[]
    Promotion: string
    Administrateur: string
    Categorie: string[]
    Statut: string
    Likes: number
  }
  class AirtableAttachment {
    id: string
    url: string
    filename: string
    size: number
    type: string
    width: number
    height: number
    thumbnails: Thumbnails
  }
  class Thumbnails {
    small: Thumbnail
    large: Thumbnail
  }
  class Thumbnail {
    url: string
    width: number
    height: number
  }

  Projet "1" -- "1" ProjetFields : has
  ProjetFields "1" -- "n" AirtableAttachment : has
  AirtableAttachment "1" -- "1" Thumbnails : has
  Thumbnails "1" -- "1" Thumbnail : has small
  Thumbnails "1" -- "1" Thumbnail : has large

  note for ProjetFields "Added Likes: number field"
Loading

Modifications au niveau des fichiers

Modification Détails Fichiers
Implémente la liste des projets et les pages de détails, en récupérant les données depuis Airtable.
  • Récupère les projets depuis Airtable en utilisant getAirtableProjects.
  • Affiche les projets dans une grille en utilisant le composant ProjectGrid.
  • Crée une page de détails du projet qui récupère les données individuelles du projet en utilisant getAirtableProjectById.
  • Gère les cas où un projet n'est pas trouvé, en affichant une erreur 404.
  • Ajoute un lien pour revenir à la page des projets depuis la page de détails.
src/app/page.tsx
src/app/projets/[id]/page.tsx
src/app/projets/page.tsx
src/components/ProjectGrid.tsx
src/utils/airtable.tsx
Ajoute la fonctionnalité "j'aime" aux projets, permettant aux utilisateurs d'aimer et de ne plus aimer les projets.
  • Implémente un composant LikeButton pour gérer les "j'aime" et "je n'aime plus" des projets.
  • Utilise le stockage local pour conserver les projets aimés d'une session à l'autre.
  • Met à jour le nombre de "j'aime" dans Airtable en utilisant la fonction updateProjectLikes.
  • Crée un endpoint API (/api/projects/like) pour gérer les requêtes "j'aime".
  • Actualise la page après une action "j'aime" ou "je n'aime plus" pour mettre à jour les données affichées.
  • Gère les erreurs pendant le processus "j'aime"/"je n'aime plus" et affiche des messages d'erreur à l'utilisateur.
src/components/LikeButton.tsx
src/utils/airtable.tsx
src/app/api/projects/like/route.ts
src/app/projets/[id]/page.tsx
src/components/ProjectGrid.tsx
Ajoute des fonctionnalités de recherche et de filtrage de projets.
  • Implémente un composant ProjectSearch pour permettre aux utilisateurs de rechercher des projets par nom ou description.
  • Permet de filtrer les projets par technologie.
  • Extrait dynamiquement les technologies disponibles à partir des données des projets.
  • Met à jour les projets affichés en fonction du terme de recherche et des technologies sélectionnées.
  • Fournit un bouton pour effacer tous les filtres.
src/components/ProjectSearch.tsx
src/components/ProjectGrid.tsx
Met à jour les types de données des projets et ajoute la prise en charge des images.
  • Définit un type pour les pièces jointes Airtable, y compris les URL et les miniatures.
  • Met à jour le type Projet pour inclure le nouveau type de pièce jointe pour les visuels du projet.
  • Configure Next.js pour autoriser l'optimisation des images depuis le domaine d'Airtable.
  • Met à jour la grille des projets et les pages de détails pour afficher les images depuis Airtable.
src/types/Projet.ts
next.config.ts
src/app/projets/[id]/page.tsx
src/components/ProjectGrid.tsx
Ajoute un lien vers la page des projets dans la barre de navigation.
  • Ajoute un nouvel élément de liste avec un lien vers /projets dans le composant Navigation.
  • Met en évidence le lien lorsque l'utilisateur est sur la page des projets.
src/components/Navigation.tsx

Conseils et commandes

Interagir avec Sourcery

  • Déclencher une nouvelle revue : Commentez @sourcery-ai review sur la pull request.
  • Continuer les discussions : Répondez directement aux commentaires de revue de Sourcery.
  • Générer un problème GitHub à partir d'un commentaire de revue : Demandez à Sourcery de créer un
    problème à partir d'un commentaire de revue en y répondant. Vous pouvez également répondre à un
    commentaire de revue avec @sourcery-ai issue pour créer un problème à partir de celui-ci.
  • Générer un titre de pull request : Écrivez @sourcery-ai n'importe où dans le titre de la pull
    request pour générer un titre à tout moment. Vous pouvez également commenter
    @sourcery-ai title sur la pull request pour (re-)générer le titre à tout moment.
  • Générer un résumé de pull request : Écrivez @sourcery-ai summary n'importe où dans
    le corps de la pull request pour générer un résumé de PR à tout moment exactement où vous
    le souhaitez. Vous pouvez également commenter @sourcery-ai summary sur la pull request pour
    (re-)générer le résumé à tout moment.
  • Générer un guide du relecteur : Commentez @sourcery-ai guide sur la pull
    request pour (re-)générer le guide du relecteur à tout moment.
  • Résoudre tous les commentaires de Sourcery : Commentez @sourcery-ai resolve sur la
    pull request pour résoudre tous les commentaires de Sourcery. Utile si vous avez déjà
    traité tous les commentaires et que vous ne voulez plus les voir.
  • Rejeter toutes les revues de Sourcery : Commentez @sourcery-ai dismiss sur la pull
    request pour rejeter toutes les revues Sourcery existantes. Particulièrement utile si vous
    voulez repartir à zéro avec une nouvelle revue - n'oubliez pas de commenter
    @sourcery-ai review pour déclencher une nouvelle revue !
  • Générer un plan d'action pour un problème : Commentez @sourcery-ai plan sur
    un problème pour générer un plan d'action pour celui-ci.

Personnaliser votre expérience

Accédez à votre tableau de bord pour :

  • Activer ou désactiver les fonctionnalités de revue telles que le résumé de pull request généré par Sourcery, le guide du relecteur, et autres.
  • Changer la langue de la revue.
  • Ajouter, supprimer ou modifier des instructions de revue personnalisées.
  • Ajuster d'autres paramètres de revue.

Obtenir de l'aide

Original review guide in English

Reviewer's Guide by Sourcery

This pull request implements project listing and detail pages, including like functionality, search and filtering, and image support, fetching data from Airtable. It also adds a link to the projects page in the navigation bar.

Sequence Diagram for Liking a Project

sequenceDiagram
  participant User
  participant LikeButton Component
  participant /api/projects/like Endpoint
  participant Airtable

  User->>LikeButton Component: Clicks like/unlike button
  LikeButton Component->>/api/projects/like Endpoint: Sends request with projectId and action (add/remove)
  activate /api/projects/like Endpoint
  /api/projects/like Endpoint->>Airtable: Fetches current likes for project
  Airtable-->>/api/projects/like Endpoint: Returns current likes
  /api/projects/like Endpoint->>Airtable: Updates project likes in Airtable
  Airtable-->>/api/projects/like Endpoint: Returns updated project data
  /api/projects/like Endpoint-->>LikeButton Component: Returns success and new like count
  deactivate /api/projects/like Endpoint
  LikeButton Component->>User: Updates UI with new like count
  LikeButton Component->>LikeButton Component: Updates localStorage
  LikeButton Component->>LikeButton Component: Refreshes page data
Loading

Updated Class Diagram for Projet Type

classDiagram
  class Projet {
    id: string
    fields: ProjetFields
  }
  class ProjetFields {
    Nom: string
    Description: string
    Technologies: string
    Lien: string
    Visuels: AirtableAttachment[]
    Promotion: string
    Administrateur: string
    Categorie: string[]
    Statut: string
    Likes: number
  }
  class AirtableAttachment {
    id: string
    url: string
    filename: string
    size: number
    type: string
    width: number
    height: number
    thumbnails: Thumbnails
  }
  class Thumbnails {
    small: Thumbnail
    large: Thumbnail
  }
  class Thumbnail {
    url: string
    width: number
    height: number
  }

  Projet "1" -- "1" ProjetFields : has
  ProjetFields "1" -- "n" AirtableAttachment : has
  AirtableAttachment "1" -- "1" Thumbnails : has
  Thumbnails "1" -- "1" Thumbnail : has small
  Thumbnails "1" -- "1" Thumbnail : has large

  note for ProjetFields "Added Likes: number field"
Loading

File-Level Changes

Change Details Files
Implements project listing and detail pages, fetching data from Airtable.
  • Fetches projects from Airtable using getAirtableProjects.
  • Displays projects in a grid layout using the ProjectGrid component.
  • Creates a project detail page that fetches individual project data using getAirtableProjectById.
  • Handles cases where a project is not found, displaying a 404 error.
  • Adds a link to navigate back to the projects page from the detail page.
src/app/page.tsx
src/app/projets/[id]/page.tsx
src/app/projets/page.tsx
src/components/ProjectGrid.tsx
src/utils/airtable.tsx
Adds like functionality to projects, allowing users to like and unlike projects.
  • Implements a LikeButton component to handle liking and unliking projects.
  • Uses local storage to persist liked projects across sessions.
  • Updates the number of likes in Airtable using the updateProjectLikes function.
  • Creates an API endpoint (/api/projects/like) to handle like requests.
  • Refreshes the page after a like or unlike action to update the displayed data.
  • Handles errors during the like/unlike process and displays error messages to the user.
src/components/LikeButton.tsx
src/utils/airtable.tsx
src/app/api/projects/like/route.ts
src/app/projets/[id]/page.tsx
src/components/ProjectGrid.tsx
Adds project search and filtering capabilities.
  • Implements a ProjectSearch component to allow users to search for projects by name or description.
  • Allows filtering projects by technology.
  • Dynamically extracts available technologies from the projects data.
  • Updates the displayed projects based on the search term and selected technologies.
  • Provides a button to clear all filters.
src/components/ProjectSearch.tsx
src/components/ProjectGrid.tsx
Updates project data types and adds image support.
  • Defines a type for Airtable attachments, including URLs and thumbnails.
  • Updates the Projet type to include the new attachment type for project visuals.
  • Configures Next.js to allow image optimization from Airtable's domain.
  • Updates the project grid and detail pages to display images from Airtable.
src/types/Projet.ts
next.config.ts
src/app/projets/[id]/page.tsx
src/components/ProjectGrid.tsx
Adds a link to the projects page in the navigation bar.
  • Adds a new list item with a link to /projets in the Navigation component.
  • Highlights the link when the user is on the projects page.
src/components/Navigation.tsx

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!
  • Generate a plan of action for an issue: Comment @sourcery-ai plan on
    an issue to generate a plan of action for it.

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey @Nirdeo - I've reviewed your changes - here's some feedback:

Overall Comments:

  • Consider adding a loading state or skeleton UI while fetching data from Airtable to improve user experience.
  • It would be beneficial to add error handling for the Airtable API calls to gracefully handle potential failures.
Here's what I looked at during the review
  • 🟡 General issues: 1 issue found
  • 🟢 Security: all looks good
  • 🟢 Testing: all looks good
  • 🟡 Complexity: 2 issues found
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@@ -0,0 +1 @@
const Airtable = require('airtable'); const base = new Airtable({apiKey: process.env.AIRTABLE_KEY}).base(process.env.AIRTABLE_BASE); (async () => { const records = await base('Projets').select().all(); console.log(JSON.stringify(records[0], null, 2)); })();
Copy link

Choose a reason for hiding this comment

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

suggestion: Remove or relocate temporary debugging code.

This temporary script might be useful during development, but it’s better to remove it or isolate it from production code to avoid unnecessary clutter.

Suggested implementation:

/*
Temporary debugging code has been removed.
If you need to test Airtable functionality, please use a dedicated debugging script.
*/

If this debugging code is needed for development, consider moving it to a dedicated development-only file or use environment variables to conditionally run the debug code.

};
};

export default async function ProjectDetail({ params }: Props) {
Copy link

Choose a reason for hiding this comment

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

issue (complexity): Consider extracting UI sections and data fetching into separate components to improve legibility and testability, such as creating a dedicated header component and gallery component..

Consider extracting each UI section and even the data fetching into separate components/functions. For example, create a dedicated header component along with a gallery component. This separation improves both legibility and testability while preserving the original behavior.

Example:
Create a ProjectHeader component:

// components/ProjectHeader.tsx
import Link from "next/link";
import LikeButton from "@/components/LikeButton";

type Props = {
  project: Projet;
};
export default function ProjectHeader({ project }: Props) {
  return (
    <div className="mb-8">
      <div className="flex justify-between items-start">
        <h1 className="text-3xl font-bold mb-2">{project.fields.Nom}</h1>
        <LikeButton
          projectId={project.id}
          initialLikes={typeof project.fields.Likes === 'number' ? project.fields.Likes : 0}
          className="text-lg"
        />
      </div>
      <div className="flex flex-wrap gap-2 mb-4">
        {typeof project.fields.Technologies === 'string' &&
          project.fields.Technologies.split(',').map((tech, index) => (
            <span
              key={index}
              className="bg-gray-100 dark:bg-gray-700 px-3 py-1 rounded-full text-sm"
            >
              {tech.trim()}
            </span>
          ))}
      </div>
      <div className="text-sm text-gray-500 dark:text-gray-400">
        Promotion: {project.fields.Promotion}
      </div>
      <Link
        href="/"
        className="inline-flex items-center mb-6 text-sm font-medium text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200"
      >
        <svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5 mr-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
          <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 19l-7-7m0 0l7-7m-7 7h18" />
        </svg>
        Retour aux projets
      </Link>
    </div>
  );
}

Likewise, create similar components for the gallery, description, and details sections. Then in your main page component, import them and pass down the project data:

// pages/ProjectDetail.tsx
import ProjectHeader from "@/components/ProjectHeader";
// import other subcomponents as needed

export default async function ProjectDetail({ params }: Props) {
  try {
    const projectData = await getAirtableProjectById(params.id);
    if (!projectData) return notFound();
    const project = {
      id: projectData.id,
      fields: projectData.fields,
    } as Projet;

    return (
      <div className="min-h-screen py-8">
        <div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
          <ProjectHeader project={project} />
          {/* Render Gallery, Description, and AdditionalInfo components here */}
        </div>
      </div>
    );
  } catch (error) {
    console.error("Erreur lors de la récupération du projet:", error);
    return notFound();
  }
}

By isolating concerns into smaller components, you reduce cognitive load and improve maintainability while keeping functionality intact.

}
};

export default function LikeButton({ projectId, initialLikes, className = "" }: LikeButtonProps) {
Copy link

Choose a reason for hiding this comment

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

issue (complexity): Consider extracting the localStorage and API logic into separate modules to simplify the component.

Consider extracting the localStorage and API logic from the component to decrease its responsibilities.

Step 1. Extract localStorage utilities
Create a new module (e.g., localStorageUtils.ts) for getLikedProjects and saveLikedProjects:

// localStorageUtils.ts
export const LIKED_PROJECTS_KEY = "likedProjects";

export const getLikedProjects = (): string[] => {
  if (typeof window === "undefined") return [];
  try {
    const likedProjects = localStorage.getItem(LIKED_PROJECTS_KEY);
    return likedProjects ? JSON.parse(likedProjects) : [];
  } catch (error) {
    console.error("Erreur lors de la récupération des projets aimés:", error);
    return [];
  }
};

export const saveLikedProjects = (projects: string[]): void => {
  if (typeof window === "undefined") return;
  try {
    localStorage.setItem(LIKED_PROJECTS_KEY, JSON.stringify(projects));
  } catch (error) {
    console.error("Erreur lors de la sauvegarde des projets aimés:", error);
  }
};

Then update your component to import these:

import { getLikedProjects, saveLikedProjects } from "./localStorageUtils";

Step 2. Extract the API call
Create an API utility (e.g., likeService.ts) to encapsulate the API request:

// likeService.ts
export const toggleLikeStatus = async (projectId: string, hasLiked: boolean) => {
  const action = hasLiked ? "remove" : "add";
  const response = await fetch("/api/projects/like", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ projectId, action }),
  });
  const data = await response.json();
  if (!response.ok) {
    throw new Error(data.error || "Une erreur est survenue");
  }
  return data;
};

Then use it in your component:

import { toggleLikeStatus } from "./likeService";

const handleLikeToggle = async () => {
  if (isProcessing) return;

  setIsProcessing(true);
  setError(null);

  try {
    const data = await toggleLikeStatus(projectId, hasLiked);
    setLikes(data.likes);

    const newHasLiked = !hasLiked;
    setHasLiked(newHasLiked);

    const likedProjects = getLikedProjects();
    if (newHasLiked) {
      if (!likedProjects.includes(projectId)) {
        saveLikedProjects([...likedProjects, projectId]);
      }
    } else {
      saveLikedProjects(likedProjects.filter(id => id !== projectId));
    }

    router.refresh();
  } catch (err) {
    setError(err instanceof Error ? err.message : "Une erreur est survenue");
    console.error("Erreur lors de la gestion du like:", err);
  } finally {
    setIsProcessing(false);
  }
};

This refactoring isolates different concerns while keeping all functionality intact and reduces the cognitive load within the LikeButton component.


// Fonction pour récupérer les projets aimés du localStorage
const getLikedProjects = (): string[] => {
if (typeof window === "undefined") return [];
Copy link

Choose a reason for hiding this comment

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

suggestion (code-quality): Use block braces for ifs, whiles, etc. (use-braces)

Suggested change
if (typeof window === "undefined") return [];
if (typeof window === "undefined") {


ExplanationIt is recommended to always use braces and create explicit statement blocks.

Using the allowed syntax to just write a single statement can lead to very confusing
situations, especially where subsequently a developer might add another statement
while forgetting to add the braces (meaning that this wouldn't be included in the condition).


// Fonction pour sauvegarder les projets aimés dans le localStorage
const saveLikedProjects = (projects: string[]): void => {
if (typeof window === "undefined") return;
Copy link

Choose a reason for hiding this comment

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

suggestion (code-quality): Use block braces for ifs, whiles, etc. (use-braces)

Suggested change
if (typeof window === "undefined") return;
if (typeof window === "undefined") {


ExplanationIt is recommended to always use braces and create explicit statement blocks.

Using the allowed syntax to just write a single statement can lead to very confusing
situations, especially where subsequently a developer might add another statement
while forgetting to add the braces (meaning that this wouldn't be included in the condition).

}, [projectId]);

const handleLikeToggle = async () => {
if (isProcessing) return;
Copy link

Choose a reason for hiding this comment

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

suggestion (code-quality): Use block braces for ifs, whiles, etc. (use-braces)

Suggested change
if (isProcessing) return;
if (isProcessing) {


ExplanationIt is recommended to always use braces and create explicit statement blocks.

Using the allowed syntax to just write a single statement can lead to very confusing
situations, especially where subsequently a developer might add another statement
while forgetting to add the braces (meaning that this wouldn't be included in the condition).

Comment on lines +37 to +39

return project;
Copy link

Choose a reason for hiding this comment

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

suggestion (code-quality): Inline variable that is immediately returned (inline-immediately-returned-variable)

Suggested change
const project = await base.table("Projets").find(id);
return project;
return await base.table("Projets").find(id);


ExplanationSomething that we often see in people's code is assigning to a result variable
and then immediately returning it.

Returning the result directly shortens the code and removes an unnecessary
variable, reducing the mental load of reading the function.

Where intermediate variables can be useful is if they then get used as a
parameter or a condition, and the name can act like a comment on what the
variable represents. In the case where you're returning it from a function, the
function name is there to tell you what the result is, so the variable name
is unnecessary.

@Nirdeo Nirdeo closed this Apr 7, 2025
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.

1 participant