#683 quick search on mobile (#749)

Co-authored-by: lethemanh <lethemanh@lethemanhs-MacBook-Pro.local>
This commit is contained in:
lethemanh
2026-04-08 18:02:08 +07:00
committed by GitHub
parent d5c72c9512
commit e29cd8dc42
31 changed files with 773 additions and 265 deletions
@@ -0,0 +1,58 @@
import { User } from '@/components/Attendees/types'
import { Calendar } from '@/features/Calendars/CalendarTypes'
import { defaultColors } from '@/utils/defaultColors'
export interface SearchState {
query?: string
options?: User[]
loading?: boolean
}
export function buildEmailToCalendarMap(
calRecord: Record<string, Calendar>
): Map<string, string[]> {
const map = new Map<string, string[]>()
for (const [id, cal] of Object.entries(calRecord)) {
cal.owner?.emails?.forEach(email => {
const existing = map.get(email)
if (existing) {
existing.push(id)
} else {
map.set(email, [id])
}
})
}
return map
}
function shiftLightness(hex: string, amount: number): string {
const r = parseInt(hex.slice(1, 3), 16)
const g = parseInt(hex.slice(3, 5), 16)
const b = parseInt(hex.slice(5, 7), 16)
const clamp = (v: number): number => Math.max(0, Math.min(255, v))
const toHex = (v: number): string =>
clamp(v + amount)
.toString(16)
.padStart(2, '0')
return `#${toHex(r)}${toHex(g)}${toHex(b)}`
}
export function generateDistinctColor(usedLights: string[]): {
light: string
dark: string
} {
for (const color of defaultColors) {
if (!usedLights.includes(color.light)) return color
}
const cycle = usedLights.length % defaultColors.length
const round = Math.floor(usedLights.length / defaultColors.length)
const base = defaultColors[cycle]
return {
light: shiftLightness(base.light, round * 12),
dark: shiftLightness(base.dark, -(round * 10))
}
}