1 import { untrack } from 'svelte';
2 import { generate_nominatim_api_url } from '../lib/api_utils.js';
3 import { identifyLinkInQuery } from '../lib/helpers.js';
5 const default_pagename = Nominatim_Config.Reverse_Only ? 'reverse' : 'search';
19 lastApiRequestURL = $state(null);
20 errorMessage = $state(null);
21 requestProgress = $state('finish');
27 refreshPage(pagename, params) {
28 if (typeof pagename === 'undefined') {
29 pagename = window.location.pathname.replace('.html', '').replace(/^.*\//, '');
31 if (!pagenames.includes(pagename)) pagename = default_pagename;
33 params = new URLSearchParams(window.location.search);
35 if (!pagenames.includes(pagename)) pagename = default_pagename;
37 if (typeof params === 'undefined') {
38 params = new URLSearchParams();
41 let param_str = params.toString();
43 param_str = '?' + param_str;
45 let new_url = pagename + '.html' + param_str;
47 if (window.location.protocol.match(/^http/)) {
48 window.history.pushState([], '', new_url);
50 window.location.href = new_url;
54 if (pagename === 'search' && params.has('q')) {
55 const arrTypeAndId = identifyLinkInQuery(params.get('q'));
56 if (arrTypeAndId instanceof Array) {
58 params = new URLSearchParams({osmtype: arrTypeAndId[0], osmid: arrTypeAndId[1]});
63 this.page = { tab: pagename, params: params };
64 this.lastApiRequestURL = null;
65 this.errorMessage = null;
69 async fetchFromApi(endpoint_name, params, callback) {
70 const api_url = generate_nominatim_api_url(endpoint_name, params);
72 const mock_api_error = (new URLSearchParams(window.location.search)).get('mock_api_error');
74 this.requestProgress = 'start';
75 if (endpoint_name !== 'status') this.lastApiRequestURL = null;
78 await fetch(api_url, { headers: Nominatim_Config.Nominatim_API_Endpoint_Headers || {} })
79 .then(async (response) => {
80 if ((!((response.status >= 200 && response.status < 300) || response.status === 404))
81 || mock_api_error === 'fetch'
83 this.errorMessage = `Error fetching data from ${api_url} (${response.statusText})`;
87 // Parse JSON here instead of returning a promise so we can catch possible
91 if (mock_api_error === 'parse') {
92 data = JSON.parse('{');
94 data = await response.json();
97 // e.g. 'JSON.parse: unexpected non-whitespace character after JSON data at line 1'
98 this.errorMessage = `Error parsing JSON data from ${api_url} (${err})`;
106 this.errorMessage = data.error.message;
110 this.requestProgress = 'finish';
113 this.errorMessage = `Error fetching data from ${api_url} (${error})`;
114 this.requestProgress = 'finish';
117 if (endpoint_name !== 'status') this.lastApiRequestURL = api_url;
121 export const appState = new AppState();