MCPcopy Create free account
hub / github.com/adobe/react-spectrum / useToken

Function useToken

packages/react-aria/src/tokenfield/useToken.ts:30–80  ·  view source on GitHub ↗
(
  // Unused but matches the normal signature.
  _props: TokenProps,
  _state: any,
  ref: RefObject<HTMLSpanElement | null>
)

Source from the content-addressed store, hash-verified

28 * A token field allows users to enter text with inline tokens.
29 */
30export function useToken(
31 // Unused but matches the normal signature.
32 _props: TokenProps,
33 _state: any,
34 ref: RefObject<HTMLSpanElement | null>
35): TokenAria {
36 let [isSelected, setSelected] = useState(false);
37
38 useEvent(useRef(typeof document !== 'undefined' ? document : null), 'selectionchange', () => {
39 let selection = window.getSelection();
40 if (!selection || !ref.current) {
41 return;
42 }
43
44 let range = selection.rangeCount === 0 ? null : selection.getRangeAt(0);
45 if (!range?.collapsed && range?.intersectsNode(ref.current)) {
46 setSelected(true);
47 } else {
48 setSelected(false);
49 }
50 });
51
52 return {
53 tokenProps: {
54 contentEditable: false,
55 suppressContentEditableWarning: true,
56 style: {
57 userSelect: 'all',
58 WebkitUserSelect: 'all',
59 WebkitTapHighlightColor: 'transparent'
60 },
61 onClick(e) {
62 // Select the token when a screen reader clicks on it.
63 if (isSelected || !isVirtualClick(e.nativeEvent)) {
64 return;
65 }
66 let selection = window.getSelection();
67 let wrapper = ref.current?.parentElement;
68 if (!selection || !wrapper) {
69 return;
70 }
71 let range = document.createRange();
72 range.setStartBefore(wrapper);
73 range.setEndAfter(wrapper);
74 selection.removeAllRanges();
75 selection.addRange(range);
76 }
77 },
78 isSelected
79 };
80}

Callers 1

TokenField.tsxFile · 0.85

Calls 2

useEventFunction · 0.90
setSelectedFunction · 0.50

Tested by

no test coverage detected