viewof osmFetch = {
const input = Inputs.input();
const machine = osmFetchMachineCreator(
{},
{
actions: {
processSearchResults: xstate.assign({
location: (context, event) => event.data[0]
}),
resetSearchResults: xstate.assign({ location: undefined }),
addQueryParams: xstate.assign({
queryParams: (context, event) => event.data
}),
processGeoJson: xstate.assign({
geojson: (context, event) => event.data
}),
resetGeoJson: xstate.assign({ geojson: undefined })
},
guards: {
hasLocation: (context, event) => event.data?.[0]?.display_name,
isQueryValid: (context, event) => generateQueryTemplate(event.data),
havePlaceAndValidQuery: (context, event) =>
context?.location?.display_name &&
generateQueryTemplate(context.queryParams),
hasData: (context, event) => event.data && event.data?.features?.length
},
services: {
searchLocation: (context, event) => searchOsm(event.data),
fetchGeojson: (context, event) =>
fetchGeoJson(context.location, context.queryParams)
}
}
);
const service = xstate
.interpret(machine)
.onTransition((state) => {
input.value = state;
input.dispatchEvent(new Event("input", { bubbles: true }));
})
.start();
return Object.assign(input, { service });
}