import {
connect,
type ItemFormOutletsCtx,
type ItemType,
type RenderItemFormOutletCtx,
type RenderModalCtx,
} from 'datocms-plugin-sdk';
import ConfigScreen from './entrypoints/ConfigScreen';
import { render } from './utils/render';
import 'datocms-react-ui/styles.css';
import BinOutlet from './entrypoints/BinOutlet';
import ErrorModal from './entrypoints/ErrorModal';
import { createDebugLogger, isDebugEnabled } from './utils/debugLogger';
import { getRuntimeMode } from './utils/getRuntimeMode';
import { captureDeletedItemsWithoutLambda } from './utils/lambdaLessCapture';
connect({
async onBeforeItemsDestroy(items, ctx) {
const debugLogger = createDebugLogger(
isDebugEnabled(ctx.plugin.attributes.parameters),
'index.onBeforeItemsDestroy',
);
const runtimeMode = getRuntimeMode(ctx.plugin.attributes.parameters);
if (runtimeMode === 'lambda') {
debugLogger.log(
'Skipping Lambda-less delete capture because lambda mode is active',
);
return true;
}
try {
const captureResult = await captureDeletedItemsWithoutLambda(items, ctx);
debugLogger.log('Lambda-less delete capture completed', captureResult);
} catch (error) {
debugLogger.error(
'Unexpected error in Lambda-less delete capture. Proceeding with deletion (fail-open).',
error,
);
}
return true;
},
renderConfigScreen(ctx) {
const debugLogger = createDebugLogger(
isDebugEnabled(ctx.plugin.attributes.parameters),
'index.renderConfigScreen',
);
debugLogger.log('Rendering config screen');
return render();
},
itemFormOutlets(model: ItemType, _ctx: ItemFormOutletsCtx) {
const debugLogger = createDebugLogger(
isDebugEnabled(_ctx.plugin.attributes.parameters),
'index.itemFormOutlets',
);
if (model.attributes.api_key === 'record_bin') {
debugLogger.log('Registering item form outlet for record_bin model');
return [
{
id: 'recordBin',
initialHeight: 0,
},
];
}
debugLogger.log('Skipping item form outlet for model', {
modelApiKey: model.attributes.api_key,
});
return [];
},
renderItemFormOutlet(outletId, ctx: RenderItemFormOutletCtx) {
const debugLogger = createDebugLogger(
isDebugEnabled(ctx.plugin.attributes.parameters),
'index.renderItemFormOutlet',
);
if (outletId === 'recordBin') {
debugLogger.log('Rendering record bin outlet');
render();
return;
}
debugLogger.log('Skipping outlet rendering', {
outletId,
});
},
renderModal(modalId: string, ctx: RenderModalCtx) {
const debugLogger = createDebugLogger(
isDebugEnabled(ctx.plugin.attributes.parameters),
'index.renderModal',
);
debugLogger.log('Rendering modal', { modalId });
switch (modalId) {
case 'errorModal':
return render();
default:
debugLogger.warn('Received unknown modal id', { modalId });
return undefined;
}
},
});