Guard your methods calls with SweetAlert2 decorators!
:construction: Experimental project :construction:
Please restrict your usage to testing and feedback only.
SweetAlert2 Guards are a simple, opinionated solution to elegantly wrap your JavaScript methods execution in alerts, without having to mix UI and logic code.
It can be used in any framework or custom solution that uses classes and class methods (Angular, React, Vue, etc.) – because of a language limitation, decorators can't be used on simple functions yet.
Here's a simple example (the class is omitted):
import { guard, Confirm, ErrorStrategy } from '@sweetalert2/guards';
@Confirm(file => ({
title: `Delete ${file}?`,
text: `You won't be able to revert this!`,
[guard.errorStrategy]: ErrorStrategy.validationError,
[guard.onSuccess]: () => void swal('Deleted!', `${file} has been deleted`, 'success')
}))
public async deleteFile(file: string) {
const response = await fetch(`/api/files/${file}`, { method: 'delete' });
if (!response.ok) {
throw new Error(`An error occurred: ${response.statusText}`);
}
}
:white_check_mark: Now, every code that calls this method, may it be external code, Angular template, React JSX, etc. will transparently trigger a confirmation modal.
Resulting in:
@Alert()
decorator — the most basic decorator@Confirm()
decorator — comes with confirmation dialog presets@Loader()
decorator — show a loading dialog while your method is executing[guard.*]
options — control the guard's behaviourInstall @sweetalert2/guards and sweetalert2 via the npm registry:
npm install --save sweetalert2 @sweetalert2/guards@1.0.0-alpha
:point_right: Using Angular and liking declarative approaches? See also ngx-sweetalert2.
:point_right: Before posting an issue, please check that the problem isn't on SweetAlert's side.
@Alert()
GuardThis decorator is the simplest one. It will display an alert before your method executes, show a loading indicator when it's executing, and that's all.
@Alert()
's presets@Alert({
title: 'Downloading the Internet',
text: 'This operation will take a long time. Please be patient.',
type: 'warning'
})
public downloadTheInternet() {
// If the following service returns a Promise,
// the alert will show a loading indicator.
return this.myInternerService.download('http://*');
}
@Confirm()
GuardThis decorator will show a confirmation dialog with Confirm and Cancel buttons. The user may choose to execute the decorated method or not.
@Confirm()
's presets@Confirm({
title: 'Close account?',
text: 'This will definitely close you account and you won\'t be able to login anymore.',
type: 'warning'
})
public closeMyAccount() {
return this.userService.closeAccount();
}
@Loader()
GuardThis decorator will execute the decorated method as soon as it's called, showing a loading indicator while the method is executing.
@Loader()
's presets@Loader({
title: 'Please wait',
text: 'This may take a few seconds...'
})
public async syncDataFromApi() {
const datas = await this.api.getDatas();
this.apiCache.store(datas);
}
[guard.*]
options[guard.invokeStrategy]
[guard.errorStrategy]
[guard.onDismiss]
[guard.onError]
[guard.onSuccess]
@Decorator({})`
), pass a function (@Decorator((arg1, arg2) => {})
). Show more...See Q1.
[guard.onDismiss]
and return a value. Show more...See Q3.
[guard.onSuccess]
or [guard.onError]
and call swal()
. Show more...