added initial files
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
import React, { useEffect, memo } from 'react';
|
||||
import { useDidMount } from 'rooks';
|
||||
import styled from 'styled-components';
|
||||
import { Switch } from 'react-router';
|
||||
import { ipcRenderer } from 'electron';
|
||||
import { useSelector, useDispatch } from 'react-redux';
|
||||
import { push } from 'connected-react-router';
|
||||
import { message } from 'antd';
|
||||
import RouteWithSubRoutes from '../../common/components/RouteWithSubRoutes';
|
||||
import {
|
||||
loginWithAccessToken,
|
||||
initManifests,
|
||||
initNews,
|
||||
loginThroughNativeLauncher,
|
||||
switchToFirstValidAccount,
|
||||
checkClientToken,
|
||||
updateUserData,
|
||||
loginWithOAuthAccessToken
|
||||
} from '../../common/reducers/actions';
|
||||
import {
|
||||
load,
|
||||
received,
|
||||
requesting
|
||||
} from '../../common/reducers/loading/actions';
|
||||
import features from '../../common/reducers/loading/features';
|
||||
import GlobalStyles from '../../common/GlobalStyles';
|
||||
import RouteBackground from '../../common/components/RouteBackground';
|
||||
import ga from '../../common/utils/analytics';
|
||||
import routes from './utils/routes';
|
||||
import { _getCurrentAccount } from '../../common/utils/selectors';
|
||||
import { isLatestJavaDownloaded } from './utils';
|
||||
import SystemNavbar from './components/SystemNavbar';
|
||||
import useTrackIdle from './utils/useTrackIdle';
|
||||
import { openModal } from '../../common/reducers/modals/actions';
|
||||
import Message from './components/Message';
|
||||
import {
|
||||
ACCOUNT_MICROSOFT,
|
||||
LATEST_JAVA_VERSION
|
||||
} from '../../common/utils/constants';
|
||||
|
||||
const Wrapper = styled.div`
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
`;
|
||||
|
||||
const Container = styled.div`
|
||||
position: absolute;
|
||||
top: ${props => props.theme.sizes.height.systemNavbar}px;
|
||||
height: calc(100vh - ${props => props.theme.sizes.height.systemNavbar}px);
|
||||
width: 100vw;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
transition: transform 0.2s;
|
||||
transition-timing-function: cubic-bezier(0.165, 0.84, 0.44, 1);
|
||||
will-change: transform;
|
||||
`;
|
||||
|
||||
function DesktopRoot({ store }) {
|
||||
const dispatch = useDispatch();
|
||||
const currentAccount = useSelector(_getCurrentAccount);
|
||||
const clientToken = useSelector(state => state.app.clientToken);
|
||||
const javaPath = useSelector(state => state.settings.java.path);
|
||||
const javaLatestPath = useSelector(state => state.settings.java.pathLatest);
|
||||
const location = useSelector(state => state.router.location);
|
||||
// const modals = useSelector(state => state.modals);
|
||||
const shouldShowDiscordRPC = useSelector(state => state.settings.discordRPC);
|
||||
// const [contentStyle, setContentStyle] = useState({ transform: 'scale(1)' });
|
||||
|
||||
message.config({
|
||||
top: 45,
|
||||
maxCount: 1
|
||||
});
|
||||
|
||||
const init = async () => {
|
||||
dispatch(requesting(features.mcAuthentication));
|
||||
const userDataStatic = await ipcRenderer.invoke('getUserData');
|
||||
const userData = dispatch(updateUserData(userDataStatic));
|
||||
await dispatch(checkClientToken());
|
||||
dispatch(initNews());
|
||||
|
||||
const manifests = await dispatch(initManifests());
|
||||
|
||||
let isJava8OK = javaPath;
|
||||
let isJavaLatestOk = javaLatestPath;
|
||||
|
||||
if (!javaPath) {
|
||||
({ isValid: isJava8OK } = await isLatestJavaDownloaded(
|
||||
manifests,
|
||||
userData,
|
||||
true
|
||||
));
|
||||
}
|
||||
|
||||
if (!isJavaLatestOk) {
|
||||
({ isValid: isJavaLatestOk } = await isLatestJavaDownloaded(
|
||||
manifests,
|
||||
userData,
|
||||
true,
|
||||
LATEST_JAVA_VERSION
|
||||
));
|
||||
}
|
||||
|
||||
if (!isJava8OK || !isJavaLatestOk) {
|
||||
dispatch(openModal('JavaSetup', { preventClose: true }));
|
||||
|
||||
// Super duper hacky solution to await the modal to be closed...
|
||||
// Please forgive me
|
||||
await new Promise(resolve => {
|
||||
function checkModalStillOpen(state) {
|
||||
return state.modals.find(v => v.modalType === 'JavaSetup');
|
||||
}
|
||||
|
||||
let currentValue;
|
||||
const unsubscribe = store.subscribe(() => {
|
||||
const previousValue = currentValue;
|
||||
currentValue = store.getState().modals.length;
|
||||
if (previousValue !== currentValue) {
|
||||
const stillOpen = checkModalStillOpen(store.getState());
|
||||
|
||||
if (!stillOpen) {
|
||||
unsubscribe();
|
||||
return resolve();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV === 'development' && currentAccount) {
|
||||
dispatch(received(features.mcAuthentication));
|
||||
dispatch(push('/home'));
|
||||
} else if (currentAccount) {
|
||||
dispatch(
|
||||
load(
|
||||
features.mcAuthentication,
|
||||
dispatch(
|
||||
currentAccount.accountType === ACCOUNT_MICROSOFT
|
||||
? loginWithOAuthAccessToken()
|
||||
: loginWithAccessToken()
|
||||
)
|
||||
)
|
||||
).catch(() => {
|
||||
dispatch(switchToFirstValidAccount());
|
||||
});
|
||||
} else {
|
||||
dispatch(
|
||||
load(features.mcAuthentication, dispatch(loginThroughNativeLauncher()))
|
||||
).catch(console.error);
|
||||
}
|
||||
|
||||
if (shouldShowDiscordRPC) {
|
||||
ipcRenderer.invoke('init-discord-rpc');
|
||||
}
|
||||
|
||||
ipcRenderer.on('custom-protocol-event', (e, data) => {
|
||||
console.log(data);
|
||||
});
|
||||
};
|
||||
|
||||
// Handle already logged in account redirect
|
||||
useDidMount(init);
|
||||
|
||||
useEffect(() => {
|
||||
if (!currentAccount) {
|
||||
dispatch(push('/'));
|
||||
}
|
||||
}, [currentAccount]);
|
||||
|
||||
useEffect(() => {
|
||||
if (clientToken && process.env.NODE_ENV !== 'development') {
|
||||
ga.setUserId(clientToken);
|
||||
ga.trackPage(location.pathname);
|
||||
}
|
||||
}, [location.pathname, clientToken]);
|
||||
|
||||
useTrackIdle(location.pathname);
|
||||
|
||||
// useEffect(() => {
|
||||
// if (
|
||||
// modals[0] &&
|
||||
// modals[0].modalType === 'Settings' &&
|
||||
// !modals[0].unmounting
|
||||
// ) {
|
||||
// setContentStyle({ transform: 'scale(0.4)' });
|
||||
// } else {
|
||||
// setContentStyle({ transform: 'scale(1)' });
|
||||
// }
|
||||
// }, [modals]);
|
||||
|
||||
return (
|
||||
<Wrapper>
|
||||
<SystemNavbar />
|
||||
<Message />
|
||||
<Container>
|
||||
<GlobalStyles />
|
||||
<RouteBackground />
|
||||
<Switch>
|
||||
{routes.map((route, i) => (
|
||||
<RouteWithSubRoutes key={i} {...route} /> // eslint-disable-line
|
||||
))}
|
||||
</Switch>
|
||||
</Container>
|
||||
</Wrapper>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(DesktopRoot);
|
||||
Reference in New Issue
Block a user