Bluesky app fork with some witchin' additions 馃挮 witchsky.app
bluesky fork client
119
fork

Configure Feed

Select the types of activity you want to include in your feed.

at a876aae44ea07494ebea9727350aa060b81f317b 100 lines 2.8 kB view raw
1import { 2 type AppBskyLabelerDefs, 3 type ComAtprotoLabelDefs, 4 type InterpretedLabelValueDefinition, 5 interpretLabelValueDefinition, 6 LABELS, 7} from '@atproto/api' 8import {useLingui} from '@lingui/react' 9import * as bcp47Match from 'bcp-47-match' 10 11import { 12 type GlobalLabelStrings, 13 useGlobalLabelStrings, 14} from '#/lib/moderation/useGlobalLabelStrings' 15import {useLabelDefinitions} from '#/state/preferences' 16 17export interface LabelInfo { 18 label: ComAtprotoLabelDefs.Label 19 def: InterpretedLabelValueDefinition 20 strings: ComAtprotoLabelDefs.LabelValueDefinitionStrings 21 labeler: AppBskyLabelerDefs.LabelerViewDetailed | undefined 22} 23 24export function useLabelInfo(label: ComAtprotoLabelDefs.Label): LabelInfo { 25 const {i18n} = useLingui() 26 const {labelDefs, labelers} = useLabelDefinitions() 27 const globalLabelStrings = useGlobalLabelStrings() 28 const def = getDefinition(labelDefs, label) 29 return { 30 label, 31 def, 32 strings: getLabelStrings(i18n.locale, globalLabelStrings, def), 33 labeler: labelers.find(labeler => label.src === labeler.creator.did), 34 } 35} 36 37export function getDefinition( 38 labelDefs: Record<string, InterpretedLabelValueDefinition[]>, 39 label: ComAtprotoLabelDefs.Label, 40): InterpretedLabelValueDefinition { 41 // check local definitions 42 const customDef = 43 !label.val.startsWith('!') && 44 labelDefs[label.src]?.find( 45 def => def.identifier === label.val && def.definedBy === label.src, 46 ) 47 if (customDef) { 48 return customDef 49 } 50 51 // check global definitions 52 const globalDef = LABELS[label.val as keyof typeof LABELS] 53 if (globalDef) { 54 return globalDef 55 } 56 57 // fallback to a noop definition 58 return interpretLabelValueDefinition( 59 { 60 identifier: label.val, 61 severity: 'none', 62 blurs: 'none', 63 defaultSetting: 'ignore', 64 locales: [], 65 }, 66 label.src, 67 ) 68} 69 70export function getLabelStrings( 71 locale: string, 72 globalLabelStrings: GlobalLabelStrings, 73 def: InterpretedLabelValueDefinition, 74): ComAtprotoLabelDefs.LabelValueDefinitionStrings { 75 if (!def.definedBy) { 76 // global definition, look up strings 77 if (def.identifier in globalLabelStrings) { 78 return globalLabelStrings[ 79 def.identifier 80 ] as ComAtprotoLabelDefs.LabelValueDefinitionStrings 81 } 82 } else { 83 // try to find locale match in the definition's strings 84 const localeMatch = def.locales.find( 85 strings => bcp47Match.basicFilter(locale, strings.lang).length > 0, 86 ) 87 if (localeMatch) { 88 return localeMatch 89 } 90 // fall back to the zero item if no match 91 if (def.locales[0]) { 92 return def.locales[0] 93 } 94 } 95 return { 96 lang: locale, 97 name: def.identifier, 98 description: `Labeled "${def.identifier}"`, 99 } 100}