[Refactor] decouple settingsMachine from React (#5142)
* Remove unnecessary console.log
* Create a global appMachine
* Strip authMachine of side-effects
* Replace react-bound authMachine use with XState actor use
* Fix import goof
* Register auth commands directly!
* Don't provide anything to settingsMachine from React
* Remove unecessary async
* Make it possible to load project settings via a sent event, without React
* Make settingsMachine ready to be an actor
* Remove settingsLoader use
* Replace all useSettingsAuthContext use with direct actor use
* Add logic to clear project settings, fmt
* fmt
* Clear and load project settings from routeLoaders, but using actor
* Remove useRefreshSettings
* Restore use of useToken() that wasn't working for some reason
* Migrate useFileSystemWatcher use to RouteProvider
* Surface wasm_bindgen unavailable error to console
* Remove unnecessary use of Jest settings wrappers
* Replace dynamic import with actor.getSnapshot
* Migrate system theme and theme color watching from useEffects to actors/actions
* Migrate cursor color effect
* Remove unused code that is now in RouteProvider
* Migrate route commands registration further down for now, out of SettingsAuthProvider
* Migrate settings command registration out of SettingsAuthProvider.tsx
* Delete SettingsAuthProvider.tsx!
* Remove unused settingsLoader!
* fmt and remove comments
* Use actor for routeLoader
* Fix project read error due to uninitialized WASM
* Fix user settings load error due to uninitialized WASM
* Move settingsActor into appActor as a spawned child
* Trying to fix unit tests
* Remove unused imports and demo window attachments
* fmt
* Fix testing issues caused by circular dependency
* Add `setThemeColor` to a few actions list it was missing from
* fmt
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* Fix "Execute AST" action in browser, where currentProject is `undefined`
* Update commands list when currentProject changes
* Fix `clearProjectSettings`, which was passing along non-settings context
* Fix onboarding test that actually needed the onboarding initially dismissed
* Add scrollIntoView to make this test more reliable
* @lf94's feedback I missed
I got distracted by a million other things last week
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* Revert "A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)"
This reverts commit 129226c6ef
.
* fmt
* revert bad snapshot
* Fix up camera movement test locator
* Fix test that was flipping the user settings without waiting
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This commit is contained in:
@ -7,20 +7,23 @@ import {
|
||||
SettingsPaths,
|
||||
SettingsLevel,
|
||||
SettingProps,
|
||||
SetEventTypes,
|
||||
} from 'lib/settings/settingsTypes'
|
||||
import { settingsMachine } from 'machines/settingsMachine'
|
||||
import { PathValue } from 'lib/types'
|
||||
import { Actor, AnyStateMachine, ContextFrom } from 'xstate'
|
||||
import { ActorRefFrom, AnyStateMachine } from 'xstate'
|
||||
import { getPropertyByPath } from 'lib/objectPropertyByPath'
|
||||
import { buildCommandArgument } from 'lib/createMachineCommand'
|
||||
import decamelize from 'decamelize'
|
||||
import { isDesktop } from 'lib/isDesktop'
|
||||
import { Setting } from 'lib/settings/initialSettings'
|
||||
import {
|
||||
createSettings,
|
||||
Setting,
|
||||
SettingsType,
|
||||
} from 'lib/settings/initialSettings'
|
||||
|
||||
// An array of the paths to all of the settings that have commandConfigs
|
||||
export const settingsWithCommandConfigs = (
|
||||
s: ContextFrom<typeof settingsMachine>
|
||||
) =>
|
||||
export const settingsWithCommandConfigs = (s: SettingsType) =>
|
||||
Object.entries(s).flatMap(([categoryName, categorySettings]) =>
|
||||
Object.entries(categorySettings)
|
||||
.filter(([_, setting]) => setting.commandConfig !== undefined)
|
||||
@ -28,7 +31,7 @@ export const settingsWithCommandConfigs = (
|
||||
) as SettingsPaths[]
|
||||
|
||||
const levelArgConfig = <T extends AnyStateMachine = AnyStateMachine>(
|
||||
actor: Actor<T>,
|
||||
actor: ActorRefFrom<T>,
|
||||
isProjectAvailable: boolean,
|
||||
hideOnLevel?: SettingsLevel
|
||||
): CommandArgument<SettingsLevel, T> => ({
|
||||
@ -53,23 +56,16 @@ const levelArgConfig = <T extends AnyStateMachine = AnyStateMachine>(
|
||||
|
||||
interface CreateSettingsArgs {
|
||||
type: SettingsPaths
|
||||
send: Function
|
||||
context: ContextFrom<typeof settingsMachine>
|
||||
actor: Actor<typeof settingsMachine>
|
||||
isProjectAvailable: boolean
|
||||
actor: ActorRefFrom<typeof settingsMachine>
|
||||
}
|
||||
|
||||
// Takes a Setting with a commandConfig and creates a Command
|
||||
// that can be used in the CommandBar component.
|
||||
export function createSettingsCommand({
|
||||
type,
|
||||
send,
|
||||
context,
|
||||
actor,
|
||||
isProjectAvailable,
|
||||
}: CreateSettingsArgs) {
|
||||
type S = PathValue<typeof context, typeof type>
|
||||
export function createSettingsCommand({ type, actor }: CreateSettingsArgs) {
|
||||
type S = PathValue<ReturnType<typeof createSettings>, typeof type>
|
||||
|
||||
const context = actor.getSnapshot().context
|
||||
const isProjectAvailable = context.currentProject !== undefined
|
||||
const settingConfig = getPropertyByPath(context, type) as SettingProps<
|
||||
S['default']
|
||||
>
|
||||
@ -129,10 +125,18 @@ export function createSettingsCommand({
|
||||
icon: 'settings',
|
||||
needsReview: false,
|
||||
onSubmit: (data) => {
|
||||
if (data !== undefined && data !== null) {
|
||||
send({ type: `set.${type}`, data })
|
||||
if (
|
||||
data !== undefined &&
|
||||
data !== null &&
|
||||
'value' in data &&
|
||||
'level' in data
|
||||
) {
|
||||
// TS would not let me get this to type properly
|
||||
const coercedData = data as unknown as SetEventTypes['data']
|
||||
actor.send({ type: `set.${type}`, data: coercedData })
|
||||
} else {
|
||||
send({ type })
|
||||
console.error('Invalid data submitted to settings command', data)
|
||||
return new Error('Invalid data submitted to settings command', data)
|
||||
}
|
||||
},
|
||||
args: {
|
||||
|
Reference in New Issue
Block a user