mirror of
https://github.com/pybricks/pybricks-code.git
synced 2026-09-15 02:54:07 +00:00
This adds support to the BLE Pybricks Profile v1.2.0. This includes a new method to download and run programs and a new file format for the user program. Code for the old download and run is kept for backwards compatibility. However, the PnP ID characteristic is no longer optional, so the minimum Pybricks Profile is now v1.1.0.
116 lines
3.8 KiB
TypeScript
116 lines
3.8 KiB
TypeScript
// SPDX-License-Identifier: MIT
|
|
// Copyright (c) 2020-2022 The Pybricks Authors
|
|
|
|
import './index.scss';
|
|
import { HotkeysProvider } from '@blueprintjs/core';
|
|
import { configureStore } from '@reduxjs/toolkit';
|
|
import { I18nContext } from '@shopify/react-i18n';
|
|
import React from 'react';
|
|
import { OverlayProvider } from 'react-aria';
|
|
import ReactDOM from 'react-dom';
|
|
import { Provider } from 'react-redux';
|
|
import { createLogger } from 'redux-logger';
|
|
import createSagaMiddleware from 'redux-saga';
|
|
import App from './app/App';
|
|
import { appVersion } from './app/constants';
|
|
import { db } from './fileStorage/context';
|
|
import { i18nManager } from './i18n';
|
|
import * as I18nToaster from './i18nToaster';
|
|
import { rootReducer } from './reducers';
|
|
import reportWebVitals from './reportWebVitals';
|
|
import rootSaga, { RootSagaContext } from './sagas';
|
|
import { defaultTerminalContext } from './terminal/TerminalContext';
|
|
import ViewHeightSensor from './utils/ViewHeightSensor';
|
|
import { createCountFunc } from './utils/iter';
|
|
|
|
const toaster = I18nToaster.create(i18nManager);
|
|
|
|
const sagaMiddleware = createSagaMiddleware<RootSagaContext>({
|
|
context: {
|
|
nextMessageId: createCountFunc(),
|
|
notification: { toaster },
|
|
terminal: defaultTerminalContext,
|
|
fileStorage: db,
|
|
toaster,
|
|
},
|
|
});
|
|
|
|
// TODO: add runtime option or filter - logger affects firmware flash performance
|
|
const loggerMiddleware = createLogger({ predicate: () => false });
|
|
|
|
const store = configureStore({
|
|
reducer: rootReducer,
|
|
middleware: (getDefaultMiddleware) =>
|
|
getDefaultMiddleware({
|
|
serializableCheck: {
|
|
ignoredActionPaths: [
|
|
// copy of defaults
|
|
'meta.arg',
|
|
'meta.baseQueryMeta',
|
|
// monoco view state has class-based object but is technically serializable
|
|
'viewState.viewState.firstPosition',
|
|
// contain ArrayBuffer, Blob or DataView
|
|
'data',
|
|
'file',
|
|
'firmwareZip',
|
|
'payload',
|
|
'value',
|
|
// Error is not serializable
|
|
'error',
|
|
'props.error',
|
|
],
|
|
},
|
|
})
|
|
.concat(sagaMiddleware)
|
|
.concat(loggerMiddleware),
|
|
});
|
|
|
|
// special styling for beta versions
|
|
if (appVersion.match(/beta/)) {
|
|
document.body.classList.add('pb-beta');
|
|
}
|
|
|
|
// prevent default drag/drop which just "downloads" any file dropped anywhere
|
|
// in the browser window
|
|
|
|
const dragEventHandler = (e: DragEvent) => {
|
|
if (
|
|
e.target instanceof Element &&
|
|
!e.target.classList.contains('pb-dropzone-root')
|
|
) {
|
|
e.preventDefault();
|
|
|
|
if (e.dataTransfer) {
|
|
e.dataTransfer.effectAllowed = 'none';
|
|
e.dataTransfer.dropEffect = 'none';
|
|
}
|
|
}
|
|
};
|
|
|
|
window.addEventListener('dragenter', dragEventHandler, false);
|
|
window.addEventListener('dragover', dragEventHandler);
|
|
window.addEventListener('drop', dragEventHandler);
|
|
|
|
sagaMiddleware.run(rootSaga);
|
|
|
|
ReactDOM.render(
|
|
<React.StrictMode>
|
|
<Provider store={store}>
|
|
<I18nContext.Provider value={i18nManager}>
|
|
<ViewHeightSensor />
|
|
<OverlayProvider>
|
|
<HotkeysProvider>
|
|
<App />
|
|
</HotkeysProvider>
|
|
</OverlayProvider>
|
|
</I18nContext.Provider>
|
|
</Provider>
|
|
</React.StrictMode>,
|
|
document.getElementById('root'),
|
|
);
|
|
|
|
// If you want to start measuring performance in your app, pass a function
|
|
// to log results (for example: reportWebVitals(console.log))
|
|
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
|
|
reportWebVitals();
|