import { EVENT_NAMES } from '@crystallize/import-utilities'; import { Text, useApp } from 'ink'; import React, { useState } from 'react'; import { useReducer } from 'react'; import { colors } from '../../../config/colors.js'; import { PimAuthenticatedUser, PimCredentials } from '../../../types.js'; import { ImportStatus } from '../../components/ImportStatus.js'; import { Messages } from '../../components/Messages.js'; import { SetupCredentials } from '../../components/SetupCredentials.js'; import { Spinner } from '../../components/Spinner.js'; import createTenant from '../../use-cases/createTenant.js'; import importTenantDump from '../../use-cases/importTentantDump.js'; import { fetchAvailableTenantIdentifier } from '../../utils/crystallize.js'; import { Status } from '../install-boilerplate/context/types.js'; import { State, Reducer } from './reducer.js'; export const ImportTenantDumpJourney: React.FC<{ specFilePath: string; tenantIdentifier: string; isVerbose?: boolean; multiLingual?: boolean; }> = ({ specFilePath, tenantIdentifier, multiLingual = false }) => { const { exit } = useApp(); const [status, setStatus] = useState(null); const [state, dispatch] = useReducer(Reducer, { feedbackIndex: 0, messages: [], isDone: false, isImporting: false, }); return ( <> {!state.credentials && ( { dispatch({ type: 'SET_CREDENTIALS', credentials }); fetchAvailableTenantIdentifier(credentials, tenantIdentifier).then( (availableIdentifier: string) => { const newTenant = { identifier: availableIdentifier, }; dispatch({ type: 'CHANGE_TENANT', item: newTenant, }); createTenant(newTenant, credentials).then(() => { dispatch({ type: 'IMPORT_STARTED' }); importTenantDump({ tenantIdentifier: newTenant.identifier, specFilePath, credentials, multiLingual, emit: (eventName: string, message: string | any) => { if (eventName === EVENT_NAMES.STATUS_UPDATE) { setStatus(message); return; } dispatch({ type: 'ADD_MESSAGE', message: `${eventName}: ${message}` }); }, }).then(() => { dispatch({ type: 'IMPORT_DONE' }); exit(); }); }); }, ); }} /> )} {state.credentials && } {state.isImporting && ( <> Importing tenant {status && } )} {state.isDone && <>{status && }} {state.messages.length > 0 && } ); }; export const CreateTenant: React.FC<{ requestedTenantIdentifier: string; state: State; }> = ({ requestedTenantIdentifier, state }) => { return ( <> {!state.tenant?.identifier && } Creating tenant: {state.tenant?.identifier || requestedTenantIdentifier} {state.tenant?.identifier && state.tenant.identifier !== requestedTenantIdentifier && ( We changed the asked tenant identifier from {requestedTenantIdentifier} to{' '} {state.tenant.identifier}. )} ); };