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.
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.
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.
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.