/** * A COLLEAGUE WHOSE NAME THIS CALLER MAY NOT READ, SAID AS A REFUSAL RATHER THAN AS A JOB TITLE. * * MEASURED as Billing One at Great River, on a conversation a receptionist had started with her. The * thread was there and readable; the counterparty rendered as **"Staff member"** in the list row and * the thread header, **"Staff"** as the message author, and the composer read *"Message Staff..."*. * * Billing One may not read a `Practitioner` record, which is correct. What was wrong is what stood in * its place: **"Staff member" reads as a job title**, so nothing on the screen said anything had been * withheld, and the reader could not tell a colleague whose name is hidden from one who has no name * recorded. Those are different facts about their practice. * * AND THE NAME WAS ON THE SCREEN ANYWAY, inside the preview text, because the sender had typed it into * her own message. A boundary that holds everywhere except the one channel it does not police is not a * boundary; it is a habit of its correspondents. * * ONE DEFINITION BECAUSE THERE ARE FIVE SITES. The list row, the thread header, the message author, the * composer placeholder and the overview feed all answer the same question, and three agreeing while one * differs is how a reader learns to distrust all four. * * WHAT IT MUST NOT DO, and each of these is a way of getting it wrong: * - look like a name, which is the defect; * - name the person or their organization, which is the thing that is actually refused; * - appear for a colleague the caller MAY read, which would turn every name into a disclaimer. */ /** Where a name would go. Short enough for a list row, and not mistakable for one. */ export const WITHHELD_COLLEAGUE_NAME = 'Name withheld'; /** * Where the role would go, and it is the half that turns a blank into a reason. * * Same sentence family as the refused directory on this screen - *"Your role at does not * include reading staff records"* - deliberately, so a reader who meets both reads one product rather * than two. It names no practice here because the row has no room and the directory already said it. */ export const WITHHELD_COLLEAGUE_REASON = 'Your role does not include reading staff records'; /** The composer, which cannot use a first name because there is not one. */ export const WITHHELD_COLLEAGUE_COMPOSER = 'Message this colleague...'; /** * Is this the withheld form rather than somebody's name? * * A comparison against the constant rather than a flag threaded through four components: the name is * already passed to every one of these sites, and a second parallel prop is how three of them end up * agreeing and the fourth does not. */ export const isWithheldColleagueName = (name: string | undefined | null): boolean => name === WITHHELD_COLLEAGUE_NAME;