Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 66x 4x 4x 4x 4x 4x 4x | import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { startsWithPropKey } from "@utils/StringUtils";
import { DisplayMode } from '@props/RecordProps';
import { getOriginalClassName } from "./alias";
type Command = {
[propName: string]: (parameters: Array<string>) => void;
};
type UseSlashCommandReturnType = {
processSlashCommand: (content: string) => void;
isSlashCommand: (content: string) => boolean;
};
export const useSlashCommand = (
handleSetConversationBarrier: () => void,
setDisplay: (display: DisplayMode) => void,
): UseSlashCommandReturnType => {
const navigate = useNavigate();
const createSlashCmd = useCallback((parameters: Array<string>): void => {
const domainName = getOriginalClassName(parameters[0]);
navigate(`/${domainName}/create`);
}, [navigate]);
const commands: Command = useMemo(() => ({
'/reset': handleSetConversationBarrier,
'/bye': () => setDisplay("minimal"),
'/expand': () => setDisplay("maximal"),
'/collapse': () => setDisplay("normal"),
// Follow slash commands are in internal alpha testing phase
'/list': (parameters: Array<string>) => {
const domainName = getOriginalClassName(parameters[0]);
navigate(`/${domainName}/list`);
},
'/create': createSlashCmd,
'/new': createSlashCmd,
'/inbox': () => {
navigate(`/inbox`);
},
'/dashboard': () => {
navigate(`/`);
},
}), [setDisplay, navigate, handleSetConversationBarrier, createSlashCmd]);
const isSlashCommand = useCallback((content: string) => {
return startsWithPropKey(content, commands);
}, [commands]);
const processSlashCommand = useCallback((content: string) => {
if (isSlashCommand(content)) {
if (commands[content]) {
commands[content]([]);
} else if (content.includes(" ")) {
const action = content.split(" ")[0];
const parameters = content.split(" ").slice(1);
commands[action]?.(parameters);
setDisplay("normal");
}
}
}, [commands, setDisplay, isSlashCommand]);
return { processSlashCommand, isSlashCommand };
};
export default useSlashCommand;
|