|
|
|
|
|
const request_map = {}; |
|
|
|
const is_browser = typeof window !== "undefined"; |
|
|
|
export function load_component({ api_url, name, id, variant }) { |
|
const comps = is_browser && window.__GRADIO__CC__; |
|
|
|
const _component_map = { |
|
|
|
...component_map, |
|
...(!comps ? {} : comps) |
|
}; |
|
|
|
let _id = id || name; |
|
|
|
if (request_map[`${_id}-${variant}`]) { |
|
return { component: request_map[`${_id}-${variant}`], name }; |
|
} |
|
try { |
|
if (!_component_map?.[_id]?.[variant] && !_component_map?.[name]?.[variant]) |
|
throw new Error(); |
|
|
|
request_map[`${_id}-${variant}`] = ( |
|
_component_map?.[_id]?.[variant] || |
|
_component_map?.[name]?.[variant] |
|
)(); |
|
|
|
return { |
|
name, |
|
component: request_map[`${_id}-${variant}`] |
|
}; |
|
} catch (e) { |
|
if (!_id) throw new Error(`Component not found: ${name}`); |
|
try { |
|
request_map[`${_id}-${variant}`] = get_component_with_css( |
|
api_url, |
|
_id, |
|
variant |
|
); |
|
|
|
return { |
|
name, |
|
component: request_map[`${_id}-${variant}`] |
|
}; |
|
} catch (e) { |
|
if (variant === "example") { |
|
request_map[`${_id}-${variant}`] = import("@gradio/fallback/example"); |
|
|
|
return { |
|
name, |
|
component: request_map[`${_id}-${variant}`] |
|
}; |
|
} |
|
console.error(`failed to load: ${name}`); |
|
console.error(e); |
|
throw e; |
|
} |
|
} |
|
} |
|
|
|
function load_css(url) { |
|
if(!is_browser) { |
|
return Promise.resolve(); |
|
} |
|
return new Promise((resolve, reject) => { |
|
const link = document.createElement("link"); |
|
link.rel = "stylesheet"; |
|
link.href = url; |
|
document.head.appendChild(link); |
|
link.onload = () => resolve(); |
|
link.onerror = () => reject(); |
|
}); |
|
} |
|
|
|
function get_component_with_css(api_url, id, variant) { |
|
const environment = is_browser ? "client": "server"; |
|
let path; |
|
if (environment === "server") { |
|
|
|
|
|
return Promise.all([ |
|
load_css(`${api_url}/custom_component/${id}/${variant}/style.css`), |
|
import( |
|
|
|
"@gradio/fallback" |
|
) |
|
]).then(([_, module]) => { |
|
return module; |
|
}); |
|
} |
|
|
|
path = `${api_url}/custom_component/${id}/${environment}/${variant}/index.js`; |
|
|
|
return Promise.all([ |
|
load_css(`${api_url}/custom_component/${id}/${environment}/${variant}/style.css`), |
|
import( |
|
|
|
path |
|
) |
|
]).then(([_, module]) => { |
|
return module; |
|
}); |
|
|
|
} |
|
|