From bb0ac166427a234fb704605a6f483f4a58abf594 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Fri, 6 Dec 2024 22:42:42 +0000 Subject: [PATCH] rfc: chat tags --- .../Shared/Views/ChatList/ChatListView.swift | 53 ++++++++++++++++++ docs/rfcs/2024-12-06-chat-tags.jpg | Bin 0 -> 66460 bytes docs/rfcs/2024-12-06-chat-tags.md | 24 ++++++++ simplex-chat.cabal | 1 + .../Chat/Migrations/M20241206_chat_tags.hs | 37 ++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 docs/rfcs/2024-12-06-chat-tags.jpg create mode 100644 docs/rfcs/2024-12-06-chat-tags.md create mode 100644 src/Simplex/Chat/Migrations/M20241206_chat_tags.hs diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index b18e9295b9..bc367be6a3 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -512,6 +512,7 @@ struct ChatListSearchBar: View { var body: some View { VStack(spacing: 12) { + ScrollView([.horizontal], showsIndicators: false) { ChatTagsView() } HStack(spacing: 12) { HStack(spacing: 4) { Image(systemName: "magnifyingglass") @@ -605,6 +606,58 @@ struct ChatListSearchBar: View { } } +enum ChatTag: Identifiable, Equatable { + case presetTag(icon: String, activeIcon: String) + case chatTag(emoji: String, text: String) + + var id: String { + switch self { + case let .presetTag(icon, _): "preset \(icon)" + case let .chatTag(emoji, _): "chatTag \(emoji)" + } + } +} + +struct ChatTagsView: View { + var chatTags: [ChatTag] = [ + .presetTag(icon: "star", activeIcon: "star.fill"), + .presetTag(icon: "person", activeIcon: "person.fill"), + .presetTag(icon: "person.2", activeIcon: "person.2.fill"), + .presetTag(icon: "briefcase", activeIcon: "briefcase.fill"), + .chatTag(emoji: "🧑‍💻", text: "Work"), + .chatTag(emoji: "🤝", text: "Friends"), + .chatTag(emoji: "🐸", text: "Memes") + ] + @State var selectedTag: ChatTag? + + var body: some View { + HStack { + ForEach(chatTags) { tag in + let current = selectedTag == tag + let color: Color = current ? .accentColor : .secondary + ZStack { + switch tag { + case let .presetTag(icon, activeIcon): + Image(systemName: current ? activeIcon : icon) + .foregroundColor(color) + case let .chatTag(emoji, text): + HStack(spacing: 4) { + Text(emoji) + ZStack { + Text(text).fontWeight(.medium).foregroundColor(.clear) + Text(text).fontWeight(current ? .medium : .regular).foregroundColor(color) + } + } + } + } + .onTapGesture { + selectedTag = tag + } + } + } + } +} + func chatStoppedIcon() -> some View { Button { AlertManager.shared.showAlertMsg( diff --git a/docs/rfcs/2024-12-06-chat-tags.jpg b/docs/rfcs/2024-12-06-chat-tags.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e935864cd6a8c4d09465e2b328bc39b2ee2ffd93 GIT binary patch literal 66460 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%0Dx88Qe#z|N`g_`2Cr9}X#cUc>Bjbj zSQT?KnW+ocw#)rQZ^dHMPBC8!7$xg7|DyKws;vFFP-Nu&OS zDx@AhNB(+Jx+AS?=EAdSVeU@f_pr1%W@Ixj=r45QYd~qm{6kjJX~9pQF2iD9ekrWn z!VA)L8o*2xTuS{Ph$&(M!QQzdiPW_zteQs_;nn)K)FQpiRDI!Ic*$I_n}{P6Rz^$c zRzFcMbRY(Nh~%&0Jx#*MW+>9dh{sv>M}Q$}z6e=asO4At>F{RlQSo_ikagNK2Y!BGikRSz* zPPgUiuVNnw^1;x@YTOIELiO(PE7_^#>Ap^avH>EQ$z?|TN3N~A#bK7y>FL~jm(c)& z7%TUXdtvN!ZxTBxhZA*=lG5sb$uvaX`A?7>_^&TK`oH=Kno>aff_ChwZq!536?MjT zQIRNR)5p#fv>TI&F@u405YPW9Jr2kR{j=Z-ENX*XnmA{Q8J9ULr_qeL*2aU83r^rUN9I_yC7ab5S0s2>SEef5SdCx=Ray&e^=%KY{$`m*Rj5PZhUMh<+Ub6 zDM{^xDILUCH0NC~#g-wTe-7K`9wa->SI)<9MV;cmgMR#9PjLP}{0X^hI^gt!b-8HR z4pJJmx$ja-Ai|>AZ1#Uk z)`R$7#=LI7?E5bnt^a2!u{Z;88ckyqXg}wp&ct7NJz!V=xif{&m3L46#sMnInW$4c z%Z0PO>V;em7%*7ty>R8tKWJ|J;~MV&ch>Nq#I@L77(-Nl9GMROYYqQrmqGk5c!>Z^ z;)_9E<72)@e^gZm^In`yr^UQvynwWVcrK-+{nC4e{6fk8tXKu4mGoSgL@AU=Vzk+E zb9dC4xV8+BZ(pNMg_S@q`{*0+4t+9){8h!ruU;%PzjN6C2?Fxpy|SC!Nu@xb2c$N# zK0w!ZF-DX23+=lWc#l>yjAcVEv&xS0@hC3igin^YLQS44b_rY&Tu~x>!_X^P6GND} zjZ*;S&Ka@CYj~*ccRp3QatC9h_iaMIOD)5Vy-oIxw!~T4;@%%0Qa03~eSRH3A$V1B z+^eQ-`9Z*CJwcSpbzWVU?2A~eAHL5=qlK(6xclD7H2d;O(r6O`9KL#C=mO}T08tVI z*tR7c5!?qU^LZpXC=}0 z+SN|B0fSd(nA*;FE$Jw*)Qa{nuiqHM2b0_8Dze(=CM$4xSnbbSAsjWQ{GVEnl-Py2 z`3g-Ic=maIRl{6;^X03*aSlM_JXZfh(ql@4JmCDx*x}On2Y>~V2>(tA&6>_H)kp>I zJRByg{hVw&|n zL=A2bFaVPKJHelj)C*wq?m16d%aQwIIR9uXl`Ihbj|18p?59DO{hKX;zt}Ruhslyp z`2B?Z26$)}Y>*%pxJeiT{F7hf`A17qL=Db=9M1}1zBI%CVhNzYe^|Pawawr}Jh?@V zh$r9r^b@coB#I77!8iFemVdMZEJ*#sScU-CAq4ejJK=w}QwYOw_2C8PNGwod9bj*e zEzP%V1pXMt-y69BZioNgX)&(0dKY5PU3~{iN~7 z2>#AQA-EX`8~)7*3?v~4IsmQz$p-XKHgdpJu!sHKlzIRNNxug0w>ChHTH8hB-;E&6 z>W}I4CmXOoO-tRsnvj1rnE+Yik3syc8GyO|!+iYL#QyV|{l9%;-;9RiFPW21Af1$^ zHLzFc#lA3OBp;2D58Z!zihl}kxDghtc9oR!6LK3i-ibS3nK^~C!h5{)m(j0enYOXK z@@dDpQ^29_dBbKM_vAONM`dNd_+|fzwfO+q5qNX_PjtdJ)R@24+Wi}y4CI-T)vMCq zenH86z>^5GRc8F4aABk@1hUUS1hWz7mA>(n0}8~ZgMM$Qa^#qR4`cn;BmO_UsDJW_ ifA0;Dgm-BjTDf)=)F5YPR?ZI(Lb?Z%bAJgvPy7#yG8qB@ literal 0 HcmV?d00001 diff --git a/docs/rfcs/2024-12-06-chat-tags.md b/docs/rfcs/2024-12-06-chat-tags.md new file mode 100644 index 0000000000..6cc8c45632 --- /dev/null +++ b/docs/rfcs/2024-12-06-chat-tags.md @@ -0,0 +1,24 @@ +# Chat tags, emoji entry + +## Problem + +Organize chats. + +Stop users from using chat profiles to organize chats. + +More fun as we solve groups problem. + +## Solution + +This is a simple "quality of life" improvement that's long due, as the number of users and conversations grows, that would probably take just a week to ship. + +Proposed UX: +- tags are per profile. +- preset tags for favourites, contacts, groups and business chats. +- user defined tags *must* have text and emoji. +- if some conversation tag (preset or user defined) is not present in the conversation, the tag will not show in the bar, but would still allow selecting it when tagging. +- there should be some way to delete tag completely, maybe on long-press on tab bar or maybe in the list of tags? +- tagging conversation will be done via the context menu that will open a second menu allowing to choose from existing tag or add a new type and select emoji (which means we need to add our embedded emoji keyboard on desktop and on android, and that should be used in compose too, as many desktop platforms and older android do not allow choosing emoji easily). We could also switch android to emoji font we use on desktop, if it's not too large, as default Android emoji are quite ugly. +- on iOS it would be a third "..." button on the trailing swipe area, which will consume Delete button for groups. If there is only Tag button, we don't need "...", we should use Tag directly. + +![UI](2024-12-06-chat-tags.jpg) diff --git a/simplex-chat.cabal b/simplex-chat.cabal index ace5afd851..7b26fd3963 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -155,6 +155,7 @@ library Simplex.Chat.Migrations.M20241125_indexes Simplex.Chat.Migrations.M20241128_business_chats Simplex.Chat.Migrations.M20241205_business_chat_members + Simplex.Chat.Migrations.M20241206_chat_tags Simplex.Chat.Mobile Simplex.Chat.Mobile.File Simplex.Chat.Mobile.Shared diff --git a/src/Simplex/Chat/Migrations/M20241206_chat_tags.hs b/src/Simplex/Chat/Migrations/M20241206_chat_tags.hs new file mode 100644 index 0000000000..65095db17a --- /dev/null +++ b/src/Simplex/Chat/Migrations/M20241206_chat_tags.hs @@ -0,0 +1,37 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Migrations.M20241205_business_chat_members where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20241205_business_chat_members :: Query +m20241205_business_chat_members = + [sql| +CREATE TABLE chat_tags ( + chat_tag_id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER REFERENCES users; + chat_tag_text TEXT NOT NULL UNIQUE, + chat_tag_emoji TEXT NOT NULL UNIQUE +); + +ALTER TABLE contacts ADD COLUMN chat_tag_id REFERENCES chat_tags; +ALTER TABLE groups ADD COLUMN chat_tag_id REFERENCES chat_tags; + +CREATE INDEX idx_chat_tags_user_id ON chat_tags(user_id); +CREATE INDEX idx_contacts_chat_tag_id ON contacts(chat_tag_id); +CREATE INDEX idx_groups_chat_tag_id ON groups(chat_tag_id); +|] + + +down_m20241205_business_chat_members :: Query +down_m20241205_business_chat_members = + [sql| +DROP INDEX idx_contacts_chat_tag_id; +DROP INDEX idx_groups_chat_tag_id; + +ALTER TABLE contacts DROP COLUMN; +ALTER TABLE groups DROP COLUMN; + +DROP TABLE chat_tags +|]