@ws-ui/http-handlers-editor 1.11.3-rc1 → 1.11.3-rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/http-handlers-editor.css +1 -1
- package/dist/index.cjs.js +3 -3
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +82 -84
- package/dist/index.es.js.map +1 -1
- package/package.json +2 -4
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/SwitchToEditorIcon.tsx","../src/Provider/index.tsx","../src/Handler/index.tsx","../src/Editor.tsx","../src/Standalone/index.tsx"],"sourcesContent":["import { IconType } from '@ws-ui/icons';\nimport { IEditor, ITab } from '@ws-ui/shared';\nimport { switchEditor, useAppDispatch } from '@ws-ui/store';\nimport { ToolbarIcon } from '@ws-ui/webform-editor';\nimport { FC } from 'react';\n\ninterface SwitchToEditorIconProps {\n label: string;\n Icon: IconType;\n tab: ITab;\n editor: IEditor;\n onBeforeClick?: () => void;\n}\n\nexport const SwitchToEditorIcon: FC<SwitchToEditorIconProps> = ({\n label,\n Icon,\n tab,\n editor,\n onBeforeClick,\n}) => {\n const dispatch = useAppDispatch();\n\n return (\n <ToolbarIcon\n label={label}\n Icon={Icon}\n as=\"button\"\n onClick={() => {\n onBeforeClick?.();\n dispatch(\n switchEditor({\n tab,\n editor,\n }),\n );\n }}\n />\n );\n};\n","import { omit } from 'lodash';\r\nimport {\r\n createContext,\r\n useReducer,\r\n useContext,\r\n ReactNode,\r\n useEffect,\r\n} from 'react';\r\nimport { Subject } from 'rxjs';\r\nimport { generate } from 'short-uuid';\r\n\r\n// Define types\r\nexport type HTTPVerb = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n\r\nexport type HTTPHandler = {\r\n id: string; // Unique identifier\r\n class: string;\r\n method: string;\r\n pattern: string;\r\n regexPattern: string;\r\n verbs: HTTPVerb[];\r\n isExpanded: boolean;\r\n asRegex?: boolean;\r\n};\r\n\r\ntype HandlerState = {\r\n content: HTTPHandler[];\r\n editing: string | null;\r\n newlyCreatedHandlerID: string | null;\r\n};\r\n\r\ntype HandlerContextType = {\r\n state: HandlerState;\r\n dispatch: React.Dispatch<HandlerAction>;\r\n};\r\n\r\n// Create Context\r\nconst HandlerContext = createContext<HandlerContextType | undefined>(undefined);\r\n\r\nexport const $handlerSubject = new Subject();\r\n\r\n// Define action types\r\ntype HandlerAction =\r\n | { type: 'ADD_HANDLER'; payload: Omit<HTTPHandler, 'id'> }\r\n | { type: 'UPDATE_HANDLER'; id: string; payload: Partial<HTTPHandler> }\r\n | { type: 'DELETE_HANDLER'; id: string }\r\n | { type: 'TOGGLE_EXPANDED'; id: string }\r\n | { type: 'DUPLICATE_HANDLER'; id: string }\r\n | { type: 'TOGGLE_ALL_EXPANDED'; payload: boolean }\r\n | { type: 'UPDATE_HANDLERS'; payload: HTTPHandler[] }\r\n | { type: 'SYNC_DATA'; payload: HTTPHandler[] }\r\n | { type: 'SET_EDITING_HANDLER'; payload: string | null };\r\n\r\n// Reducer function\r\nconst handlerReducer = (\r\n state: HandlerState,\r\n action: HandlerAction,\r\n): HandlerState => {\r\n switch (action.type) {\r\n case 'UPDATE_HANDLERS':\r\n return {\r\n ...state,\r\n content: action.payload,\r\n };\r\n case 'SET_EDITING_HANDLER': {\r\n // $handlerSubject.next(lastEditing.id);\r\n\r\n if (action.payload && action.payload !== state.editing) {\r\n const lastEditing = state.content.find(\r\n (item) => item.id === state.editing,\r\n );\r\n\r\n if (lastEditing) {\r\n const isEmpty =\r\n !Object.values(\r\n omit(lastEditing, ['id', 'verbs', 'asRegex', 'isExpanded']),\r\n ).some(Boolean) && lastEditing.verbs.length === 0;\r\n\r\n if (isEmpty) {\r\n return {\r\n ...state,\r\n content: state.content.filter((t) => t.id !== lastEditing.id),\r\n editing: action.payload,\r\n };\r\n }\r\n }\r\n }\r\n\r\n return {\r\n ...state,\r\n editing: action.payload,\r\n };\r\n }\r\n case 'ADD_HANDLER': {\r\n const id = generate();\r\n return {\r\n ...state,\r\n content: [...state.content, { ...action.payload, id }],\r\n editing: id,\r\n newlyCreatedHandlerID: id,\r\n };\r\n }\r\n case 'UPDATE_HANDLER':\r\n return {\r\n ...state,\r\n content: state.content.map((handler) =>\r\n handler.id === action.id\r\n ? { ...handler, ...action.payload }\r\n : handler,\r\n ),\r\n newlyCreatedHandlerID: null,\r\n };\r\n case 'DELETE_HANDLER':\r\n return {\r\n ...state,\r\n content: state.content.filter((handler) => handler.id !== action.id),\r\n };\r\n case 'TOGGLE_EXPANDED':\r\n return {\r\n ...state,\r\n content: state.content.map((handler) =>\r\n handler.id === action.id\r\n ? { ...handler, isExpanded: !handler.isExpanded }\r\n : handler,\r\n ),\r\n };\r\n\r\n case 'DUPLICATE_HANDLER': {\r\n const handlerToDuplicate = state.content.find(\r\n (handler) => handler.id === action.id,\r\n );\r\n\r\n if (!handlerToDuplicate) return state;\r\n return {\r\n ...state,\r\n content: [\r\n ...state.content,\r\n { ...handlerToDuplicate, id: generate(), isExpanded: true },\r\n ],\r\n };\r\n }\r\n case 'TOGGLE_ALL_EXPANDED':\r\n return {\r\n ...state,\r\n content: state.content.map((handler) => ({\r\n ...handler,\r\n isExpanded: action.payload,\r\n })),\r\n };\r\n case 'SYNC_DATA':\r\n return {\r\n ...state,\r\n content: action.payload.map((handler) => {\r\n const found = state.content.find((item) => item.id === handler.id);\r\n\r\n if (found) {\r\n return {\r\n ...handler,\r\n ...found,\r\n };\r\n }\r\n\r\n return handler;\r\n }),\r\n };\r\n default:\r\n throw new Error('Unknown action type');\r\n }\r\n};\r\n\r\ntype HandlerProviderProps = {\r\n children: ReactNode;\r\n content: HTTPHandler[];\r\n};\r\n\r\nexport const HandlerProvider: React.FC<HandlerProviderProps> = ({\r\n children,\r\n content,\r\n}) => {\r\n const initialState: HandlerState = {\r\n content,\r\n editing: null,\r\n newlyCreatedHandlerID: null,\r\n };\r\n const [state, dispatch] = useReducer(handlerReducer, initialState);\r\n\r\n useEffect(() => {\r\n dispatch({\r\n type: 'SYNC_DATA',\r\n payload: content,\r\n });\r\n }, [content]);\r\n\r\n return (\r\n <HandlerContext.Provider value={{ state, dispatch }}>\r\n {children}\r\n </HandlerContext.Provider>\r\n );\r\n};\r\n\r\n// Custom Hook to Use Handler Context\r\nexport const useHTTPHandlers = (): HandlerContextType => {\r\n const context = useContext(HandlerContext);\r\n if (!context) {\r\n throw new Error('useHTTPHandlers must be used within a HandlerProvider');\r\n }\r\n return context;\r\n};\r\n","import { useSortable } from '@dnd-kit/sortable';\r\nimport { CSS } from '@dnd-kit/utilities';\r\nimport { Combobox, Transition } from '@headlessui/react';\r\nimport {\r\n FdCheckCircle,\r\n FdClose,\r\n FdCloseNaked,\r\n FdDown,\r\n FdDragHandle,\r\n FdDuplicate,\r\n FdEmpty,\r\n FdInfoCircle,\r\n FdPen,\r\n FdRegex,\r\n FdTrash,\r\n FdUnRegex,\r\n FdWarningDanger,\r\n} from '@ws-ui/icons';\r\nimport {\r\n ControlledSwitch,\r\n ModalColor,\r\n ModalType,\r\n useHotkeys,\r\n Tooltip,\r\n} from '@ws-ui/shared';\r\nimport {\r\n openModal,\r\n selectCatalog,\r\n useAppDispatch,\r\n useAppSelector,\r\n} from '@ws-ui/store';\r\nimport cn from 'classnames';\r\nimport { useCombobox, useMultipleSelection } from 'downshift';\r\nimport { FC, Fragment, useEffect, useMemo, useState } from 'react';\r\nimport {\r\n $handlerSubject,\r\n HTTPHandler,\r\n HTTPVerb,\r\n useHTTPHandlers,\r\n} from '../Provider';\r\nimport { SyntheticListenerMap } from '@dnd-kit/core/dist/hooks/utilities';\r\nimport { DraggableAttributes } from '@dnd-kit/core';\r\nimport { omit, isEqual } from 'lodash';\r\nimport RandExp from 'randexp';\r\n\r\nconst MultipleComboBox: FC<{\r\n initialSelectedItems: HTTPVerb[];\r\n onChange: (val: HTTPVerb[]) => void;\r\n touched?: boolean;\r\n onBlur?: () => void;\r\n}> = ({ initialSelectedItems, onChange, touched, onBlur }) => {\r\n const verbs: HTTPVerb[] = ['GET', 'POST', 'PUT', 'DELETE'];\r\n\r\n function getFilteredverbs(selectedItems: string[], inputValue: string) {\r\n const lowerCasedInputValue = inputValue.toLowerCase();\r\n\r\n return verbs.filter(function filtermethod(method) {\r\n return (\r\n !selectedItems.includes(method) &&\r\n method.toLowerCase().includes(lowerCasedInputValue)\r\n );\r\n });\r\n }\r\n\r\n const [inputValue, setInputValue] = useState('');\r\n const [selectedItems, setSelectedItems] = useState(initialSelectedItems);\r\n\r\n useEffect(() => {\r\n setSelectedItems(initialSelectedItems);\r\n }, [initialSelectedItems]);\r\n\r\n const items: string[] = useMemo(\r\n () => getFilteredverbs(selectedItems, inputValue),\r\n [selectedItems, inputValue],\r\n );\r\n\r\n const { getSelectedItemProps, getDropdownProps, removeSelectedItem } =\r\n useMultipleSelection({\r\n selectedItems,\r\n onStateChange({ selectedItems: newSelectedItems = [], type }) {\r\n switch (type) {\r\n case useMultipleSelection.stateChangeTypes\r\n .SelectedItemKeyDownBackspace:\r\n case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownDelete:\r\n case useMultipleSelection.stateChangeTypes.DropdownKeyDownBackspace:\r\n case useMultipleSelection.stateChangeTypes.FunctionRemoveSelectedItem:\r\n setSelectedItems(newSelectedItems);\r\n break;\r\n default:\r\n break;\r\n }\r\n },\r\n });\r\n\r\n const {\r\n isOpen,\r\n getToggleButtonProps,\r\n getMenuProps,\r\n getInputProps,\r\n highlightedIndex,\r\n getItemProps,\r\n selectedItem,\r\n } = useCombobox({\r\n items,\r\n itemToString(item) {\r\n return item ? item : '';\r\n },\r\n defaultHighlightedIndex: 0, // after selection, highlight the first item.\r\n selectedItem: null,\r\n inputValue,\r\n stateReducer(state, actionAndChanges) {\r\n const { changes, type } = actionAndChanges;\r\n\r\n switch (type) {\r\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\r\n case useCombobox.stateChangeTypes.ItemClick:\r\n return {\r\n ...changes,\r\n isOpen: true, // keep the menu open after selection.\r\n highlightedIndex: 0, // with the first option highlighted.\r\n };\r\n default:\r\n return changes;\r\n }\r\n },\r\n onStateChange({\r\n inputValue: newInputValue = '',\r\n type,\r\n selectedItem: newSelectedItem,\r\n }) {\r\n switch (type) {\r\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\r\n case useCombobox.stateChangeTypes.ItemClick:\r\n case useCombobox.stateChangeTypes.InputBlur:\r\n if (newSelectedItem) {\r\n setSelectedItems([...selectedItems, newSelectedItem as HTTPVerb]);\r\n setInputValue('');\r\n }\r\n break;\r\n\r\n case useCombobox.stateChangeTypes.InputChange:\r\n setInputValue(newInputValue);\r\n\r\n break;\r\n default:\r\n break;\r\n }\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n onChange(selectedItems);\r\n }, [selectedItems]);\r\n\r\n return (\r\n <div className=\"relative flex-1\">\r\n <div\r\n className={cn(\r\n 'bg-grey-300 focus-within:ring-1 focus-within:ring-primary-dark relative flex items-center w-full cursor-default overflow-hidden rounded p-px text-left focus:outline-none',\r\n {\r\n 'ring-1 ring-primary-dark rounded-b-none': isOpen && items.length,\r\n 'ring-1 ring-red-400 overflow-visible':\r\n selectedItems.length === 0 && touched,\r\n },\r\n )}\r\n onBlur={onBlur}\r\n >\r\n {selectedItems.length === 0 && !isOpen && touched && (\r\n <div className=\"absolute inset-x-0 top-[25px] z-[1] rounded-b-sm bg-red-200 px-1 text-xs text-red-600 ring-1 ring-red-600\">\r\n {selectedItems.length === 0 && 'At least one HTTP verb is required'}\r\n </div>\r\n )}\r\n\r\n {selectedItems.map(\r\n function renderSelectedItem(selectedItemForRender, index) {\r\n return (\r\n <span\r\n className={cn(\r\n 'bg-grey-600 text-s mr-1 flex items-center rounded px-1 py-0.5 uppercase',\r\n {\r\n 'bg-red-400': !verbs.includes(selectedItemForRender),\r\n },\r\n )}\r\n key={`selected-item-${index}-${selectedItemForRender}`}\r\n {...getSelectedItemProps({\r\n selectedItem: selectedItemForRender,\r\n index,\r\n })}\r\n >\r\n {selectedItemForRender}\r\n\r\n <span\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n removeSelectedItem(selectedItemForRender);\r\n }}\r\n className=\"hover:bg-primary-hover ml-2 inline-block cursor-pointer rounded p-0.5 text-gray-100 hover:text-white active:outline-none\"\r\n >\r\n <FdCloseNaked />\r\n </span>\r\n </span>\r\n );\r\n },\r\n )}\r\n <input\r\n {...getInputProps(\r\n getDropdownProps(\r\n { preventKeyAction: isOpen },\r\n { suppressRefError: true },\r\n ),\r\n )}\r\n className=\"flex-grow border-none bg-transparent px-1 py-1 text-xs outline-none\"\r\n placeholder={selectedItems.length === 0 ? 'Select HTTP verbs' : ''}\r\n size={1}\r\n />\r\n <button\r\n className=\"absolute inset-y-0 right-0 flex items-center pr-2\"\r\n type=\"button\"\r\n {...getToggleButtonProps()}\r\n >\r\n <FdDown className=\"h-3 w-3 text-gray-50\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n <ul\r\n className={`ring-primary-dark bg-grey-900 text-s absolute z-10 w-full rounded-b ring-1 p-1 text-white ${\r\n !(isOpen && items.length) && 'hidden'\r\n }`}\r\n {...getMenuProps()}\r\n >\r\n {isOpen &&\r\n items.map((item, index) => (\r\n <li\r\n className={cn(\r\n highlightedIndex === index && 'bg-primary-hover',\r\n selectedItem === item && 'font-bold',\r\n 'flex flex-col p-1 shadow-sm',\r\n )}\r\n key={`${item}${index}`}\r\n {...getItemProps({ item, index })}\r\n >\r\n <span>{item}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n};\r\n\r\nconst Select = ({\r\n value,\r\n options,\r\n errorMessage = '',\r\n onChange,\r\n onBlur,\r\n}: {\r\n value: string;\r\n onChange: (val: string) => void;\r\n options: { name: string }[];\r\n errorMessage?: string;\r\n onBlur?: () => void;\r\n}) => {\r\n const [query, setQuery] = useState('');\r\n\r\n const notFound = options.find((item) => item.name === value);\r\n\r\n const filteredOptions =\r\n query === ''\r\n ? options\r\n : options.filter((sgltn) => {\r\n return sgltn.name.toLowerCase().includes(query.toLowerCase());\r\n });\r\n\r\n return (\r\n <Combobox\r\n key={value}\r\n value={{ name: value }}\r\n onChange={(s) => onChange(s.name)}\r\n >\r\n {({ open }) => (\r\n <div className=\"relative w-full\">\r\n <div\r\n className={cn(\r\n 'bg-grey-300 focus-within:ring-1 focus-within:ring-primary-dark relative w-full cursor-default overflow-hidden rounded text-left inline-flex',\r\n {\r\n 'ring-1 ring-red-400': (!notFound && value) || errorMessage,\r\n 'ring-1 ring-primary-dark rounded-b-none': open,\r\n 'overflow-visible': !notFound && !open && errorMessage,\r\n },\r\n )}\r\n >\r\n <Combobox.Input\r\n className={cn(\r\n 'bg-grey-300 text-s w-full border-none py-1 px-2 focus:outline-none rounded',\r\n {\r\n '!text-red-400': !notFound,\r\n },\r\n )}\r\n displayValue={(sngltn: { name: string }) => sngltn.name}\r\n onChange={(event) => setQuery(event.target.value)}\r\n style={{ caretColor: 'white' }}\r\n onBlur={onBlur}\r\n />\r\n <span className=\"inset-y-0 right-0 flex items-center gap-1 pr-2\">\r\n {!notFound && !open && errorMessage && (\r\n <div className=\"absolute inset-x-0 top-[25px] z-[1] rounded-b-sm bg-red-200 px-1 text-xs text-red-600 ring-1 ring-red-600\">\r\n {errorMessage}\r\n </div>\r\n )}\r\n\r\n {value ? (\r\n <>\r\n <button\r\n onClick={() => {\r\n setQuery('');\r\n onChange('');\r\n }}\r\n >\r\n <FdCloseNaked\r\n className=\"text-grey-50 h-3 w-3\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n <span className=\"bg-grey-50 h-3 w-[1px] rounded-full\"></span>\r\n </>\r\n ) : null}\r\n <Combobox.Button>\r\n <FdDown className=\"text-grey-50 h-3 w-3\" aria-hidden=\"true\" />\r\n </Combobox.Button>\r\n </span>\r\n </div>\r\n\r\n <Transition\r\n as={Fragment}\r\n leave=\"transition ease-in durati pb-0.5on-100\"\r\n leaveFrom=\"opacity-100\"\r\n leaveTo=\"opacity-0\"\r\n afterLeave={() => setQuery('')}\r\n >\r\n <Combobox.Options className=\"bg-grey-900 text-s text-grey-100 sm:text-s absolute z-50 max-h-60 w-full overflow-auto rounded-b ring-1 ring-primary-dark p-1 focus:outline-none\">\r\n {filteredOptions.length === 0 ? (\r\n <div className=\"text-s text-grey-200 relative cursor-default select-none px-0.5 py-0.5 \">\r\n <FdEmpty className=\"inline h-4 w-4\" /> Nothing found.\r\n </div>\r\n ) : (\r\n filteredOptions.map((option, index) => (\r\n <Combobox.Option\r\n key={index}\r\n className={({ active }) =>\r\n `relative cursor-default select-none ${\r\n active ? 'bg-primary-hover' : ''\r\n }`\r\n }\r\n value={option}\r\n >\r\n {({ selected }) => (\r\n <>\r\n <span\r\n className={`block truncate p-2 py-1 ${\r\n selected\r\n ? 'bg-primary-dark font-medium text-white'\r\n : 'font-normal'\r\n }`}\r\n >\r\n {option.name}\r\n </span>\r\n </>\r\n )}\r\n </Combobox.Option>\r\n ))\r\n )}\r\n </Combobox.Options>\r\n </Transition>\r\n </div>\r\n )}\r\n </Combobox>\r\n );\r\n};\r\n\r\nconst MethodSelector = ({\r\n value,\r\n options,\r\n onChange,\r\n errorMessage,\r\n onBlur,\r\n}: {\r\n value: string;\r\n onChange: (val: string) => void;\r\n options: { name: string; exposed: boolean }[];\r\n errorMessage?: string;\r\n onBlur?: () => void;\r\n}) => {\r\n const [query, setQuery] = useState('');\r\n\r\n const found = options.find((item) => item.name === value);\r\n\r\n const exposed = found && found.exposed;\r\n\r\n const filteredOptions =\r\n query === ''\r\n ? options\r\n : options.filter((sgltn) => {\r\n return sgltn.name.toLowerCase().includes(query.toLowerCase());\r\n });\r\n\r\n return (\r\n <Combobox value={{ name: value }} onChange={(val) => onChange(val.name)}>\r\n {({ open }) => (\r\n <div className=\"relative\">\r\n <div\r\n className={cn(\r\n 'bg-grey-300 focus-within:ring-1 focus-within:ring-primary-dark relative w-full cursor-default overflow-hidden rounded text-left inline-flex',\r\n {\r\n 'ring-1 ring-red-400': errorMessage,\r\n 'ring-1 ring-yellow-500': exposed,\r\n 'ring-1 ring-primary-dark rounded-b-none': open,\r\n 'overflow-visible': !open && errorMessage,\r\n },\r\n )}\r\n >\r\n <Combobox.Input\r\n className={cn(\r\n 'bg-grey-300 text-s w-full border-none py-1 px-2 focus:outline-none truncate rounded',\r\n {\r\n '!text-red-400': errorMessage,\r\n '!text-yellow-500': exposed,\r\n },\r\n )}\r\n style={{ caretColor: 'white' }}\r\n displayValue={(sngltn: { name: string }) => sngltn.name}\r\n onChange={(event) => setQuery(event.target.value)}\r\n onBlur={onBlur}\r\n />\r\n {!open && errorMessage && (\r\n <div\r\n className={cn(\r\n 'absolute inset-x-0 top-[25px] z-[1] rounded-b-sm bg-red-200 px-1 text-xs text-red-600 ring-1 ring-red-600',\r\n { '!text-yellow-500 ring-yellow-500 bg-white': exposed },\r\n )}\r\n >\r\n {errorMessage}\r\n </div>\r\n )}\r\n <span className=\"inset-y-0 right-0 flex items-center gap-1 pr-2\">\r\n {value ? (\r\n <>\r\n <button\r\n onClick={() => {\r\n setQuery('');\r\n onChange('');\r\n }}\r\n >\r\n <FdCloseNaked\r\n className=\"text-grey-50 h-3 w-3\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n <span className=\"bg-grey-50 h-3 w-[1px] rounded-full\"></span>\r\n </>\r\n ) : null}\r\n <Combobox.Button>\r\n <FdDown className=\"text-grey-50 h-3 w-3\" aria-hidden=\"true\" />\r\n </Combobox.Button>\r\n </span>\r\n </div>\r\n\r\n <Transition\r\n as={Fragment}\r\n leave=\"transition ease-in duration-100\"\r\n leaveFrom=\"opacity-100\"\r\n leaveTo=\"opacity-0\"\r\n afterLeave={() => setQuery('')}\r\n >\r\n <Combobox.Options className=\"bg-grey-900 text-s text-grey-100 sm:text-s absolute z-50 max-h-60 w-full overflow-auto rounded-b ring-1 ring-primary-dark p-1 focus:outline-none\">\r\n {!filteredOptions.length ? (\r\n <div className=\"text-s text-grey-200 relative cursor-default select-none px-0.5 py-0.5\">\r\n <FdEmpty className=\"inline h-4 w-4\" /> Nothing found.\r\n </div>\r\n ) : (\r\n filteredOptions.map((option, index) => (\r\n <Combobox.Option\r\n key={index}\r\n className={({ active }) =>\r\n `relative cursor-default select-none ${\r\n active ? 'bg-primary-hover' : ''\r\n }`\r\n }\r\n value={option}\r\n >\r\n {({ selected }) => (\r\n <>\r\n <span\r\n className={`text-s flex items-center gap-2 truncate p-2 py-1 ${\r\n selected\r\n ? 'bg-primary-dark font-medium text-white'\r\n : 'font-normal'\r\n }`}\r\n >\r\n {option.exposed && (\r\n <FdWarningDanger className=\"text-yellow-500\" />\r\n )}\r\n <span className=\"flex-1 truncate\" title={option.name}>\r\n {option.name}\r\n </span>\r\n </span>\r\n </>\r\n )}\r\n </Combobox.Option>\r\n ))\r\n )}\r\n </Combobox.Options>\r\n </Transition>\r\n </div>\r\n )}\r\n </Combobox>\r\n );\r\n};\r\n\r\nconst GrabHandle: FC<{\r\n attributes: DraggableAttributes;\r\n listeners: SyntheticListenerMap | undefined;\r\n}> = ({ listeners, attributes }) => {\r\n return (\r\n <button {...attributes} {...listeners}>\r\n <FdDragHandle />\r\n </button>\r\n );\r\n};\r\n\r\nconst generateRegexExample = (regex: string) => {\r\n if (!regex) return '';\r\n let regexExample;\r\n RandExp.prototype.max = 8;\r\n try {\r\n regexExample = new RandExp(regex)?.gen();\r\n } catch {\r\n regexExample = '';\r\n }\r\n return `Requests matching regex will be handled example: ${regexExample}`;\r\n};\r\n\r\nconst HandlerEdit: FC<\r\n HTTPHandler & {\r\n attributes: DraggableAttributes;\r\n listeners: SyntheticListenerMap | undefined;\r\n }\r\n> = ({\r\n id,\r\n class: className,\r\n method,\r\n pattern,\r\n verbs,\r\n regexPattern,\r\n asRegex,\r\n listeners,\r\n attributes,\r\n}) => {\r\n const [handler, setHandler] = useState({\r\n className,\r\n method,\r\n pattern,\r\n verbs,\r\n asRegex,\r\n regexPattern,\r\n });\r\n\r\n const catalog = useAppSelector(selectCatalog);\r\n\r\n const singletons = Object.values(catalog?.singletons || {});\r\n\r\n const singletonMethods = singletons\r\n .find((item) => item.name === handler.className)\r\n ?.methods.map(({ name, exposed }) => ({ name, exposed }));\r\n\r\n const {\r\n dispatch,\r\n state: { newlyCreatedHandlerID },\r\n } = useHTTPHandlers();\r\n\r\n const appDispatch = useAppDispatch();\r\n\r\n function isValid() {\r\n const { className, method, asRegex, regexPattern, pattern, verbs } =\r\n handler;\r\n return !!(\r\n className &&\r\n method &&\r\n (asRegex ? regexPattern : !pattern.endsWith('/')) &&\r\n verbs.length\r\n );\r\n }\r\n\r\n function onConfirm() {\r\n if (isValid()) {\r\n const { className, method, asRegex, regexPattern, pattern, verbs } =\r\n handler;\r\n const rest = asRegex ? { regexPattern } : { pattern };\r\n dispatch({\r\n type: 'UPDATE_HANDLER',\r\n id,\r\n payload: {\r\n class: className,\r\n method,\r\n verbs,\r\n asRegex,\r\n ...rest,\r\n },\r\n });\r\n\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: null });\r\n }\r\n }\r\n\r\n const onCancel = async () => {\r\n const oldHandler = {\r\n className,\r\n method,\r\n pattern,\r\n regexPattern,\r\n verbs,\r\n };\r\n\r\n const newHandler = omit(handler, ['id', 'isExpanded']);\r\n if (!isValid()) {\r\n dispatch({ type: 'DELETE_HANDLER', id: `${newlyCreatedHandlerID}` });\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: null });\r\n return;\r\n }\r\n\r\n if (!isEqual(oldHandler, newHandler)) {\r\n const { confirmed } = await appDispatch(\r\n openModal({\r\n title: 'Cancel Changes',\r\n type: ModalType.CONFIRM,\r\n color: ModalColor.DANGER,\r\n message:\r\n 'Are you sure you want to cancel changes made to this Handler?',\r\n icon: 'FdWarningDanger',\r\n }),\r\n ).unwrap();\r\n\r\n if (confirmed) {\r\n if (newlyCreatedHandlerID === id) {\r\n dispatch({ type: 'DELETE_HANDLER', id });\r\n }\r\n\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: null });\r\n\r\n return;\r\n }\r\n }\r\n };\r\n\r\n useHotkeys(\r\n 'esc',\r\n () => {\r\n setTimeout(() => {\r\n onCancel();\r\n }, 100);\r\n },\r\n [],\r\n );\r\n\r\n useEffect(() => {\r\n $handlerSubject.subscribe((lastEditingID) => {\r\n if (lastEditingID === id) {\r\n onConfirm();\r\n }\r\n });\r\n }, [handler, id]);\r\n const [touchedFields, setTouchedFields] = useState<{\r\n [key: string]: boolean;\r\n }>({ className: false, method: false, pattern: false, verbs: false });\r\n\r\n const methodErrors = () => {\r\n if (touchedFields.method && !handler.method) {\r\n return 'Method is required';\r\n }\r\n if (singletonMethods) {\r\n const found = singletonMethods?.find(\r\n (item) => item.name === handler.method,\r\n );\r\n if (handler.method && !found)\r\n return `The method \"${handler.method}\" doesn't exist.`;\r\n if (found && found.exposed)\r\n return `Method \"${handler.method}\" is already exposed`;\r\n }\r\n };\r\n const patternErrors = () => {\r\n if (touchedFields.pattern) {\r\n if (handler.asRegex && !handler.regexPattern) {\r\n return 'Pattern is required';\r\n }\r\n if (!handler.asRegex && handler.pattern.endsWith('/')) {\r\n return 'Pattern should not end with a \"/\"';\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-2 rounded-b py-2\">\r\n <div className=\"flex w-60 flex-shrink-0 items-center gap-1\">\r\n <GrabHandle\r\n key=\"grab-handle\"\r\n listeners={listeners}\r\n attributes={attributes}\r\n />\r\n <Select\r\n value={handler.className}\r\n onChange={(val) => {\r\n setHandler((state) => ({ ...state, className: val }));\r\n }}\r\n onBlur={() =>\r\n setTouchedFields((state) => ({ ...state, className: true }))\r\n }\r\n key={className}\r\n options={singletons}\r\n errorMessage={\r\n touchedFields.className && !handler.className\r\n ? 'Class name is required'\r\n : handler.className !== '' &&\r\n !singletons.find((item) => item.name === handler.className)\r\n ? `The singleton \"${handler.className}\" doesn't exist.`\r\n : undefined\r\n }\r\n />\r\n </div>\r\n <div className=\"w-60 flex-shrink-0\">\r\n <MethodSelector\r\n value={handler.method}\r\n onChange={(val) => {\r\n setHandler((state) => ({ ...state, method: val }));\r\n }}\r\n options={singletonMethods || []}\r\n errorMessage={methodErrors()}\r\n onBlur={() =>\r\n setTouchedFields((state) => ({ ...state, method: true }))\r\n }\r\n />\r\n </div>\r\n\r\n <div className=\"relative w-60 flex-shrink-0 flex items-center gap-1 overflow-visible\">\r\n <Tooltip\r\n label={\r\n handler.asRegex\r\n ? generateRegexExample(handler.regexPattern)\r\n : handler.pattern && !handler.pattern.endsWith('/')\r\n ? `Requests starting with /${handler.pattern}/ will be handled`\r\n : ''\r\n }\r\n >\r\n <div className=\"relative w-full\">\r\n {!handler.asRegex && (\r\n <span className=\"absolute text-s inset-y-0 left-1 flex items-center gap-2\">\r\n /\r\n </span>\r\n )}\r\n <input\r\n type=\"text\"\r\n className={cn(\r\n 'bg-grey-300 text-s block w-full rounded p-1 pl-3 focus:outline-none focus:ring-1 focus:ring-primary-dark',\r\n {\r\n 'focus:ring-red-400 ring-1 ring-red-400':\r\n touchedFields.pattern &&\r\n handler.asRegex &&\r\n !handler['regexPattern'],\r\n },\r\n )}\r\n value={handler.asRegex ? handler.regexPattern : handler.pattern}\r\n onChange={(e) => {\r\n setHandler((state) => ({\r\n ...state,\r\n [handler.asRegex ? 'regexPattern' : 'pattern']:\r\n e.target.value,\r\n }));\r\n }}\r\n onBlur={() =>\r\n setTouchedFields((state) => ({ ...state, pattern: true }))\r\n }\r\n placeholder={handler.asRegex ? 'Required' : ''}\r\n />\r\n {patternErrors() && (\r\n <div className=\"absolute inset-x-0 top-[25px] z-[1] rounded-b-sm bg-red-200 px-1 text-xs text-red-600 ring-1 ring-red-600\">\r\n {patternErrors()}\r\n </div>\r\n )}\r\n </div>\r\n </Tooltip>\r\n {(asRegex ? regexPattern : pattern) && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n\r\n setHandler((state) => ({\r\n ...state,\r\n [handler.asRegex ? 'regexPattern' : 'pattern']: '',\r\n }));\r\n }}\r\n className=\"absolute inset-y-0 right-6 flex items-center gap-2 pr-2\"\r\n >\r\n <FdCloseNaked\r\n className=\"text-grey-200 h-3 w-3\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n )}\r\n <Tooltip\r\n label={\r\n handler.asRegex\r\n ? `Requests matching this regex will be handled. Check the match with the __[Match regex command](https://developer.4d.com/docs/commands/match-regex)__`\r\n : `Prefixes are considered as regular expressions already containing starting and ending / \\n\\n __[documentation](https://developer.qodly.com/docs/studio/httpHandlers)__`\r\n }\r\n >\r\n <span className=\"rounded hover:bg-gray-400/30 w-6 h-6 flex items-center content-center justify-center\">\r\n <FdInfoCircle className=\"inline h-4 w-4 text-gray-100\" />\r\n </span>\r\n </Tooltip>\r\n </div>\r\n\r\n <div className=\"w-20 px-2 flex justify-center\">\r\n <ControlledSwitch\r\n value={!!handler.asRegex}\r\n onChange={(value) => {\r\n const rest = value\r\n ? { regexPattern: pattern, asRegex: value }\r\n : { pattern: regexPattern, asRegex: value };\r\n\r\n setHandler((state) => ({ ...state, ...rest }));\r\n\r\n // dispatch({\r\n // type: 'UPDATE_HANDLER',\r\n // payload: { asRegex: value },\r\n // id,\r\n // });\r\n }}\r\n className={`${handler.asRegex ? 'bg-primary-dark' : 'bg-grey-300'}\r\nrelative inline-flex h-5 w-8 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75`}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n className={`${handler.asRegex ? 'translate-x-3' : 'translate-x-0'}\r\npointer-events-none inline-block h-4 w-4 transform rounded-full bg-white ring-0 transition duration-200 ease-in-out`}\r\n />\r\n </ControlledSwitch>\r\n </div>\r\n <div className=\"flex flex-1 items-center\">\r\n <MultipleComboBox\r\n initialSelectedItems={handler.verbs || []}\r\n onChange={(val) => {\r\n setHandler((state) => ({ ...state, verbs: val }));\r\n }}\r\n touched={touchedFields.verbs}\r\n onBlur={() =>\r\n setTouchedFields((state) => ({ ...state, verbs: true }))\r\n }\r\n />\r\n <div className=\"flex items-center gap-0.5 px-2\">\r\n <Tooltip label=\"Duplicate Handler\" className=\"px-1 py-3\">\r\n <button\r\n className={cn(\r\n 'hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none opacity-50 cursor-not-allowed',\r\n )}\r\n >\r\n <FdDuplicate />\r\n </button>\r\n </Tooltip>\r\n <Tooltip label=\"Confirm Changes\" className=\"px-1 py-3\">\r\n <button\r\n className={cn(\r\n 'hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none',\r\n {\r\n 'opacity-50 cursor-not-allowed': !isValid(),\r\n },\r\n )}\r\n onClick={onConfirm}\r\n >\r\n <FdCheckCircle />\r\n </button>\r\n </Tooltip>\r\n <Tooltip label=\"Cancel Changes\" className=\"px-1 py-3\">\r\n <button\r\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none\"\r\n onClick={onCancel}\r\n >\r\n <FdClose />\r\n </button>\r\n </Tooltip>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const Handler: FC<HTTPHandler> = ({\r\n id,\r\n class: className,\r\n method,\r\n pattern,\r\n verbs,\r\n isExpanded,\r\n regexPattern,\r\n asRegex,\r\n}) => {\r\n const { attributes, listeners, setNodeRef, transform, transition } =\r\n useSortable({ id: id });\r\n\r\n const style = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n };\r\n\r\n const {\r\n dispatch,\r\n state: { editing },\r\n } = useHTTPHandlers();\r\n\r\n const appDispatch = useAppDispatch();\r\n\r\n const patternValue = asRegex ? regexPattern : pattern;\r\n\r\n const catalog = useAppSelector(selectCatalog);\r\n\r\n const singletons = Object.values(catalog?.singletons || {});\r\n\r\n const singletonMethods = singletons\r\n ?.find((item) => item.name === className)\r\n ?.methods.map(({ name, exposed }) => ({ name, exposed }));\r\n\r\n const notFoundSingltonError = singletons?.find(\r\n (item) => item.name === className,\r\n );\r\n\r\n const found = singletonMethods?.find((item) => item.name === method);\r\n\r\n const exposedError = found && found.exposed;\r\n\r\n return (\r\n <div className=\"odd:bg-grey-500\" ref={setNodeRef} style={style}>\r\n {editing === id ? (\r\n <HandlerEdit\r\n {...{\r\n id,\r\n class: className,\r\n method,\r\n pattern,\r\n verbs,\r\n isExpanded,\r\n regexPattern,\r\n asRegex,\r\n listeners,\r\n attributes,\r\n }}\r\n />\r\n ) : (\r\n <div\r\n className=\"flex items-center gap-2 rounded-b py-2.5 text-grey-50\"\r\n onDoubleClick={() => {\r\n $handlerSubject.next(editing);\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: id });\r\n }}\r\n >\r\n <div className=\"flex w-60 flex-shrink-0 items-center gap-1 \">\r\n <GrabHandle\r\n key=\"grab-handle\"\r\n listeners={listeners}\r\n attributes={attributes}\r\n />\r\n\r\n <div className=\"text-s w-full\">\r\n {className ? (\r\n <div\r\n className={cn(\r\n 'flex items-center gap-2',\r\n !notFoundSingltonError && 'text-red-400',\r\n )}\r\n >\r\n {!notFoundSingltonError && (\r\n <Tooltip\r\n label={`The singleton \"${className}\" doesn't exist.`}\r\n className=\"!bg-red-300 !text-red-400\"\r\n >\r\n <span className=\"rounded p-0.5 hover:bg-red-400/30 pt-0.5 h-5 w-5 flex justify-center content-center\">\r\n <FdWarningDanger className=\"inline h-4 w-4 pb-0.5 text-red-400\" />\r\n </span>\r\n </Tooltip>\r\n )}{' '}\r\n {className}\r\n </div>\r\n ) : (\r\n <span className=\"text-grey-200 italic\">undefined</span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"w-60 flex-shrink-0 \">\r\n <div className=\"text-s w-full\">\r\n {method ? (\r\n <div\r\n className={cn(\r\n 'flex items-center gap-2',\r\n !found && 'text-red-400',\r\n exposedError && 'text-yellow-400',\r\n )}\r\n >\r\n {!found && (\r\n <Tooltip\r\n label={`The method \"${method}\" doesn't exist.`}\r\n className=\"!bg-red-300 !text-red-400\"\r\n >\r\n <span className=\"rounded p-0.5 hover:bg-red-400/30 pt-0.5 h-5 w-5 flex justify-center content-center\">\r\n <FdWarningDanger className=\"inline h-4 w-4 pb-0.5 text-red-400\" />\r\n </span>\r\n </Tooltip>\r\n )}{' '}\r\n {exposedError && (\r\n <Tooltip\r\n label={`Method \"${method}\" is already exposed`}\r\n className=\"!bg-yellow-100 !text-yellow-500\"\r\n >\r\n <span className=\"rounded p-0.5 hover:bg-red-400/30 pt-0.5 h-5 w-5 flex justify-center content-center\">\r\n <FdWarningDanger className=\"inline h-4 w-4 pb-0.5 text-yellow-500\" />\r\n </span>\r\n </Tooltip>\r\n )}{' '}\r\n {method}\r\n </div>\r\n ) : (\r\n <span className=\"text-grey-200 italic\">undefined</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-s relative w-60 flex-shrink-0 \">\r\n {patternValue ? (\r\n <Tooltip\r\n label={\r\n asRegex\r\n ? generateRegexExample(patternValue)\r\n : `Requests starting with /${patternValue}/ will be handled`\r\n }\r\n >\r\n <span>{patternValue}</span>\r\n </Tooltip>\r\n ) : (\r\n <span className=\"text-grey-200 italic\">/</span>\r\n )}\r\n </div>\r\n\r\n <div className=\"px-5 w-20 flex justify-center text-grey-200\">\r\n {asRegex ? <FdRegex /> : <FdUnRegex />}\r\n </div>\r\n <div className=\"flex flex-1 items-center\">\r\n <div className=\"text-s w-full\">\r\n {verbs.length ? (\r\n verbs.join(',')\r\n ) : (\r\n <span className=\"text-grey-200 italic\">undefined</span>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-0.5 px-2\">\r\n <Tooltip label=\"Duplicate Handler\" className=\"px-1 py-3\">\r\n <button\r\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none\"\r\n onClick={() => dispatch({ type: 'DUPLICATE_HANDLER', id })}\r\n >\r\n <FdDuplicate />\r\n </button>\r\n </Tooltip>\r\n <Tooltip label=\"Edit Handler\" className=\"px-1 py-3\">\r\n <button\r\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none\"\r\n onClick={() => {\r\n $handlerSubject.next(editing);\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: id });\r\n }}\r\n >\r\n <FdPen />\r\n </button>\r\n </Tooltip>\r\n <Tooltip label=\"Delete Handler\" className=\"px-1 py-3\" placement=\"top-end\">\r\n <button\r\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none\"\r\n onClick={async () => {\r\n const { confirmed } = await appDispatch(\r\n openModal({\r\n title: 'Delete Handler',\r\n type: ModalType.CONFIRM,\r\n color: ModalColor.DANGER,\r\n message:\r\n 'Are you sure you want to remove this Handler?',\r\n icon: 'FdWarningDanger',\r\n }),\r\n ).unwrap();\r\n if (confirmed) {\r\n dispatch({ type: 'DELETE_HANDLER', id });\r\n }\r\n }}\r\n >\r\n <FdTrash />\r\n </button>\r\n </Tooltip>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { ChakraProvider } from '@chakra-ui/react';\nimport {\n closestCenter,\n DndContext,\n DragOverlay,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { FdCode, FdEmpty, FdInfoCircle, FdPlus } from '@ws-ui/icons';\nimport {\n selectTabByPath,\n setContent,\n useAppDispatch,\n useAppSelector,\n} from '@ws-ui/store';\nimport { chakraTheme } from '@ws-ui/webform-editor';\nimport { FC, useEffect, useState } from 'react';\nimport { generate } from 'short-uuid';\nimport { z } from 'zod';\nimport { SwitchToEditorIcon } from './SwitchToEditorIcon';\nimport { Handler } from './Handler';\nimport {\n $handlerSubject,\n HandlerProvider,\n HTTPHandler,\n useHTTPHandlers,\n} from './Provider';\nimport { Tooltip } from '@ws-ui/shared';\nimport './index.css';\n\nconst HandlerSchema = z.object({\n class: z.string().optional(),\n method: z.string().optional(),\n verbs: z.string().optional(),\n id: z.string().optional(),\n pattern: z.string().optional(),\n regexPattern: z.string().optional(),\n});\n\nconst HandlersSchema = z.array(HandlerSchema);\n\nexport type Props = {\n content: string | HTTPHandler[];\n path: string;\n};\n\nconst Editor: FC<{ path: string }> = ({ path }) => {\n const tab = useAppSelector(selectTabByPath(path));\n const {\n dispatch,\n state: { content: items, editing },\n } = useHTTPHandlers();\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const activeItem = items.find((item) => item.id === activeId);\n\n const appDispatch = useAppDispatch();\n\n useEffect(() => {\n const newContent = JSON.stringify(\n items.map(\n ({ isExpanded: _, asRegex, pattern, regexPattern, ...item }) => {\n const rest = asRegex ? { regexPattern } : { pattern };\n\n return {\n ...item,\n verbs: item.verbs?.join(','),\n ...rest,\n };\n },\n ),\n null,\n 2,\n );\n\n const oldContent =\n typeof tab?.content === 'string'\n ? tab.content\n : JSON.stringify(tab?.content, null, 2);\n\n if (newContent === oldContent) {\n return;\n }\n\n appDispatch(\n setContent({\n path,\n content: newContent,\n }),\n );\n }, [items]);\n\n return (\n <div className=\"bg-grey-700 flex h-full w-full flex-col text-white\">\n <div className=\"flex items-center justify-between border-b border-black p-2\">\n {tab && (\n <SwitchToEditorIcon\n label=\"Switch to text Editor\"\n Icon={FdCode}\n tab={tab}\n editor={{\n config: { language: 'json' },\n key: 'editors:code',\n }}\n />\n )}\n <p className=\"text-grey-100 text-s flex items-center gap-1\">\n <FdInfoCircle className=\"inline text-base text-white\" /> HTTP handlers\n are evaluated in the order they are declared\n </p>\n </div>\n <div className=\"mt-1 flex flex-1 flex-col overflow-x-auto px-4\">\n {items.length ? (\n <div className=\"flex h-full min-w-[1200px] flex-1 flex-col\">\n <div className=\"mb-3 flex items-center gap-2 border-b\">\n <div className=\"w-60 flex-shrink-0 text-xs\">\n <span className=\"pl-6\">Class</span>\n </div>\n <div className=\"w-60 flex-shrink-0 text-xs\">Method</div>\n <div className=\"w-60 flex-shrink-0 text-xs\">Pattern</div>\n <div className=\"w-20 px-2 text-center text-xs\">As Regex</div>\n <div className=\"flex flex-1 items-center justify-between text-xs\">\n <span>Verbs</span>\n <div className=\"flex items-center gap-2 text-2xl\">\n <Tooltip label=\"Add a new HTTP Handler\">\n <button\n disabled={Boolean(editing)}\n onClick={() => {\n $handlerSubject.next(editing);\n dispatch({\n type: 'ADD_HANDLER',\n payload: {\n class: '',\n isExpanded: true,\n method: '',\n pattern: '',\n verbs: [],\n regexPattern: '',\n },\n });\n }}\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <FdPlus className=\"h-5 w-5\" />\n </button>\n </Tooltip>\n </div>\n </div>\n </div>\n <div className=\"py-3\">\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={(event) => {\n setActiveId(event.active.id);\n }}\n onDragEnd={(event) => {\n const { active, over } = event;\n\n setActiveId(null);\n\n if (!active || !over) return;\n\n if (active.id !== over?.id) {\n const oldIndex = items\n .map((item) => item.id)\n .indexOf(active.id);\n const newIndex = items\n .map((item) => item.id)\n .indexOf(over.id);\n\n dispatch({\n type: 'UPDATE_HANDLERS',\n payload: arrayMove(items, oldIndex, newIndex),\n });\n }\n }}\n >\n <SortableContext\n items={items}\n strategy={verticalListSortingStrategy}\n >\n {items.map(({ id, ...props }) => (\n <Handler key={id} id={id} {...props} />\n ))}\n </SortableContext>\n <DragOverlay>\n {activeId && activeItem ? (\n <div className=\"opacity-10\">\n <Handler {...activeItem} />\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </div>\n </div>\n ) : (\n <div className=\"mt-6\">\n <div>\n <FdEmpty className=\"text-grey-200 mx-auto h-9 w-9\" />\n </div>\n <div className=\"text-s text-grey-200 mx-auto mt-3 max-w-sm text-center\">\n There are no http handlers configured yet <br />\n Please add a new one to add a new one.\n </div>\n <div className=\"mt-3 flex items-center justify-center\">\n <button\n onClick={() => {\n $handlerSubject.next(editing);\n dispatch({\n type: 'ADD_HANDLER',\n payload: {\n class: '',\n isExpanded: true,\n method: '',\n pattern: '',\n verbs: [],\n regexPattern: '',\n },\n });\n }}\n className=\"bg-primary-dark text-s rounded px-2 py-1 flex items-center gap-1\"\n >\n <FdPlus className=\"inline text-white h-4 w-4\" /> Add New Handler\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport const HTTPHandlersEditor: FC<Props> = ({ content, path }) => {\n const [error, setError] = useState<string | null>(null);\n\n function safeParseJSON(json: string) {\n let parsed;\n\n try {\n parsed = JSON.parse(json);\n } catch (e) {\n setError('HTTP Handler JSON is invalid');\n parsed = [];\n }\n\n return parsed;\n }\n\n const contentToRender =\n typeof content === 'string' ? safeParseJSON(content) : content;\n\n const validationResult = HandlersSchema.safeParse(contentToRender);\n\n if (!validationResult.success || error) {\n throw new Error('Invalid JSON');\n }\n\n const initialContent = contentToRender.map((item: HTTPHandler) => {\n const asRegex = Boolean(item.regexPattern);\n return {\n ...item,\n id: item.id ?? generate(),\n verbs: (item.verbs as unknown as string | undefined)\n ?.split(',')\n .map((item) => item.toLocaleUpperCase())\n .filter(Boolean),\n asRegex,\n };\n });\n\n return (\n <ChakraProvider theme={chakraTheme}>\n <HandlerProvider content={initialContent}>\n <Editor path={path} />\n </HandlerProvider>\n </ChakraProvider>\n );\n};\n","import { FC } from 'react';\r\nimport { HTTP_HANDLERS_TAB_PATH } from '@ws-ui/shared';\r\nimport { getStore, ReduxProvider } from '@ws-ui/store';\r\nimport { HTTPHandlersEditor, Props } from '../Editor';\r\n\r\ninterface IStandaloneProps extends Omit<Props, 'path'> {}\r\n\r\nexport const Standalone: FC<IStandaloneProps> = (props) => {\r\n return (\r\n <ReduxProvider store={getStore()}>\r\n <div className=\"h-screen bg-grey-900\">\r\n <HTTPHandlersEditor\r\n path={HTTP_HANDLERS_TAB_PATH}\r\n {...props}\r\n />\r\n </div>\r\n </ReduxProvider>\r\n );\r\n};\r\n"],"names":["SwitchToEditorIcon","label","Icon","tab","editor","onBeforeClick","dispatch","useAppDispatch","jsx","ToolbarIcon","switchEditor","HandlerContext","createContext","$handlerSubject","Subject","handlerReducer","state","action","lastEditing","item","omit","t","id","generate","handler","handlerToDuplicate","found","HandlerProvider","children","content","initialState","useReducer","useEffect","useHTTPHandlers","context","useContext","MultipleComboBox","initialSelectedItems","onChange","touched","onBlur","verbs","getFilteredverbs","selectedItems","inputValue","lowerCasedInputValue","method","setInputValue","useState","setSelectedItems","items","useMemo","getSelectedItemProps","getDropdownProps","removeSelectedItem","useMultipleSelection","newSelectedItems","type","isOpen","getToggleButtonProps","getMenuProps","getInputProps","highlightedIndex","getItemProps","selectedItem","useCombobox","actionAndChanges","changes","newInputValue","newSelectedItem","jsxs","cn","selectedItemForRender","index","e","FdCloseNaked","FdDown","Select","value","options","errorMessage","query","setQuery","notFound","filteredOptions","sgltn","Combobox","open","sngltn","event","Fragment","Transition","FdEmpty","option","active","selected","MethodSelector","exposed","val","FdWarningDanger","GrabHandle","listeners","attributes","FdDragHandle","generateRegexExample","regex","regexExample","RandExp","_a","HandlerEdit","className","pattern","regexPattern","asRegex","setHandler","catalog","useAppSelector","selectCatalog","singletons","singletonMethods","name","newlyCreatedHandlerID","appDispatch","isValid","onConfirm","onCancel","oldHandler","newHandler","isEqual","confirmed","openModal","ModalType","ModalColor","useHotkeys","lastEditingID","touchedFields","setTouchedFields","methodErrors","patternErrors","Tooltip","FdInfoCircle","ControlledSwitch","rest","FdDuplicate","FdCheckCircle","FdClose","Handler","isExpanded","setNodeRef","transform","transition","useSortable","style","CSS","editing","patternValue","notFoundSingltonError","exposedError","FdRegex","FdUnRegex","FdPen","FdTrash","HandlerSchema","z","HandlersSchema","Editor","path","selectTabByPath","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","activeId","setActiveId","activeItem","newContent","_","oldContent","setContent","FdCode","FdPlus","DndContext","closestCenter","over","oldIndex","newIndex","arrayMove","SortableContext","verticalListSortingStrategy","props","DragOverlay","HTTPHandlersEditor","error","setError","safeParseJSON","json","parsed","contentToRender","initialContent","ChakraProvider","chakraTheme","Standalone","ReduxProvider","getStore","HTTP_HANDLERS_TAB_PATH"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/SwitchToEditorIcon.tsx","../src/Provider/index.tsx","../src/Handler/index.tsx","../src/Editor.tsx","../src/Standalone/index.tsx"],"sourcesContent":["import { IconType } from '@ws-ui/icons';\nimport { ToolbarIcon, IEditor, ITab } from '@ws-ui/shared';\nimport { switchEditor, useAppDispatch } from '@ws-ui/store';\nimport { FC } from 'react';\n\ninterface SwitchToEditorIconProps {\n label: string;\n Icon: IconType;\n tab: ITab;\n editor: IEditor;\n onBeforeClick?: () => void;\n}\n\nexport const SwitchToEditorIcon: FC<SwitchToEditorIconProps> = ({\n label,\n Icon,\n tab,\n editor,\n onBeforeClick,\n}) => {\n const dispatch = useAppDispatch();\n\n return (\n <ToolbarIcon\n label={label}\n Icon={Icon}\n as=\"button\"\n onClick={() => {\n onBeforeClick?.();\n dispatch(\n switchEditor({\n tab,\n editor,\n }),\n );\n }}\n />\n );\n};\n","import { omit } from 'lodash';\r\nimport {\r\n createContext,\r\n useReducer,\r\n useContext,\r\n ReactNode,\r\n useEffect,\r\n} from 'react';\r\nimport { Subject } from 'rxjs';\r\nimport { generate } from 'short-uuid';\r\n\r\n// Define types\r\nexport type HTTPVerb = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n\r\nexport type HTTPHandler = {\r\n id: string; // Unique identifier\r\n class: string;\r\n method: string;\r\n pattern: string;\r\n regexPattern: string;\r\n verbs: HTTPVerb[];\r\n isExpanded: boolean;\r\n asRegex?: boolean;\r\n};\r\n\r\ntype HandlerState = {\r\n content: HTTPHandler[];\r\n editing: string | null;\r\n newlyCreatedHandlerID: string | null;\r\n};\r\n\r\ntype HandlerContextType = {\r\n state: HandlerState;\r\n dispatch: React.Dispatch<HandlerAction>;\r\n};\r\n\r\n// Create Context\r\nconst HandlerContext = createContext<HandlerContextType | undefined>(undefined);\r\n\r\nexport const $handlerSubject = new Subject();\r\n\r\n// Define action types\r\ntype HandlerAction =\r\n | { type: 'ADD_HANDLER'; payload: Omit<HTTPHandler, 'id'> }\r\n | { type: 'UPDATE_HANDLER'; id: string; payload: Partial<HTTPHandler> }\r\n | { type: 'DELETE_HANDLER'; id: string }\r\n | { type: 'TOGGLE_EXPANDED'; id: string }\r\n | { type: 'DUPLICATE_HANDLER'; id: string }\r\n | { type: 'TOGGLE_ALL_EXPANDED'; payload: boolean }\r\n | { type: 'UPDATE_HANDLERS'; payload: HTTPHandler[] }\r\n | { type: 'SYNC_DATA'; payload: HTTPHandler[] }\r\n | { type: 'SET_EDITING_HANDLER'; payload: string | null };\r\n\r\n// Reducer function\r\nconst handlerReducer = (\r\n state: HandlerState,\r\n action: HandlerAction,\r\n): HandlerState => {\r\n switch (action.type) {\r\n case 'UPDATE_HANDLERS':\r\n return {\r\n ...state,\r\n content: action.payload,\r\n };\r\n case 'SET_EDITING_HANDLER': {\r\n // $handlerSubject.next(lastEditing.id);\r\n\r\n if (action.payload && action.payload !== state.editing) {\r\n const lastEditing = state.content.find(\r\n (item) => item.id === state.editing,\r\n );\r\n\r\n if (lastEditing) {\r\n const isEmpty =\r\n !Object.values(\r\n omit(lastEditing, ['id', 'verbs', 'asRegex', 'isExpanded']),\r\n ).some(Boolean) && lastEditing.verbs.length === 0;\r\n\r\n if (isEmpty) {\r\n return {\r\n ...state,\r\n content: state.content.filter((t) => t.id !== lastEditing.id),\r\n editing: action.payload,\r\n };\r\n }\r\n }\r\n }\r\n\r\n return {\r\n ...state,\r\n editing: action.payload,\r\n };\r\n }\r\n case 'ADD_HANDLER': {\r\n const id = generate();\r\n return {\r\n ...state,\r\n content: [...state.content, { ...action.payload, id }],\r\n editing: id,\r\n newlyCreatedHandlerID: id,\r\n };\r\n }\r\n case 'UPDATE_HANDLER':\r\n return {\r\n ...state,\r\n content: state.content.map((handler) =>\r\n handler.id === action.id\r\n ? { ...handler, ...action.payload }\r\n : handler,\r\n ),\r\n newlyCreatedHandlerID: null,\r\n };\r\n case 'DELETE_HANDLER':\r\n return {\r\n ...state,\r\n content: state.content.filter((handler) => handler.id !== action.id),\r\n };\r\n case 'TOGGLE_EXPANDED':\r\n return {\r\n ...state,\r\n content: state.content.map((handler) =>\r\n handler.id === action.id\r\n ? { ...handler, isExpanded: !handler.isExpanded }\r\n : handler,\r\n ),\r\n };\r\n\r\n case 'DUPLICATE_HANDLER': {\r\n const handlerToDuplicate = state.content.find(\r\n (handler) => handler.id === action.id,\r\n );\r\n\r\n if (!handlerToDuplicate) return state;\r\n return {\r\n ...state,\r\n content: [\r\n ...state.content,\r\n { ...handlerToDuplicate, id: generate(), isExpanded: true },\r\n ],\r\n };\r\n }\r\n case 'TOGGLE_ALL_EXPANDED':\r\n return {\r\n ...state,\r\n content: state.content.map((handler) => ({\r\n ...handler,\r\n isExpanded: action.payload,\r\n })),\r\n };\r\n case 'SYNC_DATA':\r\n return {\r\n ...state,\r\n content: action.payload.map((handler) => {\r\n const found = state.content.find((item) => item.id === handler.id);\r\n\r\n if (found) {\r\n return {\r\n ...handler,\r\n ...found,\r\n };\r\n }\r\n\r\n return handler;\r\n }),\r\n };\r\n default:\r\n throw new Error('Unknown action type');\r\n }\r\n};\r\n\r\ntype HandlerProviderProps = {\r\n children: ReactNode;\r\n content: HTTPHandler[];\r\n};\r\n\r\nexport const HandlerProvider: React.FC<HandlerProviderProps> = ({\r\n children,\r\n content,\r\n}) => {\r\n const initialState: HandlerState = {\r\n content,\r\n editing: null,\r\n newlyCreatedHandlerID: null,\r\n };\r\n const [state, dispatch] = useReducer(handlerReducer, initialState);\r\n\r\n useEffect(() => {\r\n dispatch({\r\n type: 'SYNC_DATA',\r\n payload: content,\r\n });\r\n }, [content]);\r\n\r\n return (\r\n <HandlerContext.Provider value={{ state, dispatch }}>\r\n {children}\r\n </HandlerContext.Provider>\r\n );\r\n};\r\n\r\n// Custom Hook to Use Handler Context\r\nexport const useHTTPHandlers = (): HandlerContextType => {\r\n const context = useContext(HandlerContext);\r\n if (!context) {\r\n throw new Error('useHTTPHandlers must be used within a HandlerProvider');\r\n }\r\n return context;\r\n};\r\n","import { useSortable } from '@dnd-kit/sortable';\r\nimport { CSS } from '@dnd-kit/utilities';\r\nimport { Combobox, Transition } from '@headlessui/react';\r\nimport {\r\n FdCheckCircle,\r\n FdClose,\r\n FdCloseNaked,\r\n FdDown,\r\n FdDragHandle,\r\n FdDuplicate,\r\n FdEmpty,\r\n FdInfoCircle,\r\n FdPen,\r\n FdRegex,\r\n FdTrash,\r\n FdUnRegex,\r\n FdWarningDanger,\r\n} from '@ws-ui/icons';\r\nimport {\r\n ControlledSwitch,\r\n ModalColor,\r\n ModalType,\r\n useHotkeys,\r\n Tooltip,\r\n} from '@ws-ui/shared';\r\nimport {\r\n openModal,\r\n selectCatalog,\r\n useAppDispatch,\r\n useAppSelector,\r\n} from '@ws-ui/store';\r\nimport cn from 'classnames';\r\nimport { useCombobox, useMultipleSelection } from 'downshift';\r\nimport { FC, Fragment, useEffect, useMemo, useState } from 'react';\r\nimport {\r\n $handlerSubject,\r\n HTTPHandler,\r\n HTTPVerb,\r\n useHTTPHandlers,\r\n} from '../Provider';\r\nimport { SyntheticListenerMap } from '@dnd-kit/core/dist/hooks/utilities';\r\nimport { DraggableAttributes } from '@dnd-kit/core';\r\nimport { omit, isEqual } from 'lodash';\r\nimport RandExp from 'randexp';\r\n\r\nconst MultipleComboBox: FC<{\r\n initialSelectedItems: HTTPVerb[];\r\n onChange: (val: HTTPVerb[]) => void;\r\n touched?: boolean;\r\n onBlur?: () => void;\r\n}> = ({ initialSelectedItems, onChange, touched, onBlur }) => {\r\n const verbs: HTTPVerb[] = ['GET', 'POST', 'PUT', 'DELETE'];\r\n\r\n function getFilteredverbs(selectedItems: string[], inputValue: string) {\r\n const lowerCasedInputValue = inputValue.toLowerCase();\r\n\r\n return verbs.filter(function filtermethod(method) {\r\n return (\r\n !selectedItems.includes(method) &&\r\n method.toLowerCase().includes(lowerCasedInputValue)\r\n );\r\n });\r\n }\r\n\r\n const [inputValue, setInputValue] = useState('');\r\n const [selectedItems, setSelectedItems] = useState(initialSelectedItems);\r\n\r\n useEffect(() => {\r\n setSelectedItems(initialSelectedItems);\r\n }, [initialSelectedItems]);\r\n\r\n const items: string[] = useMemo(\r\n () => getFilteredverbs(selectedItems, inputValue),\r\n [selectedItems, inputValue],\r\n );\r\n\r\n const { getSelectedItemProps, getDropdownProps, removeSelectedItem } =\r\n useMultipleSelection({\r\n selectedItems,\r\n onStateChange({ selectedItems: newSelectedItems = [], type }) {\r\n switch (type) {\r\n case useMultipleSelection.stateChangeTypes\r\n .SelectedItemKeyDownBackspace:\r\n case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownDelete:\r\n case useMultipleSelection.stateChangeTypes.DropdownKeyDownBackspace:\r\n case useMultipleSelection.stateChangeTypes.FunctionRemoveSelectedItem:\r\n setSelectedItems(newSelectedItems);\r\n break;\r\n default:\r\n break;\r\n }\r\n },\r\n });\r\n\r\n const {\r\n isOpen,\r\n getToggleButtonProps,\r\n getMenuProps,\r\n getInputProps,\r\n highlightedIndex,\r\n getItemProps,\r\n selectedItem,\r\n } = useCombobox({\r\n items,\r\n itemToString(item) {\r\n return item ? item : '';\r\n },\r\n defaultHighlightedIndex: 0, // after selection, highlight the first item.\r\n selectedItem: null,\r\n inputValue,\r\n stateReducer(state, actionAndChanges) {\r\n const { changes, type } = actionAndChanges;\r\n\r\n switch (type) {\r\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\r\n case useCombobox.stateChangeTypes.ItemClick:\r\n return {\r\n ...changes,\r\n isOpen: true, // keep the menu open after selection.\r\n highlightedIndex: 0, // with the first option highlighted.\r\n };\r\n default:\r\n return changes;\r\n }\r\n },\r\n onStateChange({\r\n inputValue: newInputValue = '',\r\n type,\r\n selectedItem: newSelectedItem,\r\n }) {\r\n switch (type) {\r\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\r\n case useCombobox.stateChangeTypes.ItemClick:\r\n case useCombobox.stateChangeTypes.InputBlur:\r\n if (newSelectedItem) {\r\n setSelectedItems([...selectedItems, newSelectedItem as HTTPVerb]);\r\n setInputValue('');\r\n }\r\n break;\r\n\r\n case useCombobox.stateChangeTypes.InputChange:\r\n setInputValue(newInputValue);\r\n\r\n break;\r\n default:\r\n break;\r\n }\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n onChange(selectedItems);\r\n }, [selectedItems]);\r\n\r\n return (\r\n <div className=\"relative flex-1\">\r\n <div\r\n className={cn(\r\n 'bg-grey-300 focus-within:ring-1 focus-within:ring-primary-dark relative flex items-center w-full cursor-default overflow-hidden rounded p-px text-left focus:outline-none',\r\n {\r\n 'ring-1 ring-primary-dark rounded-b-none': isOpen && items.length,\r\n 'ring-1 ring-red-400 overflow-visible':\r\n selectedItems.length === 0 && touched,\r\n },\r\n )}\r\n onBlur={onBlur}\r\n >\r\n {selectedItems.length === 0 && !isOpen && touched && (\r\n <div className=\"absolute inset-x-0 top-[25px] z-[1] rounded-b-sm bg-red-200 px-1 text-xs text-red-600 ring-1 ring-red-600\">\r\n {selectedItems.length === 0 && 'At least one HTTP verb is required'}\r\n </div>\r\n )}\r\n\r\n {selectedItems.map(\r\n function renderSelectedItem(selectedItemForRender, index) {\r\n return (\r\n <span\r\n className={cn(\r\n 'bg-grey-600 text-s mr-1 flex items-center rounded px-1 py-0.5 uppercase',\r\n {\r\n 'bg-red-400': !verbs.includes(selectedItemForRender),\r\n },\r\n )}\r\n key={`selected-item-${index}-${selectedItemForRender}`}\r\n {...getSelectedItemProps({\r\n selectedItem: selectedItemForRender,\r\n index,\r\n })}\r\n >\r\n {selectedItemForRender}\r\n\r\n <span\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n removeSelectedItem(selectedItemForRender);\r\n }}\r\n className=\"hover:bg-primary-hover ml-2 inline-block cursor-pointer rounded p-0.5 text-gray-100 hover:text-white active:outline-none\"\r\n >\r\n <FdCloseNaked />\r\n </span>\r\n </span>\r\n );\r\n },\r\n )}\r\n <input\r\n {...getInputProps(\r\n getDropdownProps(\r\n { preventKeyAction: isOpen },\r\n { suppressRefError: true },\r\n ),\r\n )}\r\n className=\"flex-grow border-none bg-transparent px-1 py-1 text-xs outline-none\"\r\n placeholder={selectedItems.length === 0 ? 'Select HTTP verbs' : ''}\r\n size={1}\r\n />\r\n <button\r\n className=\"absolute inset-y-0 right-0 flex items-center pr-2\"\r\n type=\"button\"\r\n {...getToggleButtonProps()}\r\n >\r\n <FdDown className=\"h-3 w-3 text-gray-50\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n <ul\r\n className={`ring-primary-dark bg-grey-900 text-s absolute z-10 w-full rounded-b ring-1 p-1 text-white ${\r\n !(isOpen && items.length) && 'hidden'\r\n }`}\r\n {...getMenuProps()}\r\n >\r\n {isOpen &&\r\n items.map((item, index) => (\r\n <li\r\n className={cn(\r\n highlightedIndex === index && 'bg-primary-hover',\r\n selectedItem === item && 'font-bold',\r\n 'flex flex-col p-1 shadow-sm',\r\n )}\r\n key={`${item}${index}`}\r\n {...getItemProps({ item, index })}\r\n >\r\n <span>{item}</span>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n};\r\n\r\nconst Select = ({\r\n value,\r\n options,\r\n errorMessage = '',\r\n onChange,\r\n onBlur,\r\n}: {\r\n value: string;\r\n onChange: (val: string) => void;\r\n options: { name: string }[];\r\n errorMessage?: string;\r\n onBlur?: () => void;\r\n}) => {\r\n const [query, setQuery] = useState('');\r\n\r\n const notFound = options.find((item) => item.name === value);\r\n\r\n const filteredOptions =\r\n query === ''\r\n ? options\r\n : options.filter((sgltn) => {\r\n return sgltn.name.toLowerCase().includes(query.toLowerCase());\r\n });\r\n\r\n return (\r\n <Combobox\r\n key={value}\r\n value={{ name: value }}\r\n onChange={(s) => onChange(s.name)}\r\n >\r\n {({ open }) => (\r\n <div className=\"relative w-full\">\r\n <div\r\n className={cn(\r\n 'bg-grey-300 focus-within:ring-1 focus-within:ring-primary-dark relative w-full cursor-default overflow-hidden rounded text-left inline-flex',\r\n {\r\n 'ring-1 ring-red-400': (!notFound && value) || errorMessage,\r\n 'ring-1 ring-primary-dark rounded-b-none': open,\r\n 'overflow-visible': !notFound && !open && errorMessage,\r\n },\r\n )}\r\n >\r\n <Combobox.Input\r\n className={cn(\r\n 'bg-grey-300 text-s w-full border-none py-1 px-2 focus:outline-none rounded',\r\n {\r\n '!text-red-400': !notFound,\r\n },\r\n )}\r\n displayValue={(sngltn: { name: string }) => sngltn.name}\r\n onChange={(event) => setQuery(event.target.value)}\r\n style={{ caretColor: 'white' }}\r\n onBlur={onBlur}\r\n />\r\n <span className=\"inset-y-0 right-0 flex items-center gap-1 pr-2\">\r\n {!notFound && !open && errorMessage && (\r\n <div className=\"absolute inset-x-0 top-[25px] z-[1] rounded-b-sm bg-red-200 px-1 text-xs text-red-600 ring-1 ring-red-600\">\r\n {errorMessage}\r\n </div>\r\n )}\r\n\r\n {value ? (\r\n <>\r\n <button\r\n onClick={() => {\r\n setQuery('');\r\n onChange('');\r\n }}\r\n >\r\n <FdCloseNaked\r\n className=\"text-grey-50 h-3 w-3\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n <span className=\"bg-grey-50 h-3 w-[1px] rounded-full\"></span>\r\n </>\r\n ) : null}\r\n <Combobox.Button>\r\n <FdDown className=\"text-grey-50 h-3 w-3\" aria-hidden=\"true\" />\r\n </Combobox.Button>\r\n </span>\r\n </div>\r\n\r\n <Transition\r\n as={Fragment}\r\n leave=\"transition ease-in durati pb-0.5on-100\"\r\n leaveFrom=\"opacity-100\"\r\n leaveTo=\"opacity-0\"\r\n afterLeave={() => setQuery('')}\r\n >\r\n <Combobox.Options className=\"bg-grey-900 text-s text-grey-100 sm:text-s absolute z-50 max-h-60 w-full overflow-auto rounded-b ring-1 ring-primary-dark p-1 focus:outline-none\">\r\n {filteredOptions.length === 0 ? (\r\n <div className=\"text-s text-grey-200 relative cursor-default select-none px-0.5 py-0.5 \">\r\n <FdEmpty className=\"inline h-4 w-4\" /> Nothing found.\r\n </div>\r\n ) : (\r\n filteredOptions.map((option, index) => (\r\n <Combobox.Option\r\n key={index}\r\n className={({ active }) =>\r\n `relative cursor-default select-none ${\r\n active ? 'bg-primary-hover' : ''\r\n }`\r\n }\r\n value={option}\r\n >\r\n {({ selected }) => (\r\n <>\r\n <span\r\n className={`block truncate p-2 py-1 ${\r\n selected\r\n ? 'bg-primary-dark font-medium text-white'\r\n : 'font-normal'\r\n }`}\r\n >\r\n {option.name}\r\n </span>\r\n </>\r\n )}\r\n </Combobox.Option>\r\n ))\r\n )}\r\n </Combobox.Options>\r\n </Transition>\r\n </div>\r\n )}\r\n </Combobox>\r\n );\r\n};\r\n\r\nconst MethodSelector = ({\r\n value,\r\n options,\r\n onChange,\r\n errorMessage,\r\n onBlur,\r\n}: {\r\n value: string;\r\n onChange: (val: string) => void;\r\n options: { name: string; exposed: boolean }[];\r\n errorMessage?: string;\r\n onBlur?: () => void;\r\n}) => {\r\n const [query, setQuery] = useState('');\r\n\r\n const found = options.find((item) => item.name === value);\r\n\r\n const exposed = found && found.exposed;\r\n\r\n const filteredOptions =\r\n query === ''\r\n ? options\r\n : options.filter((sgltn) => {\r\n return sgltn.name.toLowerCase().includes(query.toLowerCase());\r\n });\r\n\r\n return (\r\n <Combobox value={{ name: value }} onChange={(val) => onChange(val.name)}>\r\n {({ open }) => (\r\n <div className=\"relative\">\r\n <div\r\n className={cn(\r\n 'bg-grey-300 focus-within:ring-1 focus-within:ring-primary-dark relative w-full cursor-default overflow-hidden rounded text-left inline-flex',\r\n {\r\n 'ring-1 ring-red-400': errorMessage,\r\n 'ring-1 ring-yellow-500': exposed,\r\n 'ring-1 ring-primary-dark rounded-b-none': open,\r\n 'overflow-visible': !open && errorMessage,\r\n },\r\n )}\r\n >\r\n <Combobox.Input\r\n className={cn(\r\n 'bg-grey-300 text-s w-full border-none py-1 px-2 focus:outline-none truncate rounded',\r\n {\r\n '!text-red-400': errorMessage,\r\n '!text-yellow-500': exposed,\r\n },\r\n )}\r\n style={{ caretColor: 'white' }}\r\n displayValue={(sngltn: { name: string }) => sngltn.name}\r\n onChange={(event) => setQuery(event.target.value)}\r\n onBlur={onBlur}\r\n />\r\n {!open && errorMessage && (\r\n <div\r\n className={cn(\r\n 'absolute inset-x-0 top-[25px] z-[1] rounded-b-sm bg-red-200 px-1 text-xs text-red-600 ring-1 ring-red-600',\r\n { '!text-yellow-500 ring-yellow-500 bg-white': exposed },\r\n )}\r\n >\r\n {errorMessage}\r\n </div>\r\n )}\r\n <span className=\"inset-y-0 right-0 flex items-center gap-1 pr-2\">\r\n {value ? (\r\n <>\r\n <button\r\n onClick={() => {\r\n setQuery('');\r\n onChange('');\r\n }}\r\n >\r\n <FdCloseNaked\r\n className=\"text-grey-50 h-3 w-3\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n <span className=\"bg-grey-50 h-3 w-[1px] rounded-full\"></span>\r\n </>\r\n ) : null}\r\n <Combobox.Button>\r\n <FdDown className=\"text-grey-50 h-3 w-3\" aria-hidden=\"true\" />\r\n </Combobox.Button>\r\n </span>\r\n </div>\r\n\r\n <Transition\r\n as={Fragment}\r\n leave=\"transition ease-in duration-100\"\r\n leaveFrom=\"opacity-100\"\r\n leaveTo=\"opacity-0\"\r\n afterLeave={() => setQuery('')}\r\n >\r\n <Combobox.Options className=\"bg-grey-900 text-s text-grey-100 sm:text-s absolute z-50 max-h-60 w-full overflow-auto rounded-b ring-1 ring-primary-dark p-1 focus:outline-none\">\r\n {!filteredOptions.length ? (\r\n <div className=\"text-s text-grey-200 relative cursor-default select-none px-0.5 py-0.5\">\r\n <FdEmpty className=\"inline h-4 w-4\" /> Nothing found.\r\n </div>\r\n ) : (\r\n filteredOptions.map((option, index) => (\r\n <Combobox.Option\r\n key={index}\r\n className={({ active }) =>\r\n `relative cursor-default select-none ${\r\n active ? 'bg-primary-hover' : ''\r\n }`\r\n }\r\n value={option}\r\n >\r\n {({ selected }) => (\r\n <>\r\n <span\r\n className={`text-s flex items-center gap-2 truncate p-2 py-1 ${\r\n selected\r\n ? 'bg-primary-dark font-medium text-white'\r\n : 'font-normal'\r\n }`}\r\n >\r\n {option.exposed && (\r\n <FdWarningDanger className=\"text-yellow-500\" />\r\n )}\r\n <span className=\"flex-1 truncate\" title={option.name}>\r\n {option.name}\r\n </span>\r\n </span>\r\n </>\r\n )}\r\n </Combobox.Option>\r\n ))\r\n )}\r\n </Combobox.Options>\r\n </Transition>\r\n </div>\r\n )}\r\n </Combobox>\r\n );\r\n};\r\n\r\nconst GrabHandle: FC<{\r\n attributes: DraggableAttributes;\r\n listeners: SyntheticListenerMap | undefined;\r\n}> = ({ listeners, attributes }) => {\r\n return (\r\n <button {...attributes} {...listeners}>\r\n <FdDragHandle />\r\n </button>\r\n );\r\n};\r\n\r\nconst generateRegexExample = (regex: string) => {\r\n if (!regex) return '';\r\n let regexExample;\r\n RandExp.prototype.max = 8;\r\n try {\r\n regexExample = new RandExp(regex)?.gen();\r\n } catch {\r\n regexExample = '';\r\n }\r\n return `Requests matching regex will be handled example: ${regexExample}`;\r\n};\r\n\r\nconst HandlerEdit: FC<\r\n HTTPHandler & {\r\n attributes: DraggableAttributes;\r\n listeners: SyntheticListenerMap | undefined;\r\n }\r\n> = ({\r\n id,\r\n class: className,\r\n method,\r\n pattern,\r\n verbs,\r\n regexPattern,\r\n asRegex,\r\n listeners,\r\n attributes,\r\n}) => {\r\n const [handler, setHandler] = useState({\r\n className,\r\n method,\r\n pattern,\r\n verbs,\r\n asRegex,\r\n regexPattern,\r\n });\r\n\r\n const catalog = useAppSelector(selectCatalog);\r\n\r\n const singletons = Object.values(catalog?.singletons || {});\r\n\r\n const singletonMethods = singletons\r\n .find((item) => item.name === handler.className)\r\n ?.methods.map(({ name, exposed }) => ({ name, exposed }));\r\n\r\n const {\r\n dispatch,\r\n state: { newlyCreatedHandlerID },\r\n } = useHTTPHandlers();\r\n\r\n const appDispatch = useAppDispatch();\r\n\r\n function isValid() {\r\n const { className, method, asRegex, regexPattern, pattern, verbs } =\r\n handler;\r\n return !!(\r\n className &&\r\n method &&\r\n (asRegex ? regexPattern : !pattern.endsWith('/')) &&\r\n verbs.length\r\n );\r\n }\r\n\r\n function onConfirm() {\r\n if (isValid()) {\r\n const { className, method, asRegex, regexPattern, pattern, verbs } =\r\n handler;\r\n const rest = asRegex ? { regexPattern } : { pattern };\r\n dispatch({\r\n type: 'UPDATE_HANDLER',\r\n id,\r\n payload: {\r\n class: className,\r\n method,\r\n verbs,\r\n asRegex,\r\n ...rest,\r\n },\r\n });\r\n\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: null });\r\n }\r\n }\r\n\r\n const onCancel = async () => {\r\n const oldHandler = {\r\n className,\r\n method,\r\n pattern,\r\n regexPattern,\r\n verbs,\r\n };\r\n\r\n const newHandler = omit(handler, ['id', 'isExpanded']);\r\n if (!isValid()) {\r\n dispatch({ type: 'DELETE_HANDLER', id: `${newlyCreatedHandlerID}` });\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: null });\r\n return;\r\n }\r\n\r\n if (!isEqual(oldHandler, newHandler)) {\r\n const { confirmed } = await appDispatch(\r\n openModal({\r\n title: 'Cancel Changes',\r\n type: ModalType.CONFIRM,\r\n color: ModalColor.DANGER,\r\n message:\r\n 'Are you sure you want to cancel changes made to this Handler?',\r\n icon: 'FdWarningDanger',\r\n }),\r\n ).unwrap();\r\n\r\n if (confirmed) {\r\n if (newlyCreatedHandlerID === id) {\r\n dispatch({ type: 'DELETE_HANDLER', id });\r\n }\r\n\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: null });\r\n\r\n return;\r\n }\r\n }\r\n };\r\n\r\n useHotkeys(\r\n 'esc',\r\n () => {\r\n setTimeout(() => {\r\n onCancel();\r\n }, 100);\r\n },\r\n [],\r\n );\r\n\r\n useEffect(() => {\r\n $handlerSubject.subscribe((lastEditingID) => {\r\n if (lastEditingID === id) {\r\n onConfirm();\r\n }\r\n });\r\n }, [handler, id]);\r\n const [touchedFields, setTouchedFields] = useState<{\r\n [key: string]: boolean;\r\n }>({ className: false, method: false, pattern: false, verbs: false });\r\n\r\n const methodErrors = () => {\r\n if (touchedFields.method && !handler.method) {\r\n return 'Method is required';\r\n }\r\n if (singletonMethods) {\r\n const found = singletonMethods?.find(\r\n (item) => item.name === handler.method,\r\n );\r\n if (handler.method && !found)\r\n return `The method \"${handler.method}\" doesn't exist.`;\r\n if (found && found.exposed)\r\n return `Method \"${handler.method}\" is already exposed`;\r\n }\r\n };\r\n const patternErrors = () => {\r\n if (touchedFields.pattern) {\r\n if (handler.asRegex && !handler.regexPattern) {\r\n return 'Pattern is required';\r\n }\r\n if (!handler.asRegex && handler.pattern.endsWith('/')) {\r\n return 'Pattern should not end with a \"/\"';\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-2 rounded-b py-2\">\r\n <div className=\"flex w-60 flex-shrink-0 items-center gap-1\">\r\n <GrabHandle\r\n key=\"grab-handle\"\r\n listeners={listeners}\r\n attributes={attributes}\r\n />\r\n <Select\r\n value={handler.className}\r\n onChange={(val) => {\r\n setHandler((state) => ({ ...state, className: val }));\r\n }}\r\n onBlur={() =>\r\n setTouchedFields((state) => ({ ...state, className: true }))\r\n }\r\n key={className}\r\n options={singletons}\r\n errorMessage={\r\n touchedFields.className && !handler.className\r\n ? 'Class name is required'\r\n : handler.className !== '' &&\r\n !singletons.find((item) => item.name === handler.className)\r\n ? `The singleton \"${handler.className}\" doesn't exist.`\r\n : undefined\r\n }\r\n />\r\n </div>\r\n <div className=\"w-60 flex-shrink-0\">\r\n <MethodSelector\r\n value={handler.method}\r\n onChange={(val) => {\r\n setHandler((state) => ({ ...state, method: val }));\r\n }}\r\n options={singletonMethods || []}\r\n errorMessage={methodErrors()}\r\n onBlur={() =>\r\n setTouchedFields((state) => ({ ...state, method: true }))\r\n }\r\n />\r\n </div>\r\n\r\n <div className=\"relative w-60 flex-shrink-0 flex items-center gap-1 overflow-visible\">\r\n <Tooltip\r\n label={\r\n handler.asRegex\r\n ? generateRegexExample(handler.regexPattern)\r\n : handler.pattern && !handler.pattern.endsWith('/')\r\n ? `Requests starting with /${handler.pattern}/ will be handled`\r\n : ''\r\n }\r\n >\r\n <div className=\"relative w-full\">\r\n {!handler.asRegex && (\r\n <span className=\"absolute text-s inset-y-0 left-1 flex items-center gap-2\">\r\n /\r\n </span>\r\n )}\r\n <input\r\n type=\"text\"\r\n className={cn(\r\n 'bg-grey-300 text-s block w-full rounded p-1 pl-3 focus:outline-none focus:ring-1 focus:ring-primary-dark',\r\n {\r\n 'focus:ring-red-400 ring-1 ring-red-400':\r\n touchedFields.pattern &&\r\n handler.asRegex &&\r\n !handler['regexPattern'],\r\n },\r\n )}\r\n value={handler.asRegex ? handler.regexPattern : handler.pattern}\r\n onChange={(e) => {\r\n setHandler((state) => ({\r\n ...state,\r\n [handler.asRegex ? 'regexPattern' : 'pattern']:\r\n e.target.value,\r\n }));\r\n }}\r\n onBlur={() =>\r\n setTouchedFields((state) => ({ ...state, pattern: true }))\r\n }\r\n placeholder={handler.asRegex ? 'Required' : ''}\r\n />\r\n {patternErrors() && (\r\n <div className=\"absolute inset-x-0 top-[25px] z-[1] rounded-b-sm bg-red-200 px-1 text-xs text-red-600 ring-1 ring-red-600\">\r\n {patternErrors()}\r\n </div>\r\n )}\r\n </div>\r\n </Tooltip>\r\n {(asRegex ? regexPattern : pattern) && (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n\r\n setHandler((state) => ({\r\n ...state,\r\n [handler.asRegex ? 'regexPattern' : 'pattern']: '',\r\n }));\r\n }}\r\n className=\"absolute inset-y-0 right-6 flex items-center gap-2 pr-2\"\r\n >\r\n <FdCloseNaked\r\n className=\"text-grey-200 h-3 w-3\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n )}\r\n <Tooltip\r\n label={\r\n handler.asRegex\r\n ? `Requests matching this regex will be handled. Check the match with the __[Match regex command](https://developer.4d.com/docs/commands/match-regex)__`\r\n : `Prefixes are considered as regular expressions already containing starting and ending / \\n\\n __[documentation](https://developer.qodly.com/docs/studio/httpHandlers)__`\r\n }\r\n >\r\n <span className=\"rounded hover:bg-gray-400/30 w-6 h-6 flex items-center content-center justify-center\">\r\n <FdInfoCircle className=\"inline h-4 w-4 text-gray-100\" />\r\n </span>\r\n </Tooltip>\r\n </div>\r\n\r\n <div className=\"w-20 px-2 flex justify-center\">\r\n <ControlledSwitch\r\n value={!!handler.asRegex}\r\n onChange={(value) => {\r\n const rest = value\r\n ? { regexPattern: pattern, asRegex: value }\r\n : { pattern: regexPattern, asRegex: value };\r\n\r\n setHandler((state) => ({ ...state, ...rest }));\r\n\r\n // dispatch({\r\n // type: 'UPDATE_HANDLER',\r\n // payload: { asRegex: value },\r\n // id,\r\n // });\r\n }}\r\n className={`${handler.asRegex ? 'bg-primary-dark' : 'bg-grey-300'}\r\nrelative inline-flex h-5 w-8 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75`}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n className={`${handler.asRegex ? 'translate-x-3' : 'translate-x-0'}\r\npointer-events-none inline-block h-4 w-4 transform rounded-full bg-white ring-0 transition duration-200 ease-in-out`}\r\n />\r\n </ControlledSwitch>\r\n </div>\r\n <div className=\"flex flex-1 items-center\">\r\n <MultipleComboBox\r\n initialSelectedItems={handler.verbs || []}\r\n onChange={(val) => {\r\n setHandler((state) => ({ ...state, verbs: val }));\r\n }}\r\n touched={touchedFields.verbs}\r\n onBlur={() =>\r\n setTouchedFields((state) => ({ ...state, verbs: true }))\r\n }\r\n />\r\n <div className=\"flex items-center gap-0.5 px-2\">\r\n <Tooltip label=\"Duplicate Handler\" className=\"px-1 py-3\">\r\n <button\r\n className={cn(\r\n 'hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none opacity-50 cursor-not-allowed',\r\n )}\r\n >\r\n <FdDuplicate />\r\n </button>\r\n </Tooltip>\r\n <Tooltip label=\"Confirm Changes\" className=\"px-1 py-3\">\r\n <button\r\n className={cn(\r\n 'hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none',\r\n {\r\n 'opacity-50 cursor-not-allowed': !isValid(),\r\n },\r\n )}\r\n onClick={onConfirm}\r\n >\r\n <FdCheckCircle />\r\n </button>\r\n </Tooltip>\r\n <Tooltip label=\"Cancel Changes\" className=\"px-1 py-3\">\r\n <button\r\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none\"\r\n onClick={onCancel}\r\n >\r\n <FdClose />\r\n </button>\r\n </Tooltip>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport const Handler: FC<HTTPHandler> = ({\r\n id,\r\n class: className,\r\n method,\r\n pattern,\r\n verbs,\r\n isExpanded,\r\n regexPattern,\r\n asRegex,\r\n}) => {\r\n const { attributes, listeners, setNodeRef, transform, transition } =\r\n useSortable({ id: id });\r\n\r\n const style = {\r\n transform: CSS.Transform.toString(transform),\r\n transition,\r\n };\r\n\r\n const {\r\n dispatch,\r\n state: { editing },\r\n } = useHTTPHandlers();\r\n\r\n const appDispatch = useAppDispatch();\r\n\r\n const patternValue = asRegex ? regexPattern : pattern;\r\n\r\n const catalog = useAppSelector(selectCatalog);\r\n\r\n const singletons = Object.values(catalog?.singletons || {});\r\n\r\n const singletonMethods = singletons\r\n ?.find((item) => item.name === className)\r\n ?.methods.map(({ name, exposed }) => ({ name, exposed }));\r\n\r\n const notFoundSingltonError = singletons?.find(\r\n (item) => item.name === className,\r\n );\r\n\r\n const found = singletonMethods?.find((item) => item.name === method);\r\n\r\n const exposedError = found && found.exposed;\r\n\r\n return (\r\n <div className=\"odd:bg-grey-500\" ref={setNodeRef} style={style}>\r\n {editing === id ? (\r\n <HandlerEdit\r\n {...{\r\n id,\r\n class: className,\r\n method,\r\n pattern,\r\n verbs,\r\n isExpanded,\r\n regexPattern,\r\n asRegex,\r\n listeners,\r\n attributes,\r\n }}\r\n />\r\n ) : (\r\n <div\r\n className=\"flex items-center gap-2 rounded-b py-2.5 text-grey-50\"\r\n onDoubleClick={() => {\r\n $handlerSubject.next(editing);\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: id });\r\n }}\r\n >\r\n <div className=\"flex w-60 flex-shrink-0 items-center gap-1 \">\r\n <GrabHandle\r\n key=\"grab-handle\"\r\n listeners={listeners}\r\n attributes={attributes}\r\n />\r\n\r\n <div className=\"text-s w-full\">\r\n {className ? (\r\n <div\r\n className={cn(\r\n 'flex items-center gap-2',\r\n !notFoundSingltonError && 'text-red-400',\r\n )}\r\n >\r\n {!notFoundSingltonError && (\r\n <Tooltip\r\n label={`The singleton \"${className}\" doesn't exist.`}\r\n className=\"!bg-red-300 !text-red-400\"\r\n >\r\n <span className=\"rounded p-0.5 hover:bg-red-400/30 pt-0.5 h-5 w-5 flex justify-center content-center\">\r\n <FdWarningDanger className=\"inline h-4 w-4 pb-0.5 text-red-400\" />\r\n </span>\r\n </Tooltip>\r\n )}{' '}\r\n {className}\r\n </div>\r\n ) : (\r\n <span className=\"text-grey-200 italic\">undefined</span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"w-60 flex-shrink-0 \">\r\n <div className=\"text-s w-full\">\r\n {method ? (\r\n <div\r\n className={cn(\r\n 'flex items-center gap-2',\r\n !found && 'text-red-400',\r\n exposedError && 'text-yellow-400',\r\n )}\r\n >\r\n {!found && (\r\n <Tooltip\r\n label={`The method \"${method}\" doesn't exist.`}\r\n className=\"!bg-red-300 !text-red-400\"\r\n >\r\n <span className=\"rounded p-0.5 hover:bg-red-400/30 pt-0.5 h-5 w-5 flex justify-center content-center\">\r\n <FdWarningDanger className=\"inline h-4 w-4 pb-0.5 text-red-400\" />\r\n </span>\r\n </Tooltip>\r\n )}{' '}\r\n {exposedError && (\r\n <Tooltip\r\n label={`Method \"${method}\" is already exposed`}\r\n className=\"!bg-yellow-100 !text-yellow-500\"\r\n >\r\n <span className=\"rounded p-0.5 hover:bg-red-400/30 pt-0.5 h-5 w-5 flex justify-center content-center\">\r\n <FdWarningDanger className=\"inline h-4 w-4 pb-0.5 text-yellow-500\" />\r\n </span>\r\n </Tooltip>\r\n )}{' '}\r\n {method}\r\n </div>\r\n ) : (\r\n <span className=\"text-grey-200 italic\">undefined</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-s relative w-60 flex-shrink-0 \">\r\n {patternValue ? (\r\n <Tooltip\r\n label={\r\n asRegex\r\n ? generateRegexExample(patternValue)\r\n : `Requests starting with /${patternValue}/ will be handled`\r\n }\r\n >\r\n <span>{patternValue}</span>\r\n </Tooltip>\r\n ) : (\r\n <span className=\"text-grey-200 italic\">/</span>\r\n )}\r\n </div>\r\n\r\n <div className=\"px-5 w-20 flex justify-center text-grey-200\">\r\n {asRegex ? <FdRegex /> : <FdUnRegex />}\r\n </div>\r\n <div className=\"flex flex-1 items-center\">\r\n <div className=\"text-s w-full\">\r\n {verbs.length ? (\r\n verbs.join(',')\r\n ) : (\r\n <span className=\"text-grey-200 italic\">undefined</span>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-0.5 px-2\">\r\n <Tooltip label=\"Duplicate Handler\" className=\"px-1 py-3\">\r\n <button\r\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none\"\r\n onClick={() => dispatch({ type: 'DUPLICATE_HANDLER', id })}\r\n >\r\n <FdDuplicate />\r\n </button>\r\n </Tooltip>\r\n <Tooltip label=\"Edit Handler\" className=\"px-1 py-3\">\r\n <button\r\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none\"\r\n onClick={() => {\r\n $handlerSubject.next(editing);\r\n dispatch({ type: 'SET_EDITING_HANDLER', payload: id });\r\n }}\r\n >\r\n <FdPen />\r\n </button>\r\n </Tooltip>\r\n <Tooltip label=\"Delete Handler\" className=\"px-1 py-3\" placement=\"top-end\">\r\n <button\r\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none\"\r\n onClick={async () => {\r\n const { confirmed } = await appDispatch(\r\n openModal({\r\n title: 'Delete Handler',\r\n type: ModalType.CONFIRM,\r\n color: ModalColor.DANGER,\r\n message:\r\n 'Are you sure you want to remove this Handler?',\r\n icon: 'FdWarningDanger',\r\n }),\r\n ).unwrap();\r\n if (confirmed) {\r\n dispatch({ type: 'DELETE_HANDLER', id });\r\n }\r\n }}\r\n >\r\n <FdTrash />\r\n </button>\r\n </Tooltip>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import {\n closestCenter,\n DndContext,\n DragOverlay,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { FdCode, FdEmpty, FdInfoCircle, FdPlus } from '@ws-ui/icons';\nimport {\n selectTabByPath,\n setContent,\n useAppDispatch,\n useAppSelector,\n} from '@ws-ui/store';\nimport { FC, useEffect, useState } from 'react';\nimport { generate } from 'short-uuid';\nimport { z } from 'zod';\nimport { SwitchToEditorIcon } from './SwitchToEditorIcon';\nimport { Handler } from './Handler';\nimport {\n $handlerSubject,\n HandlerProvider,\n HTTPHandler,\n useHTTPHandlers,\n} from './Provider';\nimport { Tooltip } from '@ws-ui/shared';\nimport './index.css';\n\nconst HandlerSchema = z.object({\n class: z.string().optional(),\n method: z.string().optional(),\n verbs: z.string().optional(),\n id: z.string().optional(),\n pattern: z.string().optional(),\n regexPattern: z.string().optional(),\n});\n\nconst HandlersSchema = z.array(HandlerSchema);\n\nexport type Props = {\n content: string | HTTPHandler[];\n path: string;\n};\n\nconst Editor: FC<{ path: string }> = ({ path }) => {\n const tab = useAppSelector(selectTabByPath(path));\n const {\n dispatch,\n state: { content: items, editing },\n } = useHTTPHandlers();\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const activeItem = items.find((item) => item.id === activeId);\n\n const appDispatch = useAppDispatch();\n\n useEffect(() => {\n const newContent = JSON.stringify(\n items.map(\n ({ isExpanded: _, asRegex, pattern, regexPattern, ...item }) => {\n const rest = asRegex ? { regexPattern } : { pattern };\n\n return {\n ...item,\n verbs: item.verbs?.join(','),\n ...rest,\n };\n },\n ),\n null,\n 2,\n );\n\n const oldContent =\n typeof tab?.content === 'string'\n ? tab.content\n : JSON.stringify(tab?.content, null, 2);\n\n if (newContent === oldContent) {\n return;\n }\n\n appDispatch(\n setContent({\n path,\n content: newContent,\n }),\n );\n }, [items]);\n\n return (\n <div className=\"bg-grey-700 flex h-full w-full flex-col text-white\">\n <div className=\"flex items-center justify-between border-b border-black p-2\">\n {tab && (\n <SwitchToEditorIcon\n label=\"Switch to text Editor\"\n Icon={FdCode}\n tab={tab}\n editor={{\n config: { language: 'json' },\n key: 'editors:code',\n }}\n />\n )}\n <p className=\"text-grey-100 text-s flex items-center gap-1\">\n <FdInfoCircle className=\"inline text-base text-white\" /> HTTP handlers\n are evaluated in the order they are declared\n </p>\n </div>\n <div className=\"mt-1 flex flex-1 flex-col overflow-x-auto px-4\">\n {items.length ? (\n <div className=\"flex h-full min-w-[1200px] flex-1 flex-col\">\n <div className=\"mb-3 flex items-center gap-2 border-b\">\n <div className=\"w-60 flex-shrink-0 text-xs\">\n <span className=\"pl-6\">Class</span>\n </div>\n <div className=\"w-60 flex-shrink-0 text-xs\">Method</div>\n <div className=\"w-60 flex-shrink-0 text-xs\">Pattern</div>\n <div className=\"w-20 px-2 text-center text-xs\">As Regex</div>\n <div className=\"flex flex-1 items-center justify-between text-xs\">\n <span>Verbs</span>\n <div className=\"flex items-center gap-2 text-2xl\">\n <Tooltip label=\"Add a new HTTP Handler\">\n <button\n disabled={Boolean(editing)}\n onClick={() => {\n $handlerSubject.next(editing);\n dispatch({\n type: 'ADD_HANDLER',\n payload: {\n class: '',\n isExpanded: true,\n method: '',\n pattern: '',\n verbs: [],\n regexPattern: '',\n },\n });\n }}\n className=\"hover:bg-primary-hover rounded p-1 text-gray-100 hover:text-white active:outline-none disabled:cursor-not-allowed disabled:opacity-30\"\n >\n <FdPlus className=\"h-5 w-5\" />\n </button>\n </Tooltip>\n </div>\n </div>\n </div>\n <div className=\"py-3\">\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={(event) => {\n setActiveId(event.active.id);\n }}\n onDragEnd={(event) => {\n const { active, over } = event;\n\n setActiveId(null);\n\n if (!active || !over) return;\n\n if (active.id !== over?.id) {\n const oldIndex = items\n .map((item) => item.id)\n .indexOf(active.id);\n const newIndex = items\n .map((item) => item.id)\n .indexOf(over.id);\n\n dispatch({\n type: 'UPDATE_HANDLERS',\n payload: arrayMove(items, oldIndex, newIndex),\n });\n }\n }}\n >\n <SortableContext\n items={items}\n strategy={verticalListSortingStrategy}\n >\n {items.map(({ id, ...props }) => (\n <Handler key={id} id={id} {...props} />\n ))}\n </SortableContext>\n <DragOverlay>\n {activeId && activeItem ? (\n <div className=\"opacity-10\">\n <Handler {...activeItem} />\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </div>\n </div>\n ) : (\n <div className=\"mt-6\">\n <div>\n <FdEmpty className=\"text-grey-200 mx-auto h-9 w-9\" />\n </div>\n <div className=\"text-s text-grey-200 mx-auto mt-3 max-w-sm text-center\">\n There are no http handlers configured yet <br />\n Please add a new one to add a new one.\n </div>\n <div className=\"mt-3 flex items-center justify-center\">\n <button\n onClick={() => {\n $handlerSubject.next(editing);\n dispatch({\n type: 'ADD_HANDLER',\n payload: {\n class: '',\n isExpanded: true,\n method: '',\n pattern: '',\n verbs: [],\n regexPattern: '',\n },\n });\n }}\n className=\"bg-primary-dark text-s rounded px-2 py-1 flex items-center gap-1\"\n >\n <FdPlus className=\"inline text-white h-4 w-4\" /> Add New Handler\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport const HTTPHandlersEditor: FC<Props> = ({ content, path }) => {\n const [error, setError] = useState<string | null>(null);\n\n function safeParseJSON(json: string) {\n let parsed;\n\n try {\n parsed = JSON.parse(json);\n } catch (e) {\n setError('HTTP Handler JSON is invalid');\n parsed = [];\n }\n\n return parsed;\n }\n\n const contentToRender =\n typeof content === 'string' ? safeParseJSON(content) : content;\n\n const validationResult = HandlersSchema.safeParse(contentToRender);\n\n if (!validationResult.success || error) {\n throw new Error('Invalid JSON');\n }\n\n const initialContent = contentToRender.map((item: HTTPHandler) => {\n const asRegex = Boolean(item.regexPattern);\n return {\n ...item,\n id: item.id ?? generate(),\n verbs: (item.verbs as unknown as string | undefined)\n ?.split(',')\n .map((item) => item.toLocaleUpperCase())\n .filter(Boolean),\n asRegex,\n };\n });\n\n return (\n <HandlerProvider content={initialContent}>\n <Editor path={path} />\n </HandlerProvider>\n );\n};\n","import { FC } from 'react';\r\nimport { HTTP_HANDLERS_TAB_PATH } from '@ws-ui/shared';\r\nimport { getStore, ReduxProvider } from '@ws-ui/store';\r\nimport { HTTPHandlersEditor, Props } from '../Editor';\r\n\r\ninterface IStandaloneProps extends Omit<Props, 'path'> {}\r\n\r\nexport const Standalone: FC<IStandaloneProps> = (props) => {\r\n return (\r\n <ReduxProvider store={getStore()}>\r\n <div className=\"h-screen bg-grey-900\">\r\n <HTTPHandlersEditor\r\n path={HTTP_HANDLERS_TAB_PATH}\r\n {...props}\r\n />\r\n </div>\r\n </ReduxProvider>\r\n );\r\n};\r\n"],"names":["SwitchToEditorIcon","label","Icon","tab","editor","onBeforeClick","dispatch","useAppDispatch","jsx","ToolbarIcon","switchEditor","HandlerContext","createContext","$handlerSubject","Subject","handlerReducer","state","action","lastEditing","item","omit","t","id","generate","handler","handlerToDuplicate","found","HandlerProvider","children","content","initialState","useReducer","useEffect","useHTTPHandlers","context","useContext","MultipleComboBox","initialSelectedItems","onChange","touched","onBlur","verbs","getFilteredverbs","selectedItems","inputValue","lowerCasedInputValue","method","setInputValue","useState","setSelectedItems","items","useMemo","getSelectedItemProps","getDropdownProps","removeSelectedItem","useMultipleSelection","newSelectedItems","type","isOpen","getToggleButtonProps","getMenuProps","getInputProps","highlightedIndex","getItemProps","selectedItem","useCombobox","actionAndChanges","changes","newInputValue","newSelectedItem","jsxs","cn","selectedItemForRender","index","e","FdCloseNaked","FdDown","Select","value","options","errorMessage","query","setQuery","notFound","filteredOptions","sgltn","Combobox","open","sngltn","event","Fragment","Transition","FdEmpty","option","active","selected","MethodSelector","exposed","val","FdWarningDanger","GrabHandle","listeners","attributes","FdDragHandle","generateRegexExample","regex","regexExample","RandExp","_a","HandlerEdit","className","pattern","regexPattern","asRegex","setHandler","catalog","useAppSelector","selectCatalog","singletons","singletonMethods","name","newlyCreatedHandlerID","appDispatch","isValid","onConfirm","onCancel","oldHandler","newHandler","isEqual","confirmed","openModal","ModalType","ModalColor","useHotkeys","lastEditingID","touchedFields","setTouchedFields","methodErrors","patternErrors","Tooltip","FdInfoCircle","ControlledSwitch","rest","FdDuplicate","FdCheckCircle","FdClose","Handler","isExpanded","setNodeRef","transform","transition","useSortable","style","CSS","editing","patternValue","notFoundSingltonError","exposedError","FdRegex","FdUnRegex","FdPen","FdTrash","HandlerSchema","z","HandlersSchema","Editor","path","selectTabByPath","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","activeId","setActiveId","activeItem","newContent","_","oldContent","setContent","FdCode","FdPlus","DndContext","closestCenter","over","oldIndex","newIndex","arrayMove","SortableContext","verticalListSortingStrategy","props","DragOverlay","HTTPHandlersEditor","error","setError","safeParseJSON","json","parsed","contentToRender","initialContent","Standalone","ReduxProvider","getStore","HTTP_HANDLERS_TAB_PATH"],"mappings":"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"}
|