Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: auto-update Mapeo when internet is available #346

Merged
merged 15 commits into from
Jul 31, 2020
Merged

Conversation

okdistribute
Copy link
Contributor

@okdistribute okdistribute commented May 12, 2020

Contributor checklist:

  • My contribution is not related to translations. Please submit translation changes via our Mapeo Crowdin project
  • My commits are in nice logical chunks with good commit messages
  • I have walked through the QA Manual Testing
    Script
    and updated it if necessary.
  • If my changes depend upon an update to a dependency, I have updated the package-lock.json file using npm install --package-lock
  • My changes are ready to be shipped to users on Windows, Mac, and Linux

Description

Here's a video demo. I used the existing tabs on the left because it was easier and I didn't have to create any new styles, and would probably be much nicer that whatever I would have made customized.

TODO

  • Decide what we want to change about this design.
  • Blank moment between clicking 'download' and seeing download progress
  • CSS wonkiness on sidebar during download, need to fix the size
    - [ ] Show release notes~
  • Use AWS bucket for release uploads and downloads https://downloads.mapeo.app
  • Test beta release/downgrade workflow

@gmaclennan
Copy link
Member

Great work on this @okdistribute this is really slick and will be great for Mapeo users.

I don't think it makes sense to add this as a separate tab, I think all the information and interaction needed can be shown within the sidebar (e.g. it does not need to show anything in the main app space), although I appreciate that the current implementation makes styling easier. I'm happy to integrate as-is and update styling later. When I get a moment I can sketch something out.

I do think we need to change the CSS so that the width of the update item does not alter the width of the sidebar. It should respond to the sidebar width. Changing the sidebar width will slow down the rest of the app on slower machines (because of redrawing the map screen, and I'm not sure we actually listen for changes in width, only changes in window size, so it might lead to rendering artifacts) and be difficult for users trying to use the app during update because the screen will jump around.

@okdistribute
Copy link
Contributor Author

OK @gmaclennan, fixed the CSS. Can look at putting information inside the sidebar, wanted to run this by everyone to see what additional information is needed there.

const [tabIndex, setTabIndex] = useTabIndex(0)
const [update, setUpdate] = useUpdater()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keeping update state in the <Home> component is going to cause a re-render of the whole app for each update event (e.g. progress events). This may affect performance of the app when using it during an update. It could be resolved by memoizing the other components (territory and observation views) if they are not already, or it could be solved by placing the updater state in react context. It would be worth checking the performance / re-render cost with latest react devtools to see whether there is a performance cost.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, although I don't know enough about these details so I'll need to read up on it a bit

@@ -87,6 +92,7 @@ const StyledTabs = styled(Tabs)`
const StyledTab = styled(Tab)`
padding: 6px 24px 6px 18px;
min-height: 64px;
max-width: 200px;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could lead to tab labels being truncated in different languages

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you have a suggested way to fix this that doesn't cause the sidebar to jump around?

Copy link
Member

@gmaclennan gmaclennan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work on this @okdistribute. I think there are ways that the API wrapper for electron-updater and communication between the processes could be changed reduce bugs and simplify debugging. Currently interaction over IPC via requests with no response and event listeners for the error or progress events make it hard to render the UI to respond to user events e.g. show progress as soon as the user clicks the "download" button, because the UI state and the server state are not in sync.

One way to solve this is to set up async communication between the renderer process and the updater. I'm not sure if this will work via remote.require() or we need to set up our own ipc. E.g. an alternative version of useUpdater.js (This isn't working code, just an example to try to explain what I am thinking):

import { STATES } from "./";
import electronIpc from "../../electron-ipc";
import { remote } from "electron";
import { useEffect, useState } from "react";

const autoUpdate = remote.require("../../main/someElectronUpdaterWrapper");

