121 lines
3.4 KiB
TypeScript
121 lines
3.4 KiB
TypeScript
import { IonicVue } from "@ionic/vue";
|
||
import { createPinia } from "pinia";
|
||
import { useRegisterSW } from "virtual:pwa-register/vue";
|
||
import { createApp } from "vue";
|
||
import uiComponents from "@/ui";
|
||
import App from "./App.vue";
|
||
import { authClient } from "./auth";
|
||
import { i18n } from "./locales";
|
||
import { setupMocks } from "./mocks";
|
||
import { router } from "./router";
|
||
|
||
/* Core CSS required for Ionic components to work properly */
|
||
import "@ionic/vue/css/core.css";
|
||
/* Basic CSS for apps built with Ionic */
|
||
import "@ionic/vue/css/normalize.css";
|
||
import "@ionic/vue/css/structure.css";
|
||
|
||
import "@ionic/vue/css/typography.css";
|
||
/* Optional CSS utils that can be commented out */
|
||
import "@ionic/vue/css/padding.css";
|
||
import "@ionic/vue/css/float-elements.css";
|
||
import "@ionic/vue/css/text-alignment.css";
|
||
import "@ionic/vue/css/text-transformation.css";
|
||
import "@ionic/vue/css/flex-utils.css";
|
||
|
||
/**
|
||
* Ionic Dark Mode
|
||
* -----------------------------------------------------
|
||
* For more info, please see:
|
||
* https://ionicframework.com/docs/theming/dark-mode
|
||
*/
|
||
|
||
import "@ionic/vue/css/display.css";
|
||
// import "@ionic/vue/css/palettes/dark.system.css";
|
||
|
||
// import "@ionic/vue/css/palettes/dark.always.css";
|
||
import "@ionic/vue/css/palettes/dark.class.css";
|
||
/* Theme variables */
|
||
import "./theme/index.css";
|
||
import "./theme/variables.css";
|
||
import "./theme/ionic.css";
|
||
|
||
useTheme();
|
||
|
||
// 注册 PWA Service Worker(使用 Vue 3 Composition API)
|
||
const { offlineReady, needRefresh, updateServiceWorker } = useRegisterSW({
|
||
onRegistered(registration) {
|
||
console.log("[PWA] Service Worker registered:", registration);
|
||
},
|
||
onRegisterError(error) {
|
||
console.error("[PWA] Service Worker registration failed:", error);
|
||
},
|
||
immediate: true,
|
||
});
|
||
|
||
// 监听 PWA 状态
|
||
watch(offlineReady, (ready) => {
|
||
if (ready) {
|
||
console.log("[PWA] App ready to work offline.");
|
||
}
|
||
});
|
||
|
||
watch(needRefresh, (refresh) => {
|
||
if (refresh) {
|
||
console.log("[PWA] New content available, please refresh.");
|
||
}
|
||
});
|
||
|
||
function initTradingView() {
|
||
const { VITE_TRADINGVIEW_LIBRARY_URL } = useEnv();
|
||
const promise1 = new Promise((resolve) => {
|
||
const script = document.createElement("script");
|
||
script.type = "text/javascript";
|
||
script.src = `${VITE_TRADINGVIEW_LIBRARY_URL}/charting_library/charting_library.standalone.js`;
|
||
script.async = true;
|
||
document.body.appendChild(script);
|
||
script.onload = () => resolve(true);
|
||
});
|
||
const promise2 = new Promise((resolve) => {
|
||
const script = document.createElement("script");
|
||
script.type = "text/javascript";
|
||
script.src = `${VITE_TRADINGVIEW_LIBRARY_URL}/datafeeds/udf/bundle.js`;
|
||
script.async = true;
|
||
document.body.appendChild(script);
|
||
script.onload = () => resolve(true);
|
||
});
|
||
return Promise.all([promise1, promise2]);
|
||
}
|
||
|
||
function initApp() {
|
||
initTradingView().then(() => {
|
||
authClient.getSession().then((session) => {
|
||
const pinia = createPinia();
|
||
const userStore = useUserStore(pinia);
|
||
userStore.setToken(session.data?.session.token || "");
|
||
|
||
const app = createApp(App)
|
||
.use(IonicVue, {
|
||
backButtonText: "返回",
|
||
mode: "ios",
|
||
statusTap: true,
|
||
swipeBackEnabled: true,
|
||
// rippleEffect: true,
|
||
// animated: false,
|
||
})
|
||
.use(uiComponents)
|
||
.use(pinia)
|
||
.use(router)
|
||
.use(i18n);
|
||
|
||
router.isReady().then(() => {
|
||
app.mount("#app");
|
||
});
|
||
});
|
||
});
|
||
}
|
||
|
||
setupMocks().then(() => {
|
||
initApp();
|
||
});
|