{"version":3,"sources":["../src/components/Avatar/useAvatar.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { mergeCallbacks, useId, slot } from '@fluentui/react-utilities';\nimport { getInitials } from '../../utils/index';\nimport type { AvatarBaseProps, AvatarBaseState, AvatarNamedColor, AvatarProps, AvatarState } from './Avatar.types';\nimport { PersonRegular } from '@fluentui/react-icons';\nimport { PresenceBadge } from '@fluentui/react-badge';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { useAvatarContext } from '../../contexts/AvatarContext';\n\nexport const DEFAULT_STRINGS = {\n  active: 'active',\n  inactive: 'inactive',\n};\n\nexport const useAvatar_unstable = (props: AvatarProps, ref: React.Ref<HTMLElement>): AvatarState => {\n  const { dir } = useFluent();\n  const { shape: contextShape, size: contextSize } = useAvatarContext();\n  const {\n    size = contextSize ?? (32 as const),\n    shape = contextShape ?? 'circular',\n    activeAppearance = 'ring',\n    idForColor,\n    color: propColor = 'neutral',\n    ...rest\n  } = props;\n\n  const state = useAvatarBase_unstable(rest, ref);\n\n  // Resolve 'colorful' to a specific color name\n  const color: AvatarState['color'] =\n    propColor === 'colorful'\n      ? avatarColors[getHashCode(idForColor ?? props.name ?? '') % avatarColors.length]\n      : propColor;\n\n  if (state.initials) {\n    // eslint-disable-next-line react-hooks/immutability\n    state.initials = slot.optional(props.initials, {\n      renderByDefault: true,\n      defaultProps: {\n        children: getInitials(props.name, dir === 'rtl', { firstInitialOnly: size <= 16 }),\n        id: state.initials?.id,\n      },\n      elementType: 'span',\n    });\n  }\n\n  if (state.icon && !state.icon.hasOwnProperty('children')) {\n    // eslint-disable-next-line react-hooks/immutability\n    state.icon.children = <PersonRegular />;\n  }\n\n  const badge: AvatarState['badge'] = slot.optional(props.badge, {\n    defaultProps: { ...state.badge, size: getBadgeSize(size) },\n    elementType: PresenceBadge,\n  });\n\n  return {\n    ...state,\n    size,\n    shape,\n    activeAppearance,\n    color,\n    badge,\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    components: { ...state.components, badge: PresenceBadge },\n  };\n};\n\n/**\n * Base hook for Avatar component, manages state and structure common to all variants of Avatar\n */\nexport const useAvatarBase_unstable = (props: AvatarBaseProps, ref?: React.Ref<HTMLElement>): AvatarBaseState => {\n  const { dir } = useFluent();\n  const { name, image: imageProp, initials: initialsProp, badge, active = 'unset', ...rest } = props;\n\n  const baseId = useId('avatar-');\n\n  const root: AvatarBaseState['root'] = slot.always(\n    {\n      role: 'img',\n      id: baseId,\n      ref,\n      ...rest,\n    },\n    { elementType: 'span' },\n  );\n\n  const [imageHidden, setImageHidden] = React.useState<true | undefined>(undefined);\n\n  let image: AvatarBaseState['image'] = slot.optional(imageProp, {\n    defaultProps: { alt: '', role: 'presentation', 'aria-hidden': true, hidden: imageHidden },\n    elementType: 'img',\n  });\n\n  // Image shouldn't be rendered if its src is not set\n  if (!image?.src) {\n    image = undefined;\n  }\n\n  // Hide the image if it fails to load and restore it on a successful load\n  if (image) {\n    image.onError = mergeCallbacks(image.onError, () => setImageHidden(true));\n    image.onLoad = mergeCallbacks(image.onLoad, () => setImageHidden(undefined));\n  }\n\n  // Resolve the initials slot, defaulted to getInitials\n  let initials: AvatarBaseState['initials'] = slot.optional(initialsProp, {\n    renderByDefault: true,\n    defaultProps: {\n      children: getInitials(name, dir === 'rtl'),\n      id: baseId + '__initials',\n    },\n    elementType: 'span',\n  });\n\n  // Don't render the initials slot if it's empty\n  if (!initials?.children) {\n    initials = undefined;\n  }\n\n  // Render the icon slot *only if* there aren't any initials or image to display\n  let icon: AvatarBaseState['icon'] = undefined;\n  if (!initials && (!image || imageHidden)) {\n    icon = slot.optional(props.icon, {\n      renderByDefault: true,\n      defaultProps: {\n        'aria-hidden': true,\n      },\n      elementType: 'span',\n    });\n  }\n\n  const badgeSlot: AvatarBaseState['badge'] = slot.optional(badge, {\n    defaultProps: { id: root.id + '__badge' },\n    elementType: 'div',\n  });\n\n  let activeAriaLabelElement: AvatarBaseState['activeAriaLabelElement'];\n\n  // Resolve aria-label and/or aria-labelledby, including the badge, if not provided by the user\n  const userProvidedAriaLabel = props['aria-label'] !== undefined;\n  const userProvidedAriaLabelledby = props['aria-labelledby'] !== undefined;\n  if (!userProvidedAriaLabel && !userProvidedAriaLabelledby) {\n    if (name) {\n      root['aria-label'] = name;\n      if (badgeSlot) {\n        root['aria-labelledby'] = root.id + ' ' + badgeSlot.id;\n      }\n    } else if (initials) {\n      // root's aria-label should be the name, but fall back to being labelledby the initials if name is missing\n      root['aria-labelledby'] = initials.id + (badgeSlot ? ' ' + badgeSlot.id : '');\n    }\n\n    if (active === 'active' || active === 'inactive') {\n      const activeText = DEFAULT_STRINGS[active];\n      if (root['aria-labelledby']) {\n        const activeId = root.id + '__active';\n        root['aria-labelledby'] += ' ' + activeId;\n        activeAriaLabelElement = (\n          <span hidden id={activeId}>\n            {activeText}\n          </span>\n        );\n      } else if (root['aria-label']) {\n        root['aria-label'] += ' ' + activeText;\n      }\n    }\n  }\n\n  return {\n    active,\n    activeAriaLabelElement,\n    components: { root: 'span', initials: 'span', icon: 'span', image: 'img', badge: 'div' },\n    root,\n    initials,\n    icon,\n    image,\n    badge: badgeSlot,\n  };\n};\n\nconst getBadgeSize = (size: AvatarState['size']) => {\n  if (size >= 96) {\n    return 'extra-large';\n  } else if (size >= 64) {\n    return 'large';\n  } else if (size >= 56) {\n    return 'medium';\n  } else if (size >= 40) {\n    return 'small';\n  } else if (size >= 28) {\n    return 'extra-small';\n  } else {\n    return 'tiny';\n  }\n};\n\nconst avatarColors: AvatarNamedColor[] = [\n  'dark-red',\n  'cranberry',\n  'red',\n  'pumpkin',\n  'peach',\n  'marigold',\n  'gold',\n  'brass',\n  'brown',\n  'forest',\n  'seafoam',\n  'dark-green',\n  'light-teal',\n  'teal',\n  'steel',\n  'blue',\n  'royal-blue',\n  'cornflower',\n  'navy',\n  'lavender',\n  'purple',\n  'grape',\n  'lilac',\n  'pink',\n  'magenta',\n  'plum',\n  'beige',\n  'mink',\n  'platinum',\n  'anchor',\n];\n\nconst getHashCode = (str: string): number => {\n  let hashCode = 0;\n  for (let len: number = str.length - 1; len >= 0; len--) {\n    const ch = str.charCodeAt(len);\n    const shift = len % 8;\n    hashCode ^= (ch << shift) + (ch >> (8 - shift)); // eslint-disable-line no-bitwise\n  }\n\n  return hashCode;\n};\n"],"names":["React","mergeCallbacks","useId","slot","getInitials","PersonRegular","PresenceBadge","useFluent_unstable","useFluent","useAvatarContext","DEFAULT_STRINGS","active","inactive","useAvatar_unstable","props","ref","dir","shape","contextShape","size","contextSize","activeAppearance","idForColor","color","propColor","rest","state","useAvatarBase_unstable","avatarColors","getHashCode","name","length","initials","optional","renderByDefault","defaultProps","children","firstInitialOnly","id","elementType","icon","hasOwnProperty","badge","getBadgeSize","components","image","imageProp","initialsProp","baseId","root","always","role","imageHidden","setImageHidden","useState","undefined","alt","hidden","src","onError","onLoad","badgeSlot","activeAriaLabelElement","userProvidedAriaLabel","userProvidedAriaLabelledby","activeText","activeId","span","str","hashCode","len","ch","charCodeAt","shift"],"mappings":"AAAA;;;;;;;;;;;;IAWaU,eAAAA;;;0BA8DAiB;eAAAA;;IAzDAd,kBAAAA;;;;;iEAdU,QAAQ;gCACa,4BAA4B;uBAC5C,uBAAoB;4BAElB,wBAAwB;4BACxB,wBAAwB;qCACN,kCAAkC;+BACjD,kCAA+B;AAEzD,wBAAwB;IAC7BF,QAAQ;IACRC,UAAU;AACZ,EAAE;AAEK,2BAA2B,CAACE,OAAoBC;IACrD,MAAM,EAAEC,GAAG,EAAE,OAAGR,uCAAAA;IAChB,MAAM,EAAES,OAAOC,YAAY,EAAEC,MAAMC,WAAW,EAAE,OAAGX,+BAAAA;IACnD,MAAM,EACJU,OAAOC,gBAAAA,QAAAA,gBAAAA,KAAAA,IAAAA,cAAgB,EAAY,EACnCH,QAAQC,iBAAAA,QAAAA,iBAAAA,KAAAA,IAAAA,eAAgB,UAAU,EAClCG,mBAAmB,MAAM,EACzBC,UAAU,EACVC,OAAOC,YAAY,SAAS,EAC5B,GAAGC,MACJ,GAAGX;IAEJ,MAAMY,QAAQC,uBAAuBF,MAAMV;QAKZO;IAH/B,8CAA8C;IAC9C,MAAMC,QACJC,cAAc,aACVI,YAAY,CAACC,YAAYP,CAAAA,OAAAA,eAAAA,QAAAA,eAAAA,KAAAA,IAAAA,aAAcR,MAAMgB,IAAAA,AAAI,MAAA,QAAxBR,SAAAA,KAAAA,IAAAA,OAA4B,MAAMM,aAAaG,MAAM,CAAC,GAC/EP;IAEN,IAAIE,MAAMM,QAAQ,EAAE;YAMVN;QALR,oDAAoD;QACpDA,MAAMM,QAAQ,GAAG7B,oBAAAA,CAAK8B,QAAQ,CAACnB,MAAMkB,QAAQ,EAAE;YAC7CE,iBAAiB;YACjBC,cAAc;gBACZC,cAAUhC,kBAAAA,EAAYU,MAAMgB,IAAI,EAAEd,QAAQ,OAAO;oBAAEqB,kBAAkBlB,QAAQ;gBAAG;gBAChFmB,EAAE,EAAA,CAAEZ,kBAAAA,MAAMM,QAAAA,AAAQ,MAAA,QAAdN,oBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,gBAAgBY,EAAE;YACxB;YACAC,aAAa;QACf;IACF;IAEA,IAAIb,MAAMc,IAAI,IAAI,CAACd,MAAMc,IAAI,CAACC,cAAc,CAAC,aAAa;QACxD,oDAAoD;QACpDf,MAAMc,IAAI,CAACJ,QAAQ,GAAA,WAAA,GAAG,OAAA,aAAA,CAAC/B,yBAAAA,EAAAA;IACzB;IAEA,MAAMqC,QAA8BvC,oBAAAA,CAAK8B,QAAQ,CAACnB,MAAM4B,KAAK,EAAE;QAC7DP,cAAc;YAAE,GAAGT,MAAMgB,KAAK;YAAEvB,MAAMwB,aAAaxB;QAAM;QACzDoB,aAAajC,yBAAAA;IACf;IAEA,OAAO;QACL,GAAGoB,KAAK;QACRP;QACAF;QACAI;QACAE;QACAmB;QACA,4DAA4D;QAC5DE,YAAY;YAAE,GAAGlB,MAAMkB,UAAU;YAAEF,OAAOpC,yBAAAA;QAAc;IAC1D;AACF,EAAE;AAKK,+BAA+B,CAACQ,OAAwBC;IAC7D,MAAM,EAAEC,GAAG,EAAE,OAAGR,uCAAAA;IAChB,MAAM,EAAEsB,IAAI,EAAEe,OAAOC,SAAS,EAAEd,UAAUe,YAAY,EAAEL,KAAK,EAAE/B,SAAS,OAAO,EAAE,GAAGc,MAAM,GAAGX;IAE7F,MAAMkC,aAAS9C,qBAAAA,EAAM;IAErB,MAAM+C,OAAgC9C,oBAAAA,CAAK+C,MAAM,CAC/C;QACEC,MAAM;QACNb,IAAIU;QACJjC;QACA,GAAGU,IAAI;IACT,GACA;QAAEc,aAAa;IAAO;IAGxB,MAAM,CAACa,aAAaC,eAAe,GAAGrD,OAAMsD,QAAQ,CAAmBC;IAEvE,IAAIV,QAAkC1C,oBAAAA,CAAK8B,QAAQ,CAACa,WAAW;QAC7DX,cAAc;YAAEqB,KAAK;YAAIL,MAAM;YAAgB,eAAe;YAAMM,QAAQL;QAAY;QACxFb,aAAa;IACf;IAEA,oDAAoD;IACpD,IAAI,EAACM,UAAAA,QAAAA,UAAAA,KAAAA,IAAAA,KAAAA,IAAAA,MAAOa,GAAG,AAAHA,GAAK;QACfb,QAAQU;IACV;IAEA,yEAAyE;IACzE,IAAIV,OAAO;QACTA,MAAMc,OAAO,OAAG1D,8BAAAA,EAAe4C,MAAMc,OAAO,EAAE,IAAMN,eAAe;QACnER,MAAMe,MAAM,OAAG3D,8BAAAA,EAAe4C,MAAMe,MAAM,EAAE,IAAMP,eAAeE;IACnE;IAEA,sDAAsD;IACtD,IAAIvB,WAAwC7B,oBAAAA,CAAK8B,QAAQ,CAACc,cAAc;QACtEb,iBAAiB;QACjBC,cAAc;YACZC,cAAUhC,kBAAAA,EAAY0B,MAAMd,QAAQ;YACpCsB,IAAIU,SAAS;QACf;QACAT,aAAa;IACf;IAEA,+CAA+C;IAC/C,IAAI,EAACP,aAAAA,QAAAA,aAAAA,KAAAA,IAAAA,KAAAA,IAAAA,SAAUI,QAAAA,AAAQ,GAAE;QACvBJ,WAAWuB;IACb;IAEA,+EAA+E;IAC/E,IAAIf,OAAgCe;IACpC,IAAI,CAACvB,YAAa,CAAA,CAACa,SAASO,WAAAA,CAAU,EAAI;QACxCZ,OAAOrC,oBAAAA,CAAK8B,QAAQ,CAACnB,MAAM0B,IAAI,EAAE;YAC/BN,iBAAiB;YACjBC,cAAc;gBACZ,eAAe;YACjB;YACAI,aAAa;QACf;IACF;IAEA,MAAMsB,YAAsC1D,oBAAAA,CAAK8B,QAAQ,CAACS,OAAO;QAC/DP,cAAc;YAAEG,IAAIW,KAAKX,EAAE,GAAG;QAAU;QACxCC,aAAa;IACf;IAEA,IAAIuB;IAEJ,8FAA8F;IAC9F,MAAMC,wBAAwBjD,KAAK,CAAC,aAAa,KAAKyC;IACtD,MAAMS,6BAA6BlD,KAAK,CAAC,kBAAkB,KAAKyC;IAChE,IAAI,CAACQ,yBAAyB,CAACC,4BAA4B;QACzD,IAAIlC,MAAM;YACRmB,IAAI,CAAC,aAAa,GAAGnB;YACrB,IAAI+B,WAAW;gBACbZ,IAAI,CAAC,kBAAkB,GAAGA,KAAKX,EAAE,GAAG,MAAMuB,UAAUvB,EAAE;YACxD;QACF,OAAO,IAAIN,UAAU;YACnB,0GAA0G;YAC1GiB,IAAI,CAAC,kBAAkB,GAAGjB,SAASM,EAAE,GAAIuB,CAAAA,YAAY,MAAMA,UAAUvB,EAAE,GAAG,EAAA,CAAC;QAC7E;QAEA,IAAI3B,WAAW,YAAYA,WAAW,YAAY;YAChD,MAAMsD,aAAavD,eAAe,CAACC,OAAO;YAC1C,IAAIsC,IAAI,CAAC,kBAAkB,EAAE;gBAC3B,MAAMiB,WAAWjB,KAAKX,EAAE,GAAG;gBAC3BW,IAAI,CAAC,kBAAkB,IAAI,MAAMiB;gBACjCJ,yBAAAA,WAAAA,GACE,OAAA,aAAA,CAACK,QAAAA;oBAAKV,QAAAA;oBAAOnB,IAAI4B;mBACdD;YAGP,OAAO,IAAIhB,IAAI,CAAC,aAAa,EAAE;gBAC7BA,IAAI,CAAC,aAAa,IAAI,MAAMgB;YAC9B;QACF;IACF;IAEA,OAAO;QACLtD;QACAmD;QACAlB,YAAY;YAAEK,MAAM;YAAQjB,UAAU;YAAQQ,MAAM;YAAQK,OAAO;YAAOH,OAAO;QAAM;QACvFO;QACAjB;QACAQ;QACAK;QACAH,OAAOmB;IACT;AACF,EAAE;AAEF,MAAMlB,eAAe,CAACxB;IACpB,IAAIA,QAAQ,IAAI;QACd,OAAO;IACT,OAAO,IAAIA,QAAQ,IAAI;QACrB,OAAO;IACT,OAAO,IAAIA,QAAQ,IAAI;QACrB,OAAO;IACT,OAAO,IAAIA,QAAQ,IAAI;QACrB,OAAO;IACT,OAAO,IAAIA,QAAQ,IAAI;QACrB,OAAO;IACT,OAAO;QACL,OAAO;IACT;AACF;AAEA,MAAMS,eAAmC;IACvC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,MAAMC,cAAc,CAACuC;IACnB,IAAIC,WAAW;IACf,IAAK,IAAIC,MAAcF,IAAIrC,MAAM,GAAG,GAAGuC,OAAO,GAAGA,MAAO;QACtD,MAAMC,KAAKH,IAAII,UAAU,CAACF;QAC1B,MAAMG,QAAQH,MAAM;QACpBD,YAAaE,CAAAA,MAAME,KAAAA,CAAI,IAAMF,MAAO,IAAIE,KAAAA,CAAK,EAAI,iCAAiC;IACpF;IAEA,OAAOJ;AACT"}