@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.
Files changed (122) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/cjs/api/EmojiResource.js +250 -87
  3. package/dist/cjs/api/media/SiteEmojiResource.js +4 -2
  4. package/dist/cjs/api/media/TokenManager.js +13 -12
  5. package/dist/cjs/components/common/CachingEmoji.js +21 -3
  6. package/dist/cjs/components/common/Emoji.js +57 -36
  7. package/dist/cjs/components/common/EmojiImage.js +99 -0
  8. package/dist/cjs/components/common/EmojiPlaceholder.js +7 -5
  9. package/dist/cjs/components/common/RecordSelectionDefault.js +13 -1
  10. package/dist/cjs/components/common/ResourcedEmoji.js +14 -4
  11. package/dist/cjs/components/common/ResourcedEmojiComponent.js +173 -156
  12. package/dist/cjs/components/common/UfoErrorBoundary.js +30 -4
  13. package/dist/cjs/components/common/UploadEmoji.js +8 -3
  14. package/dist/cjs/components/common/styles.js +26 -9
  15. package/dist/cjs/components/picker/EmojiPickerComponent.js +27 -9
  16. package/dist/cjs/components/picker/EmojiPickerFooter.js +2 -0
  17. package/dist/cjs/components/picker/styles.js +16 -13
  18. package/dist/cjs/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  19. package/dist/cjs/components/uploader/EmojiUploadComponent.js +7 -2
  20. package/dist/cjs/context/EmojiContextProvider.js +33 -0
  21. package/dist/cjs/hooks/index.js +16 -0
  22. package/dist/cjs/index.js +20 -0
  23. package/dist/cjs/types.js +3 -0
  24. package/dist/cjs/util/analytics/samplingUfo.js +13 -3
  25. package/dist/cjs/util/analytics/ufoExperiences.js +22 -4
  26. package/dist/cjs/util/analytics/useSampledUFOComponentExperience.js +2 -1
  27. package/dist/cjs/util/browser-support.js +1 -1
  28. package/dist/cjs/util/constants.js +6 -5
  29. package/dist/cjs/util/useInView.js +23 -0
  30. package/dist/cjs/version.json +1 -1
  31. package/dist/es2019/api/EmojiResource.js +117 -37
  32. package/dist/es2019/api/media/SiteEmojiResource.js +2 -2
  33. package/dist/es2019/api/media/TokenManager.js +12 -12
  34. package/dist/es2019/components/common/CachingEmoji.js +20 -3
  35. package/dist/es2019/components/common/Emoji.js +53 -34
  36. package/dist/es2019/components/common/EmojiImage.js +74 -0
  37. package/dist/es2019/components/common/EmojiPlaceholder.js +7 -5
  38. package/dist/es2019/components/common/RecordSelectionDefault.js +13 -1
  39. package/dist/es2019/components/common/ResourcedEmoji.js +15 -5
  40. package/dist/es2019/components/common/ResourcedEmojiComponent.js +136 -105
  41. package/dist/es2019/components/common/UfoErrorBoundary.js +14 -2
  42. package/dist/es2019/components/common/UploadEmoji.js +8 -3
  43. package/dist/es2019/components/common/styles.js +30 -9
  44. package/dist/es2019/components/picker/EmojiPickerComponent.js +27 -8
  45. package/dist/es2019/components/picker/EmojiPickerFooter.js +2 -0
  46. package/dist/es2019/components/picker/styles.js +16 -14
  47. package/dist/es2019/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  48. package/dist/es2019/components/uploader/EmojiUploadComponent.js +7 -2
  49. package/dist/es2019/context/EmojiContextProvider.js +9 -1
  50. package/dist/es2019/hooks/index.js +8 -0
  51. package/dist/es2019/index.js +5 -4
  52. package/dist/es2019/types.js +3 -0
  53. package/dist/es2019/util/analytics/samplingUfo.js +11 -1
  54. package/dist/es2019/util/analytics/ufoExperiences.js +12 -2
  55. package/dist/es2019/util/analytics/useSampledUFOComponentExperience.js +2 -1
  56. package/dist/es2019/util/browser-support.js +1 -1
  57. package/dist/es2019/util/constants.js +3 -2
  58. package/dist/es2019/util/useInView.js +12 -0
  59. package/dist/es2019/version.json +1 -1
  60. package/dist/esm/api/EmojiResource.js +257 -89
  61. package/dist/esm/api/media/SiteEmojiResource.js +5 -3
  62. package/dist/esm/api/media/TokenManager.js +13 -12
  63. package/dist/esm/components/common/CachingEmoji.js +20 -3
  64. package/dist/esm/components/common/Emoji.js +59 -38
  65. package/dist/esm/components/common/EmojiImage.js +84 -0
  66. package/dist/esm/components/common/EmojiPlaceholder.js +8 -5
  67. package/dist/esm/components/common/RecordSelectionDefault.js +13 -1
  68. package/dist/esm/components/common/ResourcedEmoji.js +15 -5
  69. package/dist/esm/components/common/ResourcedEmojiComponent.js +167 -156
  70. package/dist/esm/components/common/UfoErrorBoundary.js +30 -4
  71. package/dist/esm/components/common/UploadEmoji.js +8 -3
  72. package/dist/esm/components/common/styles.js +25 -10
  73. package/dist/esm/components/picker/EmojiPickerComponent.js +27 -8
  74. package/dist/esm/components/picker/EmojiPickerFooter.js +2 -0
  75. package/dist/esm/components/picker/styles.js +16 -14
  76. package/dist/esm/components/typeahead/EmojiTypeAheadComponent.js +18 -2
  77. package/dist/esm/components/uploader/EmojiUploadComponent.js +7 -2
  78. package/dist/esm/context/EmojiContextProvider.js +30 -1
  79. package/dist/esm/hooks/index.js +8 -0
  80. package/dist/esm/index.js +5 -4
  81. package/dist/esm/types.js +3 -0
  82. package/dist/esm/util/analytics/samplingUfo.js +13 -2
  83. package/dist/esm/util/analytics/ufoExperiences.js +14 -2
  84. package/dist/esm/util/analytics/useSampledUFOComponentExperience.js +2 -1
  85. package/dist/esm/util/browser-support.js +1 -1
  86. package/dist/esm/util/constants.js +3 -2
  87. package/dist/esm/util/useInView.js +12 -0
  88. package/dist/esm/version.json +1 -1
  89. package/dist/types/api/EmojiResource.d.ts +19 -2
  90. package/dist/types/api/EmojiUtils.d.ts +7 -1
  91. package/dist/types/api/media/SiteEmojiResource.d.ts +1 -1
  92. package/dist/types/api/media/TokenManager.d.ts +1 -0
  93. package/dist/types/components/common/Emoji.d.ts +0 -1
  94. package/dist/types/components/common/EmojiImage.d.ts +13 -0
  95. package/dist/types/components/common/EmojiPlaceholder.d.ts +1 -0
  96. package/dist/types/components/common/LoadingEmojiComponent.d.ts +7 -4
  97. package/dist/types/components/common/ResourcedEmoji.d.ts +3 -3
  98. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +41 -20
  99. package/dist/types/components/common/UfoErrorBoundary.d.ts +2 -2
  100. package/dist/types/components/common/UploadEmoji.d.ts +1 -1
  101. package/dist/types/components/common/styles.d.ts +1 -0
  102. package/dist/types/components/picker/EmojiPicker.d.ts +9 -0
  103. package/dist/types/components/picker/EmojiPickerComponent.d.ts +14 -0
  104. package/dist/types/components/picker/EmojiPickerFooter.d.ts +1 -0
  105. package/dist/types/components/picker/styles.d.ts +1 -1
  106. package/dist/types/components/typeahead/EmojiTypeAheadComponent.d.ts +18 -0
  107. package/dist/types/hooks/index.d.ts +1 -0
  108. package/dist/types/index.d.ts +5 -4
  109. package/dist/types/types.d.ts +14 -2
  110. package/dist/types/util/analytics/index.d.ts +1 -1
  111. package/dist/types/util/analytics/samplingUfo.d.ts +6 -6
  112. package/dist/types/util/analytics/ufoExperiences.d.ts +5 -2
  113. package/dist/types/util/constants.d.ts +2 -1
  114. package/dist/types/util/useInView.d.ts +4 -0
  115. package/docs/0-intro.tsx +35 -27
  116. package/docs/1-resourced-emoji.tsx +74 -0
  117. package/docs/2-emoji-picker.tsx +56 -0
  118. package/docs/3-typeahead.tsx +20 -0
  119. package/docs/4-emoji-provider.tsx +98 -0
  120. package/local-config-example.ts +22 -1
  121. package/package.json +4 -4
  122. 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;
@@ -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
- export { commonSelectedStyles as selected, selectOnHoverStyles as selectOnHover, emojiSprite, emojiNodeStyles as emojiNode, emojiImage, } from './components/common/styles';
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;
@@ -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, WithSampling } from './samplingUfo';
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 declare const ufoExperiencesSampled: UFOExperienceSampledRecords;
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) => WithSampling;
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) => import("./samplingUfo").WithSampling;
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 SAMPLING_RATE_EMOJI_RENDERED_EXP_RESOURCEEMOJI = 0.1;
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 { md, Example, code, AtlassianInternalWarning } from '@atlaskit/docs';
3
- import SectionMessage, {
4
- SectionMessageAction,
5
- } from '@atlaskit/section-message';
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 emojiProvider = new EmojiResource({
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
+ `;
@@ -1,4 +1,5 @@
1
- // Copy this file to local-config.ts and customise.
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": "64.7.0",
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": "^16.0.0",
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.0.0",
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.2.0",
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",