export default function useUpdater() {
  const [update, setUpdate] = useState({
    progress: null,
    updateInfo: null,
    state: STATES.IDLE,
  });

  function checkForUpdates() {
    if (update.state === STATES.PROGRESS) return;
    autoUpdate
      .checkForUpdates()
      .then((info) =>
        setUpdate({
          updateInfo: info,
          progresss: null,
          state: STATES.AVAILABLE,
        })
      )
      .catch((e) =>
        setUpdate({ updateInfo: null, progress: null, state: STATES.ERROR })
      );
    setUpdate({
      updateInfo: null,
      progress: null,
      state: STATES.CHECKING_FOR_UPDATE, // New state
    });
  }

  function downloadUpdate() {
    if (update.state !== STATES.AVAILABLE) return;

    function onProgress(progress) {
      setUpdate((state) => ({ ...state, progress }));
    }

    autoUpdate.on("download-progress", onProgress);

    autoUpdate
      .downloadUpdate()
      .then(() =>
        setUpdate(state => ({
          updateInfo: state.info,
          progresss: null,
          state: STATES.READY_FOR_RESTART,
        }))
      )
      .catch((e) =>
        setUpdate({ updateInfo: null, progress: null, state: STATES.ERROR })
      )
      .finally(() => autoUpdate.off("download-progress"));

    setUpdate({
      updateInfo: null,
      progress: 0, // Whatever progress state is at zero
      state: STATES.PROGRESS
    });
  }

  return [update, { checkForUpdates, downloadUpdate }];
}

There are some caveats to using remote.require() and I'm not sure if it supports promises in electron@6, so we might need to do our own thing with ipcRenderer, which also does not seem to support invoke() in electron@6 :(

Without setting state in response to user events, the UI will be unresponsive and users may click buttons multiple times thinking it is not working. I'm not sure if calling autoupdate.downloadUpdate() multiple times causes multiple downloads?

Finally, I think @xstate/fsm can be super helpful for implementing this kind of thing, although there is a learning curve. It helps catch all the edge cases and simplifies implementation, but using the switch statements as you have in the components works just as well and is fine.

@okdistribute okdistribute changed the base branch from master to feature/logging June 19, 2020 23:48
@okdistribute
Copy link
Contributor Author

okdistribute commented Jun 20, 2020

Great work on this @okdistribute. I think there are ways that the API wrapper for electron-updater and communication between the processes could be changed reduce bugs and simplify debugging. Currently interaction over IPC via requests with no response and event listeners for the error or progress events make it hard to render the UI to respond to user events e.g. show progress as soon as the user clicks the "download" button, because the UI state and the server state are not in sync.

Showing progress as soon as the user clicks the download button is already captured in UpdaterView when the user clicks the button. Perhaps best to move all state management code to the useUpdater file.

One way to solve this is to set up async communication between the renderer process and the updater. I'm not sure if this will work via remote.require() or we need to set up our own ipc. E.g. an alternative version of useUpdater.js (This isn't working code, just an example to try to explain what I am thinking):

Creating an asyncronous electron-ipc listener is already supported out of the box with electron v6, no need for remote.require() or our own ipc, using event.reply.

https://github.com/electron/electron/blob/v6.0.10/docs/api/ipc-main.

import { STATES } from "./";
import electronIpc from "../../electron-ipc";
import { remote } from "electron";
import { useEffect, useState } from "react";

const autoUpdate = remote.require("../../main/someElectronUpdaterWrapper");

