Skip to content

Commit 04ca027

Browse files
authored
Merge pull request #933 from docat-org/feature/web-cleanup
Cleanup dependencies a bit more
2 parents fa082e4 + 0cb9c37 commit 04ca027

File tree

11 files changed

+194
-517
lines changed

11 files changed

+194
-517
lines changed

web/package.json

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,15 @@
88
"@emotion/styled": "^11.14.1",
99
"@mui/icons-material": "^7.3.9",
1010
"@mui/material": "^7.3.9",
11-
"@types/lodash": "^4.17.24",
12-
"@types/node": "^25.4.0",
13-
"@types/react": "^19.2.14",
14-
"@types/react-dom": "^19.2.3",
15-
"@vitejs/plugin-react-swc": "^4.2.3",
1611
"fuse.js": "^7.1.0",
17-
"jsdom": "^28.1.0",
18-
"lodash": "^4.17.23",
1912
"react": "^19.2.4",
2013
"react-dom": "^19.2.4",
2114
"react-markdown": "^10.1.0",
2215
"react-router": "^7.13.1",
2316
"react-router-dom": "^7.13.1",
2417
"semver": "^7.7.4",
2518
"typescript": "^5.9.3",
26-
"vite": "^7.3.1",
27-
"vite-plugin-svgr": "^4.5.0",
28-
"vitest": "^4.0.18",
29-
"web-vitals": "^5.1.0"
19+
"vite": "^7.3.1"
3020
},
3121
"scripts": {
3222
"start": "VITE_DOCAT_VERSION=$(git describe --tags --always) vite",
@@ -48,14 +38,20 @@
4838
]
4939
},
5040
"devDependencies": {
41+
"@vitejs/plugin-react-swc": "^4.3.0",
5142
"@eslint/js": "^9.17.0",
5243
"@types/semver": "^7.7.1",
44+
"@types/node": "^25.4.0",
45+
"@types/react": "^19.2.14",
46+
"@types/react-dom": "^19.2.3",
47+
"jsdom": "^28.1.0",
5348
"eslint": "^9.17.0",
5449
"eslint-config-prettier": "^10.0.1",
5550
"eslint-plugin-react": "^7.37.3",
5651
"eslint-plugin-react-hooks": "^7.0.1",
5752
"globals": "^17.4.0",
5853
"prettier": "^3.8.1",
59-
"typescript-eslint": "^8.57.0"
54+
"typescript-eslint": "^8.57.0",
55+
"vitest": "^4.0.18"
6056
}
6157
}

web/src/components/DocumentControlButtons.tsx

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ interface Props {
1919
version: string
2020
versions: ProjectDetails[]
2121
onVersionChange: (version: string) => void
22+
getShareUrl: (options: { useLatest: boolean, hideUi: boolean }) => string
2223
}
2324

2425
export default function DocumentControlButtons(props: Props): React.JSX.Element {
@@ -31,25 +32,6 @@ export default function DocumentControlButtons(props: Props): React.JSX.Element
3132
// Cannot copy when page is served over HTTP
3233
const canCopy = navigator.clipboard !== undefined
3334

34-
const getShareUrl = (): string => {
35-
// adapt the current URL so we can leave Docs.tsx's state as refs
36-
// (which means if the page was passed down as a prop it wouldn't update correctly)
37-
38-
let url = window.location.href
39-
40-
if (shareModalUseLatest) {
41-
url = url.replace(props.version, 'latest')
42-
}
43-
44-
if (shareModalHideUi) {
45-
const urlObject = new URL(url)
46-
urlObject.search = 'hide-ui'
47-
url = urlObject.toString()
48-
}
49-
50-
return url
51-
}
52-
5335
return (
5436
<div className={styles.controls}>
5537
<Tooltip title="Docs Overview" placement="top" arrow>
@@ -111,14 +93,14 @@ export default function DocumentControlButtons(props: Props): React.JSX.Element
11193
>
11294
<div className={styles['share-modal']}>
11395
<div className={styles['share-modal-link-container']}>
114-
<p className={styles['share-modal-link']}>{getShareUrl()}</p>
96+
<p className={styles['share-modal-link']}>{props.getShareUrl({ useLatest: shareModalUseLatest, hideUi: shareModalHideUi })}</p>
11597
{canCopy && (
11698
<div className={styles['share-modal-copy-container']}>
11799
<button
118100
className={styles['share-modal-copy']}
119101
onClick={() => {
120102
void (async () => {
121-
await navigator.clipboard.writeText(getShareUrl())
103+
await navigator.clipboard.writeText(props.getShareUrl({ useLatest: shareModalUseLatest, hideUi: shareModalHideUi }))
122104
})()
123105
}}
124106
>

web/src/components/IFrame.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useRef } from 'react'
2-
import { uniqueId } from 'lodash'
2+
import { generateKey } from '../data-providers/RandomId'
33

44
import styles from '../style/components/IFrame.module.css'
55
interface Props {
@@ -146,7 +146,7 @@ export default function IFrame(props: Props): React.JSX.Element {
146146
return (
147147
<iframe
148148
ref={iFrameRef}
149-
key={uniqueId()}
149+
key={generateKey()}
150150
className={styles['docs-iframe']}
151151
src={props.src}
152152
title="docs"

web/src/components/InfoBanner.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Alert, Snackbar } from '@mui/material'
2-
import { uniqueId } from 'lodash'
32
import React, { useState } from 'react'
43
import { type Message } from '../data-providers/MessageBannerProvider'
4+
import { generateKey } from '../data-providers/RandomId'
55

66
interface Props {
77
message: Message
@@ -18,7 +18,7 @@ export default function Banner(props: Props): React.JSX.Element {
1818

1919
return (
2020
<Snackbar
21-
key={uniqueId()}
21+
key={generateKey()}
2222
open={show && props.message.content != null}
2323
autoHideDuration={props.message.showMs}
2424
onClose={() => {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Generate a mostly random key
2+
export const generateKey = () => {
3+
// Use the native function not available in http mode
4+
if (window.crypto && crypto.randomUUID) {
5+
return crypto.randomUUID();
6+
}
7+
8+
// Fallback
9+
return Date.now().toString(36) + Math.random().toString(36).substring(2);
10+
}

0 commit comments

Comments
 (0)