# UrlStateService - Exemples d'URL et Cas d'Usage ## 📌 Table des matiĂšres 1. [Exemples simples](#exemples-simples) 2. [Exemples combinĂ©s](#exemples-combinĂ©s) 3. [Cas d'usage rĂ©els](#cas-dusage-rĂ©els) 4. [Partage de liens](#partage-de-liens) 5. [Gestion des erreurs](#gestion-des-erreurs) 6. [Bonnes pratiques](#bonnes-pratiques) --- ## Exemples Simples ### 1. Ouvrir une note **URL:** ``` https://app.example.com/viewer?note=Docs/Architecture.md ``` **RĂ©sultat:** - La note `Docs/Architecture.md` s'ouvre dans la vue note - Le contenu est chargĂ© et affichĂ© - La note est mise en surbrillance dans la liste **Code:** ```typescript await this.urlState.openNote('Docs/Architecture.md'); ``` ### 2. Filtrer par tag **URL:** ``` https://app.example.com/viewer?tag=Ideas ``` **RĂ©sultat:** - Affiche toutes les notes avec le tag `Ideas` - Le tag est mis en surbrillance dans la liste des tags - La liste des notes est filtrĂ©e **Code:** ```typescript await this.urlState.filterByTag('Ideas'); ``` ### 3. Filtrer par dossier **URL:** ``` https://app.example.com/viewer?folder=Notes/Meetings ``` **RĂ©sultat:** - Affiche toutes les notes du dossier `Notes/Meetings` - Le dossier est mis en surbrillance dans l'arborescence - La liste des notes est filtrĂ©e **Code:** ```typescript await this.urlState.filterByFolder('Notes/Meetings'); ``` ### 4. Afficher un quick link **URL:** ``` https://app.example.com/viewer?quick=Favoris ``` **RĂ©sultat:** - Affiche les notes marquĂ©es comme favoris - Le quick link est mis en surbrillance - La liste des notes est filtrĂ©e **Code:** ```typescript await this.urlState.filterByQuickLink('Favoris'); ``` ### 5. Rechercher **URL:** ``` https://app.example.com/viewer?search=performance ``` **RĂ©sultat:** - Affiche les rĂ©sultats de recherche pour "performance" - Les notes contenant le terme sont listĂ©es - Le terme est mis en surbrillance **Code:** ```typescript await this.urlState.updateSearch('performance'); ``` --- ## Exemples CombinĂ©s ### 1. Note avec recherche **URL:** ``` https://app.example.com/viewer?note=Docs/Architecture.md&search=performance ``` **RĂ©sultat:** - Ouvre la note `Docs/Architecture.md` - Met en surbrillance les occurrences de "performance" - Permet de naviguer entre les occurrences **Code:** ```typescript await this.urlState.openNote('Docs/Architecture.md'); await this.urlState.updateSearch('performance'); ``` ### 2. Dossier avec tag **URL:** ``` https://app.example.com/viewer?folder=Notes/Meetings&tag=Important ``` **RĂ©sultat:** - Affiche les notes du dossier `Notes/Meetings` - Filtre par le tag `Important` - Affiche l'intersection des deux filtres **Code:** ```typescript await this.urlState.filterByFolder('Notes/Meetings'); await this.urlState.filterByTag('Important'); ``` ### 3. Quick link avec recherche **URL:** ``` https://app.example.com/viewer?quick=Archive&search=2024 ``` **RĂ©sultat:** - Affiche les notes archivĂ©es - Filtre par le terme "2024" - Affiche les notes archivĂ©es contenant "2024" **Code:** ```typescript await this.urlState.filterByQuickLink('Archive'); await this.urlState.updateSearch('2024'); ``` ### 4. Dossier avec recherche **URL:** ``` https://app.example.com/viewer?folder=Journal&search=2025 ``` **RĂ©sultat:** - Affiche les notes du dossier `Journal` - Filtre par le terme "2025" - Affiche les notes du journal contenant "2025" **Code:** ```typescript await this.urlState.filterByFolder('Journal'); await this.urlState.updateSearch('2025'); ``` --- ## Cas d'Usage RĂ©els ### 1. Documentation d'Architecture **ScĂ©nario:** Vous travaillez sur l'architecture et voulez partager une note spĂ©cifique avec votre Ă©quipe. **URL:** ``` https://app.example.com/viewer?note=Docs/Architecture.md ``` **Avantages:** - Lien direct vers la note - Pas besoin de naviguer manuellement - Contexte clair pour l'Ă©quipe ### 2. RĂ©union d'Ă©quipe **ScĂ©nario:** Vous voulez afficher les notes de rĂ©union d'un mois spĂ©cifique. **URL:** ``` https://app.example.com/viewer?folder=Notes/Meetings/2025-01&tag=Important ``` **Avantages:** - Filtre par dossier et tag - Affiche uniquement les rĂ©unions importantes - Facile Ă  partager avec l'Ă©quipe ### 3. Recherche de bug **ScĂ©nario:** Vous cherchez des notes contenant "bug" dans le dossier "Issues". **URL:** ``` https://app.example.com/viewer?folder=Issues&search=bug ``` **Avantages:** - Recherche ciblĂ©e dans un dossier - RĂ©sultats pertinents - Facile Ă  reproduire ### 4. Favoris du projet **ScĂ©nario:** Vous voulez afficher les notes favorites du projet "ProjectX". **URL:** ``` https://app.example.com/viewer?quick=Favoris&search=ProjectX ``` **Avantages:** - Affiche les favoris - Filtre par projet - Vue d'ensemble rapide ### 5. TĂąches urgentes **ScĂ©nario:** Vous voulez voir les tĂąches urgentes du jour. **URL:** ``` https://app.example.com/viewer?quick=TĂąches&tag=Urgent ``` **Avantages:** - Affiche les tĂąches - Filtre par urgence - Priorisation facile ### 6. Brouillons Ă  publier **ScĂ©nario:** Vous voulez voir les brouillons prĂȘts Ă  ĂȘtre publiĂ©s. **URL:** ``` https://app.example.com/viewer?quick=Brouillons&tag=PrĂȘt ``` **Avantages:** - Affiche les brouillons - Filtre par statut - Workflow clair ### 7. Archive par annĂ©e **ScĂ©nario:** Vous voulez consulter l'archive de 2024. **URL:** ``` https://app.example.com/viewer?folder=Archive/2024 ``` **Avantages:** - Affiche l'archive d'une annĂ©e - Navigation facile - Historique accessible --- ## Partage de Liens ### 1. Partage simple **ScĂ©nario:** Vous voulez partager une note avec un collĂšgue. ```typescript // GĂ©nĂ©rer le lien const shareUrl = this.urlState.generateShareUrl(); // Copier dans le presse-papiers await this.urlState.copyCurrentUrlToClipboard(); // Afficher un toast this.toast.success('Lien copiĂ©!'); ``` **RĂ©sultat:** ``` https://app.example.com/viewer?note=Docs/Architecture.md ``` ### 2. Partage avec contexte **ScĂ©nario:** Vous voulez partager une note avec un contexte de recherche. ```typescript // GĂ©nĂ©rer le lien avec contexte const shareUrl = this.urlState.generateShareUrl({ note: 'Docs/Architecture.md', search: 'performance' }); // Partager await navigator.clipboard.writeText(shareUrl); ``` **RĂ©sultat:** ``` https://app.example.com/viewer?note=Docs/Architecture.md&search=performance ``` ### 3. Partage de filtre **ScĂ©nario:** Vous voulez partager un filtre avec votre Ă©quipe. ```typescript // Appliquer le filtre await this.urlState.filterByTag('Ideas'); // GĂ©nĂ©rer et copier le lien const shareUrl = this.urlState.generateShareUrl(); await navigator.clipboard.writeText(shareUrl); ``` **RĂ©sultat:** ``` https://app.example.com/viewer?tag=Ideas ``` ### 4. Bouton de partage **ScĂ©nario:** Vous voulez ajouter un bouton de partage dans l'interface. ```typescript @Component({ selector: 'app-share-button', template: ` ` }) export class ShareButtonComponent { urlState = inject(UrlStateService); toast = inject(ToastService); async shareCurrentState(): Promise { try { await this.urlState.copyCurrentUrlToClipboard(); this.toast.success('Lien copiĂ©!'); } catch (error) { this.toast.error('Erreur lors de la copie'); } } } ``` --- ## Gestion des Erreurs ### 1. Note introuvable **URL:** ``` https://app.example.com/viewer?note=NonExistent.md ``` **RĂ©sultat:** - Message d'avertissement dans la console - L'Ă©tat n'est pas mis Ă  jour - L'interface reste dans l'Ă©tat prĂ©cĂ©dent **Code:** ```typescript try { await this.urlState.openNote('NonExistent.md'); } catch (error) { console.error('Note not found'); this.toast.error('Note introuvable'); } ``` ### 2. Tag inexistant **URL:** ``` https://app.example.com/viewer?tag=NonExistent ``` **RĂ©sultat:** - Message d'avertissement dans la console - L'Ă©tat n'est pas mis Ă  jour - L'interface reste dans l'Ă©tat prĂ©cĂ©dent **Code:** ```typescript try { await this.urlState.filterByTag('NonExistent'); } catch (error) { console.error('Tag not found'); this.toast.warning('Tag inexistant'); } ``` ### 3. Dossier inexistant **URL:** ``` https://app.example.com/viewer?folder=NonExistent ``` **RĂ©sultat:** - Message d'avertissement dans la console - L'Ă©tat n'est pas mis Ă  jour - L'interface reste dans l'Ă©tat prĂ©cĂ©dent **Code:** ```typescript try { await this.urlState.filterByFolder('NonExistent'); } catch (error) { console.error('Folder not found'); this.toast.warning('Dossier inexistant'); } ``` ### 4. Quick link invalide **URL:** ``` https://app.example.com/viewer?quick=Invalid ``` **RĂ©sultat:** - Message d'avertissement dans la console - L'Ă©tat n'est pas mis Ă  jour - L'interface reste dans l'Ă©tat prĂ©cĂ©dent **Code:** ```typescript try { await this.urlState.filterByQuickLink('Invalid'); } catch (error) { console.error('Invalid quick link'); this.toast.warning('Quick link invalide'); } ``` --- ## Bonnes Pratiques ### 1. Toujours valider les donnĂ©es ```typescript // ❌ Mauvais - Pas de validation await this.urlState.openNote(userInput); // ✅ Bon - Validation const note = this.vault.allNotes().find(n => n.filePath === userInput); if (note) { await this.urlState.openNote(userInput); } else { this.toast.error('Note introuvable'); } ``` ### 2. GĂ©rer les erreurs ```typescript // ❌ Mauvais - Pas de gestion d'erreur await this.urlState.filterByTag(userInput); // ✅ Bon - Gestion d'erreur try { await this.urlState.filterByTag(userInput); } catch (error) { console.error('Error:', error); this.toast.error('Erreur lors du filtrage'); } ``` ### 3. Utiliser les signaux ```typescript // ❌ Mauvais - Pas rĂ©actif const tag = this.urlState.currentState().tag; // ✅ Bon - RĂ©actif const tag = this.urlState.activeTag; ``` ### 4. Écouter les changements ```typescript // ❌ Mauvais - Pas d'Ă©coute this.urlState.openNote('Note.md'); // ✅ Bon - Écouter les changements effect(() => { const note = this.urlState.currentNote(); if (note) { console.log('Note changed:', note.title); } }); ``` ### 5. Nettoyer les ressources ```typescript // ❌ Mauvais - Pas de nettoyage this.urlState.stateChange$.subscribe(event => { console.log('State changed:', event); }); // ✅ Bon - Nettoyage private destroy$ = new Subject(); constructor() { this.urlState.stateChange$ .pipe(takeUntil(this.destroy$)) .subscribe(event => { console.log('State changed:', event); }); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } ``` ### 6. Utiliser les types ```typescript // ❌ Mauvais - Pas de types const state = this.urlState.currentState(); // ✅ Bon - Avec types const state: UrlState = this.urlState.currentState(); ``` ### 7. Documenter les URLs ```typescript /** * Ouvre une note spĂ©cifique * * URL: /viewer?note=Docs/Architecture.md * * @param notePath - Chemin de la note (ex: 'Docs/Architecture.md') */ async openNote(notePath: string): Promise { // ... } ``` --- ## RĂ©sumĂ© Le `UrlStateService` offre une solution flexible pour gĂ©rer l'Ă©tat de l'interface via l'URL: - ✅ Exemples simples pour les cas courants - ✅ Exemples combinĂ©s pour les cas complexes - ✅ Cas d'usage rĂ©els pour l'inspiration - ✅ Partage de liens facile - ✅ Gestion des erreurs robuste - ✅ Bonnes pratiques pour la qualitĂ© du code Utilisez ces exemples comme base pour intĂ©grer le service dans votre application.