export default function useUpdater() {
  const [update, setUpdate] = useState({
    progress: null,
    updateInfo: null,
    state: STATES.IDLE,
  });

  function checkForUpdates() {
    if (update.state === STATES.PROGRESS) return;
    autoUpdate
      .checkForUpdates()
      .then((info) =>
        setUpdate({
          updateInfo: info,
          progresss: null,
          state: STATES.AVAILABLE,
        })
      )
      .catch((e) =>
        setUpdate({ updateInfo: null, progress: null, state: STATES.ERROR })
      );
    setUpdate({
      updateInfo: null,
      progress: null,
      state: STATES.CHECKING_FOR_UPDATE, // New state
    });
  }

  function downloadUpdate() {
    if (update.state !== STATES.AVAILABLE) return;

    function onProgress(progress) {
      setUpdate((state) => ({ ...state, progress }));
    }

    autoUpdate.on("download-progress", onProgress);

    autoUpdate
      .downloadUpdate()
      .then(() =>
        setUpdate(state => ({
          updateInfo: state.info,
          progresss: null,
          state: STATES.READY_FOR_RESTART,
        }))
      )
      .catch((e) =>
        setUpdate({ updateInfo: null, progress: null, state: STATES.ERROR })
      )
      .finally(() => autoUpdate.off("download-progress"));

    setUpdate({
      updateInfo: null,
      progress: 0, // Whatever progress state is at zero
      state: STATES.PROGRESS
    });
  }

  return [update, { checkForUpdates, downloadUpdate }];
}

There are some caveats to using remote.require() and I'm not sure if it supports promises in electron@6, so we might need to do our own thing with ipcRenderer, which also does not seem to support invoke() in electron@6 :(

Without setting state in response to user events, the UI will be unresponsive and users may click buttons multiple times thinking it is not working. I'm not sure if calling autoupdate.downloadUpdate() multiple times causes multiple downloads?

This state is prevented in the frontend in UpdaterView as mentioned before, but I'll make sure that if it happens to be called twice somehow that it won't download twice (although I hope this is caught by Electron Updater!?)

Finally, I think @xstate/fsm can be super helpful for implementing this kind of thing, although there is a learning curve. It helps catch all the edge cases and simplifies implementation, but using the switch statements as you have in the components works just as well and is fine.

Seems like a larger refactoring project, perhaps we can discuss if we want to do this later?

@okdistribute
Copy link
Contributor Author

okdistribute commented Jun 20, 2020

To add, I don't think we want to turn on and off updates for download-progress events because otherwise the UI state could diverge from the back-end state. Any back-end events should always be rendered in the frontend

