Content-Length: 582904 | pFad | http://github.com/drawdb-io/drawdb/pull/152/commits/22a7603c210f8dc3941d8d11da36c8c035e0aac2

34 Add offline PWA support by FelixZY · Pull Request #152 · drawdb-io/drawdb · GitHub
Skip to content

Add offline PWA support #152

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
fix: minor PWA fixes and implement offline support
Minor fixes such as setting the start_url to `/editor`. Also add
complete offline support by updating configuration.

This is especially nice for mobile users.

I've had some slight issues running this via `npm run dev`.
However, `npm run build && npm run preview` seems to work fine.
  • Loading branch information
FelixZY committed Jul 12, 2024
commit 22a7603c210f8dc3941d8d11da36c8c035e0aac2
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ lerna-debug.log*
node_modules
dist
dist-ssr
dev-dist
*.local

# Editor directories and files
Expand Down
3 changes: 2 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@
"prettier": "3.2.5",
"tailwindcss": "^3.3.6",
"vite": "^5.0.11",
"vite-plugin-pwa": "^0.20.0"
"vite-plugin-pwa": "^0.20.0",
"workbox-window": "^7.1.0"
},
"overrides": {
"follow-redirects": "^1.15.4"
Expand Down
2 changes: 2 additions & 0 deletions src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import LandingPage from "./pages/LandingPage";
import SettingsContextProvider from "./context/SettingsContext";
import useSettings from "./hooks/useSettings";
import NotFound from "./pages/NotFound";
import { PwaUpdatePrompt } from "./components/PwaUpdatePrompt";

export default function App() {
return (
Expand Down Expand Up @@ -53,6 +54,7 @@ export default function App() {
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
<PwaUpdatePrompt />
</SettingsContextProvider>
);
}
Expand Down
24 changes: 19 additions & 5 deletions src/components/EditorHeader/ControlPanel.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { useState } from "react";
import { useRegisterSW } from "virtual:pwa-register/react";
import {
IconCaretdown,
IconCloud,
IconChevronRight,
IconChevronUp,
IconChevronDown,
Expand All @@ -18,6 +20,7 @@ import {
InputNumber,
Tooltip,
Spin,
Tag,
Toast,
Popconfirm,
} from "@douyinfe/semi-ui";
Expand Down Expand Up @@ -1287,9 +1290,13 @@ export default function ControlPanel({
});
useHotkeys("ctrl+alt+w, meta+alt+w", fitWindow, { preventDefault: true });

const {
offlineReady: [isOfflineReady],
} = useRegisterSW();

return (
<>
{layout.header && header()}
{layout.header && header(isOfflineReady)}
{layout.toolbar && toolbar()}
<Modal
modal={modal}
Expand Down Expand Up @@ -1498,10 +1505,10 @@ export default function ControlPanel({
}
}

function header() {
function header(isOfflineReady) {
return (
<nav className="flex justify-between pt-1 items-center whitespace-nowrap">
<div className="flex justify-start items-center">
<div className="flex justify-start items-center grow">
<Link to="/">
<img
width={54}
Expand All @@ -1510,7 +1517,7 @@ export default function ControlPanel({
className="ms-8 min-w-[54px]"
/>
</Link>
<div className="ms-1 mt-1">
<div className="ms-1 sm:me-1 xl:me-6 mt-1 grow">
<div className="flex items-center ms-3 gap-2">
{databases[database].image && (
<img
Expand All @@ -1535,7 +1542,7 @@ export default function ControlPanel({
</div>
{(showEditName || modal === MODAL.RENAME) && <IconEdit />}
</div>
<div className="flex justify-between items-center">
<div className="flex justify-start items-center">
<div className="flex justify-start text-md select-none me-2">
{Object.keys(menu).map((category) => (
<Dropdown
Expand Down Expand Up @@ -1642,6 +1649,13 @@ export default function ControlPanel({
>
{getState()}
</Button>
{isOfflineReady && (
<span className="ms-auto">
<Tag prefixIcon={<IconCloud />} size="large">
{t("available_offline")}
</Tag>
</span>
)}
</div>
</div>
</div>
Expand Down
34 changes: 34 additions & 0 deletions src/components/PwaUpdatePrompt.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { useRegisterSW } from "virtual:pwa-register/react";
import { Typography, Toast } from "@douyinfe/semi-ui";
import { useEffect } from "react";
import { useTranslation } from "react-i18next";
const { Text } = Typography;

export function PwaUpdatePrompt() {
const { t } = useTranslation();
const {
needRefresh: [isRefreshNeeded],
updateServiceWorker,
} = useRegisterSW();

useEffect(() => {
if (!isRefreshNeeded) return;

Toast.info({
duration: 0, // indefinite
content: (
<div>
<h5>{t("update_available")}</h5>
<p className="text-xs">{t("reload_page_to_update")}</p>
<div className="mt-2">
<Text link onClick={updateServiceWorker}>
{t("reload_now")}
</Text>
</div>
</div>
),
});
}, [isRefreshNeeded, updateServiceWorker, t]);

return <></>;
}
4 changes: 4 additions & 0 deletions src/i18n/locales/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ const english = {

const en = {
translation: {
available_offline: "Available offline",
update_available: "An updated version of drawDB is available!",
reload_page_to_update: "Reload the page to update",
reload_now: "Reload now",
report_bug: "Report a bug",
import: "Import",
file: "File",
Expand Down
90 changes: 49 additions & 41 deletions vite.config.js
Original file line number Diff line number Diff line change
@@ -1,47 +1,55 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { VitePWA } from "vite-plugin-pwa";
const manifestForPlugIn = {
registerType: "prompt",
includeAssests: ["favicon.ico", "apple-touc-icon.png"],
manifest: {
name: "DrawDB",
short_name: "DrawDB",
icons: [
{
src: "/pwa-192x192.png",
sizes: "192x192",
type: "image/png",
purpose: "any",
},
{
src: "/pwa-512x512.png",
sizes: "512x512",
type: "image/png",
purpose: "any",
},
{
src: "/pwa-maskable-192x192.png",
sizes: "192x192",
type: "image/png",
purpose: "maskable",
},
{
src: "/pwa-maskable-512x512.png",
sizes: "512x512",
type: "image/png",
purpose: "maskable",
},
],
start_url: "/editor",
display: "standalone",
background_color: "#14475b",
theme_color: "#14475b",
description:
"Free, simple, and intuitive database design tool and SQL generator.",
},
};

// https://vitejs.dev/config/
export default defineConfig({
plugins: [react(), VitePWA(manifestForPlugIn)],
plugins: [
react(),
VitePWA({
workbox: {
globPatterns: ["**/*"],
maximumFileSizeToCacheInBytes: 15_000_000,
},
includeAssets: ["**/*"],
registerType: "prompt",
manifest: {
name: "DrawDB",
short_name: "DrawDB",
icons: [
{
src: "/pwa-192x192.png",
sizes: "192x192",
type: "image/png",
purpose: "any",
},
{
src: "/pwa-512x512.png",
sizes: "512x512",
type: "image/png",
purpose: "any",
},
{
src: "/pwa-maskable-192x192.png",
sizes: "192x192",
type: "image/png",
purpose: "maskable",
},
{
src: "/pwa-maskable-512x512.png",
sizes: "512x512",
type: "image/png",
purpose: "maskable",
},
],
scope: "/",
start_url: "/editor",
display: "standalone",
background_color: "#14475b",
theme_color: "#14475b",
description:
"Free, simple, and intuitive database design tool and SQL generator.",
},
}),
],
});
Loading








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/drawdb-io/drawdb/pull/152/commits/22a7603c210f8dc3941d8d11da36c8c035e0aac2

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy