@mobilon-dev/chotto 0.3.105 → 0.3.107

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 (43) hide show
  1. package/dist/chotto.css +1 -1
  2. package/dist/components/2_feed_elements/AudioMessage/AudioMessage.vue.js +2 -2
  3. package/dist/components/2_feed_elements/AudioMessage/AudioMessage.vue2.js +293 -266
  4. package/dist/components/2_feed_elements/FeedReplyQuote/FeedReplyQuote.vue.js +7 -0
  5. package/dist/components/2_feed_elements/FeedReplyQuote/FeedReplyQuote.vue2.js +73 -0
  6. package/dist/components/2_feed_elements/FileMessage/FileMessage.vue.js +1 -1
  7. package/dist/components/2_feed_elements/FileMessage/FileMessage.vue2.js +185 -158
  8. package/dist/components/2_feed_elements/ImageMessage/ImageMessage.vue.js +3 -3
  9. package/dist/components/2_feed_elements/ImageMessage/ImageMessage.vue2.js +227 -200
  10. package/dist/components/2_feed_elements/MessageReactions/MessageReactions.vue.js +2 -2
  11. package/dist/components/2_feed_elements/MessageReactions/MessageReactions.vue2.js +62 -245
  12. package/dist/components/2_feed_elements/MessageReactions/MessageReactionsOverlay.vue.js +7 -0
  13. package/dist/components/2_feed_elements/MessageReactions/MessageReactionsOverlay.vue2.js +231 -0
  14. package/dist/components/2_feed_elements/MessageReactions/composables/usePositioning.js +25 -25
  15. package/dist/components/2_feed_elements/StickerMessage/StickerMessage.vue.js +2 -2
  16. package/dist/components/2_feed_elements/StickerMessage/StickerMessage.vue2.js +213 -186
  17. package/dist/components/2_feed_elements/TextMessage/TextMessage.vue.js +2 -2
  18. package/dist/components/2_feed_elements/TextMessage/TextMessage.vue2.js +190 -164
  19. package/dist/components/2_feed_elements/VideoMessage/VideoMessage.vue.js +1 -1
  20. package/dist/components/2_feed_elements/VideoMessage/VideoMessage.vue2.js +209 -182
  21. package/dist/components/3_compounds/Feed/Feed.vue.js +2 -2
  22. package/dist/components/3_compounds/Feed/Feed.vue2.js +261 -213
  23. package/dist/components/3_compounds/Feed/composables/useFeedGrouping.js +23 -20
  24. package/dist/components/3_compounds/Feed/composables/useFeedProgressiveRender.js +82 -0
  25. package/dist/components/3_compounds/Feed/composables/useFeedReactionsOverlay.js +34 -0
  26. package/dist/hooks/messages/useMessageActions.js +81 -70
  27. package/dist/hooks/messages/useMessageReactionsInFeed.js +53 -0
  28. package/dist/hooks/messages/useMessageReactionsMount.js +21 -0
  29. package/dist/index.js +245 -238
  30. package/dist/types/components/2_feed_elements/FeedReplyQuote/FeedReplyQuote.vue.d.ts +19 -0
  31. package/dist/types/components/2_feed_elements/MessageReactions/MessageReactions.vue.d.ts +4 -71
  32. package/dist/types/components/2_feed_elements/MessageReactions/MessageReactionsOverlay.vue.d.ts +2 -0
  33. package/dist/types/components/2_feed_elements/MessageReactions/composables/usePositioning.d.ts +2 -1
  34. package/dist/types/components/3_compounds/Feed/Feed.vue.d.ts +6 -0
  35. package/dist/types/components/3_compounds/Feed/composables/index.d.ts +2 -0
  36. package/dist/types/components/3_compounds/Feed/composables/useFeedGrouping.d.ts +3 -22
  37. package/dist/types/components/3_compounds/Feed/composables/useFeedProgressiveRender.d.ts +22 -0
  38. package/dist/types/components/3_compounds/Feed/composables/useFeedReactionsOverlay.d.ts +52 -0
  39. package/dist/types/components/index.d.ts +1 -0
  40. package/dist/types/hooks/messages/index.d.ts +2 -0
  41. package/dist/types/hooks/messages/useMessageReactionsInFeed.d.ts +25 -0
  42. package/dist/types/hooks/messages/useMessageReactionsMount.d.ts +10 -0
  43. package/package.json +1 -1
