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