Skip to content

Notification/NotificationTrigger ​

Для показа уведомлений на лейаутах можно использовать компонент NotificationTrigger (покажет уведомление по клику, если это не отключено, или при изменении входящих данных если это включено). Также можно передать массив уведомлений в пропс динамический ключ на компоненте лейаута.

Использование ​

И в пропс data компонента-триггера, и в пропс динамический ключ notifications компонента-лейаута нужно передавать массив элементов следующего типа:

ts
type TNotification = {
  id: string; // Пользовательский идентефикатор
  token!: 'default' | 'timer', // С таймером или без, если не указано - 'default'
  text: string; // Основной текст уведомления
  button: string; // Текст кнопки действия под основным текстом
  seconds: number; // Время на которое будет запущен уведомление исчезнет (если это token: 'timer', а это поле не передано будет установлено 5 секунд по умолчанию)
  icon: string; // Иконка, не будет показана если token: 'timer'
  color: string; // Цвет иконки
  hidden: boolean; // Отключает контрол крестика, "закрыть" на уведомлении
};

WARNING

Внимание! Вы должны всегда использовать копоненты-триггеры внутри лейаута в основном слоте.

WARNING

Внимание! Если вы передадите seconds для уведомления без таймера - оно будет удалено через указанное количество секунд, как и уведомление с таймером.

WARNING

Внимание! Вы можете отключить показ уведомлений по клику на триггере с помощью логического пропса noclick и дублирующего строкового _noclick. А также, включить пропсы reflect или _reflect, для того чтобы пропс data стал "динамическим ключем" - компонент начал реагировать на изменения приходящих данных, пробрасывая новые уведомления на лейаут.

html
  <ds-layout id="layout">
    <div slot="main">
      <ds-notification-trigger noclick><span slot="main">Текст триггера уведомления не реагирующего на клик</span></ds-notification-trigger>

      <ds-notification-trigger _noclick="true"><span slot="main">Текст триггера уведомления не реагирующего на клик</span></ds-notification-trigger>

      <ds-notification-trigger reflect><span slot="main">Текст триггера, который покажет пришедшие уведомления при изменении пропса data</span></ds-notification-trigger>

      <ds-notification-trigger _reflect="true"><span slot="main">Текст триггера, который покажет пришедшие уведомления при изменении пропса data</span></ds-notification-trigger>
    </div>
  </ds-layout>

Сделано так для большей гибкости, и для того чтобы не диктовать пользователям способы использования жестко. Например, в случае когда вы, предположим, собираете ошибки с API-сервиса - вам будет удобно показывать их в одном "верхнем" месте - через пропс лейаута (который всегда работает как "динамический ключ" - обновились входящие данные - все уведомления из новой стопки будут показаны). Если же уведомления должны происходить в разных местах разметки и интерфейса - вероятно будет намного удобнее использовать компоненты-триггеры (в структуре компонент проекта). Они могут быть как кликабельными контролами, так и "скрытым узлом", но который может работать как динамический ключ.

Небезопасные стили ​

При необходимости (например, для того чтобы изменить тип отображения элемента-триггера - например - скрыть его визуально) вы можете передать правила стилевой разметки в хост компонента через атрибут styles. Внимание!!! Это небезопасно! По умолчанию хост элемента отображается как display: inline-flex;;

HTML ​

html
  <ds-layout id="layout">
    <div slot="main">
      <ds-notification-trigger id="trigger" data='[{ "token": "timer", "id": "11111111111111", "icon": "selected", "color": "matrix", "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit", "button": "Button text" }]'>
        <span slot="main">Текст триггера уведомления</span>
      </ds-notification-trigger>
    </div>
  </ds-layout>

  <script>
    // Пример как отследить клик на кнопке действия в уведомлении:
    const layout = document.getElementById('layout');
    layout.addEventListener('notify', (e) => {
      console.log('Событие клика по кнопке в уведомлении!, ', e.detail.id);
    });

    const notify1 = {
      token: 'timer',
      id: '1',
      text: 'Текст 1',
    };
    const notify2 = {
      token: 'timer',
      id: '2',
      text: 'Текст 2',
    };

    // Показать пачку уведомлений через пропс компонента-триггера
    // (если клик не отключен - данный код изменит набор уведомлений которые показываются по нему,
    // если включена "рефлексия" - то код сразу покажет эти уведомления):
    setTimeout(() => {
      const trigger = document.getElementById('trigger');
      if (trigger) trigger.setAttribute('data', JSON.stringify([notify1, notify2]));
    }, 2000);

    // Как показать пачку уведомлений через пропс лейаута:
    setTimeout(() => {
      const layout = document.getElementById('layout');
      if (layout) layout.setAttribute('notifications', JSON.stringify([notify1, notify2]));
    }, 2000);
  </script>

React ​

js
import { Layout, NotificationTrigger } from '@rir/ds-library';
import { useState, useCallback } from 'react';

const data = [
  {
    token: 'timer',
    id: '1',
    text: 'Текст 1',
  },
  {
    token: 'timer',
    id: '2',
    text: 'Текст 2',
  }
];

function Component() {
  const [data, setData] = useState('');

  return (
    <>
      <Layout>
        <div slot="main">
          <NotificationTrigger
            data={data}
          >
            <div slot="main">Текст триггера уведомления</div>
          </NotificationTrigger>
        </div>
      </Layout>
    </>
  );
}

export default Component;

API NotificationTrigger ​

Props ​

NameTypeDescriptionDefault
dataTNotification[]Идентефикатор модали для которой работает триггер.[]
noclickBooleanОтключить показ уведомлений по клику?false
_noclickundefined, String: ['true', 'false']Дублирующий литеральный атбрибутundefined
reflectBooleanВключить показ уведомлений при изменении входящих данных?false
_reflectundefined, String: ['true', 'false']Дублирующий литеральный атбрибутundefined
stylesString"Небезопастная" строка для передачи правил CSS в компонент''

Slots ​

NameDescription
mainОсновной контент триггера

Примеры проектов ​

React

Angular

Vue