Migrate from window.electron to tauri IPC functions across components

- Replaced `window.electron.invoke` calls with equivalent `tauri` function calls for all IPC interactions.
- Removed `electron.d.ts` TypeScript definitions as they are no longer needed.
- Updated related logic for offline/online state synchronization.
- Added `types.rs` and `shared/mod.rs` modules to support Tauri IPC integration with Rust enums and shared logic.
- Refactored IPC request queues to use updated handler names for consistency with Tauri.
This commit is contained in:
natreex
2026-03-21 09:34:13 -04:00
parent 1a15692e40
commit ee4438834c
144 changed files with 21258 additions and 876 deletions

View File

@@ -40,6 +40,7 @@ import {SeriesSyncContext} from "@/context/SeriesSyncContext";
import useSyncBooks from "@/hooks/useSyncBooks";
import useSyncSeries from "@/hooks/useSyncSeries";
import {LocalSyncQueueContext, LocalSyncOperation} from "@/context/SyncQueueContext";
import * as tauri from '@/lib/tauri';
interface RemovedItemRecord {
removal_id: string;
@@ -194,7 +195,7 @@ function ScribeContent() {
for (const operation of queueCopy) {
try {
await window.electron.invoke(operation.channel, operation.data);
await tauri.invoke(operation.channel, operation.data);
setLocalSyncQueue((prev: LocalSyncOperation[]): LocalSyncOperation[] =>
prev.filter((op: LocalSyncOperation): boolean => op.id !== operation.id)
);
@@ -277,7 +278,20 @@ function ScribeContent() {
];
useEffect((): void => {
checkAuthentification().then()
checkAuthentification().then();
let unlisten: (() => void) | undefined;
import('@tauri-apps/api/event').then(function ({listen}) {
listen('auth-success', function () {
checkAuthentification().then();
}).then(function (fn) {
unlisten = fn;
});
});
return (): void => {
if (unlisten) unlisten();
};
}, []);
useEffect((): void => {
@@ -373,20 +387,20 @@ function ScribeContent() {
if (!isCurrentlyOffline()) {
if (offlineMode.isDatabaseInitialized) {
localBooksResponse = await window.electron.invoke<SyncedBook[]>('db:books:synced');
localBooksResponse = await tauri.getSyncedBooks() as SyncedBook[];
const lastOnlineStr: string | null = localStorage.getItem('lastOnlineTimestamp');
const lastOnlineTimestamp: number = lastOnlineStr ? parseInt(lastOnlineStr, 10) : 0;
const localTombstones: RemovedItemRecord[] = await window.electron.invoke<RemovedItemRecord[]>('db:tombstones:since', lastOnlineTimestamp);
const localTombstones: RemovedItemRecord[] = await tauri.getTombstonesSince(lastOnlineTimestamp) as RemovedItemRecord[];
const serverResponse: SyncedBooksResponse = await System.authPostToServer<SyncedBooksResponse>('books/synced', { lastOnlineTimestamp, tombstones: localTombstones }, session.accessToken, locale);
serverBooksResponse = serverResponse.books;
await window.electron.invoke<void>('db:tombstones:apply:books', serverResponse.tombstones);
await tauri.applyBookTombstones(serverResponse.tombstones);
} else {
const serverResponse: SyncedBooksResponse = await System.authPostToServer<SyncedBooksResponse>('books/synced', { lastOnlineTimestamp: 0, tombstones: [] }, session.accessToken, locale);
serverBooksResponse = serverResponse.books;
}
} else {
if (offlineMode.isDatabaseInitialized) {
localBooksResponse = await window.electron.invoke<SyncedBook[]>('db:books:synced');
localBooksResponse = await tauri.getSyncedBooks() as SyncedBook[];
}
}
@@ -408,20 +422,20 @@ function ScribeContent() {
if (!isCurrentlyOffline()) {
if (offlineMode.isDatabaseInitialized) {
localSeriesResponse = await window.electron.invoke<SyncedSeries[]>('db:series:synced');
localSeriesResponse = await tauri.getSyncedSeries() as SyncedSeries[];
const lastOnlineStr: string | null = localStorage.getItem('lastOnlineTimestamp');
const lastOnlineTimestamp: number = lastOnlineStr ? parseInt(lastOnlineStr, 10) : 0;
const localTombstones: RemovedItemRecord[] = await window.electron.invoke<RemovedItemRecord[]>('db:tombstones:since', lastOnlineTimestamp);
const localTombstones: RemovedItemRecord[] = await tauri.getTombstonesSince(lastOnlineTimestamp) as RemovedItemRecord[];
const serverResponse: SyncedSeriesResponse = await System.authPostToServer<SyncedSeriesResponse>('series/synced', { lastOnlineTimestamp, tombstones: localTombstones }, session.accessToken, locale);
serverSeriesResponse = serverResponse.series;
await window.electron.invoke<void>('db:tombstones:apply:series', serverResponse.tombstones);
await tauri.applySeriesTombstones(serverResponse.tombstones);
} else {
const serverResponse: SyncedSeriesResponse = await System.authPostToServer<SyncedSeriesResponse>('series/synced', { lastOnlineTimestamp: 0, tombstones: [] }, session.accessToken, locale);
serverSeriesResponse = serverResponse.series;
}
} else {
if (offlineMode.isDatabaseInitialized) {
localSeriesResponse = await window.electron.invoke<SyncedSeries[]>('db:series:synced');
localSeriesResponse = await tauri.getSyncedSeries() as SyncedSeries[];
}
}
@@ -437,57 +451,30 @@ function ScribeContent() {
}
useEffect(():void => {
async function checkPinSetup() {
if (session.isConnected && window.electron) {
try {
const offlineStatus = await window.electron.offlineModeGet();
if (!offlineStatus.hasPin) {
setTimeout(():void => {
setShowPinSetup(true);
}, 2000);
}
} catch (e:unknown) {
if (e instanceof Error) {
errorMessage(e.message);
} else {
errorMessage('Unknown error occurred while checking offline mode')
}
}
}
}
checkPinSetup().then();
}, [session.isConnected]);
async function handlePinVerifySuccess(userId: string): Promise<void> {
try {
if (window.electron) {
const storedToken: string | null = await window.electron.getToken();
const encryptionKey:string|null = await window.electron.getUserEncryptionKey(userId);
const storedToken: string | null = await tauri.getToken();
const encryptionKey: string | null = await tauri.getUserEncryptionKey(userId);
if (encryptionKey) {
await window.electron.dbInitialize(userId, encryptionKey);
setOfflineMode(prev => ({...prev, isDatabaseInitialized: true}));
if (encryptionKey) {
await tauri.dbInitialize(userId, encryptionKey);
setOfflineMode(prev => ({...prev, isDatabaseInitialized: true}));
const localUser:UserProps = await window.electron.invoke('db:user:info');
if (localUser && localUser.id) {
setSession({
isConnected: true,
user: localUser,
accessToken: storedToken || '',
});
setShowPinVerify(false);
setCurrentCredits(localUser.creditsBalance || 0);
setAmountSpent(localUser.aiUsage || 0);
} else {
errorMessage(t("homePage.errors.localDataError"));
}
const localUser: UserProps = await tauri.getUserInfo();
if (localUser && localUser.id) {
setSession({
isConnected: true,
user: localUser,
accessToken: storedToken || '',
});
setShowPinVerify(false);
setCurrentCredits(localUser.creditsBalance || 0);
setAmountSpent(localUser.aiUsage || 0);
} else {
errorMessage(t("homePage.errors.encryptionKeyError"));
errorMessage(t("homePage.errors.localDataError"));
}
} else {
errorMessage(t("homePage.errors.encryptionKeyError"));
}
} catch (error) {
console.error('[OfflinePin] Error initializing offline mode:', error);
@@ -530,12 +517,10 @@ function ScribeContent() {
async function checkAuthentification(): Promise<void> {
let token: string | null = null;
if (typeof window !== 'undefined' && window.electron) {
try {
token = await window.electron.getToken();
} catch (e) {
console.error('Error getting token from electron:', e);
}
try {
token = await tauri.getToken();
} catch (e) {
console.error('Error getting token:', e);
}
if (token) {
@@ -543,22 +528,20 @@ function ScribeContent() {
const user: UserProps = await System.authGetQueryToServer<UserProps>('user/infos', token, locale);
if (!user) {
errorMessage(t("homePage.errors.userNotFound"));
if (window.electron) {
await window.electron.removeToken();
window.electron.logout();
}
await tauri.removeToken();
tauri.logout();
return;
}
if (window.electron && user.id) {
if (user.id) {
try {
const initResult = await window.electron.initUser(user.id);
const initResult = await tauri.initUser(user.id);
if (!initResult.success) {
errorMessage(initResult.error || t("homePage.errors.offlineInitError"));
return;
}
try {
const offlineStatus = await window.electron.offlineModeGet();
const offlineStatus = await tauri.offlineModeGet();
if (!offlineStatus.hasPin) {
setTimeout(():void => {
setShowPinSetup(true);
@@ -571,12 +554,12 @@ function ScribeContent() {
console.error('[Page] Error initializing user:', error);
}
}
if (window.electron && user.id) {
if (user.id) {
try {
const dbInitialized:boolean = await initializeDatabase(user.id);
const dbInitialized: boolean = await initializeDatabase(user.id);
if (dbInitialized) {
try {
await window.electron.invoke('db:user:sync', {
await tauri.syncUser({
userId: user.id,
firstName: user.name,
lastName: user.lastName,
@@ -587,7 +570,6 @@ function ScribeContent() {
errorMessage(t("homePage.errors.syncError"));
}
} else {
console.error('[Page] Database initialization failed');
errorMessage(t("homePage.errors.dbInitError"));
}
} catch (error) {
@@ -599,30 +581,25 @@ function ScribeContent() {
user: user,
accessToken: token,
});
console.log(user)
setCurrentCredits(user.creditsBalance)
setAmountSpent(user.aiUsage)
} catch (e: unknown) {
if (window.electron) {
try {
const offlineStatus = await window.electron.offlineModeGet();
if (offlineStatus.hasPin && offlineStatus.lastUserId) {
setOfflineMode((prev:OfflineMode):OfflineMode => ({...prev, isOffline: true, isNetworkOnline: false}));
setShowPinVerify(true);
setIsLoading(false);
return;
} else {
if (window.electron) {
await window.electron.removeToken();
window.electron.logout();
}
}
} catch (offlineError) {
errorMessage(t("homePage.errors.offlineError"));
try {
const offlineStatus = await tauri.offlineModeGet();
if (offlineStatus.hasPin && offlineStatus.lastUserId) {
setOfflineMode((prev:OfflineMode):OfflineMode => ({...prev, isOffline: true, isNetworkOnline: false}));
setShowPinVerify(true);
setIsLoading(false);
return;
} else {
await tauri.removeToken();
tauri.logout();
}
} catch (offlineError) {
errorMessage(t("homePage.errors.offlineError"));
}
if (e instanceof Error) {
errorMessage(e.message);
} else {
@@ -630,21 +607,19 @@ function ScribeContent() {
}
}
} else {
if (window.electron) {
try {
const offlineStatus = await window.electron.offlineModeGet();
try {
const offlineStatus = await tauri.offlineModeGet();
if (offlineStatus.hasPin && offlineStatus.lastUserId) {
setOfflineMode(prev => ({...prev, isOffline: true, isNetworkOnline: false}));
setShowPinVerify(true);
setIsLoading(false);
return;
}
} catch (error) {
errorMessage(t("homePage.errors.authenticationError"));
if (offlineStatus.hasPin && offlineStatus.lastUserId) {
setOfflineMode(prev => ({...prev, isOffline: true, isNetworkOnline: false}));
setShowPinVerify(true);
setIsLoading(false);
return;
}
window.electron.logout();
} catch (error) {
errorMessage(t("homePage.errors.authenticationError"));
}
tauri.logout();
}
}
@@ -685,14 +660,14 @@ function ScribeContent() {
setCurrentChapter(undefined);
return;
}
response = await window.electron.invoke('db:chapter:last', currentBook?.bookId)
response = await tauri.getLastChapter(currentBook?.bookId ?? '')
} else {
if (currentBook?.localBook) {
if (!offlineMode.isDatabaseInitialized) {
setCurrentChapter(undefined);
return;
}
response = await window.electron.invoke('db:chapter:last', currentBook?.bookId)
response = await tauri.getLastChapter(currentBook?.bookId ?? '')
} else {
response = await System.authGetQueryToServer<ChapterProps | null>(`chapter/last-chapter`, session.accessToken, locale, {bookid: currentBook?.bookId});
}
@@ -768,7 +743,7 @@ function ScribeContent() {
!isTermsAccepted && !isCurrentlyOffline() && <TermsOfUse onAccept={handleTermsAcceptance}/>
}
{
showPinSetup && window.electron && (
showPinSetup && (
<OfflinePinSetup
showOnFirstLogin={true}
onClose={():void => setShowPinSetup(false)}
@@ -779,12 +754,10 @@ function ScribeContent() {
)
}
{
showPinVerify && window.electron && (
showPinVerify && (
<OfflinePinVerify
onSuccess={handlePinVerifySuccess}
onCancel={():void => {
//window.electron.logout();
}}
onCancel={():void => {}}
/>
)
}