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:
@@ -10,6 +10,7 @@ import {SessionProps} from "@/lib/models/Session";
|
||||
import System from "@/lib/models/System";
|
||||
import {SessionContext} from "@/context/SessionContext";
|
||||
import {AlertContext} from "@/context/AlertContext";
|
||||
import * as tauri from '@/lib/tauri';
|
||||
|
||||
const messagesMap = {
|
||||
fr: frMessages,
|
||||
@@ -36,10 +37,7 @@ export default function LoginWrapper({children}: { children: React.ReactNode })
|
||||
|
||||
useEffect((): void => {
|
||||
if (session.isConnected) {
|
||||
// Pas de router.push dans Electron, le main process gère
|
||||
if (!window.electron) {
|
||||
window.location.href = '/';
|
||||
}
|
||||
tauri.loginSuccess();
|
||||
}
|
||||
}, [session]);
|
||||
|
||||
|
||||
@@ -2,17 +2,16 @@ import {useContext, useState} from "react";
|
||||
import System from "@/lib/models/System";
|
||||
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
|
||||
import {faEnvelope, faLock} from "@fortawesome/free-solid-svg-icons";
|
||||
import {SessionContext, SessionContextProps} from "@/context/SessionContext";
|
||||
import {AlertContext} from "@/context/AlertContext";
|
||||
import {useTranslations} from "next-intl";
|
||||
import {LangContext, LangContextProps} from "@/context/LangContext";
|
||||
import * as tauri from '@/lib/tauri';
|
||||
|
||||
export default function LoginForm() {
|
||||
const {errorMessage} = useContext(AlertContext);
|
||||
const [email, setEmail] = useState('');
|
||||
const [password, setPassword] = useState('');
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const {setSession} = useContext<SessionContextProps>(SessionContext);
|
||||
const t = useTranslations();
|
||||
const {lang} = useContext<LangContextProps>(LangContext)
|
||||
|
||||
@@ -48,21 +47,8 @@ export default function LoginForm() {
|
||||
setIsLoading(false);
|
||||
return;
|
||||
}
|
||||
// Stocker le token dans electron-store via IPC
|
||||
if (window.electron) {
|
||||
await window.electron.setToken(response);
|
||||
window.electron.loginSuccess(response);
|
||||
} else {
|
||||
// Fallback pour le mode dev web
|
||||
System.setCookie('token', response, 30);
|
||||
const token: string | null = System.getCookie('token');
|
||||
if (!token) {
|
||||
errorMessage(t('loginForm.error.connection'));
|
||||
setIsLoading(false);
|
||||
return;
|
||||
}
|
||||
setSession({isConnected: true, user: null, accessToken: token})
|
||||
}
|
||||
await tauri.setToken(response);
|
||||
await tauri.loginSuccess();
|
||||
} catch (e: unknown) {
|
||||
if (e instanceof Error) {
|
||||
errorMessage(t('loginForm.error.server'));
|
||||
|
||||
@@ -4,60 +4,44 @@ import React, {useContext, useEffect} from "react";
|
||||
import System from "@/lib/models/System";
|
||||
import {AlertContext} from "@/context/AlertContext";
|
||||
import {configs} from "@/lib/configs";
|
||||
import {SessionContext, SessionContextProps} from "@/context/SessionContext";
|
||||
import {useTranslations} from "next-intl";
|
||||
import {LangContext, LangContextProps} from "@/context/LangContext";
|
||||
import * as tauri from '@/lib/tauri';
|
||||
|
||||
export default function SocialForm() {
|
||||
const {errorMessage} = useContext(AlertContext);
|
||||
const {setSession} = useContext<SessionContextProps>(SessionContext)
|
||||
const t = useTranslations();
|
||||
const {lang} = useContext<LangContextProps>(LangContext)
|
||||
const isElectron = typeof window !== 'undefined' && !!window.electron;
|
||||
|
||||
useEffect((): void => {
|
||||
// Skip URL parsing in Electron (OAuth is handled via BrowserWindow)
|
||||
if (isElectron) return;
|
||||
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
const provider: string | null = params.get('provider');
|
||||
if (!provider) {
|
||||
return;
|
||||
}
|
||||
if (!provider) return;
|
||||
|
||||
const code: string | null = params.get('code');
|
||||
if (!code) {
|
||||
return;
|
||||
}
|
||||
if (!code) return;
|
||||
|
||||
if (provider === 'google') {
|
||||
handleGoogleLogin(code).then();
|
||||
return;
|
||||
}
|
||||
if (provider === 'facebook') {
|
||||
const state: string | null = params.get('state');
|
||||
if (!state) {
|
||||
return;
|
||||
}
|
||||
if (!state) return;
|
||||
handleFacebookLogin(code, state).then();
|
||||
return;
|
||||
}
|
||||
if (provider === 'apple') {
|
||||
const state: string | null = params.get('state');
|
||||
if (!state) {
|
||||
return;
|
||||
}
|
||||
if (!state) return;
|
||||
handleAppleLogin(code, state).then();
|
||||
return;
|
||||
}
|
||||
}, []);
|
||||
|
||||
async function handleLoginSuccess(token: string): Promise<void> {
|
||||
if (window.electron) {
|
||||
await window.electron.setToken(token);
|
||||
window.electron.loginSuccess(token);
|
||||
} else {
|
||||
System.setCookie('token', token, 30);
|
||||
setSession({isConnected: true, user: null, accessToken: token});
|
||||
}
|
||||
await tauri.setToken(token);
|
||||
await tauri.loginSuccess();
|
||||
}
|
||||
|
||||
async function handleFacebookLogin(code: string, state: string): Promise<void> {
|
||||
@@ -102,28 +86,10 @@ export default function SocialForm() {
|
||||
}
|
||||
|
||||
async function handleOAuthClick(provider: 'google' | 'facebook' | 'apple'): Promise<void> {
|
||||
if (!window.electron) return;
|
||||
|
||||
try {
|
||||
const result = await window.electron.oauthLogin(provider, configs.baseUrl);
|
||||
|
||||
if (!result.success) {
|
||||
if (result.error !== 'Window closed by user') {
|
||||
errorMessage(t('socialForm.error.connection'));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (result.code) {
|
||||
if (provider === 'google') {
|
||||
await handleGoogleLogin(result.code);
|
||||
} else if (provider === 'facebook' && result.state) {
|
||||
await handleFacebookLogin(result.code, result.state);
|
||||
} else if (provider === 'apple' && result.state) {
|
||||
await handleAppleLogin(result.code, result.state);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
const oauthUrl = `${configs.baseUrl}auth/${provider}/desktop`;
|
||||
await tauri.openExternal(oauthUrl);
|
||||
} catch {
|
||||
errorMessage(t('socialForm.error.connection'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import SocialForm from "@/app/login/login/SocialForm";
|
||||
import {useTranslations} from "next-intl";
|
||||
import {LangContext} from "@/context/LangContext";
|
||||
import System from "@/lib/models/System";
|
||||
import * as tauri from '@/lib/tauri';
|
||||
|
||||
export default function LoginPage() {
|
||||
const t = useTranslations();
|
||||
@@ -22,21 +23,12 @@ export default function LoginPage() {
|
||||
|
||||
useEffect(() => {
|
||||
async function checkFirstConnectionAndNetwork() {
|
||||
// Check if we're in Electron
|
||||
if (!window.electron) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// Check if token exists (first connection)
|
||||
const token = await window.electron.getToken();
|
||||
const token = await tauri.getToken();
|
||||
const hasToken = !!token;
|
||||
|
||||
// Check network status
|
||||
const online = navigator.onLine;
|
||||
setIsOnline(online);
|
||||
|
||||
// Show warning if first connection AND offline
|
||||
if (!hasToken && !online) {
|
||||
setShowOfflineWarning(true);
|
||||
}
|
||||
@@ -47,19 +39,19 @@ export default function LoginPage() {
|
||||
|
||||
checkFirstConnectionAndNetwork();
|
||||
|
||||
// Listen for online/offline events
|
||||
const handleOnline = () => {
|
||||
setIsOnline(true);
|
||||
setShowOfflineWarning(false);
|
||||
};
|
||||
const handleOffline = async () => {
|
||||
setIsOnline(false);
|
||||
// Check if token exists
|
||||
if (window.electron) {
|
||||
const token = await window.electron.getToken();
|
||||
try {
|
||||
const token = await tauri.getToken();
|
||||
if (!token) {
|
||||
setShowOfflineWarning(true);
|
||||
}
|
||||
} catch {
|
||||
setShowOfflineWarning(true);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -5,44 +5,32 @@ import OfflinePinVerify from '@/components/offline/OfflinePinVerify';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||
import { faWifi, faArrowLeft } from '@fortawesome/free-solid-svg-icons';
|
||||
import * as tauri from '@/lib/tauri';
|
||||
|
||||
export default function OfflineLoginPage() {
|
||||
const t = useTranslations();
|
||||
|
||||
async function handlePinSuccess(userId: string):Promise<void> {
|
||||
|
||||
// Initialize database with user's encryption key
|
||||
if (window.electron) {
|
||||
try {
|
||||
// Get encryption key
|
||||
const encryptionKey = await window.electron.getUserEncryptionKey(userId);
|
||||
if (encryptionKey) {
|
||||
// Initialize database
|
||||
await window.electron.dbInitialize(userId, encryptionKey);
|
||||
|
||||
// Navigate to main page
|
||||
window.location.href = '/';
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[OfflineLogin] Error initializing database:', error);
|
||||
async function handlePinSuccess(userId: string): Promise<void> {
|
||||
try {
|
||||
const encryptionKey = await tauri.getUserEncryptionKey(userId);
|
||||
if (encryptionKey) {
|
||||
await tauri.dbInitialize(userId, encryptionKey);
|
||||
await tauri.loginSuccess();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[OfflineLogin] Error initializing database:', error);
|
||||
}
|
||||
}
|
||||
|
||||
function handleBackToOnline():void {
|
||||
if (window.electron) {
|
||||
window.electron.logout();
|
||||
}
|
||||
function handleBackToOnline(): void {
|
||||
tauri.logout();
|
||||
}
|
||||
|
||||
useEffect(():void => {
|
||||
// Check if we have offline capability
|
||||
useEffect((): void => {
|
||||
async function checkOfflineCapability() {
|
||||
if (window.electron) {
|
||||
const offlineStatus = await window.electron.offlineModeGet();
|
||||
if (!offlineStatus.hasPin) {
|
||||
window.location.href = '/login/login';
|
||||
}
|
||||
const offlineStatus = await tauri.offlineModeGet();
|
||||
if (!offlineStatus.hasPin) {
|
||||
window.location.href = '/login/login';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
195
app/page.tsx
195
app/page.tsx
@@ -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 => {}}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user