Cum interceptezi/anulezi/blochezi o acțiune în Pinia?

Am următoarea problemă:

Vreau să interceptez un action din Pinia înainte să se întâmple și să pun utilizatorul să confirme respectiva acțiune. În funcție de răspuns, vreau să se întâmple … ceva.

Momentan am rezolvat folosind codul de mai jos DAR mi se pare un pic hacky să am throw acolo, pentru că nu e eroare per se, este un alt branch de execuție :confused:

Codul ăsta este în componenta principală (App.vue):

store.$onAction(({name, store, args}) => {
    if (!store.isDirty) {
        return;
    }

    if (name === 'setCurrentItem') {
        if (!confirm('Discard?')) {
            throw new Error('User aborted');
        }
    }
});

O altă abordare ar fi să pun logica asta în componenta care cheamă setCurrentItem, dar este folosit în mai multe componente, deci ar însemna să repet logică în cel puțin trei locuri (momentan).

Încă o alternativă ar fi să pun confirmarea asta direct în store, dar nu cred că are ce să caute un element de UI (confirm) în data layer. În plus, i18n nu funcționează în afara componentelor, deci varianta asta este exclusă.

Documentația de la Pinia zice Intercept actions and its results dar este cam tot ce se menționează, nu am reușit să găsesc niciun exemplu în care poți să alterezi/anulezi rezultatul unei acțiuni.

Sugestii?


În store am așa:

// store
const myStore = defineStore({
    state() {
        return {isDirty: false, currentItem: null }; 
    },

    actions: {
        setCurrentItem(item) {
            this.currentItem = item;
        },
    }
});

În componente îl apeleze așa:

const store = myStore();
const {setCurrentItem} = store;

<template>
  <button @click=setCurrentItem(1)>x</button>
</template>

wtf e o pinie si ce vrei sa faci cu ea?

n-ar fi ok sa pui utilizatorul sa-ti confirme inainte sa ajungi la actiunea respectiva?

Ai trecut de titlu? :confused:

Context: gândește-te că este un view în genul Windows Explorer (sau Finder sau ce o fi pe linux). În acest view, poți selecta în orice moment maximum un item sau poți adăuga un item nou.

La fel ca în Explorer, poți selecta un item în mai multe moduri și poți declanșa procesul de adăugare item din mai multe locuri. (Iar ăsta e motivul pentru care nu pot pune confirmarea înainte să ajung la acțiunea aia.)

Un item poate avea trei stări:

  • read only (view)
  • edit (dar neschimbat)
  • dirty (edit & schimbat)

Acum avem două abordări:

  • Dacă un item este în primele două stări, utilizatorul poate schimba fără probleme;
  • Dacă este schimbat iar utilizatorul vrea să selecteze alt item, ar trebui să fie întâmpinat de un popup.

“Cum interpretezi/anulezi/blochezi o actiune in Pinia?” ← asta?

recunosc ca mi-a scapat precizarea.

da nu-i hacky sa ai input de la utlizator acolo? mai ales intr-o metoda care pare ca se ocupa de toate store-urile, nu doar de ce-i specific acelui view (am inteles ca acu e doar ala, ma gandesc pe viitor. defect profesional).

din mai multe locuri dar printr-o singura metoda.

validarile astea cum/unde se fac?