vue-parley 4.2.0 → 4.3.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/dist/chat.css +57 -35
- package/dist/chunks/{Call-D48LfnDv.cjs → Call-CDT92h1x.cjs} +62 -57
- package/dist/chunks/Call-CDT92h1x.cjs.map +1 -0
- package/dist/chunks/{Call-7lGaUPcp.mjs → Call-jiZGoCtR.mjs} +62 -57
- package/dist/chunks/Call-jiZGoCtR.mjs.map +1 -0
- package/dist/chunks/{index-C8N5eSUe.mjs → index-CHFzAdVI.mjs} +150 -145
- package/dist/chunks/index-CHFzAdVI.mjs.map +1 -0
- package/dist/chunks/{index-DrcpfLUy.cjs → index-efTNVoBF.cjs} +131 -126
- package/dist/chunks/index-efTNVoBF.cjs.map +1 -0
- package/dist/chunks/{session-B8Q7eiUV.mjs → session-CN61aKfb.mjs} +3 -2
- package/dist/chunks/{session-BwgUu6F3.cjs.map → session-CN61aKfb.mjs.map} +1 -1
- package/dist/chunks/{session-BwgUu6F3.cjs → session-DLxWccUj.cjs} +3 -2
- package/dist/chunks/{session-B8Q7eiUV.mjs.map → session-DLxWccUj.cjs.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +19 -19
- package/dist/types/app/components/ChatPage.vue.d.ts.map +1 -1
- package/dist/types/app/components/call/Call.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/ChatBubble.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/ChatInput.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/ChatMessages.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/ChatPageBar.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/ChatProfileOverview.vue.d.ts +5 -1
- package/dist/types/app/components/chat/ChatProfileOverview.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/ChatView.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/chat-bubbles/BubbleOptions.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/chat-bubbles/MediaViewer.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/chat-input/InputAttachement.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/contact/ChatList.vue.d.ts.map +1 -1
- package/dist/types/app/components/chat/messages/FloatingDateHeader.vue.d.ts +0 -1
- package/dist/types/app/components/chat/messages/FloatingDateHeader.vue.d.ts.map +1 -1
- package/dist/types/app/components/general/ResponsiveDialog.vue.d.ts.map +1 -1
- package/dist/types/app/composables/call/session.d.ts +2 -0
- package/dist/types/app/composables/call/session.d.ts.map +1 -1
- package/dist/types/app/composables/useFlippedVirtualScroll.d.ts +0 -1
- package/dist/types/app/composables/useFlippedVirtualScroll.d.ts.map +1 -1
- package/dist/types/app/stores/callStore.d.ts +9 -3
- package/dist/types/app/stores/callStore.d.ts.map +1 -1
- package/dist/types/i18n/locales/index.d.ts +10 -0
- package/dist/types/i18n/locales/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/Call-7lGaUPcp.mjs.map +0 -1
- package/dist/chunks/Call-D48LfnDv.cjs.map +0 -1
- package/dist/chunks/index-C8N5eSUe.mjs.map +0 -1
- package/dist/chunks/index-DrcpfLUy.cjs.map +0 -1
package/dist/chat.css
CHANGED
|
@@ -505,10 +505,6 @@
|
|
|
505
505
|
top: calc(var(--spacing) * 4);
|
|
506
506
|
}
|
|
507
507
|
|
|
508
|
-
:where(.vue-chat, .vue-chat *).top-12 {
|
|
509
|
-
top: calc(var(--spacing) * 12);
|
|
510
|
-
}
|
|
511
|
-
|
|
512
508
|
:where(.vue-chat, .vue-chat *).right-0 {
|
|
513
509
|
right: 0;
|
|
514
510
|
}
|
|
@@ -1362,6 +1358,10 @@
|
|
|
1362
1358
|
flex-direction: row !important;
|
|
1363
1359
|
}
|
|
1364
1360
|
|
|
1361
|
+
:where(.vue-chat, .vue-chat *).flex-row-reverse {
|
|
1362
|
+
flex-direction: row-reverse;
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
1365
|
:where(.vue-chat, .vue-chat *).flex-wrap {
|
|
1366
1366
|
flex-wrap: wrap;
|
|
1367
1367
|
}
|
|
@@ -1588,33 +1588,33 @@
|
|
|
1588
1588
|
border-radius: var(--radius-xl) !important;
|
|
1589
1589
|
}
|
|
1590
1590
|
|
|
1591
|
-
:where(.vue-chat, .vue-chat *).rounded-
|
|
1592
|
-
border-
|
|
1591
|
+
:where(.vue-chat, .vue-chat *).rounded-tl-md {
|
|
1592
|
+
border-top-left-radius: var(--radius-md);
|
|
1593
1593
|
}
|
|
1594
1594
|
|
|
1595
|
-
:where(.vue-chat, .vue-chat *).rounded-
|
|
1596
|
-
border-
|
|
1595
|
+
:where(.vue-chat, .vue-chat *).rounded-tr-md {
|
|
1596
|
+
border-top-right-radius: var(--radius-md);
|
|
1597
1597
|
}
|
|
1598
1598
|
|
|
1599
|
-
:where(.vue-chat, .vue-chat *).rounded-
|
|
1600
|
-
border-
|
|
1599
|
+
:where(.vue-chat, .vue-chat *).rounded-b-none\! {
|
|
1600
|
+
border-bottom-right-radius: 0 !important;
|
|
1601
|
+
border-bottom-left-radius: 0 !important;
|
|
1601
1602
|
}
|
|
1602
1603
|
|
|
1603
|
-
:where(.vue-chat, .vue-chat *).rounded-
|
|
1604
|
-
border-
|
|
1604
|
+
:where(.vue-chat, .vue-chat *).rounded-br-md {
|
|
1605
|
+
border-bottom-right-radius: var(--radius-md);
|
|
1605
1606
|
}
|
|
1606
1607
|
|
|
1607
|
-
:where(.vue-chat, .vue-chat *).rounded-
|
|
1608
|
-
border-
|
|
1608
|
+
:where(.vue-chat, .vue-chat *).rounded-br-xs {
|
|
1609
|
+
border-bottom-right-radius: var(--radius-xs);
|
|
1609
1610
|
}
|
|
1610
1611
|
|
|
1611
|
-
:where(.vue-chat, .vue-chat *).rounded-
|
|
1612
|
-
border-
|
|
1612
|
+
:where(.vue-chat, .vue-chat *).rounded-bl-md {
|
|
1613
|
+
border-bottom-left-radius: var(--radius-md);
|
|
1613
1614
|
}
|
|
1614
1615
|
|
|
1615
|
-
:where(.vue-chat, .vue-chat *).rounded-
|
|
1616
|
-
border-bottom-
|
|
1617
|
-
border-bottom-left-radius: 0 !important;
|
|
1616
|
+
:where(.vue-chat, .vue-chat *).rounded-bl-xs {
|
|
1617
|
+
border-bottom-left-radius: var(--radius-xs);
|
|
1618
1618
|
}
|
|
1619
1619
|
|
|
1620
1620
|
:where(.vue-chat, .vue-chat *).border {
|
|
@@ -2014,6 +2014,16 @@
|
|
|
2014
2014
|
}
|
|
2015
2015
|
}
|
|
2016
2016
|
|
|
2017
|
+
:where(.vue-chat, .vue-chat *).bg-white\/15 {
|
|
2018
|
+
background-color: #ffffff26;
|
|
2019
|
+
}
|
|
2020
|
+
|
|
2021
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
2022
|
+
:where(.vue-chat, .vue-chat *).bg-white\/15 {
|
|
2023
|
+
background-color: color-mix(in oklab, var(--color-white) 15%, transparent);
|
|
2024
|
+
}
|
|
2025
|
+
}
|
|
2026
|
+
|
|
2017
2027
|
:where(.vue-chat, .vue-chat *).bg-linear-to-b {
|
|
2018
2028
|
--tw-gradient-position: to bottom;
|
|
2019
2029
|
}
|
|
@@ -2046,10 +2056,6 @@
|
|
|
2046
2056
|
background-image: var(--background-image-diamond-error);
|
|
2047
2057
|
}
|
|
2048
2058
|
|
|
2049
|
-
:where(.vue-chat, .vue-chat *).bg-diamond-primary-secondary {
|
|
2050
|
-
background-image: var(--background-image-diamond-primary-secondary);
|
|
2051
|
-
}
|
|
2052
|
-
|
|
2053
2059
|
:where(.vue-chat, .vue-chat *).bg-gradient-primary-secondary {
|
|
2054
2060
|
background-image: var(--background-image-gradient-primary-secondary);
|
|
2055
2061
|
}
|
|
@@ -2949,6 +2955,10 @@
|
|
|
2949
2955
|
user-select: text;
|
|
2950
2956
|
}
|
|
2951
2957
|
|
|
2958
|
+
:where(.vue-chat, .vue-chat *).\[unicode-bidi\:plaintext\] {
|
|
2959
|
+
unicode-bidi: plaintext;
|
|
2960
|
+
}
|
|
2961
|
+
|
|
2952
2962
|
:where(.vue-chat, .vue-chat *).\[vue-chat\:call\] {
|
|
2953
2963
|
vue-chat: call;
|
|
2954
2964
|
}
|
|
@@ -3274,10 +3284,22 @@
|
|
|
3274
3284
|
rotate: 180deg;
|
|
3275
3285
|
}
|
|
3276
3286
|
|
|
3287
|
+
:where(.vue-chat, .vue-chat *).rtl\:flex-row:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
|
3288
|
+
flex-direction: row;
|
|
3289
|
+
}
|
|
3290
|
+
|
|
3277
3291
|
:where(.vue-chat, .vue-chat *).rtl\:flex-row\!:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
|
3278
3292
|
flex-direction: row !important;
|
|
3279
3293
|
}
|
|
3280
3294
|
|
|
3295
|
+
:where(.vue-chat, .vue-chat *).rtl\:justify-end:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
|
3296
|
+
justify-content: flex-end;
|
|
3297
|
+
}
|
|
3298
|
+
|
|
3299
|
+
:where(.vue-chat, .vue-chat *).rtl\:justify-start:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) {
|
|
3300
|
+
justify-content: flex-start;
|
|
3301
|
+
}
|
|
3302
|
+
|
|
3281
3303
|
:where(.vue-chat, .vue-chat *):where(.rtl\:space-x-reverse:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) > :not(:last-child)) {
|
|
3282
3304
|
--tw-space-x-reverse: 1;
|
|
3283
3305
|
}
|
|
@@ -3809,15 +3831,15 @@
|
|
|
3809
3831
|
}
|
|
3810
3832
|
|
|
3811
3833
|
/* Styles remain exactly the same */
|
|
3812
|
-
:where(.vue-chat, .vue-chat *).flip-vertical[data-v-
|
|
3834
|
+
:where(.vue-chat, .vue-chat *).flip-vertical[data-v-cb7cc93f] {
|
|
3813
3835
|
transform: scaleY(-1);
|
|
3814
3836
|
will-change: transform;
|
|
3815
3837
|
}
|
|
3816
|
-
:where(.vue-chat, .vue-chat *)[data-index][data-v-
|
|
3838
|
+
:where(.vue-chat, .vue-chat *)[data-index][data-v-cb7cc93f] {
|
|
3817
3839
|
will-change: transform;
|
|
3818
3840
|
backface-visibility: hidden;
|
|
3819
3841
|
}
|
|
3820
|
-
@keyframes slide-in-right-
|
|
3842
|
+
@keyframes slide-in-right-cb7cc93f {
|
|
3821
3843
|
0% {
|
|
3822
3844
|
opacity: 0;
|
|
3823
3845
|
transform: scaleY(-1) translateX(30px);
|
|
@@ -3827,7 +3849,7 @@
|
|
|
3827
3849
|
transform: scaleY(-1) translateX(0);
|
|
3828
3850
|
}
|
|
3829
3851
|
}
|
|
3830
|
-
@keyframes slide-in-left-
|
|
3852
|
+
@keyframes slide-in-left-cb7cc93f {
|
|
3831
3853
|
0% {
|
|
3832
3854
|
opacity: 0;
|
|
3833
3855
|
transform: scaleY(-1) translateX(-30px);
|
|
@@ -3837,23 +3859,23 @@
|
|
|
3837
3859
|
transform: scaleY(-1) translateX(0);
|
|
3838
3860
|
}
|
|
3839
3861
|
}
|
|
3840
|
-
:where(.vue-chat, .vue-chat *).animate-slide-right[data-v-
|
|
3841
|
-
animation: slide-in-right-
|
|
3862
|
+
:where(.vue-chat, .vue-chat *).animate-slide-right[data-v-cb7cc93f] {
|
|
3863
|
+
animation: slide-in-right-cb7cc93f 300ms ease-out forwards;
|
|
3842
3864
|
will-change: transform, opacity;
|
|
3843
3865
|
}
|
|
3844
|
-
:where(.vue-chat, .vue-chat *).animate-slide-left[data-v-
|
|
3845
|
-
animation: slide-in-left-
|
|
3866
|
+
:where(.vue-chat, .vue-chat *).animate-slide-left[data-v-cb7cc93f] {
|
|
3867
|
+
animation: slide-in-left-cb7cc93f 300ms ease-out forwards;
|
|
3846
3868
|
will-change: transform, opacity;
|
|
3847
3869
|
}
|
|
3848
|
-
:where(.vue-chat, .vue-chat *)#list[data-v-
|
|
3870
|
+
:where(.vue-chat, .vue-chat *)#list[data-v-cb7cc93f] {
|
|
3849
3871
|
will-change: padding-top;
|
|
3850
3872
|
}
|
|
3851
|
-
:where(.vue-chat, .vue-chat *).animate-request-in[data-v-
|
|
3852
|
-
animation: request-in-
|
|
3873
|
+
:where(.vue-chat, .vue-chat *).animate-request-in[data-v-cb7cc93f] {
|
|
3874
|
+
animation: request-in-cb7cc93f 0.4s ease-out forwards;
|
|
3853
3875
|
overflow: hidden;
|
|
3854
3876
|
transform: scaleY(-1);
|
|
3855
3877
|
}
|
|
3856
|
-
@keyframes request-in-
|
|
3878
|
+
@keyframes request-in-cb7cc93f {
|
|
3857
3879
|
0% {
|
|
3858
3880
|
opacity: 0;
|
|
3859
3881
|
max-height: 0;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const index = require("./index-
|
|
3
|
+
const index = require("./index-efTNVoBF.cjs");
|
|
4
4
|
const vue = require("vue");
|
|
5
5
|
const core = require("@vueuse/core");
|
|
6
6
|
const Button = require("primevue/button");
|
|
@@ -175,35 +175,35 @@ function useCall() {
|
|
|
175
175
|
remoteParents: ui.remoteParents
|
|
176
176
|
};
|
|
177
177
|
}
|
|
178
|
-
const _hoisted_1 =
|
|
179
|
-
const _hoisted_2 = { class: "
|
|
180
|
-
const _hoisted_3 = { class: "
|
|
181
|
-
const _hoisted_4 = { class: "
|
|
182
|
-
const _hoisted_5 = { class: "
|
|
183
|
-
const _hoisted_6 = { class: "flex items-center
|
|
184
|
-
const _hoisted_7 = {
|
|
178
|
+
const _hoisted_1 = ["dir"];
|
|
179
|
+
const _hoisted_2 = { class: "relative h-full w-full" };
|
|
180
|
+
const _hoisted_3 = { class: "absolute top-3 right-3 left-3 z-10 flex items-center justify-between" };
|
|
181
|
+
const _hoisted_4 = { class: "flex items-center gap-x-2 rounded-full bg-black/40 px-3 py-1.5 backdrop-blur-sm" };
|
|
182
|
+
const _hoisted_5 = { class: "text-label-sm text-white/90 select-none" };
|
|
183
|
+
const _hoisted_6 = { class: "absolute right-3 bottom-3 left-3 z-10 flex items-center justify-between" };
|
|
184
|
+
const _hoisted_7 = { class: "flex items-center gap-2" };
|
|
185
|
+
const _hoisted_8 = {
|
|
185
186
|
key: 0,
|
|
186
187
|
class: "flex gap-1"
|
|
187
188
|
};
|
|
188
|
-
const
|
|
189
|
+
const _hoisted_9 = {
|
|
189
190
|
key: 0,
|
|
190
191
|
class: "flex h-7 w-7 items-center justify-center rounded-full bg-diamond-error"
|
|
191
192
|
};
|
|
192
|
-
const
|
|
193
|
+
const _hoisted_10 = {
|
|
193
194
|
key: 1,
|
|
194
195
|
class: "flex h-7 w-7 items-center justify-center rounded-full bg-diamond-error"
|
|
195
196
|
};
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
const _hoisted_11 = ["dir"];
|
|
198
|
+
const _hoisted_12 = { class: "flex items-center gap-x-4" };
|
|
199
|
+
const _hoisted_13 = { class: "hidden select-none text-label-lg text-white md:block" };
|
|
200
|
+
const _hoisted_14 = { class: "flex items-center gap-x-2 text-white text-body-sm" };
|
|
201
|
+
const _hoisted_15 = { "data-testid": "call-participants" };
|
|
202
|
+
const _hoisted_16 = { class: "flex items-center gap-x-4.5" };
|
|
203
|
+
const _hoisted_17 = {
|
|
204
|
+
dir: "ltr",
|
|
205
|
+
class: "flex h-6 items-center justify-center rounded-full bg-white/15 px-2.5 text-body-sm text-white tabular-nums select-none"
|
|
199
206
|
};
|
|
200
|
-
const _hoisted_11 = { class: "flex items-center gap-x-4" };
|
|
201
|
-
const _hoisted_12 = { class: "hidden select-none text-label-lg text-white md:block" };
|
|
202
|
-
const _hoisted_13 = { class: "flex items-center gap-x-2 text-white text-body-sm" };
|
|
203
|
-
const _hoisted_14 = { "data-testid": "call-participants" };
|
|
204
|
-
const _hoisted_15 = { class: "flex items-center gap-x-4.5" };
|
|
205
|
-
const _hoisted_16 = { class: "flex h-6 items-center justify-center rounded-full bg-diamond-error px-2 text-white select-none" };
|
|
206
|
-
const _hoisted_17 = { class: "text-body-sm" };
|
|
207
207
|
const _hoisted_18 = { class: "grid h-full min-h-0 w-full min-w-0 grid-cols-1 gap-4 md:grid-cols-[repeat(auto-fit,minmax(300px,1fr))]" };
|
|
208
208
|
const _hoisted_19 = { class: "absolute bottom-3 left-3 z-20 flex items-center gap-x-2" };
|
|
209
209
|
const _hoisted_20 = { class: "rounded bg-black-500 px-2 py-1 text-label-sm text-white select-none" };
|
|
@@ -230,6 +230,7 @@ const _hoisted_34 = { class: "text-label-md" };
|
|
|
230
230
|
const PIP_WIDTH = 280;
|
|
231
231
|
const PIP_HEIGHT = 160;
|
|
232
232
|
const PADDING = 16;
|
|
233
|
+
const PIP_INSET_Y = 96;
|
|
233
234
|
const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
234
235
|
__name: "Call",
|
|
235
236
|
setup(__props) {
|
|
@@ -237,8 +238,14 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
237
238
|
const minimizedRef = vue.ref(null);
|
|
238
239
|
const bodyRef = vue.ref(null);
|
|
239
240
|
const cameraPickerOpen = vue.ref(false);
|
|
240
|
-
const { t
|
|
241
|
+
const { t } = index.useLocalI18n(index.chat);
|
|
241
242
|
const { dir } = index.useDirection();
|
|
243
|
+
const chatStore = index.useChatStore();
|
|
244
|
+
const callTitle = vue.computed(() => {
|
|
245
|
+
const contact = callStore.channelId ? chatStore.getContactById(callStore.channelId) : null;
|
|
246
|
+
const name = contact ? `${contact.name} ${contact.lastName ?? ""}`.trim() : "";
|
|
247
|
+
return name || t("chat.call.title");
|
|
248
|
+
});
|
|
242
249
|
const {
|
|
243
250
|
toggleVideoPause,
|
|
244
251
|
toggleRemote,
|
|
@@ -350,7 +357,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
350
357
|
const { x, y, isDragging } = core.useDraggable(minimizedRef, {
|
|
351
358
|
initialValue: {
|
|
352
359
|
x: typeof window !== "undefined" ? window.innerWidth - PIP_WIDTH - PADDING : PADDING,
|
|
353
|
-
y:
|
|
360
|
+
y: PIP_INSET_Y
|
|
354
361
|
},
|
|
355
362
|
// غیرفعال کردن درگ در صورتی که کامپوننت مینیمایز نباشد
|
|
356
363
|
disabled: vue.computed(() => !callStore.isMinimized)
|
|
@@ -358,10 +365,9 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
358
365
|
vue.watch(isDragging, (dragging) => {
|
|
359
366
|
if (!dragging && callStore.isMinimized) {
|
|
360
367
|
const maxX = windowWidth.value - PIP_WIDTH - PADDING;
|
|
361
|
-
const maxY = windowHeight.value - PIP_HEIGHT -
|
|
362
|
-
dir.value === "rtl";
|
|
368
|
+
const maxY = windowHeight.value - PIP_HEIGHT - PIP_INSET_Y;
|
|
363
369
|
const targetX = x.value < windowWidth.value / 2 ? PADDING : maxX;
|
|
364
|
-
const targetY = y.value < windowHeight.value / 2 ?
|
|
370
|
+
const targetY = y.value < windowHeight.value / 2 ? PIP_INSET_Y : maxY;
|
|
365
371
|
x.value = targetX;
|
|
366
372
|
y.value = targetY;
|
|
367
373
|
}
|
|
@@ -373,7 +379,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
373
379
|
vue.nextTick(() => {
|
|
374
380
|
const isRtl = dir.value === "rtl";
|
|
375
381
|
x.value = isRtl ? PADDING : windowWidth.value - PIP_WIDTH - PADDING;
|
|
376
|
-
y.value =
|
|
382
|
+
y.value = PIP_INSET_Y;
|
|
377
383
|
});
|
|
378
384
|
}
|
|
379
385
|
},
|
|
@@ -399,7 +405,8 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
399
405
|
ref: minimizedRef,
|
|
400
406
|
"data-testid": "call-pip",
|
|
401
407
|
style: vue.normalizeStyle(clampedStyle.value),
|
|
402
|
-
|
|
408
|
+
dir: vue.unref(dir),
|
|
409
|
+
class: vue.normalizeClass(["vue-chat font-chat-family fixed w-70 h-40 bg-black-600 rounded-2xl shadow-floating z-9999 overflow-hidden border border-white/10 flex flex-col items-center justify-center cursor-move touch-none", [!vue.unref(isDragging) ? "transition-all duration-300 ease-out" : ""]])
|
|
403
410
|
}, [
|
|
404
411
|
vue.createElementVNode("video", {
|
|
405
412
|
ref_key: "pipVideoRef",
|
|
@@ -411,14 +418,14 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
411
418
|
}, null, 512),
|
|
412
419
|
_cache[18] || (_cache[18] = vue.createElementVNode("div", { class: "pointer-events-none absolute inset-0 bg-gradient-to-br from-blue-500/5 via-purple-500/5 to-pink-500/5 opacity-0 transition-opacity duration-500 group-hover:opacity-100" }, null, -1)),
|
|
413
420
|
_cache[19] || (_cache[19] = vue.createElementVNode("div", { class: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/50 via-transparent to-black/20" }, null, -1)),
|
|
414
|
-
vue.createElementVNode("div",
|
|
415
|
-
vue.createElementVNode("div",
|
|
416
|
-
vue.createElementVNode("div",
|
|
421
|
+
vue.createElementVNode("div", _hoisted_2, [
|
|
422
|
+
vue.createElementVNode("div", _hoisted_3, [
|
|
423
|
+
vue.createElementVNode("div", _hoisted_4, [
|
|
417
424
|
_cache[16] || (_cache[16] = vue.createElementVNode("div", { class: "relative" }, [
|
|
418
425
|
vue.createElementVNode("div", { class: "h-2.5 w-2.5 animate-pulse rounded-full bg-diamond-error" }),
|
|
419
426
|
vue.createElementVNode("div", { class: "absolute inset-0 h-2.5 w-2.5 animate-ping rounded-full bg-diamond-error/30" })
|
|
420
427
|
], -1)),
|
|
421
|
-
vue.createElementVNode("span",
|
|
428
|
+
vue.createElementVNode("span", _hoisted_5, vue.toDisplayString(vue.unref(t)("chat.call.active")), 1),
|
|
422
429
|
_cache[17] || (_cache[17] = vue.createElementVNode("div", { class: "flex -space-x-1" }, [
|
|
423
430
|
vue.createElementVNode("div", {
|
|
424
431
|
class: "h-1.5 w-1.5 animate-pulse rounded-full bg-green-400",
|
|
@@ -446,8 +453,8 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
446
453
|
onClick: vue.withModifiers(vue.unref(endCall), ["stop"])
|
|
447
454
|
}, null, 8, ["label", "onClick"])
|
|
448
455
|
]),
|
|
449
|
-
vue.createElementVNode("div",
|
|
450
|
-
vue.createElementVNode("div",
|
|
456
|
+
vue.createElementVNode("div", _hoisted_6, [
|
|
457
|
+
vue.createElementVNode("div", _hoisted_7, [
|
|
451
458
|
vue.createVNode(vue.unref(Button), {
|
|
452
459
|
label: String(vue.unref(participantCount)),
|
|
453
460
|
"aria-label": vue.unref(t)("chat.call.controls.nextParticipant"),
|
|
@@ -468,14 +475,14 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
468
475
|
]),
|
|
469
476
|
_: 1
|
|
470
477
|
}, 8, ["label", "aria-label", "disabled"]),
|
|
471
|
-
!vue.unref(isAudioOn) || !vue.unref(isVideoOn) ? (vue.openBlock(), vue.createElementBlock("div",
|
|
472
|
-
!vue.unref(isAudioOn) ? (vue.openBlock(), vue.createElementBlock("div",
|
|
478
|
+
!vue.unref(isAudioOn) || !vue.unref(isVideoOn) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_8, [
|
|
479
|
+
!vue.unref(isAudioOn) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_9, [
|
|
473
480
|
vue.createVNode(_component_BIcon, {
|
|
474
481
|
icon: "PhMicrophoneSlash",
|
|
475
482
|
class: "h-3 w-3 fill-white"
|
|
476
483
|
})
|
|
477
484
|
])) : vue.createCommentVNode("", true),
|
|
478
|
-
!vue.unref(isVideoOn) ? (vue.openBlock(), vue.createElementBlock("div",
|
|
485
|
+
!vue.unref(isVideoOn) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_10, [
|
|
479
486
|
vue.createVNode(_component_BIcon, {
|
|
480
487
|
icon: "PhVideoCameraSlash",
|
|
481
488
|
class: "h-3 w-3 fill-white"
|
|
@@ -496,8 +503,12 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
496
503
|
}, null, 8, ["label"])
|
|
497
504
|
])
|
|
498
505
|
])
|
|
499
|
-
],
|
|
500
|
-
vue.withDirectives(vue.createElementVNode("div",
|
|
506
|
+
], 14, _hoisted_1)) : vue.createCommentVNode("", true),
|
|
507
|
+
vue.withDirectives(vue.createElementVNode("div", {
|
|
508
|
+
"data-testid": "call-view",
|
|
509
|
+
dir: vue.unref(dir),
|
|
510
|
+
class: "vue-chat font-chat-family fixed inset-0 z-[60] flex h-full w-full flex-col bg-diamond-black"
|
|
511
|
+
}, [
|
|
501
512
|
!vue.unref(callStore).isMinimized ? (vue.openBlock(), vue.createElementBlock("div", {
|
|
502
513
|
key: 0,
|
|
503
514
|
class: vue.normalizeClass(["flex h-16 items-center justify-between px-4 transition-all duration-300 sm:h-20", vue.unref(showControls) ? "opacity-100" : "opacity-0"]),
|
|
@@ -506,24 +517,18 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
506
517
|
onMousemove: _cache[5] || (_cache[5] = //@ts-ignore
|
|
507
518
|
(...args) => vue.unref(resetControlsTimeout) && vue.unref(resetControlsTimeout)(...args))
|
|
508
519
|
}, [
|
|
509
|
-
vue.createElementVNode("div",
|
|
510
|
-
vue.createElementVNode("div",
|
|
511
|
-
vue.createElementVNode("div",
|
|
520
|
+
vue.createElementVNode("div", _hoisted_12, [
|
|
521
|
+
vue.createElementVNode("div", _hoisted_13, vue.toDisplayString(callTitle.value), 1),
|
|
522
|
+
vue.createElementVNode("div", _hoisted_14, [
|
|
512
523
|
vue.createVNode(_component_BIcon, {
|
|
513
524
|
icon: "PhUsers",
|
|
514
525
|
class: "h-4 w-4 fill-white"
|
|
515
526
|
}),
|
|
516
|
-
vue.createElementVNode("span",
|
|
527
|
+
vue.createElementVNode("span", _hoisted_15, vue.toDisplayString(vue.unref(t)("chat.call.participants", vue.unref(participantCount))), 1)
|
|
517
528
|
])
|
|
518
529
|
]),
|
|
519
|
-
vue.createElementVNode("div",
|
|
520
|
-
vue.createElementVNode("div",
|
|
521
|
-
vue.createElementVNode("div", _hoisted_17, vue.toDisplayString((/* @__PURE__ */ new Date()).toLocaleTimeString(vue.unref(locale), {
|
|
522
|
-
hour: "2-digit",
|
|
523
|
-
minute: "2-digit",
|
|
524
|
-
hour12: true
|
|
525
|
-
})), 1)
|
|
526
|
-
]),
|
|
530
|
+
vue.createElementVNode("div", _hoisted_16, [
|
|
531
|
+
vue.createElementVNode("div", _hoisted_17, vue.toDisplayString(vue.unref(index.formatDuration)(vue.unref(callStore).elapsedTime)), 1),
|
|
527
532
|
vue.createVNode(index._sfc_main, vue.mergeProps({
|
|
528
533
|
icon: "PhCaretDown",
|
|
529
534
|
label: vue.unref(t)("chat.call.controls.minimize")
|
|
@@ -552,7 +557,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
552
557
|
class: "absolute inset-0 z-0 h-full w-full object-cover"
|
|
553
558
|
}, null, 512),
|
|
554
559
|
vue.createElementVNode("div", _hoisted_19, [
|
|
555
|
-
vue.createElementVNode("div", _hoisted_20, vue.toDisplayString(vue.unref(t)("
|
|
560
|
+
vue.createElementVNode("div", _hoisted_20, vue.toDisplayString(vue.unref(t)("chat.call.yourPresentation")), 1),
|
|
556
561
|
vue.createElementVNode("div", _hoisted_21, [
|
|
557
562
|
vue.createVNode(_component_BIcon, {
|
|
558
563
|
icon: "PhMonitor",
|
|
@@ -639,7 +644,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
639
644
|
class: "absolute inset-0 z-0 h-full w-full object-cover"
|
|
640
645
|
}, null, 512),
|
|
641
646
|
vue.createElementVNode("div", _hoisted_24, [
|
|
642
|
-
vue.createElementVNode("div", _hoisted_25, vue.toDisplayString(vue.unref(t)("
|
|
647
|
+
vue.createElementVNode("div", _hoisted_25, vue.toDisplayString(vue.unref(t)("chat.call.presentationOf", { name: stream.name.slice(0, 15) })), 1),
|
|
643
648
|
vue.createElementVNode("div", _hoisted_26, [
|
|
644
649
|
vue.createVNode(_component_BIcon, {
|
|
645
650
|
icon: "PhMonitor",
|
|
@@ -691,7 +696,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
691
696
|
}, null, 512),
|
|
692
697
|
_cache[20] || (_cache[20] = vue.createElementVNode("div", { class: "pointer-events-none absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent" }, null, -1)),
|
|
693
698
|
vue.createElementVNode("div", _hoisted_27, [
|
|
694
|
-
vue.createElementVNode("div", _hoisted_28, vue.toDisplayString(vue.unref(t)("
|
|
699
|
+
vue.createElementVNode("div", _hoisted_28, vue.toDisplayString(vue.unref(t)("chat.call.you")), 1),
|
|
695
700
|
!vue.unref(isAudioOn) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_29, [
|
|
696
701
|
vue.createVNode(_component_BIcon, {
|
|
697
702
|
icon: "PhMicrophoneSlash",
|
|
@@ -718,9 +723,9 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
718
723
|
!vue.unref(isVideoOn) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_30, [
|
|
719
724
|
vue.createElementVNode("div", _hoisted_31, [
|
|
720
725
|
vue.createElementVNode("div", _hoisted_32, [
|
|
721
|
-
vue.createElementVNode("span", _hoisted_33, vue.toDisplayString(vue.unref(t)("
|
|
726
|
+
vue.createElementVNode("span", _hoisted_33, vue.toDisplayString(vue.unref(t)("chat.call.you")), 1)
|
|
722
727
|
]),
|
|
723
|
-
vue.createElementVNode("p", _hoisted_34, vue.toDisplayString(vue.unref(t)("
|
|
728
|
+
vue.createElementVNode("p", _hoisted_34, vue.toDisplayString(vue.unref(t)("chat.call.cameraIsOff")), 1)
|
|
724
729
|
])
|
|
725
730
|
])) : vue.createCommentVNode("", true)
|
|
726
731
|
], 2)) : vue.createCommentVNode("", true)
|
|
@@ -807,7 +812,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
807
812
|
onClick: vue.unref(endCall)
|
|
808
813
|
}, null, 8, ["label", "onClick"])
|
|
809
814
|
], 34)) : vue.createCommentVNode("", true)
|
|
810
|
-
],
|
|
815
|
+
], 8, _hoisted_11), [
|
|
811
816
|
[vue.vShow, vue.unref(callStore).isActive && !vue.unref(callStore).isMinimized]
|
|
812
817
|
])
|
|
813
818
|
], 64);
|
|
@@ -815,4 +820,4 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
815
820
|
}
|
|
816
821
|
});
|
|
817
822
|
exports.default = _sfc_main;
|
|
818
|
-
//# sourceMappingURL=Call-
|
|
823
|
+
//# sourceMappingURL=Call-CDT92h1x.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Call-CDT92h1x.cjs","sources":["../../app/composables/call/useCallUi.ts","../../app/composables/useCall.ts","../../app/components/call/Call.vue"],"sourcesContent":["import { nextTick, onMounted, onUnmounted, ref, watch, type Ref } from \"vue\";\nimport type { RemoteStream } from \"./peers\";\n\nexport interface CallUiOptions {\n localStream: Ref<MediaStream | null>;\n screenStream: Ref<MediaStream | null>;\n remoteVideos: Ref<Record<string, RemoteStream>>;\n remoteScreens: Ref<Record<string, RemoteStream>>;\n /** Re-attach streams when this changes: minimizing swaps the <video> elements. */\n isMinimized: () => boolean;\n}\n\nconst CONTROLS_HIDE_AFTER_MS = 3000;\n\n/** The call screen's view state, and keeping each <video> element showing the right stream. */\nexport function useCallUi(opts: CallUiOptions) {\n const { localStream, screenStream, remoteVideos, remoteScreens } = opts;\n\n // Template refs, bound by Call.vue.\n const localVideo = ref<HTMLVideoElement | null>(null);\n const localScreen = ref<HTMLVideoElement | null>(null);\n const remoteRefs = ref<Record<string, HTMLVideoElement | null>>({});\n const remoteScreenRefs = ref<Record<string, HTMLVideoElement | undefined>>({});\n const remoteParents = ref<Record<string, HTMLElement>>({});\n\n // --- Controls fade out after a few seconds without input ---\n const showControls = ref(true);\n let controlsTimeout: ReturnType<typeof setTimeout> | undefined;\n function resetControlsTimeout() {\n showControls.value = true;\n clearTimeout(controlsTimeout);\n controlsTimeout = setTimeout(\n () => (showControls.value = false),\n CONTROLS_HIDE_AFTER_MS,\n );\n }\n const inputEvents = [\"mousemove\", \"click\", \"keydown\"] as const;\n onMounted(() => {\n resetControlsTimeout();\n inputEvents.forEach((e) => document.addEventListener(e, resetControlsTimeout));\n });\n onUnmounted(() => {\n inputEvents.forEach((e) => document.removeEventListener(e, resetControlsTimeout));\n clearTimeout(controlsTimeout);\n // The call goes on; only this view lets go of its elements.\n detachAll();\n });\n\n // --- Fullscreen: the whole call, or a single tile ---\n const isFullscreen = ref(false);\n function toggleFullscreen(target: HTMLElement = document.documentElement) {\n if (!document.fullscreenElement) {\n void target.requestFullscreen?.();\n isFullscreen.value = true;\n } else {\n void document.exitFullscreen();\n isFullscreen.value = false;\n }\n }\n const toggleRemote = (tileId: string, el?: HTMLElement) => {\n const container = el ?? remoteParents.value[tileId];\n if (container) toggleFullscreen(container);\n };\n\n // --- Pausing a single tile ---\n const videoPaused = ref<Record<string, boolean>>({});\n function toggleVideoPause(tileId: string, el: HTMLVideoElement | null | undefined) {\n if (!(el instanceof HTMLVideoElement)) return;\n if (videoPaused.value[tileId]) void el.play();\n else el.pause();\n videoPaused.value[tileId] = !videoPaused.value[tileId];\n }\n\n // --- Keep each <video> showing its stream ---\n const attach = (el: HTMLVideoElement | null | undefined, stream: MediaStream) => {\n if (!el) return;\n if (el.srcObject !== stream) el.srcObject = stream;\n el.play().catch(() => {});\n };\n\n watch(\n [localStream, opts.isMinimized],\n async () => {\n await nextTick();\n if (localStream.value && localVideo.value)\n localVideo.value.srcObject = localStream.value;\n },\n { immediate: true },\n );\n watch(\n [screenStream, opts.isMinimized],\n async () => {\n await nextTick();\n if (localScreen.value) localScreen.value.srcObject = screenStream.value;\n },\n { immediate: true },\n );\n watch(\n [() => ({ ...remoteVideos.value }), opts.isMinimized],\n async () => {\n await nextTick();\n for (const [id, { stream }] of Object.entries(remoteVideos.value))\n attach(remoteRefs.value[id], stream);\n },\n { immediate: true },\n );\n watch(\n [() => ({ ...remoteScreens.value }), opts.isMinimized],\n async () => {\n await nextTick();\n for (const [id, { stream }] of Object.entries(remoteScreens.value))\n attach(remoteScreenRefs.value[id], stream);\n },\n { immediate: true },\n );\n\n /** Detaches every <video>, so no element keeps a stopped stream alive. */\n function detachAll() {\n const all = [\n localVideo.value,\n localScreen.value,\n ...Object.values(remoteRefs.value),\n ...Object.values(remoteScreenRefs.value),\n ];\n for (const el of all) if (el) el.srcObject = null;\n }\n\n return {\n localVideo,\n localScreen,\n remoteRefs,\n remoteScreenRefs,\n remoteParents,\n showControls,\n resetControlsTimeout,\n isFullscreen,\n toggleFullscreen: () => toggleFullscreen(),\n toggleRemote,\n videoPaused,\n toggleVideoPause,\n detachAll,\n };\n}\n","import { ref } from \"vue\";\nimport { useCallStore } from \"~/stores/callStore\";\nimport { useCallUi } from \"./call/useCallUi\";\n\n/**\n * The view side of the running call, for Call.vue. The call itself (signalling, peers, media)\n * lives in the call store, so unmounting this view doesn't end it.\n */\nexport default function useCall() {\n const callStore = useCallStore();\n const session = callStore.session;\n if (!session) {\n throw new Error(\"[vue-chat] useCall() needs a running call: callStore.startCall() first\");\n }\n const { media, peers } = session;\n\n const ui = useCallUi({\n localStream: media.localStream,\n screenStream: media.screenStream,\n remoteVideos: peers.remoteVideos,\n remoteScreens: peers.remoteScreens,\n isMinimized: () => callStore.isMinimized,\n });\n\n async function switchCamera(deviceId: string) {\n const stream = await session!.switchCamera(deviceId);\n // Same stream object with a new track: the preview has to be told.\n if (stream && ui.localVideo.value) ui.localVideo.value.srcObject = stream;\n }\n\n return {\n // Call state\n participantCount: session.participantCount,\n tileCount: session.tileCount,\n localStream: media.localStream,\n remoteVideos: peers.remoteVideos,\n remoteScreens: peers.remoteScreens,\n // Local media\n cameras: media.cameras,\n isAudioOn: media.isAudioOn,\n isVideoOn: media.isVideoOn,\n isScreenSharing: media.isScreenSharing,\n isFlashlightOn: media.isFlashlightOn,\n isFlashlightSupported: media.isFlashlightSupported,\n toggleAudio: media.toggleAudio,\n toggleVideo: media.toggleVideo,\n toggleFlashlight: media.toggleFlashlight,\n toggleScreenShare: session.toggleScreenShare,\n switchCamera,\n endCall: callStore.endCall,\n // View\n showCameraModal: ref(false),\n showControls: ui.showControls,\n resetControlsTimeout: ui.resetControlsTimeout,\n isFullscreen: ui.isFullscreen,\n toggleFullscreen: ui.toggleFullscreen,\n toggleRemote: ui.toggleRemote,\n videoPaused: ui.videoPaused,\n toggleVideoPause: ui.toggleVideoPause,\n localVideo: ui.localVideo,\n localScreen: ui.localScreen,\n remoteRefs: ui.remoteRefs,\n remoteScreenRefs: ui.remoteScreenRefs,\n remoteParents: ui.remoteParents,\n };\n}\n","<script setup lang=\"ts\">\nimport { useCallStore } from \"~/stores/callStore\";\nimport { useChatStore } from \"~/stores/chatStore\";\nimport { formatDuration } from \"~/utils/format\";\nimport useLocalI18n, { useDirection } from \"~/composables/useLocalI18n\";\nimport { chat } from \"@i18n/locales\";\nimport useCall from \"~/composables/useCall\";\nimport { useDraggable, useWindowSize } from \"@vueuse/core\";\nimport { ref, computed, watch, onMounted, nextTick } from \"vue\";\nimport Button from \"primevue/button\";\nimport Listbox from \"primevue/listbox\";\nimport IconButton from \"~/components/general/IconButton.vue\";\nimport ResponsiveDialog from \"~/components/general/ResponsiveDialog.vue\";\n\nconst callStore = useCallStore();\n\n// ارجاع به المان مینیمایز شده برای VueUse\nconst minimizedRef = ref<HTMLElement | null>(null);\nconst bodyRef = ref<HTMLElement | null>(null);\nconst cameraPickerOpen = ref(false);\nconst { t } = useLocalI18n(chat);\nconst { dir } = useDirection();\n\n// Named after whoever is on the other end of the conversation the call belongs to.\nconst chatStore = useChatStore();\nconst callTitle = computed(() => {\n const contact = callStore.channelId ? chatStore.getContactById(callStore.channelId) : null;\n const name = contact ? `${contact.name} ${contact.lastName ?? \"\"}`.trim() : \"\";\n return name || t(\"chat.call.title\");\n});\n\nconst {\n toggleVideoPause,\n toggleRemote,\n participantCount,\n endCall,\n toggleFullscreen,\n toggleFlashlight,\n toggleScreenShare,\n toggleAudio,\n toggleVideo,\n switchCamera,\n isFlashlightSupported,\n tileCount,\n isAudioOn,\n isVideoOn,\n isFlashlightOn,\n isFullscreen,\n isScreenSharing,\n showControls,\n resetControlsTimeout,\n cameras,\n videoPaused,\n localStream,\n localVideo,\n localScreen,\n remoteParents,\n remoteRefs,\n remoteScreens,\n remoteScreenRefs,\n remoteVideos,\n} = useCall();\n\nconst pickCamera = (deviceId: string) => {\n cameraPickerOpen.value = false;\n switchCamera(deviceId);\n};\n\n// The call screen is dark whatever the host's colour scheme, so its round controls use fixed\n// translucent tokens instead of the theme's secondary and contrast colours.\nconst translucent = {\n background: \"rgb(255 255 255 / 0.12)\",\n hoverBackground: \"rgb(255 255 255 / 0.2)\",\n activeBackground: \"rgb(255 255 255 / 0.28)\",\n borderColor: \"transparent\",\n hoverBorderColor: \"transparent\",\n activeBorderColor: \"transparent\",\n color: \"#ffffff\",\n hoverColor: \"#ffffff\",\n activeColor: \"#ffffff\",\n};\nconst lit = {\n background: \"#ffffff\",\n hoverBackground: \"rgb(255 255 255 / 0.9)\",\n activeBackground: \"rgb(255 255 255 / 0.8)\",\n borderColor: \"#ffffff\",\n hoverBorderColor: \"#ffffff\",\n activeBorderColor: \"#ffffff\",\n color: \"#151823\",\n hoverColor: \"#151823\",\n activeColor: \"#151823\",\n};\nconst callScheme = { root: { secondary: translucent, contrast: lit } };\nconst callButtonDt = { colorScheme: { light: callScheme, dark: callScheme } };\n\nconst footerButton = {\n dt: callButtonDt,\n text: false,\n size: \"large\",\n iconClass: \"size-6\",\n} as const;\n\n// --- PIP BACKGROUND VIDEO ---\n// در حالت مینیمایز، پسزمینه PIP یک ویدیوی زنده است: اگر کاربر ریموت فعال باشد\n// استریم آن کاربر نمایش داده میشود؛ در غیر این صورت استریم محلی کاربر.\nconst pipVideoRef = ref<HTMLVideoElement | null>(null);\nconst activeRemoteIndex = ref(0);\n\nconst remoteVideoEntries = computed(() => Object.entries(remoteVideos.value));\nconst hasRemoteVideos = computed(() => remoteVideoEntries.value.length > 0);\nconst activeRemoteUserId = computed<string | null>(() => {\n const entries = remoteVideoEntries.value;\n if (entries.length === 0) return null;\n return entries[activeRemoteIndex.value % entries.length][0];\n});\n\nconst pipStream = computed<MediaStream | null>(() => {\n if (hasRemoteVideos.value) {\n const id = activeRemoteUserId.value;\n return id ? (remoteVideos.value[id]?.stream ?? null) : null;\n }\n return localStream.value ?? null;\n});\n\nfunction cycleRemote() {\n const count = remoteVideoEntries.value.length;\n if (count === 0) return;\n activeRemoteIndex.value = (activeRemoteIndex.value + 1) % count;\n}\n\nwatch(\n [pipStream, () => callStore.isMinimized],\n async () => {\n await nextTick();\n const el = pipVideoRef.value;\n if (!el) return;\n const stream = pipStream.value;\n if (stream && el.srcObject !== stream) {\n el.srcObject = stream;\n el.play().catch(() => {});\n } else if (!stream && el.srcObject) {\n el.srcObject = null;\n }\n },\n { immediate: true },\n);\n\nonMounted(() => {\n bodyRef.value = document.body;\n});\n\n// --- DRAG LOGIC WITH BOUNDARIES & CORNER SNAPPING ---\nconst { width: windowWidth, height: windowHeight } = useWindowSize();\n\nconst PIP_WIDTH = 280; // معادل w-70 در Tailwind\nconst PIP_HEIGHT = 160; // معادل h-40 در Tailwind\nconst PADDING = 16;\n// Top and bottom corners stay this far from the edges, clear of the chat header and the composer.\nconst PIP_INSET_Y = 96;\n\n// ۱. راهاندازی Draggable روی عنصر minimizedRef\nconst { x, y, isDragging } = useDraggable(minimizedRef, {\n initialValue: {\n x:\n typeof window !== \"undefined\"\n ? window.innerWidth - PIP_WIDTH - PADDING\n : PADDING,\n y: PIP_INSET_Y,\n },\n // غیرفعال کردن درگ در صورتی که کامپوننت مینیمایز نباشد\n disabled: computed(() => !callStore.isMinimized),\n});\n\n// ۲. اسنپ شدن به نزدیکترین گوشه بعد از رها کردن کلیک/لمس\nwatch(isDragging, (dragging) => {\n if (!dragging && callStore.isMinimized) {\n const maxX = windowWidth.value - PIP_WIDTH - PADDING;\n const maxY = windowHeight.value - PIP_HEIGHT - PIP_INSET_Y;\n\n // پیدا کردن نزدیکترین گوشه بر اساس موقعیت فعلی درگ شده\n const targetX = x.value < windowWidth.value / 2 ? PADDING : maxX;\n const targetY = y.value < windowHeight.value / 2 ? PIP_INSET_Y : maxY;\n\n x.value = targetX;\n y.value = targetY;\n }\n});\n\n// بازنشانی موقعیت به گوشه مناسب در هنگام مینیمایز شدن مجدد\nwatch(\n () => callStore.isMinimized,\n (isMinimized) => {\n if (isMinimized) {\n nextTick(() => {\n const isRtl = dir.value === \"rtl\";\n x.value = isRtl ? PADDING : windowWidth.value - PIP_WIDTH - PADDING;\n // The top corner, where it covers older messages rather than the composer.\n y.value = PIP_INSET_Y;\n });\n }\n },\n { immediate: true },\n);\n\n// ۳. محدود کردن مختصات در محدوده مانیتور و خروجی استایل\nconst clampedStyle = computed(() => {\n if (!callStore.isMinimized) return {};\n\n const maxX = windowWidth.value - PIP_WIDTH - PADDING;\n const maxY = windowHeight.value - PIP_HEIGHT - PADDING;\n\n const safeX = Math.max(PADDING, Math.min(x.value, maxX));\n const safeY = Math.max(PADDING, Math.min(y.value, maxY));\n\n return {\n left: `${safeX}px`,\n top: `${safeY}px`,\n };\n});\n</script>\n\n<template>\n <!-- استفاده از div معمولی به جای motion.div و اعمال پوزیشن با clampedStyle -->\n <div\n v-if=\"callStore.isActive && callStore.isMinimized\"\n ref=\"minimizedRef\"\n data-testid=\"call-pip\"\n :style=\"clampedStyle\"\n :dir=\"dir\"\n class=\"vue-chat font-chat-family fixed w-70 h-40 bg-black-600 rounded-2xl shadow-floating z-9999 overflow-hidden border border-white/10 flex flex-col items-center justify-center cursor-move touch-none\"\n :class=\"[!isDragging ? 'transition-all duration-300 ease-out' : '']\"\n >\n <video\n ref=\"pipVideoRef\"\n muted\n autoplay\n playsinline\n class=\"pointer-events-none absolute inset-0 z-0 h-full w-full object-cover\"\n />\n <div\n class=\"pointer-events-none absolute inset-0 bg-gradient-to-br from-blue-500/5 via-purple-500/5 to-pink-500/5 opacity-0 transition-opacity duration-500 group-hover:opacity-100\"\n />\n <div\n class=\"pointer-events-none absolute inset-0 bg-gradient-to-t from-black/50 via-transparent to-black/20\"\n />\n\n <div class=\"relative h-full w-full\">\n <div\n class=\"absolute top-3 right-3 left-3 z-10 flex items-center justify-between\"\n >\n <div\n class=\"flex items-center gap-x-2 rounded-full bg-black/40 px-3 py-1.5 backdrop-blur-sm\"\n >\n <div class=\"relative\">\n <div\n class=\"h-2.5 w-2.5 animate-pulse rounded-full bg-diamond-error\"\n />\n <div\n class=\"absolute inset-0 h-2.5 w-2.5 animate-ping rounded-full bg-diamond-error/30\"\n />\n </div>\n <span class=\"text-label-sm text-white/90 select-none\">{{\n t(\"chat.call.active\")\n }}</span>\n <div class=\"flex -space-x-1\">\n <div\n class=\"h-1.5 w-1.5 animate-pulse rounded-full bg-green-400\"\n style=\"animation-delay: 0s\"\n />\n <div\n class=\"h-1.5 w-1.5 animate-pulse rounded-full bg-green-400\"\n style=\"animation-delay: 0.2s\"\n />\n <div\n class=\"h-1.5 w-1.5 animate-pulse rounded-full bg-green-400\"\n style=\"animation-delay: 0.4s\"\n />\n </div>\n </div>\n\n <IconButton\n icon=\"PhPhoneX\"\n :label=\"t('chat.call.controls.endCall')\"\n severity=\"danger\"\n :text=\"false\"\n icon-class=\"size-4\"\n data-testid=\"call-pip-end\"\n @pointerdown.stop\n @click.stop=\"endCall\"\n />\n </div>\n\n <div\n class=\"absolute right-3 bottom-3 left-3 z-10 flex items-center justify-between\"\n >\n <div class=\"flex items-center gap-2\">\n <Button\n :label=\"String(participantCount)\"\n :aria-label=\"t('chat.call.controls.nextParticipant')\"\n :disabled=\"!hasRemoteVideos\"\n :dt=\"callButtonDt\"\n severity=\"secondary\"\n size=\"small\"\n rounded\n @pointerdown.stop\n @click.stop=\"cycleRemote\"\n >\n <template #icon>\n <BIcon icon=\"PhUsers\" class=\"size-3\" />\n </template>\n </Button>\n\n <div v-if=\"!isAudioOn || !isVideoOn\" class=\"flex gap-1\">\n <div\n v-if=\"!isAudioOn\"\n class=\"flex h-7 w-7 items-center justify-center rounded-full bg-diamond-error\"\n >\n <BIcon icon=\"PhMicrophoneSlash\" class=\"h-3 w-3 fill-white\" />\n </div>\n <div\n v-if=\"!isVideoOn\"\n class=\"flex h-7 w-7 items-center justify-center rounded-full bg-diamond-error\"\n >\n <BIcon icon=\"PhVideoCameraSlash\" class=\"h-3 w-3 fill-white\" />\n </div>\n </div>\n </div>\n\n <IconButton\n icon=\"PhResize\"\n :label=\"t('chat.call.controls.maximize')\"\n :dt=\"callButtonDt\"\n :text=\"false\"\n icon-class=\"size-4\"\n data-testid=\"call-maximize\"\n @pointerdown.stop\n @click.stop=\"callStore.maximize()\"\n />\n </div>\n </div>\n </div>\n\n <div\n v-show=\"callStore.isActive && !callStore.isMinimized\"\n data-testid=\"call-view\"\n :dir=\"dir\"\n class=\"vue-chat font-chat-family fixed inset-0 z-[60] flex h-full w-full flex-col bg-diamond-black\"\n >\n <!-- Header -->\n <div\n v-if=\"!callStore.isMinimized\"\n class=\"flex h-16 items-center justify-between px-4 transition-all duration-300 sm:h-20\"\n :class=\"showControls ? 'opacity-100' : 'opacity-0'\"\n @mouseenter=\"resetControlsTimeout\"\n @mousemove=\"resetControlsTimeout\"\n >\n <div class=\"flex items-center gap-x-4\">\n <div class=\"hidden select-none text-label-lg text-white md:block\">\n {{ callTitle }}\n </div>\n <div class=\"flex items-center gap-x-2 text-white text-body-sm\">\n <BIcon icon=\"PhUsers\" class=\"h-4 w-4 fill-white\" />\n <span data-testid=\"call-participants\"\n>{{ t(\"chat.call.participants\", participantCount) }}</span>\n </div>\n </div>\n <div class=\"flex items-center gap-x-4.5\">\n <div\n dir=\"ltr\"\n class=\"flex h-6 items-center justify-center rounded-full bg-white/15 px-2.5 text-body-sm text-white tabular-nums select-none\"\n >\n {{ formatDuration(callStore.elapsedTime) }}\n </div>\n <IconButton\n icon=\"PhCaretDown\"\n :label=\"t('chat.call.controls.minimize')\"\n v-bind=\"footerButton\"\n data-testid=\"call-minimize\"\n @click=\"callStore.minimize\"\n />\n </div>\n </div>\n\n <!-- Main Content -->\n <div\n class=\"relative grid w-full overflow-hidden\"\n :class=\"callStore.isMinimized ? 'h-full p-0' : 'h-full p-4'\"\n @mousemove=\"resetControlsTimeout\"\n >\n <div\n v-show=\"tileCount\"\n class=\"grid h-full min-h-0 w-full min-w-0 grid-cols-1 gap-4 md:grid-cols-[repeat(auto-fit,minmax(300px,1fr))]\"\n >\n <div\n v-show=\"isScreenSharing\"\n :ref=\"(el) => (remoteParents[`self_screen`] = el as any)\"\n class=\"group relative flex aspect-video h-full w-full flex-col items-center justify-center overflow-hidden rounded-2xl border-2 border-chat-primary/0 bg-black-600 p-2\"\n >\n <video\n ref=\"localScreen\"\n autoplay\n muted\n playsinline\n class=\"absolute inset-0 z-0 h-full w-full object-cover\"\n />\n\n <div class=\"absolute bottom-3 left-3 z-20 flex items-center gap-x-2\">\n <div\n class=\"rounded bg-black-500 px-2 py-1 text-label-sm text-white select-none\"\n >\n {{ t(\"chat.call.yourPresentation\") }}\n </div>\n <div\n class=\"flex h-10 w-10 items-center justify-center rounded-full bg-black-500\"\n >\n <BIcon icon=\"PhMonitor\" class=\"h-4 w-4 fill-white\" />\n </div>\n <IconButton\n :icon=\"videoPaused['self_screen'] ? 'PhPlay' : 'PhPause'\"\n :label=\"videoPaused['self_screen'] ? t('chat.call.controls.playVideo') : t('chat.call.controls.pauseVideo')\"\n :dt=\"callButtonDt\"\n :text=\"false\"\n icon-class=\"size-4\"\n @click=\"toggleVideoPause('self_screen', localScreen as any)\"\n />\n <IconButton\n :icon=\"isFullscreen ? 'PhCornersIn' : 'PhFrameCorners'\"\n :label=\"\n\n isFullscreen\n\n ? t('chat.call.controls.exitFullscreen')\n\n : t('chat.call.controls.fullscreen')\n\n \"\n :dt=\"callButtonDt\"\n :text=\"false\"\n icon-class=\"size-4\"\n @click=\"toggleRemote(`self_screen`)\"\n />\n </div>\n </div>\n <div\n v-for=\"(stream, remoteUserId) in remoteVideos\"\n :key=\"`remote-${remoteUserId}`\"\n data-testid=\"call-remote-video\"\n :ref=\"\n (el) => (remoteParents[`remote_video_${remoteUserId}`] = el as any)\n \"\n class=\"group relative flex aspect-video h-full w-full flex-col items-center justify-center overflow-hidden rounded-2xl border-2 border-chat-primary/0 bg-black-600 p-2\"\n >\n <video\n :ref=\"\n (el) => {\n if (el) remoteRefs[remoteUserId] = el as any;\n }\n \"\n autoplay\n playsinline\n class=\"absolute inset-0 z-0 h-full w-full object-cover\"\n />\n\n <div class=\"absolute bottom-2 left-2 z-20 flex items-center gap-x-1\">\n <div\n class=\"rounded bg-black-500 px-1.5 py-0.5 text-label-sm text-white select-none\"\n >\n {{ stream.name.slice(0, 15) }}\n </div>\n <IconButton\n :icon=\"videoPaused[`remote_video_${remoteUserId}`] ? 'PhPlay' : 'PhPause'\"\n :label=\"\n videoPaused[`remote_video_${remoteUserId}`]\n ? t('chat.call.controls.playVideo')\n : t('chat.call.controls.pauseVideo')\n \"\n :dt=\"callButtonDt\"\n :text=\"false\"\n icon-class=\"size-4\"\n @click=\"\n toggleVideoPause(\n `remote_video_${remoteUserId}`,\n remoteRefs[remoteUserId] as any,\n )\n \"\n />\n <IconButton\n :icon=\"isFullscreen ? 'PhCornersIn' : 'PhFrameCorners'\"\n :label=\"\n\n isFullscreen\n\n ? t('chat.call.controls.exitFullscreen')\n\n : t('chat.call.controls.fullscreen')\n\n \"\n :dt=\"callButtonDt\"\n :text=\"false\"\n icon-class=\"size-4\"\n @click=\"toggleRemote(`remote_video_${remoteUserId}`)\"\n />\n </div>\n </div>\n\n <div\n v-for=\"(stream, remoteUserId) in remoteScreens\"\n :key=\"`remote-screen-${remoteUserId}`\"\n data-testid=\"call-remote-screen\"\n :ref=\"\n (el) => (remoteParents[`remote_screen_${remoteUserId}`] = el as any)\n \"\n class=\"group relative flex aspect-video h-full w-full flex-col items-center justify-center overflow-hidden rounded-2xl border-2 border-chat-primary/0 bg-black-600 p-2\"\n >\n <video\n :ref=\"\n (el) => {\n if (el) remoteScreenRefs[remoteUserId] = el as any;\n }\n \"\n autoplay\n muted\n playsinline\n class=\"absolute inset-0 z-0 h-full w-full object-cover\"\n />\n\n <div class=\"absolute bottom-3 left-3 z-20 flex items-center gap-x-2\">\n <div\n class=\"rounded bg-black-500 px-2 py-1 text-label-sm text-white select-none\"\n >\n {{ t(\"chat.call.presentationOf\", { name: stream.name.slice(0, 15) }) }}\n </div>\n <div\n class=\"flex h-10 w-10 items-center justify-center rounded-full bg-black-500\"\n >\n <BIcon icon=\"PhMonitor\" class=\"h-4 w-4 fill-white\" />\n </div>\n <IconButton\n :icon=\"videoPaused[`remote_screen_${remoteUserId}`] ? 'PhPlay' : 'PhPause'\"\n :label=\"\n videoPaused[`remote_screen_${remoteUserId}`]\n ? t('chat.call.controls.playVideo')\n : t('chat.call.controls.pauseVideo')\n \"\n :dt=\"callButtonDt\"\n :text=\"false\"\n icon-class=\"size-4\"\n @click=\"\n toggleVideoPause(\n `remote_screen_${remoteUserId}`,\n remoteScreenRefs[remoteUserId] || null,\n )\n \"\n />\n <IconButton\n :icon=\"isFullscreen ? 'PhCornersIn' : 'PhFrameCorners'\"\n :label=\"\n\n isFullscreen\n\n ? t('chat.call.controls.exitFullscreen')\n\n : t('chat.call.controls.fullscreen')\n\n \"\n :dt=\"callButtonDt\"\n :text=\"false\"\n icon-class=\"size-4\"\n @click=\"toggleRemote(`remote_screen_${remoteUserId}`)\"\n />\n </div>\n </div>\n </div>\n\n <!-- وبکم محلی (وقتی هنوز کارهای دیگر در صفحه فعال است) -->\n <div class=\"flex min-h-0\" :class=\"[tileCount && 'absolute inset-0 m-4']\">\n <div\n v-if=\"!callStore.isMinimized\"\n class=\"relative flex flex-col items-center justify-center overflow-hidden rounded-2xl border-2 border-chat-primary/0 bg-black-600 p-2\"\n :class=\"[\n tileCount ? 'absolute z-10 h-[132px] w-[236px]' : 'h-full w-full',\n ]\"\n >\n <video\n ref=\"localVideo\"\n data-testid=\"call-local-video\"\n autoplay\n muted\n playsinline\n class=\"pointer-events-none absolute inset-0 z-0 h-full w-full object-cover\"\n />\n\n <div\n class=\"pointer-events-none absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent\"\n />\n\n <div class=\"absolute bottom-3 left-3 z-20 flex items-center gap-x-2\">\n <div\n class=\"rounded bg-black-500 px-2 py-1 text-label-sm text-white select-none\"\n >\n {{ t(\"chat.call.you\") }}\n </div>\n <div\n v-if=\"!isAudioOn\"\n class=\"flex h-7 w-7 items-center justify-center rounded-full bg-diamond-error\"\n >\n <BIcon icon=\"PhMicrophoneSlash\" class=\"h-3 w-3 fill-white\" />\n </div>\n <IconButton\n :icon=\"videoPaused['self_cam'] ? 'PhPlay' : 'PhPause'\"\n :label=\"videoPaused['self_cam'] ? t('chat.call.controls.playVideo') : t('chat.call.controls.pauseVideo')\"\n :dt=\"callButtonDt\"\n :text=\"false\"\n icon-class=\"size-4\"\n @click=\"toggleVideoPause('self_cam', localVideo as any)\"\n />\n <IconButton\n :icon=\"isFullscreen ? 'PhCornersIn' : 'PhFrameCorners'\"\n :label=\"\n\n isFullscreen\n\n ? t('chat.call.controls.exitFullscreen')\n\n : t('chat.call.controls.fullscreen')\n\n \"\n :dt=\"callButtonDt\"\n :text=\"false\"\n icon-class=\"size-4\"\n @click=\"toggleRemote('self_cam')\"\n />\n </div>\n\n <div\n v-if=\"!isVideoOn\"\n class=\"absolute inset-0 flex items-center justify-center bg-black-600\"\n >\n <div class=\"text-center text-white\">\n <div\n class=\"mx-auto mb-2 flex h-16 w-16 items-center justify-center rounded-full bg-chat-primary\"\n >\n <span class=\"text-title-lg font-semibold\">{{ t(\"chat.call.you\") }}</span>\n </div>\n <p class=\"text-label-md\">{{ t(\"chat.call.cameraIsOff\") }}</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer Controls -->\n <div\n v-if=\"!callStore.isMinimized\"\n class=\"flex h-21 w-full items-center justify-center gap-x-1.5 border-t border-t-[#2C2C2E] bg-black-600 transition-all duration-300 sm:gap-x-3\"\n :class=\"showControls ? 'opacity-100' : 'opacity-0'\"\n @mouseenter=\"resetControlsTimeout\"\n @mousemove=\"resetControlsTimeout\"\n >\n <IconButton\n :icon=\"isAudioOn ? 'PhMicrophone' : 'PhMicrophoneSlash'\"\n :label=\"isAudioOn ? t('chat.call.controls.mute') : t('chat.call.controls.unmute')\"\n :severity=\"isAudioOn ? 'secondary' : 'contrast'\"\n v-bind=\"footerButton\"\n data-testid=\"call-toggle-audio\"\n :data-active=\"isAudioOn\"\n @click=\"toggleAudio\"\n />\n\n <IconButton\n :icon=\"isVideoOn ? 'PhVideo' : 'PhVideoCameraSlash'\"\n :label=\"isVideoOn ? t('chat.call.controls.cameraOff') : t('chat.call.controls.cameraOn')\"\n :severity=\"isVideoOn ? 'secondary' : 'contrast'\"\n v-bind=\"footerButton\"\n data-testid=\"call-toggle-video\"\n :data-active=\"isVideoOn\"\n @click=\"toggleVideo\"\n />\n\n <template v-if=\"cameras.length > 1\">\n <IconButton\n icon=\"PhCaretUp\"\n :label=\"t('chat.call.controls.chooseCamera')\"\n v-bind=\"footerButton\"\n @click=\"cameraPickerOpen = true\"\n />\n <ResponsiveDialog\n v-model:visible=\"cameraPickerOpen\"\n :header=\"t('chat.call.controls.cameras')\"\n width=\"24rem\"\n >\n <Listbox\n :options=\"cameras\"\n option-value=\"deviceId\"\n :option-label=\"(camera: MediaDeviceInfo) => camera.label || `Camera ${camera.deviceId}`\"\n class=\"w-full\"\n @change=\"(event) => pickCamera(event.value)\"\n />\n </ResponsiveDialog>\n </template>\n\n <IconButton\n icon=\"PhMonitorArrowUp\"\n :label=\"isScreenSharing ? t('chat.call.controls.stopSharing') : t('chat.call.controls.shareScreen')\"\n :severity=\"isScreenSharing ? 'contrast' : 'secondary'\"\n v-bind=\"footerButton\"\n data-testid=\"call-toggle-screen\"\n :data-active=\"isScreenSharing\"\n @click=\"toggleScreenShare\"\n />\n\n <IconButton\n :icon=\"isFullscreen ? 'PhCornersIn' : 'PhFrameCorners'\"\n :label=\"\n\n isFullscreen\n\n ? t('chat.call.controls.exitFullscreen')\n\n : t('chat.call.controls.fullscreen')\n\n \"\n v-bind=\"footerButton\"\n @click=\"toggleFullscreen\"\n />\n\n <IconButton\n v-if=\"isFlashlightSupported\"\n :icon=\"isFlashlightOn ? 'PhLightning' : 'PhLightningSlash'\"\n :label=\"t('chat.call.controls.flashlight')\"\n :severity=\"isFlashlightOn ? 'contrast' : 'secondary'\"\n v-bind=\"footerButton\"\n @click=\"toggleFlashlight\"\n />\n\n <IconButton\n icon=\"PhPhoneX\"\n :label=\"t('chat.call.controls.endCall')\"\n severity=\"danger\"\n :text=\"false\"\n size=\"large\"\n icon-class=\"size-6\"\n data-testid=\"call-end\"\n @click=\"endCall\"\n />\n </div>\n </div>\n</template>\n"],"names":["ref","onMounted","onUnmounted","watch","nextTick","useCallStore","useLocalI18n","chat","useDirection","useChatStore","computed","useWindowSize","useDraggable","_unref","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createVNode","IconButton","_openBlock","_withModifiers","_mergeProps","_withDirectives","_Fragment","_renderList","ResponsiveDialog","_createBlock","_vShow"],"mappings":"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"}
|