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

@@ -23,6 +23,7 @@ import {SyncedBook} from '@/lib/models/SyncedBook';
import {SeriesContext, SeriesContextProps} from '@/context/SeriesContext';
import {SeriesSyncContext, SeriesSyncContextProps} from '@/context/SeriesSyncContext';
import {SyncedSeries} from '@/lib/models/SyncedSeries';
import * as tauri from '@/lib/tauri';
export interface UseSpellsConfig {
entityType: 'book' | 'series';
@@ -113,10 +114,7 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
let response: SeriesSpellListResponse;
// Dual logic: offline ou livre local → IPC, sinon serveur
if (isCurrentlyOffline() || book?.localBook) {
response = await window.electron.invoke<SeriesSpellListResponse>(
'db:series:spell:list',
{seriesId: bookSeriesId}
);
response = await tauri.getSeriesSpellList(bookSeriesId) as SeriesSpellListResponse;
} else {
response = await System.authGetQueryToServer<SeriesSpellListResponse>(
'series/spell/list',
@@ -142,10 +140,7 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
// Series mode - dual logic
let response: SeriesSpellListResponse;
if (isCurrentlyOffline() || localSeries) {
response = await window.electron.invoke<SeriesSpellListResponse>(
'db:series:spell:list',
{seriesId: entityId}
);
response = await tauri.getSeriesSpellList(entityId) as SeriesSpellListResponse;
} else {
response = await System.authGetQueryToServer<SeriesSpellListResponse>(
'series/spell/list',
@@ -174,9 +169,9 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
} else {
let response: SpellListResponse;
if (isCurrentlyOffline()) {
response = await window.electron.invoke<SpellListResponse>('db:spell:list', {bookid: entityId});
response = await tauri.getSpellList(entityId, true) as SpellListResponse;
} else if (book?.localBook) {
response = await window.electron.invoke<SpellListResponse>('db:spell:list', {bookid: entityId});
response = await tauri.getSpellList(entityId, true) as SpellListResponse;
} else {
response = await System.authGetQueryToServer<SpellListResponse>(
'spell/list',
@@ -242,10 +237,7 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
// Series mode - dual logic
let response: SeriesSpellDetailResponse;
if (isCurrentlyOffline() || localSeries) {
response = await window.electron.invoke<SeriesSpellDetailResponse>(
'db:series:spell:detail',
{spellId: spell.id}
);
response = await tauri.getSeriesSpellDetail(spell.id) as SeriesSpellDetailResponse;
} else {
response = await System.authGetQueryToServer<SeriesSpellDetailResponse>(
'series/spell/detail',
@@ -270,9 +262,9 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
} else {
let response: SpellProps;
if (isCurrentlyOffline()) {
response = await window.electron.invoke<SpellProps>('db:spell:detail', {spellid: spell.id});
response = await tauri.getSpellDetail(spell.id) as SpellProps;
} else if (book?.localBook) {
response = await window.electron.invoke<SpellProps>('db:spell:detail', {spellid: spell.id});
response = await tauri.getSpellDetail(spell.id) as SpellProps;
} else {
response = await System.authGetQueryToServer<SpellProps>(
'spell/detail',
@@ -298,10 +290,7 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
if (response.seriesSpellId) {
let seriesSpellResponse: SeriesSpellDetailResponse;
if (isCurrentlyOffline() || book?.localBook) {
seriesSpellResponse = await window.electron.invoke<SeriesSpellDetailResponse>(
'db:series:spell:detail',
{spellId: response.seriesSpellId}
);
seriesSpellResponse = await tauri.getSeriesSpellDetail(response.seriesSpellId) as SeriesSpellDetailResponse;
} else {
seriesSpellResponse = await System.authGetQueryToServer<SeriesSpellDetailResponse>(
'series/spell/detail',
@@ -353,11 +342,11 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
};
let response: boolean;
if (isCurrentlyOffline() || book?.localBook) {
response = await window.electron.invoke<boolean>('db:book:tool:update', requestData);
response = await tauri.updateBookToolSetting(requestData.bookId, requestData.toolName, requestData.enabled);
} else {
response = await System.authPatchToServer<boolean>('book/tool-setting', requestData, userToken, lang);
if (localSyncedBooks.find((sb: SyncedBook): boolean => sb.id === book?.bookId)) {
addToQueue('db:book:tool:update', requestData);
addToQueue('update_book_tool_setting', {data: requestData});
}
}
if (response && setBook && book) {
@@ -410,11 +399,11 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
notes: spell.notes,
};
if (isCurrentlyOffline() || localSeries) {
newSpellId = await window.electron.invoke<string>('db:series:spell:add', data);
newSpellId = await tauri.addSeriesSpell(data);
} else {
newSpellId = await System.authPostToServer<string>('series/spell/add', data, userToken, lang);
if (localSyncedSeries.find((s: SyncedSeries): boolean => s.id === entityId)) {
addToQueue('db:series:spell:add', {...data, id: newSpellId});
addToQueue('add_series_spell', {data: {...data, id: newSpellId}});
}
}
} else {
@@ -432,11 +421,11 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
}
};
if (isCurrentlyOffline() || book?.localBook) {
newSpellId = await window.electron.invoke<string>('db:spell:create', data);
newSpellId = await tauri.createSpell(data.bookId, data.spell);
} else {
newSpellId = await System.authPostToServer<string>('spell/add', data, userToken, lang);
if (localSyncedBooks.find((sb: SyncedBook): boolean => sb.id === entityId)) {
addToQueue('db:spell:create', {...data, id: newSpellId});
addToQueue('create_spell', {data: {...data, id: newSpellId}});
}
}
}
@@ -492,20 +481,20 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
if (isSeriesMode) {
// Series mode - dual logic
if (isCurrentlyOffline() || localSeries) {
success = await window.electron.invoke<boolean>('db:series:spell:update', data);
success = await tauri.updateSeriesSpell(data);
} else {
success = await System.authPutToServer<boolean>('series/spell/update', data, userToken, lang);
if (localSyncedSeries.find((s: SyncedSeries): boolean => s.id === entityId)) {
addToQueue('db:series:spell:update', data);
addToQueue('update_series_spell', {data});
}
}
} else {
if (isCurrentlyOffline() || book?.localBook) {
success = await window.electron.invoke<boolean>('db:spell:update', data);
success = await tauri.updateSpell(data.id, data);
} else {
success = await System.authPutToServer<boolean>('spell/update', data, userToken, lang);
if (localSyncedBooks.find((sb: SyncedBook): boolean => sb.id === entityId)) {
addToQueue('db:spell:update', data);
addToQueue('update_spell', {data});
}
}
}
@@ -549,21 +538,21 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
// Series mode - dual logic
const requestData = {spellId, deletedAt};
if (isCurrentlyOffline() || localSeries) {
success = await window.electron.invoke<boolean>('db:series:spell:delete', requestData);
success = await tauri.deleteSeriesSpell(requestData.spellId, requestData.deletedAt);
} else {
success = await System.authDeleteToServer<boolean>('series/spell/delete', requestData, userToken, lang);
if (localSyncedSeries.find((s: SyncedSeries): boolean => s.id === entityId)) {
addToQueue('db:series:spell:delete', requestData);
addToQueue('delete_series_spell', {data: requestData});
}
}
} else {
const requestData = {spellId, bookId: entityId, deletedAt};
if (isCurrentlyOffline() || book?.localBook) {
success = await window.electron.invoke<boolean>('db:spell:delete', requestData);
success = await tauri.deleteSpell(requestData.spellId, requestData.bookId, requestData.deletedAt);
} else {
success = await System.authDeleteToServer<boolean>('spell/delete', requestData, userToken, lang);
if (localSyncedBooks.find((sb: SyncedBook): boolean => sb.id === entityId)) {
addToQueue('db:spell:delete', requestData);
addToQueue('delete_spell', {data: requestData});
}
}
}
@@ -605,7 +594,7 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
let seriesSpellId: string;
if (isCurrentlyOffline() || book?.localBook) {
// Mode offline ou livre local → IPC
seriesSpellId = await window.electron.invoke<string>('db:series:spell:add', seriesSpellData);
seriesSpellId = await tauri.addSeriesSpell(seriesSpellData);
} else {
// Mode online → Serveur
seriesSpellId = await System.authPostToServer<string>(
@@ -616,7 +605,7 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
);
// Si la série a une copie locale → addToQueue
if (localSyncedSeries.find((s: SyncedSeries): boolean => s.id === bookSeriesId)) {
addToQueue('db:series:spell:add', {...seriesSpellData, id: seriesSpellId});
addToQueue('add_series_spell', {data: {...seriesSpellData, id: seriesSpellId}});
}
}
@@ -636,14 +625,14 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
let updateSuccess: boolean;
if (isCurrentlyOffline() || book?.localBook) {
// Mode offline ou livre local → IPC
updateSuccess = await window.electron.invoke<boolean>('db:spell:update', updateData);
// Mode offline ou livre local → Tauri
updateSuccess = await tauri.updateSpell(updateData.id, updateData);
} else {
// Mode online → Serveur
updateSuccess = await System.authPutToServer<boolean>('spell/update', updateData, userToken, lang);
// Si le livre a une copie locale → addToQueue
if (localSyncedBooks.find((sb: SyncedBook): boolean => sb.id === entityId)) {
addToQueue('db:spell:update', updateData);
addToQueue('update_spell', {data: updateData});
}
}
@@ -680,11 +669,8 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
// 1. Récupérer les détails du sort de la série
let seriesSpellDetail: SeriesSpellDetailResponse;
if (isCurrentlyOffline() || book?.localBook) {
// Mode offline → IPC pour récupérer les détails du sort de la série locale
seriesSpellDetail = await window.electron.invoke<SeriesSpellDetailResponse>(
'db:series:spell:detail',
{spellId: seriesSpellId}
);
// Mode offline → Tauri pour récupérer les détails du sort de la série locale
seriesSpellDetail = await tauri.getSeriesSpellDetail(seriesSpellId) as SeriesSpellDetailResponse;
} else {
// Mode online → Serveur
seriesSpellDetail = await System.authGetQueryToServer<SeriesSpellDetailResponse>(
@@ -715,14 +701,14 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
let createdSpellId: string;
if (isCurrentlyOffline() || book?.localBook) {
// Mode offline ou livre local → IPC
createdSpellId = await window.electron.invoke<string>('db:spell:create', spellData);
// Mode offline ou livre local → Tauri
createdSpellId = await tauri.createSpell(spellData.bookId, spellData.spell);
} else {
// Mode online → Serveur
createdSpellId = await System.authPostToServer<string>('spell/add', spellData, userToken, lang);
// Si le livre a une copie locale → addToQueue
if (localSyncedBooks.find((sb: SyncedBook): boolean => sb.id === entityId)) {
addToQueue('db:spell:create', {...spellData, id: createdSpellId});
addToQueue('create_spell', {data: {...spellData, id: createdSpellId}});
}
}
@@ -758,7 +744,7 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
};
let tagId: string;
if (isCurrentlyOffline() || localSeries) {
tagId = await window.electron.invoke<string>('db:series:spell:tag:add', addData);
tagId = await tauri.addSeriesSpellTag(addData);
} else {
tagId = await System.authPostToServer<string>(
'series/spell/tag/add',
@@ -767,7 +753,7 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
lang
);
if (localSyncedSeries.find((s: SyncedSeries): boolean => s.id === entityId)) {
addToQueue('db:series:spell:tag:add', {...addData, id: tagId});
addToQueue('add_series_spell_tag', {data: {...addData, id: tagId}});
}
}
if (tagId) {
@@ -786,11 +772,11 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
};
let newTag: SpellTagProps;
if (isCurrentlyOffline() || book?.localBook) {
newTag = await window.electron.invoke<SpellTagProps>('db:spell:tag:create', requestData);
newTag = await tauri.createSpellTag(requestData.bookId, requestData.name, requestData.color) as SpellTagProps;
} else {
newTag = await System.authPostToServer<SpellTagProps>('spell/tag/add', requestData, userToken, lang);
if (localSyncedBooks.find((sb: SyncedBook): boolean => sb.id === entityId)) {
addToQueue('db:spell:tag:create', {...requestData, id: newTag?.id});
addToQueue('create_spell_tag', {data: {...requestData, id: newTag?.id}});
}
}
if (newTag && newTag.id) {
@@ -816,20 +802,20 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
if (isSeriesMode) {
// Series mode - dual logic
if (isCurrentlyOffline() || localSeries) {
success = await window.electron.invoke<boolean>('db:series:spell:tag:update', requestData);
success = await tauri.updateSeriesSpellTag(requestData);
} else {
success = await System.authPutToServer<boolean>('series/spell/tag/update', requestData, userToken, lang);
if (localSyncedSeries.find((s: SyncedSeries): boolean => s.id === entityId)) {
addToQueue('db:series:spell:tag:update', requestData);
addToQueue('update_series_spell_tag', {data: requestData});
}
}
} else {
if (isCurrentlyOffline() || book?.localBook) {
success = await window.electron.invoke<boolean>('db:spell:tag:update', requestData);
success = await tauri.updateSpellTag(requestData.tagId, requestData.name, requestData.color);
} else {
success = await System.authPutToServer<boolean>('spell/tag/update', requestData, userToken, lang);
if (localSyncedBooks.find((sb: SyncedBook): boolean => sb.id === entityId)) {
addToQueue('db:spell:tag:update', requestData);
addToQueue('update_spell_tag', {data: requestData});
}
}
}
@@ -859,21 +845,21 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
// Series mode - dual logic
const deleteData = {tagId, deletedAt};
if (isCurrentlyOffline() || localSeries) {
success = await window.electron.invoke<boolean>('db:series:spell:tag:delete', deleteData);
success = await tauri.deleteSeriesSpellTag(deleteData.tagId, deleteData.deletedAt);
} else {
success = await System.authDeleteToServer<boolean>('series/spell/tag/delete', deleteData, userToken, lang);
if (localSyncedSeries.find((s: SyncedSeries): boolean => s.id === entityId)) {
addToQueue('db:series:spell:tag:delete', deleteData);
addToQueue('delete_series_spell_tag', {data: deleteData});
}
}
} else {
const requestData = {tagId, bookId: entityId, deletedAt};
if (isCurrentlyOffline() || book?.localBook) {
success = await window.electron.invoke<boolean>('db:spell:tag:delete', requestData);
success = await tauri.deleteSpellTag(requestData.tagId, requestData.bookId, requestData.deletedAt);
} else {
success = await System.authDeleteToServer<boolean>('spell/tag/delete', requestData, userToken, lang);
if (localSyncedBooks.find((sb: SyncedBook): boolean => sb.id === entityId)) {
addToQueue('db:spell:tag:delete', requestData);
addToQueue('delete_spell_tag', {data: requestData});
}
}
}
@@ -898,10 +884,7 @@ export function useSpells(config: UseSpellsConfig): UseSpellsReturn {
if (selectedSpell?.seriesSpellId) {
let seriesSpellResponse: SeriesSpellDetailResponse;
if (isCurrentlyOffline() || (isSeriesMode ? localSeries : book?.localBook)) {
seriesSpellResponse = await window.electron.invoke<SeriesSpellDetailResponse>(
'db:series:spell:detail',
{spellId: selectedSpell.seriesSpellId}
);
seriesSpellResponse = await tauri.getSeriesSpellDetail(selectedSpell.seriesSpellId) as SeriesSpellDetailResponse;
} else {
seriesSpellResponse = await System.authGetQueryToServer<SeriesSpellDetailResponse>(
'series/spell/detail',