Composable pour récupérer les paramètres de configuration de l'application depuis l'API. Actuellement utilisé pour obtenir la limite maximale d'équipements.
Le composable useParameter fournit un accès simple aux paramètres système de l'application. Il gère l'authentification automatique et la mise en cache des résultats.
flowchart LR
A[useParameter] --> B[useAuth]
B --> C[Token JWT]
A --> D[API /api/parameters]
D --> E[Cache Nuxt]
E --> F[Valeur retournée]
getMaxEquipments(): Promise<number>Récupère le nombre maximum d'équipements autorisés par requête.
const { getMaxEquipments } = useParameter();
const maxEquipments = await getMaxEquipments();
console.log(maxEquipments); // 5 par défaut
Retour : Nombre maximum d'équipements (par défaut : 5 en cas d'erreur)
Comportement :
useAuth()"max_equipments"<script setup lang="ts">
const { getMaxEquipments } = useParameter();
const maxEquipments = ref(5);
onMounted(async () => {
maxEquipments.value = await getMaxEquipments();
});
</script>
<template>
<div>
<p>Maximum d'équipements : {{ maxEquipments }}</p>
</div>
</template>
<template>
<div>
<div v-for="(equipment, index) in equipments" :key="index">
<EquipmentForm :equipment="equipment" />
</div>
<UButton
@click="addEquipment"
:disabled="equipments.length >= maxEquipments"
>
Ajouter un équipement
</UButton>
<p v-if="equipments.length >= maxEquipments" class="text-sm text-gray-500">
Limite de {{ maxEquipments }} équipements atteinte
</p>
</div>
</template>
<script setup lang="ts">
const { getMaxEquipments } = useParameter();
const maxEquipments = ref(5);
const equipments = ref([{}]);
onMounted(async () => {
maxEquipments.value = await getMaxEquipments();
});
function addEquipment() {
if (equipments.value.length < maxEquipments.value) {
equipments.value.push({});
}
}
</script>
<script setup lang="ts">
const { formData, addEquipment } = useForm();
const { getMaxEquipments } = useParameter();
const maxEquipments = ref(5);
onMounted(async () => {
maxEquipments.value = await getMaxEquipments();
});
const canAddEquipment = computed(() => {
return formData.value.equipments.length < maxEquipments.value;
});
</script>
<template>
<UButton
@click="addEquipment"
:disabled="!canAddEquipment"
>
Ajouter un équipement
({{ formData.equipments.length }}/{{ maxEquipments }})
</UButton>
</template>
Le composable utilise le système de cache de Nuxt avec la clé "max_equipments". Cela permet :
Le cache est géré automatiquement par Nuxt et peut être invalidé si nécessaire :
await refreshNuxtData('max_equipments');
Le composable utilise automatiquement useAuth() pour obtenir le token JWT et l'inclure dans les en-têtes de la requête :
const { getToken } = useAuth();
const token = getToken();
const response = await $fetch("/api/parameters/max_equipments", {
key: "max_equipments",
headers: {
Authorization: `Bearer ${token}`,
},
});
Note : L'utilisateur doit être authentifié pour utiliser ce composable.
En cas d'erreur (réseau, authentification, etc.), le composable :
console.error5try {
const response = await $fetch(/* ... */);
return response.value;
} catch (error) {
console.error(error);
return 5; // Valeur par défaut
}
Le composable peut être étendu pour récupérer d'autres paramètres :
export const useParameter = () => {
const { getToken } = useAuth();
const token = getToken();
const getMaxEquipments = async (): Promise<number> => {
// ... implémentation actuelle
};
const getParameter = async (code: string): Promise<any> => {
try {
const response = await $fetch(`/api/parameters/${code}`, {
key: `parameter_${code}`,
headers: {
Authorization: `Bearer ${token}`,
},
});
return response.value;
} catch (error) {
console.error(error);
return null;
}
};
return {
getMaxEquipments,
getParameter, // Nouvelle fonction générique
};
};
await pour attendre la valeur/api/parameters/max_equipments est accessibleresponse.value)useNuxtData fonctionne correctementrefreshNuxtData<template>
<div class="equipment-selection">
<h2>Sélectionnez vos équipements</h2>
<div v-if="loading" class="text-center">
<USpinner />
</div>
<div v-else>
<div
v-for="(equipment, index) in formData.equipments"
:key="index"
class="mb-4"
>
<EquipmentForm
:equipment="equipment"
@update="updateEquipmentItem(index, $event)"
/>
<UButton
v-if="formData.equipments.length > 1"
@click="removeEquipment(index)"
variant="ghost"
color="red"
>
Supprimer
</UButton>
</div>
<UButton
@click="addEquipment"
:disabled="!canAddMore"
variant="outline"
>
<UIcon name="i-heroicons-plus" class="w-4 h-4 mr-2" />
Ajouter un équipement
</UButton>
<p
v-if="formData.equipments.length >= maxEquipments"
class="mt-2 text-sm text-amber-600"
>
⚠️ Limite de {{ maxEquipments }} équipements atteinte
</p>
<p class="mt-2 text-sm text-gray-500">
{{ formData.equipments.length }} / {{ maxEquipments }} équipements
</p>
</div>
</div>
</template>
<script setup lang="ts">
const {
formData,
addEquipment,
removeEquipment,
updateEquipmentItem,
} = useForm();
const { getMaxEquipments } = useParameter();
const maxEquipments = ref(5);
const loading = ref(true);
onMounted(async () => {
try {
maxEquipments.value = await getMaxEquipments();
} catch (error) {
console.error('Erreur de chargement des paramètres:', error);
} finally {
loading.value = false;
}
});
const canAddMore = computed(() => {
return formData.value.equipments.length < maxEquipments.value;
});
</script>
useAuth()