UNPKG

gif-picker-react

Version:

Multi-provider GIF Picker for React with pluggable provider support

1 lines 12.6 kB
{"version":3,"file":"index.cjs","names":["poweredByGiphyOnLight","poweredByGiphyOnDark"],"sources":["../../../src/providers/giphy/assets/powered-by-giphy-on-light.png","../../../src/providers/giphy/assets/powered-by-giphy-on-dark.png","../../../src/providers/giphy/GiphyProvider.ts","../../../src/providers/giphy/giphy.types.ts"],"sourcesContent":["\"data:image/png;base64,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\"","\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAWCAYAAACFbNPBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABRdJREFUeNrsW6+X2zgQdu8FhMXQbAPDmmNhG1jWwGX1sWXNf7A5dqxZVtbAY7dlYedlgSoLdJmhw8xy1nuf3ptTNZLl2N5Nq3lvXhNZHo2k+eZXtm/O53MU6OpoDp5q4xk4UFckARL4ajitOT/bqax5U3NseH/DvNNkjomkLrual4y+meGdzLI/0/wNnnH73ljkbSx6Nzrz34KLuAqSkULU/KXmG8fcSc0PmD/vWS+py4ea/635qea4x7VSZvzBEElVlH3wlPUDBYBcDzjetjDeIdOt9wBJXyT38sg82xnGtszcR59zCQB5/fSEqNCG1gPreuvjnVvQpuYTs+5K2/etYd53yGhMI09PplMJ1mlWc4LPOZjKqWouDPILPFMUg+X42BLClaykgY5TRobSKcFauvzK82wqonfC7FmtxclPLZHjEeDJSNGeEsP4g/GsbenZkMJMGFDuegJIiT3+w0SMDDaysaRWZV8A4TyDIKFVXvidwZALzCmAdGkUf2mGIuXvaz6Q8Ts82+JClo4Qm1q8sHDMySHnHWPwB1xA5Xk2e+xZnslnAhL5/R7ythaPqdMJ5yC0dQT0X8MIujZS/exjnIcO4LdRvyTv8itSOj2l3ODuJpemVm0Aogx9T76/g+FK4zrCUMZQRBBPs4SRfMa8BaLMkcxR/x7IBSRYs3TkmwWJHoKsPca6K+hYMvuIDIa/I3oswJHhPdfZKAeSYkzJXZELr5gi84bxlMJyR9uB0qkSa31hwNRn/ZPiPnUgfGTmf/NNrdoCpNLSpb/hsWJc6NgQBTKML4jB6ACZkUgS4/CnxOB1T++6uFzz/Esi17QPLqJQD30PvQ9MmNZlZoiAKrVSXaUFScuO5AxcHtvkINIGOb/osRaJLXdgq1POHYBTGvwnD0CVQwDEdkCcQUcEFDE+FwZQCJJLZ+S5aGA4Nm+VMHovDYCwgeYArz9l9phoxprA+AsSeWZk3crR9YkbAHfKFKNDddfWFlD2TVvch2v/f16iz6gFIKhhLcilTZlUJTIUpwLpxoy8d8D3Ofl8NMhzAYT+wkyL/NwBkMwBkNJhuGND7RJjvCKAuCPRt/I8/9MLdtOaev2vA+qUwpYmXadWXQFEXTrN7xMDIGba9yMByAzvFhinxfixYeHKRY4xKZRNBbkPzRwpHpWZkAbDkqx/JB2rY4v7mkSvn7YDrpU7Uq300gVGLRTaWcLqHIZPvePYYPAlAQONAAeSp7c1IgF5CeqGpIOLUJGtSe0SEcDHhohTeZy1iVYkNcsYo7h5IXA06RSdLCnPvIUT2DIAeewi1Rt1jGYFknutQzWG8RdaFJlpwFEdq5hJrzivsGfSuicYVApgV0y9YOpCpVqaptIiW8RKteh1ST7OvbfWAJIZUtChAXKCJ9823BfXgMg6rKnKLoSMPAFQOOY8QTHarSkADmFIs/LoxzZuRrpdtu4U10UqDUY2J7WNKwIUzLqZ5dBzRsbBEAULD4B8Nxj7LcCeMilwX38P9czoKMi9/3TkA5CmOXsWNeuBV4xMYemEiRY66u+59rFvcY4+9YyPfOmVTb8zfIAXpoY5RbTsq05ZRr8gjaJAr5lUpDClHTKyfAxH1C+FP1Z8/SSjwrcL3l+HIwwA+ZmpRHrj+/uCrF9+j4b50S6kWIFeHCQrACV11BrPSM12TDPh2bFWkzlNSTQcsz3LWzYQ8i428Cb8n/SrpWn0/1/uyxAtuqcAkECBLPSfAAMAD0//f+CYk/8AAAAASUVORK5CYII=\"","import { GifProvider, GifProviderAttribution } from '../../types/GifProvider';\nimport { Gif, GifCategory, GifProviderName } from '../../types/types';\nimport {\n\tContentRating,\n\tGiphyCategoriesResponse,\n\tGiphyGif,\n\tGiphyListResponse,\n\tGiphyMeta,\n} from './giphy.types';\nimport poweredByGiphyOnLight from './assets/powered-by-giphy-on-light.png';\nimport poweredByGiphyOnDark from './assets/powered-by-giphy-on-dark.png';\n\nconst BASE_URL = 'https://api.giphy.com/v1/';\nconst GIPHY_MAX_LIMIT = 50;\nconst GIPHY_MAX_QUERY_LENGTH = 50;\n\nexport type GiphyProviderConfig = {\n\tbaseUrl?: string;\n\tlang?: string;\n\trating?: ContentRating;\n};\n\nexport function Giphy(apiKey: string, config?: GiphyProviderConfig): GifProvider {\n\treturn new GiphyProvider(apiKey, config);\n}\n\nclass GiphyProvider implements GifProvider {\n\tprivate readonly baseUrl: string;\n\n\tconstructor(\n\t\tprivate apiKey: string,\n\t\tprivate config: GiphyProviderConfig = {},\n\t) {\n\t\tthis.baseUrl = (config.baseUrl ?? BASE_URL).replace(/\\/+$/, '');\n\t}\n\n\tpublic async getCategories(): Promise<GifCategory[]> {\n\t\tconst params: Record<string, string> = {};\n\t\tif (this.config.lang) {\n\t\t\tparams.lang = this.config.lang;\n\t\t}\n\n\t\tconst data = await this.fetchApi<GiphyCategoriesResponse>('/gifs/categories', params);\n\n\t\treturn data.data\n\t\t\t.map((category): GifCategory | null => {\n\t\t\t\tconst cover = category.gif?.images?.fixed_width?.url;\n\t\t\t\tif (!cover) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tname: category.name,\n\t\t\t\t\tsearchTerm: category.name,\n\t\t\t\t\timageUrl: cover,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.filter((category): category is GifCategory => category !== null);\n\t}\n\n\tpublic async search(term: string): Promise<Gif[]> {\n\t\tconst data = await this.fetchApi<GiphyListResponse>('/gifs/search', {\n\t\t\tq: term.slice(0, GIPHY_MAX_QUERY_LENGTH),\n\t\t\tlimit: GIPHY_MAX_LIMIT,\n\t\t\t...this.buildParams(),\n\t\t});\n\n\t\treturn this.parseGifs(data.data);\n\t}\n\n\tpublic async getTrending(): Promise<Gif[]> {\n\t\tconst data = await this.fetchApi<GiphyListResponse>('/gifs/trending', {\n\t\t\tlimit: GIPHY_MAX_LIMIT,\n\t\t\t...this.buildParams(),\n\t\t});\n\n\t\treturn this.parseGifs(data.data);\n\t}\n\n\tpublic getAttribution(): GifProviderAttribution {\n\t\treturn {\n\t\t\tsearchPlaceholder: 'Search GIPHY',\n\t\t\tbranding: {\n\t\t\t\tlogo: poweredByGiphyOnLight,\n\t\t\t\tlogoDark: poweredByGiphyOnDark,\n\t\t\t\talt: 'Powered by GIPHY',\n\t\t\t\thref: 'https://giphy.com',\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate buildParams(): Record<string, string> {\n\t\tconst params: Record<string, string> = {};\n\n\t\tif (this.config.rating) {\n\t\t\tparams.rating = this.config.rating;\n\t\t}\n\n\t\tif (this.config.lang) {\n\t\t\tparams.lang = this.config.lang;\n\t\t}\n\n\t\treturn params;\n\t}\n\n\tprivate async fetchApi<T = any>(endpoint: string, params?: Record<string, any>): Promise<T> {\n\t\tconst url = new URL(`${this.baseUrl}${endpoint}`);\n\n\t\turl.searchParams.set('api_key', this.apiKey);\n\n\t\tif (params) {\n\t\t\tObject.entries(params).forEach(([k, v]) => url.searchParams.set(k, String(v)));\n\t\t}\n\n\t\tconst res = await fetch(url.toString());\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`Giphy API request failed (${res.status} ${res.statusText})`);\n\t\t}\n\n\t\tconst body: T & { meta?: GiphyMeta } = await res.json();\n\t\tif (!body.meta || !body.meta.response_id) {\n\t\t\tthrow new Error('Giphy API returned a empty response');\n\t\t}\n\n\t\treturn body;\n\t}\n\n\tprivate parseGifs(items: GiphyGif[]): Gif<GiphyGif>[] {\n\t\treturn items\n\t\t\t.map((item) => this.parseGif(item))\n\t\t\t.filter((gif): gif is Gif<GiphyGif> => gif !== null);\n\t}\n\n\tprivate parseGif(item: GiphyGif): Gif<GiphyGif> | null {\n\t\tconst full = item.images.original;\n\t\tconst preview = item.images.fixed_width;\n\n\t\tif (!full || !preview) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\tid: item.id,\n\t\t\timageUrl: full.url,\n\t\t\twidth: Number(full.width),\n\t\t\theight: Number(full.height),\n\t\t\tdescription: item.title,\n\t\t\tpreview: {\n\t\t\t\timageUrl: preview.url,\n\t\t\t\twidth: Number(preview.width),\n\t\t\t\theight: Number(preview.height),\n\t\t\t},\n\t\t\tprovider: GifProviderName.GIPHY,\n\t\t\traw: item,\n\t\t};\n\t}\n}\n","export enum ContentRating {\n\tG = 'g',\n\tPG = 'pg',\n\tPG_13 = 'pg-13',\n\tR = 'r',\n}\n\nexport interface GiphyMediaFormat {\n\turl: string;\n\twidth: string;\n\theight: string;\n\tsize?: string;\n\tmp4?: string;\n\tmp4_size?: string;\n\twebp?: string;\n\twebp_size?: string;\n\tframes?: string;\n\thash?: string;\n}\n\nexport interface GiphyImages {\n\toriginal?: GiphyMediaFormat;\n\tfixed_width?: GiphyMediaFormat;\n\tfixed_height?: GiphyMediaFormat;\n\tdownsized?: GiphyMediaFormat;\n\tpreview_gif?: GiphyMediaFormat;\n\t[key: string]: GiphyMediaFormat | undefined;\n}\n\nexport interface GiphyAnalyticsEvent {\n\turl: string;\n}\n\nexport interface GiphyAnalytics {\n\tonload?: GiphyAnalyticsEvent;\n\tonclick?: GiphyAnalyticsEvent;\n\tonsent?: GiphyAnalyticsEvent;\n}\n\nexport interface GiphyGif {\n\ttype: string;\n\tid: string;\n\tslug: string;\n\turl: string;\n\tbitly_url: string;\n\tbitly_gif_url: string;\n\tembed_url: string;\n\tcontent_url: string;\n\ttitle: string;\n\trating: ContentRating;\n\tusername: string;\n\tsource: string;\n\tsource_tld: string;\n\tsource_post_url: string;\n\tis_sticker: number;\n\timport_datetime: string;\n\ttrending_datetime: string;\n\tuser?: any;\n\timages: GiphyImages;\n\tanalytics?: GiphyAnalytics;\n\tanalytics_response_payload?: string;\n}\n\nexport interface GiphyMeta {\n\tstatus: number;\n\tmsg: string;\n\tresponse_id: string;\n}\n\nexport interface GiphyPagination {\n\ttotal_count: number;\n\tcount: number;\n\toffset: number;\n}\n\nexport interface GiphyListResponse {\n\tdata: GiphyGif[];\n\tpagination: GiphyPagination;\n\tmeta: GiphyMeta;\n}\n\nexport interface GiphyCategory {\n\tname: string;\n\tname_encoded: string;\n\tgif?: GiphyGif;\n\tsubcategories: any[];\n}\n\nexport interface GiphyCategoriesResponse {\n\tdata: GiphyCategory[];\n\tpagination: GiphyPagination;\n\tmeta: GiphyMeta;\n}\n"],"mappings":"yEAAA,2kECAA,63DCsBA,SAAgB,EAAM,EAAgB,EAA2C,CAChF,OAAO,IAAI,EAAc,EAAQ,CAAM,CACxC,CAEA,IAAM,EAAN,KAA2C,CAG1C,YACC,EACA,EAAsC,CAAC,EACtC,CAFO,KAAA,OAAA,EACA,KAAA,OAAA,EAER,KAAK,SAAW,EAAO,SAAW,6BAAU,QAAQ,OAAQ,EAAE,CAC/D,CAEA,MAAa,eAAwC,CACpD,IAAM,EAAiC,CAAC,EAOxC,OANI,KAAK,OAAO,OACf,EAAO,KAAO,KAAK,OAAO,OAKpB,MAFY,KAAK,SAAkC,mBAAoB,CAAM,GAExE,KACV,IAAK,GAAiC,CACtC,IAAM,EAAQ,EAAS,KAAK,QAAQ,aAAa,IAIjD,OAHK,EAGE,CACN,KAAM,EAAS,KACf,WAAY,EAAS,KACrB,SAAU,CACX,EANQ,IAOT,CAAC,EACA,OAAQ,GAAsC,IAAa,IAAI,CAClE,CAEA,MAAa,OAAO,EAA8B,CACjD,IAAM,EAAO,MAAM,KAAK,SAA4B,eAAgB,CACnE,EAAG,EAAK,MAAM,EAAG,EAAsB,EACvC,MAAO,GACP,GAAG,KAAK,YAAY,CACrB,CAAC,EAED,OAAO,KAAK,UAAU,EAAK,IAAI,CAChC,CAEA,MAAa,aAA8B,CAC1C,IAAM,EAAO,MAAM,KAAK,SAA4B,iBAAkB,CACrE,MAAO,GACP,GAAG,KAAK,YAAY,CACrB,CAAC,EAED,OAAO,KAAK,UAAU,EAAK,IAAI,CAChC,CAEA,gBAAgD,CAC/C,MAAO,CACN,kBAAmB,eACnB,SAAU,CACT,KAAMA,EACN,SAAUC,EACV,IAAK,mBACL,KAAM,mBACP,CACD,CACD,CAEA,aAA8C,CAC7C,IAAM,EAAiC,CAAC,EAUxC,OARI,KAAK,OAAO,SACf,EAAO,OAAS,KAAK,OAAO,QAGzB,KAAK,OAAO,OACf,EAAO,KAAO,KAAK,OAAO,MAGpB,CACR,CAEA,MAAc,SAAkB,EAAkB,EAA0C,CAC3F,IAAM,EAAM,IAAI,IAAI,GAAG,KAAK,UAAU,GAAU,EAEhD,EAAI,aAAa,IAAI,UAAW,KAAK,MAAM,EAEvC,GACH,OAAO,QAAQ,CAAM,EAAE,SAAS,CAAC,EAAG,KAAO,EAAI,aAAa,IAAI,EAAG,OAAO,CAAC,CAAC,CAAC,EAG9E,IAAM,EAAM,MAAM,MAAM,EAAI,SAAS,CAAC,EACtC,GAAI,CAAC,EAAI,GACR,MAAU,MAAM,6BAA6B,EAAI,OAAO,GAAG,EAAI,WAAW,EAAE,EAG7E,IAAM,EAAiC,MAAM,EAAI,KAAK,EACtD,GAAI,CAAC,EAAK,MAAQ,CAAC,EAAK,KAAK,YAC5B,MAAU,MAAM,qCAAqC,EAGtD,OAAO,CACR,CAEA,UAAkB,EAAoC,CACrD,OAAO,EACL,IAAK,GAAS,KAAK,SAAS,CAAI,CAAC,EACjC,OAAQ,GAA8B,IAAQ,IAAI,CACrD,CAEA,SAAiB,EAAsC,CACtD,IAAM,EAAO,EAAK,OAAO,SACnB,EAAU,EAAK,OAAO,YAM5B,MAJI,CAAC,GAAQ,CAAC,EACN,KAGD,CACN,GAAI,EAAK,GACT,SAAU,EAAK,IACf,MAAO,OAAO,EAAK,KAAK,EACxB,OAAQ,OAAO,EAAK,MAAM,EAC1B,YAAa,EAAK,MAClB,QAAS,CACR,SAAU,EAAQ,IAClB,MAAO,OAAO,EAAQ,KAAK,EAC3B,OAAQ,OAAO,EAAQ,MAAM,CAC9B,EACA,SAAA,QACA,IAAK,CACN,CACD,CACD,EC3JA,IAAY,EAAL,SAAA,EAAA,OACN,GAAA,EAAA,IACA,EAAA,GAAA,KACA,EAAA,MAAA,QACA,EAAA,EAAA,KACD,EAAA,CAAA,CAAA"}