Toast refactoring

main
Antonio De Lucreziis 2 years ago
parent 70ab93de0a
commit f893f0e751

@ -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()

@ -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;

Loading…
Cancel
Save