Maison > interface Web > js tutoriel > Construire un tableau Kanban avec Next.js, Vercel AI et Tolgee

Construire un tableau Kanban avec Next.js, Vercel AI et Tolgee

Patricia Arquette
Libérer: 2024-11-17 22:17:02
original
604 Les gens l'ont consulté

TL;DR

Dans cet article, nous allons créer un tableau Kanban en temps réel dans Next.js à l'aide de WebSockets, avec prise en charge de la base de données, prise en charge de l'IA via le SDK Vercel AI et localisation via Tolgee.

Ce que vous apprendrez : ✨

  • Configurez un serveur WebSocket dans Next.js sans Express.
  • Implémentez l'authentification basée sur les informations d'identification dans Next.js avec NextAuth.
  • Configurez une base de données PostgreSQL à l'aide de Docker ou d'un fournisseur cloud.
  • Intégrez la prise en charge de l'IA pour les descriptions de tâches avec le SDK Vercel AI.
  • Ajoutez une traduction et une localisation en temps réel à l'aide de Tolgee.

Start le référentiel Tolgee ⭐

Êtes-vous prêt à créer un tableau Kanban unique avec prise en charge de l'IA et de la localisation ? ?

Building a Kanban Board with Next.js,Vercel AI and Tolgee


Mise en place du projet ?️

Initialisation d'une application Next.js

Initialisez une nouvelle application Next.js avec la commande suivante :

ℹ️ Vous pouvez utiliser n'importe quel gestionnaire de paquets de votre choix. Pour ce projet, j'utiliserai npm.

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ensuite, accédez au projet Next.js nouvellement créé :

cd kanban-ai-realtime-localization

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Installation des dépendances

Nous aurons besoin de plusieurs dépendances. Exécutez cette commande pour installer toutes les dépendances requises pour notre projet :

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Configuration des composants de l'interface utilisateur

Pour les composants de l'interface utilisateur, nous utiliserons shadcn/ui. Initialisez-le avec les paramètres par défaut avec cette commande :

npx shadcn@latest init -d

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Maintenant, ajoutons quelques composants d'interface utilisateur que nous utiliserons plus tard dans notre application. Pour ajouter des composants réutilisables depuis shadcn/ui, exécutez cette commande :

npx shadcn@latest add button card input label select textarea toast

Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans le répertoire app/components/ui, des fichiers supplémentaires seront ajoutés pour ces composants, que nous utiliserons lors de la création de l'interface utilisateur de notre application.


Configuration du modèle de base de données ?

Initialisation de Prisma

Initialisez Prisma avec la commande suivante :

npx prisma init

Copier après la connexion
Copier après la connexion
Copier après la connexion

Après avoir exécuté cette commande, un nouveau fichier schema.prisma doit être créé dans le répertoire prisma à la racine de votre projet.

Définir le schéma Prisma

Modifiez le fichier schema.prisma nouvellement créé pour utiliser PostgreSQL comme base de données et incluez les modèles Utilisateur et Tâche.

