mirror of
https://github.com/discourse/discourse.git
synced 2024-12-02 10:53:43 +08:00
8958b4f76a
Our custom implementation of `getOwner` includes a fallback which returns an owner, even if the passed object does not have one set. This is confusing and creates a false sense of security. Generally if the fallback is used, it means there is a problem with the patterns being used. This commit renames our custom implementation to `getOwnerWithFallback`, while maintaining the old `getOwner` export with a deprecation notice. Core code is updated to use the official `@ember/application` implementation, or the new `getOwnerWithFallback` function. This commit updates all core uses of `{ getOwner } from discourse-common/lib/get-owner` to use `getOwnerWithFallback`. Future commits will work through and convert many of these to use the official `@ember/application` implementation
114 lines
3.1 KiB
JavaScript
114 lines
3.1 KiB
JavaScript
import Service from "@ember/service";
|
|
import { tracked } from "@glimmer/tracking";
|
|
import { TrackedArray } from "@ember-compat/tracked-built-ins";
|
|
import { action } from "@ember/object";
|
|
import DDefaultToast from "float-kit/components/d-default-toast";
|
|
import DToastInstance from "float-kit/lib/d-toast-instance";
|
|
import { getOwner } from "@ember/application";
|
|
|
|
export default class Toasts extends Service {
|
|
@tracked activeToasts = new TrackedArray();
|
|
|
|
/**
|
|
* Render a toast
|
|
*
|
|
* @param {Object} [options] - options passed to the toast component as `@toast` argument
|
|
* @param {String} [options.duration] - The duration (ms) of the toast, will be closed after this time
|
|
* @param {ComponentClass} [options.component] - A component to render, will use `DDefaultToast` if not provided
|
|
* @param {String} [options.class] - A class added to the d-toast element
|
|
* @param {Object} [options.data] - An object which will be passed as the `@data` argument to the component
|
|
*
|
|
* @returns {DToastInstance} - a toast instance
|
|
*/
|
|
@action
|
|
show(options = {}) {
|
|
const instance = new DToastInstance(getOwner(this), options);
|
|
this.activeToasts.push(instance);
|
|
return instance;
|
|
}
|
|
|
|
/**
|
|
* Render a DDefaultToast toast with the default theme
|
|
*
|
|
* @param {Object} [options] - @see show
|
|
*
|
|
* @returns {DToastInstance} - a toast instance
|
|
*/
|
|
@action
|
|
default(options = {}) {
|
|
options.data.theme = "default";
|
|
|
|
return this.show({ ...options, component: DDefaultToast });
|
|
}
|
|
|
|
/**
|
|
* Render a DDefaultToast toast with the success theme
|
|
*
|
|
* @param {Object} [options] - @see show
|
|
*
|
|
* @returns {DToastInstance} - a toast instance
|
|
*/
|
|
@action
|
|
success(options = {}) {
|
|
options.data.theme = "success";
|
|
options.data.icon = "check";
|
|
|
|
return this.show({ ...options, component: DDefaultToast });
|
|
}
|
|
|
|
/**
|
|
* Render a DDefaultToast toast with the error theme
|
|
*
|
|
* @param {Object} [options] - @see show
|
|
*
|
|
* @returns {DToastInstance} - a toast instance
|
|
*/
|
|
@action
|
|
error(options = {}) {
|
|
options.data.theme = "error";
|
|
options.data.icon = "exclamation-triangle";
|
|
|
|
return this.show({ ...options, component: DDefaultToast });
|
|
}
|
|
|
|
/**
|
|
* Render a DDefaultToast toast with the warning theme
|
|
*
|
|
* @param {Object} [options] - @see show
|
|
*
|
|
* @returns {DToastInstance} - a toast instance
|
|
*/
|
|
@action
|
|
warning(options = {}) {
|
|
options.data.theme = "warning";
|
|
options.data.icon = "exclamation-circle";
|
|
|
|
return this.show({ ...options, component: DDefaultToast });
|
|
}
|
|
|
|
/**
|
|
* Render a DDefaultToast toast with the info theme
|
|
*
|
|
* @param {Object} [options] - @see show
|
|
*
|
|
* @returns {DToastInstance} - a toast instance
|
|
*/
|
|
@action
|
|
info(options = {}) {
|
|
options.data.theme = "info";
|
|
options.data.icon = "info-circle";
|
|
|
|
return this.show({ ...options, component: DDefaultToast });
|
|
}
|
|
|
|
/**
|
|
* Close a toast. Any object containg a valid `id` property can be used as a toast parameter.
|
|
*/
|
|
@action
|
|
close(toast) {
|
|
this.activeToasts = new TrackedArray(
|
|
this.activeToasts.filter((activeToast) => activeToast.id !== toast.id)
|
|
);
|
|
}
|
|
}
|