SPB Git

spb/trouve-ka Public

Trouve-KA — moteur de recherche web indépendant, Québec-first. Crawler distribué, index OpenSearch, ranking bilingue, galerie d'images. En prod : www.trouve-ka.com

Python 76.8% TypeScript 15.7% SQL 3.9% Shell 1.4% CSS 1.3% Dockerfile 0.7%
2.3 KB · 76 lines tsx
Raw Blame History
1/**2 * Trouve-KA — formulaire de jeton d'administration3 * Author: Simon-Pierre Boucher4 * Contact: contact@spboucher.ai5 */67"use client";89import Link from "next/link";10import { useState, type FormEvent } from "react";11import { Button } from "@/components/ui/button";12import { Card, CardContent } from "@/components/ui/card";13import { Input } from "@/components/ui/input";14import { Wordmark } from "@/components/wordmark";1516interface TokenFormProps {17  onSubmit: (token: string) => void;18  expired?: boolean;19}2021export function TokenForm({ onSubmit, expired = false }: TokenFormProps) {22  const [value, setValue] = useState("");2324  function handleSubmit(event: FormEvent) {25    event.preventDefault();26    const token = value.trim();27    if (token) onSubmit(token);28  }2930  return (31    <main32      id="contenu"33      className="flex flex-1 items-center justify-center px-4 py-16"34    >35      <Card className="w-full max-w-sm">36        <CardContent className="p-6">37          <Link href="/" className="group inline-block rounded-sm">38            <Wordmark className="text-[19px]" />39          </Link>40          <h1 className="mt-4 text-base font-bold text-ink">Administration</h1>41          <p className="mt-1 text-sm text-ink-2">42            Entrez le jeton d'administration pour accéder au dashboard du43            robot.44          </p>45          {expired ? (46            <p role="alert" className="mt-3 text-sm font-medium text-danger">47              Jeton invalide ou expiré. Entrez-le de nouveau.48            </p>49          ) : null}50          <form onSubmit={handleSubmit} className="mt-4 space-y-3">51            <label htmlFor="jeton-admin" className="sr-only">52              Jeton d'administration53            </label>54            <Input55              id="jeton-admin"56              type="password"57              autoComplete="off"58              placeholder="Jeton d'administration"59              value={value}60              onChange={(event) => setValue(event.target.value)}61              required62            />63            <Button type="submit" className="w-full">64              Accéder65            </Button>66          </form>67          <p className="mt-4 text-xs text-ink-3">68            Le jeton est conservé uniquement pour la durée de la session du69            navigateur.70          </p>71        </CardContent>72      </Card>73    </main>74  );75}76