@@ -1,5 +1,4 @@
1
- import 'vue3-emoji-picker-ru/css';
2
- import type { MessageReactions, Reply } from '@/types';
1
+ import type { MessageReactions } from '@/types';
3
2
  import { type ReactionsMode } from './composables';
4
3
  declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
5
4
  reactions: {
@@ -11,10 +10,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
11
10
  type: (StringConstructor | NumberConstructor)[];
12
11
  required: true;
13
12
  };
14
- readonly: {
15
- type: BooleanConstructor;
16
- default: boolean;
17
- };
18
13
  enabled: {
19
14
  type: BooleanConstructor;
20
15
  default: boolean;
@@ -24,47 +19,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
24
19
  default: string;
25
20
  validator: (value: string) => boolean;
26
21
  };
27
- /** Id текущего пользователя — для расчёта reactedByMe и локальных add/remove */
28
22
  currentUserId: {
29
23
  type: () => string | number | undefined;
30
24
  default: undefined;
31
25
  };
32
- /** Имя текущего пользователя — для тултипа при локальном добавлении реакции */
33
26
  currentUserName: {
34
27
  type: StringConstructor;
35
28
  default: undefined;
36
29
  };
37
- /** userId → имя (если в item нет name) */
38
30
  reactionUserNames: {
39
31
  type: () => Record<string, string>;
40
32
  default: undefined;
41
33
  };
