diff --git a/packages/repl/package.json b/packages/repl/package.json index 64eace8..428a7fe 100644 --- a/packages/repl/package.json +++ b/packages/repl/package.json @@ -18,6 +18,8 @@ "@mtcute/convert": "^0.19.8", "@mtcute/web": "^0.19.5", "@nanostores/persistent": "^0.10.2", + "@tanstack/solid-query": "^5.64.2", + "@tanstack/solid-query-persist-client": "^5.64.2", "@tanstack/solid-table": "^8.20.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", diff --git a/packages/repl/src/App.tsx b/packages/repl/src/App.tsx index 37aa3db..c13d922 100644 --- a/packages/repl/src/App.tsx +++ b/packages/repl/src/App.tsx @@ -1,9 +1,15 @@ import type { RunnerController } from './components/runner/Runner.tsx' import { ColorModeProvider, ColorModeScript } from '@kobalte/core' +import { + QueryClient, + QueryClientProvider, +} from '@tanstack/solid-query' +import { LucidePartyPopper } from 'lucide-solid' import { workerInit } from 'mtcute-repl-worker/client' import { createSignal, lazy, onCleanup, onMount, Show } from 'solid-js' import { toast } from 'solid-sonner' +import { ChangelogDialog } from './components/changelog/Changelog.tsx' import { EditorTabs } from './components/editor/EditorTabs.tsx' import { NavbarMenu } from './components/nav/NavbarMenu.tsx' import { Runner } from './components/runner/Runner.tsx' @@ -14,8 +20,11 @@ import { Toaster } from './lib/components/ui/sonner.tsx' const Editor = lazy(() => import('./components/editor/Editor.tsx')) +const queryClient = new QueryClient() + export function App() { const [updating, setUpdating] = createSignal(true) + const [showChangelog, setShowChangelog] = createSignal(false) const [showSettings, setShowSettings] = createSignal(false) const [settingsTab, setSettingsTab] = createSignal('accounts') const [runnerController, setRunnerController] = createSignal() @@ -27,6 +36,32 @@ export function App() { let workerIframe!: HTMLIFrameElement onMount(() => { + const localBuild = localStorage.getItem('repl:buildVersion') + const latestBuild: string = import.meta.env.BUILD_VERSION + + if (localBuild === null || new Date(localBuild) !== new Date(latestBuild)) { + localStorage.setItem('repl:buildVersion', latestBuild) + setTimeout(() => { + toast.custom(t => ( +
{ + setShowChangelog(true) + toast.dismiss(t) + }} + > + +
+
Playground updated!
+
Click here to see the latest changes.
+
+
+ ), { + important: true, + }) + }, 1000) + } + workerInit(workerIframe).then(() => { setIframeLoading(false) }) @@ -46,79 +81,89 @@ export function App() {
- -