@digi-frontend/dgate-api-documentation 1.1.12 → 1.3.0

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.
Files changed (240) hide show
  1. package/.editorconfig +13 -0
  2. package/.prettierignore +8 -0
  3. package/.prettierrc +15 -0
  4. package/dist/_virtual/index4.js +1 -1
  5. package/dist/_virtual/index5.js +1 -1
  6. package/dist/_virtual/index6.js +1 -1
  7. package/dist/_virtual/index7.js +1 -1
  8. package/dist/node_modules/@popperjs/core/lib/createPopper.js +1 -1
  9. package/dist/node_modules/@popperjs/core/lib/createPopper.js.map +1 -1
  10. package/dist/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js +1 -1
  11. package/dist/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js.map +1 -1
  12. package/dist/node_modules/@popperjs/core/lib/enums.js +1 -1
  13. package/dist/node_modules/@popperjs/core/lib/enums.js.map +1 -1
  14. package/dist/node_modules/@popperjs/core/lib/modifiers/applyStyles.js +1 -1
  15. package/dist/node_modules/@popperjs/core/lib/modifiers/applyStyles.js.map +1 -1
  16. package/dist/node_modules/@popperjs/core/lib/modifiers/eventListeners.js +1 -1
  17. package/dist/node_modules/@popperjs/core/lib/modifiers/eventListeners.js.map +1 -1
  18. package/dist/node_modules/@popperjs/core/lib/modifiers/flip.js +1 -1
  19. package/dist/node_modules/@popperjs/core/lib/modifiers/flip.js.map +1 -1
  20. package/dist/node_modules/@popperjs/core/lib/modifiers/hide.js +1 -1
  21. package/dist/node_modules/@popperjs/core/lib/modifiers/hide.js.map +1 -1
  22. package/dist/node_modules/@popperjs/core/lib/modifiers/offset.js +1 -1
  23. package/dist/node_modules/@popperjs/core/lib/modifiers/offset.js.map +1 -1
  24. package/dist/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +1 -1
  25. package/dist/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js.map +1 -1
  26. package/dist/node_modules/@popperjs/core/lib/utils/debounce.js +1 -1
  27. package/dist/node_modules/@popperjs/core/lib/utils/debounce.js.map +1 -1
  28. package/dist/node_modules/@popperjs/core/lib/utils/detectOverflow.js +1 -1
  29. package/dist/node_modules/@popperjs/core/lib/utils/detectOverflow.js.map +1 -1
  30. package/dist/node_modules/@popperjs/core/lib/utils/expandToHashMap.js +1 -1
  31. package/dist/node_modules/@popperjs/core/lib/utils/expandToHashMap.js.map +1 -1
  32. package/dist/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js +1 -1
  33. package/dist/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js.map +1 -1
  34. package/dist/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js +1 -1
  35. package/dist/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js.map +1 -1
  36. package/dist/node_modules/@popperjs/core/lib/utils/mergeByName.js +1 -1
  37. package/dist/node_modules/@popperjs/core/lib/utils/mergeByName.js.map +1 -1
  38. package/dist/node_modules/@popperjs/core/lib/utils/orderModifiers.js +1 -1
  39. package/dist/node_modules/@popperjs/core/lib/utils/orderModifiers.js.map +1 -1
  40. package/dist/node_modules/@popperjs/core/lib/utils/userAgent.js +1 -1
  41. package/dist/node_modules/@popperjs/core/lib/utils/userAgent.js.map +1 -1
  42. package/dist/node_modules/@tippyjs/react/dist/tippy-react.esm.js +1 -1
  43. package/dist/node_modules/@tippyjs/react/dist/tippy-react.esm.js.map +1 -1
  44. package/dist/node_modules/digitinary-ui/dist/index.js +1 -1
  45. package/dist/node_modules/digitinary-ui/dist/index.js.map +1 -1
  46. package/dist/node_modules/dom-serializer/lib/foreignNames.js +1 -1
  47. package/dist/node_modules/dom-serializer/lib/foreignNames.js.map +1 -1
  48. package/dist/node_modules/dom-serializer/lib/index.js +1 -1
  49. package/dist/node_modules/dom-serializer/lib/index.js.map +1 -1
  50. package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js +1 -1
  51. package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js.map +1 -1
  52. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js +1 -1
  53. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js.map +1 -1
  54. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js +1 -1
  55. package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js.map +1 -1
  56. package/dist/node_modules/domhandler/lib/node.js +1 -1
  57. package/dist/node_modules/domhandler/lib/node.js.map +1 -1
  58. package/dist/node_modules/domutils/lib/feeds.js +1 -1
  59. package/dist/node_modules/domutils/lib/feeds.js.map +1 -1
  60. package/dist/node_modules/domutils/lib/helpers.js +1 -1
  61. package/dist/node_modules/domutils/lib/helpers.js.map +1 -1
  62. package/dist/node_modules/domutils/lib/legacy.js +1 -1
  63. package/dist/node_modules/domutils/lib/legacy.js.map +1 -1
  64. package/dist/node_modules/domutils/lib/querying.js +1 -1
  65. package/dist/node_modules/domutils/lib/querying.js.map +1 -1
  66. package/dist/node_modules/domutils/lib/stringify.js +1 -1
  67. package/dist/node_modules/domutils/lib/stringify.js.map +1 -1
  68. package/dist/node_modules/entities/dist/commonjs/decode.js +1 -1
  69. package/dist/node_modules/entities/dist/commonjs/decode.js.map +1 -1
  70. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-html.js +1 -1
  71. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map +1 -1
  72. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +1 -1
  73. package/dist/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map +1 -1
  74. package/dist/node_modules/formik/dist/formik.esm.js +1 -1
  75. package/dist/node_modules/formik/dist/formik.esm.js.map +1 -1
  76. package/dist/node_modules/formik/node_modules/deepmerge/dist/es.js +1 -1
  77. package/dist/node_modules/formik/node_modules/deepmerge/dist/es.js.map +1 -1
  78. package/dist/node_modules/highlight.js/lib/core.js +1 -1
  79. package/dist/node_modules/highlight.js/lib/core.js.map +1 -1
  80. package/dist/node_modules/highlight.js/lib/languages/json.js +1 -1
  81. package/dist/node_modules/highlight.js/lib/languages/json.js.map +1 -1
  82. package/dist/node_modules/html-react-parser/lib/utilities.js.map +1 -1
  83. package/dist/node_modules/htmlparser2/dist/commonjs/Tokenizer.js +1 -1
  84. package/dist/node_modules/htmlparser2/dist/commonjs/Tokenizer.js.map +1 -1
  85. package/dist/node_modules/htmlparser2/dist/commonjs/index.js +1 -1
  86. package/dist/node_modules/htmlparser2/dist/commonjs/index.js.map +1 -1
  87. package/dist/node_modules/js-yaml/dist/js-yaml.mjs.js +1 -1
  88. package/dist/node_modules/js-yaml/dist/js-yaml.mjs.js.map +1 -1
  89. package/dist/node_modules/lodash-es/_baseClone.js +1 -1
  90. package/dist/node_modules/lodash-es/_baseClone.js.map +1 -1
  91. package/dist/node_modules/lodash-es/_getSymbols.js +1 -1
  92. package/dist/node_modules/lodash-es/_getSymbols.js.map +1 -1
  93. package/dist/node_modules/lodash-es/_memoizeCapped.js +1 -1
  94. package/dist/node_modules/lodash-es/_memoizeCapped.js.map +1 -1
  95. package/dist/node_modules/lodash-es/_stringToPath.js +1 -1
  96. package/dist/node_modules/lodash-es/_stringToPath.js.map +1 -1
  97. package/dist/node_modules/property-expr/index.js +1 -1
  98. package/dist/node_modules/property-expr/index.js.map +1 -1
  99. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +1 -1
  100. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -1
  101. package/dist/node_modules/react-property/lib/index.js +1 -1
  102. package/dist/node_modules/react-property/lib/index.js.map +1 -1
  103. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js +1 -1
  104. package/dist/node_modules/react-syntax-highlighter/dist/esm/create-element.js.map +1 -1
  105. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js +1 -1
  106. package/dist/node_modules/react-syntax-highlighter/dist/esm/highlight.js.map +1 -1
  107. package/dist/node_modules/react-toastify/dist/index.mjs.js +1 -1
  108. package/dist/node_modules/react-toastify/dist/index.mjs.js.map +1 -1
  109. package/dist/node_modules/style-to-js/cjs/index.js +1 -1
  110. package/dist/node_modules/style-to-js/cjs/index.js.map +1 -1
  111. package/dist/node_modules/style-to-object/cjs/index.js +1 -1
  112. package/dist/node_modules/style-to-object/cjs/index.js.map +1 -1
  113. package/dist/node_modules/tiny-case/index.js +1 -1
  114. package/dist/node_modules/tiny-case/index.js.map +1 -1
  115. package/dist/node_modules/tippy.js/dist/tippy.esm.js +1 -1
  116. package/dist/node_modules/tippy.js/dist/tippy.esm.js.map +1 -1
  117. package/dist/node_modules/toposort/index.js +1 -1
  118. package/dist/node_modules/toposort/index.js.map +1 -1
  119. package/dist/node_modules/tslib/tslib.es6.js +1 -1
  120. package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
  121. package/dist/node_modules/yup/index.esm.js +1 -1
  122. package/dist/node_modules/yup/index.esm.js.map +1 -1
  123. package/dist/src/components/InfoForm/InfoForm.js +1 -1
  124. package/dist/src/components/InfoForm/InfoForm.js.map +1 -1
  125. package/dist/src/components/JsonInput/JsonInput.js +1 -1
  126. package/dist/src/components/JsonInput/JsonInput.js.map +1 -1
  127. package/dist/src/components/LivePreview/LivePreview.js +1 -1
  128. package/dist/src/components/LivePreview/LivePreview.js.map +1 -1
  129. package/dist/src/components/MethodAccordion/MethodAccordion.js +1 -1
  130. package/dist/src/components/MethodAccordion/MethodAccordion.js.map +1 -1
  131. package/dist/src/components/SVGLoader/SVGLoader.js +1 -1
  132. package/dist/src/components/SVGLoader/SVGLoader.js.map +1 -1
  133. package/dist/src/components/Tooltip/Tooltip.js +1 -1
  134. package/dist/src/components/Tooltip/Tooltip.js.map +1 -1
  135. package/dist/src/components/table/table.js +1 -1
  136. package/dist/src/components/table/table.js.map +1 -1
  137. package/dist/src/components/table/tags-table.js +1 -1
  138. package/dist/src/components/table/tags-table.js.map +1 -1
  139. package/dist/src/constants/methods.constant.js +1 -1
  140. package/dist/src/constants/methods.constant.js.map +1 -1
  141. package/dist/src/context/SectionToggleContext.js +1 -1
  142. package/dist/src/context/SectionToggleContext.js.map +1 -1
  143. package/dist/src/helpers/docs.helper.js +1 -1
  144. package/dist/src/helpers/docs.helper.js.map +1 -1
  145. package/dist/src/helpers/layout.helper.js +1 -1
  146. package/dist/src/helpers/layout.helper.js.map +1 -1
  147. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js +1 -1
  148. package/dist/src/layout/docsComponents/DocsAside/DocsAside.js.map +1 -1
  149. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js +1 -1
  150. package/dist/src/layout/docsComponents/DocsContent/DocsContent.js.map +1 -1
  151. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js +1 -1
  152. package/dist/src/layout/docsComponents/DocsContent/EndpointPage/index.js.map +1 -1
  153. package/dist/src/layout/docsComponents/DocsContent/OverviewPage/index.js +1 -1
  154. package/dist/src/layout/docsComponents/DocsContent/OverviewPage/index.js.map +1 -1
  155. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js +1 -1
  156. package/dist/src/layout/docsComponents/DocsHeader/DocsHeader.js.map +1 -1
  157. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js +1 -1
  158. package/dist/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.js.map +1 -1
  159. package/dist/src/layout/docsLayout.js +1 -1
  160. package/dist/src/layout/docsLayout.js.map +1 -1
  161. package/dist/src/layout/layout.js +1 -1
  162. package/dist/src/layout/layout.js.map +1 -1
  163. package/dist/src/utils/index.js +1 -1
  164. package/dist/src/utils/index.js.map +1 -1
  165. package/dist/src/validator/form.scheme.js +1 -1
  166. package/dist/src/validator/form.scheme.js.map +1 -1
  167. package/dist/styles.css +773 -773
  168. package/index.ts +2 -0
  169. package/package.json +4 -9
  170. package/rollup.config.js +37 -0
  171. package/src/assets/icons/AddRow.svg +3 -0
  172. package/src/assets/icons/ApiIcon.svg +12 -0
  173. package/src/assets/icons/ArrowBack.svg +3 -0
  174. package/src/assets/icons/BookIcon.svg +6 -0
  175. package/src/assets/icons/CheckMarkSquare.svg +5 -0
  176. package/src/assets/icons/CloseIcon.svg +4 -0
  177. package/src/assets/icons/CopySticker.svg +6 -0
  178. package/src/assets/icons/DeleteIcon.svg +3 -0
  179. package/src/assets/icons/DownArrow.svg +3 -0
  180. package/src/assets/icons/EditIcon.svg +3 -0
  181. package/src/assets/icons/FilterIcon.svg +4 -0
  182. package/src/assets/icons/Plus.svg +5 -0
  183. package/src/assets/icons/PlusSquare.svg +3 -0
  184. package/src/assets/icons/RequestOption.svg +5 -0
  185. package/src/assets/icons/UpArrow.svg +3 -0
  186. package/src/assets/icons/arrow-down.svg +3 -0
  187. package/src/assets/icons/arrow-up.svg +10 -0
  188. package/src/assets/icons/arrowDownGray.svg +3 -0
  189. package/src/assets/icons/arrowRightGray.svg +3 -0
  190. package/src/assets/icons/close-circle.svg +5 -0
  191. package/src/assets/icons/copy.svg +4 -0
  192. package/src/assets/icons/deleteOutlinedIcon.svg +8 -0
  193. package/src/assets/icons/document.svg +6 -0
  194. package/src/assets/icons/eye.svg +4 -0
  195. package/src/assets/icons/index.ts +27 -0
  196. package/src/assets/icons/infoIcon.svg +5 -0
  197. package/src/assets/icons/newCopyIcon.svg +4 -0
  198. package/src/assets/icons/searchIcon.svg +4 -0
  199. package/src/components/Chips/Chips.tsx +87 -0
  200. package/src/components/InfoForm/InfoForm.tsx +432 -0
  201. package/src/components/JsonInput/JsonInput.tsx +149 -0
  202. package/src/components/LivePreview/LivePreview.tsx +224 -0
  203. package/src/components/MethodAccordion/MethodAccordion.tsx +1070 -0
  204. package/src/components/SVGLoader/SVGLoader.tsx +96 -0
  205. package/src/components/SectionHead/SectionHead.tsx +22 -0
  206. package/src/components/SimpleLabelValue/SimpleLabelValue.tsx +31 -0
  207. package/src/components/SimpleLabelValue/index.ts +1 -0
  208. package/src/components/Tooltip/Tooltip.tsx +85 -0
  209. package/src/components/dialog/dialog.ts +61 -0
  210. package/src/components/dialog/index.tsx +88 -0
  211. package/src/components/table/table.tsx +508 -0
  212. package/src/components/table/tags-table.tsx +348 -0
  213. package/src/constants/index.ts +95 -0
  214. package/src/constants/methods.constant.ts +26 -0
  215. package/src/constants/regex.ts +7 -0
  216. package/src/context/SectionToggleContext.tsx +121 -0
  217. package/src/global.d.ts +13 -0
  218. package/src/helpers/docs.helper.ts +42 -0
  219. package/src/helpers/layout.helper.ts +290 -0
  220. package/src/helpers/methodAccordion.helper.ts +20 -0
  221. package/src/index.ts +2 -0
  222. package/src/layout/docsComponents/Codebox/Codebox.tsx +61 -0
  223. package/src/layout/docsComponents/DocsAside/DocsAside.tsx +112 -0
  224. package/src/layout/docsComponents/DocsContent/DocsContent.tsx +51 -0
  225. package/src/layout/docsComponents/DocsContent/EndpointPage/index.tsx +307 -0
  226. package/src/layout/docsComponents/DocsContent/OverviewPage/index.tsx +223 -0
  227. package/src/layout/docsComponents/DocsHeader/DocsHeader.tsx +188 -0
  228. package/src/layout/docsComponents/DocsSideMenuTree/DocsSideMenuTree.tsx +229 -0
  229. package/src/layout/docsComponents/index.tsx +28 -0
  230. package/src/layout/docsLayout.tsx +123 -0
  231. package/src/layout/layout.module.css +65 -0
  232. package/src/layout/layout.tsx +177 -0
  233. package/src/types/docsLayout.type.ts +7 -0
  234. package/src/types/index.ts +28 -0
  235. package/src/types/layout.type.ts +32 -0
  236. package/src/types/openApi.ts +109 -0
  237. package/src/types/transformedOpenApi.ts +52 -0
  238. package/src/utils/index.ts +15 -0
  239. package/src/validator/form.scheme.ts +96 -0
  240. package/tsconfig.json +33 -0
