diff --git a/README.md b/README.md index 12434ea3..1c3862a9 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,11 @@ For Windows targets, “Build Tools for Visual Studio 2022” (or a higher editi ```bash pnpm tauri dev ``` +For ios: + +```bash +pnpm tauri ios dev +``` ### 5. Build for Production diff --git a/apps/readest-app/src-tauri/capabilities/default.json b/apps/readest-app/src-tauri/capabilities/default.json index de94afd0..969cda50 100644 --- a/apps/readest-app/src-tauri/capabilities/default.json +++ b/apps/readest-app/src-tauri/capabilities/default.json @@ -55,11 +55,9 @@ "core:window:allow-start-dragging", "core:window:allow-toggle-maximize", "shell:default", - "updater:default", "process:default", "process:allow-exit", "process:allow-restart", - "cli:default", "oauth:allow-start", "oauth:allow-cancel", "opener:default" diff --git a/apps/readest-app/src-tauri/capabilities/desktop.json b/apps/readest-app/src-tauri/capabilities/desktop.json new file mode 100644 index 00000000..c6851ffc --- /dev/null +++ b/apps/readest-app/src-tauri/capabilities/desktop.json @@ -0,0 +1,10 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "desktop-capability", + "windows": ["main"], + "platforms": ["linux", "macOS", "windows"], + "permissions": [ + "updater:default", + "cli:default" + ] +} diff --git a/apps/readest-app/src-tauri/icons/128x128.png b/apps/readest-app/src-tauri/icons/128x128.png index 2d8aa82d..cfce0939 100644 Binary files a/apps/readest-app/src-tauri/icons/128x128.png and b/apps/readest-app/src-tauri/icons/128x128.png differ diff --git a/apps/readest-app/src-tauri/icons/128x128@2x.png b/apps/readest-app/src-tauri/icons/128x128@2x.png index 1a3caa24..ba06a687 100644 Binary files a/apps/readest-app/src-tauri/icons/128x128@2x.png and b/apps/readest-app/src-tauri/icons/128x128@2x.png differ diff --git a/apps/readest-app/src-tauri/icons/32x32.png b/apps/readest-app/src-tauri/icons/32x32.png index 3c14a56e..a3420e6e 100644 Binary files a/apps/readest-app/src-tauri/icons/32x32.png and b/apps/readest-app/src-tauri/icons/32x32.png differ diff --git a/apps/readest-app/src-tauri/icons/Square107x107Logo.png b/apps/readest-app/src-tauri/icons/Square107x107Logo.png index e82a31e2..72a44e80 100644 Binary files a/apps/readest-app/src-tauri/icons/Square107x107Logo.png and b/apps/readest-app/src-tauri/icons/Square107x107Logo.png differ diff --git a/apps/readest-app/src-tauri/icons/Square142x142Logo.png b/apps/readest-app/src-tauri/icons/Square142x142Logo.png index d32319e6..6ba46454 100644 Binary files a/apps/readest-app/src-tauri/icons/Square142x142Logo.png and b/apps/readest-app/src-tauri/icons/Square142x142Logo.png differ diff --git a/apps/readest-app/src-tauri/icons/Square150x150Logo.png b/apps/readest-app/src-tauri/icons/Square150x150Logo.png index a94a549e..448063de 100644 Binary files a/apps/readest-app/src-tauri/icons/Square150x150Logo.png and b/apps/readest-app/src-tauri/icons/Square150x150Logo.png differ diff --git a/apps/readest-app/src-tauri/icons/Square284x284Logo.png b/apps/readest-app/src-tauri/icons/Square284x284Logo.png index 0f302746..4525a3f1 100644 Binary files a/apps/readest-app/src-tauri/icons/Square284x284Logo.png and b/apps/readest-app/src-tauri/icons/Square284x284Logo.png differ diff --git a/apps/readest-app/src-tauri/icons/Square30x30Logo.png b/apps/readest-app/src-tauri/icons/Square30x30Logo.png index c3dfc947..b2053f88 100644 Binary files a/apps/readest-app/src-tauri/icons/Square30x30Logo.png and b/apps/readest-app/src-tauri/icons/Square30x30Logo.png differ diff --git a/apps/readest-app/src-tauri/icons/Square310x310Logo.png b/apps/readest-app/src-tauri/icons/Square310x310Logo.png index 1602440c..290e98db 100644 Binary files a/apps/readest-app/src-tauri/icons/Square310x310Logo.png and b/apps/readest-app/src-tauri/icons/Square310x310Logo.png differ diff --git a/apps/readest-app/src-tauri/icons/Square44x44Logo.png b/apps/readest-app/src-tauri/icons/Square44x44Logo.png index da8a1365..6e708f0c 100644 Binary files a/apps/readest-app/src-tauri/icons/Square44x44Logo.png and b/apps/readest-app/src-tauri/icons/Square44x44Logo.png differ diff --git a/apps/readest-app/src-tauri/icons/Square71x71Logo.png b/apps/readest-app/src-tauri/icons/Square71x71Logo.png index 4bae1cdb..ce091ee0 100644 Binary files a/apps/readest-app/src-tauri/icons/Square71x71Logo.png and b/apps/readest-app/src-tauri/icons/Square71x71Logo.png differ diff --git a/apps/readest-app/src-tauri/icons/Square89x89Logo.png b/apps/readest-app/src-tauri/icons/Square89x89Logo.png index a386f421..1ea8c148 100644 Binary files a/apps/readest-app/src-tauri/icons/Square89x89Logo.png and b/apps/readest-app/src-tauri/icons/Square89x89Logo.png differ diff --git a/apps/readest-app/src-tauri/icons/StoreLogo.png b/apps/readest-app/src-tauri/icons/StoreLogo.png index 481e0ac6..5f07447c 100644 Binary files a/apps/readest-app/src-tauri/icons/StoreLogo.png and b/apps/readest-app/src-tauri/icons/StoreLogo.png differ diff --git a/apps/readest-app/src-tauri/icons/icon.icns b/apps/readest-app/src-tauri/icons/icon.icns index d3c8e297..0fc2d862 100644 Binary files a/apps/readest-app/src-tauri/icons/icon.icns and b/apps/readest-app/src-tauri/icons/icon.icns differ diff --git a/apps/readest-app/src-tauri/icons/icon.ico b/apps/readest-app/src-tauri/icons/icon.ico index 4be4cfdb..9a6fa22c 100644 Binary files a/apps/readest-app/src-tauri/icons/icon.ico and b/apps/readest-app/src-tauri/icons/icon.ico differ diff --git a/apps/readest-app/src-tauri/src/lib.rs b/apps/readest-app/src-tauri/src/lib.rs index e29a6f34..d3c5c284 100644 --- a/apps/readest-app/src-tauri/src/lib.rs +++ b/apps/readest-app/src-tauri/src/lib.rs @@ -74,7 +74,6 @@ async fn start_server(window: Window) -> Result { pub fn run() { let builder = tauri::Builder::default() .plugin(tauri_plugin_process::init()) - .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_oauth::init()) .invoke_handler(tauri::generate_handler![start_server]) .plugin(tauri_plugin_shell::init()) @@ -84,6 +83,9 @@ pub fn run() { .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_fs::init()); + #[cfg(desktop)] + let builder = builder.plugin(tauri_plugin_updater::Builder::new().build()); + #[cfg(target_os = "macos")] let builder = builder.plugin(tauri_traffic_light_positioner_plugin::init()); @@ -120,8 +122,19 @@ pub fn run() { }); } } + #[cfg(desktop)] - app.handle().plugin(tauri_plugin_cli::init())?; + { + app.handle().plugin(tauri_plugin_cli::init())?; + + let app_handle = app.handle().clone(); + app.listen("window-ready", move |_| { + app_handle.get_webview_window("main").unwrap() + .eval("window.__READEST_CLI_ACCESS = true; window.__READEST_UPDATER_ACCESS = true;") + .expect("Failed to set cli access config"); + }); + } + #[cfg(desktop)] if cfg!(debug_assertions) { app.handle().plugin( @@ -130,7 +143,11 @@ pub fn run() { .build(), )?; } - let win_builder = WebviewWindowBuilder::new(app, "main", WebviewUrl::default()) + + let win_builder = WebviewWindowBuilder::new(app, "main", WebviewUrl::default()); + + #[cfg(desktop)] + let win_builder = win_builder .inner_size(800.0, 600.0) .resizable(true) .maximized(true); @@ -141,7 +158,7 @@ pub fn run() { .title_bar_style(TitleBarStyle::Overlay) .title(""); - #[cfg(not(target_os = "macos"))] + #[cfg(all(not(target_os = "macos"), desktop))] let win_builder = win_builder .decorations(false) .transparent(true) @@ -163,7 +180,7 @@ pub fn run() { .run( #[allow(unused_variables)] |app_handle, event| { - #[cfg(any(target_os = "macos", target_os = "ios"))] + #[cfg(target_os = "macos")] if let tauri::RunEvent::Opened { urls } = event { let files = urls .into_iter() diff --git a/apps/readest-app/src/app/library/page.tsx b/apps/readest-app/src/app/library/page.tsx index 467931bb..d224f55d 100644 --- a/apps/readest-app/src/app/library/page.tsx +++ b/apps/readest-app/src/app/library/page.tsx @@ -8,7 +8,7 @@ import { Book } from '@/types/book'; import { AppService } from '@/types/system'; import { navigateToReader } from '@/utils/nav'; import { parseOpenWithFiles } from '@/helpers/cli'; -import { isTauriAppPlatform } from '@/services/environment'; +import { isTauriAppPlatform, hasUpdater } from '@/services/environment'; import { checkForAppUpdates } from '@/helpers/updater'; import { FILE_ACCEPT_FORMATS, SUPPORTED_FILE_EXTS } from '@/services/constants'; @@ -46,7 +46,7 @@ const LibraryPage = () => { useEffect(() => { const doAppUpdates = async () => { - if (isTauriAppPlatform()) { + if (hasUpdater()) { await checkForAppUpdates(); } }; diff --git a/apps/readest-app/src/app/reader/page.tsx b/apps/readest-app/src/app/reader/page.tsx index faa1228a..176eea72 100644 --- a/apps/readest-app/src/app/reader/page.tsx +++ b/apps/readest-app/src/app/reader/page.tsx @@ -2,7 +2,7 @@ import { useEffect } from 'react'; import { useTheme } from '@/hooks/useTheme'; -import { isTauriAppPlatform } from '@/services/environment'; +import { hasUpdater } from '@/services/environment'; import { checkForAppUpdates } from '@/helpers/updater'; import Reader from './components/Reader'; @@ -10,7 +10,7 @@ export default function Page() { useTheme(); useEffect(() => { const doAppUpdates = async () => { - if (isTauriAppPlatform()) { + if (hasUpdater()) { await checkForAppUpdates(); } }; diff --git a/apps/readest-app/src/components/WindowButtons.tsx b/apps/readest-app/src/components/WindowButtons.tsx index adcccbed..ecd568f4 100644 --- a/apps/readest-app/src/components/WindowButtons.tsx +++ b/apps/readest-app/src/components/WindowButtons.tsx @@ -1,5 +1,6 @@ import clsx from 'clsx'; import React, { useEffect, useRef } from 'react'; +import { useEnv } from '@/context/EnvContext'; import { tauriHandleMinimize, tauriHandleToggleMaximize, tauriHandleClose } from '@/utils/window'; import { isTauriAppPlatform } from '@/services/environment'; @@ -44,6 +45,7 @@ const WindowButtons: React.FC = ({ onClose, }) => { const parentRef = useRef(null); + const { appService } = useEnv(); const handleMouseDown = async (e: MouseEvent) => { const target = e.target as HTMLElement; @@ -110,7 +112,7 @@ const WindowButtons: React.FC = ({ className, )} > - {showMinimize && ( + {showMinimize && appService?.hasWindowBar && ( @@ -118,7 +120,7 @@ const WindowButtons: React.FC = ({ )} - {showMaximize && ( + {showMaximize && appService?.hasWindowBar && ( @@ -126,7 +128,7 @@ const WindowButtons: React.FC = ({ )} - {showClose && ( + {showClose && (appService?.hasWindowBar || onClose) && ( { if (isWebAppPlatform()) return []; let files = parseWindowOpenWithFiles(); - if (!files) { + if (!files && hasCli()) { files = await parseCLIOpenWithFiles(); } return files; diff --git a/apps/readest-app/src/services/environment.ts b/apps/readest-app/src/services/environment.ts index c645989f..8d244ed3 100644 --- a/apps/readest-app/src/services/environment.ts +++ b/apps/readest-app/src/services/environment.ts @@ -1,7 +1,16 @@ import { AppService } from '@/types/system'; +declare global { + interface Window { + __READEST_CLI_ACCESS?: boolean; + __READEST_UPDATER_ACCESS?: boolean; + } +} + export const isTauriAppPlatform = () => process.env['NEXT_PUBLIC_APP_PLATFORM'] === 'tauri'; export const isWebAppPlatform = () => process.env['NEXT_PUBLIC_APP_PLATFORM'] === 'web'; +export const hasUpdater = () => window.__READEST_UPDATER_ACCESS === true; +export const hasCli = () => window.__READEST_CLI_ACCESS === true; export interface EnvConfigType { getAppService: () => Promise; diff --git a/apps/readest-app/src/services/nativeAppService.ts b/apps/readest-app/src/services/nativeAppService.ts index af830702..beac00db 100644 --- a/apps/readest-app/src/services/nativeAppService.ts +++ b/apps/readest-app/src/services/nativeAppService.ts @@ -119,6 +119,7 @@ export class NativeAppService extends BaseAppService { appPlatform = 'tauri' as AppPlatform; isAppDataSandbox = isMobile; hasTrafficLight = osType() === 'macos'; + hasWindowBar = !(osType() === 'ios' || osType() === 'android'); override resolvePath(fp: string, base: BaseDir): { baseDir: number; base: BaseDir; fp: string } { return resolvePath(fp, base); diff --git a/apps/readest-app/src/types/system.ts b/apps/readest-app/src/types/system.ts index 5decdb75..cb870c98 100644 --- a/apps/readest-app/src/types/system.ts +++ b/apps/readest-app/src/types/system.ts @@ -23,6 +23,7 @@ export interface AppService { fs: FileSystem; appPlatform: AppPlatform; hasTrafficLight: boolean; + hasWindowBar: boolean; isAppDataSandbox: boolean; selectFiles(name: string, extensions: string[]): Promise;