import { Fragment, useState } from "react"; import { pb } from "../lib/pocketbase"; import { ROLES } from "../lib/roles"; import { getOtherJsonData } from "../lib/otherJsonData"; export default function RolePreferences({ record, onUpdate }) { const [editing, setEditing] = useState(false); const [selected, setSelected] = useState([]); const [favourite, setFavourite] = useState(null); const [saving, setSaving] = useState(false); const [status, setStatus] = useState({ text: "", error: false }); const savedPrefs = record?.RolePreferencesSelect ?? []; const savedFavourite = getOtherJsonData(record).FavouriteRole ?? null; function startEdit() { setSelected(savedPrefs); setFavourite(savedFavourite); setEditing(true); setStatus({ text: "", error: false }); } function cancelEdit() { setEditing(false); } function toggleRole(value) { setSelected((prev) => prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value], ); } function toggleFavourite(value) { setFavourite((prev) => (prev === value ? null : value)); } async function save() { setSaving(true); try { const fav = favourite && selected.includes(favourite) ? favourite : null; const other = getOtherJsonData(record); if (fav) other.FavouriteRole = fav; else delete other.FavouriteRole; const updated = await pb.collection("members").update(record.id, { RolePreferencesSelect: selected, OtherJsonData: other, }); onUpdate(updated); setEditing(false); setStatus({ text: "", error: false }); } catch (err) { const msg = err?.response ? JSON.stringify(err.response) : (err?.message ?? String(err)); setStatus({ text: `Save failed: ${msg}`, error: true }); } finally { setSaving(false); } } const displayPrefs = editing ? selected : savedPrefs; const displayFavourite = editing ? favourite : savedFavourite; let lastBranch = null; return (
Role Preferences{" "} {!editing && ( )} {editing && ( <> {" "} )}
{ROLES.map((role) => { const branchHeader = role.branch !== lastBranch; lastBranch = role.branch; return ( {branchHeader && ( )} ); })}
Role
{role.branch ?? ""}
{role.link ? ( {role.text} ) : ( role.text )} {editing ? ( toggleRole(role.value)} /> ) : displayPrefs.includes(role.value) ? ( "✅" ) : ( "❌" )} {editing ? ( {}} onClick={() => toggleFavourite(role.value)} /> ) : displayFavourite === role.value ? ( "⭐" ) : ( "" )}

{status.text}

); }