UNPKG

gif-picker-react

Version:

Multi-provider GIF Picker for React with pluggable provider support

1 lines 6.22 kB
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/providers/tenor/TenorProvider.ts","../../../src/providers/tenor/tenor.types.ts"],"sourcesContent":["import { ContentFilter } from './tenor.types';\nimport { GifProvider, GifProviderAttribution, GifEventContext } from '../../types/GifProvider';\nimport { Gif, GifCategory, GifProviderName } from '../../types/types';\nimport { TenorCategoriesResponse, TenorResult, TenorSearchResponse } from './tenor.types';\n\nconst MEDIA_FILTER = 'gif,tinygif';\nconst BASE_URL = 'https://tenor.googleapis.com/v2/';\nconst TENOR_MAX_LIMIT = 50;\nconst CLIENT_KEY = 'gif-picker-react';\n\nexport type TenorProviderConfig = {\n\tbaseUrl?: string;\n\tclientKey?: string;\n\tcountry?: string;\n\tlocale?: string;\n\tcontentFilter?: ContentFilter;\n};\n\nexport function Tenor(apiKey: string, config?: TenorProviderConfig): GifProvider {\n\treturn new TenorProvider(apiKey, config);\n}\n\nclass TenorProvider implements GifProvider {\n\tconstructor(\n\t\tprivate apiKey: string,\n\t\tprivate config: TenorProviderConfig = {},\n\t) {}\n\n\tpublic async getCategories(): Promise<GifCategory[]> {\n\t\tconst data = await this.fetchApi<TenorCategoriesResponse>('categories', { type: 'featured' });\n\n\t\treturn data.tags.map((tag) => ({\n\t\t\tname: tag.name,\n\t\t\tsearchTerm: tag.searchterm,\n\t\t\timageUrl: tag.image,\n\t\t}));\n\t}\n\n\tpublic async search(term: string): Promise<Gif[]> {\n\t\tconst data = await this.fetchApi<TenorSearchResponse>('search', {\n\t\t\tq: term,\n\t\t\tar_range: 'all',\n\t\t\tlimit: TENOR_MAX_LIMIT,\n\t\t});\n\n\t\treturn data.results.map((r) => this.parseGif(r));\n\t}\n\n\tpublic async getTrending(): Promise<Gif[]> {\n\t\tconst data = await this.fetchApi<TenorSearchResponse>('featured', {\n\t\t\tar_range: 'all',\n\t\t\tlimit: TENOR_MAX_LIMIT,\n\t\t});\n\n\t\treturn data.results.map((r) => this.parseGif(r));\n\t}\n\n\tpublic async onClick(gif: Gif, context: GifEventContext): Promise<void> {\n\t\tawait this.fetchApi('registershare', {\n\t\t\tid: gif.id,\n\t\t\t...(context.searchTerm && { q: context.searchTerm }),\n\t\t});\n\t}\n\n\tprivate async fetchApi<T = any>(endpoint: string, extraParams?: Record<string, any>): Promise<T> {\n\t\tconst url = new URL((this.config.baseUrl ?? BASE_URL) + endpoint);\n\n\t\turl.searchParams.set('key', this.apiKey);\n\t\turl.searchParams.set('media_filter', MEDIA_FILTER);\n\t\turl.searchParams.set('client_key', this.config.clientKey ?? CLIENT_KEY);\n\n\t\tif (this.config.contentFilter) {\n\t\t\turl.searchParams.set('contentfilter', this.config.contentFilter);\n\t\t}\n\t\tif (this.config.locale) {\n\t\t\turl.searchParams.set('locale', this.config.locale);\n\t\t}\n\t\tif (this.config.country) {\n\t\t\turl.searchParams.set('country', this.config.country);\n\t\t}\n\n\t\tif (extraParams) {\n\t\t\tObject.entries(extraParams).forEach(([k, v]) => url.searchParams.set(k, v));\n\t\t}\n\n\t\tconst res = await fetch(url.toString());\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`Tenor API request failed (${res.status} ${res.statusText})`);\n\t\t}\n\t\treturn res.json() as Promise<T>;\n\t}\n\n\tpublic getAttribution(): GifProviderAttribution {\n\t\treturn { searchPlaceholder: 'Search Tenor' };\n\t}\n\n\tprivate parseGif(img: TenorResult): Gif<TenorResult> {\n\t\tconst gif = img.media_formats.gif;\n\t\tconst preview = img.media_formats.tinygif;\n\t\treturn {\n\t\t\tid: img.id,\n\t\t\timageUrl: gif.url,\n\t\t\twidth: gif.dims[0],\n\t\t\theight: gif.dims[1],\n\t\t\tdescription: img.content_description,\n\t\t\tpreview: {\n\t\t\t\timageUrl: preview.url,\n\t\t\t\twidth: preview.dims[0],\n\t\t\t\theight: preview.dims[1],\n\t\t\t},\n\t\t\tprovider: GifProviderName.TENOR,\n\t\t\traw: img,\n\t\t};\n\t}\n}\n","export enum ContentFilter {\n\tHIGH = 'high',\n\tMEDIUM = 'medium',\n\tLOW = 'low',\n\tOFF = 'off',\n}\n\nexport interface TenorMediaFormat {\n\turl: string;\n\tdims: [number, number];\n\tduration: number;\n\tsize: number;\n}\n\nexport interface TenorResult {\n\tid: string;\n\ttitle: string;\n\tcontent_description: string;\n\titemurl: string;\n\turl: string;\n\ttags: string[];\n\tcreated: number;\n\tmedia_formats: {\n\t\tgif: TenorMediaFormat;\n\t\ttinygif: TenorMediaFormat;\n\t};\n}\n\nexport interface TenorSearchResponse {\n\tresults: TenorResult[];\n\tnext: string;\n}\n\nexport interface TenorTag {\n\tsearchterm: string;\n\tpath: string;\n\timage: string;\n\tname: string;\n}\n\nexport interface TenorCategoriesResponse {\n\ttags: TenorTag[];\n}\n"],"mappings":"AAkBA,SAAgB,EAAM,EAAgB,EAA2C,CAChF,OAAO,IAAI,EAAc,EAAQ,CAAM,CACxC,CAEA,IAAM,EAAN,KAA2C,CAC1C,YACC,EACA,EAAsC,CAAC,EACtC,CAFO,KAAA,OAAA,EACA,KAAA,OAAA,CACN,CAEH,MAAa,eAAwC,CAGpD,OAAO,MAFY,KAAK,SAAkC,aAAc,CAAE,KAAM,UAAW,CAAC,GAEhF,KAAK,IAAK,IAAS,CAC9B,KAAM,EAAI,KACV,WAAY,EAAI,WAChB,SAAU,EAAI,KACf,EAAE,CACH,CAEA,MAAa,OAAO,EAA8B,CAOjD,OAAO,MANY,KAAK,SAA8B,SAAU,CAC/D,EAAG,EACH,SAAU,MACV,MAAO,EACR,CAAC,GAEW,QAAQ,IAAK,GAAM,KAAK,SAAS,CAAC,CAAC,CAChD,CAEA,MAAa,aAA8B,CAM1C,OAAO,MALY,KAAK,SAA8B,WAAY,CACjE,SAAU,MACV,MAAO,EACR,CAAC,GAEW,QAAQ,IAAK,GAAM,KAAK,SAAS,CAAC,CAAC,CAChD,CAEA,MAAa,QAAQ,EAAU,EAAyC,CACvE,MAAM,KAAK,SAAS,gBAAiB,CACpC,GAAI,EAAI,GACR,GAAI,EAAQ,YAAc,CAAE,EAAG,EAAQ,UAAW,CACnD,CAAC,CACF,CAEA,MAAc,SAAkB,EAAkB,EAA+C,CAChG,IAAM,EAAM,IAAI,KAAK,KAAK,OAAO,SAAW,oCAAY,CAAQ,EAEhE,EAAI,aAAa,IAAI,MAAO,KAAK,MAAM,EACvC,EAAI,aAAa,IAAI,eAAgB,aAAY,EACjD,EAAI,aAAa,IAAI,aAAc,KAAK,OAAO,WAAa,kBAAU,EAElE,KAAK,OAAO,eACf,EAAI,aAAa,IAAI,gBAAiB,KAAK,OAAO,aAAa,EAE5D,KAAK,OAAO,QACf,EAAI,aAAa,IAAI,SAAU,KAAK,OAAO,MAAM,EAE9C,KAAK,OAAO,SACf,EAAI,aAAa,IAAI,UAAW,KAAK,OAAO,OAAO,EAGhD,GACH,OAAO,QAAQ,CAAW,EAAE,SAAS,CAAC,EAAG,KAAO,EAAI,aAAa,IAAI,EAAG,CAAC,CAAC,EAG3E,IAAM,EAAM,MAAM,MAAM,EAAI,SAAS,CAAC,EACtC,GAAI,CAAC,EAAI,GACR,MAAU,MAAM,6BAA6B,EAAI,OAAO,GAAG,EAAI,WAAW,EAAE,EAE7E,OAAO,EAAI,KAAK,CACjB,CAEA,gBAAgD,CAC/C,MAAO,CAAE,kBAAmB,cAAe,CAC5C,CAEA,SAAiB,EAAoC,CACpD,IAAM,EAAM,EAAI,cAAc,IACxB,EAAU,EAAI,cAAc,QAClC,MAAO,CACN,GAAI,EAAI,GACR,SAAU,EAAI,IACd,MAAO,EAAI,KAAK,GAChB,OAAQ,EAAI,KAAK,GACjB,YAAa,EAAI,oBACjB,QAAS,CACR,SAAU,EAAQ,IAClB,MAAO,EAAQ,KAAK,GACpB,OAAQ,EAAQ,KAAK,EACtB,EACA,SAAA,QACA,IAAK,CACN,CACD,CACD,EClHA,IAAY,EAAL,SAAA,EAAA,OACN,GAAA,KAAA,OACA,EAAA,OAAA,SACA,EAAA,IAAA,MACA,EAAA,IAAA,OACD,EAAA,CAAA,CAAA"}