// ? prisma/schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: <https://pris.ly/d/prisma-schema>

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: <https://pris.ly/cli/accelerate-init>

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id       String @id @default(cuid())
  email    String @unique
  password String

  tasks Task[] @relation("UserTasks")

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Task {
  id          String  @id @default(cuid())
  title       String
  description String?
  userId      String

  column Int
  order  Int

  createdBy User @relation("UserTasks", fields: [userId], references: [id])

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

Copier après la connexion
Copier après la connexion
Copier après la connexion

Le modèle est simple : chaque utilisateur peut avoir plusieurs tâches, chaque tâche étant liée à un utilisateur spécifique. Une tâche a une valeur de colonne entière représentant son statut (0 pour en cours, 1 pour en attente et 2 pour terminé). La valeur de la commande détermine la position de chaque tâche dans la colonne qui lui est attribuée.

Maintenant que notre modèle est prêt, nous devons le transférer dans notre base de données. Pour cela, nous avons besoin de l'URL de connexion.

Si vous avez déjà accès à une base de données avec Neon ou un autre service, c'est super. Remplissez le fichier .env avec l'URL de connexion. Vous n'avez pas besoin de configurer la base de données localement avec Docker.


Configurer une base de données localement avec Docker ?

Si vous suivez et souhaitez simplement essayer le projet avec une base de données PostgreSQL locale à l'aide de Docker, ajoutez une nouvelle variable nommée DATABASE_URL avec cette valeur de chaîne de connexion au fichier .env.

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Pour exécuter une base de données localement, assurez-vous que Docker est installé. Créez un nouveau répertoire nommé scripts à la racine du projet et ajoutez un fichier appelé start-local-db-docker.sh avec les lignes de code suivantes :

cd kanban-ai-realtime-localization

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ce script lit essentiellement le fichier .env pour la variable DATABASE_URL et extrait toutes les données pertinentes comme le nom d'utilisateur, le mot de passe, le nom de la base de données et crée un conteneur s'il n'existe pas. Si c'est déjà le cas, il fait simplement tourner le conteneur existant.

Exécutez ce script pour créer et exécuter un conteneur PostgreSQL qui hébergera toutes les données utilisateur de notre application.

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Maintenant, nous devrions avoir un conteneur en cours d'exécution avec PostgreSQL. Vous pouvez vérifier si tel est le cas en exécutant cette commande :

npx shadcn@latest init -d

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Maintenant, nous aurons besoin d'un moyen d'instancier un client Prisma pour interagir avec la base de données.

Créez un nouveau fichier index.ts dans le répertoire src/db et ajoutez les lignes de code suivantes :

npx shadcn@latest add button card input label select textarea toast

Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous avons configuré une instance singleton de PrismaClient pour garantir qu'une seule instance est créée et réutilisée dans votre application, ce qui est particulièrement utile en mode développement.

Nous pouvons désormais utiliser notre base de données constante exportée pour interagir avec notre base de données dans notre application.

Exécutez la commande suivante pour transférer vos modifications dans votre schéma vers la base de données.

npx prisma init

Copier après la connexion
Copier après la connexion
Copier après la connexion

Maintenant, pour que les types mis à jour fonctionnent dans l'EDI, exécutez la commande suivante pour générer de nouveaux types basés sur notre schéma mis à jour.

// ? prisma/schema.prisma

// This is your Prisma schema file,
// learn more about it in the docs: <https://pris.ly/d/prisma-schema>

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: <https://pris.ly/cli/accelerate-init>

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id       String @id @default(cuid())
  email    String @unique
  password String

  tasks Task[] @relation("UserTasks")

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Task {
  id          String  @id @default(cuid())
  title       String
  description String?
  userId      String

  column Int
  order  Int

  createdBy User @relation("UserTasks", fields: [userId], references: [id])

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

Copier après la connexion
Copier après la connexion
Copier après la connexion

C'est tout ce dont nous avons besoin pour configurer notre base de données d'applications. ?


Configurer Tolgee pour la localisation ?️

Pour activer la localisation dans votre application Next.js avec Tolgee, suivez ces étapes :

  1. Créer langage.ts

Ce fichier gère la détection de la langue et la gestion des cookies.

// ? .env

# If you are using local DB with docker
DATABASE_URL=postgresql://postgres:password@localhost:5432/kanban-board

Copier après la connexion

La fonction setLanguage enregistre la langue sélectionnée (locale) sous forme de cookie avec une expiration d'un an, permettant à l'application de mémoriser la préférence linguistique de l'utilisateur au fil des sessions.

La fonction getLanguage vérifie la langue enregistrée dans les cookies. Si une langue valide est trouvée, elle la renvoie ; sinon, il tente de détecter la langue à partir des en-têtes du navigateur s'il est exécuté dans un navigateur. Si la détection échoue ou si l'environnement n'est pas un navigateur, la valeur par défaut est DEFAULT_LANGUAGE.

  1. Créer shared.ts

Ce fichier contient des constantes et des fonctions partagées pour gérer la localisation, y compris la récupération de données statiques pour les traductions

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La fonction getStaticData est responsable du chargement des traductions pour des langues et des espaces de noms spécifiques afin de pré-extraire le contenu localisé. Il récupère les fichiers JSON du répertoire des messages, par langue et espace de noms, puis regroupe le tout dans un seul objet et le renvoie.

Pour la sélection de la langue dans notre application, nous proposerons à l'utilisateur quatre choix de langues différents (anglais, tchèque, français et allemand). Vous pouvez ajouter la prise en charge d'autres langues si vous le souhaitez.

Dans le répertoire des messages à la racine du projet, nous stockerons différentes données statiques pour différents mots et phrases.

ℹ️ Vous pouvez trouver un lien vers ces fichiers de traduction statique dans mon référentiel. Il n'y a rien à expliquer dans ce fichier car il s'agit d'un tas de phrases traduites dans différentes autres langues.

La fonction TolgeeBase configure Tolgee avec des outils de gestion des traductions. Il ajoute la prise en charge du formatage des messages ICU (FormatIcu) et inclut DevTools pour le débogage. La fonction utilise la clé API et l'URL des variables d'environnement et définit l'anglais (en) comme langue de secours.

  1. Mettre à jour les variables d'environnement

Nous utilisons deux variables env différentes, remplissez le fichier .env avec ces clés API. Créez un compte dans Tolgee et accédez aux TOLGEE_API_KEYS, mais pour cette application, il n'est pas nécessaire d'avoir cette clé API.

cd kanban-ai-realtime-localization

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
  1. Créer un serveur.ts

Ce fichier configure l'instance Tolgee pour le rendu côté serveur, en configurant la gestion de la traduction.

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ce code crée une instance Tolgee pour la gestion de la traduction côté serveur. Cela commence par configurer getLocale pour qu'il utilise la fonction getLanguage, qui récupère la langue préférée de l'utilisateur. Ensuite, dans createTolgee, il initialise Tolgee avec les données de traduction pour toutes les langues prises en charge via getStaticData.

Il configure également Tolgee pour qu'il utilise la langue fournie (à partir de getLanguage) et configure une fonction de récupération personnalisée pour toujours charger de nouvelles données en définissant revalidate : 0, empêchant la mise en cache des demandes de traduction.

  1. Créer client.ts

Cela configure le fournisseur Tolgee pour le rendu côté client.

npx shadcn@latest init -d

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ce code configure un fournisseur Tolgee côté client pour les traductions. TolgeeProviderClient prend la langue, staticData et les enfants comme accessoires, et initialise Tolgee avec la langue et les données spécifiées. Dans useEffect, il écoute les changements de langue avec permanentChange, actualisant la page via router.refresh() chaque fois que la langue est mise à jour.

Enfin, TolgeeProvider restitue les enfants, en utilisant les options ssr pour précharger les traductions et en affichant "Chargement..." si les traductions ne sont pas prêtes instantanément.

  1. Enveloppez l'application avec TolgeeProviderClient dans layout.tsx

Enfin, enveloppez votre application avec le composant pour garantir que toutes les traductions sont accessibles.

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ici, nous obtenons d'abord accès aux paramètres régionaux de l'utilisateur en fonction de l'en-tête ou du cookie que nous avons défini à partir de la fonction. Ensuite, nous fournissons ces paramètres régionaux au étiquette.

C'est tout ce dont nous avons besoin pour configurer Tolgee dans notre application Next.js. ✨Ce sera un processus standard que vous devrez suivre pour implémenter la localisation avec Tolgee dans toutes les applications Next.js.


Configurer l'authentification ?️

Nous utiliserons NextAuth pour l'authentification dans notre application. Tout d’abord, commençons par définir un nouveau schéma Zod que nous utiliserons pour valider les données transmises par l’utilisateur.

Schéma Zod pour la validation

Définissez un schéma Zod (AuthSchema) pour valider la saisie de l'utilisateur pour l'e-mail et le mot de passe lors de la connexion et de l'inscription. Cela garantit que le format de l'e-mail est correct et que le mot de passe répond aux exigences de longueur spécifiées.

cd kanban-ai-realtime-localization

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous exigeons que le champ e-mail soit l'adresse e-mail exacte et non toute autre chaîne et nous voulons que le champ du mot de passe ait une longueur minimale de 8 caractères et une longueur maximale de 20 caractères. Nous utiliserons ce schéma de validation à plusieurs endroits pour valider les données transmises par l'utilisateur dans notre formulaire de connexion/inscription afin de vérifier si elles répondent aux critères.

Configuration d'authentification suivante

Vous configurez NextAuth dans route.ts sous src/app/api/auth/[...nextauth], en utilisant CredentialsProvider pour l'authentification. La fonction d'autorisation valide les informations d'identification, vérifie l'existence de l'utilisateur et vérifie le mot de passe.

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La logique de la fonction d'autorisation est responsable de la connexion ou non de l'utilisateur. La fonction de cette configuration vérifie si l'e-mail et le mot de passe fournis correspondent à un utilisateur existant dans la base de données.

Nous utilisons uniquement l'authentification basée sur les informations d'identification. Tout d’abord, il valide les informations d’identification à l’aide d’AuthSchema pour la validation des champs. Si la validation réussit, elle recherche l'utilisateur par email dans la base de données. Si l'utilisateur est trouvé, il compare ensuite le mot de passe haché dans la base de données avec le mot de passe saisi. Si les deux vérifications réussissent, il renvoie les données de l'utilisateur (à l'exclusion du mot de passe).

Comme vous l'avez peut-être deviné, nous exigeons ici que la variable NEXTAUTH_SECRET soit définie dans le fichier .env. Remplissez le fichier .env avec ces deux variables :

npx shadcn@latest init -d

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

API d'enregistrement des utilisateurs

Dans le src/app/api/auth/register/route.ts, nous créons un point de terminaison pour l'enregistrement des utilisateurs qui hache le mot de passe et stocke les données utilisateur dans la base de données. Nous renvoyons ensuite les réponses appropriées en fonction du succès de la validation.

npx create-next-app@latest kanban-ai-realtime-localization --typescript --tailwind --eslint --app --src-dir --use-npm

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ici, nous analysons les données reçues du client et les validons avec l'AuthSchema que nous avons écrit plus tôt. Ensuite, nous créons un hachage avec une valeur de rotation de 12. Cela génère un texte crypté que nous stockerons dans notre base de données, et enfin, nous renvoyons l'utilisateur.

Maintenant, pour rendre notre application plus solide, ajoutons un middleware qui vérifie la session utilisateur à chaque fois qu'un utilisateur visite un certain itinéraire, et s'il n'est pas authentifié, il n'est pas autorisé à visiter cet itinéraire.

Middleware pour la protection des routes

Nous ajoutons un middleware pour restreindre l'accès à la route /kanban pour les utilisateurs non authentifiés.

cd kanban-ai-realtime-localization

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ici, nous disons qu'un utilisateur ne devrait pas pouvoir visiter la route « /kanban » s'il n'est pas authentifié.

Nous en avons fini avec la logique backend pour gérer l’authentification. Travaillons sur une logique côté client.


Construire un composant de barre de navigation

Notre composant Navbar sera également composé de composants plus petits. Nous aurons un bouton pour se connecter, s'inscrire, se déconnecter et une balise de sélection pour permettre à l'utilisateur de changer de langue.

Commençons à travailler sur ces composants !

Composant LangSelector

Dans le répertoire src/app/components, créez un nouveau fichier lang-selector.tsx avec les lignes de code suivantes :

npm install @ai-sdk/openai @tolgee/react @tolgee/web @tolgee/format-icu @tanstack/react-query @prisma/client ai socket.io socket.io-client prisma next-auth date-fns nodemon ts-node zod tsconfig-paths react-beautiful-dnd

Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le composant devrait être assez explicite. Nous utilisons l'option