49 lines
1.6 KiB
JavaScript
49 lines
1.6 KiB
JavaScript
(function (root, factory) {
|
|
const createSearchPreview = factory();
|
|
if (typeof module === 'object' && module.exports) module.exports = createSearchPreview;
|
|
if (root) root.createSearchPreview = createSearchPreview;
|
|
})(typeof globalThis !== 'undefined' ? globalThis : this, function () {
|
|
return function createSearchPreview({ fetchJson, claim, onState }) {
|
|
let generation = 0;
|
|
let current = null;
|
|
let claimRequest = null;
|
|
|
|
return {
|
|
open(item) {
|
|
generation += 1;
|
|
const requestGeneration = generation;
|
|
current = { ...item };
|
|
onState({ status: 'loading', item: current });
|
|
return fetchJson(current).then(detail => {
|
|
if (requestGeneration === generation) {
|
|
onState({ status: 'ready', item: current, detail });
|
|
}
|
|
return detail;
|
|
}).catch(error => {
|
|
if (requestGeneration === generation) {
|
|
onState({ status: 'error', item: current, error });
|
|
}
|
|
throw error;
|
|
});
|
|
},
|
|
close() {
|
|
generation += 1;
|
|
current = null;
|
|
onState({ status: 'closed' });
|
|
},
|
|
claim(detail) {
|
|
if (claimRequest) return claimRequest;
|
|
onState({ status: 'claiming', item: current, detail });
|
|
claimRequest = claim(detail).then(result => {
|
|
onState({ status: 'claimed', item: current, detail, result });
|
|
return result;
|
|
}).catch(error => {
|
|
onState({ status: 'ready', item: current, detail, error });
|
|
throw error;
|
|
}).finally(() => { claimRequest = null; });
|
|
return claimRequest;
|
|
},
|
|
};
|
|
};
|
|
});
|