42
- reply: {
43
- type: () => Reply | undefined;
44
- default: undefined;
45
- };
46
- replyEnabled: {
47
- type: BooleanConstructor;
48
- default: boolean;
49
- };
50
- /** Показывать кнопку меню действий сообщения в панели быстрых реакций */
51
- menuEnabled: {
52
- type: BooleanConstructor;
53
- default: boolean;
54
- };
55
- }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
56
- menu: (payload: {
57
- messageId: string | number;
58
- triggerRect?: {
59
- top: number;
60
- right: number;
61
- bottom: number;
62
- left: number;
63
- width: number;
64
- height: number;
65
- };
66
- event?: MouseEvent;
67
- }) => any;
34
+ }>, {
35
+ reactionsContainerRef: import("vue").Ref<HTMLElement | null, HTMLElement | null>;
36
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
68
37
  "toggle-reaction": (payload: {
69
38
  messageId: string | number;
70
39
  key: string;
@@ -87,10 +56,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
87
56
  type: (StringConstructor | NumberConstructor)[];
88
57
  required: true;
89
58
  };
90
- readonly: {
91
- type: BooleanConstructor;
92
- default: boolean;
93
- };
94
59
  enabled: {
95
60
  type: BooleanConstructor;
96
61
  default: boolean;
@@ -100,47 +65,19 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
100
65
  default: string;
101
66
  validator: (value: string) => boolean;
102
67
  };
103
- /** Id текущего пользователя — для расчёта reactedByMe и локальных add/remove */
104
68
  currentUserId: {
105
69
  type: () => string | number | undefined;
106
70
  default: undefined;
107
71
  };
108
- /** Имя текущего пользователя — для тултипа при локальном добавлении реакции */
109
72
  currentUserName: {
110
73
  type: StringConstructor;
111
74
  default: undefined;
112
75
  };
113
- /** userId → имя (если в item нет name) */
114
76
  reactionUserNames: {
115
77
  type: () => Record<string, string>;
116
78
  default: undefined;
117
79
  };
118
- reply: {
119
- type: () => Reply | undefined;
120
- default: undefined;
121
- };
122
- replyEnabled: {
123
- type: BooleanConstructor;
124
- default: boolean;
125
- };
126
- /** Показывать кнопку меню действий сообщения в панели быстрых реакций */
127
- menuEnabled: {
128
- type: BooleanConstructor;
129
- default: boolean;
130
- };
131
80
  }>> & Readonly<{
132
- onMenu?: ((payload: {
133
- messageId: string | number;
134
- triggerRect?: {
135
- top: number;
136
- right: number;
137
- bottom: number;
138
- left: number;
139
- width: number;
140
- height: number;
141
- };
142
- event?: MouseEvent;
143
- }) => any) | undefined;
144
81
  "onToggle-reaction"?: ((payload: {
145
82
  messageId: string | number;
146
83
  key: string;
@@ -154,15 +91,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
154
91
  key: string;
155
92
  }) => any) | undefined;
156
93
  }>, {
157
- reply: Reply | undefined;
158
94
  mode: ReactionsMode;
159
95
  reactions: MessageReactions | undefined;
160
- readonly: boolean;
161
96
  enabled: boolean;
162
97
  currentUserId: string | number | undefined;
163
98
  currentUserName: string;
164
99
  reactionUserNames: Record<string, string>;
165
- replyEnabled: boolean;
166
- menuEnabled: boolean;
167
100
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
168
101
  export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -3,7 +3,8 @@
3
3
  */
4
4
  export declare function findFeedContainer(element: HTMLElement | null): HTMLElement | null;
5
5
  /**
6
- * Находит контейнер содержимого сообщения (например, text-message__content)
6
+ * Находит контейнер содержимого сообщения (например, text-message__content).
7
+ * Якорь overlay может быть самим __content — проверяем элемент и предков.
7
8
  */
8
9
  export declare function findMessageContent(element: HTMLElement | null): HTMLElement | null;
9
10
  /**
@@ -6,6 +6,9 @@ type __VLS_Slots = {} & {
6
6
  'empty-feed'?: (props: typeof __VLS_47) => any;
7
7
  };
8
8
  declare const __VLS_component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
9
+ /**
10
+ * Объекты ленты. При смене чата сначала рисуется хвост, остальное дорисовывается пачками.
11
+ */
9
12
  objects: {
10
13
  type: {
11
14
  (arrayLength: number): IFeedObject[];
@@ -124,6 +127,9 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
124
127
  forceScrollToBottom: (...args: any[]) => void;
125
128
  delimiterRead: (...args: any[]) => void;
126
129
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
130
+ /**
131
+ * Объекты ленты. При смене чата сначала рисуется хвост, остальное дорисовывается пачками.
132
+ */
127
133
  objects: {
128
134
  type: {
129
135
  (arrayLength: number): IFeedObject[];
@@ -4,6 +4,8 @@ export * from './useFeedGrouping';
4
4
  export * from './useFeedKeyboard';
5
5
  export * from './useFeedLoadMore';
6
6
  export * from './useFeedMessageVisibility';
7
+ export * from './useFeedProgressiveRender';
8
+ export * from './useFeedReactionsOverlay';
7
9
  export * from './useFeedReply';
8
10
  export * from './useFeedScroll';
9
11
  export * from './useFeedScrollTo';
@@ -4,29 +4,10 @@ interface UseFeedGroupingOptions {
4
4
  objects: ComputedRef<IFeedObject[]>;
5
5
  }
6
6
  /**
7
- * Композабл для группировки сообщений в серии (по отправителю)
7
+ * Флаги «первое в серии» без копирования objects.
8
+ * Сами сообщения остаются исходными ссылками — Vue не патчит все пузыри зря.
8
9
  */
9
10
  export declare function useFeedGrouping({ objects }: UseFeedGroupingOptions): {
10
- groupedObjects: ComputedRef<{
11
- isFirstInSeries: boolean;
12
- messageId: string;
13
- type: string;
14
- header?: string;
15
- text?: string;
16
- position?: string;
17
- status?: string;
18
- time?: string;
19
- url?: string;
20
- alt?: string;
21
- filename?: string;
22
- avatar?: string;
23
- subtext?: string;
24
- views?: number;
25
- callDuration?: string;
26
- isMissedCall?: boolean;
27
- reply?: import("@/types").Reply;
28
- linkPreview?: import("@/types").ILinkPreview;
29
- keyboard?: import("@/types").IKeyBoard[];
30
- }[]>;
11
+ seriesFlags: ComputedRef<boolean[]>;
31
12
  };
32
13
  export {};
@@ -0,0 +1,22 @@
1
+ import { type Ref } from 'vue';
2
+ import type { IFeedObject } from '@/types';
3
+ export declare const FEED_TAIL_CHUNK = 28;
4
+ export declare const FEED_BACKFILL_CHUNK = 24;
5
+ interface UseFeedProgressiveRenderOptions {
6
+ objectsRef: {
7
+ value: IFeedObject[];
8
+ };
9
+ feedRef: Ref<HTMLElement | null>;
10
+ }
11
+ /**
12
+ * Первый кадр — хвост ленты, остальное дорисовывается пачками.
13
+ * После дорисовки все objects в DOM, скролл нативный.
14
+ */
15
+ export declare function useFeedProgressiveRender({ objectsRef, feedRef, }: UseFeedProgressiveRenderOptions): {
16
+ visibleObjects: import("vue").ComputedRef<IFeedObject[]>;
17
+ renderStart: Ref<number, number>;
18
+ isBackfilling: import("vue").ComputedRef<boolean>;
19
+ revealThroughIndex: (index: number) => void;
20
+ accelerateBackfill: () => void;
21
+ };
22
+ export {};
@@ -0,0 +1,52 @@
1
+ import { type Ref } from 'vue';
2
+ import type { ReactionsMode } from '@/components/2_feed_elements/MessageReactions/composables';
3
+ import type { MessageReactions, Reply } from '@/types';
4
+ import type { OpenMessageMenuSource } from '@/hooks/messages/useMessageActions';
5
+ export interface FeedReactionsHandlers {
6
+ onToggleReaction: (payload: {
7
+ messageId: string | number;
8
+ key: string;
9
+ }) => void;
10
+ onAddReaction: (payload: {
11
+ messageId: string | number;
12
+ key: string;
13
+ }) => void;
14
+ onRemoveReaction: (payload: {
15
+ messageId: string | number;
16
+ key: string;
17
+ }) => void;
18
+ onMenu: (source?: OpenMessageMenuSource) => void;
19
+ }
20
+ export interface FeedReactionsTarget {
21
+ messageId: string | number;
22
+ anchorEl: HTMLElement;
23
+ chipsEl: HTMLElement | null;
24
+ reactions: MessageReactions | undefined;
25
+ reply: Reply | undefined;
26
+ replyEnabled: boolean;
27
+ menuEnabled: boolean;
28
+ mode: ReactionsMode;
29
+ enabled: boolean;
30
+ handlers: FeedReactionsHandlers;
31
+ /** Записать оптимистичное состояние реакций в объект сообщения ленты */
32
+ patchReactions: (next: MessageReactions) => void;
33
+ }
34
+ export interface FeedReactionsConsumerApi {
35
+ activate: (target: FeedReactionsTarget) => void;
36
+ handlePointerLeave: (event: PointerEvent, contentEl: HTMLElement | null, chipsEl?: HTMLElement | null) => void;
37
+ }
38
+ export interface FeedReactionsOverlayState {
39
+ activeTarget: Ref<FeedReactionsTarget | null>;
40
+ anchorRef: Ref<HTMLElement | null>;
41
+ }
42
+ type PanelBridge = {
43
+ onMessageEnter: () => void;
44
+ onMessageLeave: () => void;
45
+ isPanelOpen: () => boolean;
46
+ containsNode: (node: Node) => boolean;
47
+ };
48
+ export declare function registerFeedReactionsPanelBridge(bridge: PanelBridge | null): void;
49
+ export declare function provideFeedReactionsOverlay(): FeedReactionsOverlayState;
50
+ export declare function useFeedReactionsConsumer(): FeedReactionsConsumerApi | null;
51
+ export declare function useFeedReactionsOverlayState(): FeedReactionsOverlayState | null;
52
+ export {};
@@ -49,6 +49,7 @@ export { default as UserProfile } from './2_elements/UserProfile/UserProfile.vue
49
49
  export { default as VideoRecorder } from './2_elements/VideoRecorder/VideoRecorder.vue';
50
50
  export { default as AudioMessage } from './2_feed_elements/AudioMessage/AudioMessage.vue';
51
51
  export { default as BaseReplyMessage } from './2_feed_elements/BaseReplyMessage/BaseReplyMessage.vue';
52
+ export { default as FeedReplyQuote } from './2_feed_elements/FeedReplyQuote/FeedReplyQuote.vue';
52
53
  export { default as BaseEditMessage } from './2_feed_elements/BaseEditMessage/BaseEditMessage.vue';
53
54
  export { default as CallMessage } from './2_feed_elements/CallMessage/CallMessage.vue';
54
55
  export { default as DateMessage } from './2_feed_elements/DateMessage/DateMessage.vue';
@@ -1,5 +1,7 @@
1
1
  export * from './useMessageActions';
2
2
  export * from './useMessageHoverActions';
3
+ export * from './useMessageReactionsMount';
4
+ export * from './useMessageReactionsInFeed';
3
5
  export * from './calculateMessageMenuPosition';
4
6
  export * from './useMessageMenuActions';
5
7
  export * from './useMessageLinks';
@@ -0,0 +1,25 @@
1
+ import { type InjectionKey, type MaybeRefOrGetter, type Ref } from 'vue';
2
+ import type { MessageReactions, Reply } from '@/types';
3
+ import type { FeedReactionsHandlers } from '@/components/3_compounds/Feed/composables/useFeedReactionsOverlay';
4
+ type MessageWithReactions = {
5
+ reactions?: MessageReactions;
6
+ };
7
+ export declare const MESSAGE_REACTIONS_PATCH_KEY: InjectionKey<(next: MessageReactions) => void>;
8
+ interface UseMessageReactionsInFeedOptions {
9
+ message: MaybeRefOrGetter<MessageWithReactions>;
10
+ messageId: MaybeRefOrGetter<string | number>;
11
+ reactions: MaybeRefOrGetter<MessageReactions | undefined>;
12
+ reactionsActive: MaybeRefOrGetter<boolean>;
13
+ reactionsMode: MaybeRefOrGetter<'single' | 'multi'>;
14
+ reply: MaybeRefOrGetter<Reply | undefined>;
15
+ menuEnabled: MaybeRefOrGetter<boolean>;
16
+ contentRef: Ref<HTMLElement | null>;
17
+ chipsRef?: Ref<HTMLElement | null>;
18
+ handlers: FeedReactionsHandlers;
19
+ }
20
+ export declare function useMessageReactionsInFeed(options: UseMessageReactionsInFeedOptions): {
21
+ showReactions: import("vue").ComputedRef<boolean>;
22
+ onContentPointerEnter: () => void;
23
+ onContentPointerLeave: (event: PointerEvent) => void;
24
+ };
25
+ export {};
@@ -0,0 +1,10 @@
1
+ import { type MaybeRefOrGetter } from 'vue';
2
+ import type { MessageReactions } from '@/types';
3
+ /**
4
+ * Отложенный mount MessageReactions: без items — только после pointerenter на контент.
5
+ */
6
+ export declare function useMessageReactionsMount(reactions: MaybeRefOrGetter<MessageReactions | undefined>, reactionsActive: MaybeRefOrGetter<boolean>): {
7
+ showReactions: import("vue").ComputedRef<boolean>;
8
+ engageReactionsMount: () => void;
9
+ hasReactionItems: import("vue").ComputedRef<boolean>;
10
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mobilon-dev/chotto",
3
- "version": "0.3.105",
3
+ "version": "0.3.107",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",