2023-08-28 20:31:49 -04:00
|
|
|
import { assign, createMachine } from 'xstate'
|
|
|
|
import { BaseUnit, baseUnitsUnion } from '../useStore'
|
|
|
|
import { CommandBarMeta } from '../lib/commands'
|
2023-08-31 09:34:13 -04:00
|
|
|
import { Themes, getSystemTheme, setThemeClass } from '../lib/theme'
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2023-08-31 16:08:15 -04:00
|
|
|
export enum UnitSystem {
|
|
|
|
Imperial = 'imperial',
|
|
|
|
Metric = 'metric',
|
|
|
|
}
|
|
|
|
|
2023-08-28 20:31:49 -04:00
|
|
|
export const SETTINGS_PERSIST_KEY = 'SETTINGS_PERSIST_KEY'
|
|
|
|
|
|
|
|
export const settingsCommandBarMeta: CommandBarMeta = {
|
|
|
|
'Set Theme': {
|
|
|
|
displayValue: (args: string[]) => 'Change the app theme',
|
|
|
|
args: [
|
|
|
|
{
|
|
|
|
name: 'theme',
|
|
|
|
type: 'select',
|
|
|
|
defaultValue: 'theme',
|
|
|
|
options: Object.values(Themes).map((v) => ({ name: v })) as {
|
|
|
|
name: string
|
|
|
|
}[],
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
'Set Default Project Name': {
|
|
|
|
displayValue: (args: string[]) => 'Set a new default project name',
|
|
|
|
hide: 'web',
|
|
|
|
args: [
|
|
|
|
{
|
|
|
|
name: 'defaultProjectName',
|
|
|
|
type: 'string',
|
|
|
|
description: '(default)',
|
|
|
|
defaultValue: 'defaultProjectName',
|
|
|
|
options: 'defaultProjectName',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
'Set Default Directory': {
|
|
|
|
hide: 'both',
|
|
|
|
},
|
|
|
|
'Set Unit System': {
|
|
|
|
displayValue: (args: string[]) => 'Set your default unit system',
|
|
|
|
args: [
|
|
|
|
{
|
|
|
|
name: 'unitSystem',
|
|
|
|
type: 'select',
|
|
|
|
defaultValue: 'unitSystem',
|
2023-08-31 16:08:15 -04:00
|
|
|
options: [{ name: UnitSystem.Imperial }, { name: UnitSystem.Metric }],
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
'Set Base Unit': {
|
|
|
|
displayValue: (args: string[]) => 'Set your default base unit',
|
|
|
|
args: [
|
|
|
|
{
|
|
|
|
name: 'baseUnit',
|
|
|
|
type: 'select',
|
|
|
|
defaultValue: 'baseUnit',
|
|
|
|
options: Object.values(baseUnitsUnion).map((v) => ({ name: v })),
|
|
|
|
},
|
|
|
|
],
|
|
|
|
},
|
|
|
|
'Set Onboarding Status': {
|
|
|
|
hide: 'both',
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
export const settingsMachine = createMachine(
|
|
|
|
{
|
|
|
|
/** @xstate-layout N4IgpgJg5mDOIC5QGUwBc0EsB2VYDpMIAbMAYlTQAIAVACzAFswBtABgF1FQAHAe1iYsfbNxAAPRAA42+AEwB2KQFYAzGznKAnADZli1QBoQAT2kBGKfm37lOned3nzqgL6vjlLLgJFSFdCoAETAAMwBDAFdiagAFACc+ACswAGNqADlw5nYuJBB+QWFRfMkEABY5fDYa2rra83LjMwQdLWV8BXLyuxlVLU1Ld090bzxCEnJKYLComODMeLS0PniTXLFCoUwRMTK7fC1zNql7NgUjtnKjU0RlBSqpLVUVPVUda60tYZAvHHG-FNAgBVbBCKjIEywNBMDb5LbFPaILqdfRSORsS4qcxXZqIHqyK6qY4XOxsGTKco-P4+Cb+aYAIXCsDAVFBQjhvAE212pWkskUKnUml0+gUNxaqkU+EccnKF1UCnucnMcjcHl+o3+vkmZBofCgUFIMwARpEoFRYuFsGBiJyCtzEXzWrJlGxlKdVFKvfY1XiEBjyvhVOVzBdzu13pYFNStbTAQFqAB5bAmvjheIQf4QtDhNCRWD2hE7EqgfayHTEh7lHQNSxSf1Scz4cpHHFyFVujTKczuDXYPgQOBiGl4TaOktIhAAWg6X3nC4Xp39050sYw2rpYHHRUnztVhPJqmUlIGbEriv9WhrLZ6uibHcqUr7riAA */
|
|
|
|
id: 'Settings',
|
|
|
|
predictableActionArguments: true,
|
|
|
|
context: {
|
|
|
|
theme: Themes.System,
|
|
|
|
defaultProjectName: '',
|
2023-08-31 16:08:15 -04:00
|
|
|
unitSystem: UnitSystem.Imperial,
|
2023-08-28 20:31:49 -04:00
|
|
|
baseUnit: 'in' as BaseUnit,
|
|
|
|
defaultDirectory: '',
|
|
|
|
showDebugPanel: false,
|
|
|
|
onboardingStatus: '',
|
|
|
|
},
|
|
|
|
initial: 'idle',
|
|
|
|
states: {
|
|
|
|
idle: {
|
2023-08-31 09:34:13 -04:00
|
|
|
entry: ['setThemeClass'],
|
2023-08-28 20:31:49 -04:00
|
|
|
on: {
|
|
|
|
'Set Theme': {
|
|
|
|
actions: [
|
|
|
|
assign({
|
|
|
|
theme: (_, event) => event.data.theme,
|
|
|
|
}),
|
|
|
|
'persistSettings',
|
|
|
|
'toastSuccess',
|
2023-08-31 09:34:13 -04:00
|
|
|
'setThemeClass',
|
2023-08-28 20:31:49 -04:00
|
|
|
],
|
|
|
|
target: 'idle',
|
|
|
|
internal: true,
|
|
|
|
},
|
|
|
|
'Set Default Project Name': {
|
|
|
|
actions: [
|
|
|
|
assign({
|
|
|
|
defaultProjectName: (_, event) => event.data.defaultProjectName,
|
|
|
|
}),
|
|
|
|
'persistSettings',
|
|
|
|
'toastSuccess',
|
|
|
|
],
|
|
|
|
target: 'idle',
|
|
|
|
internal: true,
|
|
|
|
},
|
|
|
|
'Set Default Directory': {
|
|
|
|
actions: [
|
|
|
|
assign({
|
|
|
|
defaultDirectory: (_, event) => event.data.defaultDirectory,
|
|
|
|
}),
|
|
|
|
'persistSettings',
|
|
|
|
'toastSuccess',
|
|
|
|
],
|
|
|
|
target: 'idle',
|
|
|
|
internal: true,
|
|
|
|
},
|
|
|
|
'Set Unit System': {
|
|
|
|
actions: [
|
|
|
|
assign({
|
|
|
|
unitSystem: (_, event) => event.data.unitSystem,
|
|
|
|
baseUnit: (_, event) =>
|
|
|
|
event.data.unitSystem === 'imperial' ? 'in' : 'mm',
|
|
|
|
}),
|
|
|
|
'persistSettings',
|
|
|
|
'toastSuccess',
|
|
|
|
],
|
|
|
|
target: 'idle',
|
|
|
|
internal: true,
|
|
|
|
},
|
|
|
|
'Set Base Unit': {
|
|
|
|
actions: [
|
|
|
|
assign({ baseUnit: (_, event) => event.data.baseUnit }),
|
|
|
|
'persistSettings',
|
|
|
|
'toastSuccess',
|
|
|
|
],
|
|
|
|
target: 'idle',
|
|
|
|
internal: true,
|
|
|
|
},
|
|
|
|
'Toggle Debug Panel': {
|
|
|
|
actions: [
|
|
|
|
assign({
|
|
|
|
showDebugPanel: (context) => {
|
|
|
|
return !context.showDebugPanel
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
'persistSettings',
|
|
|
|
'toastSuccess',
|
|
|
|
],
|
|
|
|
target: 'idle',
|
|
|
|
internal: true,
|
|
|
|
},
|
|
|
|
'Set Onboarding Status': {
|
|
|
|
actions: [
|
|
|
|
assign({
|
|
|
|
onboardingStatus: (_, event) => event.data.onboardingStatus,
|
|
|
|
}),
|
|
|
|
'persistSettings',
|
|
|
|
],
|
|
|
|
target: 'idle',
|
|
|
|
internal: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
tsTypes: {} as import('./settingsMachine.typegen').Typegen0,
|
|
|
|
schema: {
|
|
|
|
events: {} as
|
|
|
|
| { type: 'Set Theme'; data: { theme: Themes } }
|
|
|
|
| {
|
|
|
|
type: 'Set Default Project Name'
|
|
|
|
data: { defaultProjectName: string }
|
|
|
|
}
|
|
|
|
| { type: 'Set Default Directory'; data: { defaultDirectory: string } }
|
|
|
|
| {
|
|
|
|
type: 'Set Unit System'
|
2023-08-31 16:08:15 -04:00
|
|
|
data: { unitSystem: UnitSystem }
|
2023-08-28 20:31:49 -04:00
|
|
|
}
|
|
|
|
| { type: 'Set Base Unit'; data: { baseUnit: BaseUnit } }
|
|
|
|
| { type: 'Set Onboarding Status'; data: { onboardingStatus: string } }
|
|
|
|
| { type: 'Toggle Debug Panel' },
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
actions: {
|
|
|
|
persistSettings: (context) => {
|
|
|
|
try {
|
|
|
|
localStorage.setItem(SETTINGS_PERSIST_KEY, JSON.stringify(context))
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e)
|
|
|
|
}
|
|
|
|
},
|
2023-08-31 09:34:13 -04:00
|
|
|
setThemeClass: (context, event) => {
|
|
|
|
const currentTheme =
|
|
|
|
event.type === 'Set Theme' ? event.data.theme : context.theme
|
|
|
|
setThemeClass(
|
|
|
|
currentTheme === Themes.System ? getSystemTheme() : currentTheme
|
|
|
|
)
|
|
|
|
},
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
|
|
|
}
|
|
|
|
)
|