Feat : tag system
All checks were successful
release / build (push) Successful in 26s
release / verify-windows (push) Successful in 1m26s

This commit is contained in:
jeanotx32
2026-08-12 22:19:16 +02:00
parent cbbf31cabf
commit d44a7c4fb6
10 changed files with 840 additions and 6 deletions

View File

@@ -866,6 +866,35 @@ export interface LogEntry {
event: AgentEvent | null;
}
/**
* Étiquette librement créée par l'opérateur, posable sur autant de profils
* qu'on veut.
*
* Une entité à part entière plutôt qu'un simple texte répété sur chaque profil :
* c'est ce qui permet de la renommer d'un geste, et de la garder disponible
* même quand plus aucun profil ne la porte.
*/
export interface Tag {
id: string;
name: string;
}
/** Limite de saisie : au-delà, l'étiquette ne tient plus dans une vignette. */
export const TAG_MAX_LENGTH = 24;
/**
* Nettoie un nom d'étiquette saisi, ou renvoie `null` s'il ne reste rien.
*
* Les espaces intérieurs sont réduits et les extrémités coupées : « en soirée »
* et « en soirée » désignent la même étiquette, et les laisser cohabiter ferait
* deux entrées indiscernables à l'œil dans la liste des filtres.
*/
export function normalizeTagName(raw: unknown): string | null {
if (typeof raw !== 'string') return null;
const name = raw.replace(/\s+/g, ' ').trim().slice(0, TAG_MAX_LENGTH);
return name.length > 0 ? name : null;
}
/**
* Profil surveillé par le serveur : on colle l'URL d'un streamer, le serveur
* sonde son statut et signale les passages en direct.
@@ -914,6 +943,16 @@ export interface WatchTarget {
lastError: string | null;
createdAt: number;
/**
* Étiquettes libres posées par l'opérateur, pour trier une liste qui grandit.
*
* Embarquées dans le profil plutôt que référencées par identifiant : la liste
* part déjà en entier à chaque mise à jour temps réel, et une poignée de noms
* ne pèse rien à côté. Le dashboard n'a de ce fait aucune seconde liste à
* tenir à jour pour afficher une vignette.
*/
tags: Tag[];
/** Photo de profil. */
avatarUrl: string | null;
/**