parent
8ecc9c2d53
commit
4560510069
|
@ -66,6 +66,10 @@
|
||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.spectrum-Toast--neutral {
|
||||||
|
background-color: var(--grey-2);
|
||||||
|
}
|
||||||
.spectrum-Button {
|
.spectrum-Button {
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,11 @@
|
||||||
<div class="spectrum-Toast-body" class:actionBody={!!action}>
|
<div class="spectrum-Toast-body" class:actionBody={!!action}>
|
||||||
<div class="wrap spectrum-Toast-content">{message || ""}</div>
|
<div class="wrap spectrum-Toast-content">{message || ""}</div>
|
||||||
{#if action}
|
{#if action}
|
||||||
<ActionButton quiet emphasized on:click={action}>
|
<ActionButton
|
||||||
|
quiet
|
||||||
|
emphasized
|
||||||
|
on:click={() => action(() => dispatch("dismiss"))}
|
||||||
|
>
|
||||||
<div style="color: white; font-weight: 600;">{actionMessage}</div>
|
<div style="color: white; font-weight: 600;">{actionMessage}</div>
|
||||||
</ActionButton>
|
</ActionButton>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
<Portal target=".modal-container">
|
<Portal target=".modal-container">
|
||||||
<div class="notifications">
|
<div class="notifications">
|
||||||
{#each $notifications as { type, icon, message, id, dismissable, action, wide } (id)}
|
{#each $notifications as { type, icon, message, id, dismissable, action, actionMessage, wide } (id)}
|
||||||
<div transition:fly={{ y: 30 }}>
|
<div transition:fly={{ y: 30 }}>
|
||||||
<Notification
|
<Notification
|
||||||
{type}
|
{type}
|
||||||
|
@ -16,6 +16,7 @@
|
||||||
{message}
|
{message}
|
||||||
{dismissable}
|
{dismissable}
|
||||||
{action}
|
{action}
|
||||||
|
{actionMessage}
|
||||||
{wide}
|
{wide}
|
||||||
on:dismiss={() => notifications.dismiss(id)}
|
on:dismiss={() => notifications.dismiss(id)}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { writable } from "svelte/store"
|
import { writable } from "svelte/store"
|
||||||
|
|
||||||
export const BANNER_TYPES = {
|
export const BANNER_TYPES = {
|
||||||
|
NEUTRAL: "neutral",
|
||||||
INFO: "info",
|
INFO: "info",
|
||||||
NEGATIVE: "negative",
|
NEGATIVE: "negative",
|
||||||
WARNING: "warning",
|
WARNING: "warning",
|
||||||
|
|
|
@ -27,7 +27,9 @@ export const createNotificationStore = () => {
|
||||||
icon = "",
|
icon = "",
|
||||||
autoDismiss = true,
|
autoDismiss = true,
|
||||||
action = null,
|
action = null,
|
||||||
|
actionMessage = null,
|
||||||
wide = false,
|
wide = false,
|
||||||
|
dismissTimeout = NOTIFICATION_TIMEOUT,
|
||||||
}
|
}
|
||||||
) => {
|
) => {
|
||||||
if (block) {
|
if (block) {
|
||||||
|
@ -44,14 +46,16 @@ export const createNotificationStore = () => {
|
||||||
icon,
|
icon,
|
||||||
dismissable: !autoDismiss,
|
dismissable: !autoDismiss,
|
||||||
action,
|
action,
|
||||||
|
actionMessage,
|
||||||
wide,
|
wide,
|
||||||
|
dismissTimeout,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
if (autoDismiss) {
|
if (autoDismiss) {
|
||||||
const timeoutId = setTimeout(() => {
|
const timeoutId = setTimeout(() => {
|
||||||
dismissNotification(_id)
|
dismissNotification(_id)
|
||||||
}, NOTIFICATION_TIMEOUT)
|
}, dismissTimeout)
|
||||||
timeoutIds.add(timeoutId)
|
timeoutIds.add(timeoutId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
import { admin, auth, licensing } from "stores/portal"
|
import { admin, auth, licensing } from "stores/portal"
|
||||||
import { onMount } from "svelte"
|
import { onMount } from "svelte"
|
||||||
import { CookieUtils, Constants } from "@budibase/frontend-core"
|
import { CookieUtils, Constants } from "@budibase/frontend-core"
|
||||||
|
import { banner, BANNER_TYPES } from "@budibase/bbui"
|
||||||
import { API } from "api"
|
import { API } from "api"
|
||||||
import Branding from "./Branding.svelte"
|
import Branding from "./Branding.svelte"
|
||||||
|
|
||||||
|
@ -16,6 +17,32 @@
|
||||||
$: user = $auth.user
|
$: user = $auth.user
|
||||||
|
|
||||||
$: useAccountPortal = cloud && !$admin.disableAccountPortal
|
$: useAccountPortal = cloud && !$admin.disableAccountPortal
|
||||||
|
let showVerificationPrompt = false
|
||||||
|
|
||||||
|
const checkVerification = user => {
|
||||||
|
if (!showVerificationPrompt && user?.account?.verified === false) {
|
||||||
|
showVerificationPrompt = true
|
||||||
|
banner.queue([
|
||||||
|
{
|
||||||
|
message: `Please verify your account. We've sent the verification link to ${user.email}`,
|
||||||
|
type: BANNER_TYPES.NEUTRAL,
|
||||||
|
showCloseButton: false,
|
||||||
|
extraButtonAction: () => {
|
||||||
|
fetch(`${$admin.accountPortalUrl}/api/auth/reset`, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ email: user.email }),
|
||||||
|
})
|
||||||
|
},
|
||||||
|
extraButtonText: "Resend email",
|
||||||
|
},
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$: checkVerification(user)
|
||||||
|
|
||||||
const validateTenantId = async () => {
|
const validateTenantId = async () => {
|
||||||
const host = window.location.host
|
const host = window.location.host
|
||||||
|
|
Loading…
Reference in New Issue