53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import { useEffect, useRef, useState } from 'react';
|
|
|
|
import { useEnv } from '@/context/EnvContext';
|
|
import { Book } from '@/types/book';
|
|
import { getUserLang } from '@/utils/misc';
|
|
import { isWebAppPlatform } from '@/services/environment';
|
|
|
|
import libraryEn from '@/data/demo/library.en.json';
|
|
import libraryZh from '@/data/demo/library.zh.json';
|
|
|
|
const libraries = {
|
|
en: libraryEn,
|
|
zh: libraryZh,
|
|
};
|
|
|
|
interface DemoBooks {
|
|
library: string[];
|
|
}
|
|
|
|
export const useDemoBooks = () => {
|
|
const { envConfig } = useEnv();
|
|
const userLang = getUserLang() as keyof typeof libraries;
|
|
const [books, setBooks] = useState<Book[]>([]);
|
|
const isLoading = useRef(false);
|
|
|
|
useEffect(() => {
|
|
if (isLoading.current) return;
|
|
isLoading.current = true;
|
|
|
|
const fetchDemoBooks = async () => {
|
|
try {
|
|
const appService = await envConfig.getAppService();
|
|
const demoBooks = libraries[userLang] || (libraries.en as DemoBooks);
|
|
const books = await Promise.all(
|
|
demoBooks.library.map((url) => appService.importBook(url, [], false, true)),
|
|
);
|
|
setBooks(books.filter((book) => book !== null) as Book[]);
|
|
} catch (error) {
|
|
console.error('Failed to import demo books:', error);
|
|
}
|
|
};
|
|
|
|
const demoBooksFetchedFlag = localStorage.getItem('demoBooksFetched');
|
|
if (isWebAppPlatform() && !demoBooksFetchedFlag) {
|
|
fetchDemoBooks();
|
|
localStorage.setItem('demoBooksFetched', 'true');
|
|
}
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, []);
|
|
|
|
return books;
|
|
};
|