Skip to content

Commit c737b5f

Browse files
committed
add new version popup
1 parent dbb9258 commit c737b5f

File tree

5 files changed

+8489
-2212
lines changed

5 files changed

+8489
-2212
lines changed

.changeset/five-bugs-applaud.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"htmldocs": patch
3+
"htmldocs-starter": patch
4+
---
5+
6+
add new version popup

apps/docs/getting-started.mdx

+5-5
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,19 @@ If you prefer to set up htmldocs manually, follow these steps:
7979
<CodeGroup>
8080

8181
```bash npm
82-
npm install htmldocs @htmldocs/react @htmldocs/render
82+
npm install @htmldocs/react @htmldocs/render
8383
```
8484

8585
```bash pnpm
86-
pnpm add htmldocs @htmldocs/react @htmldocs/render
86+
pnpm add @htmldocs/react @htmldocs/render
8787
```
8888

8989
```bash yarn
90-
yarn add htmldocs @htmldocs/react @htmldocs/render
90+
yarn add @htmldocs/react @htmldocs/render
9191
```
9292

9393
```bash bun
94-
bun add htmldocs @htmldocs/react @htmldocs/render
94+
bun add @htmldocs/react @htmldocs/render
9595
```
9696

9797
</CodeGroup>
@@ -101,7 +101,7 @@ bun add htmldocs @htmldocs/react @htmldocs/render
101101
```json
102102
{
103103
"scripts": {
104-
"dev": "htmldocs dev",
104+
"dev": "npx htmldocs@latest dev",
105105
}
106106
}
107107
```

packages/htmldocs/public/template/package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@
44
"private": true,
55
"scripts": {
66
"lint": "eslint . --max-warnings 0",
7-
"dev": "htmldocs dev"
7+
"dev": "npx htmldocs@latest dev"
88
},
99
"dependencies": {
1010
"@formatjs/intl": "^2.10.4",
1111
"@htmldocs/react": "workspace:0.2.24",
1212
"@htmldocs/render": "workspace:0.2.24",
1313
"@react-email/components": "0.0.18",
1414
"clsx": "^2.1.1",
15-
"htmldocs": "workspace:0.2.24",
1615
"markdown-it": "^14.1.0",
1716
"react": "^18.2.0",
1817
"react-dom": "^18.2.0",

packages/htmldocs/src/app/components/sidebar/sidebar.tsx

+100-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,74 @@ import { useDocuments } from '~/contexts/documents';
88
import { Logo } from '../logo';
99
import ThemeToggle from '../theme-toggle';
1010
import { Button } from '../ui/button';
11+
import { X } from '@phosphor-icons/react';
12+
13+
const VERSION = '0.1.24';
14+
const VERSION_CHECK_INTERVAL = 1000 * 60 * 60 * 24; // Check once per day
15+
16+
const compareVersions = (v1: string, v2: string): number => {
17+
// Split version string at '-' to separate main version from prerelease (if any)
18+
const [main1, pre1] = v1.split('-');
19+
const [main2, pre2] = v2.split('-');
20+
21+
// Split main version into major, minor, patch numbers
22+
const parts1 = main1?.split('.').map(Number) ?? [];
23+
const parts2 = main2?.split('.').map(Number) ?? [];
24+
25+
// Compare major, minor, and patch values
26+
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
27+
const num1 = parts1[i] || 0;
28+
const num2 = parts2[i] || 0;
29+
if (num1 !== num2) {
30+
return num1 - num2;
31+
}
32+
}
33+
34+
// If the numeric (stable) parts are equal, handle prerelease parts.
35+
// A version without a prerelease is considered greater than one with a prerelease.
36+
if (pre1 && !pre2) {
37+
return -1;
38+
} else if (!pre1 && pre2) {
39+
return 1;
40+
} else if (pre1 && pre2) {
41+
// Lexicographical comparison for prerelease strings.
42+
if (pre1 === pre2) return 0;
43+
return pre1 > pre2 ? 1 : -1;
44+
}
45+
46+
return 0;
47+
};
48+
49+
const useVersionCheck = () => {
50+
const [newVersion, setNewVersion] = React.useState<string | null>(null);
51+
52+
React.useEffect(() => {
53+
const checkVersion = async () => {
54+
try {
55+
const response = await fetch('https://registry.npmjs.org/htmldocs/latest');
56+
const data = await response.json();
57+
const latestVersion = data.version;
58+
59+
// If a latestVersion is available and it is greater than our current version, set it as new.
60+
if (latestVersion && compareVersions(latestVersion, VERSION) > 0) {
61+
setNewVersion(latestVersion);
62+
}
63+
} catch (error) {
64+
console.error('Failed to check for new version:', error);
65+
}
66+
};
67+
68+
// Check immediately
69+
checkVersion();
70+
71+
// Set up interval for periodic checks
72+
const interval = setInterval(checkVersion, VERSION_CHECK_INTERVAL);
73+
74+
return () => clearInterval(interval);
75+
}, []);
76+
77+
return newVersion;
78+
};
1179

1280
interface SidebarProps {
1381
className?: string;
@@ -21,6 +89,8 @@ export const Sidebar = ({
2189
style,
2290
}: SidebarProps) => {
2391
const { documentsDirectoryMetadata } = useDocuments();
92+
const newVersion = useVersionCheck();
93+
const [isDismissed, setIsDismissed] = React.useState(false);
2494

2595
return (
2696
<aside
@@ -31,7 +101,7 @@ export const Sidebar = ({
31101
<Logo />
32102
<ThemeToggle />
33103
</div>
34-
<nav className="p-4 flex-grow lg:pt-0 pl-0 w-screen h-[calc(100vh_-_70px)] lg:w-full lg:min-w-[275px] lg:max-w-[275px] flex flex-col overflow-y-auto">
104+
<nav className="p-4 flex-grow lg:pt-0 pl-0 w-screen h-[calc(100vh_-_70px)] lg:w-full lg:min-w-[275px] lg:max-w-[275px] flex flex-col overflow-y-auto justify-between">
35105
<Collapsible.Root>
36106
<React.Suspense>
37107
<SidebarDirectoryChildren
@@ -42,6 +112,35 @@ export const Sidebar = ({
42112
/>
43113
</React.Suspense>
44114
</Collapsible.Root>
115+
{newVersion && !isDismissed && (
116+
<div className="ml-4 p-2 bg-secondary flex items-center justify-between border border-border rounded-md">
117+
<div>
118+
<p className="text-xs text-foreground">
119+
New version (
120+
<a
121+
href="https://www.npmjs.com/package/htmldocs"
122+
target="_blank"
123+
rel="noopener noreferrer"
124+
className="hover:underline"
125+
>
126+
{newVersion}
127+
</a>
128+
) available
129+
</p>
130+
<p className="text-xs text-muted-foreground">
131+
npm install -g htmldocs@latest
132+
</p>
133+
</div>
134+
<Button
135+
variant="ghost"
136+
size="icon"
137+
className="h-6 w-6"
138+
onClick={() => setIsDismissed(true)}
139+
>
140+
<X className="h-4 w-4" />
141+
</Button>
142+
</div>
143+
)}
45144
</nav>
46145
</aside>
47146
);

0 commit comments

Comments
 (0)