From 918f1cdf7b6825fd3a8ce6870a27b9972091f6e1 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 8 Jul 2022 14:59:44 +0200 Subject: [PATCH] Poll: Add confetti, retract vote, close poll (#1906) --- src/api/gramjs/apiBuilders/messages.ts | 3 +- src/api/gramjs/gramjsBuilders/index.ts | 22 ++ src/api/gramjs/methods/index.ts | 2 +- src/api/gramjs/methods/messages.ts | 18 ++ src/api/types/messages.ts | 1 + src/assets/tgs/settings/Experimental.tgs | Bin 0 -> 19487 bytes .../common/helpers/animatedAssets.ts | 2 + src/components/left/LeftColumn.scss | 1 + src/components/left/LeftColumn.tsx | 1 + src/components/left/settings/Settings.tsx | 5 + .../left/settings/SettingsExperimental.tsx | 55 +++++ .../left/settings/SettingsHeader.tsx | 12 +- .../main/ConfettiContainer.module.scss | 10 + src/components/main/ConfettiContainer.tsx | 193 ++++++++++++++++++ src/components/main/Main.tsx | 2 + src/components/middle/composer/Composer.tsx | 2 +- src/components/middle/composer/PollModal.tsx | 6 +- .../middle/message/ContextMenuContainer.tsx | 37 +++- .../middle/message/MessageContextMenu.tsx | 10 + src/components/middle/message/Poll.scss | 9 +- src/components/middle/message/Poll.tsx | 24 +-- src/components/middle/message/PollOption.tsx | 2 +- src/global/actions/api/messages.ts | 18 ++ src/global/actions/apiUpdaters/messages.ts | 31 +-- src/global/actions/ui/misc.ts | 10 + src/global/selectors/messages.ts | 8 + src/global/types.ts | 18 +- src/hooks/useMultiClick.ts | 26 +++ src/styles/_variables.scss | 3 +- src/types/index.ts | 1 + 30 files changed, 486 insertions(+), 46 deletions(-) create mode 100644 src/assets/tgs/settings/Experimental.tgs create mode 100644 src/components/left/settings/SettingsExperimental.tsx create mode 100644 src/components/main/ConfettiContainer.module.scss create mode 100644 src/components/main/ConfettiContainer.tsx create mode 100644 src/hooks/useMultiClick.ts diff --git a/src/api/gramjs/apiBuilders/messages.ts b/src/api/gramjs/apiBuilders/messages.ts index 0037f710e..0a114fb25 100644 --- a/src/api/gramjs/apiBuilders/messages.ts +++ b/src/api/gramjs/apiBuilders/messages.ts @@ -742,7 +742,7 @@ export function buildInvoice(media: GramJs.MessageMediaInvoice): ApiInvoice { export function buildPollResults(pollResults: GramJs.PollResults): ApiPoll['results'] { const { - results: rawResults, totalVoters, recentVoters, solution, solutionEntities: entities, + results: rawResults, totalVoters, recentVoters, solution, solutionEntities: entities, min, } = pollResults; const results = rawResults && rawResults.map(({ option, chosen, correct, voters, @@ -754,6 +754,7 @@ export function buildPollResults(pollResults: GramJs.PollResults): ApiPoll['resu })); return { + isMin: min, totalVoters, recentVoterIds: recentVoters?.map((id) => buildApiPeerId(id, 'user')), results, diff --git a/src/api/gramjs/gramjsBuilders/index.ts b/src/api/gramjs/gramjsBuilders/index.ts index 7900a4e69..a43510120 100644 --- a/src/api/gramjs/gramjsBuilders/index.ts +++ b/src/api/gramjs/gramjsBuilders/index.ts @@ -18,6 +18,7 @@ import type { ApiSticker, ApiVideo, ApiThemeParameters, + ApiPoll, } from '../../types'; import { ApiMessageEntityTypes, @@ -197,6 +198,27 @@ export function buildInputPoll(pollParams: ApiNewPoll, randomId: BigInt.BigInteg }); } +export function buildInputPollFromExisting(poll: ApiPoll, shouldClose = false) { + return new GramJs.InputMediaPoll({ + poll: new GramJs.Poll({ + id: BigInt(poll.id), + publicVoters: poll.summary.isPublic, + question: poll.summary.question, + answers: poll.summary.answers.map(({ text, option }) => { + return new GramJs.PollAnswer({ text, option: deserializeBytes(option) }); + }), + quiz: poll.summary.quiz, + multipleChoice: poll.summary.multipleChoice, + closeDate: poll.summary.closeDate, + closePeriod: poll.summary.closePeriod, + closed: shouldClose ? true : poll.summary.closed, + }), + correctAnswers: poll.results.results?.filter((o) => o.isCorrect).map((o) => deserializeBytes(o.option)), + solution: poll.results.solution, + solutionEntities: poll.results.solutionEntities?.map(buildMtpMessageEntity), + }); +} + export function buildFilterFromApiFolder(folder: ApiChatFolder): GramJs.DialogFilter { const { emoticon, diff --git a/src/api/gramjs/methods/index.ts b/src/api/gramjs/methods/index.ts index 115371ca6..a2802b919 100644 --- a/src/api/gramjs/methods/index.ts +++ b/src/api/gramjs/methods/index.ts @@ -28,7 +28,7 @@ export { fetchWebPagePreview, editMessage, forwardMessages, loadPollOptionResults, sendPollVote, findFirstMessageIdAfterDate, fetchPinnedMessages, fetchScheduledHistory, sendScheduledMessages, rescheduleMessage, deleteScheduledMessages, reportMessages, sendMessageAction, fetchSeenBy, fetchSponsoredMessages, viewSponsoredMessage, fetchSendAs, - saveDefaultSendAs, fetchUnreadReactions, readAllReactions, fetchUnreadMentions, readAllMentions, + saveDefaultSendAs, fetchUnreadReactions, readAllReactions, fetchUnreadMentions, readAllMentions, closePoll, } from './messages'; export { diff --git a/src/api/gramjs/methods/messages.ts b/src/api/gramjs/methods/messages.ts index 17d49ae9d..4e22d3f4a 100644 --- a/src/api/gramjs/methods/messages.ts +++ b/src/api/gramjs/methods/messages.ts @@ -17,6 +17,7 @@ import type { ApiSponsoredMessage, ApiSendMessageAction, ApiContact, + ApiPoll, } from '../../types'; import { MAIN_THREAD_ID, @@ -51,6 +52,7 @@ import { isMessageWithMedia, isServiceMessageWithMedia, buildSendMessageAction, + buildInputPollFromExisting, } from '../gramjsBuilders'; import localDb from '../localDb'; import { buildApiChatFromPreview } from '../apiBuilders/chats'; @@ -1051,6 +1053,22 @@ export async function sendPollVote({ }), true); } +export async function closePoll({ + chat, messageId, poll, +} : { + chat: ApiChat; + messageId: number; + poll: ApiPoll; +}) { + const { id, accessHash } = chat; + + await invokeRequest(new GramJs.messages.EditMessage({ + peer: buildInputPeer(id, accessHash), + id: messageId, + media: buildInputPollFromExisting(poll, true), + })); +} + export async function loadPollOptionResults({ chat, messageId, option, offset, limit, shouldResetVoters, }: { diff --git a/src/api/types/messages.ts b/src/api/types/messages.ts index 05d759c4b..fd8daac6a 100644 --- a/src/api/types/messages.ts +++ b/src/api/types/messages.ts @@ -125,6 +125,7 @@ export interface ApiPoll { closeDate?: number; }; results: { + isMin?: true; results?: ApiPollResult[]; totalVoters?: number; recentVoterIds?: string[]; diff --git a/src/assets/tgs/settings/Experimental.tgs b/src/assets/tgs/settings/Experimental.tgs new file mode 100644 index 0000000000000000000000000000000000000000..b75e15b683db6e951bed22b3a428502937599109 GIT binary patch literal 19487 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
AI&j{2^e8zG8%m5fLeDdCo9e-;L5D)@E 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 d9%|$pfQx({rht(nm10YR{||6mHa6rc0|4A = ({ case SettingsScreens.Privacy: case SettingsScreens.ActiveSessions: case SettingsScreens.Language: + case SettingsScreens.Experimental: setSettingsScreen(SettingsScreens.Main); return; diff --git a/src/components/left/settings/Settings.tsx b/src/components/left/settings/Settings.tsx index 6be8f2bfa..0484f9de1 100644 --- a/src/components/left/settings/Settings.tsx +++ b/src/components/left/settings/Settings.tsx @@ -27,6 +27,7 @@ import SettingsTwoFa from './twoFa/SettingsTwoFa'; import SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList'; import SettingsQuickReaction from './SettingsQuickReaction'; import SettingsPasscode from './passcode/SettingsPasscode'; +import SettingsExperimental from './SettingsExperimental'; import './Settings.scss'; @@ -237,6 +238,10 @@ const Settings: FC = ({ return ( ); + case SettingsScreens.Experimental: + return ( + + ); case SettingsScreens.GeneralChatBackground: return ( void; +}; + +const SettingsExperimental: FC = ({ + isActive, + onReset, +}) => { + const { requestConfetti } = getActions(); + const lang = useLang(); + + useHistoryBack({ + isActive, + onBack: onReset, + }); + + return ( +
+
+ +

{lang('lng_settings_experimental_about')}

+
+
+ requestConfetti()} + icon="animations" + > +
Launch some confetti!
+
+
+
+ ); +}; + +export default memo(SettingsExperimental); diff --git a/src/components/left/settings/SettingsHeader.tsx b/src/components/left/settings/SettingsHeader.tsx index 8871464e1..0e4fc3637 100644 --- a/src/components/left/settings/SettingsHeader.tsx +++ b/src/components/left/settings/SettingsHeader.tsx @@ -8,6 +8,7 @@ import { SettingsScreens } from '../../../types'; import { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment'; import useLang from '../../../hooks/useLang'; +import useMultiClick from '../../../hooks/useMultiClick'; import DropdownMenu from '../../ui/DropdownMenu'; import MenuItem from '../../ui/MenuItem'; @@ -37,6 +38,10 @@ const SettingsHeader: FC = ({ const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false); const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false); + const handleMultiClick = useMultiClick(5, () => { + onScreenSelect(SettingsScreens.Experimental); + }); + const openSignOutConfirmation = useCallback(() => { setIsSignOutDialogOpen(true); }, []); @@ -98,6 +103,8 @@ const SettingsHeader: FC = ({ return

{lang('PrivacySettings')}

; case SettingsScreens.Language: return

{lang('Language')}

; + case SettingsScreens.Experimental: + return

{lang('lng_settings_experimental')}

; case SettingsScreens.GeneralChatBackground: return

{lang('ChatBackground')}

; @@ -228,7 +235,10 @@ const SettingsHeader: FC = ({ default: return (
-

{lang('SETTINGS')}

+ {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */} +

+ {lang('SETTINGS')} +