@atlaskit/emoji 64.7.0 → 65.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/dist/cjs/api/EmojiResource.js +250 -87
- package/dist/cjs/api/media/SiteEmojiResource.js +4 -2
- package/dist/cjs/api/media/TokenManager.js +13 -12
- package/dist/cjs/components/common/CachingEmoji.js +21 -3
- package/dist/cjs/components/common/Emoji.js +57 -36
- package/dist/cjs/components/common/EmojiImage.js +99 -0
- package/dist/cjs/components/common/EmojiPlaceholder.js +7 -5
- package/dist/cjs/components/common/RecordSelectionDefault.js +13 -1
- package/dist/cjs/components/common/ResourcedEmoji.js +14 -4
- package/dist/cjs/components/common/ResourcedEmojiComponent.js +173 -156
- package/dist/cjs/components/common/UfoErrorBoundary.js +30 -4
- package/dist/cjs/components/common/UploadEmoji.js +8 -3
- package/dist/cjs/components/common/styles.js +26 -9
- package/dist/cjs/components/picker/EmojiPickerComponent.js +27 -9
- package/dist/cjs/components/picker/EmojiPickerFooter.js +2 -0
- package/dist/cjs/components/picker/styles.js +16 -13
- package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +18 -2
- package/dist/cjs/components/uploader/EmojiUploadComponent.js +7 -2
- package/dist/cjs/context/EmojiContextProvider.js +33 -0
- package/dist/cjs/hooks/index.js +16 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/util/analytics/samplingUfo.js +13 -3
- package/dist/cjs/util/analytics/ufoExperiences.js +22 -4
- package/dist/cjs/util/analytics/useSampledUFOComponentExperience.js +2 -1
- package/dist/cjs/util/browser-support.js +1 -1
- package/dist/cjs/util/constants.js +6 -5
- package/dist/cjs/util/useInView.js +23 -0
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/api/EmojiResource.js +117 -37
- package/dist/es2019/api/media/SiteEmojiResource.js +2 -2
- package/dist/es2019/api/media/TokenManager.js +12 -12
- package/dist/es2019/components/common/CachingEmoji.js +20 -3
- package/dist/es2019/components/common/Emoji.js +53 -34
- package/dist/es2019/components/common/EmojiImage.js +74 -0
- package/dist/es2019/components/common/EmojiPlaceholder.js +7 -5
- package/dist/es2019/components/common/RecordSelectionDefault.js +13 -1
- package/dist/es2019/components/common/ResourcedEmoji.js +15 -5
- package/dist/es2019/components/common/ResourcedEmojiComponent.js +136 -105
- package/dist/es2019/components/common/UfoErrorBoundary.js +14 -2
- package/dist/es2019/components/common/UploadEmoji.js +8 -3
- package/dist/es2019/components/common/styles.js +30 -9
- package/dist/es2019/components/picker/EmojiPickerComponent.js +27 -8
- package/dist/es2019/components/picker/EmojiPickerFooter.js +2 -0
- package/dist/es2019/components/picker/styles.js +16 -14
- package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +18 -2
- package/dist/es2019/components/uploader/EmojiUploadComponent.js +7 -2
- package/dist/es2019/context/EmojiContextProvider.js +9 -1
- package/dist/es2019/hooks/index.js +8 -0
- package/dist/es2019/index.js +5 -4
- package/dist/es2019/types.js +3 -0
- package/dist/es2019/util/analytics/samplingUfo.js +11 -1
- package/dist/es2019/util/analytics/ufoExperiences.js +12 -2
- package/dist/es2019/util/analytics/useSampledUFOComponentExperience.js +2 -1
- package/dist/es2019/util/browser-support.js +1 -1
- package/dist/es2019/util/constants.js +3 -2
- package/dist/es2019/util/useInView.js +12 -0
- package/dist/es2019/version.json +1 -1
- package/dist/esm/api/EmojiResource.js +257 -89
- package/dist/esm/api/media/SiteEmojiResource.js +5 -3
- package/dist/esm/api/media/TokenManager.js +13 -12
- package/dist/esm/components/common/CachingEmoji.js +20 -3
- package/dist/esm/components/common/Emoji.js +59 -38
- package/dist/esm/components/common/EmojiImage.js +84 -0
- package/dist/esm/components/common/EmojiPlaceholder.js +8 -5
- package/dist/esm/components/common/RecordSelectionDefault.js +13 -1
- package/dist/esm/components/common/ResourcedEmoji.js +15 -5
- package/dist/esm/components/common/ResourcedEmojiComponent.js +167 -156
- package/dist/esm/components/common/UfoErrorBoundary.js +30 -4
- package/dist/esm/components/common/UploadEmoji.js +8 -3
- package/dist/esm/components/common/styles.js +25 -10
- package/dist/esm/components/picker/EmojiPickerComponent.js +27 -8
- package/dist/esm/components/picker/EmojiPickerFooter.js +2 -0
- package/dist/esm/components/picker/styles.js +16 -14
- package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +18 -2
- package/dist/esm/components/uploader/EmojiUploadComponent.js +7 -2
- package/dist/esm/context/EmojiContextProvider.js +30 -1
- package/dist/esm/hooks/index.js +8 -0
- package/dist/esm/index.js +5 -4
- package/dist/esm/types.js +3 -0
- package/dist/esm/util/analytics/samplingUfo.js +13 -2
- package/dist/esm/util/analytics/ufoExperiences.js +14 -2
- package/dist/esm/util/analytics/useSampledUFOComponentExperience.js +2 -1
- package/dist/esm/util/browser-support.js +1 -1
- package/dist/esm/util/constants.js +3 -2
- package/dist/esm/util/useInView.js +12 -0
- package/dist/esm/version.json +1 -1
- package/dist/types/api/EmojiResource.d.ts +19 -2
- package/dist/types/api/EmojiUtils.d.ts +7 -1
- package/dist/types/api/media/SiteEmojiResource.d.ts +1 -1
- package/dist/types/api/media/TokenManager.d.ts +1 -0
- package/dist/types/components/common/Emoji.d.ts +0 -1
- package/dist/types/components/common/EmojiImage.d.ts +13 -0
- package/dist/types/components/common/EmojiPlaceholder.d.ts +1 -0
- package/dist/types/components/common/LoadingEmojiComponent.d.ts +7 -4
- package/dist/types/components/common/ResourcedEmoji.d.ts +3 -3
- package/dist/types/components/common/ResourcedEmojiComponent.d.ts +41 -20
- package/dist/types/components/common/UfoErrorBoundary.d.ts +2 -2
- package/dist/types/components/common/UploadEmoji.d.ts +1 -1
- package/dist/types/components/common/styles.d.ts +1 -0
- package/dist/types/components/picker/EmojiPicker.d.ts +9 -0
- package/dist/types/components/picker/EmojiPickerComponent.d.ts +14 -0
- package/dist/types/components/picker/EmojiPickerFooter.d.ts +1 -0
- package/dist/types/components/picker/styles.d.ts +1 -1
- package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +18 -0
- package/dist/types/hooks/index.d.ts +1 -0
- package/dist/types/index.d.ts +5 -4
- package/dist/types/types.d.ts +14 -2
- package/dist/types/util/analytics/index.d.ts +1 -1
- package/dist/types/util/analytics/samplingUfo.d.ts +6 -6
- package/dist/types/util/analytics/ufoExperiences.d.ts +5 -2
- package/dist/types/util/constants.d.ts +2 -1
- package/dist/types/util/useInView.d.ts +4 -0
- package/docs/0-intro.tsx +35 -27
- package/docs/1-resourced-emoji.tsx +74 -0
- package/docs/2-emoji-picker.tsx +56 -0
- package/docs/3-typeahead.tsx +20 -0
- package/docs/4-emoji-provider.tsx +98 -0
- package/local-config-example.ts +22 -1
- package/package.json +4 -4
- package/report.api.md +1287 -0
|
@@ -6,14 +6,32 @@ export interface OnLifecycle {
|
|
|
6
6
|
(): void;
|
|
7
7
|
}
|
|
8
8
|
export interface EmojiTypeAheadBaseProps {
|
|
9
|
+
/**
|
|
10
|
+
* Callback to be executed when user selects an emoji.
|
|
11
|
+
*/
|
|
9
12
|
onSelection?: OnEmojiEvent;
|
|
13
|
+
/**
|
|
14
|
+
* Search query.
|
|
15
|
+
*/
|
|
10
16
|
query?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Number of results to be displayed in the search results list
|
|
19
|
+
*/
|
|
11
20
|
listLimit?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Callback to be executed when typeahead component is being shown
|
|
23
|
+
*/
|
|
12
24
|
onOpen?: OnLifecycle;
|
|
25
|
+
/**
|
|
26
|
+
* Callback to be executed when typeahead component disappears
|
|
27
|
+
*/
|
|
13
28
|
onClose?: OnLifecycle;
|
|
14
29
|
createAnalyticsEvent?: CreateUIAnalyticsEvent;
|
|
15
30
|
}
|
|
16
31
|
export interface Props extends EmojiTypeAheadBaseProps {
|
|
32
|
+
/**
|
|
33
|
+
* EmojiResource instance that handles fetching of emoji data.
|
|
34
|
+
*/
|
|
17
35
|
emojiProvider: EmojiProvider;
|
|
18
36
|
}
|
|
19
37
|
export interface State {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function usePrevious<T>(value: T | null | undefined): T | null | undefined;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -6,17 +6,18 @@ import EmojiPicker from './components/picker/EmojiPicker';
|
|
|
6
6
|
import EmojiUploader from './components/uploader/EmojiUploader';
|
|
7
7
|
import EmojiTypeAhead from './components/typeahead/EmojiTypeAhead';
|
|
8
8
|
import EmojiTypeAheadItem from './components/typeahead/EmojiTypeAheadItem';
|
|
9
|
-
|
|
9
|
+
import { EmojiImage } from './components/common/EmojiImage';
|
|
10
|
+
export { commonSelectedStyles as selected, selectOnHoverStyles as selectOnHover, emojiSprite, emojiNodeStyles as emojiNode, emojiImage, placeholder as emojiPlaceholder, } from './components/common/styles';
|
|
10
11
|
import EmojiResource, { EmojiProvider, UploadingEmojiProvider, EmojiResourceConfig } from './api/EmojiResource';
|
|
11
12
|
import EmojiRepository from './api/EmojiRepository';
|
|
12
13
|
import EmojiLoader from './api/EmojiLoader';
|
|
13
14
|
import { denormaliseEmojiServiceResponse } from './api/EmojiUtils';
|
|
14
15
|
import { toEmojiId, toOptionalEmojiId } from './util/type-helpers';
|
|
15
|
-
import { recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences } from './util/analytics';
|
|
16
|
+
import { recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, withSampling, WithSamplingUFOExperience } from './util/analytics';
|
|
16
17
|
import { customCategory, defaultEmojiHeight, emojiPickerWidth, emojiPickerHeight } from './util/constants';
|
|
17
18
|
import { UsageFrequencyTracker } from './api/internal/UsageFrequencyTracker';
|
|
18
|
-
export { AbstractResource, Emoji, EmojiPlaceholder, EmojiLoader, EmojiPicker, EmojiUploader, EmojiResource, EmojiRepository, EmojiTypeAhead, ResourcedEmoji, denormaliseEmojiServiceResponse, toEmojiId, toOptionalEmojiId, recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, emojiPickerWidth, emojiPickerHeight, defaultEmojiHeight, customCategory, UsageFrequencyTracker, EmojiTypeAheadItem, };
|
|
19
|
-
export type { EmojiProvider, UploadingEmojiProvider, EmojiResourceConfig, };
|
|
19
|
+
export { AbstractResource, Emoji, EmojiPlaceholder, EmojiLoader, EmojiPicker, EmojiUploader, EmojiResource, EmojiRepository, EmojiTypeAhead, EmojiImage, ResourcedEmoji, denormaliseEmojiServiceResponse, toEmojiId, toOptionalEmojiId, recordSelectionFailedSli, recordSelectionSucceededSli, ufoExperiences, withSampling, emojiPickerWidth, emojiPickerHeight, defaultEmojiHeight, customCategory, UsageFrequencyTracker, EmojiTypeAheadItem, };
|
|
20
|
+
export type { EmojiProvider, UploadingEmojiProvider, EmojiResourceConfig, WithSamplingUFOExperience, };
|
|
20
21
|
export { SearchSort, UfoExperienceName, UfoComponentName, } from './types';
|
|
21
22
|
export type { CategoryId, EmojiRepresentation, EmojiServiceRepresentation, Message, OptionalEmojiDescription, OptionalEmojiDescriptionWithVariations, OptionalUser, RelativePosition, ToneSelection, AltRepresentations, CategoryDescription, EmojiDescription, EmojiDescriptionWithVariations, EmojiId, EmojiImageRepresentation, EmojiMeta, EmojiResponse, EmojiSearchResult, EmojiServiceDescription, EmojiServiceDescriptionWithVariations, EmojiServiceResponse, EmojiUpload, EmojiVariationDescription, ImageRepresentation, MediaApiRepresentation, MediaApiToken, OnCategory, OnEmojiEvent, OnToneSelected, OnToneSelectorCancelled, SearchOptions, SpriteImageRepresentation, SpriteRepresentation, SpriteServiceRepresentation, SpriteSheet, SpriteSheets, Styles, User, } from './types';
|
|
22
23
|
export default EmojiPicker;
|
package/dist/types/types.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { SyntheticEvent } from 'react';
|
|
|
2
2
|
import { messages } from './components/i18n';
|
|
3
3
|
import { CategoryId } from './components/picker/categories';
|
|
4
4
|
import { Provider } from '@atlaskit/util-service-support/types';
|
|
5
|
+
import { EmojiRepository } from './resource';
|
|
5
6
|
export type { CategoryId } from './components/picker/categories';
|
|
6
7
|
export interface EmojiProvider extends Provider<string, EmojiSearchResult, any, undefined, SearchOptions> {
|
|
7
8
|
/**
|
|
@@ -106,6 +107,14 @@ export interface EmojiProvider extends Provider<string, EmojiSearchResult, any,
|
|
|
106
107
|
* Returns the logged user passed by the Product
|
|
107
108
|
*/
|
|
108
109
|
getCurrentUser(): OptionalUser;
|
|
110
|
+
/**
|
|
111
|
+
* Fetches and returns emojiResource
|
|
112
|
+
*/
|
|
113
|
+
fetchEmojiProvider(force?: boolean): Promise<EmojiRepository | undefined>;
|
|
114
|
+
/**
|
|
115
|
+
* Returns a constructed URL to fetch emoji media asset if 'optimisticImageApi' config has been provided
|
|
116
|
+
*/
|
|
117
|
+
getOptimisticImageURL(emojiId: EmojiId): string | undefined;
|
|
109
118
|
}
|
|
110
119
|
export interface UploadingEmojiProvider extends EmojiProvider {
|
|
111
120
|
/**
|
|
@@ -121,7 +130,7 @@ export interface UploadingEmojiProvider extends EmojiProvider {
|
|
|
121
130
|
*
|
|
122
131
|
* The last search will be re-run to ensure the new emoji is considered in the search.
|
|
123
132
|
*/
|
|
124
|
-
uploadCustomEmoji(upload: EmojiUpload): Promise<EmojiDescription>;
|
|
133
|
+
uploadCustomEmoji(upload: EmojiUpload, retry?: boolean): Promise<EmojiDescription>;
|
|
125
134
|
/**
|
|
126
135
|
* Allows the preloading of data (e.g. authentication tokens) to speed the uploading of emoji.
|
|
127
136
|
*/
|
|
@@ -306,7 +315,8 @@ export declare enum ProviderTypes {
|
|
|
306
315
|
SITE = "SITE",
|
|
307
316
|
STANDARD = "STANDARD",
|
|
308
317
|
ATLASSIAN = "ATLASSIAN",
|
|
309
|
-
UNKNOWN = "UNKNOWN"
|
|
318
|
+
UNKNOWN = "UNKNOWN",
|
|
319
|
+
SINGLE = "SINGLE"
|
|
310
320
|
}
|
|
311
321
|
export declare enum UfoExperienceName {
|
|
312
322
|
EMOJI_RENDERED = "emoji-rendered",
|
|
@@ -322,12 +332,14 @@ export declare enum UfoComponentName {
|
|
|
322
332
|
EMOJI_PROVIDER = "emoji-provider"
|
|
323
333
|
}
|
|
324
334
|
export declare enum UfoEmojiTimingsKeys {
|
|
335
|
+
FMP = "fmp",
|
|
325
336
|
MOUNTED = "emoji-mount",
|
|
326
337
|
METADATA = "emoji-metadata",
|
|
327
338
|
MEDIADATA = "emoji-media",
|
|
328
339
|
ONLOAD = "emoji-onload"
|
|
329
340
|
}
|
|
330
341
|
export declare enum UfoEmojiTimings {
|
|
342
|
+
FMP_END = "fmp",
|
|
331
343
|
MOUNTED_END = "emoji-mount_end",
|
|
332
344
|
METADATA_START = "emoji-metadata_start",
|
|
333
345
|
METADATA_END = "emoji-metadata_end",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { ufoExperiencesSampled, clearSampled, isExperienceSampled, withSampling, } from './samplingUfo';
|
|
2
|
-
export type { UFOExperienceSampledRecords,
|
|
2
|
+
export type { UFOExperienceSampledRecords, WithSamplingUFOExperience, } from './samplingUfo';
|
|
3
3
|
export { categoryClickedEvent, createAndFireEventInElementsChannel, closedPickerEvent, deleteBeginEvent, deleteCancelEvent, deleteConfirmEvent, recordFailed, recordSucceeded, openedPickerEvent, pickerClickedEvent, pickerSearchedEvent, recordSelectionFailedSli, recordSelectionSucceededSli, selectedFileEvent, toneSelectedEvent, toneSelectorClosedEvent, toneSelectorOpenedEvent, typeaheadCancelledEvent, typeaheadRenderedEvent, typeaheadSelectedEvent, uploadBeginButton, uploadCancelButton, uploadConfirmButton, uploadFailedEvent, uploadSucceededEvent, } from './analytics';
|
|
4
4
|
export { sampledUfoRenderedEmoji, ufoExperiences } from './ufoExperiences';
|
|
5
5
|
export type { EmojiInsertionAnalytic } from './analytics';
|
|
@@ -9,17 +9,17 @@ interface UFOExperienceSampledRecord {
|
|
|
9
9
|
sampledInstance: SamplingInstancesRecord;
|
|
10
10
|
sampled: boolean;
|
|
11
11
|
}
|
|
12
|
-
export
|
|
13
|
-
declare type SamplingFunc = (rate: number) => boolean;
|
|
14
|
-
export declare const clearSampled: () => void;
|
|
15
|
-
export declare const isExperienceSampled: (rate: number) => boolean;
|
|
16
|
-
export interface WithSampling extends Omit<UFOExperience, 'start'> {
|
|
12
|
+
export interface WithSamplingUFOExperience extends Omit<UFOExperience, 'start'> {
|
|
17
13
|
start: (options: {
|
|
18
14
|
samplingRate: number;
|
|
19
15
|
samplingFunc?: SamplingFunc;
|
|
20
16
|
startTime?: number;
|
|
21
17
|
}) => Promise<void>;
|
|
22
18
|
}
|
|
19
|
+
export declare const ufoExperiencesSampled: UFOExperienceSampledRecords;
|
|
20
|
+
declare type SamplingFunc = (rate: number) => boolean;
|
|
21
|
+
export declare const clearSampled: () => void;
|
|
22
|
+
export declare const isExperienceSampled: (rate: number) => boolean;
|
|
23
23
|
/**
|
|
24
24
|
* This function is a temp solution to reduce the event traffic, as UFO package does not support it.
|
|
25
25
|
*
|
|
@@ -27,5 +27,5 @@ export interface WithSampling extends Omit<UFOExperience, 'start'> {
|
|
|
27
27
|
* @param ufoExperience
|
|
28
28
|
* @returns
|
|
29
29
|
*/
|
|
30
|
-
export declare const withSampling: (ufoExperience: UFOExperience) =>
|
|
30
|
+
export declare const withSampling: (ufoExperience: UFOExperience) => WithSamplingUFOExperience;
|
|
31
31
|
export {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { EmojiId } from '../../types';
|
|
1
|
+
import { EmojiId, ProviderTypes } from '../../types';
|
|
2
2
|
import { ConcurrentExperience, UFOExperience } from '@atlaskit/ufo';
|
|
3
|
+
import { WithSamplingUFOExperience } from './samplingUfo';
|
|
3
4
|
export declare const ufoExperiences: {
|
|
4
5
|
'emoji-rendered': ConcurrentExperience;
|
|
5
6
|
'emoji-resource-fetched': ConcurrentExperience;
|
|
@@ -8,4 +9,6 @@ export declare const ufoExperiences: {
|
|
|
8
9
|
'emoji-uploaded': UFOExperience;
|
|
9
10
|
'emoji-searched': UFOExperience;
|
|
10
11
|
};
|
|
11
|
-
export declare const sampledUfoRenderedEmoji: (emojiId: EmojiId) =>
|
|
12
|
+
export declare const sampledUfoRenderedEmoji: (emojiId: EmojiId) => WithSamplingUFOExperience;
|
|
13
|
+
export declare const hasUfoMarked: (ufoExperience: UFOExperience | WithSamplingUFOExperience, name: string) => boolean;
|
|
14
|
+
export declare const sampledUfoEmojiResourceFetched: (providerType: ProviderTypes) => WithSamplingUFOExperience;
|
|
@@ -14,6 +14,7 @@ export declare const MAX_ORDINAL = 100000;
|
|
|
14
14
|
export declare const defaultEmojiHeight = 20;
|
|
15
15
|
export declare const emojiPickerWidth = 350;
|
|
16
16
|
export declare const emojiPickerHeight = 295;
|
|
17
|
+
export declare const emojiPickerHeightWithPreview = 348;
|
|
17
18
|
export declare const localStoragePrefix = "fabric.emoji";
|
|
18
19
|
export declare const selectedToneStorageKey: string;
|
|
19
20
|
export declare const defaultCategories: CategoryId[];
|
|
@@ -21,4 +22,4 @@ export declare const defaultListLimit = 50;
|
|
|
21
22
|
export declare const migrationUserId = "hipchat_migration_emoticons";
|
|
22
23
|
export declare const analyticsEmojiPrefix = "atlassian.fabric.emoji.picker";
|
|
23
24
|
export declare const SAMPLING_RATE_EMOJI_RENDERED_EXP = 0.05;
|
|
24
|
-
export declare const
|
|
25
|
+
export declare const SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = 0.01;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { IntersectionOptions } from 'react-intersection-observer';
|
|
2
|
+
declare type InViewHookNotSupportedResponse = [undefined, boolean];
|
|
3
|
+
export declare const useInView: (options?: IntersectionOptions | undefined) => InViewHookNotSupportedResponse | import("react-intersection-observer").InViewHookResponse;
|
|
4
|
+
export {};
|
package/docs/0-intro.tsx
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import {
|
|
3
|
+
md,
|
|
4
|
+
Example,
|
|
5
|
+
code,
|
|
6
|
+
AtlassianInternalWarning,
|
|
7
|
+
Props,
|
|
8
|
+
} from '@atlaskit/docs';
|
|
9
|
+
import SectionMessage from '@atlaskit/section-message';
|
|
6
10
|
import SimpleEmojiExample from '../examples/00-simple-emoji';
|
|
7
11
|
|
|
8
12
|
const SimpleEmojiSource = require('!!raw-loader!../examples/00-simple-emoji');
|
|
13
|
+
const EmojiProps = require('!!extract-react-types-loader!../src/components/common/Emoji');
|
|
9
14
|
|
|
10
15
|
export default md`
|
|
11
16
|
${(<AtlassianInternalWarning />)}
|
|
@@ -20,9 +25,9 @@ export default md`
|
|
|
20
25
|
|
|
21
26
|
${code`
|
|
22
27
|
import EmojiPicker from '@atlaskit/emoji/picker';
|
|
23
|
-
import { EmojiResource } from '@atlaskit/emoji/resource';
|
|
28
|
+
import { EmojiResource, EmojiResourceConfig } from '@atlaskit/emoji/resource';
|
|
24
29
|
|
|
25
|
-
const
|
|
30
|
+
const config: EmojiResourceConfig = {
|
|
26
31
|
providers: [
|
|
27
32
|
{
|
|
28
33
|
url: 'https://emoji-example/emoji/standard',
|
|
@@ -36,7 +41,9 @@ export default md`
|
|
|
36
41
|
}),
|
|
37
42
|
},
|
|
38
43
|
],
|
|
39
|
-
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const emojiProvider = new EmojiResource(config);
|
|
40
47
|
|
|
41
48
|
ReactDOM.render(
|
|
42
49
|
<EmojiPicker
|
|
@@ -46,7 +53,25 @@ export default md`
|
|
|
46
53
|
}}
|
|
47
54
|
/>,
|
|
48
55
|
container,
|
|
49
|
-
)
|
|
56
|
+
);
|
|
57
|
+
`}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
${(
|
|
62
|
+
<>
|
|
63
|
+
<br />
|
|
64
|
+
<SectionMessage
|
|
65
|
+
appearance="warning"
|
|
66
|
+
title="Emoji provider is required to be configured in order to use components from this package."
|
|
67
|
+
>
|
|
68
|
+
<p>
|
|
69
|
+
Please refer to `Emoji picker` section for more information on how to
|
|
70
|
+
configure emoji provider.
|
|
71
|
+
</p>
|
|
72
|
+
</SectionMessage>
|
|
73
|
+
</>
|
|
74
|
+
)}
|
|
50
75
|
|
|
51
76
|
### Other emoji components import examples
|
|
52
77
|
|
|
@@ -75,27 +100,10 @@ export default md`
|
|
|
75
100
|
<Example
|
|
76
101
|
packageName="@atlaskit/emoji"
|
|
77
102
|
Component={SimpleEmojiExample}
|
|
78
|
-
title="Emoji"
|
|
103
|
+
title=" Simple Emoji"
|
|
79
104
|
source={SimpleEmojiSource}
|
|
80
105
|
/>
|
|
81
106
|
)}
|
|
82
107
|
|
|
83
|
-
${(
|
|
84
|
-
<SectionMessage
|
|
85
|
-
appearance="warning"
|
|
86
|
-
title="Props can not be displayed for the time being."
|
|
87
|
-
actions={[
|
|
88
|
-
{
|
|
89
|
-
key: '1',
|
|
90
|
-
href:
|
|
91
|
-
'https://bitbucket.org/atlassian/atlaskit-mk-2/src/master/packages/elements/emoji/src/components/common/Emoji.tsx',
|
|
92
|
-
text: 'Emoji Props',
|
|
93
|
-
},
|
|
94
|
-
].map(({ text, ...restAction }) => (
|
|
95
|
-
<SectionMessageAction {...restAction}>{text}</SectionMessageAction>
|
|
96
|
-
))}
|
|
97
|
-
>
|
|
98
|
-
<p>You can still find props in the source code.</p>
|
|
99
|
-
</SectionMessage>
|
|
100
|
-
)}
|
|
108
|
+
${(<Props props={EmojiProps} />)}
|
|
101
109
|
`;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { md, Example, code, Props } from '@atlaskit/docs';
|
|
3
|
+
import ResourcedEmojiExample from '../examples/23-optimistic-emoji';
|
|
4
|
+
|
|
5
|
+
const ResourcedEmojiSource = require('!!raw-loader!../examples/23-optimistic-emoji');
|
|
6
|
+
const ResourcedEmojiProps = require('!!extract-react-types-loader!../src/components/common/ResourcedEmojiComponent');
|
|
7
|
+
|
|
8
|
+
export default md`
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
Import the component in your React app as follows:
|
|
12
|
+
|
|
13
|
+
${code`
|
|
14
|
+
import { ResourcedEmoji } from '@atlaskit/emoji';
|
|
15
|
+
import { EmojiResource, EmojiResourceConfig } from '@atlaskit/emoji/resource';
|
|
16
|
+
|
|
17
|
+
const config: EmojiResourceConfig = {
|
|
18
|
+
singleEmojiApi: {
|
|
19
|
+
getUrl: (emojiId: string) => 'https://emoji-example/emoji/site-id/emojiId',
|
|
20
|
+
securityProvider: () => ({
|
|
21
|
+
headers: {
|
|
22
|
+
'User-Context': '{{token}}',
|
|
23
|
+
Authorization: 'Bearer {{token}}',
|
|
24
|
+
},
|
|
25
|
+
})
|
|
26
|
+
},
|
|
27
|
+
optimisticImageApi: {
|
|
28
|
+
getUrl: (emojiId: string) => 'https://emoji-example/emoji/site-id/emojiId/path',
|
|
29
|
+
securityProvider: () => ({
|
|
30
|
+
headers: {
|
|
31
|
+
'User-Context': '{{token}}',
|
|
32
|
+
Authorization: 'Bearer {{token}}',
|
|
33
|
+
},
|
|
34
|
+
})
|
|
35
|
+
},
|
|
36
|
+
providers: [
|
|
37
|
+
{
|
|
38
|
+
url: 'https://emoji-example/emoji/standard',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
url: 'https://emoji-example/emoji/site-id/site',
|
|
42
|
+
securityProvider: () => ({
|
|
43
|
+
headers: {
|
|
44
|
+
Authorization: 'Bearer {{token}}',
|
|
45
|
+
},
|
|
46
|
+
}),
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const emojiProvider = new EmojiResource(config);
|
|
52
|
+
const emojiId = { shortName: ':grimacing:', id: '1f603' };
|
|
53
|
+
|
|
54
|
+
ReactDOM.render(
|
|
55
|
+
<ResourcedEmoji
|
|
56
|
+
emojiId={emojiId}
|
|
57
|
+
emojiProvider={emojiProvider}
|
|
58
|
+
optimistic
|
|
59
|
+
optimisticImageURL={emojiProvider.getOptimisticImageURL(emojiId)}
|
|
60
|
+
/>,
|
|
61
|
+
container,
|
|
62
|
+
);`}
|
|
63
|
+
|
|
64
|
+
${(
|
|
65
|
+
<Example
|
|
66
|
+
packageName="@atlaskit/emoji"
|
|
67
|
+
Component={ResourcedEmojiExample}
|
|
68
|
+
title="Resourced Emoji"
|
|
69
|
+
source={ResourcedEmojiSource}
|
|
70
|
+
/>
|
|
71
|
+
)}
|
|
72
|
+
|
|
73
|
+
${(<Props props={ResourcedEmojiProps} />)}
|
|
74
|
+
`;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { md, Example, code, Props } from '@atlaskit/docs';
|
|
3
|
+
import EmojiPickerExample from '../examples/05-standard-emoji-picker-with-upload';
|
|
4
|
+
|
|
5
|
+
const EmojiPickerSource = require('!!raw-loader!../examples/05-standard-emoji-picker-with-upload');
|
|
6
|
+
const EmojiPickerProps = require('!!extract-react-types-loader!../src/components/picker/EmojiPickerComponent');
|
|
7
|
+
|
|
8
|
+
export default md`
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
Import the component in your React app as follows:
|
|
12
|
+
|
|
13
|
+
${code`
|
|
14
|
+
import EmojiPicker from '@atlaskit/emoji/picker';
|
|
15
|
+
import { EmojiResource, EmojiResourceConfig } from '@atlaskit/emoji/resource';
|
|
16
|
+
|
|
17
|
+
const config: EmojiResourceConfig = {
|
|
18
|
+
providers: [
|
|
19
|
+
{
|
|
20
|
+
url: 'https://emoji-example/emoji/standard',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
url: 'https://emoji-example/emoji/site-id/site',
|
|
24
|
+
securityProvider: () => ({
|
|
25
|
+
headers: {
|
|
26
|
+
Authorization: 'Bearer token',
|
|
27
|
+
},
|
|
28
|
+
}),
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const emojiProvider = new EmojiResource(config);
|
|
34
|
+
|
|
35
|
+
ReactDOM.render(
|
|
36
|
+
<EmojiPicker
|
|
37
|
+
emojiProvider={emojiProvider}
|
|
38
|
+
onSelection={emoji => {
|
|
39
|
+
/* do something */
|
|
40
|
+
}}
|
|
41
|
+
/>,
|
|
42
|
+
container,
|
|
43
|
+
);
|
|
44
|
+
`}
|
|
45
|
+
|
|
46
|
+
${(
|
|
47
|
+
<Example
|
|
48
|
+
packageName="@atlaskit/emoji"
|
|
49
|
+
Component={EmojiPickerExample}
|
|
50
|
+
title="Emoji Picker"
|
|
51
|
+
source={EmojiPickerSource}
|
|
52
|
+
/>
|
|
53
|
+
)}
|
|
54
|
+
|
|
55
|
+
${(<Props props={EmojiPickerProps} />)}
|
|
56
|
+
`;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { md, Example, Props } from '@atlaskit/docs';
|
|
3
|
+
import TypeAheadiExample from '../examples/03-standard-emoji-typeahead';
|
|
4
|
+
|
|
5
|
+
const TypeAheadSource = require('!!raw-loader!../examples/03-standard-emoji-typeahead');
|
|
6
|
+
const TypeAheadProps = require('!!extract-react-types-loader!../src/components/typeahead/EmojiTypeAheadComponent');
|
|
7
|
+
|
|
8
|
+
export default md`
|
|
9
|
+
|
|
10
|
+
${(
|
|
11
|
+
<Example
|
|
12
|
+
packageName="@atlaskit/emoji"
|
|
13
|
+
Component={TypeAheadiExample}
|
|
14
|
+
title="Typeahead"
|
|
15
|
+
source={TypeAheadSource}
|
|
16
|
+
/>
|
|
17
|
+
)}
|
|
18
|
+
|
|
19
|
+
${(<Props props={TypeAheadProps} />)}
|
|
20
|
+
`;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { md, code } from '@atlaskit/docs';
|
|
3
|
+
import SectionMessage from '@atlaskit/section-message';
|
|
4
|
+
|
|
5
|
+
export default md`
|
|
6
|
+
Emoji provider mainly controls what type of emojis you want to support, how to resolve emojis, and how to upload custom emojis if enabled.
|
|
7
|
+
|
|
8
|
+
This is a basic example of emoji provider, supporting standard, atlassian, and site emojis:
|
|
9
|
+
|
|
10
|
+
${code`
|
|
11
|
+
const emojiProvider = new EmojiResource({
|
|
12
|
+
providers: [
|
|
13
|
+
{
|
|
14
|
+
url: '/gateway/emoji/standard',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
url: '/gateway/emoji/atlassian',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
url: '/gateway/emoji/{cloudId}/site',
|
|
21
|
+
securityProvider: () => ({ headers: { Authorization: 'Bearer token' }}), // not needed if session token cookie is available.
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
allowUpload: true,
|
|
25
|
+
currentUser: { id: { uid } }
|
|
26
|
+
});`}
|
|
27
|
+
|
|
28
|
+
${(
|
|
29
|
+
<>
|
|
30
|
+
<br />
|
|
31
|
+
<SectionMessage
|
|
32
|
+
appearance="warning"
|
|
33
|
+
title="There should be only one instance of EmojiResource in your application"
|
|
34
|
+
>
|
|
35
|
+
<p>Make sure EmojiResource is initialised only once.</p>
|
|
36
|
+
</SectionMessage>
|
|
37
|
+
</>
|
|
38
|
+
)}
|
|
39
|
+
|
|
40
|
+
The emoji provider plays a vital role to glue with our backend emoji service. Emoji metadata is fetched based on the url defined in providers array.
|
|
41
|
+
After a successful fetch the emoji resource holds emoji data for rendering emoji in picker, single emoji or the typeahead component.
|
|
42
|
+
Uploading and rendering site specific emojis is only available for Atlassian services.
|
|
43
|
+
|
|
44
|
+
Initialising EmojiResource doesn't fetch emoji data on initialization. If EmojiResource is being passed into ResourcedEmoji, EmojiPicker or Typeahead no further action is required.
|
|
45
|
+
Emoji meta data will be fetched on first component render. If EmojiResource is being used outside of the context of the above components, fetching meta data requires to be triggered manually.
|
|
46
|
+
|
|
47
|
+
${code`
|
|
48
|
+
const emojiProvider = new EmojiResource(emojiConfig);
|
|
49
|
+
emojiProvider.fetchEmojiProvider();
|
|
50
|
+
`}
|
|
51
|
+
|
|
52
|
+
### Configuration options
|
|
53
|
+
|
|
54
|
+
${code`
|
|
55
|
+
interface EmojiResourceConfig {
|
|
56
|
+
/**
|
|
57
|
+
* The service configuration for remotely recording emoji selections.
|
|
58
|
+
* A post will be performed to this URL with the EmojiId as the body.
|
|
59
|
+
*/
|
|
60
|
+
recordConfig?: ServiceConfig;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* This defines the different providers. Later providers will override earlier
|
|
64
|
+
* providers when performing shortName based look up.
|
|
65
|
+
*/
|
|
66
|
+
providers: ServiceConfig[];
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Must be set to true to enable upload support in the emoji components.
|
|
70
|
+
*
|
|
71
|
+
* Can be used for the restriction of the upload UI based on permissions, or feature flags.
|
|
72
|
+
*
|
|
73
|
+
* Note this also requires that other conditions are met (for example, one of the providers
|
|
74
|
+
* must support upload for the UploadingEmojiResource implementation of UploadingEmojiProvider).
|
|
75
|
+
*/
|
|
76
|
+
allowUpload?: boolean;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Logged user in the Product.
|
|
80
|
+
*/
|
|
81
|
+
currentUser?: User;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* This is specifically used for fetching a meta information of a single emoji.
|
|
85
|
+
* Useful for when rendering a single or a subset of emojis on a page that does not require the
|
|
86
|
+
* whole provider list to be downloaded.
|
|
87
|
+
*/
|
|
88
|
+
singleEmojiApi?: SingleEmojiApiLoaderConfig;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Renders an image while the provider is being downloaded to reduce the time
|
|
92
|
+
* the user is being presented with a placeholder
|
|
93
|
+
*/
|
|
94
|
+
optimisticImageApi?: OptimisticImageApiLoaderConfig;
|
|
95
|
+
}
|
|
96
|
+
`}
|
|
97
|
+
|
|
98
|
+
`;
|
package/local-config-example.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { EmojiId } from './src/types';
|
|
2
|
+
|
|
2
3
|
export default {
|
|
3
4
|
recordConfig: {
|
|
4
5
|
url: 'https://www.example.org/',
|
|
@@ -16,4 +17,24 @@ export default {
|
|
|
16
17
|
}),
|
|
17
18
|
},
|
|
18
19
|
],
|
|
20
|
+
singleEmojiApi: {
|
|
21
|
+
getUrl: (emojiId: EmojiId) =>
|
|
22
|
+
`https://www.example.org/emoji/${emojiId.id || emojiId.shortName}`,
|
|
23
|
+
securityProvider: () => ({
|
|
24
|
+
headers: {
|
|
25
|
+
'User-Context': '{token}',
|
|
26
|
+
Authorization: 'Bearer {token}',
|
|
27
|
+
},
|
|
28
|
+
}),
|
|
29
|
+
},
|
|
30
|
+
optimisticImageApi: {
|
|
31
|
+
getUrl: (emojiId: EmojiId) =>
|
|
32
|
+
`http://www.example.org/site-id/${emojiId.id || emojiId.shortName}/path`,
|
|
33
|
+
securityProvider: () => ({
|
|
34
|
+
headers: {
|
|
35
|
+
'User-Context': '{token}',
|
|
36
|
+
Authorization: 'Bearer {token}',
|
|
37
|
+
},
|
|
38
|
+
}),
|
|
39
|
+
},
|
|
19
40
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/emoji",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "65.1.0",
|
|
4
4
|
"description": "Fabric emoji React components",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"@atlaskit/analytics-next": "^8.2.0",
|
|
30
30
|
"@atlaskit/button": "^16.3.0",
|
|
31
31
|
"@atlaskit/icon": "^21.10.0",
|
|
32
|
-
"@atlaskit/media-client": "^
|
|
32
|
+
"@atlaskit/media-client": "^17.1.0",
|
|
33
33
|
"@atlaskit/spinner": "^15.0.0",
|
|
34
34
|
"@atlaskit/textfield": "^5.1.0",
|
|
35
35
|
"@atlaskit/theme": "^12.1.0",
|
|
@@ -53,12 +53,12 @@
|
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@atlaskit/docs": "*",
|
|
56
|
-
"@atlaskit/editor-test-helpers": "^17.
|
|
56
|
+
"@atlaskit/editor-test-helpers": "^17.1.0",
|
|
57
57
|
"@atlaskit/elements-test-helpers": "^0.7.0",
|
|
58
58
|
"@atlaskit/media-core": "^33.0.0",
|
|
59
59
|
"@atlaskit/section-message": "^6.0.0",
|
|
60
60
|
"@atlaskit/ssr": "*",
|
|
61
|
-
"@atlaskit/util-data-test": "^17.
|
|
61
|
+
"@atlaskit/util-data-test": "^17.5.0",
|
|
62
62
|
"@atlaskit/visual-regression": "*",
|
|
63
63
|
"@atlassian/atlassian-frontend-prettier-config-1.0.1": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.1",
|
|
64
64
|
"@atlassian/ufo": "^0.1.10",
|