forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			87 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { Mapillary } from "./Mapillary";
 | 
						|
import { WikimediaImageProvider } from "./WikimediaImageProvider";
 | 
						|
import { Imgur } from "./Imgur";
 | 
						|
import GenericImageProvider from "./GenericImageProvider";
 | 
						|
import { Store, UIEventSource } from "../UIEventSource";
 | 
						|
import ImageProvider, { ProvidedImage } from "./ImageProvider";
 | 
						|
import { WikidataImageProvider } from "./WikidataImageProvider";
 | 
						|
 | 
						|
/**
 | 
						|
 * A generic 'from the interwebz' image picker, without attribution
 | 
						|
 */
 | 
						|
export default class AllImageProviders {
 | 
						|
    public static ImageAttributionSource: ImageProvider[] = [
 | 
						|
        Imgur.singleton,
 | 
						|
        Mapillary.singleton,
 | 
						|
        WikidataImageProvider.singleton,
 | 
						|
        WikimediaImageProvider.singleton,
 | 
						|
        new GenericImageProvider(
 | 
						|
            [].concat(
 | 
						|
                ...Imgur.defaultValuePrefix,
 | 
						|
                ...WikimediaImageProvider.commonsPrefixes,
 | 
						|
                ...Mapillary.valuePrefixes
 | 
						|
            )
 | 
						|
        ),
 | 
						|
    ]
 | 
						|
 | 
						|
    private static providersByName = {
 | 
						|
        imgur: Imgur.singleton,
 | 
						|
        mapillary: Mapillary.singleton,
 | 
						|
        wikidata: WikidataImageProvider.singleton,
 | 
						|
        wikimedia: WikimediaImageProvider.singleton,
 | 
						|
    }
 | 
						|
 | 
						|
    public static byName(name: string) {
 | 
						|
        return AllImageProviders.providersByName[name.toLowerCase()]
 | 
						|
    }
 | 
						|
 | 
						|
    public static defaultKeys = [].concat(
 | 
						|
        AllImageProviders.ImageAttributionSource.map((provider) => provider.defaultKeyPrefixes)
 | 
						|
    )
 | 
						|
 | 
						|
    private static _cache: Map<string, UIEventSource<ProvidedImage[]>> = new Map<
 | 
						|
        string,
 | 
						|
        UIEventSource<ProvidedImage[]>
 | 
						|
    >()
 | 
						|
 | 
						|
    public static LoadImagesFor(tags: Store<Record<string, string>>, tagKey?: string[]): Store<ProvidedImage[]> {
 | 
						|
        if (tags.data.id === undefined) {
 | 
						|
            return undefined
 | 
						|
        }
 | 
						|
 | 
						|
        const cacheKey = tags.data.id + tagKey
 | 
						|
        const cached = this._cache.get(cacheKey)
 | 
						|
        if (cached !== undefined) {
 | 
						|
            return cached
 | 
						|
        }
 | 
						|
 | 
						|
        const source = new UIEventSource([])
 | 
						|
        this._cache.set(cacheKey, source)
 | 
						|
        const allSources = []
 | 
						|
        for (const imageProvider of AllImageProviders.ImageAttributionSource) {
 | 
						|
            let prefixes = imageProvider.defaultKeyPrefixes
 | 
						|
            if (tagKey !== undefined) {
 | 
						|
                prefixes = tagKey
 | 
						|
            }
 | 
						|
 | 
						|
            const singleSource = imageProvider.GetRelevantUrls(tags, {
 | 
						|
                prefixes: prefixes,
 | 
						|
            })
 | 
						|
            allSources.push(singleSource)
 | 
						|
            singleSource.addCallbackAndRunD((_) => {
 | 
						|
                const all: ProvidedImage[] = [].concat(...allSources.map((source) => source.data))
 | 
						|
                const uniq = []
 | 
						|
                const seen = new Set<string>()
 | 
						|
                for (const img of all) {
 | 
						|
                    if (seen.has(img.url)) {
 | 
						|
                        continue
 | 
						|
                    }
 | 
						|
                    seen.add(img.url)
 | 
						|
                    uniq.push(img)
 | 
						|
                }
 | 
						|
                source.setData(uniq)
 | 
						|
            })
 | 
						|
        }
 | 
						|
        return source
 | 
						|
    }
 | 
						|
}
 |