diff --git a/types/emoji-mart/dist-es/components/category.d.ts b/types/emoji-mart/dist-es/components/category.d.ts new file mode 100644 index 0000000000..8cd4ceefbb --- /dev/null +++ b/types/emoji-mart/dist-es/components/category.d.ts @@ -0,0 +1,20 @@ +import React = require('react'); + +import { EmojiData } from '..'; + +import { Emoji, EmojiProps, I18n } from '.'; + +export interface Props { + emojis?: Array; + hasStickyPosition?: boolean; + name: string; + native: boolean; + perLine: number; + emojiProps: EmojiProps; + recent?: string[]; + i18n: I18n; +} + +export default class Category extends React.Component { + // all methods and properties inside this are most likely intended to be private +} diff --git a/types/emoji-mart/dist-es/components/emoji.d.ts b/types/emoji-mart/dist-es/components/emoji.d.ts new file mode 100644 index 0000000000..030ff7ce12 --- /dev/null +++ b/types/emoji-mart/dist-es/components/emoji.d.ts @@ -0,0 +1,31 @@ +import React = require('react'); + +import { EmojiData, EmojiSkin } from '..'; + +export type BackgroundImageFn = (set: EmojiSet, sheetSize: EmojiSheetSize) => string; +export type EmojiSet = 'apple'|'google'|'twitter'|'emojione'|'messenger'|'facebook'; +export type EmojiSheetSize = 16|20|32|64; + +export interface Props { + onOver?(emoji: EmojiData, e: React.MouseEvent): void; + onLeave?(emoji: EmojiData, e: React.MouseEvent): void; + onClick?(emoji: EmojiData, e: React.MouseEvent): void; + /** defaults to returning a png from unpkg.com-hosted emoji-datasource-${set} */ + backgroundImageFn?: BackgroundImageFn; + native?: boolean; + forceSize?: boolean; + tooltip?: boolean; + /** defaults to 1 */ + skin?: EmojiSkin; + /** defaults to 64 */ + sheetSize?: EmojiSheetSize; + /** defaults to 'apple' */ + set?: EmojiSet; + size: number; + emoji: string|EmojiData; +} + +// tslint:disable-next-line strict-export-declare-modifiers +declare const Emoji: React.SFC; + +export { Emoji as default }; diff --git a/types/emoji-mart/dist-es/components/index.d.ts b/types/emoji-mart/dist-es/components/index.d.ts new file mode 100644 index 0000000000..6fc29ecd54 --- /dev/null +++ b/types/emoji-mart/dist-es/components/index.d.ts @@ -0,0 +1,4 @@ +// The other exports on the components folder are not public API +export { default as Category, Props as CategoryProps } from './category'; +export { default as Emoji, Props as EmojiProps, BackgroundImageFn, EmojiSet, EmojiSheetSize } from './emoji'; +export { default as Picker, Props as PickerProps, I18n, PartialI18n, CustomEmoji } from './picker'; diff --git a/types/emoji-mart/dist-es/components/picker.d.ts b/types/emoji-mart/dist-es/components/picker.d.ts new file mode 100644 index 0000000000..9f9132df05 --- /dev/null +++ b/types/emoji-mart/dist-es/components/picker.d.ts @@ -0,0 +1,54 @@ +import React = require('react'); + +import { EmojiData, EmojiSkin } from '..'; + +import { Category, Emoji, EmojiProps, BackgroundImageFn, EmojiSet, EmojiSheetSize } from '.'; + +// tslint:disable-next-line interface-name +export interface I18n { + search: string; + categories: Record<'search'|'recent'|'people'|'nature'|'foods'|'activity'|'places'|'objects'|'symbols'|'flags'|'custom', string>; + notfound: string; +} + +export type PartialI18n = Partial & { categories: Partial}>; + +export interface CustomEmoji { + // id is overridden by short_names[0] + name: string; + /** Must contain at least one name. The first name is used as the unique id. */ + short_names: string[]; + emoticons?: string[]; + keywords?: string[]; + imageUrl: string; +} + +export interface Props { + /** NOTE: default is not preventable */ + onClick?(emoji: EmojiData, e: React.MouseEvent): void; + perLine?: number; + emojiSize?: number; + i18n?: PartialI18n; + style?: React.CSSProperties; + title?: string; + emoji?: string; + color?: string; + set?: EmojiSet; + skin?: EmojiSkin; + native?: boolean; + backgroundImageFn?: BackgroundImageFn; + sheetSize?: EmojiSheetSize; + emojisToShowFilter?(emoji: EmojiData): boolean; + showPreview?: boolean; + emojiTooltip?: boolean; + include?: string[]; + exclude?: string[]; + recent?: string[]; + autoFocus?: boolean; + /** NOTE: custom emoji are copied into a singleton object on every new mount */ + custom: CustomEmoji[]; +} + +export default class Picker extends React.PureComponent { + // everything inside it is supposed to be private +} diff --git a/types/emoji-mart/dist-es/index.d.ts b/types/emoji-mart/dist-es/index.d.ts new file mode 100644 index 0000000000..e49d37fcf6 --- /dev/null +++ b/types/emoji-mart/dist-es/index.d.ts @@ -0,0 +1,15 @@ +export { default as emojiIndex, EmojiData, EmojiSkin } from './utils/emoji-index'; +export { default as store, StoreHandlers } from './utils/store'; +export { default as frequently } from './utils/frequently'; + +export { + Picker, + PickerProps, + I18n, + PartialI18n, + CustomEmoji, + Emoji, + EmojiProps, + Category, + CategoryProps +} from './components'; diff --git a/types/emoji-mart/dist-es/utils/emoji-index.d.ts b/types/emoji-mart/dist-es/utils/emoji-index.d.ts new file mode 100644 index 0000000000..c6499e663c --- /dev/null +++ b/types/emoji-mart/dist-es/utils/emoji-index.d.ts @@ -0,0 +1,25 @@ +export type EmojiSkin = 1|2|3|4|5|6; + +export interface EmojiData { + id: string; + name: string; + colons: string; + /** Reverse mapping to keyof emoticons */ + emoticons: string[]; + unified: string; + skin: EmojiSkin|null; + native: string; +} + +// tslint:disable-next-line strict-export-declare-modifiers +declare const _default: { + search(query: ''): null + search(query: string): EmojiData|null + + emojis: { [emoji: string]: EmojiData } + + /** Mapping of string to keyof emojis */ + emoticons: { [emoticon: string]: string } +}; + +export { _default as default }; diff --git a/types/emoji-mart/dist-es/utils/frequently.d.ts b/types/emoji-mart/dist-es/utils/frequently.d.ts new file mode 100644 index 0000000000..d2f318de5f --- /dev/null +++ b/types/emoji-mart/dist-es/utils/frequently.d.ts @@ -0,0 +1,9 @@ +import { EmojiData } from '..'; + +// tslint:disable-next-line strict-export-declare-modifiers +declare const _default: { + add(emoji: Pick): void + get(perLine: number): string[] +}; + +export { _default as default }; diff --git a/types/emoji-mart/dist-es/utils/store.d.ts b/types/emoji-mart/dist-es/utils/store.d.ts new file mode 100644 index 0000000000..009284bd7b --- /dev/null +++ b/types/emoji-mart/dist-es/utils/store.d.ts @@ -0,0 +1,15 @@ +export interface StoreHandlers { + getter?(key: string): any; + setter?(key: string, value: any): void; +} + +// tslint:disable-next-line strict-export-declare-modifiers +declare const _default: { + setHandlers(handlers?: StoreHandlers): void + setNamespace(namespace: string): void + update(state: {[key: string]: any}): void + set(key: string, value: any): void + get(key: string): any +}; + +export { _default as default }; diff --git a/types/emoji-mart/emoji-mart-tests.tsx b/types/emoji-mart/emoji-mart-tests.tsx new file mode 100644 index 0000000000..7b7b8d0471 --- /dev/null +++ b/types/emoji-mart/emoji-mart-tests.tsx @@ -0,0 +1,93 @@ +// Port of https://github.com/missive/emoji-mart/blob/master/src/components/emoji.js + +import React = require('react'); + +import { Picker, Emoji, EmojiProps, CustomEmoji } from 'emoji-mart'; + +declare var console: { log(...args: any[]): void; }; + +const CUSTOM_EMOJIS: CustomEmoji[] = [ + { + name: 'Party Parrot', + short_names: ['parrot'], + keywords: ['party'], + imageUrl: 'http://cultofthepartyparrot.com/parrots/hd/parrot.gif' + }, + { + name: 'Octocat', + short_names: ['octocat'], + keywords: ['github'], + imageUrl: 'https://assets-cdn.github.com/images/icons/emoji/octocat.png?v7' + }, + { + name: 'Squirrel', + short_names: ['shipit', 'squirrel'], + keywords: ['github'], + imageUrl: 'https://assets-cdn.github.com/images/icons/emoji/shipit.png?v7' + }, +]; + +interface State { + native: boolean; + set: EmojiProps['set']|'native'; + emoji: string; + title: string; + custom: CustomEmoji[]; +} + +class Example extends React.Component<{}, State> { + readonly state: Readonly = { + native: true, + set: 'apple', + emoji: 'point_up', + title: 'Pick your emoji…', + custom: CUSTOM_EMOJIS + }; + render() { + return ( +
+
+

Emoji Mart 🏬

+
+ +
+ {(['native', 'apple', 'google', 'twitter', 'emojione', 'messenger', 'facebook'] as Array).map((set) => { + const props = { disabled: !this.state.native && set === this.state.set }; + + if (set === 'native' && this.state.native) { + props.disabled = true; + } + + return ( + + ); + })} +
+ +
+ +
+
+ ); + } +} diff --git a/types/emoji-mart/index.d.ts b/types/emoji-mart/index.d.ts new file mode 100644 index 0000000000..1116d6eb6f --- /dev/null +++ b/types/emoji-mart/index.d.ts @@ -0,0 +1,9 @@ +// Type definitions for emoji-mart 2.2 +// Project: https://github.com/missive/emoji-mart +// Definitions by: Diogo Franco +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.4 + +// These definitions should work with 2.3, but the tests doesn't pass on 2.3. + +export * from './dist-es'; diff --git a/types/emoji-mart/tsconfig.json b/types/emoji-mart/tsconfig.json new file mode 100644 index 0000000000..fb776e9a21 --- /dev/null +++ b/types/emoji-mart/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react" + }, + "files": [ + "index.d.ts", + "dist-es/components/category.d.ts", + "dist-es/components/emoji.d.ts", + "dist-es/components/index.d.ts", + "dist-es/components/picker.d.ts", + "dist-es/utils/emoji-index.d.ts", + "dist-es/utils/frequently.d.ts", + "dist-es/utils/store.d.ts", + "dist-es/index.d.ts", + "emoji-mart-tests.tsx" + ] +} diff --git a/types/emoji-mart/tslint.json b/types/emoji-mart/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/emoji-mart/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }