Skip to content

Instantly share code, notes, and snippets.

@knownasilya
Last active July 15, 2020 16:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save knownasilya/80f61974ad2ac0e73ec81862ed9d758f to your computer and use it in GitHub Desktop.
Save knownasilya/80f61974ad2ac0e73ec81862ed9d758f to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
// Available variables:
// - Machine
// - interpret
// - assign
// - send
// - sendParent
// - spawn
// - raise
// - actions
// - XState (all XState exports)
const selectDataId = assign({
dataIdColumn: (context, event) => event.column,
selectedIdValid: (context, event) => null
});
const selectDataDisplayName = assign({
dataDisplayNameColumn: (context, event) => event.column
});
const loadColumns = assign({
columns: (context, event) => true
});
const selectDataTable = assign({
dataTable: (context, event) => event.table
});
const setTables = assign({
tables: (context, event) => 'adasd'
});
const setDistinctDataColumns = assign({
distinctDataColumns: (context, event) => 'asd'
});
const setDataColumns = assign({
dataColumns: (context, event) => 'asd'
});
const setMulti = assign({
multi: (context, event) => true
});
const setValidId = assign({
selectedIdValid: (context, event) => true
});
const setDisplayNameValid = assign({
selectedDisplayNameValid: (context, event) => true
});
function canSetupIntersection(context, event) {
return !!context.dataIdColumn;
}
function needsDataColumns(context, event) {
return !!context.columns;
}
function needsTables(context, event) {
return !!context.tables;
}
function withoutTables(context, event) {
return !context.tables;
}
function canSetupGeom(context, event) {
return context.multi;
}
function hasDistinctColumns(context, event) {
return !!context.distinctDataColumns;
}
function hasColumns(context, event) {
return !!context.dataColumns;
}
function isSelectedIdValid(context, event) {
return !!context.selectedIdValid;
}
function isSelectedDisplayNameValid(context, event) {
return !!context.selectedDisplayNameValid;
}
const fetchMachine = Machine({
id: 'datasources',
initial: 'data',
context: {
multi: false,
distinctDataColumns: null,
dataColumns: null,
dataIdColumn: null,
dataDisplayNameColumn: null
},
states: {
data: {
initial: 'idle',
states: {
idle: {
on: {
SETUP_TABLE: 'setupTable'
}
},
setupTable: {
initial: 'idle',
states: {
idle: {
invoke: {
src: 'loadTables',
cond: 'withoutTables',
onDone: {
target: 'idle',
actions: 'setTables'
}
},
on: {
SELECT_TABLE: {
target: 'compatibilityCheck',
cond: 'needsTables',
actions: 'selectDataTable'
}
},
},
compatibilityCheck: {
on: {
MULTI: {
target: '#datasources.data.withTable',
actions: 'setMulti'
},
SINGLE: '#datasources.data.withTable'
}
}
}
},
withTable: {
on: {
SETUP_ID: 'setupIdentifier',
SETUP_DISPLAY_NAME: 'setupDisplayName',
SETUP_GEOM_TABLE: {
target: '#datasources.geom',
cond: 'canSetupGeom'
}
}
},
setupIdentifier: {
initial: 'idle',
states: {
idle: {
invoke: {
src: 'loadDistinctColumns',
onDone: {
target: 'idle',
actions: 'setDistinctDataColumns'
}
},
on: {
SELECT_ID: {
target: 'compatibilityCheck',
cond: 'hasDistinctColumns',
actions: 'selectDataId'
},
CANCEL: '#datasources.data.withTable',
SUBMIT: {
target: '#datasources.data.withTable',
cond: 'isSelectedIdValid'
}
},
},
compatibilityCheck: {
invoke: {
src: 'checkIdColumn',
onDone: {
target: 'idle',
actions: 'setValidId'
},
onError: 'idle'
},
}
}
},
setupDisplayName: {
initial: 'idle',
states: {
idle: {
invoke: {
src: 'loadColumns',
onDone: {
target: 'idle',
actions: 'setDataColumns'
}
},
on: {
SELECT_DISPLAY_NAME: {
target: 'compatibilityCheck',
cond: 'hasColumns',
actions: 'selectDataDisplayName'
},
CANCEL: '#datasources.data.withTable',
SUBMIT: {
target: '#datasources.data.withTable',
cond: 'isSelectedDisplayNameValid'
}
},
},
compatibilityCheck: {
invoke: {
src: 'checkNameColumn',
onDone: {
target: 'idle',
actions: 'setDisplayNameValid'
},
onError: 'idle'
},
}
}
},
},
},
intersection: {
initial: 'idle',
cond: 'canSetupIntersection',
states: {
idle: {
}
}
},
geom: {
initial: 'idle',
states: {
idle: {}
}
}
},
},{
guards: {
canSetupGeom,
canSetupIntersection,
needsDataColumns,
needsTables,
withoutTables,
hasDistinctColumns,
hasColumns,
isSelectedIdValid,
isSelectedDisplayNameValid
},
actions: {
setTables,
setMulti,
setDistinctDataColumns,
setDataColumns,
setValidId,
setDisplayNameValid,
selectDataTable,
selectDataId,
selectDataDisplayName,
loadColumns
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment