import type { IGif } from '@giphy/js-types'; import type { WalineEmojiPresets, WalineMeta, WalineSearchOptions, WalineSearchResult, } from '../typings/index.js'; const AVAILABLE_META: WalineMeta[] = ['nick', 'mail', 'link']; export const getMeta = (meta: WalineMeta[]): WalineMeta[] => meta.filter((item) => AVAILABLE_META.includes(item)); export const DEFAULT_EMOJI: WalineEmojiPresets[] = [ '//unpkg.com/@waline/emojis@1.1.0/weibo', ]; export const DEFAULT_REACTION = [ '//unpkg.com/@waline/emojis/tieba/tieba_agree.png', '//unpkg.com/@waline/emojis/tieba/tieba_look_down.png', '//unpkg.com/@waline/emojis/tieba/tieba_sunglasses.png', '//unpkg.com/@waline/emojis/tieba/tieba_pick_nose.png', '//unpkg.com/@waline/emojis/tieba/tieba_awkward.png', '//unpkg.com/@waline/emojis/tieba/tieba_sleep.png', ]; export const defaultUploadImage = (file: File): Promise => new Promise((resolve, reject) => { if (file.size > 128 * 1000) return reject(new Error('File too large! File size limit 128KB')); const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = (): void => resolve(reader.result as string); reader.onerror = reject; }); export const defaultTeXRenderer = (blockMode: boolean): string => blockMode ? '

TeX is not available in preview

' : 'TeX is not available in preview'; export const getDefaultSearchOptions = (lang: string): WalineSearchOptions => { interface GifResult { data: IGif[]; meta: { msg: string; // eslint-disable-next-line @typescript-eslint/naming-convention response_id: string; status: number; }; pagination: { count: number; // eslint-disable-next-line @typescript-eslint/naming-convention total_count: number; offset: number; }; } const fetchGiphy = async ( url: string, params: Record = {}, ): Promise => fetch( `https://api.giphy.com/v1/gifs/${url}?${new URLSearchParams({ lang, limit: '20', rating: 'g', // eslint-disable-next-line @typescript-eslint/naming-convention api_key: '6CIMLkNMMOhRcXPoMCPkFy4Ybk2XUiMp', ...params, }).toString()}`, ) .then((resp) => resp.json() as Promise) .then(({ data }) => data.map((gif) => ({ title: gif.title, src: gif.images.downsized_medium.url, })), ); return { search: (word: string): Promise => fetchGiphy('search', { q: word, offset: '0' }), default: (): Promise => fetchGiphy('trending', {}), more: (word: string, offset = 0): Promise => fetchGiphy('search', { q: word, offset: offset.toString() }), }; };