Source code for domonic.webapi.notifications
"""
domonic.webapi.notifications
====================================
https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API
"""
from __future__ import annotations
import time
from typing import Any
from domonic.events import Event, EventTarget
def _create_promise():
from domonic.javascript import Promise
return Promise()
[docs]
class Notification(EventTarget):
"""Browser-style notification object without platform side effects."""
permission = "default"
maxActions = 2
def __init__(self, title: str, options: dict[str, Any] | None = None) -> None:
super().__init__()
options = dict(options or {})
self.title = str(title)
self.dir = str(options.get("dir", "auto"))
self.lang = str(options.get("lang", ""))
self.body = str(options.get("body", ""))
self.tag = str(options.get("tag", ""))
self.icon = str(options.get("icon", ""))
self.badge = str(options.get("badge", ""))
self.image = str(options.get("image", ""))
self.data = options.get("data")
self.vibrate = options.get("vibrate")
self.timestamp = int(options.get("timestamp", time.time() * 1000))
self.renotify = bool(options.get("renotify", False))
self.requireInteraction = bool(options.get("requireInteraction", False))
self.silent = bool(options.get("silent", False))
self.actions = list(options.get("actions", []))[: self.maxActions]
self.onclick = None
self.onclose = None
self.onerror = None
self.onshow = None
self.closed = False
[docs]
@classmethod
def requestPermission(cls, callback=None, permission: str | None = None):
"""Resolve with the configured permission."""
if permission is None:
permission = "granted" if cls.permission == "default" else cls.permission
cls.setPermission(permission)
if callback is not None:
callback(cls.permission)
return _create_promise().resolve(cls.permission)
[docs]
@classmethod
def setPermission(cls, permission: str) -> str:
if permission not in {"default", "granted", "denied"}:
raise ValueError("Notification permission must be default, granted, or denied")
cls.permission = permission
return cls.permission
[docs]
def show(self) -> bool:
if self.permission == "denied":
self.dispatchEvent(Event("error"))
return False
self.closed = False
self.dispatchEvent(Event("show"))
return True
[docs]
def close(self) -> None:
if not self.closed:
self.closed = True
self.dispatchEvent(Event("close"))
return None
[docs]
def click(self) -> None:
self.dispatchEvent(Event("click"))
return None
[docs]
def toJSON(self) -> dict[str, Any]:
return {
"title": self.title,
"body": self.body,
"tag": self.tag,
"data": self.data,
"timestamp": self.timestamp,
"silent": self.silent,
"closed": self.closed,
}
__all__ = ["Notification"]