scoresaber-reloaded-v2/src/components/AppProvider.tsx

69 lines
1.8 KiB
TypeScript
Raw Normal View History

"use client";
import { useScoresaberScoresStore } from "@/store/scoresaberScoresStore";
import { useSettingsStore } from "@/store/settingsStore";
import React from "react";
2023-11-05 20:56:19 +00:00
import { ToastContainer } from "react-toastify";
2023-10-29 15:35:10 +00:00
import { TooltipProvider } from "./ui/Tooltip";
2023-10-29 20:53:48 +00:00
import { ThemeProvider } from "./ui/theme-provider";
2023-11-05 14:16:23 +00:00
2023-10-23 15:35:01 +00:00
const UPDATE_INTERVAL = 1000 * 60 * 5; // 5 minutes
export default class AppProvider extends React.Component {
_state = {
mounted: false, // Whether the component has mounted
// Whether the data from the async storage has been loaded
dataLoaded: {
scores: false,
settings: false,
},
};
async componentDidMount(): Promise<void> {
if (this._state.mounted) {
return;
}
this._state.mounted = true;
2023-10-24 11:35:59 +00:00
const initUpdater = async () => {
// Load data from async storage
await useSettingsStore.persist.rehydrate();
await useScoresaberScoresStore.persist.rehydrate();
await useSettingsStore.getState().refreshProfiles();
setInterval(() => {
useSettingsStore.getState().refreshProfiles();
}, UPDATE_INTERVAL);
await useScoresaberScoresStore.getState().updatePlayerScores();
setInterval(() => {
useScoresaberScoresStore.getState().updatePlayerScores();
}, UPDATE_INTERVAL);
};
initUpdater();
}
constructor(props: any) {
super(props);
}
render(): React.ReactNode {
const props: any = this.props;
2023-10-29 20:53:48 +00:00
return (
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem>
2023-11-05 20:56:19 +00:00
<TooltipProvider>
<ToastContainer
className="z-50"
position="top-right"
theme="dark"
pauseOnFocusLoss={false}
/>
{props.children}
</TooltipProvider>
2023-10-29 20:53:48 +00:00
</ThemeProvider>
);
}
}