Toast refactoring
This commit is contained in:
@@ -6,6 +6,15 @@ let globalToastId = 0
|
|||||||
|
|
||||||
const ToastContext = createContext([])
|
const ToastContext = createContext([])
|
||||||
|
|
||||||
|
export const ToastMessage = ({ icon, children }) => {
|
||||||
|
return (
|
||||||
|
<div class="row">
|
||||||
|
{icon && <Icon name={icon} />}
|
||||||
|
<p>{children}</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export const ToastProvider = ({ children }) => {
|
export const ToastProvider = ({ children }) => {
|
||||||
const [toasts, setToasts] = useState([])
|
const [toasts, setToasts] = useState([])
|
||||||
|
|
||||||
@@ -18,7 +27,7 @@ export const ToastProvider = ({ children }) => {
|
|||||||
{children}
|
{children}
|
||||||
<div class="toasts">
|
<div class="toasts">
|
||||||
{toasts.map(({ uid, removed, message }) => (
|
{toasts.map(({ uid, removed, message }) => (
|
||||||
<div key={uid} class={removed ? 'toast removed' : 'toast'}>
|
<div class={'toast' + (removed ? ' removed' : '')}>
|
||||||
<p>{message}</p>
|
<p>{message}</p>
|
||||||
<div class="toast-close" onClick={() => removeToast(uid)}>
|
<div class="toast-close" onClick={() => removeToast(uid)}>
|
||||||
<Icon name="close" />
|
<Icon name="close" />
|
||||||
@@ -43,7 +52,7 @@ export const useToasts = () => {
|
|||||||
}, duration)
|
}, duration)
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
setToasts(toasts => toasts.filter(t => !t.removed))
|
setToasts(toasts => toasts.filter(t => t !== toast))
|
||||||
}, duration + 1000)
|
}, duration + 1000)
|
||||||
|
|
||||||
setToasts(ts => [...ts.slice(-5), toast])
|
setToasts(ts => [...ts.slice(-5), toast])
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
import { useEffect, useState } from 'preact/hooks'
|
import { useEffect, useState } from 'preact/hooks'
|
||||||
|
import { ToastMessage, useToasts } from '../components/Toasts.jsx'
|
||||||
|
|
||||||
export const AdminPanel = () => {
|
export const AdminPanel = () => {
|
||||||
|
const [showToast] = useToasts()
|
||||||
|
|
||||||
const [text, setText] = useState('')
|
const [text, setText] = useState('')
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -19,10 +22,12 @@ export const AdminPanel = () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
alert('An error occurred while updating the state!')
|
showToast(`Errore "${await res.text()}"`)
|
||||||
}
|
}
|
||||||
|
|
||||||
setText(formatted)
|
setText(formatted)
|
||||||
|
|
||||||
|
showToast(<ToastMessage icon="info">Dashboard aggiornata</ToastMessage>)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useEffect, useRef, useState } from 'preact/hooks'
|
import { useEffect, useRef, useState } from 'preact/hooks'
|
||||||
import { Icon } from '../components/Icon.jsx'
|
import { Icon } from '../components/Icon.jsx'
|
||||||
import { useToasts } from '../components/Toasts.jsx'
|
import { ToastMessage, useToasts } from '../components/Toasts.jsx'
|
||||||
import { useStore } from '../context.jsx'
|
import { useStore } from '../context.jsx'
|
||||||
import { useRemoteState } from '../util.jsx'
|
import { useRemoteState } from '../util.jsx'
|
||||||
|
|
||||||
@@ -38,9 +38,10 @@ export const Bucket = () => {
|
|||||||
const { id } = await res.json()
|
const { id } = await res.json()
|
||||||
|
|
||||||
showToast(
|
showToast(
|
||||||
<>
|
<ToastMessage icon="info">
|
||||||
File caricato con id <code>{id}</code>
|
File caricato con ID: <code>{id}</code>
|
||||||
</>
|
</ToastMessage>,
|
||||||
|
{ duration: 10e3 }
|
||||||
)
|
)
|
||||||
|
|
||||||
await updateBucketObjects()
|
await updateBucketObjects()
|
||||||
|
|||||||
+40
-1
@@ -1,5 +1,5 @@
|
|||||||
import { toChildArray } from 'preact'
|
import { toChildArray } from 'preact'
|
||||||
import { useCallback, useEffect, useState } from 'preact/hooks'
|
import { useCallback, useEffect, useRef, useState } from 'preact/hooks'
|
||||||
|
|
||||||
export function hashCode(s) {
|
export function hashCode(s) {
|
||||||
s = s.toString() + "seed iniziale dell'hash"
|
s = s.toString() + "seed iniziale dell'hash"
|
||||||
@@ -82,6 +82,45 @@ export function useRemoteState(url, initialValue = null) {
|
|||||||
return [value, error, refresh]
|
return [value, error, refresh]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Toggle CSS Class
|
||||||
|
|
||||||
|
// export function useClasses(classes) {
|
||||||
|
// const elementRef = useRef(null)
|
||||||
|
|
||||||
|
// if (Array.isArray(classes)) {
|
||||||
|
// classes = Object.fromEntries(classes.filter(Boolean).map(className => [className, true]))
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const updateClasses = () => {
|
||||||
|
// if (elementRef.current) {
|
||||||
|
// const $el = elementRef.current
|
||||||
|
|
||||||
|
// console.log($el.classList)
|
||||||
|
// console.log('Applying classes:', classes)
|
||||||
|
|
||||||
|
// for (const [className, present] of Object.entries(classes)) {
|
||||||
|
// if (present) {
|
||||||
|
// if (!$el.classList.contains(className)) {
|
||||||
|
// console.log('Adding class:', className, present)
|
||||||
|
// $el.classList.add(className)
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// if ($el.classList.contains(className)) {
|
||||||
|
// console.log('Removing class:', className, present)
|
||||||
|
// $el.classList.remove(className)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// useEffect(() => {
|
||||||
|
// updateClasses()
|
||||||
|
// })
|
||||||
|
|
||||||
|
// return [elementRef]
|
||||||
|
// }
|
||||||
|
|
||||||
//
|
//
|
||||||
// Change Case Utility
|
// Change Case Utility
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ main {
|
|||||||
background: #38383d;
|
background: #38383d;
|
||||||
color: var(--fg-dark-500);
|
color: var(--fg-dark-500);
|
||||||
|
|
||||||
padding: 0.5rem 0.5rem 0.5rem 1rem;
|
padding: 0.5rem;
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
|
|
||||||
opacity: 0.95;
|
opacity: 0.95;
|
||||||
@@ -309,7 +309,7 @@ main {
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
||||||
gap: 0.5rem;
|
gap: 1rem;
|
||||||
|
|
||||||
.toast-close {
|
.toast-close {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
Reference in New Issue
Block a user