addons/components/Tokens.tsxblame
View source
b69ab311/**
b69ab312 * Copyright (c) Meta Platforms, Inc. and affiliates.
b69ab313 *
b69ab314 * This source code is licensed under the MIT license found in the
b69ab315 * LICENSE file in the root directory of this source tree.
b69ab316 */
b69ab317
b69ab318import {Button} from './Button';
b69ab319import {Icon} from './Icon';
b69ab3110
b69ab3111export function TokensList({
b69ab3112 tokens,
b69ab3113 onClickX,
b69ab3114 onClickToken,
b69ab3115}: {
b69ab3116 tokens: Array<string>;
b69ab3117 onClickX?: (token: string) => unknown;
b69ab3118 onClickToken?: (token: string) => unknown;
b69ab3119}) {
b69ab3120 const hasOnClick = onClickToken != null;
b69ab3121 return (
b69ab3122 <>
b69ab3123 {tokens
b69ab3124 .filter(token => token != '')
b69ab3125 .map((token, i) => (
b69ab3126 <span
b69ab3127 key={i}
b69ab3128 className={'token' + (hasOnClick ? ' clickable' : '')}
b69ab3129 onClick={
b69ab3130 hasOnClick
b69ab3131 ? e => {
b69ab3132 onClickToken(token);
b69ab3133 e.preventDefault();
b69ab3134 e.stopPropagation();
b69ab3135 }
b69ab3136 : undefined
b69ab3137 }>
b69ab3138 {token}
b69ab3139 {onClickX == null ? null : (
b69ab3140 <Button
b69ab3141 icon
b69ab3142 data-testid="token-x"
b69ab3143 onClick={e => {
b69ab3144 onClickX?.(token);
b69ab3145 e.stopPropagation();
b69ab3146 }}>
b69ab3147 <Icon icon="x" />
b69ab3148 </Button>
b69ab3149 )}
b69ab3150 </span>
b69ab3151 ))}
b69ab3152 </>
b69ab3153 );
b69ab3154}
b69ab3155
b69ab3156function deduplicate<T>(values: Array<T>) {
b69ab3157 return [...new Set(values)];
b69ab3158}
b69ab3159
b69ab3160/** Extract comma-separated tokens into an array, plus any remaining non-tokenized text */
b69ab3161export function extractTokens(raw: string): [Array<string>, string] {
b69ab3162 const tokens = raw.split(',');
b69ab3163 const remaining = tokens.length === 0 ? raw : tokens.pop();
b69ab3164 return [
b69ab3165 deduplicate(tokens.map(token => token.trim())).filter(token => token !== ''),
b69ab3166 remaining?.trimStart() ?? '',
b69ab3167 ];
b69ab3168}
b69ab3169
b69ab3170/** Combine tokens back into a string to be stored in the commit message */
b69ab3171export function tokensToString(tokens: Array<string>, remaining: string): string {
b69ab3172 return tokens.length === 0 ? remaining : tokens.join(',') + ',' + remaining;
b69ab3173}