feat: first draft
This commit is contained in:
109
utils/validateState.ts
Normal file
109
utils/validateState.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
import { GlobalState } from './types';
|
||||
|
||||
export const initialState: GlobalState = {
|
||||
strategyCanvas: {
|
||||
factors: [],
|
||||
notes: {},
|
||||
},
|
||||
fourActions: {
|
||||
eliminate: [],
|
||||
reduce: [],
|
||||
raise: [],
|
||||
create: [],
|
||||
},
|
||||
sixPaths: {
|
||||
industries: { notes: '', opportunities: [] },
|
||||
groups: { notes: '', opportunities: [] },
|
||||
buyers: { notes: '', opportunities: [] },
|
||||
complementary: { notes: '', opportunities: [] },
|
||||
functional: { notes: '', opportunities: [] },
|
||||
trends: { notes: '', opportunities: [] },
|
||||
},
|
||||
utilityMap: {},
|
||||
priceCorridor: {
|
||||
targetPrice: 0,
|
||||
competitors: [] as Array<{
|
||||
name: string;
|
||||
price: number;
|
||||
category: 'same-form' | 'different-form' | 'different-function';
|
||||
}>,
|
||||
},
|
||||
validation: {
|
||||
nonCustomers: {},
|
||||
sequence: {},
|
||||
notes: '',
|
||||
},
|
||||
};
|
||||
|
||||
export function validateState(state: any): GlobalState {
|
||||
if (!state || typeof state !== 'object') {
|
||||
return initialState;
|
||||
}
|
||||
|
||||
return {
|
||||
strategyCanvas: {
|
||||
factors: Array.isArray(state?.strategyCanvas?.factors)
|
||||
? state.strategyCanvas.factors
|
||||
: [],
|
||||
notes: state?.strategyCanvas?.notes || {},
|
||||
},
|
||||
fourActions: {
|
||||
eliminate: Array.isArray(state?.fourActions?.eliminate)
|
||||
? state.fourActions.eliminate
|
||||
: [],
|
||||
reduce: Array.isArray(state?.fourActions?.reduce)
|
||||
? state.fourActions.reduce
|
||||
: [],
|
||||
raise: Array.isArray(state?.fourActions?.raise)
|
||||
? state.fourActions.raise
|
||||
: [],
|
||||
create: Array.isArray(state?.fourActions?.create)
|
||||
? state.fourActions.create
|
||||
: [],
|
||||
},
|
||||
sixPaths: {
|
||||
industries: validatePathSection(state?.sixPaths?.industries),
|
||||
groups: validatePathSection(state?.sixPaths?.groups),
|
||||
buyers: validatePathSection(state?.sixPaths?.buyers),
|
||||
complementary: validatePathSection(state?.sixPaths?.complementary),
|
||||
functional: validatePathSection(state?.sixPaths?.functional),
|
||||
trends: validatePathSection(state?.sixPaths?.trends),
|
||||
},
|
||||
utilityMap: state?.utilityMap || {},
|
||||
priceCorridor: {
|
||||
targetPrice: Number(state?.priceCorridor?.targetPrice) || 0,
|
||||
competitors: Array.isArray(state?.priceCorridor?.competitors)
|
||||
? state.priceCorridor.competitors.map(
|
||||
(comp: { name?: string; price?: number; category?: string }) => ({
|
||||
name: comp.name || '',
|
||||
price: Number(comp.price) || 0,
|
||||
category: [
|
||||
'same-form',
|
||||
'different-form',
|
||||
'different-function',
|
||||
].includes(comp.category || '')
|
||||
? (comp.category as
|
||||
| 'same-form'
|
||||
| 'different-form'
|
||||
| 'different-function')
|
||||
: 'same-form',
|
||||
})
|
||||
)
|
||||
: [],
|
||||
},
|
||||
validation: {
|
||||
nonCustomers: state?.validation?.nonCustomers || {},
|
||||
sequence: state?.validation?.sequence || {},
|
||||
notes: state?.validation?.notes || '',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function validatePathSection(section: any) {
|
||||
return {
|
||||
notes: typeof section?.notes === 'string' ? section.notes : '',
|
||||
opportunities: Array.isArray(section?.opportunities)
|
||||
? section.opportunities
|
||||
: [],
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user