Skip to content

useUserFeedback composable ​

The useUserFeedback composable provides a unified interface for displaying toast notifications and error messages to users. It integrates with Nuxt UI's toast system and supports internationalization for API errors.

Return Values ​

The composable returns an object with the following functions:

showToast(message, type, options)

Display a toast notification.

ParameterTypeRequiredDescription
messagestringYesThe message to display
typeFeedbackTypeNoType of feedback - "error", "success", "info", or "warning". Default is "error"
optionsPartial<Toast>NoAdditional toast options (title, duration, etc.)

showError(error)

Display an error message.

ParameterTypeRequiredDescription
errorError | ApiErrorYesAn Error object or ApiError object with error details

Types ​

typescript
type FeedbackType = "error" | "success" | "info" | "warning";

// see also https://github.com/DCC-BS/communication.bs.js
type ApiError = {
  $type: "ApiError";
  errorId: string;
  debugMessage?: string;
  status: number;
};

Requirements ​

This composable requires:

  • Nuxt UI module configured
  • Nuxt i18n module configured (for API error translations)
  • Translation keys in format api_error.{errorId} for API errors

Example Usage ​

vue
<script setup lang="ts">
const { showToast, showError } = useUserFeedback();


// Show a success toast
function onSaveSuccess() {
  showToast("Data saved successfully!", "success");
}

// Show an error toast with custom duration
function onValidationError() {
  showToast("Please fill in all required fields", "error", {
    duration: 5000
  });
}

// Show a warning toast
function onWarning() {
  showToast("This action cannot be undone", "warning");
}

// Show an info toast
function onInfo() {
  showToast("Your changes are being processed", "info");
}

// Custom toast options
function showCustomToast() {
  showToast("Operation completed", "success", {
    title: "Success",
    duration: 10000,
    actions: [{
      label: "Undo",
      click: () => console.log("Undo clicked")
    }]
  });
}
</script>

<template>
  <div>
    <button @click="onSaveSuccess">Save</button>
    <button @click="fetchData">Fetch Data</button>
  </div>
</template>

API Error Handling ​

When using showError with an API error that has the $type: "ApiError" property, the composable will automatically look up the translation key based on the errorId:

ts
import { apiFetch, isApiError } from "@DCC-BS/communication.bs.js";

const { showError } = useUserFeedback();

// Handle API errors
async function fetchData() {
    const response = await apiFetch<Data>("/api/data");
    
    if(isApiError(response)) {
      showError(response);
      return;
    }
    
    // Process the successful response
}

Make sure to define your API error translations in your i18n configuration:

json
{
  "api_error": {
    "not_found": "The requested resource was not found",
    "unauthorized": "You are not authorized to perform this action",
    "server_error": "An unexpected server error occurred"
  }
}

Developed with ❤️ by the DCC. Documentation released under the MIT License.