@droppii-org/chat-mobile 0.2.49 → 0.2.50
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/lib/module/components/ThreadCard/MuteThread.js +4 -28
- package/lib/module/components/ThreadCard/MuteThread.js.map +1 -1
- package/lib/module/components/ThreadCard/PinThread.js +45 -0
- package/lib/module/components/ThreadCard/PinThread.js.map +1 -0
- package/lib/module/components/ThreadCard/ThreadCard.js +14 -9
- package/lib/module/components/ThreadCard/ThreadCard.js.map +1 -1
- package/lib/module/hooks/useMuteConversation.js +34 -15
- package/lib/module/hooks/useMuteConversation.js.map +1 -1
- package/lib/module/hooks/usePinConversation.js +72 -0
- package/lib/module/hooks/usePinConversation.js.map +1 -0
- package/lib/module/translation/resources/i18n.js +7 -0
- package/lib/module/translation/resources/i18n.js.map +1 -1
- package/lib/typescript/src/components/ThreadCard/MuteThread.d.ts.map +1 -1
- package/lib/typescript/src/components/ThreadCard/PinThread.d.ts +10 -0
- package/lib/typescript/src/components/ThreadCard/PinThread.d.ts.map +1 -0
- package/lib/typescript/src/components/ThreadCard/ThreadCard.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useMuteConversation.d.ts.map +1 -1
- package/lib/typescript/src/hooks/usePinConversation.d.ts +6 -0
- package/lib/typescript/src/hooks/usePinConversation.d.ts.map +1 -0
- package/lib/typescript/src/translation/resources/i18n.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/ThreadCard/MuteThread.tsx +4 -28
- package/src/components/ThreadCard/PinThread.tsx +58 -0
- package/src/components/ThreadCard/ThreadCard.tsx +11 -5
- package/src/hooks/useMuteConversation.ts +32 -17
- package/src/hooks/usePinConversation.ts +87 -0
- package/src/translation/resources/i18n.ts +8 -0
|
@@ -60,20 +60,8 @@ export const MuteThread = /*#__PURE__*/memo(({
|
|
|
60
60
|
label: trans('chat:mute_confirm_primary'),
|
|
61
61
|
kind: 'primary',
|
|
62
62
|
onPress: async () => {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
UIUtils.toast.open({
|
|
66
|
-
title: trans('chat:mute_toast_success'),
|
|
67
|
-
theme: 'light'
|
|
68
|
-
});
|
|
69
|
-
} catch {
|
|
70
|
-
UIUtils.toast.open({
|
|
71
|
-
title: trans('chat:generic_error'),
|
|
72
|
-
theme: 'error'
|
|
73
|
-
});
|
|
74
|
-
} finally {
|
|
75
|
-
swipeableMethods.close();
|
|
76
|
-
}
|
|
63
|
+
swipeableMethods.close();
|
|
64
|
+
await muteConversation(conversation);
|
|
77
65
|
}
|
|
78
66
|
}],
|
|
79
67
|
type: 'horizontal-button'
|
|
@@ -81,20 +69,8 @@ export const MuteThread = /*#__PURE__*/memo(({
|
|
|
81
69
|
});
|
|
82
70
|
}, [swipeableMethods, conversation, muteConversation]);
|
|
83
71
|
const handleUnmutePress = useCallback(async () => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
UIUtils.toast.open({
|
|
87
|
-
title: trans('chat:unmute_toast_success'),
|
|
88
|
-
theme: 'light'
|
|
89
|
-
});
|
|
90
|
-
} catch {
|
|
91
|
-
UIUtils.toast.open({
|
|
92
|
-
title: trans('chat:generic_error'),
|
|
93
|
-
theme: 'error'
|
|
94
|
-
});
|
|
95
|
-
} finally {
|
|
96
|
-
swipeableMethods.close();
|
|
97
|
-
}
|
|
72
|
+
swipeableMethods.close();
|
|
73
|
+
await unmuteConversation(conversation);
|
|
98
74
|
}, [swipeableMethods, conversation, unmuteConversation]);
|
|
99
75
|
return /*#__PURE__*/_jsxs(KContainer.Touchable, {
|
|
100
76
|
width: 76,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["memo","useCallback","KContainer","KImage","KLabel","KColors","useMuteConversation","trans","UIUtils","Image","StyleSheet","Images","jsx","_jsx","jsxs","_jsxs","MuteThread","isMuted","conversation","swipeableMethods","muteConversation","unmuteConversation","handleMutePress","popup","open","header","title","text","alignment","body","renderContent","View","padding","justifyContent","alignItems","children","paddingV","source","NOTIFICATION_WARNING","style","styles","notificationWarning","RichText","typo","richTextOptions","i18nKey","components","b","Text","actions","buttons","label","kind","onPress","close","
|
|
1
|
+
{"version":3,"names":["memo","useCallback","KContainer","KImage","KLabel","KColors","useMuteConversation","trans","UIUtils","Image","StyleSheet","Images","jsx","_jsx","jsxs","_jsxs","MuteThread","isMuted","conversation","swipeableMethods","muteConversation","unmuteConversation","handleMutePress","popup","open","header","title","text","alignment","body","renderContent","View","padding","justifyContent","alignItems","children","paddingV","source","NOTIFICATION_WARNING","style","styles","notificationWarning","RichText","typo","richTextOptions","i18nKey","components","b","Text","actions","buttons","label","kind","onPress","close","type","handleUnmutePress","Touchable","width","background","gray","light","VectorIcons","name","provider","size","color","white","marginT","textAlign","displayName","create","height"],"sourceRoot":"../../../../src","sources":["components/ThreadCard/MuteThread.tsx"],"mappings":";;AAAA,SAASA,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAEzC,SAASC,UAAU,EAAEC,MAAM,EAAEC,MAAM,EAAEC,OAAO,QAAQ,eAAe;AACnE,SAASC,mBAAmB,QAAQ,oCAAiC;AACrE,SAASC,KAAK,QAAQ,4BAAmB;AACzC,SAASC,OAAO,QAAQ,wBAAqB;AAE7C,SAASC,KAAK,EAAEC,UAAU,QAAQ,cAAc;AAChD,OAAOC,MAAM,MAAM,8BAAqB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAQzC,OAAO,MAAMC,UAAU,gBAAGhB,IAAI,CAC5B,CAAC;EAAEiB,OAAO;EAAEC,YAAY;EAAEC;AAAkC,CAAC,KAAK;EAChE,MAAM;IAAEC,gBAAgB;IAAEC;EAAmB,CAAC,GAAGf,mBAAmB,CAAC,CAAC;EAEtE,MAAMgB,eAAe,GAAGrB,WAAW,CAAC,MAAM;IACxCO,OAAO,CAACe,KAAK,CAACC,IAAI,CAAC;MACjBC,MAAM,EAAE;QACNC,KAAK,EAAE;UAAEC,IAAI,EAAEpB,KAAK,CAAC,yBAAyB;QAAE,CAAC;QACjDqB,SAAS,EAAE;MACb,CAAC;MACDC,IAAI,EAAE;QACJC,aAAa,EAAEA,CAAA,KAAM;UACnB,oBACEf,KAAA,CAACb,UAAU,CAAC6B,IAAI;YAACC,OAAO,EAAE,MAAO;YAACC,cAAc;YAACC,UAAU;YAAAC,QAAA,gBACzDtB,IAAA,CAACX,UAAU,CAAC6B,IAAI;cAACK,QAAQ,EAAE,MAAO;cAAAD,QAAA,eAChCtB,IAAA,CAACJ,KAAK;gBACJ4B,MAAM,EAAE1B,MAAM,CAAC2B,oBAAqB;gBACpCC,KAAK,EAAEC,MAAM,CAACC;cAAoB,CACnC;YAAC,CACa,CAAC,eAClB5B,IAAA,CAACT,MAAM,CAACsC,QAAQ;cACdC,IAAI,EAAC,cAAc;cACnBC,eAAe,EAAE;gBACfC,OAAO,EAAEtC,KAAK,CAAC,wBAAwB,CAAC;gBACxCuC,UAAU,EAAE;kBACVC,CAAC,eAAElC,IAAA,CAACT,MAAM,CAAC4C,IAAI;oBAACL,IAAI,EAAC;kBAAY,CAAE;gBACrC;cACF;YAAE,CACH,CAAC;UAAA,CACa,CAAC;QAEtB;MACF,CAAC;MACDM,OAAO,EAAE;QACPC,OAAO,EAAE,CACP;UACEC,KAAK,EAAE5C,KAAK,CAAC,6BAA6B,CAAC;UAC3C6C,IAAI,EAAE,OAAO;UACbC,OAAO,EAAEA,CAAA,KAAMlC,gBAAgB,CAACmC,KAAK,CAAC;QACxC,CAAC,EACD;UACEH,KAAK,EAAE5C,KAAK,CAAC,2BAA2B,CAAC;UACzC6C,IAAI,EAAE,SAAS;UACfC,OAAO,EAAE,MAAAA,CAAA,KAAY;YACnBlC,gBAAgB,CAACmC,KAAK,CAAC,CAAC;YACxB,MAAMlC,gBAAgB,CAACF,YAAY,CAAC;UACtC;QACF,CAAC,CACF;QACDqC,IAAI,EAAE;MACR;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,CAACpC,gBAAgB,EAAED,YAAY,EAAEE,gBAAgB,CAAC,CAAC;EAEtD,MAAMoC,iBAAiB,GAAGvD,WAAW,CAAC,YAAY;IAChDkB,gBAAgB,CAACmC,KAAK,CAAC,CAAC;IACxB,MAAMjC,kBAAkB,CAACH,YAAY,CAAC;EACxC,CAAC,EAAE,CAACC,gBAAgB,EAAED,YAAY,EAAEG,kBAAkB,CAAC,CAAC;EAExD,oBACEN,KAAA,CAACb,UAAU,CAACuD,SAAS;IACnBC,KAAK,EAAE,EAAG;IACVxB,UAAU,EAAC,QAAQ;IACnBD,cAAc,EAAC,QAAQ;IACvB0B,UAAU,EAAEtD,OAAO,CAACuD,IAAI,CAACC,KAAM;IAC/BR,OAAO,EAAEpC,OAAO,GAAGuC,iBAAiB,GAAGlC,eAAgB;IAAAa,QAAA,gBAEvDtB,IAAA,CAACV,MAAM,CAAC2D,WAAW;MACjBC,IAAI,EAAE9C,OAAO,GAAG,QAAQ,GAAG,YAAa;MACxC+C,QAAQ,EAAC,YAAY;MACrBC,IAAI,EAAE,EAAG;MACTC,KAAK,EAAE7D,OAAO,CAAC8D;IAAM,CACtB,CAAC,eACFtD,IAAA,CAACT,MAAM,CAAC4C,IAAI;MACVL,IAAI,EAAC,eAAe;MACpBuB,KAAK,EAAE7D,OAAO,CAAC8D,KAAM;MACrBC,OAAO,EAAC,SAAS;MACjBC,SAAS,EAAC,QAAQ;MAAAlC,QAAA,EAEjBlB,OAAO,GAAGV,KAAK,CAAC,oBAAoB,CAAC,GAAGA,KAAK,CAAC,kBAAkB;IAAC,CACvD,CAAC;EAAA,CACM,CAAC;AAE3B,CACF,CAAC;AAEDS,UAAU,CAACsD,WAAW,GAAG,YAAY;AAErC,MAAM9B,MAAM,GAAG9B,UAAU,CAAC6D,MAAM,CAAC;EAC/B9B,mBAAmB,EAAE;IACnBiB,KAAK,EAAE,GAAG;IACVc,MAAM,EAAE;EACV;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { memo, useCallback } from 'react';
|
|
4
|
+
import { KContainer, KImage, KLabel, KColors } from '@droppii/libs';
|
|
5
|
+
import { usePinConversation } from "../../hooks/usePinConversation.js";
|
|
6
|
+
import { trans } from "../../translation/index.js";
|
|
7
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
|
+
export const PinThread = /*#__PURE__*/memo(({
|
|
9
|
+
isPinned,
|
|
10
|
+
conversation,
|
|
11
|
+
swipeableMethods
|
|
12
|
+
}) => {
|
|
13
|
+
const {
|
|
14
|
+
pinConversation,
|
|
15
|
+
unpinConversation
|
|
16
|
+
} = usePinConversation();
|
|
17
|
+
const handlePress = useCallback(async () => {
|
|
18
|
+
swipeableMethods.close();
|
|
19
|
+
if (isPinned) {
|
|
20
|
+
await unpinConversation(conversation);
|
|
21
|
+
} else {
|
|
22
|
+
await pinConversation(conversation);
|
|
23
|
+
}
|
|
24
|
+
}, [isPinned, conversation, pinConversation, unpinConversation, swipeableMethods]);
|
|
25
|
+
return /*#__PURE__*/_jsxs(KContainer.Touchable, {
|
|
26
|
+
width: 76,
|
|
27
|
+
alignItems: "center",
|
|
28
|
+
justifyContent: "center",
|
|
29
|
+
background: KColors.palette.primary.w400,
|
|
30
|
+
onPress: handlePress,
|
|
31
|
+
children: [/*#__PURE__*/_jsx(KImage.VectorIcons, {
|
|
32
|
+
name: isPinned ? 'thumbtack-off-b' : 'thumbtack-b',
|
|
33
|
+
provider: "DroppiiNew",
|
|
34
|
+
size: 16,
|
|
35
|
+
color: KColors.white
|
|
36
|
+
}), /*#__PURE__*/_jsx(KLabel.Text, {
|
|
37
|
+
typo: "Text2XsMedium",
|
|
38
|
+
color: KColors.white,
|
|
39
|
+
marginT: "0.25rem",
|
|
40
|
+
textAlign: "center",
|
|
41
|
+
children: isPinned ? trans('chat:unpin_thread') : trans('chat:pin_thread')
|
|
42
|
+
})]
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=PinThread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["memo","useCallback","KContainer","KImage","KLabel","KColors","usePinConversation","trans","jsx","_jsx","jsxs","_jsxs","PinThread","isPinned","conversation","swipeableMethods","pinConversation","unpinConversation","handlePress","close","Touchable","width","alignItems","justifyContent","background","palette","primary","w400","onPress","children","VectorIcons","name","provider","size","color","white","Text","typo","marginT","textAlign"],"sourceRoot":"../../../../src","sources":["components/ThreadCard/PinThread.tsx"],"mappings":";;AAAA,SAASA,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAEzC,SAASC,UAAU,EAAEC,MAAM,EAAEC,MAAM,EAAEC,OAAO,QAAQ,eAAe;AACnE,SAASC,kBAAkB,QAAQ,mCAAgC;AACnE,SAASC,KAAK,QAAQ,4BAAmB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAS1C,OAAO,MAAMC,SAAS,gBAAGZ,IAAI,CAC3B,CAAC;EAAEa,QAAQ;EAAEC,YAAY;EAAEC;AAAiC,CAAC,KAAK;EAChE,MAAM;IAAEC,eAAe;IAAEC;EAAkB,CAAC,GAAGX,kBAAkB,CAAC,CAAC;EAEnE,MAAMY,WAAW,GAAGjB,WAAW,CAAC,YAAY;IAC1Cc,gBAAgB,CAACI,KAAK,CAAC,CAAC;IACxB,IAAIN,QAAQ,EAAE;MACZ,MAAMI,iBAAiB,CAACH,YAAY,CAAC;IACvC,CAAC,MAAM;MACL,MAAME,eAAe,CAACF,YAAY,CAAC;IACrC;EACF,CAAC,EAAE,CACDD,QAAQ,EACRC,YAAY,EACZE,eAAe,EACfC,iBAAiB,EACjBF,gBAAgB,CACjB,CAAC;EAEF,oBACEJ,KAAA,CAACT,UAAU,CAACkB,SAAS;IACnBC,KAAK,EAAE,EAAG;IACVC,UAAU,EAAC,QAAQ;IACnBC,cAAc,EAAC,QAAQ;IACvBC,UAAU,EAAEnB,OAAO,CAACoB,OAAO,CAACC,OAAO,CAACC,IAAK;IACzCC,OAAO,EAAEV,WAAY;IAAAW,QAAA,gBAErBpB,IAAA,CAACN,MAAM,CAAC2B,WAAW;MACjBC,IAAI,EAAElB,QAAQ,GAAG,iBAAiB,GAAG,aAAc;MACnDmB,QAAQ,EAAC,YAAY;MACrBC,IAAI,EAAE,EAAG;MACTC,KAAK,EAAE7B,OAAO,CAAC8B;IAAM,CACtB,CAAC,eACF1B,IAAA,CAACL,MAAM,CAACgC,IAAI;MACVC,IAAI,EAAC,eAAe;MACpBH,KAAK,EAAE7B,OAAO,CAAC8B,KAAM;MACrBG,OAAO,EAAC,SAAS;MACjBC,SAAS,EAAC,QAAQ;MAAAV,QAAA,EAEjBhB,QAAQ,GAAGN,KAAK,CAAC,mBAAmB,CAAC,GAAGA,KAAK,CAAC,iBAAiB;IAAC,CACtD,CAAC;EAAA,CACM,CAAC;AAE3B,CACF,CAAC","ignoreList":[]}
|
|
@@ -11,9 +11,10 @@ import { getLastMessageText, getMessagePreviewTextProps } from "../../utils/mess
|
|
|
11
11
|
import { useConversation, useUserStore } from "../../store/index.js";
|
|
12
12
|
import { MessageReceiveOptType } from '@droppii/openim-rn-client-sdk';
|
|
13
13
|
import { MuteThread } from "./MuteThread.js";
|
|
14
|
+
import { PinThread } from "./PinThread.js";
|
|
14
15
|
import { useIsJoinedGroup } from "../../hooks/useIsJoinedGroup.js";
|
|
15
16
|
import isEmpty from 'lodash/isEmpty';
|
|
16
|
-
import { jsx as _jsx,
|
|
17
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
17
18
|
const ThreadCard = /*#__PURE__*/memo(({
|
|
18
19
|
item,
|
|
19
20
|
onPress
|
|
@@ -59,15 +60,19 @@ const ThreadCard = /*#__PURE__*/memo(({
|
|
|
59
60
|
});
|
|
60
61
|
}, [item, onPress]);
|
|
61
62
|
const renderRightActions = useCallback((_progress, _translation, swipeableMethods) => /*#__PURE__*/_jsx(_Fragment, {
|
|
62
|
-
children: /*#__PURE__*/
|
|
63
|
+
children: /*#__PURE__*/_jsxs(KContainer.VisibleView, {
|
|
63
64
|
visible: !isNotInGroup,
|
|
64
|
-
children: /*#__PURE__*/_jsx(
|
|
65
|
+
children: [/*#__PURE__*/_jsx(PinThread, {
|
|
66
|
+
conversation: conversation,
|
|
67
|
+
isPinned: Boolean(isPinned),
|
|
68
|
+
swipeableMethods: swipeableMethods
|
|
69
|
+
}), /*#__PURE__*/_jsx(MuteThread, {
|
|
65
70
|
conversation: conversation,
|
|
66
71
|
isMuted: isMuted,
|
|
67
72
|
swipeableMethods: swipeableMethods
|
|
68
|
-
})
|
|
73
|
+
})]
|
|
69
74
|
})
|
|
70
|
-
}), [isMuted, conversation, isNotInGroup]);
|
|
75
|
+
}), [isMuted, conversation, isNotInGroup, isPinned]);
|
|
71
76
|
return /*#__PURE__*/_jsx(ReanimatedSwipeable, {
|
|
72
77
|
friction: 2,
|
|
73
78
|
rightThreshold: 40,
|
|
@@ -134,10 +139,10 @@ const ThreadCard = /*#__PURE__*/memo(({
|
|
|
134
139
|
children: /*#__PURE__*/_jsx(KContainer.View, {
|
|
135
140
|
marginL: "0.5rem",
|
|
136
141
|
children: /*#__PURE__*/_jsx(KImage.VectorIcons, {
|
|
137
|
-
name:
|
|
138
|
-
provider: "
|
|
139
|
-
size:
|
|
140
|
-
color: KColors.
|
|
142
|
+
name: 'thumbtack-b',
|
|
143
|
+
provider: "DroppiiNew",
|
|
144
|
+
size: 16,
|
|
145
|
+
color: KColors.primary.normal
|
|
141
146
|
})
|
|
142
147
|
})
|
|
143
148
|
}), /*#__PURE__*/_jsx(UnreadBadge, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["memo","useCallback","useMemo","ReanimatedSwipeable","KContainer","KImage","KLabel","KColors","AvatarSection","NamePrefixIcon","UnreadBadge","formatTimestamp","getLastMessageText","getMessagePreviewTextProps","useConversation","useUserStore","MessageReceiveOptType","MuteThread","useIsJoinedGroup","isEmpty","jsx","_jsx","
|
|
1
|
+
{"version":3,"names":["memo","useCallback","useMemo","ReanimatedSwipeable","KContainer","KImage","KLabel","KColors","AvatarSection","NamePrefixIcon","UnreadBadge","formatTimestamp","getLastMessageText","getMessagePreviewTextProps","useConversation","useUserStore","MessageReceiveOptType","MuteThread","PinThread","useIsJoinedGroup","isEmpty","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","ThreadCard","item","onPress","conversation","peerType","showName","faceURL","unreadCount","recvMsgOpt","Normal","isPinned","latestMsgSendTime","latestMsg","groupID","data","isJoinedGroup","isNotInGroup","latestMsgData","result","JSON","parse","error","console","fullName","hasUnread","isMuted","timestamp","sendTime","currentUserId","s","user","userID","lastMessageText","handlePress","event","renderRightActions","_progress","_translation","swipeableMethods","children","VisibleView","visible","Boolean","friction","rightThreshold","Touchable","row","alignItems","paddingH","paddingV","activeOpacity","background","white","avatar","View","flex","marginL","paddingB","Text","typo","numberOfLines","color","black","VectorIcons","name","provider","size","palette","gray","w500","w400","normal","primary","count","displayName"],"sourceRoot":"../../../../src","sources":["components/ThreadCard/ThreadCard.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,27 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback } from 'react';
|
|
4
4
|
import OpenIMSDK, { MessageReceiveOptType } from '@droppii/openim-rn-client-sdk';
|
|
5
|
-
import {
|
|
5
|
+
import { UIUtils } from "../utils/UIUtils.js";
|
|
6
|
+
import { trans } from "../translation/index.js";
|
|
6
7
|
export function useMuteConversation() {
|
|
7
8
|
const muteConversation = useCallback(async conversation => {
|
|
8
9
|
if (conversation == null) return;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
try {
|
|
11
|
+
await OpenIMSDK.setConversationRecvMessageOpt({
|
|
12
|
+
conversationID: conversation.conversationID,
|
|
13
|
+
opt: MessageReceiveOptType.NotNotify
|
|
14
|
+
});
|
|
15
|
+
UIUtils.toast.open({
|
|
16
|
+
title: trans('chat:mute_toast_success'),
|
|
17
|
+
theme: 'light'
|
|
18
|
+
});
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.error('muteConversation failed', error);
|
|
21
|
+
UIUtils.toast.open({
|
|
22
|
+
title: trans('chat:generic_error'),
|
|
23
|
+
theme: 'error'
|
|
24
|
+
});
|
|
25
|
+
}
|
|
16
26
|
}, []);
|
|
17
27
|
const unmuteConversation = useCallback(async conversation => {
|
|
18
28
|
if (conversation == null) return;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
29
|
+
try {
|
|
30
|
+
await OpenIMSDK.setConversationRecvMessageOpt({
|
|
31
|
+
conversationID: conversation.conversationID,
|
|
32
|
+
opt: MessageReceiveOptType.Normal
|
|
33
|
+
});
|
|
34
|
+
UIUtils.toast.open({
|
|
35
|
+
title: trans('chat:unmute_toast_success'),
|
|
36
|
+
theme: 'light'
|
|
37
|
+
});
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.error('unmuteConversation failed', error);
|
|
40
|
+
UIUtils.toast.open({
|
|
41
|
+
title: trans('chat:generic_error'),
|
|
42
|
+
theme: 'error'
|
|
43
|
+
});
|
|
44
|
+
}
|
|
26
45
|
}, []);
|
|
27
46
|
return {
|
|
28
47
|
muteConversation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","OpenIMSDK","MessageReceiveOptType","
|
|
1
|
+
{"version":3,"names":["useCallback","OpenIMSDK","MessageReceiveOptType","UIUtils","trans","useMuteConversation","muteConversation","conversation","setConversationRecvMessageOpt","conversationID","opt","NotNotify","toast","open","title","theme","error","console","unmuteConversation","Normal"],"sourceRoot":"../../../src","sources":["hooks/useMuteConversation.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AACnC,OAAOC,SAAS,IACdC,qBAAqB,QAChB,+BAA+B;AAEtC,SAASC,OAAO,QAAQ,qBAAkB;AAC1C,SAASC,KAAK,QAAQ,yBAAgB;AAEtC,OAAO,SAASC,mBAAmBA,CAAA,EAAG;EACpC,MAAMC,gBAAgB,GAAGN,WAAW,CAClC,MAAOO,YAA+B,IAAK;IACzC,IAAIA,YAAY,IAAI,IAAI,EAAE;IAE1B,IAAI;MACF,MAAMN,SAAS,CAACO,6BAA6B,CAAC;QAC5CC,cAAc,EAAEF,YAAY,CAACE,cAAc;QAC3CC,GAAG,EAAER,qBAAqB,CAACS;MAC7B,CAAC,CAAC;MACFR,OAAO,CAACS,KAAK,CAACC,IAAI,CAAC;QACjBC,KAAK,EAAEV,KAAK,CAAC,yBAAyB,CAAC;QACvCW,KAAK,EAAE;MACT,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,yBAAyB,EAAEA,KAAK,CAAC;MAC/Cb,OAAO,CAACS,KAAK,CAACC,IAAI,CAAC;QACjBC,KAAK,EAAEV,KAAK,CAAC,oBAAoB,CAAC;QAClCW,KAAK,EAAE;MACT,CAAC,CAAC;IACJ;EACF,CAAC,EACD,EACF,CAAC;EAED,MAAMG,kBAAkB,GAAGlB,WAAW,CACpC,MAAOO,YAA+B,IAAK;IACzC,IAAIA,YAAY,IAAI,IAAI,EAAE;IAE1B,IAAI;MACF,MAAMN,SAAS,CAACO,6BAA6B,CAAC;QAC5CC,cAAc,EAAEF,YAAY,CAACE,cAAc;QAC3CC,GAAG,EAAER,qBAAqB,CAACiB;MAC7B,CAAC,CAAC;MACFhB,OAAO,CAACS,KAAK,CAACC,IAAI,CAAC;QACjBC,KAAK,EAAEV,KAAK,CAAC,2BAA2B,CAAC;QACzCW,KAAK,EAAE;MACT,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,2BAA2B,EAAEA,KAAK,CAAC;MACjDb,OAAO,CAACS,KAAK,CAACC,IAAI,CAAC;QACjBC,KAAK,EAAEV,KAAK,CAAC,oBAAoB,CAAC;QAClCW,KAAK,EAAE;MACT,CAAC,CAAC;IACJ;EACF,CAAC,EACD,EACF,CAAC;EAED,OAAO;IAAET,gBAAgB;IAAEY;EAAmB,CAAC;AACjD","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useCallback } from 'react';
|
|
4
|
+
import OpenIMSDK from '@droppii/openim-rn-client-sdk';
|
|
5
|
+
import { useConversationStore } from "../store/index.js";
|
|
6
|
+
import { UIUtils } from "../utils/UIUtils.js";
|
|
7
|
+
import { trans } from "../translation/index.js";
|
|
8
|
+
const MAX_PINNED_THREADS = 5;
|
|
9
|
+
const showPinThreadLimitModal = () => {
|
|
10
|
+
UIUtils.alert.open({
|
|
11
|
+
title: trans('chat:pin_thread_limit_title'),
|
|
12
|
+
message: trans('chat:pin_thread_limit_desc', {
|
|
13
|
+
maxCount: MAX_PINNED_THREADS
|
|
14
|
+
}),
|
|
15
|
+
primaryIndex: 0,
|
|
16
|
+
buttonType: 'horizontal-button',
|
|
17
|
+
buttons: [{
|
|
18
|
+
label: trans('chat:pin_thread_limit_button'),
|
|
19
|
+
kind: 'primary'
|
|
20
|
+
}]
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
export function usePinConversation() {
|
|
24
|
+
const pinConversation = useCallback(async conversation => {
|
|
25
|
+
if (conversation == null) return;
|
|
26
|
+
try {
|
|
27
|
+
const pinnedCount = Object.values(useConversationStore.getState().map).filter(c => c.isPinned).length;
|
|
28
|
+
if (pinnedCount >= MAX_PINNED_THREADS) {
|
|
29
|
+
showPinThreadLimitModal();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
await OpenIMSDK.pinConversation({
|
|
33
|
+
conversationID: conversation.conversationID,
|
|
34
|
+
isPinned: true
|
|
35
|
+
});
|
|
36
|
+
UIUtils.toast.open({
|
|
37
|
+
title: trans('chat:pin_thread_success'),
|
|
38
|
+
theme: 'light'
|
|
39
|
+
});
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.error('pinConversation failed', error);
|
|
42
|
+
UIUtils.toast.open({
|
|
43
|
+
title: trans('chat:generic_error'),
|
|
44
|
+
theme: 'error'
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}, []);
|
|
48
|
+
const unpinConversation = useCallback(async conversation => {
|
|
49
|
+
if (conversation == null) return;
|
|
50
|
+
try {
|
|
51
|
+
await OpenIMSDK.pinConversation({
|
|
52
|
+
conversationID: conversation.conversationID,
|
|
53
|
+
isPinned: false
|
|
54
|
+
});
|
|
55
|
+
UIUtils.toast.open({
|
|
56
|
+
title: trans('chat:unpin_thread_success'),
|
|
57
|
+
theme: 'light'
|
|
58
|
+
});
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error('unpinConversation failed', error);
|
|
61
|
+
UIUtils.toast.open({
|
|
62
|
+
title: trans('chat:generic_error'),
|
|
63
|
+
theme: 'error'
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}, []);
|
|
67
|
+
return {
|
|
68
|
+
pinConversation,
|
|
69
|
+
unpinConversation
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=usePinConversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useCallback","OpenIMSDK","useConversationStore","UIUtils","trans","MAX_PINNED_THREADS","showPinThreadLimitModal","alert","open","title","message","maxCount","primaryIndex","buttonType","buttons","label","kind","usePinConversation","pinConversation","conversation","pinnedCount","Object","values","getState","map","filter","c","isPinned","length","conversationID","toast","theme","error","console","unpinConversation"],"sourceRoot":"../../../src","sources":["hooks/usePinConversation.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AACnC,OAAOC,SAAS,MAAM,+BAA+B;AAErD,SAASC,oBAAoB,QAAQ,mBAAU;AAC/C,SAASC,OAAO,QAAQ,qBAAkB;AAC1C,SAASC,KAAK,QAAQ,yBAAgB;AAEtC,MAAMC,kBAAkB,GAAG,CAAC;AAE5B,MAAMC,uBAAuB,GAAGA,CAAA,KAAM;EACpCH,OAAO,CAACI,KAAK,CAACC,IAAI,CAAC;IACjBC,KAAK,EAAEL,KAAK,CAAC,6BAA6B,CAAC;IAC3CM,OAAO,EAAEN,KAAK,CAAC,4BAA4B,EAAE;MAC3CO,QAAQ,EAAEN;IACZ,CAAC,CAAC;IACFO,YAAY,EAAE,CAAC;IACfC,UAAU,EAAE,mBAAmB;IAC/BC,OAAO,EAAE,CACP;MACEC,KAAK,EAAEX,KAAK,CAAC,8BAA8B,CAAC;MAC5CY,IAAI,EAAE;IACR,CAAC;EAEL,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,SAASC,kBAAkBA,CAAA,EAAG;EACnC,MAAMC,eAAe,GAAGlB,WAAW,CACjC,MAAOmB,YAA+B,IAAK;IACzC,IAAIA,YAAY,IAAI,IAAI,EAAE;IAE1B,IAAI;MACF,MAAMC,WAAW,GAAGC,MAAM,CAACC,MAAM,CAC/BpB,oBAAoB,CAACqB,QAAQ,CAAC,CAAC,CAACC,GAClC,CAAC,CAACC,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,CAACC,MAAM;MAClC,IAAIR,WAAW,IAAIf,kBAAkB,EAAE;QACrCC,uBAAuB,CAAC,CAAC;QACzB;MACF;MAEA,MAAML,SAAS,CAACiB,eAAe,CAAC;QAC9BW,cAAc,EAAEV,YAAY,CAACU,cAAc;QAC3CF,QAAQ,EAAE;MACZ,CAAC,CAAC;MAEFxB,OAAO,CAAC2B,KAAK,CAACtB,IAAI,CAAC;QACjBC,KAAK,EAAEL,KAAK,CAAC,yBAAyB,CAAC;QACvC2B,KAAK,EAAE;MACT,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,wBAAwB,EAAEA,KAAK,CAAC;MAC9C7B,OAAO,CAAC2B,KAAK,CAACtB,IAAI,CAAC;QACjBC,KAAK,EAAEL,KAAK,CAAC,oBAAoB,CAAC;QAClC2B,KAAK,EAAE;MACT,CAAC,CAAC;IACJ;EACF,CAAC,EACD,EACF,CAAC;EAED,MAAMG,iBAAiB,GAAGlC,WAAW,CACnC,MAAOmB,YAA+B,IAAK;IACzC,IAAIA,YAAY,IAAI,IAAI,EAAE;IAE1B,IAAI;MACF,MAAMlB,SAAS,CAACiB,eAAe,CAAC;QAC9BW,cAAc,EAAEV,YAAY,CAACU,cAAc;QAC3CF,QAAQ,EAAE;MACZ,CAAC,CAAC;MAEFxB,OAAO,CAAC2B,KAAK,CAACtB,IAAI,CAAC;QACjBC,KAAK,EAAEL,KAAK,CAAC,2BAA2B,CAAC;QACzC2B,KAAK,EAAE;MACT,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,0BAA0B,EAAEA,KAAK,CAAC;MAChD7B,OAAO,CAAC2B,KAAK,CAACtB,IAAI,CAAC;QACjBC,KAAK,EAAEL,KAAK,CAAC,oBAAoB,CAAC;QAClC2B,KAAK,EAAE;MACT,CAAC,CAAC;IACJ;EACF,CAAC,EACD,EACF,CAAC;EAED,OAAO;IAAEb,eAAe;IAAEgB;EAAkB,CAAC;AAC/C","ignoreList":[]}
|
|
@@ -48,6 +48,13 @@ const i18nKey = {
|
|
|
48
48
|
'chat:pin_limit_primary': 'Đã hiểu',
|
|
49
49
|
'chat:pinned_messages_title': 'Tin nhắn đã ghim',
|
|
50
50
|
'chat:pinned_messages_hint': 'Nhấn vào tin nhắn để xem tin nhắn gốc, nhấn vào biểu tượng để bỏ ghim',
|
|
51
|
+
'chat:pin_thread': 'Ghim',
|
|
52
|
+
'chat:unpin_thread': 'Bỏ ghim',
|
|
53
|
+
'chat:pin_thread_success': 'Đã ghim đoạn chat thành công',
|
|
54
|
+
'chat:unpin_thread_success': 'Đã bỏ ghim đoạn chat thành công',
|
|
55
|
+
'chat:pin_thread_limit_title': 'Không thể ghim đoạn chat',
|
|
56
|
+
'chat:pin_thread_limit_desc': 'Bạn đã ghim số đoạn chat tối đa. Để ghim đoạn chat này, trước tiên bạn phải bỏ ghim đoạn chat khác.',
|
|
57
|
+
'chat:pin_thread_limit_button': 'OK',
|
|
51
58
|
'chat:view_original_message': 'Xem tin nhắn gốc',
|
|
52
59
|
'chat:scroll_to_message_todo': 'Tính năng di chuyển đến tin nhắn gốc sẽ sớm được cập nhật',
|
|
53
60
|
'msg_type_image': '[Hình ảnh]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["i18nKey","vi"],"sourceRoot":"../../../../src","sources":["translation/resources/i18n.ts"],"mappings":";;AAAA,MAAMA,OAA+B,GAAG;EACtC,0BAA0B,EAAE,gBAAgB;EAC5C,2BAA2B,EAAE,YAAY;EACzC,qBAAqB,EACnB,4EAA4E;EAC9E,qBAAqB,EAAE,kCAAkC;EACzD,uBAAuB,EAAE,oBAAoB;EAC7C,yBAAyB,EAAE,iBAAiB;EAC5C,+BAA+B,EAAE,6BAA6B;EAC9D,uBAAuB,EAAE,oCAAoC;EAC7D,8BAA8B,EAAE,gCAAgC;EAChE,2BAA2B,EAAE,kBAAkB;EAC/C,uBAAuB,EAAE,sBAAsB;EAC/C,oBAAoB,EAAE,eAAe;EACrC,sBAAsB,EACpB,sFAAsF;EACxF,sBAAsB,EACpB,gFAAgF;EAClF,iBAAiB,EAAE,YAAY;EAC/B,0BAA0B,EAAE,gCAAgC;EAC5D,oBAAoB,EAAE,gCAAgC;EACtD,6BAA6B,EAAE,kCAAkC;EACjE,eAAe,EAAE,SAAS;EAC1B,gBAAgB,EAAE,YAAY;EAC9B,iBAAiB,EAAE,SAAS;EAC5B,WAAW,EAAE,KAAK;EAClB,YAAY,EAAE,SAAS;EACvB,2BAA2B,EAAE,6BAA6B;EAC1D,mBAAmB,EAAE,kBAAkB;EACvC,yBAAyB,EAAE,kBAAkB;EAC7C,qBAAqB,EAAE,0BAA0B;EACjD,mBAAmB,EAAE,mBAAmB;EACxC,wBAAwB,EAAE,6BAA6B;EACvD,2BAA2B,EAAE,8BAA8B;EAC3D,gCAAgC,EAAE,wCAAwC;EAC1E,oBAAoB,EAAE,SAAS;EAC/B,qBAAqB,EAAE,SAAS;EAChC,kBAAkB,EAAE,MAAM;EAC1B,oBAAoB,EAAE,SAAS;EAC/B,0BAA0B,EAAE,kBAAkB;EAC9C,4BAA4B,EAAE,qBAAqB;EACnD,8BAA8B,EAAE,wBAAwB;EACxD,4BAA4B,EAAE,wBAAwB;EACtD,4BAA4B,EAAE,qBAAqB;EACnD,2BAA2B,EAAE,wBAAwB;EACrD,2BAA2B,EAAE,eAAe;EAC5C,sBAAsB,EAAE,8BAA8B;EACtD,qBAAqB,EACnB,gHAAgH;EAClH,wBAAwB,EAAE,SAAS;EACnC,4BAA4B,EAAE,kBAAkB;EAChD,2BAA2B,EACzB,uEAAuE;EACzE,4BAA4B,EAAE,kBAAkB;EAChD,6BAA6B,EAC3B,2DAA2D;EAC7D,gBAAgB,EAAE,YAAY;EAC9B,gBAAgB,EAAE,kBAAkB;EACpC,gBAAgB,EAAE,SAAS;EAC3B,eAAe,EAAE,iBAAiB;EAClC,eAAe,EAAE,YAAY;EAC7B,iBAAiB,EAAE,qBAAqB;EACxC,wBAAwB,EAAE,gCAAgC;EAC1D,kBAAkB,EAAE,eAAe;EACnC,oBAAoB,EAAE,eAAe;EACrC,yBAAyB,EAAE,eAAe;EAC1C,wBAAwB,EACtB,qGAAqG;EACvG,2BAA2B,EAAE,eAAe;EAC5C,6BAA6B,EAAE,UAAU;EACzC,yBAAyB,EAAE,kBAAkB;EAC7C,2BAA2B,EAAE,kBAAkB;EAC/C,OAAO,EAAE,SAAS;EAClB,SAAS,EAAE,aAAa;EACxB,SAAS,EAAE,WAAW;EACtB,QAAQ,EAAE,UAAU;EACpB,WAAW,EAAE,UAAU;EACvB,YAAY,EAAE,cAAc;EAC5B,cAAc,EAAE,cAAc;EAC9B,oBAAoB,EAAE,cAAc;EACpC,oBAAoB,EAAE,SAAS;EAC/B,eAAe,EAAE,kBAAkB;EACnC,UAAU,EAAE,YAAY;EACxB,KAAK,EAAE;AACT,CAAC;AAED,eAAe;EACbC,EAAE,EAAED;AACN,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["i18nKey","vi"],"sourceRoot":"../../../../src","sources":["translation/resources/i18n.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MuteThread.d.ts","sourceRoot":"","sources":["../../../../../src/components/ThreadCard/MuteThread.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AAKzF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,eAAO,MAAM,UAAU,oFACyB,eAAe,
|
|
1
|
+
{"version":3,"file":"MuteThread.d.ts","sourceRoot":"","sources":["../../../../../src/components/ThreadCard/MuteThread.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AAKzF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,eAAO,MAAM,UAAU,oFACyB,eAAe,iCAmF9D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SwipeableMethods } from 'react-native-gesture-handler/ReanimatedSwipeable';
|
|
2
|
+
import { type ConversationItem } from '@droppii/openim-rn-client-sdk';
|
|
3
|
+
interface PinThreadProps {
|
|
4
|
+
isPinned: boolean;
|
|
5
|
+
conversation?: ConversationItem;
|
|
6
|
+
swipeableMethods: SwipeableMethods;
|
|
7
|
+
}
|
|
8
|
+
export declare const PinThread: import("react").MemoExoticComponent<({ isPinned, conversation, swipeableMethods }: PinThreadProps) => import("react").JSX.Element>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=PinThread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PinThread.d.ts","sourceRoot":"","sources":["../../../../../src/components/ThreadCard/PinThread.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AAIzF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,UAAU,cAAc;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,eAAO,MAAM,SAAS,qFAC2B,cAAc,iCA2C9D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadCard.d.ts","sourceRoot":"","sources":["../../../../../src/components/ThreadCard/ThreadCard.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ThreadCard.d.ts","sourceRoot":"","sources":["../../../../../src/components/ThreadCard/ThreadCard.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAsB1D,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,qBAAqB,CAAA;KAAE,KAAK,IAAI,CAAC;CAC5E;AAED,QAAA,MAAM,UAAU,0DAA4B,eAAe,iCA6JzD,CAAC;AAIH,eAAe,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMuteConversation.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useMuteConversation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"useMuteConversation.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useMuteConversation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,wBAAgB,mBAAmB;sCAET,gBAAgB;wCAwBhB,gBAAgB;EAwBzC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ConversationItem } from '@droppii/openim-rn-client-sdk';
|
|
2
|
+
export declare function usePinConversation(): {
|
|
3
|
+
pinConversation: (conversation?: ConversationItem) => Promise<void>;
|
|
4
|
+
unpinConversation: (conversation?: ConversationItem) => Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=usePinConversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePinConversation.d.ts","sourceRoot":"","sources":["../../../../src/hooks/usePinConversation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAwBtE,wBAAgB,kBAAkB;qCAER,gBAAgB;uCAiChB,gBAAgB;EAyBzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../src/translation/resources/i18n.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../../../src/translation/resources/i18n.ts"],"names":[],"mappings":";;;AA8FA,wBAEE"}
|
package/package.json
CHANGED
|
@@ -58,20 +58,8 @@ export const MuteThread = memo(
|
|
|
58
58
|
label: trans('chat:mute_confirm_primary'),
|
|
59
59
|
kind: 'primary',
|
|
60
60
|
onPress: async () => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
UIUtils.toast.open({
|
|
64
|
-
title: trans('chat:mute_toast_success'),
|
|
65
|
-
theme: 'light',
|
|
66
|
-
});
|
|
67
|
-
} catch {
|
|
68
|
-
UIUtils.toast.open({
|
|
69
|
-
title: trans('chat:generic_error'),
|
|
70
|
-
theme: 'error',
|
|
71
|
-
});
|
|
72
|
-
} finally {
|
|
73
|
-
swipeableMethods.close();
|
|
74
|
-
}
|
|
61
|
+
swipeableMethods.close();
|
|
62
|
+
await muteConversation(conversation);
|
|
75
63
|
},
|
|
76
64
|
},
|
|
77
65
|
],
|
|
@@ -81,20 +69,8 @@ export const MuteThread = memo(
|
|
|
81
69
|
}, [swipeableMethods, conversation, muteConversation]);
|
|
82
70
|
|
|
83
71
|
const handleUnmutePress = useCallback(async () => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
UIUtils.toast.open({
|
|
87
|
-
title: trans('chat:unmute_toast_success'),
|
|
88
|
-
theme: 'light',
|
|
89
|
-
});
|
|
90
|
-
} catch {
|
|
91
|
-
UIUtils.toast.open({
|
|
92
|
-
title: trans('chat:generic_error'),
|
|
93
|
-
theme: 'error',
|
|
94
|
-
});
|
|
95
|
-
} finally {
|
|
96
|
-
swipeableMethods.close();
|
|
97
|
-
}
|
|
72
|
+
swipeableMethods.close();
|
|
73
|
+
await unmuteConversation(conversation);
|
|
98
74
|
}, [swipeableMethods, conversation, unmuteConversation]);
|
|
99
75
|
|
|
100
76
|
return (
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { memo, useCallback } from 'react';
|
|
2
|
+
import type { SwipeableMethods } from 'react-native-gesture-handler/ReanimatedSwipeable';
|
|
3
|
+
import { KContainer, KImage, KLabel, KColors } from '@droppii/libs';
|
|
4
|
+
import { usePinConversation } from '../../hooks/usePinConversation';
|
|
5
|
+
import { trans } from '../../translation';
|
|
6
|
+
import { type ConversationItem } from '@droppii/openim-rn-client-sdk';
|
|
7
|
+
|
|
8
|
+
interface PinThreadProps {
|
|
9
|
+
isPinned: boolean;
|
|
10
|
+
conversation?: ConversationItem;
|
|
11
|
+
swipeableMethods: SwipeableMethods;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const PinThread = memo(
|
|
15
|
+
({ isPinned, conversation, swipeableMethods }: PinThreadProps) => {
|
|
16
|
+
const { pinConversation, unpinConversation } = usePinConversation();
|
|
17
|
+
|
|
18
|
+
const handlePress = useCallback(async () => {
|
|
19
|
+
swipeableMethods.close();
|
|
20
|
+
if (isPinned) {
|
|
21
|
+
await unpinConversation(conversation);
|
|
22
|
+
} else {
|
|
23
|
+
await pinConversation(conversation);
|
|
24
|
+
}
|
|
25
|
+
}, [
|
|
26
|
+
isPinned,
|
|
27
|
+
conversation,
|
|
28
|
+
pinConversation,
|
|
29
|
+
unpinConversation,
|
|
30
|
+
swipeableMethods,
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<KContainer.Touchable
|
|
35
|
+
width={76}
|
|
36
|
+
alignItems="center"
|
|
37
|
+
justifyContent="center"
|
|
38
|
+
background={KColors.palette.primary.w400}
|
|
39
|
+
onPress={handlePress}
|
|
40
|
+
>
|
|
41
|
+
<KImage.VectorIcons
|
|
42
|
+
name={isPinned ? 'thumbtack-off-b' : 'thumbtack-b'}
|
|
43
|
+
provider="DroppiiNew"
|
|
44
|
+
size={16}
|
|
45
|
+
color={KColors.white}
|
|
46
|
+
/>
|
|
47
|
+
<KLabel.Text
|
|
48
|
+
typo="Text2XsMedium"
|
|
49
|
+
color={KColors.white}
|
|
50
|
+
marginT="0.25rem"
|
|
51
|
+
textAlign="center"
|
|
52
|
+
>
|
|
53
|
+
{isPinned ? trans('chat:unpin_thread') : trans('chat:pin_thread')}
|
|
54
|
+
</KLabel.Text>
|
|
55
|
+
</KContainer.Touchable>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
);
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
type MessageItem,
|
|
18
18
|
} from '@droppii/openim-rn-client-sdk';
|
|
19
19
|
import { MuteThread } from './MuteThread';
|
|
20
|
+
import { PinThread } from './PinThread';
|
|
20
21
|
import { useIsJoinedGroup } from '../../hooks/useIsJoinedGroup';
|
|
21
22
|
import isEmpty from 'lodash/isEmpty';
|
|
22
23
|
|
|
@@ -84,6 +85,11 @@ const ThreadCard = memo(({ item, onPress }: ThreadCardProps) => {
|
|
|
84
85
|
) => (
|
|
85
86
|
<>
|
|
86
87
|
<KContainer.VisibleView visible={!isNotInGroup}>
|
|
88
|
+
<PinThread
|
|
89
|
+
conversation={conversation}
|
|
90
|
+
isPinned={Boolean(isPinned)}
|
|
91
|
+
swipeableMethods={swipeableMethods}
|
|
92
|
+
/>
|
|
87
93
|
<MuteThread
|
|
88
94
|
conversation={conversation}
|
|
89
95
|
isMuted={isMuted}
|
|
@@ -92,7 +98,7 @@ const ThreadCard = memo(({ item, onPress }: ThreadCardProps) => {
|
|
|
92
98
|
</KContainer.VisibleView>
|
|
93
99
|
</>
|
|
94
100
|
),
|
|
95
|
-
[isMuted, conversation, isNotInGroup]
|
|
101
|
+
[isMuted, conversation, isNotInGroup, isPinned]
|
|
96
102
|
);
|
|
97
103
|
|
|
98
104
|
return (
|
|
@@ -164,10 +170,10 @@ const ThreadCard = memo(({ item, onPress }: ThreadCardProps) => {
|
|
|
164
170
|
<KContainer.VisibleView visible={Boolean(isPinned)}>
|
|
165
171
|
<KContainer.View marginL="0.5rem">
|
|
166
172
|
<KImage.VectorIcons
|
|
167
|
-
name=
|
|
168
|
-
provider="
|
|
169
|
-
size={
|
|
170
|
-
color={KColors.
|
|
173
|
+
name={'thumbtack-b'}
|
|
174
|
+
provider="DroppiiNew"
|
|
175
|
+
size={16}
|
|
176
|
+
color={KColors.primary.normal}
|
|
171
177
|
/>
|
|
172
178
|
</KContainer.View>
|
|
173
179
|
</KContainer.VisibleView>
|
|
@@ -3,22 +3,30 @@ import OpenIMSDK, {
|
|
|
3
3
|
MessageReceiveOptType,
|
|
4
4
|
} from '@droppii/openim-rn-client-sdk';
|
|
5
5
|
import type { ConversationItem } from '@droppii/openim-rn-client-sdk';
|
|
6
|
-
import {
|
|
6
|
+
import { UIUtils } from '../utils/UIUtils';
|
|
7
|
+
import { trans } from '../translation';
|
|
7
8
|
|
|
8
9
|
export function useMuteConversation() {
|
|
9
10
|
const muteConversation = useCallback(
|
|
10
11
|
async (conversation?: ConversationItem) => {
|
|
11
12
|
if (conversation == null) return;
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
useConversationStore
|
|
18
|
-
.getState()
|
|
19
|
-
.updateConversation(conversation.conversationID, {
|
|
20
|
-
recvMsgOpt: MessageReceiveOptType.NotNotify,
|
|
14
|
+
try {
|
|
15
|
+
await OpenIMSDK.setConversationRecvMessageOpt({
|
|
16
|
+
conversationID: conversation.conversationID,
|
|
17
|
+
opt: MessageReceiveOptType.NotNotify,
|
|
21
18
|
});
|
|
19
|
+
UIUtils.toast.open({
|
|
20
|
+
title: trans('chat:mute_toast_success'),
|
|
21
|
+
theme: 'light',
|
|
22
|
+
});
|
|
23
|
+
} catch (error) {
|
|
24
|
+
console.error('muteConversation failed', error);
|
|
25
|
+
UIUtils.toast.open({
|
|
26
|
+
title: trans('chat:generic_error'),
|
|
27
|
+
theme: 'error',
|
|
28
|
+
});
|
|
29
|
+
}
|
|
22
30
|
},
|
|
23
31
|
[]
|
|
24
32
|
);
|
|
@@ -27,15 +35,22 @@ export function useMuteConversation() {
|
|
|
27
35
|
async (conversation?: ConversationItem) => {
|
|
28
36
|
if (conversation == null) return;
|
|
29
37
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
try {
|
|
39
|
+
await OpenIMSDK.setConversationRecvMessageOpt({
|
|
40
|
+
conversationID: conversation.conversationID,
|
|
41
|
+
opt: MessageReceiveOptType.Normal,
|
|
42
|
+
});
|
|
43
|
+
UIUtils.toast.open({
|
|
44
|
+
title: trans('chat:unmute_toast_success'),
|
|
45
|
+
theme: 'light',
|
|
46
|
+
});
|
|
47
|
+
} catch (error) {
|
|
48
|
+
console.error('unmuteConversation failed', error);
|
|
49
|
+
UIUtils.toast.open({
|
|
50
|
+
title: trans('chat:generic_error'),
|
|
51
|
+
theme: 'error',
|
|
38
52
|
});
|
|
53
|
+
}
|
|
39
54
|
},
|
|
40
55
|
[]
|
|
41
56
|
);
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import OpenIMSDK from '@droppii/openim-rn-client-sdk';
|
|
3
|
+
import type { ConversationItem } from '@droppii/openim-rn-client-sdk';
|
|
4
|
+
import { useConversationStore } from '../store';
|
|
5
|
+
import { UIUtils } from '../utils/UIUtils';
|
|
6
|
+
import { trans } from '../translation';
|
|
7
|
+
|
|
8
|
+
const MAX_PINNED_THREADS = 5;
|
|
9
|
+
|
|
10
|
+
const showPinThreadLimitModal = () => {
|
|
11
|
+
UIUtils.alert.open({
|
|
12
|
+
title: trans('chat:pin_thread_limit_title'),
|
|
13
|
+
message: trans('chat:pin_thread_limit_desc', {
|
|
14
|
+
maxCount: MAX_PINNED_THREADS,
|
|
15
|
+
}),
|
|
16
|
+
primaryIndex: 0,
|
|
17
|
+
buttonType: 'horizontal-button',
|
|
18
|
+
buttons: [
|
|
19
|
+
{
|
|
20
|
+
label: trans('chat:pin_thread_limit_button'),
|
|
21
|
+
kind: 'primary',
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export function usePinConversation() {
|
|
28
|
+
const pinConversation = useCallback(
|
|
29
|
+
async (conversation?: ConversationItem) => {
|
|
30
|
+
if (conversation == null) return;
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
const pinnedCount = Object.values(
|
|
34
|
+
useConversationStore.getState().map
|
|
35
|
+
).filter((c) => c.isPinned).length;
|
|
36
|
+
if (pinnedCount >= MAX_PINNED_THREADS) {
|
|
37
|
+
showPinThreadLimitModal();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
await OpenIMSDK.pinConversation({
|
|
42
|
+
conversationID: conversation.conversationID,
|
|
43
|
+
isPinned: true,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
UIUtils.toast.open({
|
|
47
|
+
title: trans('chat:pin_thread_success'),
|
|
48
|
+
theme: 'light',
|
|
49
|
+
});
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.error('pinConversation failed', error);
|
|
52
|
+
UIUtils.toast.open({
|
|
53
|
+
title: trans('chat:generic_error'),
|
|
54
|
+
theme: 'error',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
[]
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const unpinConversation = useCallback(
|
|
62
|
+
async (conversation?: ConversationItem) => {
|
|
63
|
+
if (conversation == null) return;
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
await OpenIMSDK.pinConversation({
|
|
67
|
+
conversationID: conversation.conversationID,
|
|
68
|
+
isPinned: false,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
UIUtils.toast.open({
|
|
72
|
+
title: trans('chat:unpin_thread_success'),
|
|
73
|
+
theme: 'light',
|
|
74
|
+
});
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.error('unpinConversation failed', error);
|
|
77
|
+
UIUtils.toast.open({
|
|
78
|
+
title: trans('chat:generic_error'),
|
|
79
|
+
theme: 'error',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
[]
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
return { pinConversation, unpinConversation };
|
|
87
|
+
}
|
|
@@ -51,6 +51,14 @@ const i18nKey: Record<string, string> = {
|
|
|
51
51
|
'chat:pinned_messages_title': 'Tin nhắn đã ghim',
|
|
52
52
|
'chat:pinned_messages_hint':
|
|
53
53
|
'Nhấn vào tin nhắn để xem tin nhắn gốc, nhấn vào biểu tượng để bỏ ghim',
|
|
54
|
+
'chat:pin_thread': 'Ghim',
|
|
55
|
+
'chat:unpin_thread': 'Bỏ ghim',
|
|
56
|
+
'chat:pin_thread_success': 'Đã ghim đoạn chat thành công',
|
|
57
|
+
'chat:unpin_thread_success': 'Đã bỏ ghim đoạn chat thành công',
|
|
58
|
+
'chat:pin_thread_limit_title': 'Không thể ghim đoạn chat',
|
|
59
|
+
'chat:pin_thread_limit_desc':
|
|
60
|
+
'Bạn đã ghim số đoạn chat tối đa. Để ghim đoạn chat này, trước tiên bạn phải bỏ ghim đoạn chat khác.',
|
|
61
|
+
'chat:pin_thread_limit_button': 'OK',
|
|
54
62
|
'chat:view_original_message': 'Xem tin nhắn gốc',
|
|
55
63
|
'chat:scroll_to_message_todo':
|
|
56
64
|
'Tính năng di chuyển đến tin nhắn gốc sẽ sớm được cập nhật',
|