|
|
|
// Calendar
|
|
|
|
|
|
|
|
import { useEffect, useState } from 'preact/hooks'
|
|
|
|
|
|
|
|
export const WEEK_DAYS = [
|
|
|
|
'Domenica',
|
|
|
|
'Lunedì',
|
|
|
|
'Martedì',
|
|
|
|
'Mercoledì',
|
|
|
|
'Giovedì',
|
|
|
|
'Venerdì',
|
|
|
|
'Sabato',
|
|
|
|
]
|
|
|
|
|
|
|
|
// Hashing
|
|
|
|
|
|
|
|
export function hashString(str, seed = 0) {
|
|
|
|
let h1 = 0xdeadbeef ^ seed,
|
|
|
|
h2 = 0x41c6ce57 ^ seed
|
|
|
|
for (let i = 0, ch; i < str.length; i++) {
|
|
|
|
ch = str.charCodeAt(i)
|
|
|
|
h1 = Math.imul(h1 ^ ch, 2654435761)
|
|
|
|
h2 = Math.imul(h2 ^ ch, 1597334677)
|
|
|
|
}
|
|
|
|
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909)
|
|
|
|
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909)
|
|
|
|
return 4294967296 * (2097151 & h2) + (h1 >>> 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Courses
|
|
|
|
|
|
|
|
export function prettyCourseName(name) {
|
|
|
|
return name
|
|
|
|
.split(' ')
|
|
|
|
.map(word => word.toLowerCase())
|
|
|
|
.map(word => {
|
|
|
|
if (word.trim().length === 0) return word
|
|
|
|
|
|
|
|
return /(^del|^nel|^di$|^dei$|^con$|^alla$|^per$|^e$|^la$)/.test(word)
|
|
|
|
? word
|
|
|
|
: word[0].toUpperCase() + word.slice(1)
|
|
|
|
})
|
|
|
|
.join(' ')
|
|
|
|
.replaceAll('Ii', 'II')
|
|
|
|
.replaceAll('IIi', 'III')
|
|
|
|
.replaceAll('Iii', 'III')
|
|
|
|
.replaceAll(/'(.)/g, ({}, letter) => "'" + letter.toUpperCase())
|
|
|
|
}
|
|
|
|
|
|
|
|
export function prettyAulaName(name) {
|
|
|
|
return name
|
|
|
|
.replace('FIB', 'Fib')
|
|
|
|
.replace('RIUNIONI', 'Riunioni')
|
|
|
|
.replace(/([A-Z0-9])\-LAB/, 'Lab $1')
|
|
|
|
}
|
|
|
|
|
|
|
|
export function prettyProfName(nome, cognome) {
|
|
|
|
return (nome + ' ' + cognome)
|
|
|
|
.split(/\b/)
|
|
|
|
.map(word => _.capitalize(word))
|
|
|
|
.join('')
|
|
|
|
}
|
|
|
|
|
|
|
|
// JSX
|
|
|
|
|
|
|
|
export const withClasses = classes =>
|
|
|
|
Array.isArray(classes)
|
|
|
|
? classes.filter(e => !!e).join(' ')
|
|
|
|
: Object.entries(classes)
|
|
|
|
.filter(([, value]) => value)
|
|
|
|
.map(([key]) => key)
|
|
|
|
.join(' ')
|
|
|
|
|
|
|
|
// Hooks
|
|
|
|
|
|
|
|
export const usePersistentState = (key, initialValue) => {
|
|
|
|
const previousValue = localStorage.getItem(key)
|
|
|
|
|
|
|
|
const [value, setValue] = useState(
|
|
|
|
previousValue !== null ? JSON.parse(previousValue) : initialValue
|
|
|
|
)
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
localStorage.setItem(key, JSON.stringify(value))
|
|
|
|
}, [value])
|
|
|
|
|
|
|
|
return [value, setValue]
|
|
|
|
}
|