47 lines
1.4 KiB
JavaScript
47 lines
1.4 KiB
JavaScript
import { normalizeLanguage } from '../lib/settings.js';
|
|
import { prepareAction } from '../lib/prepare-action.js';
|
|
|
|
export function createDialogController({ payload, open, render, close }) {
|
|
let request = structuredClone(payload.request);
|
|
let state = { ...payload.preparation, busy: false };
|
|
let cancelled = false;
|
|
const show = () => render({ ...state });
|
|
show();
|
|
return {
|
|
cancel() {
|
|
if (state.busy || cancelled) return;
|
|
cancelled = true;
|
|
request = null;
|
|
close();
|
|
},
|
|
async submit(language) {
|
|
if (cancelled || state.busy || state.kind === 'error') return;
|
|
if (state.kind === 'language') {
|
|
const normalized = normalizeLanguage(language);
|
|
if (!normalized) {
|
|
state.message = 'Enter a language using up to 100 characters.';
|
|
show(); return;
|
|
}
|
|
request.language = normalized;
|
|
state = { ...prepareAction(request), busy: false };
|
|
show();
|
|
if (state.kind !== 'ready') return;
|
|
}
|
|
if (!['ready', 'shortened'].includes(state.kind)) return;
|
|
state.busy = true;
|
|
state.message = '';
|
|
show();
|
|
try {
|
|
await open(state.url, request.settings.openIn);
|
|
cancelled = true;
|
|
request = null;
|
|
close();
|
|
} catch {
|
|
state.busy = false;
|
|
state.message = 'Could not open ChatGPT. Please try again or cancel.';
|
|
show();
|
|
}
|
|
},
|
|
};
|
|
}
|