blob: e01bb345e631b67776c39e4572a1384dbaf293e3 [file] [log] [blame]
/**
* @license
* Copyright 2022 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {LitElement, html, css, nothing} from 'lit';
import {customElement, state} from 'lit/decorators.js';
import {resolve} from '../../../models/dependency';
import {serviceWorkerInstallerToken} from '../../../services/service-worker-installer';
import {subscribe} from '../../lit/subscription-controller';
import {fontStyles} from '../../../styles/gr-font-styles';
import {navigationToken} from '../gr-navigation/gr-navigation';
import {createSettingsUrl} from '../../../models/views/settings';
import '../../shared/gr-button/gr-button';
import '../../shared/gr-icon/gr-icon';
declare global {
interface HTMLElementTagNameMap {
'gr-notifications-prompt': GrNotificationsPrompt;
}
}
@customElement('gr-notifications-prompt')
export class GrNotificationsPrompt extends LitElement {
@state() private hideNotificationsPrompt = false;
@state() private shouldShowPrompt = false;
private readonly serviceWorkerInstaller = resolve(
this,
serviceWorkerInstallerToken
);
private readonly getNavigation = resolve(this, navigationToken);
constructor() {
super();
subscribe(
this,
() => this.serviceWorkerInstaller().shouldShowPrompt$,
shouldShowPrompt => {
this.shouldShowPrompt = !!shouldShowPrompt;
}
);
}
static override get styles() {
return [
fontStyles,
css`
#notificationsPrompt {
position: absolute;
right: 30px;
top: 100px;
z-index: 150; /* Less than gr-hovercard's, higher than rest */
display: flex;
background-color: var(--background-color-primary);
padding: var(--spacing-l);
border: 1px solid var(--border-color);
border-radius: var(--border-radius);
box-shadow: var(--elevation-level-5);
}
h3 {
margin: 0;
padding: 0;
}
.icon {
flex: 0 0 30px;
}
.content {
width: 300px;
}
div.section {
margin: 0 var(--spacing-xl) var(--spacing-m) var(--spacing-xl);
display: flex;
align-items: center;
}
div.sectionIcon {
flex: 0 0 30px;
}
.message {
margin: var(--spacing-m) 0;
}
div.sectionIcon gr-icon {
position: relative;
}
b {
font-weight: var(--font-weight-bold);
}
`,
];
}
override render() {
if (this.hideNotificationsPrompt) return nothing;
if (!this.shouldShowPrompt) return nothing;
return html`<div id="notificationsPrompt" role="dialog">
<div class="icon">
<gr-icon icon="info"></gr-icon>
</div>
<div class="content">
<h3 class="heading-3">Missing your turn notifications?</h3>
<div class="message">
Get notified whenever it's your turn on a change. Gerrit needs
permission to send notifications. To turn on notifications, click
<b>Continue</b> and then <b>Allow</b> when prompted by your browser.
</div>
<div class="buttons">
<gr-button
primary=""
@click=${() => {
this.hideNotificationsPrompt = true;
this.serviceWorkerInstaller().requestPermission();
}}
>Continue</gr-button
>
<gr-button
@click=${() => {
this.hideNotificationsPrompt = true;
this.getNavigation().setUrl(createSettingsUrl());
}}
>Disable in settings</gr-button
>
</div>
</div>
<div class="icon">
<gr-button
@click=${() => {
this.hideNotificationsPrompt = true;
}}
link
>
<gr-icon icon="close"></gr-icon>
</gr-button>
</div>
</div>`;
}
}