2024-09-09 19:59:36 +03:00
|
|
|
import { assign, fromPromise, setup } from 'xstate'
|
2024-10-28 16:18:06 -04:00
|
|
|
import { ProjectsCommandSchema } from 'lib/commandBarConfigs/projectsCommandConfig'
|
2024-08-24 17:47:09 -07:00
|
|
|
import { Project } from 'lib/project'
|
2024-10-28 16:18:06 -04:00
|
|
|
import { isArray } from 'lib/utils'
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-10-28 16:18:06 -04:00
|
|
|
export const projectsMachine = setup({
|
2024-09-09 19:59:36 +03:00
|
|
|
types: {
|
|
|
|
context: {} as {
|
|
|
|
projects: Project[]
|
|
|
|
defaultProjectName: string
|
|
|
|
defaultDirectory: string
|
|
|
|
},
|
|
|
|
events: {} as
|
2024-10-03 13:02:57 -04:00
|
|
|
| { type: 'Read projects'; data: {} }
|
2024-10-28 16:18:06 -04:00
|
|
|
| { type: 'Open project'; data: ProjectsCommandSchema['Open project'] }
|
|
|
|
| {
|
|
|
|
type: 'Rename project'
|
|
|
|
data: ProjectsCommandSchema['Rename project']
|
|
|
|
}
|
|
|
|
| {
|
|
|
|
type: 'Create project'
|
|
|
|
data: ProjectsCommandSchema['Create project']
|
|
|
|
}
|
|
|
|
| {
|
|
|
|
type: 'Delete project'
|
|
|
|
data: ProjectsCommandSchema['Delete project']
|
|
|
|
}
|
2024-09-09 19:59:36 +03:00
|
|
|
| { type: 'navigate'; data: { name: string } }
|
|
|
|
| {
|
|
|
|
type: 'xstate.done.actor.read-projects'
|
|
|
|
output: Project[]
|
|
|
|
}
|
2024-10-28 16:18:06 -04:00
|
|
|
| {
|
|
|
|
type: 'xstate.done.actor.delete-project'
|
|
|
|
output: { message: string; name: string }
|
|
|
|
}
|
|
|
|
| {
|
|
|
|
type: 'xstate.done.actor.create-project'
|
|
|
|
output: { message: string; name: string }
|
|
|
|
}
|
|
|
|
| {
|
|
|
|
type: 'xstate.done.actor.rename-project'
|
|
|
|
output: { message: string; oldName: string; newName: string }
|
|
|
|
}
|
2024-09-09 19:59:36 +03:00
|
|
|
| { type: 'assign'; data: { [key: string]: any } },
|
|
|
|
input: {} as {
|
|
|
|
projects: Project[]
|
|
|
|
defaultProjectName: string
|
|
|
|
defaultDirectory: string
|
|
|
|
},
|
|
|
|
},
|
|
|
|
actions: {
|
|
|
|
setProjects: assign({
|
|
|
|
projects: ({ context, event }) =>
|
2024-10-28 16:18:06 -04:00
|
|
|
'output' in event && isArray(event.output)
|
|
|
|
? event.output
|
|
|
|
: context.projects,
|
2024-09-09 19:59:36 +03:00
|
|
|
}),
|
|
|
|
toastSuccess: () => {},
|
|
|
|
toastError: () => {},
|
|
|
|
navigateToProject: () => {},
|
2024-10-28 16:18:06 -04:00
|
|
|
navigateToProjectIfNeeded: () => {},
|
2024-09-09 19:59:36 +03:00
|
|
|
},
|
|
|
|
actors: {
|
|
|
|
readProjects: fromPromise(() => Promise.resolve([] as Project[])),
|
2024-10-28 16:18:06 -04:00
|
|
|
createProject: fromPromise(
|
|
|
|
(_: { input: { name: string; projects: Project[] } }) =>
|
|
|
|
Promise.resolve({ message: '' })
|
2024-09-09 19:59:36 +03:00
|
|
|
),
|
|
|
|
renameProject: fromPromise(
|
|
|
|
(_: {
|
|
|
|
input: {
|
|
|
|
oldName: string
|
|
|
|
newName: string
|
|
|
|
defaultProjectName: string
|
|
|
|
defaultDirectory: string
|
2024-10-28 16:18:06 -04:00
|
|
|
projects: Project[]
|
2024-09-09 19:59:36 +03:00
|
|
|
}
|
2024-10-28 16:18:06 -04:00
|
|
|
}) =>
|
|
|
|
Promise.resolve({
|
|
|
|
message: '',
|
|
|
|
oldName: '',
|
|
|
|
newName: '',
|
|
|
|
})
|
2024-09-09 19:59:36 +03:00
|
|
|
),
|
|
|
|
deleteProject: fromPromise(
|
|
|
|
(_: { input: { defaultDirectory: string; name: string } }) =>
|
2024-10-28 16:18:06 -04:00
|
|
|
Promise.resolve({
|
|
|
|
message: '',
|
|
|
|
name: '',
|
|
|
|
})
|
2024-09-09 19:59:36 +03:00
|
|
|
),
|
|
|
|
},
|
|
|
|
guards: {
|
|
|
|
'Has at least 1 project': () => false,
|
|
|
|
},
|
|
|
|
}).createMachine({
|
2024-10-28 16:18:06 -04:00
|
|
|
/** @xstate-layout N4IgpgJg5mDOIC5QAkD2BbMACdBDAxgBYCWAdmAMS6yzFSkDaADALqKgAOqtALsaqXYgAHogAsAJgA0IAJ6IAjBIkA2AHQAOCUw0qNkjQE4xYjQF8zMtJhwES5NcmpZSqLBwBOqAFZh8PWAoAJTBcCHcvX39YZjYkEC5efkF40QQFFQBmAHY1Qwz9QwBWU0NMrRl5BGyxBTUVJlVM01rtBXNLEGtsPCIyMEdnVwifPwCKAGEPUJ5sT1H-WKFE4j4BITSMzMzNIsyJDSZMhSYmFWzKxAkTNSYxIuU9zOKT7IsrDB67fsHYEajxiEwv8xjFWMtuKtkhsrpJboZsioincFMdTIjLggVGJ1GImMVMg0JISjEV3l1PrY+g4nH95gDAiFSLgbPSxkt4is1ilQGlrhJ4YjkbU0RoMXJEIYkWoikV8hJinjdOdyd0qfYBrSQdFJtNcLNtTwOZxIdyYQh+YKkSjReKqqYBQoEQpsgiSi9MqrKb0Nb9DYEACJgAA2YANbMW4M5puhqVhAvxQptCnRKkxCleuw0Gm2+2aRVRXpsPp+Woj4wA8hwwKRDcaEjH1nGLXDE9aRSmxWmJVipWocmdsbL8kxC501SWHFMZmQoIaKBABAMyAA3VAAawG+D1swAtOX61zY7zENlEWoMkoatcdPoipjCWIZRIirozsPiYYi19qQNp-rZ3nMAPC8Dw1A4YN9QAM1QDx0DUbcZjAfdInZKMTSSJsT2qc9Lwka8lTvTFTB2WUMiyQwc3yPRv3VH4mRZQDywXJc1FXDcBmmZlMBQhYjXQhtMJ5ERT1wlQr0kQj7kxKiZTxM5s2zbQEVoycBgY9AmNQ-wKGA0DwMgngYLgtQuJZZCDwEo8sJEnD1Dwgjb2kntig0GUkWVfZDEMfFVO+Bwg1DPhSDnZjFwcdjNzUCAQzDCztP4uIMKhGy0jPezxPwySnPvHsTjlPIhyOHRsnwlM-N-NRArDLS+N0kDYIM6DYPgmKgvivjD0bYS+VbBF21RTs7UUUcimfRpXyYRF8LFCrfSBCBaoZFiItINcor1CBeIZLqhPNdKL0yxzs2cqoNDqdpSo0EoSoLOb6NCRaQv9FblzWjjTMe7bQQYBQksElKesUMRjFubRMllCHsm2a5MVldRDBfFpmj0IpxPuhwFqW0F6v0iDmpMzbvuiXbAfNFNQcaI5IaKaH9jETFsUMNRVDxOU5TxBULE6VwYvgeIJ38sAIT25td27KpdzG7yZeho5slHVmMc1IY3HLfnkrNZt2hOW5smRCQM2uhQHkZ6VtkRBFnmu0qFGVv11ZFsnm0kdN8QFJVjlUPZ9co+3-2C0KEqdrXsJMJ8ryc86iUyYiCvxFNzldb3jHtjTsf8EPj1ssQchZlR8jR5EmDRrIGZcuF7maF1aZtslx29IWqtiwPDSz1LxDxepnlOfYDghp03eyOpngzXuYdHNPHozgJ26B9IXR2cTvP0BVkSRXKqgLtyq8OfQcXOwlubMIA */
|
2024-09-09 19:59:36 +03:00
|
|
|
id: 'Home machine',
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
initial: 'Reading projects',
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-10-28 16:18:06 -04:00
|
|
|
context: ({ input }) => ({
|
|
|
|
...input,
|
|
|
|
}),
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
on: {
|
|
|
|
assign: {
|
|
|
|
actions: assign(({ event }) => ({
|
|
|
|
...event.data,
|
|
|
|
})),
|
|
|
|
target: '.Reading projects',
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
},
|
|
|
|
states: {
|
|
|
|
'Has no projects': {
|
|
|
|
on: {
|
2024-10-03 13:02:57 -04:00
|
|
|
'Read projects': {
|
|
|
|
target: 'Reading projects',
|
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
'Create project': {
|
|
|
|
target: 'Creating project',
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
},
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
'Has projects': {
|
|
|
|
on: {
|
2024-10-03 13:02:57 -04:00
|
|
|
'Read projects': {
|
|
|
|
target: 'Reading projects',
|
|
|
|
},
|
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
'Rename project': {
|
|
|
|
target: 'Renaming project',
|
|
|
|
},
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
'Create project': {
|
|
|
|
target: 'Creating project',
|
|
|
|
},
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
'Delete project': {
|
|
|
|
target: 'Deleting project',
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
'Open project': {
|
2024-10-28 16:18:06 -04:00
|
|
|
target: 'Reading projects',
|
|
|
|
actions: 'navigateToProject',
|
|
|
|
reenter: true,
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
},
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
'Creating project': {
|
|
|
|
invoke: {
|
|
|
|
id: 'create-project',
|
|
|
|
src: 'createProject',
|
2024-10-28 16:18:06 -04:00
|
|
|
input: ({ event, context }) => {
|
2024-09-09 19:59:36 +03:00
|
|
|
if (event.type !== 'Create project') {
|
|
|
|
return {
|
|
|
|
name: '',
|
2024-10-28 16:18:06 -04:00
|
|
|
projects: context.projects,
|
2024-09-09 19:59:36 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
name: event.data.name,
|
2024-10-28 16:18:06 -04:00
|
|
|
projects: context.projects,
|
2024-09-09 19:59:36 +03:00
|
|
|
}
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
onDone: [
|
|
|
|
{
|
|
|
|
target: 'Reading projects',
|
2024-10-28 16:18:06 -04:00
|
|
|
actions: ['toastSuccess', 'navigateToProject'],
|
2024-09-09 19:59:36 +03:00
|
|
|
},
|
|
|
|
],
|
|
|
|
onError: [
|
|
|
|
{
|
|
|
|
target: 'Reading projects',
|
|
|
|
actions: ['toastError'],
|
|
|
|
},
|
|
|
|
],
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
},
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
'Renaming project': {
|
|
|
|
invoke: {
|
|
|
|
id: 'rename-project',
|
|
|
|
src: 'renameProject',
|
|
|
|
input: ({ event, context }) => {
|
|
|
|
if (event.type !== 'Rename project') {
|
|
|
|
// This is to make TS happy
|
|
|
|
return {
|
|
|
|
defaultProjectName: context.defaultProjectName,
|
|
|
|
defaultDirectory: context.defaultDirectory,
|
|
|
|
oldName: '',
|
|
|
|
newName: '',
|
2024-10-28 16:18:06 -04:00
|
|
|
projects: context.projects,
|
2024-09-09 19:59:36 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
defaultProjectName: context.defaultProjectName,
|
|
|
|
defaultDirectory: context.defaultDirectory,
|
|
|
|
oldName: event.data.oldName,
|
|
|
|
newName: event.data.newName,
|
2024-10-28 16:18:06 -04:00
|
|
|
projects: context.projects,
|
2024-09-09 19:59:36 +03:00
|
|
|
}
|
|
|
|
},
|
|
|
|
onDone: [
|
|
|
|
{
|
|
|
|
target: '#Home machine.Reading projects',
|
2024-10-28 16:18:06 -04:00
|
|
|
actions: ['toastSuccess', 'navigateToProjectIfNeeded'],
|
2024-09-09 19:59:36 +03:00
|
|
|
},
|
|
|
|
],
|
|
|
|
onError: [
|
|
|
|
{
|
|
|
|
target: '#Home machine.Reading projects',
|
2023-08-28 20:31:49 -04:00
|
|
|
actions: ['toastError'],
|
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
],
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
},
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
'Deleting project': {
|
|
|
|
invoke: {
|
|
|
|
id: 'delete-project',
|
|
|
|
src: 'deleteProject',
|
|
|
|
input: ({ event, context }) => {
|
|
|
|
if (event.type !== 'Delete project') {
|
|
|
|
// This is to make TS happy
|
|
|
|
return {
|
|
|
|
defaultDirectory: context.defaultDirectory,
|
|
|
|
name: '',
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
defaultDirectory: context.defaultDirectory,
|
|
|
|
name: event.data.name,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
onDone: [
|
|
|
|
{
|
2024-10-28 16:18:06 -04:00
|
|
|
actions: ['toastSuccess', 'navigateToProjectIfNeeded'],
|
2024-09-09 19:59:36 +03:00
|
|
|
target: '#Home machine.Reading projects',
|
|
|
|
},
|
|
|
|
],
|
|
|
|
onError: {
|
|
|
|
actions: ['toastError'],
|
|
|
|
target: '#Home machine.Has projects',
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
},
|
2023-08-28 20:31:49 -04:00
|
|
|
|
2024-09-09 19:59:36 +03:00
|
|
|
'Reading projects': {
|
|
|
|
invoke: {
|
|
|
|
id: 'read-projects',
|
|
|
|
src: 'readProjects',
|
|
|
|
onDone: [
|
|
|
|
{
|
|
|
|
guard: 'Has at least 1 project',
|
|
|
|
target: 'Has projects',
|
|
|
|
actions: ['setProjects'],
|
|
|
|
},
|
|
|
|
{
|
|
|
|
target: 'Has no projects',
|
|
|
|
actions: ['setProjects'],
|
|
|
|
},
|
|
|
|
],
|
|
|
|
onError: [
|
|
|
|
{
|
|
|
|
target: 'Has no projects',
|
|
|
|
actions: ['toastError'],
|
|
|
|
},
|
|
|
|
],
|
2023-08-28 20:31:49 -04:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2024-09-09 19:59:36 +03:00
|
|
|
})
|