onOpenChanged(true)}
+ >
Syntax help:
diff --git a/packages/web/src/app/[domain]/components/syntaxGuideProvider.tsx b/packages/web/src/app/[domain]/components/syntaxGuideProvider.tsx
new file mode 100644
index 00000000..cd0c2c8b
--- /dev/null
+++ b/packages/web/src/app/[domain]/components/syntaxGuideProvider.tsx
@@ -0,0 +1,32 @@
+'use client';
+
+import { createContext, useContext, useCallback, useState } from 'react';
+
+interface SyntaxGuideContextType {
+ isOpen: boolean;
+ onOpenChanged: (isOpen: boolean) => void;
+}
+
+const SyntaxGuideContext = createContext
(null);
+
+export const useSyntaxGuide = () => {
+ const context = useContext(SyntaxGuideContext);
+ if (!context) {
+ throw new Error('useSyntaxGuide must be used within a SyntaxGuideProvider');
+ }
+ return context;
+};
+
+export const SyntaxGuideProvider = ({ children }: { children: React.ReactNode }) => {
+ const [isOpen, setIsOpen] = useState(false);
+
+ const onOpenChanged = useCallback((isOpen: boolean) => {
+ setIsOpen(isOpen);
+ }, []);
+
+ return (
+
+ {children}
+
+ );
+};
\ No newline at end of file
diff --git a/packages/web/src/app/[domain]/components/syntaxReferenceGuide.tsx b/packages/web/src/app/[domain]/components/syntaxReferenceGuide.tsx
index d2225799..bde0a67f 100644
--- a/packages/web/src/app/[domain]/components/syntaxReferenceGuide.tsx
+++ b/packages/web/src/app/[domain]/components/syntaxReferenceGuide.tsx
@@ -12,30 +12,31 @@ import {
} from "@/components/ui/table";
import clsx from "clsx";
import Link from "next/link";
-import { useCallback, useRef, useState } from "react";
+import { useCallback, useRef } from "react";
import { useHotkeys } from "react-hotkeys-hook";
+import { useSyntaxGuide } from "./syntaxGuideProvider";
const LINGUIST_LINK = "https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml";
const CTAGS_LINK = "https://ctags.io/";
export const SyntaxReferenceGuide = () => {
- const [isOpen, setIsOpen] = useState(false);
+ const { isOpen, onOpenChanged } = useSyntaxGuide();
const previousFocusedElement = useRef(null);
const openDialog = useCallback(() => {
previousFocusedElement.current = document.activeElement as HTMLElement;
- setIsOpen(true);
- }, []);
+ onOpenChanged(true);
+ }, [onOpenChanged]);
const closeDialog = useCallback(() => {
- setIsOpen(false);
+ onOpenChanged(false);
// @note: Without requestAnimationFrame, focus was not being returned
// to codemirror elements for some reason.
requestAnimationFrame(() => {
previousFocusedElement.current?.focus();
});
- }, []);
+ }, [onOpenChanged]);
const handleOpenChange = useCallback((isOpen: boolean) => {
if (isOpen) {
diff --git a/packages/web/src/app/[domain]/components/syntaxReferenceGuideHint.tsx b/packages/web/src/app/[domain]/components/syntaxReferenceGuideHint.tsx
new file mode 100644
index 00000000..fab0264a
--- /dev/null
+++ b/packages/web/src/app/[domain]/components/syntaxReferenceGuideHint.tsx
@@ -0,0 +1,17 @@
+'use client';
+
+import { useSyntaxGuide } from "./syntaxGuideProvider";
+import { KeyboardShortcutHint } from "../../components/keyboardShortcutHint";
+
+export const SyntaxReferenceGuideHint = () => {
+ const { isOpen, onOpenChanged } = useSyntaxGuide();
+
+ return (
+ onOpenChanged(!isOpen)}
+ >
+ Reference guide:
+
+ )
+}
\ No newline at end of file
diff --git a/packages/web/src/app/[domain]/components/upgradeToast.tsx b/packages/web/src/app/[domain]/components/upgradeToast.tsx
index 73342266..e3b8bf29 100644
--- a/packages/web/src/app/[domain]/components/upgradeToast.tsx
+++ b/packages/web/src/app/[domain]/components/upgradeToast.tsx
@@ -2,9 +2,10 @@
import { useToast } from "@/components/hooks/use-toast";
import { ToastAction } from "@/components/ui/toast";
-import { NEXT_PUBLIC_SOURCEBOT_VERSION } from "@/lib/environment.client";
import { useEffect } from "react";
import { useLocalStorage } from "usehooks-ts";
+import { getVersion } from "@/app/api/(client)/client";
+import { useQuery } from "@tanstack/react-query";
const GITHUB_TAGS_URL = "https://api.github.com/repos/sourcebot-dev/sourcebot/tags";
const SEMVER_REGEX = /^v(\d+)\.(\d+)\.(\d+)$/;
@@ -23,8 +24,18 @@ export const UpgradeToast = () => {
new Date(0).toUTCString()
);
+ const { data: versionString } = useQuery({
+ queryKey: ["version"],
+ queryFn: () => getVersion(),
+ select: (data) => data.version,
+ })
+
useEffect(() => {
- const currentVersion = getVersionFromString(NEXT_PUBLIC_SOURCEBOT_VERSION);
+ if (!versionString) {
+ return;
+ }
+
+ const currentVersion = getVersionFromString(versionString);
if (!currentVersion) {
return;
}
@@ -71,7 +82,7 @@ export const UpgradeToast = () => {
setUpgradeToastLastShownDate(new Date().toUTCString());
});
- }, [setUpgradeToastLastShownDate, toast, upgradeToastLastShownDate]);
+ }, [setUpgradeToastLastShownDate, toast, upgradeToastLastShownDate, versionString]);
return null;
}
diff --git a/packages/web/src/app/[domain]/layout.tsx b/packages/web/src/app/[domain]/layout.tsx
index 7aefbbc9..e04a0dd7 100644
--- a/packages/web/src/app/[domain]/layout.tsx
+++ b/packages/web/src/app/[domain]/layout.tsx
@@ -11,6 +11,7 @@ import { getSelectorsByUserAgent } from "react-device-detect";
import { MobileUnsupportedSplashScreen } from "./components/mobileUnsupportedSplashScreen";
import { MOBILE_UNSUPPORTED_SPLASH_SCREEN_DISMISSED_COOKIE_NAME } from "@/lib/constants";
import { SyntaxReferenceGuide } from "./components/syntaxReferenceGuide";
+import { SyntaxGuideProvider } from "./components/syntaxGuideProvider";
interface LayoutProps {
children: React.ReactNode,
@@ -81,9 +82,9 @@ export default async function Layout({
)
}
return (
- <>
+
{children}
- >
+
)
}
\ No newline at end of file
diff --git a/packages/web/src/app/[domain]/page.tsx b/packages/web/src/app/[domain]/page.tsx
index 02a37787..3d380d4b 100644
--- a/packages/web/src/app/[domain]/page.tsx
+++ b/packages/web/src/app/[domain]/page.tsx
@@ -8,7 +8,7 @@ import { PageNotFound } from "./components/pageNotFound";
import { Footer } from "@/app/components/footer";
import { SourcebotLogo } from "../components/sourcebotLogo";
import { RepositorySnapshot } from "./components/repositorySnapshot";
-import { KeyboardShortcutHint } from "./components/keyboardShortcutHint";
+import { SyntaxReferenceGuideHint } from "./components/syntaxReferenceGuideHint";
export default async function Home({ params: { domain } }: { params: { domain: string } }) {
const org = await getOrgFromDomain(domain);
@@ -88,9 +88,7 @@ export default async function Home({ params: { domain } }: { params: { domain: s