@@ -0,0 +1,307 @@
1
+ import SVGLoader from '../../../../components/SVGLoader/SVGLoader'
2
+ import {
3
+ ArrowBack,
4
+ arrowDown,
5
+ arrowUp,
6
+ DownArrowIcon,
7
+ newCopyIcon,
8
+ RequestOption,
9
+ } from '../../../../assets/icons/index'
10
+ import { SelectGroup } from 'digitinary-ui'
11
+ import { useEffect, useMemo, useState } from 'react'
12
+ import { EndpointData, OverviewData } from 'src/layout/docsLayout'
13
+ import { handleStatusColor } from '../../../../helpers/methodAccordion.helper'
14
+ import { httpStatusCodes } from '../../../../constants/index'
15
+ import styles from '../../Codebox/style.module.scss'
16
+ import Tooltip from '../../../../components/Tooltip/Tooltip'
17
+ import './style.scss'
18
+ import { SectionEnum, useSectionToggle } from '../../../../../src/context/SectionToggleContext'
19
+ import { capitalizeFirstLetter, copyToClipboard } from '../../../../../src/utils'
20
+
21
+ export const EndpointPage = ({
22
+ data,
23
+ setActiveType,
24
+ setActiveItemData,
25
+ }: {
26
+ data: EndpointData
27
+ setActiveType: React.Dispatch<React.SetStateAction<'OVERVIEW' | 'ENDPOINT'>>
28
+ setActiveItemData: React.Dispatch<React.SetStateAction<OverviewData | EndpointData>>
29
+ }) => {
30
+ const [activeTab, setActiveTab] = useState('header')
31
+ const { toggleSection } = useSectionToggle()
32
+ const [selectedUrl, setSelectedUrl] = useState(data?.api?.servers?.[0]?.url || '')
33
+ const [isUrlDropdownOpen, setIsUrlDropdownOpen] = useState<boolean>(false)
34
+
35
+ useEffect(() => {
36
+ setSelectedUrl(data?.api?.servers?.[0]?.url || '')
37
+ }, [data])
38
+
39
+ const fullUrl = useMemo(() => {
40
+ // env gateway url + api version(if appended) + context path
41
+ const url = data.api?.servers?.filter((s) => s.url !== '/')[0]?.url
42
+ const pathParts = data?.path.split('/').slice(2) // slice from index 2 to skip the first empty "" and "comments"
43
+ const fullPath = !!pathParts?.length ? '/' + pathParts.join('/') : '' // this will contain the full path without the context path
44
+ return `${url}${fullPath}`
45
+ }, [data])
46
+
47
+ // Filter status codes to only include those
48
+ const filteredStatusCodes = Object.keys(data?.responses || {}).filter((code) => {
49
+ const response = data.responses[code]
50
+ return (
51
+ response?.content?.['application/json']?.schema?.properties
52
+ )
53
+ })
54
+
55
+ // Create options for the select dropdown
56
+ const httpStatusCodeOptions = filteredStatusCodes.map((code) => ({
57
+ label: (
58
+ <div className="statusCodeOptionContainer">
59
+ <div
60
+ className="statusCodeOptionCircle"
61
+ style={{ backgroundColor: handleStatusColor(code) }}
62
+ ></div>
63
+ <span>{code}</span>
64
+ </div>
65
+ ),
66
+ value: code,
67
+ }))
68
+
69
+ // Function to get default option
70
+ const getDefaultOption = () => {
71
+ const has200 = filteredStatusCodes.includes('200')
72
+ return has200
73
+ ? httpStatusCodeOptions.find((opt) => opt.value === '200')
74
+ : httpStatusCodeOptions[0] || null
75
+ }
76
+
77
+ const [expanded, setExpanded] = useState(null)
78
+ const [selectedResStatusCode, setSelectedResStatusCode] = useState(getDefaultOption())
79
+ const [headersList, setHeadersList] = useState({})
80
+ const requestTableData = (data?.parameters || []).filter(
81
+ (param) => param.in?.toLowerCase() === activeTab.toLowerCase()
82
+ )
83
+
84
+ useEffect(() => {
85
+ setSelectedResStatusCode(getDefaultOption())
86
+ }, [data])
87
+
88
+ useEffect(() => {
89
+ if (selectedResStatusCode && selectedResStatusCode.value) {
90
+ const headerObj = data?.responses[selectedResStatusCode.value]
91
+ setHeadersList(headerObj?.headers)
92
+ }
93
+ }, [selectedResStatusCode, data?.responses])
94
+
95
+ return (
96
+ <div className="api-details-expanded">
97
+ <div className="test-button">
98
+ <button
99
+ className="back-button"
100
+ onClick={() => {
101
+ toggleSection(data.api.apiSpecId, [{ type: SectionEnum.OVERVIEW, setTo: true }], {
102
+ resetOthers: true,
103
+ filterKeys: [SectionEnum.RESOURCE],
104
+ })
105
+ setActiveType('OVERVIEW')
106
+ setActiveItemData(data.api)
107
+ }}
108
+ >
109
+ <SVGLoader src={ArrowBack} />
110
+ </button>
111
+
112
+ <Tooltip content="Comming soon">
113
+ <button className="disabled">Test</button>
114
+ </Tooltip>
115
+ </div>
116
+ <h3>{data.api.title}</h3>
117
+ <h1 className="api-title">{data?.summary}</h1>
118
+ <div className="url-box">
119
+ {isUrlDropdownOpen && selectedUrl.length !== 0 && (
120
+ <div className="url-list">
121
+ {data.api?.servers?.map((server, index) => (
122
+ <div
123
+ key={index}
124
+ className="url-item"
125
+ onClick={() => {
126
+ setSelectedUrl(server.url)
127
+ setIsUrlDropdownOpen(false)
128
+ }}
129
+ >
130
+ <input
131
+ type="radio"
132
+ name="api-method"
133
+ checked={selectedUrl === server.url}
134
+ readOnly
135
+ />
136
+ <span>{`${server.url}${data.path}`}</span>
137
+ </div>
138
+ ))}
139
+ </div>
140
+ )}
141
+ <div className="url-box_text-container">
142
+ <span className={`method-label ${data?.method?.toLowerCase()}`}>{data.method}</span>
143
+ <div className="url-container">
144
+ <div className="type-ddl" onClick={() => setIsUrlDropdownOpen((prev) => !prev)}>
145
+ <span className="url-text">{`${selectedUrl}${data.path}`}</span>
146
+ <div className="icon-container">
147
+ <SVGLoader
148
+ className="icon"
149
+ role="button"
150
+ tabIndex={0}
151
+ onClick={(e) => {
152
+ e.stopPropagation()
153
+ copyToClipboard(`${selectedUrl}${data.path}`)
154
+ }}
155
+ src={newCopyIcon}
156
+ />
157
+ {selectedUrl.length !== 0 && (
158
+ <SVGLoader src={!isUrlDropdownOpen ? arrowDown : arrowUp} />
159
+ )}
160
+ </div>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </div>
165
+
166
+ <p className="api-desc">{data?.description || 'No Description'}</p>
167
+
168
+ <h3>Request</h3>
169
+
170
+ <div className="request-section">
171
+ <div className="request-tabs">
172
+ {['header', 'path', 'query'].map((tab) => (
173
+ <button
174
+ key={tab}
175
+ className={`tab ${activeTab === tab ? 'active' : ''}`}
176
+ onClick={() => setActiveTab(tab)}
177
+ >
178
+ <SVGLoader src={RequestOption} className="icon-left" />
179
+ <span className="tab-label">
180
+ {tab === 'requestBody'
181
+ ? 'Request Body'
182
+ : tab.charAt(0).toUpperCase() + tab.slice(1)}
183
+ </span>
184
+ </button>
185
+ ))}
186
+ </div>
187
+
188
+ <div className="table-wrapper">
189
+ <table className="param-table">
190
+ <thead>
191
+ <tr>
192
+ <th className="head-table-label">Parameter Name</th>
193
+ <th className="head-table-label">Required</th>
194
+ <th className="head-table-label">Type</th>
195
+ <th className="head-table-label">Enum</th>
196
+ <th className="head-table-label">Description</th>
197
+ </tr>
198
+ </thead>
199
+ <tbody>
200
+ {data.parameters
201
+ ?.filter((p) => p.in?.toLowerCase() === activeTab.toLowerCase())
202
+ .map((row, index) => (
203
+ <tr key={index}>
204
+ <td>{row.name}</td>
205
+ <td>{row.required ? 'True' : 'False'}</td>
206
+ <td style={{ textTransform: 'capitalize' }}>
207
+ <span>{row?.schema?.type || '-'}</span>
208
+ {row?.schema?.type === 'array' && row?.schema?.items?.type && (
209
+ <span style={{ color: '#616874', fontSize: '0.75rem' }}>
210
+ _{capitalizeFirstLetter(row.schema?.items?.type)}
211
+ </span>
212
+ )}
213
+ </td>
214
+ <td>{Array.isArray(row.schema?.enum) ? row.schema.enum.join(' / ') : '-'}</td>
215
+ <td className="desc-cell">
216
+ <div className={`desc-text ${expanded === index ? 'expanded' : ''}`}>
217
+ {row.description || 'No description'}
218
+ </div>
219
+ <button
220
+ className="desc-toggle"
221
+ onClick={() => setExpanded(expanded === index ? null : index)}
222
+ >
223
+ <SVGLoader
224
+ src={DownArrowIcon}
225
+ className={expanded === index ? 'rotated' : ''}
226
+ />
227
+ </button>
228
+ </td>
229
+ </tr>
230
+ ))}
231
+ </tbody>
232
+ </table>
233
+ </div>
234
+ </div>
235
+
236
+ <div className="response-section">
237
+ <h3>Response</h3>
238
+
239
+ <div>
240
+ <div style={{ height: '0.5rem', width: '7.5rem', marginLeft: 'auto' }}>
241
+ {Object.keys(data?.responses || {})?.length > 0 && (
242
+ <div className={'codeboxSection'}>
243
+ <div className={`${'codeboxHeader'}`}>
244
+ <SelectGroup
245
+ size="small"
246
+ withSearch={false}
247
+ isMultiple={false}
248
+ clearable={false}
249
+ placeholder="200"
250
+ options={[
251
+ {
252
+ list: httpStatusCodeOptions,
253
+ },
254
+ ]}
255
+ value={selectedResStatusCode}
256
+ onChange={(value) => {
257
+ setSelectedResStatusCode(value)
258
+ }}
259
+ />
260
+ </div>
261
+ </div>
262
+ )}
263
+ </div>
264
+ <button className="tab active ">
265
+ <SVGLoader src={RequestOption} className="icon-left" />
266
+ Header
267
+ </button>
268
+ </div>
269
+
270
+ <div className="table-wrapper">
271
+ <table className="param-table">
272
+ <thead>
273
+ <tr>
274
+ <th className="head-table-label">Header Name</th>
275
+ <th className="head-table-label">Required</th>
276
+ <th className="head-table-label">Type</th>
277
+ <th className="head-table-label">Enum</th>
278
+ <th className="head-table-label">Description</th>
279
+ </tr>
280
+ </thead>
281
+ <tbody>
282
+ {!!headersList &&
283
+ Object.keys(headersList) &&
284
+ Object.keys(headersList).map((key) => (
285
+ <tr>
286
+ <td>{key}</td>
287
+ <td>{headersList[key]?.required.toString()}</td>
288
+ <td style={{ textTransform: 'capitalize' }}>
289
+ <span>{headersList[key]?.schema?.type || '-'}</span>
290
+ {headersList[key]?.schema?.type === 'array' &&
291
+ headersList[key]?.schema?.items?.type && (
292
+ <span style={{ color: '#616874', fontSize: '0.75rem' }}>
293
+ _{capitalizeFirstLetter(headersList[key]?.schema?.items?.type)}
294
+ </span>
295
+ )}
296
+ </td>
297
+ <td>{headersList[key]?.schema?.enum?.join('/')}</td>
298
+ <td>{headersList[key]?.description}</td>
299
+ </tr>
300
+ ))}
301
+ </tbody>
302
+ </table>
303
+ </div>
304
+ </div>
305
+ </div>
306
+ )
307
+ }
@@ -0,0 +1,223 @@
1
+ import './style.scss'
2
+ import SVGLoader from '../../../../components/SVGLoader/SVGLoader'
3
+ import { arrowDown, arrowRightGray, arrowUp, newCopyIcon } from '../../../../assets/icons/index'
4
+ import { EndpointData, OverviewData } from 'src/layout/docsLayout'
5
+ import { SectionEnum, useSectionToggle } from '../../../../../src/context/SectionToggleContext'
6
+ import React, { useEffect, useState } from 'react'
7
+ import { copyToClipboard } from '../../../../utils'
8
+
9
+ export const OverviewPage = ({
10
+ data,
11
+ setActiveItemData,
12
+ setActiveType,
13
+ onProductNavigate,
14
+ apis,
15
+ }: {
16
+ data: OverviewData
17
+ setActiveItemData: React.Dispatch<React.SetStateAction<OverviewData | EndpointData>>
18
+ setActiveType: React.Dispatch<React.SetStateAction<'OVERVIEW' | 'ENDPOINT'>>
19
+ onProductNavigate?: (productId: number) => void
20
+ apis: OverviewData[]
21
+ }) => {
22
+ const { toggleSection } = useSectionToggle()
23
+ const [selectedUrl, setSelectedUrl] = useState(data?.servers?.[0]?.url || '')
24
+ const [isUrlDropdownOpen, setIsUrlDropdownOpen] = useState<boolean>(false)
25
+
26
+ useEffect(() => {
27
+ setSelectedUrl(data?.servers?.[0]?.url || '')
28
+ }, [data])
29
+ const handleVersionClick = (verObj) => {
30
+ if (verObj.apiSpecId === data.apiSpecId) {
31
+ setActiveType('OVERVIEW')
32
+ return
33
+ }
34
+
35
+ const matchedVersion = data.apiVersions.find((v) => v.apiSpecId === verObj.apiSpecId)
36
+
37
+ if (!matchedVersion) {
38
+ return
39
+ }
40
+
41
+ const matchedApi = apis.find((api) => api.apiSpecId === matchedVersion.apiSpecId)
42
+ setActiveItemData(matchedApi)
43
+
44
+ setActiveType('OVERVIEW')
45
+ toggleSection(
46
+ matchedApi.apiSpecId,
47
+ [
48
+ { type: SectionEnum.API_SECTION, setTo: true },
49
+ { type: SectionEnum.OVERVIEW, setTo: true },
50
+ ],
51
+ {
52
+ resetOthers: true,
53
+ filterKeys: [
54
+ SectionEnum.OVERVIEW,
55
+ SectionEnum.API_SECTION,
56
+ SectionEnum.ENDPOINTS_SECTION,
57
+ SectionEnum.TAG_SECTION,
58
+ ],
59
+ }
60
+ )
61
+ }
62
+
63
+ const handleClick = (endpoint) => {
64
+ setActiveItemData({
65
+ ...endpoint,
66
+ api: {
67
+ id: data.apiSpecId,
68
+ title: data.title,
69
+ description: data.description,
70
+ version: data.version,
71
+ ...data,
72
+ },
73
+ })
74
+ setActiveType('ENDPOINT')
75
+ const tagEntries = Object.entries(data?.tags || {})
76
+ const sectionIndex = tagEntries.findIndex(([, endpoints]) =>
77
+ endpoints.some((e) => e.id === endpoint.id)
78
+ )
79
+
80
+ const tagSectionIndex = Object.entries(data.tags)
81
+ .sort(([a], [b]) => (a === 'default' ? 1 : b === 'default' ? -1 : a.localeCompare(b)))
82
+ .findIndex(([_, tagData]) => tagData.find((t) => t.id === endpoint.id))
83
+
84
+ toggleSection(
85
+ data.apiSpecId,
86
+ [
87
+ { type: SectionEnum.API_SECTION, setTo: true },
88
+ { type: SectionEnum.ENDPOINTS_SECTION, setTo: true },
89
+ { type: SectionEnum.TAG_SECTION, setTo: true, index: tagSectionIndex },
90
+ { type: SectionEnum.RESOURCE, setTo: true, id: endpoint.id },
91
+ ],
92
+ { resetOthers: true, filterKeys: [SectionEnum.OVERVIEW] }
93
+ )
94
+ }
95
+
96
+ return (
97
+ <div className="api-details-page">
98
+ <h2 className="welcome">Welcome to</h2>
99
+ <h1 className="api-title">{data?.title}</h1>
100
+ <p className="api-version">
101
+ API Version: <span>{data?.version}</span>
102
+ </p>
103
+ <div className="custom-url-input">
104
+ <label className="input-label">API Base URL</label>
105
+ <div className="url-container">
106
+ <div className="type-ddl" onClick={() => setIsUrlDropdownOpen((prev) => !prev)}>
107
+ <span className="url-text">{selectedUrl || '-'}</span>
108
+ <div className="icon-container">
109
+ {selectedUrl.length !== 0 && (
110
+ <SVGLoader
111
+ className="icon"
112
+ role="button"
113
+ tabIndex={0}
114
+ onClick={(e) => {
115
+ e.stopPropagation()
116
+ copyToClipboard(selectedUrl)
117
+ }}
118
+ src={newCopyIcon}
119
+ />
120
+ )}
121
+ {selectedUrl.length !== 0 && (
122
+ <SVGLoader src={!isUrlDropdownOpen ? arrowDown : arrowUp} />
123
+ )}
124
+ </div>
125
+ </div>
126
+ {isUrlDropdownOpen && selectedUrl.length !== 0 && (
127
+ <div className="url-list">
128
+ {data?.servers?.map((server, index) => (
129
+ <div
130
+ key={index}
131
+ className="url-item"
132
+ onClick={() => {
133
+ setSelectedUrl(server.url)
134
+ setIsUrlDropdownOpen(false)
135
+ }}
136
+ >
137
+ <input
138
+ type="radio"
139
+ name="api-method"
140
+ checked={selectedUrl === server.url}
141
+ readOnly
142
+ />
143
+ <span>{server.url}</span>
144
+ </div>
145
+ ))}
146
+ </div>
147
+ )}
148
+ </div>
149
+ </div>
150
+
151
+ <p className="api-desc">{`${data.description || 'No Description'}`}</p>
152
+ {onProductNavigate && (
153
+ <div className="api-product-tag">
154
+ Product with this API{' '}
155
+ <span
156
+ className="product-tag"
157
+ role="button"
158
+ tabIndex={-1}
159
+ onClick={() => onProductNavigate(data.associatedProduct.productId)}
160
+ >
161
+ {data.associatedProduct.name}
162
+ </span>
163
+ </div>
164
+ )}
165
+
166
+ <h3 className="section-title">Endpoints</h3>
167
+
168
+ {Object.entries(data?.tags).map(([tag, endpoints]) => (
169
+ <div className="endpoint-group" key={tag}>
170
+ <h4 className="tag-title">{tag}</h4>
171
+ <div className="endpoint-list">
172
+ {endpoints.map((endpoint, idx) => (
173
+ <div
174
+ className="endpoint-card"
175
+ onClick={() => handleClick(endpoint)}
176
+ key={`${tag}-${idx}`}
177
+ >
178
+ <div>
179
+ <div className="endpoint-card-header">
180
+ <span className={`method-label ${endpoint.method.toLowerCase()}`}>
181
+ {endpoint.method}
182
+ </span>
183
+ <div className="title-wrapper">
184
+ <h5>
185
+ {(endpoint.summary || 'Endpoint Name').slice(0, 40)}
186
+ {(endpoint.summary?.length ?? 0) > 40 && '...'}
187
+ </h5>
188
+ </div>
189
+ </div>
190
+ <div className="endpoint-meta">
191
+ <p>{endpoint.path}</p>
192
+ <p className="description">{endpoint.description ?? 'No Description '}</p>
193
+ </div>
194
+ </div>
195
+
196
+ <div className="endpoint-arrow">
197
+ <SVGLoader src={arrowRightGray} />
198
+ </div>
199
+ </div>
200
+ ))}
201
+ </div>
202
+ </div>
203
+ ))}
204
+
205
+ {data.apiVersions?.length > 0 && (
206
+ <div className="versions-section">
207
+ <h4>API Versions</h4>
208
+ <div className="version-list">
209
+ {data.apiVersions.map((verObj, index) => (
210
+ <button
211
+ key={index}
212
+ className="version-btn"
213
+ onClick={() => handleVersionClick(verObj)}
214
+ >
215
+ {verObj.metaData?.version || 'N/A'}
216
+ </button>
217
+ ))}
218
+ </div>
219
+ </div>
220
+ )}
221
+ </div>
222
+ )
223
+ }