cleanup
This commit is contained in:
@@ -1,62 +0,0 @@
|
|||||||
# Issue & Goal
|
|
||||||
- opening the app in release mode does not show the tray icon or do anything
|
|
||||||
- tauri looks to be working and sending the `applicationDidFinishLaunching` event but nothing happens
|
|
||||||
- the goal is to have this run on macOS (no sandboxing needed)
|
|
||||||
|
|
||||||
|
|
||||||
# Notes
|
|
||||||
### Overall
|
|
||||||
- you will have to download the `rclone` binary from the [website](https://rclone.org/downloads/) yourself. if you already have rclone installed, it will be used instead of the binary.
|
|
||||||
- the main window runs the `main.ts` file that's at the project root, it is not related to the vite app. it gets compiled by the `buildExternal.js` script and added to the vite bundle through the `public` directory.
|
|
||||||
- sometimes `rclone` binary does not start correctly and the loading tray icons is stuck forever, i'd like to solve that too but this is more of a notice to restart the app if that happens.
|
|
||||||
|
|
||||||
### Tauri Info
|
|
||||||
#### Environment
|
|
||||||
- OS: Mac OS 14.7.2 arm64 (X64)
|
|
||||||
- Xcode Command Line Tools: installed
|
|
||||||
- rustc: 1.82.0 (f6e511eec 2024-10-15)
|
|
||||||
- cargo: 1.82.0 (8f40fc59f 2024-08-21)
|
|
||||||
- rustup: 1.27.1 (54dd3d00f 2024-04-24)
|
|
||||||
- Rust toolchain: stable-aarch64-apple-darwin (default)
|
|
||||||
- node: 20.8.1
|
|
||||||
- npm: 10.1.0
|
|
||||||
|
|
||||||
#### Packages
|
|
||||||
- tauri 🦀: 2.2.0
|
|
||||||
- tauri-build 🦀: 2.0.4
|
|
||||||
- wry 🦀: 0.48.0
|
|
||||||
- tao 🦀: 0.31.1
|
|
||||||
- @tauri-apps/api : 2.2.0
|
|
||||||
- @tauri-apps/cli : 2.2.5
|
|
||||||
|
|
||||||
#### Plugins
|
|
||||||
- tauri-plugin-log 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-log : 2.2.0
|
|
||||||
- tauri-plugin-notification 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-notification : 2.2.1
|
|
||||||
- tauri-plugin-process 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-process : 2.2.0
|
|
||||||
- tauri-plugin-http 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-http : 2.2.0
|
|
||||||
- tauri-plugin-store 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-store : 2.2.0
|
|
||||||
- tauri-plugin-os 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-os : 2.2.0
|
|
||||||
- tauri-plugin-shell 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-shell : 2.2.0
|
|
||||||
- tauri-plugin-single-instance 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-single-instance : not installed!
|
|
||||||
- tauri-plugin-dialog 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-dialog : 2.2.0
|
|
||||||
- tauri-plugin-fs 🦀: 2.2.0
|
|
||||||
- @tauri-apps/plugin-fs : 2.2.0
|
|
||||||
- tauri-plugin-opener 🦀: 2.2.3
|
|
||||||
- @tauri-apps/plugin-opener : 2.2.5
|
|
||||||
|
|
||||||
#### App
|
|
||||||
- build-type: bundle
|
|
||||||
- CSP: unset
|
|
||||||
- frontendDist: ../dist
|
|
||||||
- devUrl: http://localhost:1420/
|
|
||||||
- framework: React
|
|
||||||
- bundler: Vite
|
|
||||||
|
|||||||
+4
-4
@@ -1,5 +1,5 @@
|
|||||||
import { Menu, MenuItem, PredefinedMenuItem, Submenu } from '@tauri-apps/api/menu'
|
import { Menu, MenuItem, PredefinedMenuItem, Submenu } from '@tauri-apps/api/menu'
|
||||||
import { ask, confirm, message, open } from '@tauri-apps/plugin-dialog'
|
import { ask, message, open } from '@tauri-apps/plugin-dialog'
|
||||||
import { isPermissionGranted, requestPermission } from '@tauri-apps/plugin-notification'
|
import { isPermissionGranted, requestPermission } from '@tauri-apps/plugin-notification'
|
||||||
import { sendNotification } from '@tauri-apps/plugin-notification'
|
import { sendNotification } from '@tauri-apps/plugin-notification'
|
||||||
import { revealItemInDir } from '@tauri-apps/plugin-opener'
|
import { revealItemInDir } from '@tauri-apps/plugin-opener'
|
||||||
@@ -55,7 +55,7 @@ export async function buildMenu() {
|
|||||||
delete storeState.mountedRemotes[remote]
|
delete storeState.mountedRemotes[remote]
|
||||||
await rebuildTrayMenu()
|
await rebuildTrayMenu()
|
||||||
await message(`Successfully unmounted ${remote} from ${mountPoint}`, {
|
await message(`Successfully unmounted ${remote} from ${mountPoint}`, {
|
||||||
title: 'Unmount Success',
|
title: 'Success',
|
||||||
})
|
})
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Unmount operation failed:', err)
|
console.error('Unmount operation failed:', err)
|
||||||
@@ -227,12 +227,12 @@ export async function buildMenu() {
|
|||||||
id: `remove-${remote}`,
|
id: `remove-${remote}`,
|
||||||
text: 'Remove',
|
text: 'Remove',
|
||||||
action: async () => {
|
action: async () => {
|
||||||
const confirmation = await confirm(
|
const answer = await ask(
|
||||||
`Are you sure you want to remove ${remote}? This action cannot be reverted.`,
|
`Are you sure you want to remove ${remote}? This action cannot be reverted.`,
|
||||||
{ title: `Removing ${remote}`, kind: 'warning' }
|
{ title: `Removing ${remote}`, kind: 'warning' }
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!confirmation) {
|
if (!answer) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -49,7 +49,7 @@ export async function getRemote(remote: string) {
|
|||||||
// throw e;
|
// throw e;
|
||||||
// });
|
// });
|
||||||
|
|
||||||
console.log(JSON.stringify(r, null, 2))
|
// console.log(JSON.stringify(r, null, 2))
|
||||||
|
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-4
@@ -1,5 +1,5 @@
|
|||||||
import { downloadDir } from '@tauri-apps/api/path'
|
import { downloadDir } from '@tauri-apps/api/path'
|
||||||
import { ask, confirm } from '@tauri-apps/plugin-dialog'
|
import { ask } from '@tauri-apps/plugin-dialog'
|
||||||
import { exists, writeFile } from '@tauri-apps/plugin-fs'
|
import { exists, writeFile } from '@tauri-apps/plugin-fs'
|
||||||
import { fetch } from '@tauri-apps/plugin-http'
|
import { fetch } from '@tauri-apps/plugin-http'
|
||||||
import { revealItemInDir } from '@tauri-apps/plugin-opener'
|
import { revealItemInDir } from '@tauri-apps/plugin-opener'
|
||||||
@@ -32,7 +32,7 @@ export async function dialogGetMountPlugin() {
|
|||||||
const currentPlatform = platform()
|
const currentPlatform = platform()
|
||||||
if (currentPlatform === 'macos') {
|
if (currentPlatform === 'macos') {
|
||||||
// download fuse-t or osxfuse
|
// download fuse-t or osxfuse
|
||||||
const wantsDownload = await confirm(
|
const wantsDownload = await ask(
|
||||||
"Fuse-t is required on macOS to mount remotes. You can open rclone UI again once you're done with the installation.",
|
"Fuse-t is required on macOS to mount remotes. You can open rclone UI again once you're done with the installation.",
|
||||||
{
|
{
|
||||||
title: 'Mount plugin not installed',
|
title: 'Mount plugin not installed',
|
||||||
@@ -53,7 +53,7 @@ export async function dialogGetMountPlugin() {
|
|||||||
}
|
}
|
||||||
if (currentPlatform === 'windows') {
|
if (currentPlatform === 'windows') {
|
||||||
// download winfsp
|
// download winfsp
|
||||||
const wantsDownload = await confirm(
|
const wantsDownload = await ask(
|
||||||
"WinFsp is required on Windows to mount remotes. You can open rclone UI again once you're done with the installation.",
|
"WinFsp is required on Windows to mount remotes. You can open rclone UI again once you're done with the installation.",
|
||||||
{
|
{
|
||||||
title: 'Mount plugin not installed',
|
title: 'Mount plugin not installed',
|
||||||
@@ -84,9 +84,11 @@ export async function unmountRemote(mountPoint: string, force = false) {
|
|||||||
|
|
||||||
if (output.code !== 0) {
|
if (output.code !== 0) {
|
||||||
if (output.stderr.toLowerCase().includes('busy')) {
|
if (output.stderr.toLowerCase().includes('busy')) {
|
||||||
const answer = await ask('This resource is busy, do you want to force unmount?', {
|
const answer = await ask('This resource is busy, do you wish to force unmount?', {
|
||||||
title: 'Could not unmount',
|
title: 'Could not unmount',
|
||||||
kind: 'warning',
|
kind: 'warning',
|
||||||
|
okLabel: 'Force Unmount',
|
||||||
|
cancelLabel: 'Cancel',
|
||||||
})
|
})
|
||||||
if (answer) {
|
if (answer) {
|
||||||
return await unmountRemote(mountPoint, true)
|
return await unmountRemote(mountPoint, true)
|
||||||
|
|||||||
+2
-6
@@ -23,13 +23,11 @@ export interface RemoteConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
count: number
|
|
||||||
anotherCount: number
|
|
||||||
increment: () => void
|
|
||||||
|
|
||||||
rcloneLoaded: boolean
|
rcloneLoaded: boolean
|
||||||
rcloneAuth: string
|
rcloneAuth: string
|
||||||
rcloneAuthHeader: string
|
rcloneAuthHeader: string
|
||||||
|
|
||||||
mountedRemotes: Record<string, string>
|
mountedRemotes: Record<string, string>
|
||||||
|
|
||||||
serveList: { pid: number; protocol: string; remote: string }[]
|
serveList: { pid: number; protocol: string; remote: string }[]
|
||||||
@@ -70,13 +68,11 @@ const getStorage = (store: LazyStore): StateStorage => ({
|
|||||||
export const useStore = create<State>()(
|
export const useStore = create<State>()(
|
||||||
shared(
|
shared(
|
||||||
(set) => ({
|
(set) => ({
|
||||||
count: 0,
|
|
||||||
anotherCount: 0,
|
|
||||||
increment: () => set((state) => ({ count: state.count + 1 })),
|
|
||||||
|
|
||||||
rcloneLoaded: false,
|
rcloneLoaded: false,
|
||||||
rcloneAuth: '',
|
rcloneAuth: '',
|
||||||
rcloneAuthHeader: '',
|
rcloneAuthHeader: '',
|
||||||
|
|
||||||
mountedRemotes: {},
|
mountedRemotes: {},
|
||||||
|
|
||||||
serveList: [],
|
serveList: [],
|
||||||
|
|||||||
@@ -33,8 +33,6 @@ export async function openFullWindow({
|
|||||||
url: url,
|
url: url,
|
||||||
})
|
})
|
||||||
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 1000))
|
|
||||||
|
|
||||||
const size = await currentMonitor().then((m) => m?.size)
|
const size = await currentMonitor().then((m) => m?.size)
|
||||||
|
|
||||||
if (!size) return
|
if (!size) return
|
||||||
|
|||||||
@@ -248,9 +248,6 @@
|
|||||||
{
|
{
|
||||||
"url": "http://localhost:5572/**"
|
"url": "http://localhost:5572/**"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"url": "https://www.google.com"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"url": "https://downloads.rclone.org/**"
|
"url": "https://downloads.rclone.org/**"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -78,7 +78,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"hardenedRuntime": true,
|
"hardenedRuntime": true,
|
||||||
"entitlements": "Entitlements.plist",
|
|
||||||
"minimumSystemVersion": "10.13"
|
"minimumSystemVersion": "10.13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
import { useStore } from '../../lib/store'
|
|
||||||
|
|
||||||
// const store = new LazyStore('store.json')
|
// const store = new LazyStore('store.json')
|
||||||
|
|
||||||
function Test() {
|
function Test() {
|
||||||
const count = useStore((state) => state.count)
|
|
||||||
const increment = useStore((state) => state.increment)
|
|
||||||
|
|
||||||
// useEffect(() => {
|
// useEffect(() => {
|
||||||
// console.log('Test')
|
// console.log('Test')
|
||||||
|
|
||||||
@@ -34,16 +29,6 @@ function Test() {
|
|||||||
<main className="container bg-blue-500">
|
<main className="container bg-blue-500">
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<h1>Rclone UI</h1>
|
<h1>Rclone UI</h1>
|
||||||
<button
|
|
||||||
onClick={() => {
|
|
||||||
increment()
|
|
||||||
}}
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
Increment Zustand
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<p>{count}</p>
|
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user