@okdistribute okdistribute force-pushed the auto-update branch 2 times, most recently from 0b4c9e1 to bab0bbf Compare June 20, 2020 18:45
@okdistribute okdistribute force-pushed the feature/logging branch 3 times, most recently from eb24816 to c15c2da Compare June 23, 2020 22:04
Base automatically changed from feature/logging to master June 23, 2020 22:04
@okdistribute okdistribute marked this pull request as ready for review July 31, 2020 21:20
@okdistribute okdistribute merged commit f5318cc into master Jul 31, 2020
@okdistribute okdistribute deleted the auto-update branch July 31, 2020 21:24
ErikSin pushed a commit that referenced this pull request Aug 3, 2021
* feat: auto-update Mapeo when internet is available (#346)

* chore(build): remove parallel requirement

* chore(release): 5.4.0-beta.0

* chore(build): Typo for uploading excecutables to AWS

* chore(release): 5.4.0-beta.1

* chore(release): Workaround attempt to fix an electron-builder bug

* chore(build): Add providers for github and s3 for each target

* chore(build): Manually add app-update.yml

* chore(release): 5.4.0-beta.2

* chore(build): try new app-update.yml through extraResources

* chore(release): 5.4.0-beta.3

* fix: Multiselect field should not error if has select_one data (#390)

* fix: Only allow updater when on compatible platforms

* fix: update to electron 9.1.2 (#389)

* chore(release): 5.4.0-beta.4

* fix: Use https://downloads.mapeo.app for updater endpoint

* fix: Error where download speed would always show 0 seconds

* fix: Only fetch download speed when opening the Updater tab.

* Revert "fix: Only fetch download speed when opening the Updater tab."

This reverts commit 6e5645f.

* fix: Properly return error when updater is inactive

* chore(release): 5.4.0-beta.5

* chore(release): 5.4.0-beta.5

* fix: Make left-hand side copy more simple

* fix: Ensure all dialogs will work with Electron 9 (#391)

* fix(typo): add missing 'notes' field in fallbackFields

* chore: Remove unnecessary matrix config from github action CD (#397)

* chore: Remove un-used architecture option for actions/setup-node (#394)

There is a PR to add an architecture option but it is not yet merged:
actions/setup-node#42

* fix: Notarize Mapeo for MacOS — fix warning / unable to open app (#396)

* fix: Notarize Mapeo for MacOS — fix warning / unable to open app

* fix: Add secrets

* fix: remove .map that should not have been there

* fix: Fix icon layout in dmg for MacOS (#399)

* chore: Put 'Check for Updates' in the help menu

* fix: Only save the language to config when changed manually. Fixes #400

Mapeo was saving the system locale to the config always on startup, so if you change system languages and reopened Mapeo it wouldn't also change system languages.

This now only persists the change in language if the user explicitly requests to change the language through the User Interface.

* fix: Mapeo config directory should be removable (#401)

* chore: Merge mapFilter@3.2.5 & add bundling & code-splitting (#393)

Co-authored-by: okdistribute <633012+okdistribute@users.noreply.github.com>

* New Report Generator (#303)

Co-authored-by: Gregor MacLennan <gmaclennan@digital-democracy.org>

* chore: package-lock

* chore(release): 5.4.0-beta.6

* fix: Ensure global OsmServerHost is always set

* fix: Mapeo should always open. Removes png editing for now.

* chore(lint): remove unused dependencies

* Update PULL_REQUEST_TEMPLATE.md

* chore: update translations

* chore(release): 5.4.0-beta.7

* fix: Cleanup report code

- Show toolbar during load
- Create ReportContentComponent -> allows memoizing PDFReport
- More robust loading code (patch for @react-pdf see
    diegomura/react-pdf#995)

* chore: gitignore generated worker files

* fix: Fix print button (still downloads, does not print)

PrintButton was using `this.url` instead of `this.props.url`.
However also removed some unnecessary code in this component

* fix: Fix map size (make square)

* fix: Render portrait images correctly and fix image width

* fix: Pull MAPBOX_ACCESS_TOKEN from a static location for both front
& backend

* feat: Add marker to map (first rough attempt)

* fix: make some progress on flow and types, not fixing all things but
many

* feat(staticMaps): Add concurrency and caching to speed up static maps

NB: Caching will not be noticable in dev, because currently npm start
and npm run dev will turn off http caching, but have tested this works
when http caching is enabled.

* feat(staticMaps): Support style and accessToken as URL query params

* feat(Reports): Use user defined map style for report maps

* fix(ReportMap): Add border around photos and simplify CSS

* fix(ReportDetails): Only show "Details" header when there are fields

* chore(lint)

* fix: translate report headers

* chore: translations

* fix: only display the first 5 character of the project secret key (#419)

* fix: only display the first 5 character of the project secret key

The rest is masked as "*"

* trigger GitHub actions

* fixed length mask to avoid potential UI scaling issues

* feat: display additional metadata in SyncFooter

* feat: show 'MAPEO' when there's no encryption key

* Add desktop architecture diagram

* chore(test): add proper mocks to storybook

* fix: Cleanup report code

- Show toolbar during load
- Create ReportContentComponent -> allows memoizing PDFReport
- More robust loading code (patch for @react-pdf see
    diegomura/react-pdf#995)

* chore: gitignore generated worker files

* fix: Fix print button (still downloads, does not print)

PrintButton was using `this.url` instead of `this.props.url`.
However also removed some unnecessary code in this component

* fix: Fix map size (make square)

* fix: Render portrait images correctly and fix image width

* fix: Pull MAPBOX_ACCESS_TOKEN from a static location for both front
& backend

* feat: Add marker to map (first rough attempt)

* fix: make some progress on flow and types, not fixing all things but
many

* feat(staticMaps): Add concurrency and caching to speed up static maps

NB: Caching will not be noticable in dev, because currently npm start
and npm run dev will turn off http caching, but have tested this works
when http caching is enabled.

* feat(staticMaps): Support style and accessToken as URL query params

* feat(Reports): Use user defined map style for report maps

* fix(ReportMap): Add border around photos and simplify CSS

* fix(ReportDetails): Only show "Details" header when there are fields

* chore(lint)

* fix: translate report headers

* chore: translations

* Update README.md

* fix: Ensure any stale processes are cleaned up before starting ipc workers

* fix: Save PDF now prints all observations

* fix: Refactor Save PDF to include typed options & fix flow

* chore(flow): Ensure datefilter value is defined when accessed

* fix: Styling of loading dialog & Add date/time report name

* fix: Map printer should work on the current offline style

* chore: Update desktop architecture documentation

* fix: write correct pid file

* chore: lint

* fix: Ensure mapeo always closes and show closing window while processes
are being destroyed. Fixes #398

* fix: wrap win/splash.close in try/catch as electron can throw

* fix: Show Single & Multi-select fields in Report View

* chore: Cleanup unused files

* chore(test): add proper mocks to storybook (#422)

* chore: move flow types into mapeo-schema (#420)

* fix: Bugs in menu

* Update QA.md

* fix: config now included in bundle

* fix: If subprocess failed with fatal error, it should not prevent Mapeo from closing.

* fix: Ensure process is always closed properly and mapeo can reopen easily in dev mode

* fix: Updater should not throw visible error when offline

* fix: standard

* fix: Sometimes Mapeo would continue running if Splash was closed before window finished loading

* fix: Leave port & map printer port control to Electron main process

* fix: if Mapeo fails to close gracefully, kill the process

* fix: Map printer will close when electron window closes it, no need to
wait for graceful close

* fix: cleanup debug messaging on killing node proc

* fix: ensure background code gets included in bundle

* fix: refactor node-ipc main process listeners

* fix: remember debugging settings on rotate and mapeo start

* fix: Splash screen would pause for a second with black background before starting animation

* chore(flow): update to latest mapeo-schema

* chore(deps): remove react-mapfilter, update package-lock.json

* fix: Use mapeo.ipc directly

* chore: Add debugger statements for errors when using menu

* chore: lint

* chore(flow): fix flow types

* fix: dont start heavier processes until splash screen is loaded

* fix: Multiselect fields with commas were not displaying correctly in Territory view

* chore(release): 5.4.0-beta.8

* fix: Prevent a bug that caused MapEditor to crash if you have no nodes after a sync.

* chore(release): 5.4.0-beta.9

* chore: Update CHANGELOG.md

* fix: Fix pdf report image wrapping (#436)

* fix: Extract English language messages for CrowdIn

* fix: Add separators in Help menu

* fix: Fallback to exporting preview-sized images if originals are missing (#437)

Co-authored-by: Karissa McKelvey <633012+okdistribute@users.noreply.github.com>

* Fix: Display error to user when it is a fatal mapeo core error (#439)

* New Crowdin updates (#388)

Co-authored-by: Karissa McKelvey <633012+okdistribute@users.noreply.github.com>

* chore: Add error log messages

* chore: Improve onboarding documentation for new devs.

* fix: Add Vietnamese, Thai, and Khmer to available languages.

* fix: Remove duplicate styling for updater loading progress.

* chore(release): 5.4.0-beta.10

* chore: lint

* chore: Add Thai translations for menus and main process strings (#445)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Khmer)

* New translations en.json (Thai)

* New translations en.json (Burmese)

* New translations en.json (Lao)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Spanish)

* chore: Remove untranslated strings (#450)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Khmer)

* New translations en.json (Thai)

* New translations en.json (Burmese)

* New translations en.json (Lao)

* New translations en.json (Thai)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Khmer)

* New translations en.json (Burmese)

* New translations en.json (Lao)

* feat: Add Thai translations (#451)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Thai)

* fix: Ensure that fallback presets do not break iD Editor

iD Editor requires that presets `point`, `area`, `line`, `relation` are
always defined. The user can override these via mapeo config to give
them custom names and fields, however the user could also accidentally
set the `tags` and `geometry` properties on these presets to something
that breaks iD. This fix ensures that these "special" presets always
have the correct tags so that iD does not break.

* fix(MapExportDialog): fix React controlled/uncontrolled state warning (#459)

* fix: PDF reports (#456)

* chore(PDFReport): Code formatting

* feat(Reports): Fit images within a square

Allows easier calculation of pages prior to layout of images

* chore(Reports): Refactor PDF Report component

Avoid pass-through of props to components nested in components

* Allow navigation through entire report

* tweak CSS to show report paper outline clearly

* Smooth loading state transitions

* Cache and eagerly render PDF pages, and support initial page > 1

Support starting the report preview at a page > 1, which requires
previous pages to be rendered first in order to establish which
observation should appear on the current page. Also adds caching of
observation PDFs (each observation is rendered to its own PDF during
preview) and eagerly rendering the next observation, to reduce delay.

* chore: tidy up

* Add initialPageNumber option and add stories

* Add current page number

* chore: Small type fixes

* chore: Rename and add code comments

* fix: Queue PDF renders to use the same react-pdf instance

Previous code was causing React warnings of re-using the same context in
multiple renderers, because we created a new renderer instance for each
PDF preview doc (one for each observation). This changes the code to re-
use the same renderer, and update it with the doc for each page. It
should also be faster, since it's updating existing nodes rather than
re-creating the react tree.

* fix bug where loop could continue to infinity

* add missing dep to useEffect

* Update intl messages

* commit case change to git

* Add save button

* Add support for intl characters in PDF report

* fix webpack config to load fonts

* Add new design page navigator

* Format report toolbar and add x out of y observations count

* chore: fix types

* fix page navigator so that buttons are equally sized

* fix toolbar so that text is centered to page

* remove bottom border radius on page navigator

* 🎉 New report design & layout

* remove eager rendering (premature optimization, and caused problems)

* 🚀 page numbers in footer

* Fix re-render of PDF after cancelling edit of observation

* chore: Catch errors in PDF render and report them

* fix: Reset to page 1 when the user is on an invalid page

* chore: Change startPage to actually mean statePage (not zero-based idx)

* Turn eager rendering back on

* chore: Unused var

* Add storybook for observation with no location

* chore: Add types

* 🥳 Add icons to observations in report

* fix: patch hidden-mapbox so it does not hang

* fix: timeout PDF render

* fix: Cache category icon

* fix: Don't cache failed preview renders

* fix: pageIndex can end up with `null` values sometimes (not sure how!)

* fix: If preview is cancelled then bail

This can happen if the user changes the filter whilst the preview is
still loading. If the filter has changed, then we want to cancel async
functions that started with the previous filter

* fix: Catch infinite loop in preview

* feat: Use same map marker for observation as mapeo mobile

* fix: Fix patch to static map renderer

* fix: Only show fields with answers in report

* chore: Add Story for testing long preset names

* Add disabled state styling to page navigation buttons

* fix: Use new instance of ract-pdf for each render

Using the same renderer instance and updating the container was causing
race conditions, and does not seem to change performance much.

* chore: Use forked react-pdf/renderer

Changes babel preset-env to reduce polyfills and transpilation

* chore: Remove hidden-mapbox patch

* chore(release): 5.4.0-beta.11

* fix: Fix errors from Wifi Status display and disable on MacOS (#470)

Fixes #469

* fix: Fix "zoom to data": include deletions & correct density calc (#475)

* fix: Fix "zoom to data": include deletions and correct density calc

* fix: In territory view, zoom to data also considers observations

* chore: Update node version in Github Action

* feat: Update iD Editor background imagery (fix mapbox satellite) (#477)

Fixes #476

* fix: Fix crash when trying to resize sidebar (#478)

* fix: Fix crash when trying to resize sidebar

Fixes #473

* fix: Add button to un-collapse sidebar if collapsed

* fix: Fix Mapeo window randomly not opening at startup (#465)

* chore: Add incremental Typescript checking

Add // @ts-check to the top of files in src/background
and src/main to check JS files with JSDoc hints

* Refactor app startup code & background processes

* Manage background processes together, and time async startup actions

* Read backend state in main window

* Startup sequence in parallel

* remove console.log

* Fix startup sequence

* Fix background state updates (emit after state is updated)

* Update to latest electron@9

* Fix ipc message validation

* Fix settings extraction

* Wait for first render before showing main window

* Improve logging

* fixes for breaking mkdirp change

* add note about React devtools

* fix lint error

* chore(tsconfig): fix typo

* fix packaging config

* fix: Fix errors from Wifi Status display and disable on MacOS

Fixes #469

* fix: Package default config with app, rather than extracting at runtime

* fix: Fix IPC messaging with main process - call port.start()

* fix: Fix "zoom to data": include deletions and correct density calc

* fix: Fix crash when syncing by removing non-transferable objects from IPC

* Add message error handlers to IPC

* fix: Fix reload of Mapeo when config changes

* chore: update ecstatic & dedupe

* Fix package-lock

* Catch errors on startup

* Extend background process start timeout

* throw error if starting background process fails

* Pass through error events from background processes

* Cleanup subscriptions

* Clear closing timeout

Co-authored-by: Kira Oakley <kira@eight45.net>

* chore: Fix storybook

* fix: Don't allow observation location to be changed in territory view

Fixes #479

* chore: Remove unused files

* feat: Add Khmer, Dutch & French translations, fix th,pt,vi (#460)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Spanish)

* New translations en.json (Vietnamese)

* New translations en.json (Thai)

* New translations en.json (Dutch)

* New translations en.json (Dutch)

* New translations en.json (Sranan Tongo)

* New translations en.json (Sranan Tongo)

* New translations en.json (French)

* New translations en.json (French)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Thai)

* New translations en.json (Khmer)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Khmer)

* New translations en.json (Khmer)

* New translations en.json (Dutch)

* New translations en.json (Dutch)

* New translations en.json (Dutch)

Co-authored-by: Gregor MacLennan <gmaclennan@digital-democracy.org>

* fix: Fix npm ci failure in Github actions by retrying until it works

* chore: update to react-pdf latest (#484)

* chore: Update to @react-pdf/renderer@2.0.15

* Fix layout changes in react-pdf@2

* Fix: Move PDF reports to a web worker (#482)

* WIP: Move PDF reports to a web worker

* uri-templates

* Testing pdf in worker

* Fix inset maps and preset icons

* Fix: Show observation ID in mono-spaced font

* fix: Update import/export labels for territory data (#486)

* Update import data menu item label

* update territory export button label

* New translations en.json (Khmer)

* New translations en.json (Thai)

* New translations en.json (Thai)

* New translations en.json (Khmer)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Vietnamese)

* New translations en.json (Vietnamese)

* New translations en.json (Dutch)

* New translations en.json (Dutch)

* New translations en.json (Spanish)

* New translations en.json (Spanish)

* New translations en.json (French)

* New translations en.json (Spanish)

* New translations en.json (Dutch)

* New translations en.json (Vietnamese)

* New translations en.json (Portuguese, Brazilian)

* New translations en.json (Khmer)

* New translations en.json (Thai)

* New translations en.json (Portuguese, Brazilian)

Co-authored-by: Karissa McKelvey <633012+okdistribute@users.noreply.github.com>
Co-authored-by: okdistribute <karissa@noreply.github.com>
Co-authored-by: Gregor MacLennan <gmaclennan@digital-democracy.org>
Co-authored-by: Poga Po <poga.po@gmail.com>
Co-authored-by: Lou Huang <lou@louhuang.com>
Co-authored-by: Kira Oakley <kira@eight45.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants