Feature: per-viewer colors for shared calendars (#345)
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
import type { Calendar } from '@/lib/jmap/types';
|
||||
|
||||
/**
|
||||
* Palette of calendar colors offered in the color picker. Defined here (rather
|
||||
* than in the settings UI component) so non-React modules can reuse it without
|
||||
* pulling in component code. The settings color picker re-exports this.
|
||||
*/
|
||||
export const CALENDAR_COLORS = [
|
||||
"#3b82f6", // blue
|
||||
"#ef4444", // red
|
||||
"#22c55e", // green
|
||||
"#f59e0b", // amber
|
||||
"#8b5cf6", // violet
|
||||
"#ec4899", // pink
|
||||
"#14b8a6", // teal
|
||||
"#f97316", // orange
|
||||
"#06b6d4", // cyan
|
||||
"#84cc16", // lime
|
||||
"#6366f1", // indigo
|
||||
"#a855f7", // purple
|
||||
"#e11d48", // rose
|
||||
"#0ea5e9", // sky
|
||||
"#10b981", // emerald
|
||||
"#d946ef", // fuchsia
|
||||
];
|
||||
|
||||
/**
|
||||
* Stable key for a shared calendar's local color override. Independent of the
|
||||
* Pro-shell id prefix (which changes with the active account), so the override
|
||||
* survives shell-mode and account switches. Built from the owning JMAP account
|
||||
* + the calendar's original server id.
|
||||
*/
|
||||
export function sharedCalendarColorKey(
|
||||
cal: Pick<Calendar, 'id' | 'originalId' | 'accountId' | 'localAccountId'>,
|
||||
): string {
|
||||
const localAccount = cal.localAccountId ?? '';
|
||||
const account = cal.accountId ?? '';
|
||||
const id = cal.originalId ?? cal.id;
|
||||
return `${localAccount}|${account}|${id}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pick a random palette color not present in `usedColors`. Once every palette
|
||||
* entry is taken, fall back to a random palette color (collisions are
|
||||
* unavoidable past CALENDAR_COLORS.length calendars).
|
||||
*/
|
||||
export function pickUnusedCalendarColor(usedColors: Iterable<string>): string {
|
||||
const used = new Set<string>();
|
||||
for (const c of usedColors) {
|
||||
if (c) used.add(c.toLowerCase());
|
||||
}
|
||||
const available = CALENDAR_COLORS.filter((c) => !used.has(c.toLowerCase()));
|
||||
const pool = available.length > 0 ? available : CALENDAR_COLORS;
|
||||
return pool[Math.floor(Math.random() * pool.length)];
|
||||
}
|
||||
Reference in New Issue
Block a user