@oiij/emoji-picker 0.0.11 → 0.0.12

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/dist/index.d.mts CHANGED
@@ -1,6 +1,7 @@
1
+ import * as _vueuse_core0 from "@vueuse/core";
1
2
  import { Picker } from "emoji-mart";
2
3
  import * as vue0 from "vue";
3
- import { ComputedRef, TemplateRef } from "vue";
4
+ import { MaybeRefOrGetter, TemplateRef } from "vue";
4
5
 
5
6
  //#region src/index.d.ts
6
7
  type EmojiResult = {
@@ -45,11 +46,20 @@ type EmojiPickerOptions = {
45
46
  theme?: 'auto' | 'light' | 'dark';
46
47
  getSpritesheetURL?: string;
47
48
  };
48
- declare function useEmojiPicker(templateRef: TemplateRef<HTMLElement>, darkMode?: ComputedRef<boolean>, language?: ComputedRef<'zh' | 'en'>, options?: EmojiPickerOptions): {
49
+ type UseEmojiPickerOptions = {
50
+ darkMode?: MaybeRefOrGetter<boolean>;
51
+ language?: MaybeRefOrGetter<'zh' | 'en'>;
52
+ emojiPickerOptions?: EmojiPickerOptions;
53
+ };
54
+ declare function useEmojiPicker(templateRef: TemplateRef<HTMLElement>, options?: UseEmojiPickerOptions): {
49
55
  templateRef: Readonly<vue0.ShallowRef<HTMLElement | null>>;
50
- emojiPicker: vue0.ShallowRef<Picker | null, Picker | null>;
51
- onRender: (fn: (editor: Picker) => void) => void;
56
+ darkModeRef: vue0.Ref<boolean | undefined, boolean | undefined>;
57
+ languageRef: vue0.Ref<"zh" | "en" | undefined, "zh" | "en" | undefined>;
58
+ emojiPickerInst: vue0.ShallowRef<Picker | null, Picker | null>;
59
+ updateTheme: (darkMode?: boolean) => void;
60
+ updateLanguage: (language?: "zh" | "en") => void;
61
+ onRender: _vueuse_core0.EventHookOn<[Picker]>;
52
62
  };
53
- type EmojiPickerReturns = ReturnType<typeof useEmojiPicker>;
63
+ type UseEmojiPickerReturns = ReturnType<typeof useEmojiPicker>;
54
64
  //#endregion
55
- export { EmojiPickerOptions, EmojiPickerReturns, EmojiResult, useEmojiPicker };
65
+ export { EmojiPickerOptions, EmojiResult, UseEmojiPickerOptions, UseEmojiPickerReturns, useEmojiPicker };
package/dist/index.mjs CHANGED
@@ -1,9 +1,26 @@
1
1
  import data from "@emoji-mart/data";
2
+ import { createEventHook, watchOnce } from "@vueuse/core";
2
3
  import { Picker } from "emoji-mart";
3
- import { onMounted, onUnmounted, shallowRef, watch } from "vue";
4
+ import { onUnmounted, ref, shallowRef, toValue, watch, watchEffect } from "vue";
4
5
 
6
+ //#region ../_utils/custom-watch.ts
7
+ function watchRefOrGetter(value, callback) {
8
+ const refValue = ref(toValue(value));
9
+ watchEffect(() => {
10
+ refValue.value = toValue(value);
11
+ });
12
+ watch(refValue, (val) => {
13
+ callback?.(val);
14
+ });
15
+ return refValue;
16
+ }
17
+
18
+ //#endregion
5
19
  //#region src/index.ts
6
- function useEmojiPicker(templateRef, darkMode, language, options) {
20
+ function useEmojiPicker(templateRef, options) {
21
+ const { darkMode, language, emojiPickerOptions } = options ?? {};
22
+ const darkModeRef = watchRefOrGetter(darkMode, updateTheme);
23
+ const languageRef = watchRefOrGetter(language, updateLanguage);
7
24
  const _options = {
8
25
  data,
9
26
  emojiButtonRadius: "6px",
@@ -15,51 +32,51 @@ function useEmojiPicker(templateRef, darkMode, language, options) {
15
32
  "rgba(255,213,143,.7)",
16
33
  "rgba(211,209,255,.7)"
17
34
  ],
18
- theme: darkMode?.value ? "dark" : "light",
19
- locale: language?.value,
20
- ...options
35
+ theme: darkModeRef.value ? "dark" : "light",
36
+ locale: languageRef.value,
37
+ ...emojiPickerOptions
21
38
  };
22
- const emojiPicker = shallowRef(null);
23
- let onRender = null;
39
+ const emojiPickerInst = shallowRef(null);
40
+ const onRenderEvent = createEventHook();
41
+ function updateTheme(darkMode) {
42
+ if (darkMode) darkModeRef.value = darkMode;
43
+ _options.theme = darkModeRef.value ? "dark" : "light";
44
+ destroy();
45
+ render();
46
+ }
47
+ function updateLanguage(language) {
48
+ if (language) languageRef.value = language;
49
+ _options.locale = languageRef.value ?? "zh";
50
+ destroy();
51
+ render();
52
+ }
24
53
  function render() {
25
- if (templateRef.value && !emojiPicker.value) {
26
- emojiPicker.value = new Picker({
27
- parent: templateRef.value,
28
- ..._options
29
- });
30
- if (typeof onRender === "function") onRender(emojiPicker.value);
54
+ if (templateRef.value) {
55
+ if (!emojiPickerInst.value) {
56
+ emojiPickerInst.value = new Picker({
57
+ parent: templateRef.value,
58
+ ..._options
59
+ });
60
+ onRenderEvent.trigger(emojiPickerInst.value);
61
+ }
31
62
  }
32
63
  }
33
64
  function destroy() {
34
- if (!templateRef.value) return;
35
- templateRef.value.innerHTML = "";
36
- emojiPicker.value = null;
65
+ emojiPickerInst.value = null;
66
+ if (templateRef.value) templateRef.value.innerHTML = "";
37
67
  }
38
- watch(templateRef, () => {
39
- render();
40
- });
41
- watch(() => darkMode?.value, (v) => {
42
- destroy();
43
- _options.theme = v ? "dark" : "light";
44
- render();
45
- });
46
- watch(() => language?.value, (v) => {
47
- destroy();
48
- _options.locale = v ?? "zh";
49
- render();
50
- });
51
- onMounted(() => {
52
- render();
53
- });
68
+ watchOnce(templateRef, render);
54
69
  onUnmounted(() => {
55
70
  destroy();
56
71
  });
57
72
  return {
58
73
  templateRef,
59
- emojiPicker,
60
- onRender: (fn) => {
61
- onRender = fn;
62
- }
74
+ darkModeRef,
75
+ languageRef,
76
+ emojiPickerInst,
77
+ updateTheme,
78
+ updateLanguage,
79
+ onRender: onRenderEvent.on
63
80
  };
64
81
  }
65
82
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oiij/emoji-picker",
3
3
  "type": "module",
4
- "version": "0.0.11",
4
+ "version": "0.0.12",
5
5
  "description": "A Vue Composable for emoji-picker",
6
6
  "author": "oiij",
7
7
  "license": "MIT",
@@ -28,13 +28,13 @@
28
28
  "@emoji-mart/data": "^1.2.1",
29
29
  "@vueuse/core": "^14.1.0",
30
30
  "emoji-mart": "^5.6.0",
31
- "vue": "^3.5.26"
31
+ "vue": "^3.5.27"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@emoji-mart/data": "^1.2.1",
35
35
  "@vueuse/core": "^14.1.0",
36
36
  "emoji-mart": "^5.6.0",
37
- "vue": "^3.5.26"
37
+ "vue": "^3.5.27"
38
38
  },
39
39
  "publishConfig": {
40
40
  "access": "public"