mirror of
https://github.com/nimbold/Firelink.git
synced 2026-08-11 03:59:09 +00:00
feat(desktop): implement advanced transfer, tray icon, media cookies, and extension tcp server
This commit is contained in:
@@ -27,6 +27,7 @@ function App() {
|
||||
const activeView = useSettingsStore(state => state.activeView);
|
||||
const appFontSize = useSettingsStore(state => state.appFontSize);
|
||||
const showDockBadge = useSettingsStore(state => state.showDockBadge);
|
||||
const showMenuBarIcon = useSettingsStore(state => state.showMenuBarIcon);
|
||||
const downloads = useDownloadStore(state => state.downloads);
|
||||
const activeDownloadCount = downloads.filter(download => download.status === 'downloading').length;
|
||||
const queuedCount = downloads.filter(download => download.status === 'queued').length;
|
||||
@@ -43,6 +44,10 @@ function App() {
|
||||
invoke('update_dock_badge', { count: showDockBadge ? activeDownloadCount : 0 }).catch(() => {});
|
||||
}, [showDockBadge, activeDownloadCount]);
|
||||
|
||||
useEffect(() => {
|
||||
invoke('toggle_tray_icon', { show: showMenuBarIcon }).catch(console.error);
|
||||
}, [showMenuBarIcon]);
|
||||
|
||||
useEffect(() => {
|
||||
if (previousSpeedLimit.current === globalSpeedLimit) return;
|
||||
previousSpeedLimit.current = globalSpeedLimit;
|
||||
@@ -172,10 +177,21 @@ function App() {
|
||||
}
|
||||
});
|
||||
|
||||
const unlistenExtension = listen('extension-add-download', (event: any) => {
|
||||
const { url, token } = event.payload;
|
||||
const settings = useSettingsStore.getState();
|
||||
if (settings.extensionPairingToken && token === settings.extensionPairingToken) {
|
||||
useDownloadStore.getState().openAddModalWithUrls(url);
|
||||
} else {
|
||||
console.warn('Extension add download rejected: invalid token');
|
||||
}
|
||||
});
|
||||
|
||||
return () => {
|
||||
unlistenProgress.then(f => f());
|
||||
unlistenComplete.then(f => f());
|
||||
unlistenFailed.then(f => f());
|
||||
unlistenExtension.then(f => f());
|
||||
};
|
||||
}, []);
|
||||
|
||||
|
||||
@@ -250,7 +250,7 @@ const isMediaUrl = (url: string) => {
|
||||
|
||||
|
||||
export const AddDownloadsModal = () => {
|
||||
const { isAddModalOpen, toggleAddModal, addDownload, queues } = useDownloadStore();
|
||||
const { isAddModalOpen, pendingAddUrls, toggleAddModal, addDownload, queues } = useDownloadStore();
|
||||
const { defaultDownloadPath } = useSettingsStore();
|
||||
|
||||
const [selectedQueueId, setSelectedQueueId] = useState<string>(MAIN_QUEUE_ID);
|
||||
@@ -286,12 +286,12 @@ export const AddDownloadsModal = () => {
|
||||
useEffect(() => {
|
||||
if (isAddModalOpen) {
|
||||
setSaveLocation(defaultDownloadPath);
|
||||
setUrls('');
|
||||
setUrls(pendingAddUrls || '');
|
||||
setParsedItems([]);
|
||||
setSelectedItemIndex(null);
|
||||
setSelectedQueueId(queues.find(q => q.isMain)?.id || MAIN_QUEUE_ID);
|
||||
}
|
||||
}, [isAddModalOpen, defaultDownloadPath]);
|
||||
}, [isAddModalOpen, pendingAddUrls, defaultDownloadPath]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!saveLocation) return;
|
||||
|
||||
@@ -69,6 +69,19 @@ export const PropertiesModal = () => {
|
||||
}
|
||||
|
||||
setHeaders(activeItem.headers || '');
|
||||
setChecksumEnabled(!!activeItem.checksum);
|
||||
if (activeItem.checksum) {
|
||||
const [algo, val] = activeItem.checksum.split('=');
|
||||
if (val) {
|
||||
setChecksumAlgorithm(algo);
|
||||
setChecksumValue(val);
|
||||
}
|
||||
} else {
|
||||
setChecksumAlgorithm('SHA-256');
|
||||
setChecksumValue('');
|
||||
}
|
||||
setCookies(activeItem.cookies || '');
|
||||
setMirrors(activeItem.mirrors || '');
|
||||
setErrorMessage('');
|
||||
} else {
|
||||
setItem(null);
|
||||
@@ -115,6 +128,9 @@ export const PropertiesModal = () => {
|
||||
username: loginMode === 'custom' ? username.trim() : null,
|
||||
password: loginMode === 'custom' ? password.trim() : null,
|
||||
headers: headers.trim() || null,
|
||||
checksum: checksumEnabled && checksumValue.trim() ? `${checksumAlgorithm}=${checksumValue.trim()}` : null,
|
||||
cookies: cookies.trim() || null,
|
||||
mirrors: mirrors.trim() || null,
|
||||
};
|
||||
|
||||
updateDownload(item.id, updates);
|
||||
|
||||
@@ -104,6 +104,9 @@ export interface DownloadItem {
|
||||
username?: string | null;
|
||||
password?: string | null;
|
||||
headers?: string | null;
|
||||
checksum?: string | null;
|
||||
cookies?: string | null;
|
||||
mirrors?: string | null;
|
||||
destination?: string;
|
||||
isMedia?: boolean;
|
||||
mediaFormatSelector?: string;
|
||||
@@ -114,8 +117,10 @@ interface DownloadState {
|
||||
downloads: DownloadItem[];
|
||||
queues: Queue[];
|
||||
isAddModalOpen: boolean;
|
||||
pendingAddUrls: string;
|
||||
selectedPropertiesDownloadId: string | null;
|
||||
toggleAddModal: (isOpen: boolean) => void;
|
||||
openAddModalWithUrls: (urls: string) => void;
|
||||
setSelectedPropertiesDownloadId: (id: string | null) => void;
|
||||
addDownload: (item: DownloadItem) => void;
|
||||
updateDownload: (id: string, updates: Partial<DownloadItem>) => void;
|
||||
@@ -135,8 +140,10 @@ export const useDownloadStore = create<DownloadState>((set, get) => ({
|
||||
downloads: [],
|
||||
queues: [{ id: MAIN_QUEUE_ID, name: 'Main Queue', isMain: true }],
|
||||
isAddModalOpen: false,
|
||||
pendingAddUrls: '',
|
||||
selectedPropertiesDownloadId: null,
|
||||
toggleAddModal: (isOpen) => set({ isAddModalOpen: isOpen }),
|
||||
openAddModalWithUrls: (urls) => set({ isAddModalOpen: true, pendingAddUrls: urls }),
|
||||
setSelectedPropertiesDownloadId: (id) => set({ selectedPropertiesDownloadId: id }),
|
||||
addDownload: (item) => {
|
||||
set((state) => ({ downloads: [...state.downloads, item] }));
|
||||
@@ -317,6 +324,7 @@ export const useDownloadStore = create<DownloadState>((set, get) => ({
|
||||
destination: destPath,
|
||||
filename: item.fileName,
|
||||
formatSelector: item.mediaFormatSelector || null,
|
||||
cookieSource: settings.mediaCookieSource !== 'none' ? settings.mediaCookieSource : null,
|
||||
speedLimit,
|
||||
username: item.username || (login ? login.username : null),
|
||||
password: item.password || keychainPassword
|
||||
@@ -337,6 +345,9 @@ export const useDownloadStore = create<DownloadState>((set, get) => ({
|
||||
username: item.username || (login ? login.username : null),
|
||||
password: item.password || keychainPassword,
|
||||
headers: item.headers || null,
|
||||
checksum: item.checksum || null,
|
||||
cookies: item.cookies || null,
|
||||
mirrors: item.mirrors || null,
|
||||
userAgent: settings.customUserAgent || null,
|
||||
maxTries: settings.maxAutomaticRetries,
|
||||
proxy: getProxyArgs(settings)
|
||||
|
||||
Reference in New Issue
Block a user