Courses

Vue.js 3 + Laravel 11 API + Vite: SPA CRUD

SweetAlert for Notifications

Summary of this lesson:
- Installing and configuring SweetAlert2 package
- Implementing success notifications
- Setting up notification system in composables
- Managing global notification states

Now when we create a new post or edit a post, there are no notifications about successful action. In this lesson, we will add a notification using sweetalert2.

sweet alert message


To add sweetalert notifications, we will use a package avil13/vue-sweetalert2. First, let's install it.

npm install -S vue-sweetalert2

Next, we need to import styles and import/use the plugin in the main app.js file.

resources/css/app.css:

@import 'sweetalert2/dist/sweetalert2.min.css';
 
@tailwind base;
@tailwind components;
@tailwind utilities;

resources/js/app.js:

import './bootstrap';
 
import { createApp } from 'vue'
import App from './layouts/App.vue'
 
import router from './routes/index'
import VueSweetalert2 from 'vue-sweetalert2';
 
createApp(App)
.use(router)
.use(VueSweetalert2)
.mount('#app')

Now we need to call sweetalert in the posts Composable, after a successful HTTP request, with swal() method. Before doing that, we need to Vue.js inject() function.

resources/js/composables/posts.js:

import { ref } from 'vue'
import { ref, inject } from 'vue'
import { useRouter } from 'vue-router'
 
export default function usePosts() {
const posts = ref({})
const post = ref({})
const router = useRouter()
const validationErrors = ref({})
const isLoading = ref(false)
const swal = inject('$swal')
 
// ...
 
const storePost = async (post) => {
if (isLoading.value) return;
 
isLoading.value = true
validationErrors.value = {}
 
let serializedPost = new FormData()
for (let item in post) {
if (post.hasOwnProperty(item)) {
serializedPost.append(item, post[item])
}
}
 
axios.post('/api/posts', serializedPost)
.then(response => {
router.push({ name: 'posts.index' })
swal({
icon: 'success',
title: 'Post saved successfully'
})
})
.catch(error => {
if (error.response?.data) {
validationErrors.value = error.response.data.errors
isLoading.value = false
}
})
}
 
const updatePost = async (post) => {
if (isLoading.value) return;
 
isLoading.value = true
validationErrors.value = {}
 
axios.put('/api/posts/' + post.id, post)
.then(response => {
router.push({ name: 'posts.index' })
swal({
icon: 'success',
title: 'Post saved successfully'
})
})
.catch(error => {
if (error.response?.data) {
validationErrors.value = error.response.data.errors
}
})
.finally(() => isLoading.value = false)
}
 
return { posts, post, getPosts, getPost, storePost, updatePost, validationErrors, isLoading }
}

After creating or editing a post now you should see a success message.

sweet alert message

Previous: Post Edit Form: Route with Parameter
avatar

I'm encountering this issue "[plugin:vite:import-analysis] Failed to resolve entry for package "vue-sweetalert2". The package may have incorrect main/module/exports specified in its package.json.". I've followed all the instructions given above but with no luck, the stated issue occurs from time to time.

avatar

At first I didn't see the notification pop up and thought it wasn't working at all. Turns out that it is way at the bottom of the screen and not styled, so it doesn't look anything like the images in the lesson. After looking into the package I saw that they recommend adding import 'sweetalert2/dist/sweetalert2.min.css'; to app.js for Vue3. Works fine now.

avatar
You can use Markdown
avatar
You can use Markdown