* Rename GlobalStateContext to SettingsAuthContext * Naive initial impl of settings persistence to file system * Update app identifier in tauri config * Add "show in folder" tauri command * Load from and save to file system in Tauri app * Add documents drive to tauri permission scope * Add recursive prop to default dir selection dialog * Add success toast to web restore defaults action * Add a way to validate read-in settings * Update imports to use separate settings lib file * Validate localStorage-loaded settings, combine error message * Add a e2e test for validation * Clean up state state bugs * Reverse validation looping so new users don't error * update settingsMachine typegen to remove conflicts * Fmt * Fix TS errors * Fix import paths, etc post-merge * Make default length units `mm` and 'metric' * Rename to SettingsAuth* * cargo fmt * Revert Tauri config identifier change * Update clientSideInfra's baseUnits from settings * Break apart CommandBar and CommandBarProvider * Bugfix: don't validate defaultValue when it's not configured * Allow some TauriFS functions to no-op from browser * Sidestep circular deps by loading context and kclManager only from React-land * Update broken import paths * Separate loaders from Router, load settings on every route * Break apart settings types, utils, and constants * Fix Jest tests by decoupling reliance on useLoaderData from SettingsAuthProvider * Fix up Router loader data with "layout routes" https://reactrouter.com/en/main/route/route#layout-routes * Move settings validation and toast to custom hook so the toast renders * fmt * Use forks for Vitest https://vitest.dev/guide/common-errors.html#failed-to-terminate-worker * $APPCONFIG !== $APPDATA only on Linux + change the identifier back since it really doesn't seem to affect app signing * Debugging on Linux * Better directory validation, fix reset settings button * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * defaultDirectory can be empty in browser * fmt * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu) * re-trigger CI --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
34 lines
1.2 KiB
TypeScript
34 lines
1.2 KiB
TypeScript
import { validateSettings } from 'lib/settings/settingsUtils'
|
|
import { useEffect } from 'react'
|
|
import toast from 'react-hot-toast'
|
|
import { useRouteLoaderData } from 'react-router-dom'
|
|
import { useSettingsAuthContext } from './useSettingsAuthContext'
|
|
import { paths } from 'lib/paths'
|
|
|
|
// This hook must only be used within a descendant of the SettingsAuthProvider component
|
|
// (and, by extension, the Router component).
|
|
// Specifically it relies on the Router's indexLoader data and the settingsMachine send function.
|
|
// for the settings and validation errors to be available.
|
|
export function useValidateSettings() {
|
|
const {
|
|
settings: { send },
|
|
} = useSettingsAuthContext()
|
|
const { settings, errors } = useRouteLoaderData(paths.INDEX) as Awaited<
|
|
ReturnType<typeof validateSettings>
|
|
>
|
|
|
|
// If there were validation errors either from local storage or from the file,
|
|
// log them to the console and show a toast message to the user.
|
|
useEffect(() => {
|
|
if (errors.length > 0) {
|
|
send('Set All Settings', settings)
|
|
const errorMessage =
|
|
'Error validating persisted settings: ' +
|
|
errors.join(', ') +
|
|
'. Using defaults.'
|
|
console.error(errorMessage)
|
|
toast.error(errorMessage)
|
|
}
|
|
}, [errors])
|
|
}
|